- 1、本文档共4页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
STM32的几种延时方法.docx
STM32的几种延时方法(基于MDK固件库3.0,晶振8M)
单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us( )和毫秒级delay_ms( )。
1.普通延时法
这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,不过要做的比较精准还是要下一番功夫。下面的代码是在网上搜到的,经测试延时比较精准。
//粗延时函数,微秒void delay_us(u16 time){???????u16 i=0;?????while(time--)???{??????i=10;??//自己定义??????while(i--) ;???????}}//毫秒级的延时void delay_ms(u16 time){???????u16 i=0;?????while(time--)???{??????i=12000;??//自己定义??????while(i--) ;???????}}
2.SysTick 定时器延时
CM3 内核的处理器,内部包含了一个SysTick 定时器,SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。SysTick 在STM32 的参考手册里面介绍的很简单,其详细介绍,请参阅《Cortex-M3 权威指南》。
?这里面也有两种方式实现:
a.中断方式
?如下,定义延时时间time_delay,SysTick_Config()定义中断时间段,在中断中递减time_delay,从而实现延时。volatile unsigned long time_delay; // 延时时间,注意定义为全局变量//延时n_msvoid delay_ms(volatile unsigned long nms){????//SYSTICK分频--1ms的系统时钟中断????if (SysTick_Config(SystemFrequency/1000))????{???????????while (1);????}????time_delay=nms;//读取定时时间????while(time_delay);????SysTick-CTRL=0x00; //关闭计数器????SysTick-VAL =0X00; //清空计数器}//延时nusvoid delay_us(volatile unsigned long nus){?//SYSTICK分频--1us的系统时钟中断????if (SysTick_Config(SystemFrequency/1000000))????{???????????while (1);????}????time_delay=nus;//读取定时时间????while(time_delay);????SysTick-CTRL=0x00; //关闭计数器????SysTick-VAL =0X00; //清空计数器}
????//在中断中将time_delay递减。实现延时
void SysTick_Handler(void){????if(time_delay)????????time_delay--;}
b.非中断方式
主要仿照原子的《STM32不完全手册》。SYSTICK 的时钟固定为HCLK 时钟的1/8,在这里我们选用内部时钟源72M,所以SYSTICK的时钟为9M,即SYSTICK定时器以9M的频率递减。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:0CURRENTRW0读取时返回当前倒计数的值,写则清零,同时还会清除在systick控制及状态寄存器中的COUNTFLAG 标志SysTick- CALIB 不常用,在这里我们也用不到,故不介绍了。
程序如下,相当于查询法。
//仿原子延时,不进入systic中断void
文档评论(0)