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

我是新手,最近用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权威指南》
  • 22
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
SysTickSTM32微控制器中的一个系统计时器。它可以用于生成周期性的中断和提供系统计时功能。在STM32中,SysTick寄存器用于配置SysTick计时器,并可以读取当前SysTick计数器的值。 SysTick寄存器包括以下几个部分: 1. Control and Status Register (STK_CTRL):用于配置SysTick计时器的控制和状态寄存器。它包括以下几个位: - ENABLE:使能SysTick计时器。 - TICKINT:使能SysTick中断。 - CLKSOURCE:选择SysTick计时器的时钟源。可以选择内部时钟(HCLK)或外部时钟(STM32F4系列芯片支持)。 - COUNTFLAG:SysTick计数器溢出标志位。 2. Reload Value Register (STK_LOAD):用于设置SysTick计时器的重装值。当SysTick计数器减到0时,会产生一个中断(如果TICKINT位被置位),并重新加载STK_LOAD寄存器的值。 3. Current Value Register (STK_VAL):用于读取当前SysTick计数器的值。 4. Calibration Value Register (STK_CALIB):用于校准SysTick计时器的值。它包括以下几个位: - TENMS:每个计数器滴答所代表的时间(以毫秒为单位)。 - SKEW:表示SysTick计时器的精度。如果该位为1,则SysTick计时器的精度不如系统时钟。 - NOREF:表示SysTick计时器的时钟源是否来自外部时钟。如果该位为1,则SysTick计时器的时钟源不是外部时钟。 通过对SysTick寄存器的配置,可以实现周期性的中断、定时器和延时等功能。例如,可以通过设置STK_LOAD寄存器的值和使能SysTick中断,来实现一定时间间隔内产生中断的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值