欢迎来到天天文库
浏览记录
ID:34418618
大小:31.49 KB
页数:3页
时间:2019-03-06
《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
此文档下载收益归作者所有