佬们,救救孩子吧! 原因: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没有办法同时擦写的关系,头回用好一点的芯片,还在学习。 |
keil安装pack中提示Encountered an improper argument. 如何解决
《MCSDK5.X中增加位置环》提及mc_position.c/mc_position.h
stm32cubide搜索不到.h文件里的文本
stm32cubeide-boot loader跳转APP异常问题
我用过stm32cubemax 但是我给stm32cubeide整服了
STM32G473 DRDY不置位?
stspin32G4这颗mcu里面集成的是哪一款G4?能不能用cubemx来进行配置
STM32G473是否支持硬件AES?
STM32G473VET6同时使用6个片上放大器(OPAMP)的PGA加外部偏置模式,引脚位置让差分信号走线分离,信号有无较大影响?
STM32745/747芯片固件升级问题
找到问题了,佬,就是signle bank模式没有启用,默认Dual bank模式。没有注意到这个问题
单独运行APP,不做偏移,不就是和传统开发一样么?
如果是这样的话,先用烧录器读出optionbyte 看看是不是signle bank 模式。
如果是,就和传统开发一样。 不放心就擦除全片后再下载调试了。
你确认下 擦除命令代码是否就落在你要擦除的区域了?
还有,你这里的扇区指的是page擦除 还是bank擦除?
STM32G4系列是支持双BANK的。你通过STM32Programmer看看到底是基于单BANK
还是双BANK在使用。不同选择,对应的页地址及空间大小安排不一样。
单BANK对应的PAGE大小为4K,双BANK对应的Page大小为2K.
另外也检查下是否有设置写保护的区域存在。
擦除失败,往往会有错误返回的,你看看有哪些错误提示。
毕竟问题跟程序大小有关只是表象,根本原因可能是地址给错、对齐问题、写保护啊等等。
像你这种情况,充分利用双BANK特性其实挺方便的。在某个BANK运行代码时可以安全地擦除
另一bank的东西而不影响当前代码的运行。
1. 在区域的起始和结束地址要重新配置一下。
2. 配置的大小要符合芯片擦除单位的定义。 单bank和双bank的 page size 是不同的。
3. 烧录的APP 编译时设置的地址也要配置一下。
谢谢大佬的回复,但是目前的问题不是在App的跳转地址上,而是说,一个从0x8000000开始的程序,如果程序大小大于40k左右就无法扇区擦除了,较小的时候可以。能详细讲解第二点的双bank擦除的方法嘛?我感觉跟这个关系可能比较大,非常感谢!
谢谢大佬回复,这里讲的扇区擦除是指的keil 里下载方式的 [Download function] 的[Erase Sectors]
并不是代码擦除的指令,这里是想调试App的功能,不是IAP功能。
程序大小确实只是表象,这里想表达的是,下载调试配置没有问题,排除基本配置存在的问题。
在屏蔽了占了大部分内存的协议栈后能正常下载仿真(使用[Erase Sectors]),但是启用以后就报错了,不过修改下载方式为[Erase Full Chip]以后又可以正常下载仿真了。这里又可以排除程序本身的问题,说明程序本身是可以正常运行的,只是在使用[Erase Sectors]时会下载错误。
这里的sectors 是编译器统一的表述,具体还看芯片是否支持。
STM32G4的物理特性就是按PAGE 擦除,单双bank 不同page size
编译器是绕不过物理限制的。
所以下载地址需要用户根据物理特性来设置的。
上面的图在 F411上已经初步实现了。
是需要修改IROM1的Start地址嘛?但是不需要偏移运行,单独运行App不做地址偏移。
还是说增加一个IROM2地址?
[md]因为App本身就已经接近100K(STM32G474CBTx 128K)了,所以应该是没有使用双bank模式的,应该也不用配置其他内容吧。
一直是当作一整块内存来用的,主要是程序本身太大了,没有办法分两部分。