您现在的位置: 主页 > MCU > 单片机技术应用 > STM32硬件调试过程遇中到Delay_ms()函数卡死的问题 -
本文所属标签:
为本文创立个标签吧:

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

来源: 网络用户发布,如有版权联系网管删除 2018-09-07 

[导读]
程序在LCD初始化过程中卡死,通过硬件调试发现卡在Delay_ms()函数,转到定义发现其为Delay_us的宏定义函数:#define Delay_ms(x) Delay_us(1000*x)//单位ms 即延迟x单位ms,转到Delay_us()函数定义:vo

程序在LCD初始化过程中卡死,通过硬件调试发现卡在Delay_ms()函数,转到定义发现其为Delay_us的宏定义函数:

本文引用地址: http://www.21ic.com/app/mcu/201806/764660.htm


#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循环中。




              查看评论 回复



嵌入式交流网主页 > MCU > 单片机技术应用 > STM32硬件调试过程遇中到Delay_ms()函数卡死的问题 -
 

"STM32硬件调试过程遇中到Delay_ms()函数卡死的问题 -"的相关文章

网站地图

围观()