STM32-实现us延时

STM32-实现us延时


1.当在cubemx配置时基源SysTick时可以使用以下函数直接进行us延时,当用TIM时以下函数会失效,如果使用freertos使用tim也可以用以下函数

void HAL_Delay_us(uint32_t us)//延时us函数
{//需要cubemx配置时SYS时基源选择SysTick
    __IO uint32_t currentTicks = SysTick->VAL;
  /* Number of ticks per millisecond */
  const uint32_t tickPerMs = SysTick->LOAD + 1;
  /* Number of ticks to count */
  const uint32_t nbTicks = ((us - ((us > 0) ? 1 : 0)) * tickPerMs) / 1000;
  /* Number of elapsed ticks */
  uint32_t elapsedTicks = 0;
  __IO uint32_t oldTicks = currentTicks;
  do {
    currentTicks = SysTick->VAL;
    elapsedTicks += (oldTicks < currentTicks) ? tickPerMs + oldTicks - currentTicks :
                    oldTicks - currentTicks;
    oldTicks = currentTicks;
  } while (nbTicks > elapsedTicks);
}

2.使用额外的定时器单独进行us延时

缺点:需要额外的外设资源
cubemx配置
目标将TIM分频到1Mhz,即1us加一次
stm32f4:
TIM1–168M,我们就168分频,填168-1;
普通定时器,84M,填84-1

在这里插入图片描述
在这里插入图片描述

代码实现


us函数实现
#define US_TIM htim7 //定义需要的定时器 只需要修改这个就可以了,记得包含tim.h就可以了
void HAL_TimDelay_us(uint32_t us)//注意不要超过65535,一般大于10ms用HAL_Delay()函数
{
  __HAL_TIM_SetCounter(&US_TIM,0);//清零
  HAL_TIM_Base_Start(&US_TIM);//开启定时器
  while(__HAL_TIM_GetCounter(&US_TIM)<us){};
  HAL_TIM_Base_Stop(&US_TIM);//关闭定时器
}

同时我们还可以封装一个延时ms的函数,下次可以不用HAL_Delay()了
void HAL_TimDelay_ms(uint32_t ms)
{
	for(uint32_t Delay_Cnt=0;Delay_Cnt<ms;Delay_Cnt++)
	HAL_TimDelay_us(997);//考虑实际代码运行损耗,不写1000,差一点点补上
}

实测延时1ms和延时300ms时误差可以在0.2%内,就算写1000其实误差也很小,无所谓的


最后总的代码汇总如下

void HAL_TimDelay_us(uint32_t us);//延时us函数
void HAL_TimDelay_ms(uint32_t ms);//延时ms函数

#define US_TIM htim7//修改定时器,注意两点,第一需要定时器分频到1M,第二记得包含tim.h,否则找不到htimx

void HAL_TimDelay_us(uint32_t us)//延时us函数
{
  __HAL_TIM_SetCounter(&US_TIM,0);//清零
  HAL_TIM_Base_Start(&US_TIM);//开启定时器
  while(__HAL_TIM_GetCounter(&US_TIM)<us){};
  HAL_TIM_Base_Stop(&US_TIM);//关闭定时器
}
void HAL_TimDelay_ms(uint32_t ms)//延时ms函数
{
	for(uint32_t Delay_Cnt=0;Delay_Cnt<ms;Delay_Cnt++)
	HAL_TimDelay_us(997);//考虑实际代码运行损耗,不写1000,差一点点补上
}
  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值