你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32时间延时的代码优化和讨论

[复制链接]
caizhiwei 发布时间:2015-1-21 10:28
本帖最后由 caizhiwei 于 2015-1-21 10:34 编辑

原帖在【经验分享】STM32中实用的精确延时方法https://www.stmcu.org.cn/module/foru ... 8792&fromuid=182176
(出处: 意法半导体STM32/STM8技术社区)
在此表示感谢!

1.把寄存器操作改为位与,位或操作,更规范;
2.把毫秒延时改为直接延时,而不是用for循环,更精准。
3.增加初始化函数,修改时钟系数更方便;

楼主使用的是clk,我使用的是8分屏,其实效果都是一样的哦~~

  1. #include "delay.h"

  2. static u8 fac_us;//us延时倍乘数
  3. static u32 fac_ms;//ms延时倍乘数

  4. /*******************************************************************************
  5. * Function Name  :Delay_Init
  6. * Description    : SYSTICK的时钟固定为HCLK时钟的1/8
  7. * Input          : SYSCLK:系统主频时钟(SYSCLK Mhz)
  8. * Return         : None
  9. *******************************************************************************/
  10. void Delay_Init(u8 SYSCLK)
  11. {
  12.     SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);// select HCLK/8 as systick clock source.
  13.     fac_us=SYSCLK/8;         //9            
  14.     fac_ms=(u32)fac_us*1000;
  15. }

  16. /*******************************************************************************
  17. * Function Name  :delay_ms
  18. * Description    : SysTick计数值最大为24位,最大值为16777215,如果fac_us=9000,
  19. 那么nms的最大值为1864(1864ms)
  20. * Input          : nus,注意nms的范围 nms<=1864
  21. *******************************************************************************/
  22. void delay_ms(u16 nms)
  23. {                                                
  24.     SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)        
  25.     SysTick->VAL   = 0;
  26.     SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ;   //Enable Systick Function and start counting           
  27.     while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));   //等待计数到0
  28.     SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;              //关闭计数器                 
  29. }


  30. /*******************************************************************************
  31. * Function Name  :delay_us
  32. * Description    : SysTick计数值最大为24位,最大值为16777215,如果fac_us=72那么nus
  33. 的最大值为233016,如果fac_us=9那么nus的最大值为1864128(1864ms)
  34. * Input          : nus
  35. * Return         : None
  36. *******************************************************************************/
  37. void delay_us(u32 nus)
  38. {                          
  39.     SysTick->LOAD=nus*fac_us;     //时间加载        
  40.     SysTick->VAL   = 0;
  41.     SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ;   //Enable Systick Function and start counting           
  42.     while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));   //等待计数到0
  43.     SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;              //关闭计数器   
  44. }
复制代码




收藏 1 评论6 发布时间:2015-1-21 10:28

举报

6个回答
沐紫 回答时间:2015-1-21 10:33:16
支持,一起讨论一起进步
caizhiwei 回答时间:2015-1-21 10:35:04
呵呵,有些东西看似简单,这是折腾一下,搞个明白才行
caizhiwei 回答时间:2015-1-21 10:37:00
本帖最后由 caizhiwei 于 2015-1-21 10:38 编辑

72M分频验证OK
IMG_20150120_145806.jpg
hanmcustm 回答时间:2015-1-21 10:47:52
楼主可以整理出txt文件附在上面直接下载,
key123-329220 回答时间:2015-1-21 11:16:52
学习一哈
feel-376797 回答时间:2015-2-23 09:55:27
谢谢分享

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版