STM32
直播中

李杰

7年用户 1390经验值
私信 关注
[问答]

请问keil无法对G474CBTx扇区擦除烧录较大程序是什么原因?

佬们,救救孩子吧!
原因:bootloader升级仿真需要使用到扇区擦除调试App,当程序到大概40K左右以后,无法扇区擦除下载,程序较小时没有问题。

MDK:V5.35
芯片:STM32G474CBTx
仿真器:ST-link V2,J-Link

选中第一项(Erase Full Chip) 能直接调试App程序,第二项(Erase Sectors)就报 Error: Flash Download failed  -  "Cortex-M4"。如果把程序占内存的协议栈暂时屏蔽,程序变小了,扇区擦除也没有问题了,但是协议栈不能丢,而且还需要加bootloader(网上有贴子说是从地址0开始写有问题,但是App偏移了15K还是同样的问题),没有扇区擦除就不能仿真了。
尝试过一下几种方式:
1、修改Programming Algorithm,不知道是不是做的不对,但是没有用;
2、使用其他烧录器,原本使用的ST-link V2,换了J-link也没有解决;
3、降低过下载速度,并没有用;
4、尝试换个编译环境,使用CubeIDE,但是软件还不熟悉,报了一堆错,网上还很难找到解决方法,不过还是成功构建整个工程了,但问题又来了,CubeIDE生成的Debug文件太大了,(elf文件大概3M,hex文件95K,芯片128K)没有办法下载,可能是CubeIDE编译了很多没有使用的内容,改改应该能下载。(还在尝试)
佬们,真的只能全擦除嘛?555,有没有什么高招啊?
更换编译环境后(使用CubeIDE),出现了新问题,还是由于程序过大,造成了 “Error: Operation exceeds memory limits”,网上找了很久没有找到原因,拖了很久没处理这个问题。
尝试是不是写入地址的问题,创建了一个示例工程,工程很简单

在main()外添加全局常量,并且指定地址在0x8010000,函数主体不添加任何东西。
attribute((section(".app"))) const uint8_t program_code_end_flag[] = {0x11,0x22,0x33,0x44,0x55,0x66,0x77};
在.ld文件添加.app段


编译下载后,还是报“Error: Operation exceeds memory limits”
修改段地址为0x800FFF0,编译下载成功,使用STM32CbueProgrammer读取,在0x800FFF0读到了数组
program_code_end_flag的值,说明程序成功烧录了。
根据这个结果大胆猜测,可能是双bank影响到了地址,网上查找有关资料,bank2地址为0x8040000.
修改段地址为0x804000,编译下载成功,使用STM32CbueProgrammer读取,在0x8040000读到了数组
program_code_end_flag的值,说明程序成功烧录了。
抓住真凶了,肯定是双bank引起的。
翻阅芯片手册后发现


双bank模式缺省值为 1,默认开启。

使用STM32CbueProgrammer关闭该位后,再使用CubeIDE下载段地址为0x8010000的程序,发现可以了
没有报错,而且读取0x8010000上确实存在program_code_end_flag数组的值。
回头测试keil,发现无法扇区擦除下载程序的问题也同样解决了,开心,嘿嘿!
猜测可能是两个bank没有办法同时擦写的关系,头回用好一点的芯片,还在学习。



回帖(1)

张波

2024-5-24 16:49:57
根据您的描述,问题可能出现在以下几个方面:

1. 程序大小:当程序大小达到40K左右时,可能超过了单次扇区擦除和烧录的限制。您可以尝试将程序拆分成较小的部分,然后分别进行扇区擦除和烧录。

2. 扇区擦除选项:您提到选择了“Erase Sectors”选项时出现问题。请确保您选择的扇区擦除范围正确,且不会影响到其他重要的系统区域。

3. 仿真器设置:请检查ST-link V2或J-Link仿真器的设置,确保它们正确配置以支持您的STM32G474CBTx芯片。

4. 协议栈和Bootloader:您提到屏蔽协议栈后,扇区擦除没有问题。这可能意味着协议栈或Bootloader与扇区擦除存在冲突。请检查协议栈和Bootloader的配置,确保它们不会影响到扇区擦除和烧录过程。

5. Keil MDK版本:您使用的是Keil MDK V5.35版本。虽然这个版本相对较新,但仍然有可能存在一些兼容性问题。您可以尝试升级到最新版本的Keil MDK,看看是否能解决问题。

6. 芯片固件:请确保您的STM32G474CBTx芯片固件是最新的,以避免可能的兼容性问题。

综上所述,您可以尝试以下步骤来解决问题:

1. 将程序拆分成较小的部分,分别进行扇区擦除和烧录。
2. 检查扇区擦除范围,确保正确无误。
3. 检查仿真器设置,确保正确配置。
4. 检查协议栈和Bootloader配置,确保不会影响到扇区擦除和烧录过程。
5. 升级Keil MDK到最新版本。
6. 更新STM32G474CBTx芯片固件。

希望这些建议能帮助您解决问题。如果问题仍然存在,请提供更多详细信息,以便我们能够更好地帮助您。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分