有两块板子,一个烧录程序后工作正常,LED在闪烁。另一个烧录后像是不工作的样子,LED灭的。拿示波器观察I2C,发现有高低电平输出。修改代码,在I2C初始化前将LED点亮,灯保持常亮状态。然后一步步定位,发现程序运行时遇到delay_ms()就卡死了。奇怪的是,两个板子烧写一样的程序,一个工作另一个不工作。
上网查了一下,说是延时的时候遇到滴答程序不递减,进入了死循环。但是,看我的延时函数,并没有使用滴答时钟。
- void delay_us(uint16_t Time)
- {
- uint8_t i;
- while(Time –) for(i = 0; i < 8; i ++);
- }
- void delay_ms(uint16_t Time)
- {
- while(Time –) delay_us(1000);
- }
所以上诉方法不成立。不过可以考虑修改我的延时函数了,比较那种看起来延时比较准。
仔细检查了初始化函数,发现有这么一条指令:
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0010000);
这是在线升级的时候用于进行内存重定向的。我现在测试用的是应用程序,起始地址偏移了0x10000。测试的时候,我只把编译环境中的偏移地址改回 0x80000000,忘了改代码中的了。把这句屏蔽掉,再编译烧写,两块板子都能正常工作了。