STM32 HAL库方式的微秒延时函数

STM32CUBEMX系列教程之HAL库方式的微秒延时函数


标准库一般是使用系统嘀嗒定时器来进行微妙级别的延时,而HAL库官方使用SysTick的地方非常多,自己修改代码使用嘀嗒定时器的话就会引起错乱。网上的代码使用定时器进行微秒级别延时(不知道该方式的请自行搜索),总是卡在__HAL_TIM_GET_COUNTER或者出现一些莫名的问题,初步推测是进入定时器中断太过于频繁,所以此时就需要自己实现一个微秒级别延时函数。


1、第一种方式

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

    while (delay != 0)
    {
        temp = delay > 900 ? 900 : delay;
        last = SysTick->VAL;
        curr = last - CPU_FREQUENCY_MHZ * temp;
        if (curr >= 0)
        {
            do
            {
                val = SysTick->VAL;
            }
            while ((val < last) && (val >= curr));
        }
        else
        {
            curr += CPU_FREQUENCY_MHZ * 1000;
            do
            {
                val = SysTick->VAL;
            }
            while ((val <= last) || (val > curr));
        }
        delay -= temp;
    }
}

2、第二种方式

void delay_us(uint32_t us)
{
    uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);
    while (delay--)
	{
		;
	}
}

说明:HAL_RCC_GetHCLKFreq()这个函数获得系统时钟,对于STM32F103RB,系统时钟时72MHZ,也就是返回72000000这个值,该方式是实际测试过程中发现的,微秒级别延时还是比较准的。


STM32 HAL库方式的微秒延时函数_第1张图片


你可能感兴趣的:(STM32)