打印
[应用方案]

NV32F100x Systick 定时器使用注意事项

[复制链接]
1145|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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,来校准中断频率

使用特权

评论回复
板凳
几时再见|  楼主 | 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 的延迟

使用特权

评论回复
5
罗勋义| | 2017-10-31 21:03 | 只看该作者
32位的MCU,为什么SysTick只有24位呢?

使用特权

评论回复
6
几时再见|  楼主 | 2017-11-26 11:32 | 只看该作者
罗勋义 发表于 2017-10-31 21:03
32位的MCU,为什么SysTick只有24位呢?

我也想知道是为什么,有点奇怪

使用特权

评论回复
7
zb0830| | 2017-11-26 14:58 | 只看该作者
这个和STM32几乎是一样

使用特权

评论回复
8
Sunriver_Yao| | 2017-12-14 12:30 | 只看该作者
假设主频为200MHz,经过2^24脉冲分频后,得到83.88608ms脉冲。用于任务调度,够了!Linux的任务调度通常是10ms。
像Navota的MCU,fSys=50MHz,可以得到335ms的脉冲(调度时间),满足绝大多数任务要求!至于其他定时需要,就用ETM0-2吧!

使用特权

评论回复
9
qiangg| | 2017-12-24 19:38 | 只看该作者
这个和STM的一样

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

135

帖子

0

粉丝