×
单片机 > 单片机程序设计 > 详情

STM32硬件调试过程遇中到Delay_ms()函数卡死的问题

发布时间:2020-08-31 发布时间:
|

程序在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循环中。




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义