在开发过程中,经常会出现代码bug,导致各种死机问题,比较多的就是非法地址访问,导致出现硬件错误(HardFault)的中断。
出现这种问题后,使用调试器再次连接,很难连接上cpu,需要使用工具,进行ISP擦除,开发非常不方便。
官方给出来一个解决方案,在main启动函数中,添加如下代码:
void main(void)
{
for (uint32_t i = 0; i < 666666 * 100; ++i) __NOP();
}
此代码的原理,就是在启动阶段,延时一会,在程序跑飞之前,使调试器能够有机会连接上去。
但是,这个代码有一个问题,如果我们使用keil()或者其他编译器)的时候,开了优化(非默认和-O0),此段代码会被编译器优化掉,不会起作用(不会运行,因为编译器发现此代码没有动作)。
要解决这个问题,需要做如下修改,增加关键字volatile ,阻止编译器的优化动作:
void main(void)
{
for ( volatile uint32_t i = 0; i < 666666 * 100; ++i) __NOP();
}
在其他驱动里面也有类似的情况,如果你遇到了问题,可以参考修改。
比如如下代码,都需要对变量i添加volatile 的约束,阻止编译器优化:
void ADC_Calibrate(ADC_TypeDef * ADCx)
{
uint32_t i;
ADCx->CALIB |= (1 << ADC_CALIB_RESET_Pos);
for(i = 0; i < 120 * 20; i++) __NOP(); //2个采样时钟周期
ADCx->CALIB |= (1 << ADC_CALIB_START_Pos);
for(i = 0; i < 120 * 10; i++) __NOP();
ADCx->CALIB &=~(1 << ADC_CALIB_START_Pos);
while(ADCx->CALIB & ADC_CALIB_BUSY_Msk) __NOP();
ADCx->CALIB |= (1 << ADC_CALIB_LOAD_Pos);
}
原创文章,欢迎转载,请注明来源,未经书面允许,请勿用于商业用途。
关注微信公众号:嵌入式开发实战营,了解更多。