学习目标

  1. 掌握定时器I配置方式
  2. 掌握定时器占空比输出

    学习内容

    需求

    177.png
    PA5对应的LED4为例,我们做一个呼吸灯的效果。
    我们采用TIMER1进行实现:
    204.png

    Timer配置

    配置Timer通道输出
    068.png
    配置周期和分频计数
    069.png
  • psc为分频系数,这里的值需要写入到寄存器中的
  • period为周期计数,这里的值需要写入到寄存器中的

这里再引入一个点,系统时钟和Timer自己的时钟,系统时钟是系统主频,Timer自己有自己的主频,这个之间存在一个比值。系统主频为168MHZ, Timer2的主频为42MHZ,差值为4倍。标准库提供了倍频方案,HAL库没有,因此计算时,我们需要加入这个因素。
例如:希望 1秒钟执行100次,通常解决思路如下:
定时器 - 图5
但是计数值不可以超过65535,需要做分频:
定时器 - 图6
定时器 - 图7
表达的意思是100秒执行10000次,也就是1秒钟执行100次

但是在这里还要注意一个倍频的问题,当前Timer2存在2倍差距。这里100秒执行10000次,就变成了200秒执行10000次。所以,倍频方面需要再次做处理。
070.png
定时器 - 图9

定时器 - 图10

因此,如果要做到1秒执行100次,那么
定时器 - 图11

定时器 - 图12

Timer编码

提供PWM更新的API

  1. /* USER CODE BEGIN 1 */
  2. void Tim2_ch1_duty(float duty) {
  3. uint32_t count = htim2.Init.Period + 1;
  4. uint32_t pulse = duty * count / 100 - 1;
  5. __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, pulse);
  6. }
  7. /* USER CODE END 1 */

练习题

  1. 测试PWM占空比