[TOC]

以下报错发生在使用 keil 时


1. cannot access memory

2. Flash Download failed

以上两个错误是我同时遇到的,该错误发生的具体情况:

在一开始时,单片机是能够正常烧录的,之后修改代码,重新烧录过程中,可能是 JLink 接线松动或 JLink 供电不稳定,导致烧录失败,继续烧录,会出现重新更新 JLink 固件的情况,在有一次更新固件之后,再进行烧录,就持续报出以上两个错误。

该问题经过搜索,可能与两个因素有关:1.烧录速率,2.烧录时复位。

在我将 SWD 烧写频率降至 200K,并在烧录时手动按复位键后,烧录成功。

3.Can not attach to CPU

JLink info:

1
2
3
4
* JLink Info: InitTarget() start
* JLink Info: Can not attach to CPU. Trying connect under reset.
* JLink Info: Connecting to CPU via connect under reset failed.
* JLink Info: InitTarget() end

第一种可能:jtag 或 swd 口被复用了,烧录时就需要复位芯片以使引脚回到复位后功能,即重新回到 jtag 或 swd 功能,如果板子烧录口上有RST,则按照提示设置复位后连接即可,如果没有则在点击烧录按钮前按下板子复位键,出现烧录进度条后松开

第二种可能:板子上只有 swd 烧录口,设置 Debug 选项时没选择 swd。此情况是我在删除了 .uvoptx 文件后发生,删除该文件后 Debug 配置被还原成默认 jtag 烧录方式了

第三种可能:原因还未知,但换了一个工具可以成功烧录,怀疑是原工具也有问题(但工具之后又能正常使用)

4.调试退出时卡死

根据网上的说法,在中文路径下,退出调试时,只要工程有断点,必定卡死,如果退出调试时清除所有断点,即使工程路径存在中文,也不会卡死。

英文路径下卡死可能跟之前存在的配置文件有关。

解决方法:

  1. 工程路径不要有任何中文
  2. 如果执行完步骤1还是卡死:则将工程目录下的 Project.uvoptx 文件删除,然后重新编译整个工程。Keil会自动生成一份新的.uvoptx文件的。

删除 .uvoptx 后的其它影响:

  1. 注意重新编译后需要重新配置 Debug
  2. 调试时变量不实时变化,需要勾选 View->Periodic Window Update

5.STM32F103C8T6移植FreeRTOS内存不足的问题

错误信息:

1
2
3
4
5
6
7
8
9
linking...
.\output\MB_CODE.axf: Error: L6406E: No space in execution regions with .ANY selector matching heap_4.o(.bss).
.\output\MB_CODE.axf: Error: L6406E: No space in execution regions with .ANY selector matching can.o(.bss).
.\output\MB_CODE.axf: Error: L6406E: No space in execution regions with .ANY selector matching startup_stm32f10x_md.o(STACK).
...
...
.\output\MB_CODE.axf: Error: L6407E: Sections of aggregate size 0x9f04 bytes could not fit into .ANY selector(s).
Not enough information to list image symbols.
Not enough information to list load addresses in the image map.

芯片官网的架构图上是 SRAM 是 10Kb,按照芯片手册来说应该是 20Kb。

在 FreeRTOSConfig.h 配置文件中有设置 RTOS 要使用的内存大小,用 configTOTAL_HEAP_SIZE 宏定义的。

将 configTOTAL_HEAP_SIZE 宏修改为 10K

1
#define configTOTAL_HEAP_SIZE					((size_t)(10*1024)) 

6.Contents mismatch

Contents mismatch at: 08000000H (Flash=FFH Required=00H) ! Too many errors to display !

错误信息:

1
2
3
4
5
6
7
Contents mismatch at: 08000000H  (Flash=FFH  Required=00H) !
Contents mismatch at: 08000001H (Flash=FFH Required=04H) !
Contents mismatch at: 08000002H (Flash=FFH Required=00H) !
...
...
Contents mismatch at: 08000063H (Flash=FFH Required=08H) !
Too many errors to display !

出现此种情况,网上有两个说法:

  1. 检查复位电路,download 复位选项设置为正常
  2. 芯片全擦除

个人遇到这个问题,烧录时设置为芯片全擦除,成功。

7.J-Link烧录,检测不到芯片

该问题与博客https://blog.csdn.net/Jun626/article/details/80686263的情况一致。

描述:

在我将工程移到另一个电脑后,烧录时出现了检测不到芯片的情况。

详情:

工程移动到另一个电脑后,打开,keil弹出了一个提示框,让选择芯片:

1
2
3
4
-- J-link Vxxx Device Selection --
The selected device "XXXXXXX" is unknown to this version of the jlink-software.

Please make sure ....

就是说让重新选择芯片型号,我因为用的MXD2660,是ARMM0的因此就直接选了ARMM0。

然后就烧录不进程序,查看Debug,发现检测不到芯片。

解决方法:

网上查找刚好发现上述博客与我遭遇一致,原因是芯片型号选错了,MXD2660应该选Cortex-M0+。

将JlinkSetting.ini删除后,重新选择型号即可。