STM32 HALライブラリ遅延関数HAL_Delay分析

HALライブラリは遅延関数を提供しますが、ミリ秒レベルの単純な遅延のみを実装でき、米国レベルの遅延は実装できません。
以下に、HALライブラリの実装遅延に関連する関数を示します。最初は関数構成関数です。

//调用 HAL_SYSTICK_Config 函数配置每隔 1ms 中断一次
__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
/* 配置系统在 1ms 的时间基础上有中断*/
if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U)
{
return HAL_ERROR;
}
/* 配置 SysTick IRQ 优先级*/
if (TickPriority < (1UL << __NVIC_PRIO_BITS))
{
HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);
uwTickPrio = TickPriority;
}
else
{
return HAL_ERROR;
}
return HAL_OK;
}
//HAL 库的 SYSTICK 配置函数:文件 stm32f1xx_hal_context.c 中定义
uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb)
{
return SysTick_Config(TicksNumb);
}
//内核的 Systick 配置函数,配置每隔 ticks 个 systick 周期中断一次
//文件 core_cm3.h 中
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
...//此处省略函数定义
}

上記の3つの関数は、実際にはHALによって呼び出されるメインのHAL_InitTick関数に対して開かれており、この関数はHALライブラリ初期化関数HAL_Initで呼び出されます。
この関数は、SysTick_Config関数を間接的に呼び出して1ミリ秒ごとに割り込み、停止しないようにSystickタイマーを構成します。
次に、遅延のロジック制御コードを見てみましょう。

//Systick 中断服务函数
void SysTick_Handler(void)
{
HAL_IncTick();
}
//下面代码均在文件 stm32l0xx_hal.c 中
static __IO uint32_t uwTick; //定义计数全局变量
__weak void HAL_IncTick(void)
{
uwTick += uwTickFreq;
}
__weak uint32_t HAL_GetTick(void) //获取全局变量 uwTick 的值
{
return uwTick;
}
//开放的 HAL 延时函数,延时 Delay 毫秒
__weak void HAL_Delay(__IO uint32_t Delay)
{
uint32_t tickstart = HAL_GetTick();
uint32_t wait = Delay;
if (wait < HAL_MAX_DELAY)
{
wait += (uint32_t)(uwTickFreq);
}
while ((HAL_GetTick() - tickstart) < wait)
{
}
}

HALライブラリでの遅延関数の実装は非常に簡単です。最初に、32ビットのグローバル変数uwTickが定義されています。Systick割り込みサービス関数SysTick_Handlerでは、uwTick値はHAL_IncTickを呼び出すことで継続的に増加します。つまり、1msごとに1ずつ増加します。
HAL_Delay関数は、関数に入った後、最初に現在のuwTick値を記録し、次にループで現在のuwTick値を継続的に読み取り、減算演算を実行します。結果はミリ秒単位の遅延です。ロジック全体は非常に単純で非常に明確です。

元の記事7件を公開 賞賛された7件 訪問56件

おすすめ

転載: blog.csdn.net/a1347563271/article/details/105474024