久芯网

CubelIDE,HAL_FLASH_Program仿真时出错。

avatar wjn 提问时间: 2023-08-10 18:20:53 / 已解决

擦除后,可看到整页为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个回答
  • avatar butterflyspring
    最佳答案
    回答时间: 2023-08-10 18:49:16

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

  • avatar wjn
    回答时间: 2023-08-10 19:15: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字节)。

  • avatar xmshao
    回答时间: 2023-08-10 19:34:07

    除了基本的操作步驟、正確的參數外,注意做快速編程時將該FLASH_Program_Fast()放在RAM裏執行。

  • avatar 废鱼
    回答时间: 2023-08-10 20:06:21

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

  • avatar wjn
    回答时间: 2023-08-10 20:33:05
    废鱼 发表于 2022-2-9 11:19
    楼主,你擦除的地址是不是程序内的地址?如果想要测试FLASH的使用,建议选择当前代码范围外的地址进行 ...

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

  • avatar butterflyspring
    回答时间: 2023-08-10 21:06:03

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

  • avatar 废鱼
    回答时间: 2023-08-10 21:25:38
    wjn 发表于 2022-2-9 11:35
    ![16443774411.jpg](data/attachment/forum/202202/09/113013fpb2zu229511jfbj.jpg?imageMogr2/auto- ...

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

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

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

  • avatar wjn
    回答时间: 2023-08-10 22:11:24
    废鱼 发表于 2022-2-9 11:45

    [md]您好,说一下你用的芯片型号,我看一下FLASH的排列。eclipse有时候使用并不如keil好。我也经常会 ...

    [md]STM32G030F6P6。 好像是1个bank、16页,1页2K。我用的是倒数第2页。 是啊,看提示不明白出问题在哪了。前面仿真都正常,flash我通过定义的数组查看的,初始值、擦除后的值都正常,与估算的地址也对应。

  • avatar sealoong
    回答时间: 2023-08-10 22:39:58
    wjn 发表于 2022-2-9 11:35
    ![16443774411.jpg](data/attachment/forum/202202/09/113013fpb2zu229511jfbj.jpg?imageMogr2/auto- ...

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

  • avatar wjn
    回答时间: 2023-08-10 23:01:34
    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有些不解,但还是用了。 但是又出现问题,这个片子突然擦除不了了。所以,后面的写入无法验证,看了下仿真中检查返回值都正常。 换了个板子,同系列不同型号的,这段程序仿真正常了。。

  • avatar wjn
    回答时间: 2023-08-10 23:25:11

    写在最后: 一开始调试用的那个片子,不知道动了哪,我用的那一页,自编程擦除不了了。 但烧写正常。 (好在我从来不怀疑自己写的程序有问题,总有多块板子换着用,证明芯片没坏。) 谁知道是咋回事,怎么解决?

  • avatar butterflyspring
    回答时间: 2023-08-10 23:54:18
    wjn 发表于 2022-2-10 10:53
    [md]非常感谢废鱼、xmshao、butterflyspring的作答。 昨天回家换了块板子已经调试成功。

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

  • avatar 狗狗开饭啦
    回答时间: 2023-08-11 00:22:19
    butterflyspring 发表于 2022-2-9 17:20
    楼主你好,从手册上看,这个系列的FLASH结构和烧录方式同F1等不太一样。 并不是FLASH保持FF就可以烧录了。 ...

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

会员中心 微信客服
客服
回到顶部