[STM32F1] STM32 Cortex M3 Systick 定时器

[复制链接]
 楼主| 一路向北lm 发表于 2021-1-5 11:43 | 显示全部楼层 |阅读模式
大家都知道Systick 定时器,是一个系统定时器,我开个帖子来慢慢给大家讲一下
 楼主| 一路向北lm 发表于 2021-1-5 11:48 | 显示全部楼层
SysTick 是一个24位的倒计数定时器,当计数到0时,将自动从RELOAD寄存器中自动重装载定时器初值,只要不把SysTick定时器的控制和状态寄存器使能位清除,SysTick定时器就永不停歇。真是任劳任怨啊。
 楼主| 一路向北lm 发表于 2021-1-5 12:10 | 显示全部楼层
CM3内核允许为 SysTick 提供两个时钟源以供选择,第一个是内核的 “自由运行时钟FCLK”,之所以叫自由运行时钟是因为它不来自系统时钟HCLK,因此,在系统时钟停止的时候,FCLK也会运行。
 楼主| 一路向北lm 发表于 2021-1-5 12:11 | 显示全部楼层
第二个是外部参考时钟,很多情况下,芯片厂家都会忽略此外部时钟,因此不常用。
 楼主| 一路向北lm 发表于 2021-1-5 12:16 | 显示全部楼层
SysTick 最大的使命就是定时产生异常请求,作为系统的时基。几乎所有的OS都需要这种滴答来推动任务和时间管理,如果想使能Ststick的异常,很好办,只需要把STCSR、TICKINT置位即可。
 楼主| 一路向北lm 发表于 2021-1-5 12:28 | 显示全部楼层
好了,我来写个代码展示一下如何使能Systick的异常

LDR   R0, = 0xE000E010           ;加载STCSR的地址
MOV  R1,#0
STR   R1,[R0]                           ;先停止Systick,防止意外产生
LDR   R1, = 0x3FFF
STR   R1,  [R0,#4]                       ;写入重装载值
STR   R1,  [R0,#8]                       ;往STCVR写任意数,确保清除COUNTFLAG标志
MOV  R1,  #0x7                           ;选择FCLK作为时钟源,并使能Systick异常
STR   R1,  [R0]                             ;写入数值,开启定时器




 楼主| 一路向北lm 发表于 2021-1-5 16:36 | 显示全部楼层
如果向量表重定位到了SRAM中,Systick需要建立异常向量表,提供其服务例程的入口地址,代码也写给你看一下:
MOV   R0,  #0XF     ;异常号15
LDR    R1,    = systick_handler      ;加载服务例程的入口地址
LDR    R2,   = 0xE000ED08           ;加载向量表偏移量寄存器地址
LDR    R2,  [R2]                           ;读取向量表的首地址地址
STR    R1,  [R2,  R0,  LSL #2]        ;写入向量
renzheshengui 发表于 2021-2-2 09:02 | 显示全部楼层
呵呵 能转换成c语言吗
wakayi 发表于 2021-2-2 09:04 | 显示全部楼层
讲解的果然很缓慢 哈哈
两只袜子 发表于 2021-2-2 09:15 | 显示全部楼层
慢工出细活
wowu 发表于 2021-2-2 09:43 | 显示全部楼层
不过  也算是简单扼要了
xiaoqizi 发表于 2021-2-2 10:17 | 显示全部楼层
这是一个最基础的定时器
木木guainv 发表于 2021-2-2 10:19 | 显示全部楼层
呵呵 就当补充一下基础知识吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

293

主题

3837

帖子

81

粉丝
快速回复 在线客服 返回列表 返回顶部

293

主题

3837

帖子

81

粉丝
快速回复 在线客服 返回列表 返回顶部