立创商城STM32F系列——delay_ms函数delay_ms是什么意思?

21ic官方微信-->
立创商城STM32F系列——delay_ms函数
初级技术员, 积分 99, 距离下一级还需 1 积分
初级技术员, 积分 99, 距离下一级还需 1 积分
初级技术员, 积分 99, 距离下一级还需 1 积分
初级技术员, 积分 99, 距离下一级还需 1 积分
delay_ms函数
/**********************************************************/
该函数同 delay_xms 一样,也是用来延时指定的 ms 的,其参数 nms 为要延时的毫秒数。
该函数有使用OS和不使用OS 两个版本,这里我们分别介绍,首先是不使用OS的时候,实现函数如下:
//延时nms& &
//nms:0~65535
void delay_ms(u16 nms)
{& && && &
&&u8 repeat=nms/540;&&//这里用 540,是考虑到某些客户可能超频使用,
& && && & //比如超频到 248M的时候,delay_xms最大只能延时 541ms左右了
&&u16 remain=nms%540;
&&while(repeat)
& & delay_xms(540);
& & repeat--;
&&if(remain)delay_xms(remain);
该函数其实就是多次调用前面所讲的 delay_xms 函数,来实现毫秒级延时的。注意下,这里以 540ms为周期是考虑到MCU超频使用的情况。
再来看看使用OS的时候,delay_ms的实现函数如下:
//nms:要延时的 ms数
//nms:0~65535
void delay_ms(u16 nms)
&&if(delay_osrunning&&delay_osintnesting==0)//如果OS已经在跑了,且不是在中断里面
& & if(nms&=fac_ms)& && && & //延时的时间大于OS的最少时间周期& &
& && && & delay_ostimedly(nms/fac_ms);&&//OS延时
& & nms%=fac_& & //OS已经无法提供这么小的延时了,采用普通方式延时& && &
&&delay_us((u32)(nms*1000));&&//普通方式延时
该函数中,delay_osrunning 是OS正在运行的标志,delay_osintnesting 则是OS中断嵌套次数,必须 delay_osrunning 为真,且 delay_osintnesting为 0的时候,才可以调用OS 自带的延时函数进行延时(可以进行任务调度),delay_ostimedly函数就是利用OS 自带的延时函数,实现任务级延时的,其参数代表延时的时钟节拍数(假设 delay_ostickspersec=200,那么delay_ostimedly (1),就代表延时 5ms)。
当 OS 还未运行的时候,我们的 delay_ms 就是直接由 delay_us 实现的,OS 下的 delay_us可以实现很长的延时(达到 204 秒)而不溢出!,所以放心的使用 delay_us 来实现 delay_ms,不过由于 delay_us的时候,任务调度被上锁了,所以还是建议不要用delay_us来延时很长的时间,否则影响整个系统的性能。
当 OS 运行的时候,我们的 delay_ms 函数将先判断延时时长是否大于等于 1个 OS 时钟节拍(fac_ms),当大于这个值的时候,我们就通过调用 OS 的延时函数来实现(此时任务可以调度),不足1 个时钟节拍的时候,直接调用delay_us函数实现(此时任务无法调度)。
/**********************************************************/
【立创商城】STM32F103CBT6 托盘&&https://item.szlcsc.com/8796.html
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖
热门推荐 /521ic官方微信-->
立创商城STM32F系列——delay_xms函数
初级技术员, 积分 99, 距离下一级还需 1 积分
初级技术员, 积分 99, 距离下一级还需 1 积分
初级技术员, 积分 99, 距离下一级还需 1 积分
初级技术员, 积分 99, 距离下一级还需 1 积分
delay_xms函数
/**********************************************************/
该函数仅在没用到 OS 的时候使用,用来延时指定的 ms,其参数 nms 为要延时的毫秒数。该函数代码如下:
//延时nms& &
//注意nms的范围
//SysTick-&LOAD为24位寄存器,所以,最大延时为:
//nms&=0xffffff*8*1000/SYSCLK
//SYSCLK单位为 Hz,nms单位为 ms
//对 168M条件下,nms&=798ms& &
void delay_xms(u16 nms)
{& && && && && &&&
&&u32& && && &
&&SysTick-&LOAD=(u32)nms*fac_//时间加载(SysTick-&LOAD 为24bit)
&&SysTick-&VAL =0x00;& && && &&&//清空计数器
&&SysTick-&CTRL|=SysTick_CTRL_ENABLE_M& & //开始倒数& &&&
& & temp=SysTick-&CTRL;
&&}while((temp&0x01)&&!(temp&(1&&16)));//等待时间到达& &&&
&&SysTick-&CTRL&=~SysTick_CTRL_ENABLE_M& &&&//关闭计数器
&&SysTick-&VAL =0X00;& && & //清空计数器& && && && &
此部分代码和5.1.3节的delay_us(非OS版本)大致一样,但是要注意因为LOAD 仅仅是
一个 24bit的寄存器,延时的ms数不能太长。否则超出了 LOAD的范围,高位会被舍去,导致
延时不准。最大延迟 ms 数可以通过公式:nms&=0xffffff*8*1000/SYSCLK 计算。SYSCLK 单
位为Hz,nms的单位为 ms。如果时钟为168M,那么 nms的最大值为798ms。超过这个值,建
议通过多次调用delay_xms实现,否则就会导致延时不准确。
很显然,仅仅提供delay_xms函数,是不够用的,很多时候,我们延时都是大于798ms的,
所以需要再做一个 delay_ms函数,下面将介绍该函数。
/**********************************************************/
【立创商城】STM32F103CBT6 托盘&&https://item.szlcsc.com/8796.html
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖
热门推荐 /5

我要回帖

更多关于 delay1000ms 的文章

 

随机推荐