STM32精确延时.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
STM32精确延时

STM32精确延时的实现方法 前面用STM32的GPIO模拟液晶驱动时序时遇到一个问题,就是怎样产生一段较为精确的延时。通常产生一小段延时的方法就是利用一个递增或者递减循环进行软件延时。 例: void delay(void) { ? ?? ? int i=0x0ff; ? ?? ? while (i--) ? ?? ?? ?? ???; } 我在使用MPLAB IDE进行PIC单片机的开发时,MPLAB提供了一个Watch(跑表)功能,可以很方便的查看一个函数或一段代码的运行时间,利用这个功能就可以很容易的编写能产生精确延时的代码。而据我目前了解的情况,不管是IAR还是RealView MDK都没有提供类似的功能,这样就不能像上例那样来获得较为精确的延时了。 有人说了,可以用定时器中断的方法来产生精确延时,一点没错,不过在STM32中还可以采用更简单的方法来产生精确延时,那就是利用Cortex系统定时器—SysTick。 在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。SysTick的最大使命,就是定期地产生异常请求,作为系统的时基。 1.jpg (90.05 KB) 2009-1-9 23:04 SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。SysTick是一个24 位的倒数定时器,当计数值减到0 时,将从RELOAD 寄存器中自动重装载定时初值,只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。 用SysTick产生精确延时的方法如下: 1、首先对SysTick进行设置 void SysTick_Configuration(void) { ? ?? ? /* Configure HCLK clock as SysTick clock source */ ? ?? ? SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //系统时钟8分频 ? ?? ? /* SysTick interrupt each 1000 Hz with HCLK equal to 72MHz */ ? ?? ? SysTick_SetReload(9000); //周期1ms ? ?? ? /* Enable the SysTick Interrupt */ ? ?? ? SysTick_ITConfig(ENABLE); //打开中断 } 2、延时函数 void SysTick_Delay(u32 nTime) { ??/* Enable the SysTick Counter */ ??SysTick_CounterCmd(SysTick_Counter_Enable); //允许计数 ??TimingDelay = nTime; while(TimingDelay != 0); /* Disable SysTick Counter */ ??SysTick_CounterCmd(SysTick_Counter_Disable); //禁止计数 ??/* Clear SysTick Counter */ ??SysTick_CounterCmd(SysTick_Counter_Clear); //计数器清0 } 3. 中断函数 void SysTickHandler(void) { ??TimingDelay_Decrement(); } 4. 中断调用函数 void TimingDelay_Decrement(void) { ??if (TimingDelay != 0x00) ??{ ? ? TimingDelay--; ??} } 利用以上几个函数就能产生精确延时了,使用时通过调用SysTick_Delay(u32 nTime)函数来设置延时时间,这里提供一个产生秒延时的程序供大家参考。 2.jpg (56.3 KB) 2009-1-9 23:04 ? ?? ? 附上效果图,大家看完不要忘了“顶一下”啊!

文档评论(0)

yan698698 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档