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

位16:当前值寄存器递减到0,位16置1
位2:时钟源选择位,0:使用外部参考时钟;1:使用内核时钟
位1:使能SysTick中断,当前值寄存器递减到0时产生中断
位0:SysTick时钟使能
2.2SysTick->LOAD 重装载值寄存器

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

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


四、时钟频率与延时
4.1时钟选择采用参考8分频的参考时钟比较准,所以此处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.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); //关闭计数器 }
关键字:STM32 SysTick 寄存器操作
引用地址:
个人对STM32 SysTick的总结(寄存器操作)
推荐阅读最新更新时间:2026-03-19 15:58
STM32 GPIO操作深度解析:HAL库中的GPIO初始化艺术——不仅仅是配置寄存器的故事
???? 前言 你是不是也曾经天真地以为,控制几个LED灯只需要随便写两行代码?是不是觉得GPIO初始化不过是设置几个寄存器的小把戏?当你的按键检测出现抖动、LED莫名闪烁、通信接口罢工时,你是否怀疑过自己根本没真正理解GPIO?今天,就让我们把STM32的GPIO外衣一层层剥开,看看这个看似简单的功能模块背后藏着多少工程师的智慧结晶! 1. GPIO——被低估的硬件桥梁 GPIO(General Purpose Input/Output)是MCU与外部世界交互的物理接口。在STM32中,每个GPIO引脚都包含7个寄存器控制其行为: 4个32位配置寄存器(MODER, OTYPER, OSPEEDR, PUPDR) 2个3
[单片机]
STM32实例-通过操作寄存器实现流水灯效果
我们需要在外部定义一个SystemInit 函数设置 STM32 的时钟;STM32 上电后,会执行 SystemInit 函数,最后执行我们 C 语言中的 main 函数。 下面就开始使用寄存器来操作 STM32 使 PC0 输出一个低电平。要操作 STM32寄存器,我们就需要使用 C 语言对其封装,这部分程序我们都放在 stm32f10x.h中。具体代码如下: #define PERIPH_BASE ((unsigned int)0x40000000) #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000) #define GPIOC_BASE (APB2PERIPH_BASE +
[单片机]
STM32单片机中C语言操作寄存器的原理
映射的概念 存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程就称为存储器映射,如下图所示的4GB空间(从block0-block7每个block512M)。在梳理STM32芯片的内部架构中提到的被控单元FLASH、RAM、FSMC和APB等功能部件共同排列在这4GB的地址空间内。在编程的时候,可以通过他们的地址找到他们,然后通过C语言对它们进行数据的读和写操作。 存储器映射 在这 4GB 的地址空间中,ARM 已经粗线条的平均分成了 8 个块,每块 512MB,每个块也都规定了用途,具体分类见如下表格。在这 8 个 Block 里面,有 3 个块非常重要,也是我们最关心的三个块。Block0
[单片机]
STM32 RTC寄存器操作步骤
寄存器操作步骤 1、使能电源时钟和备份区域时钟。 我们要访问 RTC 和备份区域就必须先使能电源时钟 和 备份区域时钟。这个通过RCC_APB1ENR 寄存器来设置。 2、取消备份区写保护。 要向备份区域写入数据,就要先取消备份区域写保护(写保护在每次硬复位之后被使能),否则是无法向备份区域写入数据的。我们需要用到向备份区域写入一个字节,来标记时钟已经配置过了,这样避免每次复位之后重新配置时钟。 3、复位备份区域,开启外部低速振荡器。 在取消备份区域写保护之后,我们可以先对这个区域复位,以清除前面的设置,当然这个操作不要每次都执行,因为备份区域的复位将导致之前存在的数据丢失,所以要不要复位,要看情况而定。然
[单片机]
STM32的操作过程,寄存器配置与调试过程
很多学习stm32的,为什么学习stm32他也不知道,我们所知道的就是各个论坛讨论stm32的很多,而我们很多人之所以学习stm32是很多的淘宝卖家做了大量的图片文字宣传,于是我们经不住诱惑就买了板子,然后我们就开始了我们的学习之旅。 在淘宝卖家的眼里有着齐全的入门资料是板子的最大的卖点,于是当我们拿到开发板的时候,我们感觉我们永远不能和别人说自己熟悉stm32,因为脱离了网络的资料我们什么都做不了,这是我们最害怕的事情。 今天我就就像在这里记录下自己一无所有建立stm32工程的过程,是我自己的一个探索过程,同时也是大家互相交流的过程。 第一步:当然是新建一个工程我把它命名为small(这个随便你,青菜萝卜各有所爱……)
[单片机]
STM32库函数和寄存器操作的思考
从开始接触51单片机,到现在开始转型学习功能更加强大的STM32f407系列, 学习过程中引入了库函数及相应操作,当时赶着进度做点东西出来,有点不求甚解。现在返回来求索:相比于原来51单片机的寄存器,32系列的寄存器无论是个数还是实现功能时多个寄存器之间的调用配合,使用难度都高了不少,所以有了库函数和相应的固件库来减少难度。 先说一下固件库(这个我们最开始安装完MDK缺了它总是各种报错的东西)和相应库函数: 固件库这边时首先将各个设备所有寄存器的配置字进行预定义,然后封装在结构体或者枚举变量中,等到用户调用相关库函数时,会根据用户传入的参数从这些已经封装好的结构体或者枚举变量中取出与之对应的配置字,最后写入相应寄存器中完成对底层寄
[单片机]
stm32 直接操作寄存器开发环境配置
操作stm32 有使用官方库函数(参见 stm32 开发环境MDK+库文件配置 )和 直接操作寄存器的方法 直接操作寄存器的方法 会比库函数的方法效率更高 而且代码量会比较少 例如 在库函数下 配置一个GPIO口 需要 GPIO_InitTypeDef GPIO_InitStructure; //结构体 初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPI
[单片机]
stm32 i2c通信 [操作寄存器+库函数]
I2C总线是由NXP(原PHILIPS)公司设计,有十分简洁的物理层定义,其特性如下: 只要求两条总线线路:一条串行数据线SDA,一条串行时钟线SCL; 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址,主机可以作为主机发送器或主机接收器; 它是一个真正的多主机总线,如果两个或更多主机同时初始化,数据传输可以通过冲突检测和仲裁防止数据被破坏; 串行的8 位双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s; 连接到相同总线的IC 数量只受到总线的最大电容400pF 限制。 其典型的接口连线如下: I2C的协议
[单片机]