一、简介
- 在 STM32中,SysTick 是一个24位的递减定时器,由 ARM Cortex-M 内核提供。
- 主要用于提供标准的系统时钟、实现简单的延时功能。
二、SysTick 相关寄存器
1. CTRL (Control and Status Register)
- 用于控制 SysTick的启动、停止、时钟源选择、及中断的使能/禁用,相关位包括:
ENABLE
位 :使能或禁用SysTick 。
TICKINT
位 :使能或禁用 SysTick 中断。
CLKSOURCE
位:选择时钟源(系统时钟或系统时钟的1/8)。
COUNTFLAG
位:指示SysTick 是否已计数到0。
2. LOAD (Reload Value Register)
- 存储重装值,当SysTick 计数到零时会自动重装该值。
- 重装值决定了 SysTick 中断的周期,取值范围为:0 ~ 0xFFFFFF。
3. VAL (Current Value Register)
- 存储当前的计数器值。
4. CALIB (Calibration Value Register)
- 保存参考时钟(通常为10ms)的校准值,供延时计算时参考。
三、SysTick 唯一固件库函数
四、应用
目标:利用SysTick实现延时功能
- 新建文件
- delay.c
#include "delay.h"
/**
* @brief 初始化 SysTick
* @param ticks: 预装载值
* @retval 无
*/
void SysTick_Init(uint32_t ticks) {
SysTick->CTRL = 0; // 禁用 SysTick
SysTick->LOAD = ticks - 1; // 设置重装载寄存器
NVIC_SetPriority(SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); // 设置 SysTick 优先级为最低
SysTick->VAL = 0; // 清除当前值寄存器
SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk; // 选择时钟源(使用处理器时钟)
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; // 启用 SysTick
}
/**
* @brief 微秒延时
* @param us: 延时微秒数
* @retval 无
*/
void delay_us(uint32_t us)
{
SysTick_Init(SystemCoreClock / 1000000); // 每微秒一个滴答
while(us--)
{
while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); // 等待计数标志设置
}
}
/**
* @brief 毫秒延时
* @param ms: 延时毫秒数
* @retval 无
*/
void delay_ms(uint32_t ms)
{
SysTick_Init(SystemCoreClock / 1000); // 每毫秒一个滴答
while(ms--)
{
while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); // 等待计数标志设置
}
}
- delay.h
#ifndef __DELAY_H
#define __DELAY_H
#include "stm32f4xx.h"
void delay_us(uint32_t us);
void delay_ms(uint32_t ms);
#endif
- main.c
#include "stm32f4xx.h"
#include "led.h"
#include "bitband.h"
#include "delay.h"
int main(void)
{
GPIO_Config();
while(1)
{
PBout(1) = 0; // 点亮 LED0
PBout(0) = 1; // 熄灭 LED1
delay_ms(500);
PBout(1) = 1; // 熄灭 LED0
PBout(0) = 0; // 点亮 LED1
delay_ms(500);
}
}
- 编译运行,实现流水灯效果。