本帖最后由 jhqd1994 于 2016-7-6 16:11 编辑
NV32F100x系列是基于ARM Cortex-M0+的32位MCU,所有的ARM Cortex-M 内核都包含了一个定时器——SysTick
它被捆绑在NVIC中,有效位为24,可产生中断异常,中断源为ARM内核,中断向量号为15
控制及状态寄存器SysTick_CTRL
| 名称 | | | | | | | 为只读,计数器减1计数到0,则该位为1;读取该位请0 | | | | | | | | | =0,禁止中断;=1,允许中断(计数器到0,进入中断) | | | |
重载寄存器SysTick_LOAD
该寄存器的低24位有效,它的值RELOAD作为计数器的初值及重载值。
计数器SysTick_VAL
该寄存器的低24位有效,这个模块用于保存当前的计数值,计数方式为减1计数。
校准寄存器Systick_CALIB
根据相应的MCU,来校准中断频率
本文采用Systick滴答定时器来作精确延时的方式进一步认识它,通过操控LED2(红灯)亮500ms,灭500ms来直观的显示。
NVF32100x的内部时钟为f1=48MHZ=BUS_CLK_HZ,而控制及状态寄存器SysTick_CTRL中的CLKSOURCE标志位默认为0
则Systick的时钟源为内部时钟除以16即f2=BUS_CLK_HZ/16,所以说每个周期为T=16/f2=16/BUS_CLK_HZ S,
得到1S的计数值LOAD为1/T=BUS_CLK_HZ/16
得到1MS的计数值LOAD为1/T/1000=BUS_CLK_HZ/(1000*16)
得到1US的计数值LOAD为1/T/1000000=BUS_CLK_HZ/(1000000*16)
配置过程中,需要注意的事,由于重载寄存器的值为低24位有效,所以加载的数值不可以超过16777215
例如,需要得到1US的延迟,加载数值BUS_CLK_HZ/(1000000*16)-1
即为 SysTick->LOAD = ((BUS_CLK_HZ/1000000)/16)-1;
配置定时器,打开中断,得到1US的延迟
源程序见附件
NV32F100--Systick滴答定时器.zip
(200.56 KB)
|