stm32的几种延时方法

stm32的几种延时方法

ID:34418618

大小:31.49 KB

页数:3页

时间:2019-03-06

stm32的几种延时方法_第1页
stm32的几种延时方法_第2页
stm32的几种延时方法_第3页
资源描述:

《stm32的几种延时方法》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、STM32的几种延时方法(基于MDK固件库3.0,晶振8M)单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us()和毫秒级delay_ms()。1.普通延时法这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,不过要做的比较精准还是要下一番功夫。下面的代码是在网上搜到的,经测试延时比较精准。//粗延时函数,微秒voiddelay_us(u16time){       u16i=0;     while(time--)   {      i=10;  //自己定义      while(i--);       }}/

2、/毫秒级的延时voiddelay_ms(u16time){       u16i=0;     while(time--)   {      i=12000;  //自己定义      while(i--);       }}2.SysTick定时器延时CM3内核的处理器,内部包含了一个SysTick定时器,SysTick是一个24位的倒计数定时器,当计到0时,将从RELOAD寄存器中自动重装载定时初值。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。SysTick在STM32的参考手册里面介绍的很简单,其详细介绍,请参阅《Cortex

3、-M3权威指南》。 这里面也有两种方式实现:a.中断方式 如下,定义延时时间time_delay,SysTick_Config()定义中断时间段,在中断中递减time_delay,从而实现延时。volatileunsignedlongtime_delay;//延时时间,注意定义为全局变量//延时n_msvoiddelay_ms(volatileunsignedlongnms){    //SYSTICK分频--1ms的系统时钟中断    if(SysTick_Config(SystemFrequency/1000))    {           while

4、(1);    }    time_delay=nms;//读取定时时间    while(time_delay);    SysTick->CTRL=0x00;//关闭计数器    SysTick->VAL=0X00;//清空计数器}//延时nusvoiddelay_us(volatileunsignedlongnus){ //SYSTICK分频--1us的系统时钟中断    if(SysTick_Config(SystemFrequency/1000000))    {           while(1);    }    time_delay=nus

5、;//读取定时时间    while(time_delay);    SysTick->CTRL=0x00;//关闭计数器    SysTick->VAL=0X00;//清空计数器}    //在中断中将time_delay递减。实现延时voidSysTick_Handler(void){    if(time_delay)        time_delay--;}b.非中断方式主要仿照原子的《STM32不完全手册》。SYSTICK的时钟固定为HCLK时钟的1/8,在这里我们选用内部时钟源72M,所以SYSTICK的时钟为9M,即SYSTICK定时器以9M

6、的频率递减。SysTick主要包含CTRL、LOAD、VAL、CALIB等4个寄存器,SysTick->CTRL位段名称类型复位值描述16COUNTFLAGR0如果在上次读本寄存器后systick已为0,则该位为1,若 读该位自动清零2CLKSOURCERW00:外部时钟源1:内部时钟1TICKINTRW00:减到0无动作;1:减到0产生systick异常请求0ENABLERW0systick定时器使能位    SysTick->LOAD位段名称类型复位值描述23:0RELOADRW0减到0时被重新装载的值SysTick->VAL位段名称类型复位值描述23:

7、0CURRENTRW0读取时返回当前倒计数的值,写则清零,同时还会清除在systick控制及状态寄存器中的COUNTFLAG标志SysTick->CALIB不常用,在这里我们也用不到,故不介绍了。程序如下,相当于查询法。//仿原子延时,不进入systic中断voiddelay_us(u32nus){ u32temp; SysTick->LOAD=9*nus; SysTick->VAL=0X00;//清空计数器 SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源 do {  temp=SysTick->CTRL;//读取当前倒计数值

8、 }while((temp&0x01)&&(!(te

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。