简单回忆今日所学:
1、定时器有两种——系统节拍定时器和可编程的高级控制定时器
系统节拍定时器(Systick) | 高级控制定时器(TIM) |
24位的系统定时器SysTick,它从重装载值向下计数到0,在下一个时钟边沿重装载LOAD寄存器中的值。 |
由一个16位的自动装载计数器组成,它由一个可编程的预分配器驱动。 |
STK_CTRL控制和状态寄存器: CLKSOURCE(AHB,AHB/8) COUNTFLAG(计数器计数到0就返回1) ENABLE(使能计数器) TICKINT(按照该值可选地发布SysTick待决) 注:当技术从1到0的时候,SysTick和COUNTFLAG才被激活 STK_LOAD重装载值寄存器:(24位) STK_VAL当前值存储器 |
控制寄存器CR1: CEN(Counter enable) DIR(Direction)0/1=向上、下 CMS(Center-aligned mode selection) 0边沿对齐,1/2/3中心对齐 ARPE(Auto-reload preload enable)自动重装载预装载使能 状态寄存器SR: 事件发生寄存器:软件伪造硬件信号进行调试 计数器:CNT 预分频器:PSC(prescaler) 自动重装载寄存器:ARR |
分频AHB,AHB/8,AHB是固定的72MHz(这个跟时钟源那边的分频有什么区别和联系吗?) | 时钟可以在1-2的16次方(65536)之间任意分频 |
难点:
1、RELOAD值按照其用途计算:
要产生周期为N个处理器周期的多次定时,使用RELOAD值N-1。比如,所需要的SysTick中断是每3个时钟脉冲,设置RELOAD为2。0->2->1->0,在计数1->0的时候,异常请求才被激活。
要在延迟N个周期之后发出单次SysTick中断,使用RELOAD的值为N。比如,所需的SysTick中断是在3个脉冲周期之后,设置RELOAD为3。3->2->1->0,正好是过了3个信号周期。
2、自动重装载寄存器的缓冲设计方式:
ARR实际上有两个寄存器,在软件端可以看见一个,在硬件端可以看到另外一个(Prescaler buffer),软件端的值可以随时在代码里面写入,但是硬件端的buffer只有在有更新事件产生使,才会被装载进去,真正地影响到我们分频周期,也就是说硬件信号控制着何时拿去用。
3、计数器的使能打开之后,不是立刻就开始计数,而是过了一个脉冲周期之后才开始,这是为了同步。
4、分频器的值设置为0的时候不分频,设置为1的时候二分频,设置为0xFFFF,实际上是2的16次方分频,计数频率最低。
5、当分频值固定,也就是计数周期固定的时候,不需要打开自动重装载的使能。
6、更新事件:上溢、下溢、触发、初始化
触发事件:开始、停止、初始化、触发