佬们,救救孩子吧!
原因: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: Opera
tion 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没有办法同时擦写的关系,头回用好一点的芯片,还在学习。