在调试单片机时,遇到用到MCU内部的自带硬件时,很可能会遇到这种问题(如果代码是自己写的话,可能性更大):所写的代码单步调试没有问题,可以实现功能,但是如果一步烧写的话,(通常为F5),则不能实现预期的功能。
我在调试TI的MSP430芯片和ATMEL的AVR芯片时,遇到串口通信或I2C总线的通信,需要用到MCU自带的USART硬件,当进行多个数据的读写时,都遇到这种情况。参照官方的参考代码,似乎没有错误,可是就是不能实现功能。
起初以为是调试器和IDE的问题,经过分析,原来是代码的问题。
MCU的主频一般都是MHz级的,而I2C和串口通信最快也就是kHz级,例如要发送两个数据时,单片机让总线发送数据后立即执行后续指令,但是由于总线速度较慢,并没有完成数据的传输就被CPU执行后续操作,必然会达不到预期的功能。
解决的方法可以在数据操作之间增加适当的延迟函数,即可解决问题。通过增加延时函数,我的代码都可以一步烧写并实现功能了。