#中delay函数_嵌入式17——delay 文件夹代码介绍

本文介绍了STM32中基于SysTick定时器的延迟函数,包括delay_init、delay_us和delay_ms的实现,特别是在操作系统(如UCOSII)环境下如何与OS共用SysTick实现精准延时。文中详细阐述了时钟摘取法和相关宏定义、函数的作用,以及HAL库的HAL_Delay函数的工作原理和限制。
摘要由CSDN通过智能技术生成

delay 文件夹内包含了 delay.c delay.h 两个文件,这两个文件用来实现系统的延时功能,其中包含 7 个函数

void delay_osschedlock(void);
void delay_osschedunlock(void);
void delay_ostimedly(u32 ticks);
void SysTick_Handler(void);
void delay_init(u8 SYSCLK);
void delay_ms(u16 nms);
void delay_us(u32 nus);

前面 4 个函数,仅在支持操作系统(OS)的时候,需要用到,

后面 3 个函数,则不论是否支持 OS 都需要用到。

介绍这些函数之前,先了解一下编程思想:

CM4 内核的处理和 CM3的处理 一样,内部都包含了一个 SysTick 定时器

SysTick 是一个 24 位的倒计数定时器,当计到 0 时,将从 RELOAD寄存器中自动重装载定时初值。

只要把它在 SysTick 控制及状态寄存器中的使能位清除,就永不停息

利用 STM32 的内部 SysTick 来实现延时的,这样既不占用中断也不占用系统定时器

这里介绍的是 ALIENTEK 提供的最新版本延时函数,该版本的延时函数支持在任意操作系统(OS)下面使用,它可以和操作系统共用 SysTick 定时器

以 UCOSII 为例,介绍如何实现操作系统和我们的delay 函数 共用 SysTick 定时器。即SysTick 定时器既能为操作系统提供系统时钟节拍又能为delay函数作延时用。

首先,我们简单介绍下 UCOSII 的时钟: ucos 运行需要一个系统时钟节拍(类似 “心跳”),而这个节拍是固定的(由 OS_TICKS_PER_SEC 宏定义设置),比如要求 5ms 一次(即可设置:OS_TICKS_PER_SEC=200),在 STM32 上面,一般是由 SysTick 来提供这个节拍,也就是 SysTick要设置为 5ms 中断一次,为 ucos 提供时钟节拍,而且这个时钟一般是不能被打断的(否则就不准了)。

因为在 ucos 下 systick 不能再被随意更改,如果我们还想利用 systick 来做 delay_us 或者delay_ms 的延时,就必须想点办法了,这里我们利用的是时钟摘取法。以 delay_us 为例,比如delay_us(50),在刚进入 delay_us 的时候先计算好这段延时需要等待的 systick 计数次数,这里为 50*400(假设系统时钟为 400Mhz(1us就是400次,因此50us就是50*400次),因为我们设置 systick 的频率系统时钟频率,那么 systick每增加 1,就是 1/400us),然后一直统计 systick 的计数变化,直到这个值变化了 50*400,一旦检测到变化达到或者超过这个值,就说明延时 50us 时间到了。这样,我们只是抓取 SysTick计数器的变化,并不需要修改 SysTick 的任何状态,完全不影响 SysTick 作为 UCOS 时钟节拍的功能,这就是实现 delay 和操作系统共用 SysTick 定时器的原理。

下面介绍这几个函数。

操作系统支持宏定义及相关函数

当需要 delay_ms 和 delay_us 支持操作系统(OS)的时候,我们需要用到 3 个宏定义和 4个函数,宏定义及函数代码如下:

//本例程仅作 UCOSII 和 UCOSIII 的支持,其他 OS,请自行参考着移植
//支持 UCOSII
#ifdef OS_CRITICAL_METHOD
//OS_CRITICAL_METHOD 定义了,说明要支持 UCOSII
#define delay_osrunning OSRunning //OS 是否运行标记,0,不运行;1,在运行
#define delay_ostickspersec OS_TICKS_PER_SEC //OS 时钟节拍,即每秒调度次数
#define delay_osintnesting OSIntNesting //中断嵌套级别,即中断嵌套次数
#endif
//支持 UCOSIII
#ifdef CPU_CFG_CRITICAL_METHOD
//CPU_CFG_CRITICAL_METHOD 定义了,说明要支持 U
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值