简单回忆今日所学:

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、更新事件:上溢、下溢、触发、初始化

  触发事件:开始、停止、初始化、触发