关于STM32系统时钟和STM32定时器的使用若干注意点
2017-10-25 来源:eefocus
1. 这里总结一下 SystemInit()函数即上电启动后中设置的默认系统时钟大小:
SYSCLK(系统时钟) | =72MHz |
AHB 总线时钟(使用 SYSCLK) =72MHz |
APB1 总线时钟(PCLK1) | =36MHz |
APB2 总线时钟(PCLK2) =72MHz |
PLL 时钟 =72MHz
2.关于STM32定时器重要寄存器说明:
1)自动重装载寄存器( TIMx_ARR):(这里所指的重装载是装到影子寄存器,与计数器没关系)该寄存器在物理上实际对应着 2 个寄存器。一个是程序员可以直接操作的,另外一个是程序员看不到的,这个看不到的寄存器在《 STM32参考手册》里面被叫做影子寄存器 ,事实上其实质作用的是影子寄存器。TIMx_CR1 寄存器中 APRE 位的设置 对这两个寄存器是否同步会有影响,当ARPE自动重装载预装载允许位为0值(默认),预装载寄存器值和影子寄存器是连通的(两者之间无缓存),同步更新;而当ARPE位为1值时,预装载寄存器值和影子寄存器是连通的(两者之间存在缓存机制),则只有在每次有“更新事件(UEV)”时,预装载寄存器值才会传到影子寄存器起作用。具体可参参考手册时序图。
2)改变时钟频率当配置完新的预分频器,定时器的时钟是在发生更新后生效
3)查看手册时序图可知,定时器当发生更新事件事,计数器会根据不同模式计数由0(向上模式)或者自动重装载值大小(向下)开始计数
2)UEV事件:(update event) ,即产生更新事件。手册当中说的很详细,简单来讲,就是CR寄存器的UDIS位设置是否是能更新事件(默认0是使能),URS位配置更新事件源。在使能情况下比如定时器溢出时则对应的SR的UIF位会置1。(关于比如UIF更新事件位通串口下状态位一样,其也是中断或者状态查询(但毕竟定时器用查询方式还是感觉没啥用)用的通一个位,这和串口使用TC或者RXNE是一样的道理,我们可通过查库函数实现验证TIM_GetFlagStatus()和TIM_GetITStatus()用的都是SR的同一个位,只不过后者会先检查中断是否使能而已)
3)TIMx_EGR寄存器:这是个实现用软件置位产生各种类型事件的寄存器,与SR不同
4)关于普通定时器内部输入时钟配置下内部时钟分频因子和分频值的关系:
参见手册关于时钟源和时钟图解释,选用内部时钟即对应的APB1时钟,二内部时钟分频因子是对APB1时钟进行分频,而预分频器的时钟就是内部时钟分频后得到的,这是两者的关系。不过一般情况下我们设置内部时钟的分频因子为1
上一篇:STM32串口使用总结