STM32的几种延时方法.docx

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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_ms void 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; //清空计数器 } //延时nus void 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)

tangtianxu1 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档