在HAL库中的微妙级别的延迟怎么弄

需要一个微秒级别的函数,但HAL库中提供的是毫秒级别的延迟函数

已邀请:

二楼

赞同来自:

有谁做过吗


烟花绽放

赞同来自:

我是做的纯延时,一个for循环

gt

赞同来自: 锋之武魂 cdh153

修改分频

HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000000);


HAL_Delay(1);就是1us

这厢有你了

赞同来自:

用定时器中断啊

wansaiyon

赞同来自:

1楼正解

浮生一城

赞同来自: 一线彩虹

一年的老问题了啊,我有一个小方案,代码如下

static uint8_t fac_us = 0;
/**
 * @brief Delay on us level
 * @func void BSP_Delay_us()
 * @param uint32_t nus
 * @return  None
 * @note nus <= 798915us(2^24/fac_us @fac_us=21)
**/
void BSP_Delay_us(uint32_t nus)
{
uint32_t temp;
//Get System Clock Frequency(in MHz)
fac_us = HAL_RCC_GetSysClockFreq() / 1000000 / 8;
SysTick->LOAD = nus*fac_us;     
SysTick->VAL = 0x00;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;   
do
{
temp = SysTick->CTRL;
}while((temp&0x01) && !(temp&(1<<16)));   
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL = 0X00;     
}

是一楼思想的重新实现,但是不知精确度如何

KIC,锡膏测厚仪

赞同来自:

刚好用到,今天我来测试下精度如何

wuhan大飞

赞同来自:

我的法子,打开TIM,设置分频系数,使分频后成为1Mhz. 

比如: TIM3用的APB1,如果APB1是72Mhz, 分频系数设为71就好了。

然后写函数:

void delay_us(int count)
{
 int i=0;
 HAL_TIM_Base_Start(&htim3);
 __HAL_TIM_SetCounter(&htim3,0);
 while(i<=count)
 {
  i=__HAL_TIM_GetCounter(&htim3);
 }
 HAL_TIM_Base_Stop(&htim3);
}



这个法子还有缺陷,TIM的计数值得设大一点,比如65535,这样每次delay也只能最大延时65535us

要回复问题请先登录注册