stm32的固件库里有delay_ms();函数吗?要include哪个头文件?

2020-08-27 体育 294阅读
由于延时函数和系统时钟频率密切相关,所以stm32的固件库里没有delay_ms()函数可供直接调用。
帮你贴一段代码:
//////////////////////////////////////////////////////////////////////////////////
//延时程序
//邓尧
//2014.5.15.
//1.0
//Copyright(C)
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
#include
//////////////////////////////////////////////////////////////////////////////////

static u8 fac_us=0; //us延时倍乘数
static u16 fac_ms=0; //ms延时倍乘数

////////////////////////////////////////
//初始化延迟函数
//SYSTICK的时钟固定为HCLK时钟的1/8
//SYSCLK:系统时钟 如72
////////////////////////////////////////
void delay_init(u8 SYSCLK)
{
SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟 HCLK/8
fac_us=SYSCLK/8;
fac_ms=(u16)fac_us*1000;
}
////////////////////////////////////////
//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms<=1864
////////////////////////////////////////
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数
do
{

temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
////////////////////////////////////////////
//延时nus
//nus为要延时的us数.
/////////////////////////////////////////////
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //时间加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
////////////////////END//////////////////////////////////////////

这里的滴答时钟能精确的达到定时的效果,但是这里有一个注意的地方就是当你用滴答时钟做延时函数时,一旦你运行延时函数,CPU将处于空闲状态,一般这种状态下只有外部或者内部中断才能打断,但是需要注意的是滴答时钟的中断优先级高于我们能够配置的外部中断优先级,所以你在延时时如果想使用外部中断进行打断的话效果将不太理想,这也是我自己遇到的一个问题,至今没有一个很好的解决办法,所以如果我要在延时中进行打断的话,我一般不用滴答时钟作为我的延时定时器。而是用高级定时器或者通用定时定时,并且能在想中断时,用优先级高的中断进行打断,这里又设计到了一个问题就是外部中断的使用和STM32优先级的使用和优先级的学习,呵呵,说着说着就发现这些东西不是一两句话就能说清的,慢慢来吧,我有时间的时候就会把这些学习的心得公布在网上,希望能有更多的人能读到,有所成长。
滴答时钟它本来是用给操作系统提供一个“心跳”频率,能够实现优先级的判定和任务之间的切换,是维持操作系统的根本。一般在UCOSII系统中滴答时钟每10MS中断一次,在中断里调用任务调度函数,实现多任务系统的正常运作,当然前提必须把UCOSII移植到STM32中,当然这个会在后续的记录中说UCOSII的使用,这个也是一个大的模块,希望能有这么多的精力去把它分享出来给大家,我只是在这里提起一下滴答时钟,它是一个很好用的定时器,用好了是神器,我也希望能更加深入和全面的说讲解下它,现在只是说起它,希望有心之人也能去研究研究下它。
声明:你问我答网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系fangmu6661024@163.com