STM32硬件調(diào)試過(guò)程遇中到Delay_ms()函數(shù)卡死的問題
程序在LCD初始化過(guò)程中卡死,通過(guò)硬件調(diào)試發(fā)現(xiàn)卡在Delay_ms()函數(shù),轉(zhuǎn)到定義發(fā)現(xiàn)其為Delay_us的宏定義函數(shù):
#define Delay_ms(x) Delay_us(1000*x)//單位ms
即延遲x單位ms,轉(zhuǎn)到Delay_us()函數(shù)定義:
void Delay_us(__IO u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
可以發(fā)現(xiàn)若參數(shù)TimingDelay不為零則此處為while死循環(huán),通過(guò)研究發(fā)現(xiàn)TimingDelay參數(shù)需要在系統(tǒng)滴答定時(shí)器中斷中遞減,即:
/**@filename stm32f10x_it.c
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}
函數(shù)TimingDelay_Decrement()定義如下:
/*-------------------------------------------------------------------------------
程序名稱:TimingDelay_Decrement
程序描述:數(shù)字遞減直到0
輸入?yún)?shù):無(wú)
返回參數(shù):無(wú)
備 注:需要在中斷函數(shù)SysTick_Handler()中調(diào)用
---------------------------------------------------------------------------------*/
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
程序卡死的原因就是中斷函數(shù)SysTick_Handler(void)中沒有對(duì)TimingDelay進(jìn)行遞減(沒有調(diào)用函數(shù)TimingDelay_Decrement())從而跳不出死循環(huán)。
另外值得注意的是SysTick使用前必須初始化,以使能中斷:
void SysTick_Init(void)
{
// SystemFrequency / 1000 1ms中斷一次
// SystemFrequency / 100000 10us中斷一次
// SystemFrequency / 1000000 1us中斷一次
if (SysTick_Config(SystemCoreClock / 1000000)) // 1us ST3.5.0庫(kù)版本
{
/* Capture error */
while (1);
}
}
若不使能中斷會(huì)導(dǎo)致無(wú)法進(jìn)入定時(shí)器中斷函數(shù),也會(huì)卡死在while循環(huán)中。