烟花绽放 发表于 2016-5-10 10:30:08

使用STM32CUBE生成STM32L073的工程,如何实现us级延时?

HAL库里面有ms级的延时__weak void HAL_Delay(__IO uint32_t Delay)
{
uint32_t tickstart = 0;
tickstart = HAL_GetTick();
while((HAL_GetTick() - tickstart) < Delay)
{
}
},
但是如何实现us级的延时呢?
昨天尝试着修改了
__weak HAL_StatusTypeDef HAL_Delay_us(uint32_t TickPriority)
{
/*Configure the SysTick to have interrupt in 1ms time basis*/
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

/*Configure the SysTick IRQ priority */
HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority ,0);

   /* Return function status */
return HAL_OK;
}

没有实现要求,而且还出现了其他问题,程序不运行,所以想请教一下大家,如何在HAL库中实现us延时?
目前在做DHT11的程序

whtt 发表于 2016-5-10 10:48:11

HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
这个函数是设置重载寄存器值得,为1ms,如果想设置1us要改为HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000000);
因为STM32F073最大32M时钟,函数调用等等操作有可能超过32个时钟,所以用中断函数实现1us延时是有难度的。根据需要可以试试10us或者更大时间的延时

烟花绽放 发表于 2016-5-10 10:56:46

HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000000);
修改成这个样子,昨天试过了,程序下载下去之后直接不运行了,不晓得什么原因

风子 发表于 2016-5-10 12:09:03

函数库里写明了HAL_Delay会用于HAL库本身配置过程中的很多地方,不能随便改,,可以用另外一个定时器实现

中山无雪 发表于 2016-5-10 12:41:29

还是使用定时器实现吧,那样更好操作些

烟花绽放 发表于 2016-5-10 12:42:17

中山无雪 发表于 2016-5-10 12:41
还是使用定时器实现吧,那样更好操作些

好的,,我去试一下

烟花绽放 发表于 2016-5-10 12:42:33

风子 发表于 2016-5-10 12:09
函数库里写明了HAL_Delay会用于HAL库本身配置过程中的很多地方,不能随便改,,可以用另外一个定时器实现 ...

嗯嗯嗯,我去试一下

huaiqiao 发表于 2016-5-10 13:09:08

HAL_Delay 这个函数里面有说明的,它就是毫秒级的延时呀。

ifif 发表于 2016-5-10 14:49:17

用systick写个定时,可以到1us,挺准的

烟花绽放 发表于 2016-5-10 16:33:21

试了,,但是也是不行,今天晚上回去写个像用51时的延时函数,不行的话就开个定时器
页: [1] 2 3
查看完整版本: 使用STM32CUBE生成STM32L073的工程,如何实现us级延时?