目录
1. 基本定时器
来自RCC的TIMxCLK为72MHz,若PSC预分频寄存器写0,即不分频,或者1分频,写2,即二分频。实际分频系数=预分频器的值+1。这个预分频器为16位,所以最大值可以写65535,也就是65536分频。CNT计数器在时钟的每个上升沿加1,计数器也是16位,计数值可以从0加到65535,再加就回到0。计数器一直自增,直到自增运行到目标值,产生中断,完成了定时的任务。自动重装寄存器也是16位,存入的就是我们的技术目标。UI上升箭头代表会产生中断信号,计数值=重装值产生的中断叫做“更新中断”,这个更新中断之后会通往NVIC,我们再配置好NVIC的定时器通道,那定时器的更新中断就能得到CPU的响应了。U向下箭头,代表会产生一个事件,对应的事件为“更新事件”,更新事件不会触发中断,但可以触发内部其他电路的工作。
主模式触发DAC的功能可以大大减小CPU的工作量,DAC过程是每隔一段时间触发一次DAC,让它输出下一个电压点,如果使用中断,会使主程序处于频繁被中断的状态,这会影响主程序的运行和其他中断的响应。使用主模式触发DAC可以把更新时间映射到触发输出TRGO的位置,然后TRGO直接接到DAC的触发转换引脚。整个过程不需要软件的参与,实现了硬件的自动化。
2.通用定时器
通用定时器和高级定时器除了支持向上计数,还支持向下计数和中央对齐模式。向下计数就是从重装值开始自减,减到0后,回到重装值并触发中断。中央对齐模式就是从0计到重装值,申请中断,再从重装值自减到0,申请中断。
类型 | 编号 | 总线 | 功能 |
高级定时器 | TIM1、TIM8 | APB2 | 拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能 |
通用定时器 | TIM2、TIM3、TIM4、TIM5 | APB1 | 拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能 |
基本定时器 | TIM6、TIM7 | APB1 | 拥有定时中断、主模式触发DAC的功能 |
3.定时中断和内外时钟源选择
中断信号会在中断状态寄存器置一个中断标志位,这个标志位会通过中断输出控制,到NVIC申请中断。中断输出控制就是中断信号的允许位。预分频器有缓冲器,重新写入的值会在中断事件发生后生效
第一步:RCC开启时钟,定时器的基准时钟和整个外设的工作时钟就会同时打开了。
第二步:选择时基单元的时钟源,对于定时中断,选择内部时钟源(可省,因为系统上电后,默认打开内部时钟,如果使用外部时钟,系统也是会先打开内部时钟,等待外部时钟稳定后,再切换为外部时钟)。
第三步:配置时基单元。
第四步:配置输出中断控制TIM_ITConfig()(比如很多中断事件,配置使能不使能更新中断事件),允许更新中断输出到NVIC。
第五步:配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级。
第六步:运行控制,TIM_Cmd()(使能计数器)。当定时器使能后,计数器就会开始计数了,当计数器更新时,触发中断,最后再写一个定时器的中断函数,这样中断函数每隔一段时间就能自动执行一次了。
程序一上电就立刻进中断原因:在TIM_TimeBaseStructInit()中最后一句表明调用时基单元配置函数会生成一个更新事件,来重新装载与分配器和重复计数器的值,使预分频器的值立刻有效(因为预分频器有缓冲器的存在,写入值只有在更新事件时,才会真正起作用)。 副作用是更新事件和更新中断是同时发生的,初始化后立即进中断。
解决方法在该初始化函数后,开启中断前,加入清除中断标志位函数。