定时器做ms和us延时函数
本文用的是STM32L431RCT6芯片
定时器TIM2和TIM6挂载在APB1总线上
1.配置TIM2为ms延时定时器
TIM2为通用定时器在APB1总线上,主频为80MHz.
设置TIM2参数:
时钟源选择为内部时钟,分频系数PSC为10000-1,自动重装载值CNT为65535
定时器计算公式:
定时器工作频率 = 外设总线频率 / (PSC+1)
定时频率 = 定时器工作频率 / (CNT+1)
由公式可知:
TIM2工作频率 = 80000000 / 10000 = 8000Hz=8KHz
TIM2定时频率 = 8000 / 65535 = 0.122072175Hz
TIM2定时周期 = 1 / 定时频率 = 1/0.122072175 = 8.191s = 8191ms
每计数一次为多少ms:
8191 / 65535 = 0.125ms
0.125 * 8 = 1ms
所以每计数8次为1ms
生成工程后添加延时函数:
/* USER CODE BEGIN 1 */
void HAL_Delay_ms(uint16_t nms) //量程0-8191ms
{
__HAL_TIM_SetCounter(&htim2, 0);//htim1
__HAL_TIM_ENABLE(&htim2);
while(__HAL_TIM_GetCounter(&htim2) < (8 * nms));//计数频率8KHz,8次即为1ms
/* Disable the Peripheral */
__HAL_TIM_DISABLE(&htim2);
}
10ms测试结果:
2.配置TIM6为us延时定时器
TIM6为通用定时器在APB1总线上,主频为80MHz.
设置TIM6参数:
时钟源选择为内部时钟,分频系数PSC为10-1,自动重装载值CNT为65535
由公式可知:
TIM6工作频率 = 80000000 / 10 = 8000000Hz=8MHz
TIM6定时频率 = 8000000 / 65535 = 122.072175Hz
TIM6定时周期 = 1 / 定时频率 = 1/122.072175 = 0.008191s = 8191us
生成工程后添加延时函数:
void HAL_Delay_us(uint16_t nus) //量程0-8191us
{
__HAL_TIM_SetCounter(&htim6, 0);//htim8
__HAL_TIM_ENABLE(&htim6);
while(__HAL_TIM_GetCounter(&htim6) < (8 * nus));//计数频率8MHz,8次即为1us
/* Disable the Peripheral */
__HAL_TIM_DISABLE(&htim6);
}
10us测试结果: