STM32延时us程序

硬件:STM32F103C8 (8M晶振)

文件名:DELAY.H

extern void delay_nus(u32 Nus);
extern void delay_nms(u16 nms);
extern void delay_init(u8 SYSCLK);
extern void delay_ns(u16 ns);

文件名:DElAY.C

//使用SysTick的普通计数模式对延迟进行管理
//包括delay_us,delay_ms  
static u8  fac_us=0;//us延时倍乘数
static u16 fac_ms=0;//ms延时倍乘数
//初始化延迟函数
//SYSCLK 取值如72,36等
void delay_init(u8 SYSCLK)
{
SysTick->CTRL&=0xfffffffb;//选择内部时钟 HCLK/8
fac_us=SYSCLK/8;      //72M/8=9M,,每次计数1/9us,所以计数为9时正好1us
fac_ms=(u16)fac_us*1000;
}            
//延时Nms
//注意Nms的范围
//Nms<=0xffffff*8/SYSCLK
//对72M条件下,Nms<=1864 
void delay_nms(u16 nms)
{    
SysTick->LOAD=(u32)nms*fac_ms; //时间加载  
SysTick->CTRL|=0x01;               //开始倒数    
while(!(SysTick->CTRL&(1<<16)));   //等待时间到达 
SysTick->CTRL&=0XFFFFFFFE;         //关闭计数器
SysTick->VAL=0X00000000;           //清空计数器     
}   
//延时us           
void delay_nus(u32 Nus)

SysTick->LOAD=Nus*fac_us;       //时间加载      
SysTick->CTRL|=0x01;            //开始倒数    
while(!(SysTick->CTRL&(1<<16)));//等待时间到达 
SysTick->CTRL=0X00000000;       //关闭计数器
SysTick->VAL=0X00000000;        //清空计数器     


//延时s 
void delay_ns(u16 ns)
{
    while(ns--)
    {
        delay_nms(1000);
    }
}


运用实例:

在初始化系统时钟的时候进行delay模块的初始化:delay_init(72);  //系统时钟为72M

延时几秒的时候,注意调用delay_ns(u16 ns),而非delay_nms(u16 nms),从而确保精确度。

注意头文件的包含~~~

你可能感兴趣的:(STM32—CC2500)