STM32硬體除錯過程遇中到Delay_ms()函式卡死的問題
阿新 • • 發佈:2019-01-08
程式在LCD初始化過程中卡死,通過硬體除錯發現卡在Delay_ms()函式,轉到定義發現其為Delay_us的巨集定義函式:
另外值得注意的是SysTick使用前必須初始化,以使能中斷:
#define Delay_ms(x) Delay_us(1000*x)//單位ms
即延遲x單位ms,轉到Delay_us()函式定義:
void Delay_us(__IO u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
可以發現若引數TimingDelay不為零則此處為while死迴圈,通過研究發現TimingDelay引數需要在系統滴答定時器中斷中遞減,即:
函式TimingDelay_Decrement()定義如下:/**@filename stm32f10x_it.c * @brief This function handles SysTick Handler. * @param None * @retval None */ void SysTick_Handler(void) { TimingDelay_Decrement(); }
程式卡死的原因就是中斷函式SysTick_Handler(void)中沒有對TimingDelay進行遞減(沒有呼叫函式TimingDelay_Decrement())從而跳不出死迴圈。/*------------------------------------------------------------------------------- 程式名稱:TimingDelay_Decrement 程式描述:數字遞減直到0 輸入引數:無 返回引數:無 備 注:需要在中斷函式SysTick_Handler()中呼叫 ---------------------------------------------------------------------------------*/ void TimingDelay_Decrement(void) { if (TimingDelay != 0x00) { TimingDelay--; } }
另外值得注意的是SysTick使用前必須初始化,以使能中斷:
若不使能中斷會導致無法進入定時器中斷函式,也會卡死在while迴圈中。void SysTick_Init(void) { // SystemFrequency / 1000 1ms中斷一次 // SystemFrequency / 100000 10us中斷一次 // SystemFrequency / 1000000 1us中斷一次 if (SysTick_Config(SystemCoreClock / 1000000)) // 1us ST3.5.0庫版本 { /* Capture error */ while (1); } }