您的位置:首页 > 其它

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

2016-08-30 20:14 344 查看
程序在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循环中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stm32 定时器中断