问题概要
使用下载器烧录程序到单片机(Cortex-M0),第一次运行正常
- 但重新上电后,运行异常,重新烧录才能正常运行
- 重新烧录后,再次重新上电,运行异常
- 先下载,再重新上电,再keil DEBUG(不重新下载程序),运行正常
详细说明
单片机ADC采集数据,DMA将采样数据搬运到程序缓冲区中。
在DMA的半满中断和全满中断中,使用UART将数据发送到上位机。
(1)正常运行的状态
- 红色为高电平:程序处在DMA半满中断中
- 蓝色为高电平:程序处在DMA全满中断中
- 黄色高低变换:UART在发送数据
这个波形图展示了当程序正常运行时,DMA半满中断和全满中断应该是交替的,串口在中断中发送数据
(2)异常运行:单片机下载后重新上电
从图中可以看出以下几点:
- 每一次完整传输后,DMA都无法进入全满中断,循环往复
- 在第二次半满中断后,看起来像是同时进入了半满和全满中断,串口看起来像是有数据传输
- 出问题的部分,其高电平是3.3V,而非正常的5V
(3)DEBUG过程
- 串口:由于在问题部分,串口有数据发出,故先检查串口。在问题部分,上位机没有接收到串口数据。将中断中的串口用延时代替,问题仍然存在。检查正常部分的数据,数据无误。基本排除是串口的问题。
- DMA中断:第一次下载程序时,DMA中断时序正确,在重新上电时,看起来是同时进入全满和半满中断,有可能是在中断中串口传输时间过长,在这个时间内采集了过多的数据导致同时触发全满和半满中断,故先排查ADC问题。
- ADC:重新根据采样率计算了缓冲区半满和全满的时间,并根据串口的波特率计算了串口的传输时间,确定中断时间足够串口发送。
由于无法定位问题,故采集了从重新上电开始的波形:
发现在上电初期,就有代表着“DMA中断”的引脚电平拉高,与此同时,串口TX引脚也有数据发送
到这里,基本可以定位问题在于发生了周期性的复位
原因总结
又从头到尾过了一遍芯片手册,尤其是复位部分,
发现芯片在上电时自动开启独立看门狗(IWDT),且无法关闭。
在程序中误以为看门狗没有打开,故没有执行请狗操作,
而单片机在DEBUG模式下是默认关闭看门狗的。
当在程序中配置看门狗并执行清狗操作后,问题解决。
总结问题,看门狗导致的复位,但第一次烧录时,猜测单片机处于debug模式,看门狗在debug模式下没有运行
但是,总结一下,为什么一开始没有怀疑是复位的问题呢?
- 在“误以为进入DMA中断”的时间内,串口看起来是有数据发送的,因此误以为没有复位
- 下载程序后,拔掉烧录器,并使用RST引脚硬件复位
程序正常运行而没有复位(此时程序没有清狗)
也就是说硬件复位没有使芯片退出DEBUG模式(猜测)
本次DEBUG仍有如下问题需要定位和解决:
剩余问题(求大佬解答)
- 只是使用下载器下载程序,而没有进入keil的DEBUG模式,为什么单片机还是进入了DEBUG模式,从而导致看门狗没有启动?
- 下载程序后不断电、拔掉调试器并手动RST引脚复位,程序没有执行清狗操作,程序仍能正常运行,为什么还没有退出DEBUG模式?
- 复位后配置了LED引脚,使其输出高低点平,为什么是3.3V而非后面的5V?(推测可能是复位后电压不稳)