引言
在移植FreeRTOS到STM32F411CEU6上时,出现了烧录一次后,无法再次烧录的情况。
现象
烧录时报错:
Cannot access Memory (@ 0xe00fffe4, Read, Acc Size: 4 Byte);
弹窗:Connection refused due to device mismatch!
单片机:STM32F411CEU6
烧录器:DAPLink
现象:修改代码后,第一次可以烧录成功,第二次就报错了。
分析
这个情况是由于单片机进入了低功耗模式造成的,DAPLink在低功耗模式下,无法烧录。
我出现这个问题的原因是,在移植FreeRTOS时,在网上找了一个FreeRTOSConfig.h
文件,直接使用了。该文件中,configUSE_TICKLESS_IDLE
设置为1,开启了当只有idle任务时,进入低功耗模式这个选项。导致了系统进入低功耗,DAPLink无法烧录。
解决方案
- 在keil中,点击下载后,等待1秒钟,然后按一下复位按键,即可开始下载,需要把握好时间。或者先按住复位按键不松,点击下载后,等待1秒钟松开复位按键也可以,这个更简单一点。
- 更换烧录器,使用Jlink烧录,我试了JlinkV9可以正常烧录。
- 如果没有Jlink,可以这样设置,使用这个方法将芯片整片擦除。擦除比较慢,可能最后会报失败,但是这时候,程序已经被破坏,不会进入低功耗模式了,也就可以烧录正常的代码了。擦除完后,再设置回
Erase Sectors
。
- 使用STM32CubeProgrammer进行烧录,需要有boot接口引出,有串口或者USB口进行烧录,较为麻烦。
注:永远不要考虑是不是代码写错了,把单片机搞坏了。我还从没遇到过这种情况,大多是调试口被禁用了,单片机休眠了等等,无法烧录情况,使用STM32CubeProgrammer通过更改启动方式来烧录肯定可以。另外,有条件买JlinkV9,什么都能烧,非常稳定,就是贵一点,体积大一点。