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

【经验分享】STM32 HAL库方式的微秒延时函数

[复制链接]
STMCU小助手 发布时间:2022-4-12 10:00
方式一:系统滴答定时器
优点:全系列通用,只需要将宏定义CPU_FREQUENCY_MHZ根据时钟主频修改即可。
缺点:系统滴答定时器是HAL库初始化的,且必须有HAL库初始化。

  1. #define CPU_FREQUENCY_MHZ    72                // STM32时钟主频
  2. void delay_us(__IO uint32_t delay)
  3. {
  4.     int last, curr, val;
  5.     int temp;

  6.     while (delay != 0)
  7.     {
  8.         temp = delay > 900 ? 900 : delay;
  9.         last = SysTick->VAL;
  10.         curr = last - CPU_FREQUENCY_MHZ * temp;
  11.         if (curr >= 0)
  12.         {
  13.             do
  14.             {
  15.                 val = SysTick->VAL;
  16.             }
  17.             while ((val < last) && (val >= curr));
  18.         }
  19.         else
  20.         {
  21.             curr += CPU_FREQUENCY_MHZ * 1000;
  22.             do
  23.             {
  24.                 val = SysTick->VAL;
  25.             }
  26.             while ((val <= last) || (val > curr));
  27.         }
  28.         delay -= temp;
  29.     }
  30. }
复制代码

方式二:简单延时
优点: 实现简单,如果是F1系列,HAL_RCC_GetHCLKFreq()获取的值是72000000,此方式经过测试还是比较准的,如果不考虑通用性,F1系列建议使用此种方式。

缺点: 只适用F1系列72M主频。

  1. void delay_us(uint32_t us)
  2. {
  3.     uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);
  4.     while (delay--)
  5.         {
  6.                 ;
  7.         }
  8. }
复制代码

方式三:普通定时器
优点: STM32全系列通用
缺点: 占用一个定时器

该方法的思路是将定时器设置为1MHZ的计数频率,定时器计一个数就是1us,实现如下:

【F1系列】

%L%G)]9QOR1X7IQIE{OM`~M.png

  1. #define DLY_TIM_Handle (&htim4)
  2. void delay_us(uint16_t nus)
  3. {
  4.         __HAL_TIM_SET_COUNTER(DLY_TIM_Handle, 0);
  5.         __HAL_TIM_ENABLE(DLY_TIM_Handle);
  6.         while (__HAL_TIM_GET_COUNTER(DLY_TIM_Handle) < nus)
  7.         {
  8.         }
  9.         __HAL_TIM_DISABLE(DLY_TIM_Handle);
  10. }
复制代码


【F4系列】

I)N2)$M1~9IP_AZ46S0513O.png

  1. #define DLY_TIM_Handle  (&htim7)

  2. void delay_us(uint16_t nus)
  3. {
  4.         __HAL_TIM_SET_COUNTER(DLY_TIM_Handle, 0);
  5.         __HAL_TIM_ENABLE(DLY_TIM_Handle);
  6.         while (__HAL_TIM_GET_COUNTER(DLY_TIM_Handle) < nus)
  7.         {
  8.         }
  9.         __HAL_TIM_DISABLE(DLY_TIM_Handle);
  10. }
复制代码


收藏 评论0 发布时间:2022-4-12 10:00

举报

0个回答

所属标签

相似分享

官网相关资源

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