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

2024-03-28  

一、概述:

SysTick是一个简单的递减24位计数器。如果你不需要再应用程序中嵌入操作系统,SysTick可以作为简单的延时和产生周期性的中断。

状态控制寄存器的第0位可以使能计数器,当前值寄存器随着时钟一直递减,当他减到0的时候,重装载寄存器就会重新装载这只的值,计数器继续从这个值递减。


二、相关寄存器:

2.1SysTick->CTRL 状态和控制寄存器

a6b115d4-ac26-11ee-aa22-92fbcf53809c.jpg

位16:当前值寄存器递减到0,位16置1

位2:时钟源选择位,0:使用外部参考时钟;1:使用内核时钟

位1:使能SysTick中断,当前值寄存器递减到0时产生中断

位0:SysTick时钟使能


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

a6bd978c-ac26-11ee-aa22-92fbcf53809c.jpg

当前值寄存器为0时,自动将重装载值重装到当前值计数器,重装载值的大小需要自己设置。


2.3 SysTick->VAL当前值寄存器

a6c179d8-ac26-11ee-aa22-92fbcf53809c.jpg

可读可写,当计数器使能时,这个寄存器的值开始递减,使用前后注意清零。

三、SysTick逻辑图

a6c58bd6-ac26-11ee-aa22-92fbcf53809c.jpg


a6d2c760-ac26-11ee-aa22-92fbcf53809c.jpg


四、时钟频率与延时

4.1时钟选择采用参考8分频的参考时钟比较准,所以此处SysTick计数器选择21M的时钟。

a6e0a4c0-ac26-11ee-aa22-92fbcf53809c.jpg


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.4最大延时24位计数器能保存的最大值 : 16777215。最大延时时间=16777215 /21=798915us=798.915ms



五、示例代码


#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); //关闭计数器 }


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。