2025年STM32delay函数应用与说明[通俗易懂]

STM32delay函数应用与说明[通俗易懂]STM32delay 函数应用应用与说明 Cortex M4 内核编程手册有关时钟系统的内容 定时函数的实现 delay init 函数 delay us 函数 对与 32 中的 delay 函数有很多中形式可以使用 这里提供一些自己使用遇到过的函数类型 Cortex M4 内核编程手册有关时钟系统的内容 p230 SysTick timer STK The processor has a

STM32delay函数应用应用与说明

Cortex M4内核编程手册有关时钟系统的内容

定时函数的实现

delay_init 函数

delay_us 函数

对与32中的delay函数有很多中形式可以使用,这里提供一些自己使用遇到过的函数类型。

Cortex M4内核编程手册有关时钟系统的内容

p230
SysTick timer (STK)
The processor has a 24-bit system timer, SysTick, that counts down from the reload value to zero, reloads (wraps to) the value in the STK_LOAD register on the next clock edge, then counts down on subsequent clocks.
When the processor is halted for debugging the counter does not decrement.

处理器有一个24位的系统计时器(SysTick),这个定时器从装载值进行递减,知道0为止,在下一个时钟边缘对STK_LOAD中的值进行重载入,然后在后续的时钟中递减计数。
在对处理器进行暂停调试的时候,计数器不会减小。

在arm体系中与时钟有关的寄存器是:STK_CTRL STK_LOAD STK_VAL STK_CALIB是这四个寄存器

在明确了以上内容之后,利用STM32的内部SysTick来实现延时,这样既不占用中断,也不会占用系统定时器。

定时函数的实现

delay_init 函数

该函数用来初始化2个重要参数:fac_us以及fac_ms;tongshi ba SysTick的时钟源选择位外部时钟,在不加入系统的时候,延时初始化函数的代码如下:

 // 初始化延时函数
//SYSTICK的时钟固定为HCLK时钟的1/8
static uint8_t fac_us=0;
void delay_init(uint8_t SYSCLK)
{

HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
//SysTick 频率为 HCLK
fac_us=SYSCLK; //不论是否使用 OS,fac_us 都需要使用
}

delay_us 函数

这个函数是用来指定us的,其参数nus为延时的微妙数。

//延时 nus
//nus:要延时的 us 数.
//nus:0~190887435(最大值即 2^32/fac_us@fac_us=22.5)
void delay_us(uint32_t nus)
{

uint32_t ticks;
uint32_t told,tnow,tcnt=0;
uint32_t reload=SysTick->LOAD; //LOAD 的值
ticks=nus*fac_us; //需要的节拍数
delay_osschedlock(); //阻止 OS 调度,防止打断 us 延时
told=SysTick->VAL; //刚进入时的计数器值
while(1)
{

tnow=SysTick->VAL;
if(tnow!=told)
{

if(tnow //这里注意一下 SYSTICK 是一个递减的计数器就可以了.
else tcnt+=reload-tnow+told;
told=tnow;
if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则退出.
}
};
}

进行测试:是正确的!

编程小号
上一篇 2025-08-09 21:33
下一篇 2025-09-19 18:11

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/114492.html