CubeMX的HAL库中添加

本文介绍了如何使用STM32的TIM6定时器实现微秒和毫秒级别的延时功能。通过配置定时器时钟频率和分频系数,采用向上计数方式,实现了无需中断的延时函数。代码示例展示了两种不同的实现方法,适用于不同的时钟配置和计数单位需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定时器实现 us 延时

        首先需要对芯片的系统时钟进行配置,芯片最大48MHz。

实现方式一

        使用定时器 TIM6来实现us延时,定时器TIM6总线上48MHz,计数单位为 48MHz/48 = 1us,所以分频系数 48-1,向上计数方式,周期 65535,由于没有使用到中断,不需要开启中断。

至此,配置工作就完成了,生成工程就可以了。

代码实现

/*
    普通定时器实现us延时
*/
void Delay_nus(uint32_t nus) 
{
	uint16_t  differ = 0xffff-nus-5;
	//设置定时器2的技术初始值
	__HAL_TIM_SetCounter(&htim6,differ);
	//开启定时器
	HAL_TIM_Base_Start(&htim6);
	while( differ<0xffff-5) 
	{
		differ = __HAL_TIM_GetCounter(&htim6);
	}
	
	//关闭定时器
	HAL_TIM_Base_Stop(&htim6);
}

实现方式二

        使用定时器 TIM6来实现us延时,定时器TIM6总线上48MHz,计数单位为 48MHz/8 = 8MHz,所以分频系数 6-1,向上计数方式,周期 65535,由于没有使用到中断,不需要开启中断。

代码实现

void bsp_DelayUS(uint16_t nus)	//量程0-8191us
{
		__HAL_TIM_SetCounter(&htim6, 0);//htim6

		__HAL_TIM_ENABLE(&htim6);

		while(__HAL_TIM_GetCounter(&htim6) < (8 * nus));//计数频率8MHz,8次即为1us
		/* Disable the Peripheral */
		__HAL_TIM_DISABLE(&htim6);
}

ms延时实现

/*
    普通定时器实现ms延时,可直接使用HAL库函数HAL_delay()
*/
void Delay_ms(uint16_t nms) 
{
	uint32_t i;
	for (i = 0;i < nms; i++) 
      Delay_nus(1000);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值