历史上的今天
今天是:2025年04月23日(星期三)
2018年04月23日 | STM32硬件调试过程遇中到Delay_ms()函数卡死的问题
2018-04-23 来源:eefocus
程序在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循环中。
史海拾趣
|
请各位高手指教,下面的电路能不能成立,不能成立的原因是什么? 电路是我自己画的,个人分析如下,有不对的地方希望大家指正:谢谢~ 1》通电,12V经R1到Q1的C极,经R2加至Q1的B极,Q1饱和导通,C极等于0 此时Q2,Q3,Q4的B极全部为0 Q2为PNP管,此时是导通状态,但对电路没影响 2》按S1, ...… 查看全部问答> |
|
高手相救啊,关于QuartusII 的Verilog正弦波波形仿真问题 刚接触Verilog时间不长,想弄个正弦波。其中rom用于存储波形数据,addr产生地址数据寻址。但是一直得不到想要的结果?不管是仿真还是用signaltapII,发现地址和数据时钟对不上,差两个时钟节拍,不知道是为什么?另外,quartusii仿真 ...… 查看全部问答> |
|
现在系统一起来就占用了20M左右内存,想问下.net compact framework3.5和2.0在内存占用方面大吗? 我这边用的是3.5,基本没有用到3.5特性,想换成2.0,是否在这方面会有改善? 还是说有其他方面可以看下节省的地方?… 查看全部问答> |
|
请教各位高手: WINCE启动内核的方式有:bootloader(vivi)和eboot(bsp自带) 现在我想从WINCE42升级到wince50 可是boot这还不了解 请问: 1、bootloader(vivi方式)的跟BSP中自带的eboot有关系吗?也就是说我如果拿开发板的 ...… 查看全部问答> |
|
wince在编译的过程中,只看到了生成了许多LIB文件,比如netui.lib,但最后他是怎样将这些LIB文件又生成DLL文件的呢?比如netui.dll。… 查看全部问答> |
|
从ADC得到的浮点数,想从串口输到电脑上看一下呢? PIC单片机和51差不多,不是一个字节一个字节的发送,可是我怎样在电脑上直接显示出浮点数呢?… 查看全部问答> |




