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
开启中断(高级定时器)
-
生出项目代码
-
编写逻辑代码
使能定时器:
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim1);
/* USER CODE END 2 */
定时器中断回调函数模型:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if (htim->Instance == htim1.Instance)
{
... //定时器1中断业务
}
else if(htim-> Instance == htim2.Instance)
{
... //定时器2中断业务
}
...
}
实例:
变量定义:
/* USER CODE BEGIN PV */
int pwm_value,pwm_avg,pwm_sum,pwm_value_final;
/* USER CODE END PV */
中断函数:
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); //pwwm_sum累加
pwm_sum -=pwm_avg; //pwm_sum:减去上次的平均值
pwm_avg= pwm_sum *1.0/5; //更新pwm的平均值
pwm_value_final = pwm_avg; //pwm_value_finai的值即为当前pwm的频率
pwm_value=0; //将pwm_value清空,重新计数
}
}
日志打印:
user_main_info("pwm_value -> %d Hz",pwm_value_final);