1. 程式人生 > >STM32硬體除錯過程遇中到Delay_ms()函式卡死的問題

STM32硬體除錯過程遇中到Delay_ms()函式卡死的問題

程式在LCD初始化過程中卡死,通過硬體除錯發現卡在Delay_ms()函式,轉到定義發現其為Delay_us的巨集定義函式:
#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引數需要在系統滴答定時器中斷中遞減,即:
/**@filename stm32f10x_it.c 
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
void SysTick_Handler(void)
{
    TimingDelay_Decrement();
}
函式TimingDelay_Decrement()定義如下:
/*-------------------------------------------------------------------------------
程式名稱:TimingDelay_Decrement
程式描述:數字遞減直到0  
輸入引數:無
返回引數:無
備    注:需要在中斷函式SysTick_Handler()中呼叫
---------------------------------------------------------------------------------*/
void TimingDelay_Decrement(void)
{
    if (TimingDelay != 0x00)
    { 
    TimingDelay--;
    }
}
程式卡死的原因就是中斷函式SysTick_Handler(void)中沒有對TimingDelay進行遞減(沒有呼叫函式TimingDelay_Decrement())從而跳不出死迴圈
另外值得注意的是SysTick使用前必須初始化,以使能中斷:
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);
    }
}
若不使能中斷會導致無法進入定時器中斷函式,也會卡死在while迴圈中。