BUG分享|报错:Cannot access Memory (@ 0xe00fffe4, Read, Acc Size: 4 Byte);移植FreeRTOS后无法烧录;DAPLink无法烧录;低功耗无法烧录;

发布时间 2023-12-29 15:22:25作者: 起振电容

引言

在移植FreeRTOS到STM32F411CEU6上时,出现了烧录一次后,无法再次烧录的情况。

现象

烧录时报错:

Cannot access Memory (@ 0xe00fffe4, Read, Acc Size: 4 Byte);

弹窗:Connection refused due to device mismatch!
image
单片机:STM32F411CEU6
烧录器:DAPLink
现象:修改代码后,第一次可以烧录成功,第二次就报错了。

分析

这个情况是由于单片机进入了低功耗模式造成的,DAPLink在低功耗模式下,无法烧录。
我出现这个问题的原因是,在移植FreeRTOS时,在网上找了一个FreeRTOSConfig.h文件,直接使用了。该文件中,configUSE_TICKLESS_IDLE设置为1,开启了当只有idle任务时,进入低功耗模式这个选项。导致了系统进入低功耗,DAPLink无法烧录。

解决方案

  1. 在keil中,点击下载后,等待1秒钟,然后按一下复位按键,即可开始下载,需要把握好时间。或者先按住复位按键不松,点击下载后,等待1秒钟松开复位按键也可以,这个更简单一点。
  2. 更换烧录器,使用Jlink烧录,我试了JlinkV9可以正常烧录。
  3. 如果没有Jlink,可以这样设置,使用这个方法将芯片整片擦除。擦除比较慢,可能最后会报失败,但是这时候,程序已经被破坏,不会进入低功耗模式了,也就可以烧录正常的代码了。擦除完后,再设置回Erase Sectors
    image
  4. 使用STM32CubeProgrammer进行烧录,需要有boot接口引出,有串口或者USB口进行烧录,较为麻烦。
    注:永远不要考虑是不是代码写错了,把单片机搞坏了。我还从没遇到过这种情况,大多是调试口被禁用了,单片机休眠了等等,无法烧录情况,使用STM32CubeProgrammer通过更改启动方式来烧录肯定可以。另外,有条件买JlinkV9,什么都能烧,非常稳定,就是贵一点,体积大一点。