您的位置:首页 > 其它

STM32延时us程序

2013-08-01 18:49 423 查看
硬件: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