背景
方法
定时器
(1)高级定时器timer1, timer8以及通用定时器timer9, timer10, timer11的时钟来源是APB2总线
(2)通用定时器timer2~timer5,通用定时器timer12~timer14以及基本定时器timer6,timer7的时钟来源是APB1总线
(3)当APB1和APB2分频数为1的时候,TIM1、TIM8~TIM11的时钟为APB2的时钟,TIM2~TIM7、TIM12~TIM14的时钟为APB1的时钟;
(4)而如果APB1和APB2分频数不为1,那么TIM1、TIM8~TIM11的时钟为APB2的时钟的两倍,TIM2~TIM7、TIM12~TIM14的时钟为APB1的时钟的两倍。
对于stm32f407 168M主频,因为系统初始化SystemInit函数里初始化APB1总线时钟为4分频即42M,所以TIM2~TIM7、TIM12~TIM14的时钟为APB1的时钟的两倍即84M;APB2总线时钟为2分频即84M,TIM1、TIM8~TIM11的时钟为APB2时钟的两倍即168M。
基本定时器没有输出pwm波的功能, 只能用通用定时器或者高级定时器来达到生成pwm波效果. 我们选用通用定时器实现。
prescaler
预分频器
Auto Reload Register
自动重装载寄存器
auto-load preload
影子寄存器, 立即生效 or 等待当前轮执行完生效
update-interrupt
一般情况下,我们开启定时器总是要调用中断,所以代码为`HAL_TIM_BASE_Start_IT()`,其中update interrupt会在counter与auto reload register中值相同时触发中断,这样我们就知道达到了我们想要的时间,可以在callback函数中添加我们的功能.
注意:STM32配置TIM后会直接触发一次中断
其中有一些以`__`开头的函数可以更改寄存器的值
counter = __HAL_TIM_GET_COUNTER(&htim10);
__HAL_TIM_SET_PRESCALER(&htim10, prescaler);
__HAL_TIM_SET_AUTORELOAD(&htim10, autoreload);
外部时钟模式
外部时钟模式有外部时钟模式1和外部时钟模式2.
外部时钟模式2直接
注意过滤器(filter)的设置,一般设置为最大值, 也就是15.
PWM波形生成
注意PWM Generation Channel 中 Pulse 为比较寄存器值, 应该小于 auto reload的值. Compare 寄存器含义为低于指定计数次, 高电平; 高于指定计数次, 低电平(PWM mode 1下)
其中常用操作为更改Compare 寄存器值
__HAL_TIM_SET_COMPARE(&htim9, TIM_CHANNEL_1, compareValue);
代码参考: 输出应为1k Hz, 占空比25%
STM32F407NUEDC/PWM at main · Casdos/STM32F407NUEDC (github.com)
参考
https://blog.csdn.net/u014453443/article/details/100101152
标签:定时器,APB1,波形,APB2,生成,TIM,PWM,时钟 From: https://www.cnblogs.com/alien-han/p/18327021