STM32硬件调试过程遇中到Delay_ms()函数卡死的问题
2016-08-30 20:14
344 查看
程序在LCD初始化过程中卡死,通过硬件调试发现卡在Delay_ms()函数,转到定义发现其为Delay_us的宏定义函数:
即延迟x单位ms,转到Delay_us()函数定义:
可以发现若参数TimingDelay不为零则此处为while死循环,通过研究发现TimingDelay参数需要在系统滴答定时器中断中递减,即:
函数TimingDelay_Decrement()定义如下:
程序卡死的原因就是中断函数SysTick_Handler(void)中没有对TimingDelay进行递减(没有调用函数TimingDelay_Decrement())从而跳不出死循环。
另外值得注意的是SysTick使用前必须初始化,以使能中断:
#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调试过程中如何判断是程序问题还是硬件问题?
- 找出一个断开的电阻的硬件调试问题思维过程
- STM32的串口函数_库函数USART_SendData问题和解决方法--硬件复位导致第一个字节丢失
- STM32 学习过程中 printf 函数 突然不能执行的简单提示问题
- 调试STM32过程中遇到的问题总结(持续更新)--KEIL4+C语言
- STM32调试过程中遇到BIN文件生成问题记录
- 解决ST-LINK进行硬件调试时,进不了main()函数的问题
- STM32调试过程中常见的问题及解决方法
- STM32调试过程中常见的问题及解决方法
- 几个在MS SQL Server处理IP的函数/存储过程
- PL/SQL Developer中,存储过程无法调试的问题解决办法
- 我调试mini2440 qq2440 过程中遇到的问题和解决方法
- “VS2003调试时无法跟踪函数”问题解决方法
- PL/SQL Developer中,存储过程无法调试的问题解决办法
- Oracle 存储过程中调用自定义的函数问题?
- 运用ORACLE的OO4O类库函数解决调用存储过程向远程数据库上传超过32K图片失败的问题
- EVC编程与调试过程出现的问题
- 使用qsort对二维字符数组排序疑难问题调试及解决过程
- 综合应用WPF/WCF/WF/LINQ之二十二:关于单步调试存储过程的问题
- 两个问题的调试过程