打印
[应用方案]

NV32F100x应用之滴答定时器SysTick

[复制链接]
1589|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 jhqd1994 于 2016-7-6 16:11 编辑

NV32F100x系列是基于ARM Cortex-M0+的32位MCU,所有的ARM Cortex-M 内核都包含了一个定时器——SysTick
它被捆绑在NVIC中,有效位为24,可产生中断异常,中断源为ARM内核,中断向量号为15

控制及状态寄存器SysTick_CTRL
字段
名称
描述
31-17
      
此字段保留
16
   COUNTFLAG
为只读,计数器减1计数到0,则该位为1;读取该位请0
15-3
此字段保留
2
   CLKSOURCE
=0,内部时钟/16;=1,内核时钟
1
    TICKINT
=0,禁止中断;=1,允许中断(计数器到0,进入中断)
0
    ENABLE
模块使能位,=0,关闭;=1,使能


重载寄存器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)




相关帖子

沙发
yjmwxwx| | 2016-7-14 18:29 | 只看该作者
多余出一个向量表是什么用处?

使用特权

评论回复
板凳
jhqd1994|  楼主 | 2016-7-15 09:50 | 只看该作者
yjmwxwx 发表于 2016-7-14 18:29
多余出一个向量表是什么用处?

哪里

使用特权

评论回复
地板
yjmwxwx| | 2016-7-15 11:20 | 只看该作者
不是应该在0X00一个么?怎么在0XC0还有一个,0XC0这个表有什么用?

使用特权

评论回复
5
jhqd1994|  楼主 | 2016-7-15 15:58 | 只看该作者
yjmwxwx 发表于 2016-7-15 11:20
不是应该在0X00一个么?怎么在0XC0还有一个,0XC0这个表有什么用?

贴个图看看

使用特权

评论回复
6
yjmwxwx| | 2016-7-15 19:10 | 只看该作者




使用特权

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

本版积分规则

17

主题

57

帖子

1

粉丝