你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
唔嗯文 提问时间:2024-4-9 09:21 / 已解决

佬们,救救孩子吧!

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

image.png

MDK:V5.35

芯片:STM32G474CBTx

仿真器:ST-link V2,J-Link

image.png

选中第一项(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”,网上找了很久没有找到原因,拖了很久没处理这个问题。

尝试是不是写入地址的问题,创建了一个示例工程,工程很简单

image.png

在main()外添加全局常量,并且指定地址在0x8010000,函数主体不添加任何东西。

attribute((section(".app"))) const uint8_t program_code_end_flag[] = {0x11,0x22,0x33,0x44,0x55,0x66,0x77};

在.ld文件添加.app段

image.png

image.png

编译下载后,还是报“Error: Operation exceeds memory limits”

修改段地址为0x800FFF0,编译下载成功,使用STM32CbueProgrammer读取,在0x800FFF0读到了数组

program_code_end_flag的值,说明程序成功烧录了。

根据这个结果大胆猜测,可能是双bank影响到了地址,网上查找有关资料,bank2地址为0x8040000.

修改段地址为0x804000,编译下载成功,使用STM32CbueProgrammer读取,在0x8040000读到了数组

program_code_end_flag的值,说明程序成功烧录了。

抓住真凶了,肯定是双bank引起的。

翻阅芯片手册后发现

image.png

image.png

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

image.png

使用STM32CbueProgrammer关闭该位后,再使用CubeIDE下载段地址为0x8010000的程序,发现可以了

没有报错,而且读取0x8010000上确实存在program_code_end_flag数组的值。

回头测试keil,发现无法扇区擦除下载程序的问题也同样解决了,开心,嘿嘿!

猜测可能是两个bank没有办法同时擦写的关系,头回用好一点的芯片,还在学习。

image.png
收藏 评论9 发布时间:2024-4-9 09:21

举报

9个回答
唔嗯文 最优答案 回答时间:2024-4-9 17:25:39

butterflyspring 发表于 2024-4-9 17:21
单独运行APP,不做偏移,不就是和传统开发一样么?</p>
<p>如果是这样的话,先用烧录器读出optionbyte 看看是不 ...

找到问题了,佬,就是signle bank模式没有启用,默认Dual bank模式。没有注意到这个问题

butterflyspring 回答时间:2024-4-9 17:21:53
唔嗯文 发表于 2024-4-9 14:40
[md]因为App本身就已经接近100K(STM32G474CBTx  128K)了,所以应该是没有使用双bank模式的,应该也不用 ...

单独运行APP,不做偏移,不就是和传统开发一样么?

如果是这样的话,先用烧录器读出optionbyte 看看是不是signle bank 模式。
如果是,就和传统开发一样。 不放心就擦除全片后再下载调试了。
xmshao 回答时间:2024-4-9 13:15:14
正常来讲,只要扇区地址给对了,且擦除指令能执行完毕就不应该擦除不了。当然供电还是要够用。


你确认下 擦除命令代码是否就落在你要擦除的区域了?


还有,你这里的扇区指的是page擦除  还是bank擦除?


STM32G4系列是支持双BANK的。你通过STM32Programmer看看到底是基于单BANK
还是双BANK在使用。不同选择,对应的页地址及空间大小安排不一样。


单BANK对应的PAGE大小为4K,双BANK对应的Page大小为2K.


另外也检查下是否有设置写保护的区域存在。


擦除失败,往往会有错误返回的,你看看有哪些错误提示。


毕竟问题跟程序大小有关只是表象,根本原因可能是地址给错、对齐问题、写保护啊等等。


像你这种情况,充分利用双BANK特性其实挺方便的。在某个BANK运行代码时可以安全地擦除
另一bank的东西而不影响当前代码的运行。
butterflyspring 回答时间:2024-4-9 10:26:04
大体方向上没错,只是需要注意一下:

1. 在区域的起始和结束地址要重新配置一下。

2. 配置的大小要符合芯片擦除单位的定义。 单bank和双bank的 page size 是不同的。

3. 烧录的APP 编译时设置的地址也要配置一下。

STM32F411 KEIL SECTORS ERASE 1.PNG STM32F411 KEIL SECTORS ERASE 2.PNG
唔嗯文 回答时间:2024-4-9 11:35:09

butterflyspring 发表于 2024-4-9 10:26
大体方向上没错,只是需要注意一下:</p>
<ol>
<li>在区域的起始和结束地址要重新配置一下。

谢谢大佬的回复,但是目前的问题不是在App的跳转地址上,而是说,一个从0x8000000开始的程序,如果程序大小大于40k左右就无法扇区擦除了,较小的时候可以。能详细讲解第二点的双bank擦除的方法嘛?我感觉跟这个关系可能比较大,非常感谢!

唔嗯文 回答时间:2024-4-9 13:56:38

xmshao 发表于 2024-4-9 13:15
正常来讲,只要扇区地址给对了,且擦除指令能执行完毕就不应该擦除不了。当然供电还是要够用。</p>
<p>

谢谢大佬回复,这里讲的扇区擦除是指的keil 里下载方式的 [Download function] 的[Erase Sectors]

image.png

并不是代码擦除的指令,这里是想调试App的功能,不是IAP功能。

程序大小确实只是表象,这里想表达的是,下载调试配置没有问题,排除基本配置存在的问题。

在屏蔽了占了大部分内存的协议栈后能正常下载仿真(使用[Erase Sectors]),但是启用以后就报错了,不过修改下载方式为[Erase Full Chip]以后又可以正常下载仿真了。这里又可以排除程序本身的问题,说明程序本身是可以正常运行的,只是在使用[Erase Sectors]时会下载错误。

butterflyspring 回答时间:2024-4-9 14:11:48
唔嗯文 发表于 2024-4-9 13:56
[md]谢谢大佬回复,这里讲的扇区擦除是指的keil 里下载方式的 [Download function] 的[Erase Sectors]

! ...

这里的sectors 是编译器统一的表述,具体还看芯片是否支持。

STM32G4的物理特性就是按PAGE 擦除,单双bank 不同page size

编译器是绕不过物理限制的。

所以下载地址需要用户根据物理特性来设置的。

上面的图在 F411上已经初步实现了。
唔嗯文 回答时间:2024-4-9 14:22:12

butterflyspring 发表于 2024-4-9 14:11
这里的sectors 是编译器统一的表述,具体还看芯片是否支持。</p>
<p>STM32G4的物理特性就是按PAGE 擦除,单双ba ...

是需要修改IROM1的Start地址嘛?但是不需要偏移运行,单独运行App不做地址偏移。

还是说增加一个IROM2地址?

image.png

image.png
唔嗯文 回答时间:2024-4-9 14:40:50

唔嗯文 发表于 2024-4-9 14:22
是需要修改IROM1的Start地址嘛?但是不需要偏移运行,单独运行App不做地址偏移。</p>
<p>还是说增加一个IRO ...

[md]因为App本身就已经接近100K(STM32G474CBTx 128K)了,所以应该是没有使用双bank模式的,应该也不用配置其他内容吧。

一直是当作一整块内存来用的,主要是程序本身太大了,没有办法分两部分。

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版