STM32定时器
-
配置时钟和下载端口 -
配置定时时钟源为72M -
配置定时器
定时器的配置主要有两个:定时时间与是否重装定时器。
Tout= ((arr+1)*(psc+1))/Tclk;
Tclk:TIM1的输入时钟频率(单位为Mhz)。
Tout:TIM1溢出时间(单位为us)。
定时频率=定时器时钟/(预分频+1)/(计数值+1)Hz。
定时时间=1/定时频率s。
我们这里定时0.1s(10Hz)
定时器时钟:72M=72 000 000
设置预分频器的值为:719
进行分频:72 000 000/(719+1)=100 000
定时频率为:10Hz
自动装载值:100 000/10-1=9999
所以得到:
时钟预分频:720-1
自动装载值:10000-1
开启中断(高级定时器)
-
生出项目代码 -
编写逻辑代码 使能定时器:
HAL_TIM_Base_Start_IT(&htim1);
定时器中断回调函数模型:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if (htim->Instance == htim1.Instance)
{
... //定时器1中断业务
}
else if(htim-> Instance == htim2.Instance)
{
... //定时器2中断业务
}
...
}
实例: 变量定义:
int pwm_value,pwm_avg,pwm_sum,pwm_value_final;
中断函数:
void HAL_GPIO_EXTI_callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==GPIO_PIN_0)
{
pwm_value++;
}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if (htim->Instance == htim1.Instance)
{
pwm_sum+=(pwm_value* 10);
pwm_sum -=pwm_avg;
pwm_avg= pwm_sum *1.0/5;
pwm_value_final = pwm_avg;
pwm_value=0;
}
}
日志打印:
user_main_info("pwm_value -> %d Hz",pwm_value_final);
|