打印
[STM32F1]

STM32 Cortex M3 Systick 定时器

[复制链接]
412|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一路向北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 | 只看该作者
第二个是外部参考时钟,很多情况下,芯片厂家都会忽略此外部时钟,因此不常用。

使用特权

评论回复
5
一路向北lm|  楼主 | 2021-1-5 12:16 | 只看该作者
SysTick 最大的使命就是定时产生异常请求,作为系统的时基。几乎所有的OS都需要这种滴答来推动任务和时间管理,如果想使能Ststick的异常,很好办,只需要把STCSR、TICKINT置位即可。

使用特权

评论回复
6
一路向北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]                             ;写入数值,开启定时器




使用特权

评论回复
7
一路向北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]        ;写入向量

使用特权

评论回复
8
renzheshengui| | 2021-2-2 09:02 | 只看该作者
呵呵 能转换成c语言吗

使用特权

评论回复
9
wakayi| | 2021-2-2 09:04 | 只看该作者
讲解的果然很缓慢 哈哈

使用特权

评论回复
10
两只袜子| | 2021-2-2 09:15 | 只看该作者
慢工出细活

使用特权

评论回复
11
wowu| | 2021-2-2 09:43 | 只看该作者
不过  也算是简单扼要了

使用特权

评论回复
12
xiaoqizi| | 2021-2-2 10:17 | 只看该作者
这是一个最基础的定时器

使用特权

评论回复
13
木木guainv| | 2021-2-2 10:19 | 只看该作者
呵呵 就当补充一下基础知识吧

使用特权

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

本版积分规则

274

主题

3760

帖子

75

粉丝