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

CubelIDE,HAL_FLASH_Program仿真时出错。

[复制链接]
wjn 提问时间:2022-2-9 11:10 / 已解决

擦除后,可看到整页为65535.

然后进入HAL_FLASH_Program

最后在FLASH_Program_Fast(Address, (uint32_t)Data);下一步

仿真报错:

Break at address "0xfffffffe" with no debug information available, or outside of program code.

擦写流程都用的HAL_,地址用的擦除页的首地址。

出现的问题,大致查找了几天,可能比较少见吧。

收藏 评论14 发布时间:2022-2-9 11:10

举报

14个回答
butterflyspring 最优答案 回答时间:2022-2-9 17:20:14
楼主你好,从手册上看,这个系列的FLASH结构和烧录方式同F1等不太一样。 并不是FLASH保持FF就可以烧录了。 在手册中有描述,还是需要擦除。它的FAST PROGRAM 并不是通过节省擦除时间来提升速度的,而且还必须一次写256bytes 才行。 另外从库函数中看,应该使用HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data) 这个函数。 具体请参考手册和附图。 实测有效,并且跟编译器无关,用CUBEIDE很方便的。
stm32g020fastprogram1.png
stm32g020fastprogram2.png
wjn 回答时间:2022-2-10 10:53:38

非常感谢废鱼、xmshao、butterflyspring的作答。

昨天回家换了块板子已经调试成功。

不过,昨天我最后的回复,不知为何还没有审核通过,现重新整理一下:

(1)初用STM32CubelIDE和STM32G030系列的片子。先在产品上替换芯片打了个板子。

(2)MX很好用,初始化没有问题,外设功能都很好的启用。其他程序功能都很好的移植。

(3)最后有个掉电记忆功能,需要擦写flash,网上大致复制了段例程。然后就是各种调试不成功。

(4)抱着试一试的心情发帖求助。

(5)根据建议重新翻看库

HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data);

defgroup FLASH_Type_Program FLASH Program Typedefine FLASH_TYPEPROGRAM_DOUBLEWORD FLASH_CR_PG / Program a double-word (64-bit) at a specified address

define FLASH_TYPEPROGRAM_FAST FLASH_CR_FSTPG Fast program a 32 row double-word (64-bit) at a specified address

(6)总结:第一次用库开发,多少有点不信任,半路总想着自己用寄存器写,不过也期望着与时俱进,也幸好有人热情回复,总算坚持下来。

TypeProgram:FLASH_TYPEPROGRAM_DOUBLEWORD或FLASH_TYPEPROGRAM_FAST

不知为何只有这两个可用,好像例程里还能用半字、字节之类的。(所以我眼神不好一开始把FAST当成32bit了。)

Address:写入的首地址。

Data:FLASH_TYPEPROGRAM_DOUBLEWORD时就是一个不大于64bit的数就行。

FLASH_TYPEPROGRAM_FAST时,可以写上一个数组的地址(64bit*32=256字节)。

xmshao 回答时间:2022-2-9 11:59:16
除了基本的操作步驟、正確的參數外,注意做快速編程時將該FLASH_Program_Fast()放在RAM裏執行。
废鱼 回答时间:2022-2-9 11:19:39

楼主,你擦除的地址是不是程序内的地址?如果想要测试FLASH的使用,建议选择当前代码范围外的地址进行。

wjn 回答时间:2022-2-9 11:35:08

废鱼 发表于 2022-2-9 11:19
楼主,你擦除的地址是不是程序内的地址?如果想要测试FLASH的使用,建议选择当前代码范围外的地址进行 ...

[md]16443774411.jpg

应该不会吧,按网上别人的方法定位了倒数第2页的地址,放了一个数组占满了,以前用MDK时的习惯。擦写都在这一页地址。不过现在尝试用STM32CubelIDE和HAL库,遇到不少问题。

butterflyspring 回答时间:2022-2-9 11:40:20
请问楼主是具体用的哪个型号? 因为不同STM32系列或者同一系列不同容量之间都有一些差别。比如一次可以写入的字节数,DUBAL bank 等。 所以有具体型号和函数具体地址内容才好判断。另外,对于STM32在擦除或烧录程序空间时,接口电压升高,这时候去操作时通常无法保证正确返回数据,最好是在烧录结束后再去观察结果是否正确。



废鱼 回答时间:2022-2-9 11:45:14

wjn 发表于 2022-2-9 11:35
![16443774411.jpg](data/attachment/forum/202202/09/113013fpb2zu229511jfbj.jpg?imageMogr2/auto- ...

[md]您好,说一下你用的芯片型号,我看一下FLASH的排列。eclipse有时候使用并不如keil好。我也经常会发生类似的问题。从提示上分析是不能找到断点的地址或者程序溢出导致。

wjn 回答时间:2022-2-9 12:51:01

butterflyspring 发表于 2022-2-9 11:40
请问楼主是具体用的哪个型号? 因为不同STM32系列或者同一系列不同容量之间都有一些差别。比如一次可以写入 ...

这个是STM32G030F6P6,以前都是用寄存器写的,现在想偷个懒。直接用的STM32CubelIDE,自带STM32CubelMX的版本。

wjn 回答时间:2022-2-9 12:55:19

废鱼 发表于 2022-2-9 11:45</p>
<p>[md]您好,说一下你用的芯片型号,我看一下FLASH的排列。eclipse有时候使用并不如keil好。我也经常会 ...

[md]STM32G030F6P6。

好像是1个bank、16页,1页2K。我用的是倒数第2页。

是啊,看提示不明白出问题在哪了。前面仿真都正常,flash我通过定义的数组查看的,初始值、擦除后的值都正常,与估算的地址也对应。

sealoong 回答时间:2022-2-9 14:59:10

wjn 发表于 2022-2-9 11:35
![16443774411.jpg](data/attachment/forum/202202/09/113013fpb2zu229511jfbj.jpg?imageMogr2/auto- ...

[md]cubeide功能很强大,但是就因为功能丰富,用起来很冗余,对新手不友好

wjn 回答时间:2022-2-9 16:38:47

xmshao 发表于 2022-2-9 11:59
除了基本的操作步驟、正確的參數外,注意做快速編程時將該FLASH_Program_Fast()放在RAM裏執行。 ...

TypeProgram,FLASH_TYPEPROGRAM_FAST改为FLASH_TYPEPROGRAM_DOUBLEWORD仿真不会报错了。

HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data);

之前在查找TypeProgram时,看到这些。

define TYPEPROGRAM_BYTE FLASH_TYPEPROGRAM_BYTE

define TYPEPROGRAM_HALFWORD FLASH_TYPEPROGRAM_HALFWORD

define TYPEPROGRAM_WORD FLASH_TYPEPROGRAM_WORD

define TYPEPROGRAM_DOUBLEWORD FLASH_TYPEPROGRAM_DOUBLEWORD

但只有FLASH_TYPEPROGRAM_DOUBLEWORD能用。

翻看库的时候,有注释说FLASH_TYPEPROGRAM_FAST是32位,FLASH_TYPEPROGRAM_DOUBLEWORD是64位。

虽然对为什么是FAST而不是WORD有些不解,但还是用了。

但是又出现问题,这个片子突然擦除不了了。所以,后面的写入无法验证,看了下仿真中检查返回值都正常。

换了个板子,同系列不同型号的,这段程序仿真正常了。。

wjn 回答时间:2022-2-10 10:56:56

写在最后:

一开始调试用的那个片子,不知道动了哪,我用的那一页,自编程擦除不了了。

但烧写正常。

(好在我从来不怀疑自己写的程序有问题,总有多块板子换着用,证明芯片没坏。)

谁知道是咋回事,怎么解决?

butterflyspring 回答时间:2022-2-10 16:09:45
wjn 发表于 2022-2-10 10:53
[md]非常感谢废鱼、xmshao、butterflyspring的作答。

昨天回家换了块板子已经调试成功。

这个产品的FLASH结构有些变化,增加的ECC功能(目前很多认证需要这个)。所以它的存贮结构为64bit数据+8位ECC。 因此烧录时需要 double world (64bit)。 这一点在手册上FLASH章节有描述。所以库函数只有这个两个选项。
从参数上看,这两种烧录方式速度比以往的更快了,而且增加了ECC校验,简化了功能安全设计,是厂家提升的新功能。
STM32G030 program double world.png
狗狗开饭啦 回答时间:2022-5-14 10:30:19

butterflyspring 发表于 2022-2-9 17:20
楼主你好,从手册上看,这个系列的FLASH结构和烧录方式同F1等不太一样。 并不是FLASH保持FF就可以烧录了。  ...

你好,我采用展示的方法进行FLASH写操作,一进入HAL_FLASH_Program()函数就立刻报错

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