1.模块简介
STM模块有以下特点:
•支持自由运行的64位计数器
•支持64位同步读取
•支持不同的32位计数器同步读取64位的STM
•支持比较寄存器进行灵活的定时中断服务请求
STM(System Timer)是一个向上的64位计数器,运行频率为fSTM(最高100MHz)。如果应用程序复位,STM会被重置(在STMxDIS标志位已被清除的情况下)。重置后,STM会自动启用,并立即开始计数。在正常操作过程中,不会影响定时器的内容,定时器寄存器只能被读取而不能被写入。
由于STM的64位宽度,因此不可能用一条指令读取其整个内容。它需要用两个加载指令来读取。为了能够同步地读取STM内容,使用了捕获寄存器(CAP)。每次读取寄存器TIM0到TIM5中的一个时,它都会锁存STM高32部分的内容。因此,当读取定时器的低部时,CAP保持定时器的高部值。然后,第二个读取操作将读取CAP的内容以获得完整的计时器值。
2.Compare Register Operation(比较寄存器)
STM中每个模块提供了两个32位比较寄存器,用来实现单次定时的功能。64位系统定时器STM的值可以与CMP0和CMP1寄存器中存储的两个比较值进行比较。当比较值匹配时可以生成服务请求,用于触发中断。
有两个参数用于比较操作:
- START(开始):进行比较操作所用的第一位(LSB)位置。
- SIZE(大小):要进行比较的位数(从零开始)。
MSIZE0 = 10001B = 17; MSTART0 = 01010B = 10
MSIZE1 = 00111B = 7; MSTART1 = 00111B = 7
在上图的例子中,比较寄存器CMP0[17:0]加上十个右扩展的零位与STM[27:0]进行比较,STM[9:0] = 000H。最简单的操作方式就是直接将开始位置(STAR)设置为0,这样比较寄存器的比较值跟STM值的分辨率一样,定时多少时间就是多少。这种比较简单也比较常用。
3.Compare Match Interrupt Control(比较匹配中断控制)
STM 的中断触发机制并不复杂,每个 STM 模块有两个比较寄存器,同时每个 STM 模块有两个中断源,而且比较寄存器和中断源的连接也是可配的。功能示意图如下:
每个比较寄存器都有其比较匹配中断请求标志位(ICR.CMPxIR),该标志由硬件在比较匹配事件上设置。中断请求标志可以通过软件设置(ISSR.CMPxIRS)或清除(ISSR.CMPxIRR)。如果设置ICR将1写入CMPxIRS不会在STMIRx上产生中断。来自CMP0和CMP1的比较匹配中断可以由CMPxOS选择输出信号STMIR0或STMIR1。CMPxOS 设置为 0 或者 1 则选择对应的中断源,输出到中断模块 IR 中。
4.STM部分寄存器解读
4.1Compare Match Control Register(比较匹配控制寄存器)
上面提到的操作比较寄存器的两个参数就由这个寄存器来配置。
4.2Interrupt Control Register(中断控制寄存器)
CMP0IR(比较寄存器CMP0中断请求标志):该位表示比较寄存器CMP0的比较匹配中断请求是否正在等待,CMP0IR必须通过软件清除。
0:由于上次清除了该位,所以没有检测到比较匹配中断。
1:检测到比较匹配中断。CMP0IR必须通过软件清除,也可以通过软件设置(参见CMPISCR寄存器)。
4.3Interrupt Set/Clear Register(中断设置/清除寄存器)
CMP0IRS CMP0IR位已经设置,在这种情况下,位CMP0IRR的状态为“不关心”。
5.代码功能实现
下列代码使用定时器模块,实现定时器延时函数功能,并用延时函数实现流水灯效果。