[应用方案] NV32F100x Systick 定时器使用注意事项

[复制链接]
170|8
 楼主 | 2017-10-31 12:31 | 显示全部楼层 |阅读模式
NV32F100x 系列是基于 ARM Cortex-M0+的 32 位 MCU, 所有的 ARM Cortex-M 内核都包含了一个定时器——SysTick它被捆绑在 NVIC 中, 有效位为 24, 可产生中断异常, 中断源为 ARM 内核, 中断向量号为 15。


 楼主 | 2017-10-31 12:32 | 显示全部楼层
控制及状态寄存器 SysTick_CTRL

重载寄存器 SysTick_LOAD
该寄存器的低 24 位有效, 它的值 RELOAD 作为计数器的初值及重载值。
计数器 SysTick_VAL
该寄存器的低 24 位有效, 这个模块用于保存当前的计数值, 计数方式为减 1 计数。
校准寄存器 Systick_CALIB
根据相应的 MCU,来校准中断频率

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册 手机登录

x
 楼主 | 2017-10-31 12:33 | 显示全部楼层
本文采用 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)
 楼主 | 2017-10-31 12:33 | 显示全部楼层
配置过程中, 需要注意的事, 由于重载寄存器的值为低 24 位有效, 所以加载的数值不可以超过 16777215
例如, 需要得到 1US 的延迟, 加载数值 BUS_CLK_HZ/(1000000*16)-1
即为 SysTick->LOAD = ((BUS_CLK_HZ/1000000)/16)-1;
配置定时器, 打开中断, 得到 1US 的延迟
| 2017-10-31 21:03 | 显示全部楼层
32位的MCU,为什么SysTick只有24位呢?
 楼主 | 2017-11-26 11:32 | 显示全部楼层
罗勋义 发表于 2017-10-31 21:03
32位的MCU,为什么SysTick只有24位呢?

我也想知道是为什么,有点奇怪
| 2017-11-26 14:58 | 显示全部楼层
这个和STM32几乎是一样
| 2017-12-14 12:30 | 显示全部楼层
假设主频为200MHz,经过2^24脉冲分频后,得到83.88608ms脉冲。用于任务调度,够了!Linux的任务调度通常是10ms。
像Navota的MCU,fSys=50MHz,可以得到335ms的脉冲(调度时间),满足绝大多数任务要求!至于其他定时需要,就用ETM0-2吧!
| 2017-12-24 19:38 | 显示全部楼层
这个和STM的一样
扫描二维码,随时随地手机跟帖
*滑动验证:
您需要登录后才可以回帖 登录 | 注册 手机登录

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册 手机登录
高级模式

论坛热帖

分享 快速回复 返回顶部 返回列表