找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16842|回复: 12
收起左侧

个人对STM32 SysTick的总结(寄存器操作)

  [复制链接]
ID:170498 发表于 2018-9-2 10:56 | 显示全部楼层 |阅读模式
我是新手,最近用STM32的SYSTick做了延时
编程思路:
选择时钟源
关闭计数器
设置重装载值
当前值清零
使能SysTick
等待计数器计数完毕
当前值清零
关闭计数器

一、概述:
SysTick是一个简单的递减24位计数器
如果你不需要再应用程序中嵌入操作系统,SysTick可以作为简单的延时和产生周期性的中断;
状态控制寄存器的第0位可以使能计数器,current value register(当前值寄存器)随着时钟一直递减,当他减到0的时候,重装载寄存器(reload value register)就会重新装载这只的值,计数器继续从这个值递减

二、相关寄存器:

2.1  SysTick->CTRL 状态和控制寄存器
位16:当前值寄存器递减到0,位16置1
位2:时钟源选择位
              0:使用外部参考时钟
              1:使用内核时钟
位1:使能SysTick中断,当前值寄存器递减到0时产生中断
位0:SysTick时钟使能

2.2  SysTick->LOAD 重装载值寄存器

当前值寄存器为0时,自动将重装载值重装到当前值计数器,重装载值的大小需要自己设置
2.3  SysTick->VAL当前值寄存器
可读可写,当计数器使能时,这个寄存器的值开始递减,使用前后注意清零
三、SysTick逻辑图

四、时钟频率与延时
4.2时钟选择
采用参考8分频的参考时钟(168M / 8 = 21M)比较准,所以此处SysTick计数器选择21M的时钟
4.2  如何延时1us
时钟频率为21M,也就是1s的时间技术21M次。
由此可知计数一次用了 (1/21000000) s ,用了(1/21000) ms, 用了(1/21) us
所以,1us计数21次。
4.3  如何延时1ms
因为1ms = 1000us,所以综上所述,1ms计数1000*21次计数,1ms也就是21000次计数
4.3最大延时
24位计数器能保存的最大值 : 16777215。
最大延时时间 =:16777215 / 21 = 798915 us = 798.915ms
五、编程思路
5.1  Delay初始化
选择时钟源
关闭计数器
5.2  延时函数
设置重装载值
当前值清零
使能SysTick
等待计数器计数完毕
当前值清零
关闭计数器
六、示例代码
#include "delay.h"
#define    Value_us    21
#define    Value_ms    21000
void delay_init(void)
{
              SysTick->CTRL &= (1 << 2); //控制寄存器位2置0,选择8分频时钟
              SysTick->CTRL &= ~(1 << 0); //关闭计数器
}
void delay_us(u32 num)
{            
              SysTick->LOAD = num * Value_us;
              SysTick->VAL = 0;
              SysTick->CTRL |= (1 << 0); //使能计数器
              while (!(SysTick->CTRL & 1<<16));              //判断是否计数完毕
              SysTick->VAL = 0;
              SysTick->CTRL &= ~(1 << 0); //关闭计数器            
}
void delay_ms(u32 num)
{                           
              SysTick->LOAD = num * Value_ms;
              SysTick->VAL = 0;
              SysTick->CTRL |= (1 << 0); //使能计数器
              while (!(SysTick->CTRL & 1<<16));
              SysTick->VAL = 0;
              SysTick->CTRL &= ~(1 << 0); //关闭计数器            
}
详细资料请参考《Cortex M3M4权威指南》

对SysTick延时的总结.docx

568.77 KB, 下载次数: 74, 下载积分: 黑币 -5

评分

参与人数 2黑币 +55 收起 理由
hzd530 + 5
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:419240 发表于 2018-12-21 15:45 | 显示全部楼层
特别好,谢谢
回复

使用道具 举报

ID:39590 发表于 2020-2-16 23:20 | 显示全部楼层
资料很好。介绍的很详细。
回复

使用道具 举报

ID:612059 发表于 2020-2-23 00:43 | 显示全部楼层
弄清楚了 谢谢
回复

使用道具 举报

ID:747991 发表于 2020-5-9 22:42 | 显示全部楼层
"选择8分频时钟" 位2是0就是选择8分频时钟吗,选择8分频时钟是怎么出来的,这里没看懂,我是刚学习STM32的
回复

使用道具 举报

ID:332280 发表于 2020-6-16 15:35 | 显示全部楼层
我卡死在while (!(SysTick->CTRL & 1<<16)); 出不来了
回复

使用道具 举报

ID:764088 发表于 2020-6-18 16:01 | 显示全部楼层
向您学习!收藏
回复

使用道具 举报

ID:627966 发表于 2020-10-23 19:54 | 显示全部楼层
楼主你这个有关SYSTICK寄存器的配置是哪个文档看到的
回复

使用道具 举报

ID:170498 发表于 2020-11-23 13:28 | 显示全部楼层
102432 发表于 2020-5-9 22:42
"选择8分频时钟" 位2是0就是选择8分频时钟吗,选择8分频时钟是怎么出来的,这里没看懂,我是刚学习STM32的

《Cortex M3与M4权威指南》——英文版,里面有详细描述,如果跟我一样英文不好,可以用翻译软件。
回复

使用道具 举报

ID:170498 发表于 2020-11-23 13:29 | 显示全部楼层
pjzmj2012 发表于 2020-6-16 15:35
我卡死在while (!(SysTick->CTRL & 1

开启SysTick了没有?不开启不行的。
回复

使用道具 举报

ID:170498 发表于 2020-11-23 13:29 | 显示全部楼层
ionAiex 发表于 2020-10-23 19:54
楼主你这个有关SYSTICK寄存器的配置是哪个文档看到的

《Cortex M3与M4权威指南》——英文版。
回复

使用道具 举报

ID:600982 发表于 2020-11-24 10:49 | 显示全部楼层
SysTick->CTRL &= (1 << 2); //控制寄存器位2置0,选择8分频时钟
这是置零吗
回复

使用道具 举报

ID:119642 发表于 2021-2-18 17:21 | 显示全部楼层
你解决了我的一个大的疑惑。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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