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

【经验分享】stm32F1 us延时函数

[复制链接]
STMCU小助手 发布时间:2021-11-28 22:00
2us延时
  1. void sys_udelay(uint32_t us)
  2. {
  3.         volatile int i;
  4.         uint32_t cnt;

  5.         cnt = SystemCoreClock / 1000000;
  6.         cnt = (cnt > 0) ? (cnt) : (1);
  7.         cnt = us / 1000 / cnt / 4;
  8.         for (i = 0; i < cnt; ++i)
  9.                 __NOP();
  10. }
复制代码

us延时
1.滴答定时器 us延时, 1us为3us左右
如果使用滴答定时器做系统循环,不能使用这个

  1. void delay_us(uint32_t nus)
  2. {
  3.         int32_t temp;
  4.         SysTick->LOAD = 9 * nus;
  5.         SysTick->VAL = 0X00;//清空计数器
  6.         SysTick->CTRL = 0X01;//使能,减到零是无动作,采用外部时钟源
  7.         do
  8.         {
  9.                 temp = SysTick->CTRL;//读取当前倒计数值
  10.         }
  11.         while((temp&0x01) && (!(temp&(1<<16))));//等待时间到达

  12.         SysTick->CTRL = 0x00; //关闭计数器
  13.         SysTick->VAL = 0X00; //清空计数器
  14. }
复制代码

2.定时器us延时
  1.             //也没有想象中的精准,在10us一下也有误差
  2.              uint16_t differ = 0xffff-nus-5;                        //设定定时器计数器起始值
  3.                     __HAL_TIM_SET_COUNTER(&htim1, differ);
  4.                     HAL_TIM_Base_Start(&htim1);                                        //启动定时器
  5.                     while(differ < 0xffff - 5) //补偿,判断
  6.                     {
  7.                             differ = __HAL_TIM_GET_COUNTER(&htim1);         //查询计数器的计数值
  8.                     }
  9.                     HAL_TIM_Base_Stop(&htim1);
复制代码

3.for循环实现延时us
  1. /*
  2.         for循环实现延时us
  3.         */
  4.          uint32_t delay = nus * 72/12;
  5.          do
  6.          {
  7.           __NOP();
  8.          }
  9.          while (delay --);
复制代码


收藏 评论0 发布时间:2021-11-28 22:00

举报

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