最近在调试STM32F103RBT6时,发现只要一打开AD就会反复复位,将断点设置到启动代码处,发现复位是非常有规律的,总是执行过断点后就又回到断点了。
找原理,查硬件,一切均没有问题。
最后怀疑到代码上来,因为AD采样是另外一个产品中正常使用移植过来的,分为三大部分:对AD涉及到的外设和存储等的初始化,对AD的采集与存储(主要是中断),对AD的数据进行计算分析。
将三大模块全部注释后再逐一开放,发现是对AD的初始化会导致复位。
对AD的初始化代码再全部注释后逐一开放,发现是启动定时器TIM4的代码会导致复位。
后来将与定时器有关的代码全部审查了一遍,也没有发现问题,同样的相似代码在TIM1上工作的很好。
查网上的相似问题,也没有改善这个结果。
这个问题弄了两天无结果,只能暂时搁置下来调试其它模块。
后来在调试其它函数的过程中,忽然想到原来的AD代码是用于103VET6的,移植到103RBT6上会不会是平台本身的特性导致的问题呢。仔细想了一下,AD中的C语言是平台无关的呀,那与平台有关的只有仿真器设置和启动文件了。
查看仿真器设置,均是103RBT6的正确设置,再查启动文件,哈,原来是把原来的startup_stm32f10x_hd.s错误地引用到这个工程中来了,感觉是因为启动文件中对各中断向量定义的不一致导致系统复位的,更换为正确的startup_stm32f10x_md.s文件后,再把原AD文件恢复为原版本,编译后启动调试过程,完美运行。
困扰了三天的问题解决了,怎一个爽字了得!