具体操作步骤看这里:STM32CubeMX学习笔记(4)——系统延时使用_cubemx systick-CSDN博客
1、SysTick 初始化函数
SysTick 初始化函数由用户编写,里面调用了 SysTick_Config() 这个固件库函数,通过设置该固件
库函数的形参,就决定了系统定时器经过多少时间就产生一次中断。
2、SysTick 中断时间的计算
SysTick 定时器的计数器是向下递减计数的,计数一次的时间 TDEC=1/CLKAHB,当重装载寄存器中的值 VALUELOAD 减到 0 的时候,产生中断,可知中断一次的时间 T INT=VALUELOAD * TDEC=VALUE LOAD/CLK:sub:AHB,其中 CLKAHB =72MHZ。如果设置 VALUELOAD 为 72,那中断一次的时间 TINT=72/72M=1us。
SysTick_Config()的形我们配置为 SystemCoreClock / 100000=72M/100000=720,从刚刚分析我们知道这个形参的值最终是写到重装载寄存器 LOAD 中的,从而可知我们现在把 SysTick 定时器中断一次的时间 TINT=720/72M=10us。
3、SysTick 定时时间的计算
当设置好中断时间 TINT 后,我们可以设置一个变量 t,用来记录进入中断的次数,那么变量 t 乘
以中断的时间 TINT 就可以计算出需要定时的时间。
4、SysTick 定时函数
void Delay_us(__IO u32 nTime)
{
TimingDelay = nTime;
while (TimingDelay != 0);
}
5、SysTick 中断服务函数
中断服务函数调用了另外一个函数 TimingDelay_Decrement(),
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00) {
TimingDelay--;
}
}
进入中断一次TimingDelay递减一次。
TimingDelay 的值等于延时函数中传进去的 nTime 的值,比如 nTime=100000,则延时的时间等于100000*10us=1s。
6、代码部分
使用CubeMX配置生成了初始化代码(时钟,GPIO)
应用代码需要自己添加上(延时函数的定义,可以放在新建一个bsp_SysTick.c文件)
#include "./systick/bsp_SysTick.h"
static __IO u32 TimingDelay;
/**
* @brief 启动系统滴答定时器 SysTick
* @param 无
* @retval 无
*/
void SysTick_Init(void)
{
/* SystemFrequency / 1000 1ms中断一次
* SystemFrequency / 100000 10us中断一次
* SystemFrequency / 1000000 1us中断一次
*/
if (HAL_SYSTICK_Config(SystemCoreClock / 100000))
{
/* Capture error */
while (1);
}
}
/**
* @brief us延时程序,10us为一个单位
* @param
* @arg nTime: Delay_us( 1 ) 则实现的延时为 1 * 10us = 10us
* @retval 无
*/
void Delay_us(__IO u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
/**
* @brief 获取节拍程序
* @param 无
* @retval 无
* @attention 在 SysTick 中断函数 SysTick_Handler()调用
*/
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
/*********************************************END OF FILE**********************/
还要在中断服务函数中添加
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
然后就可以在主函数中使用自己定义的延时函数了。
7、问题
没什么问题