擦除后,可看到整页为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_,地址用的擦除页的首地址。 出现的问题,大致查找了几天,可能比较少见吧。 |
STM32G0B1adc+dma采样数据错位
cubeIDE在运行时显示Failed to execute MI command是什么问题呢?
为什么ETH配置中没有Advanced Parameters?
有没有stm32g071 Discovery kit的micropython的固件
STM32出现error downloading following files
安装STM32CUBEIDE时提示Error launching installer,我的电脑设置的是中文简体,杀毒软件也推出了,怎么才能安装软件?
STM32CubIDE代码编辑页面相同变量可以高亮显示么?如何设置?
stm32 vs code extension 无法编译成功
STM32G0B1CBT6 Flash 不能写擦除,更不要说写入?fal库示例代码哪里有,分享一下,谢谢
STM32G031G6U6 PA8无法输出高低电平
非常感谢废鱼、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字节)。
楼主,你擦除的地址是不是程序内的地址?如果想要测试FLASH的使用,建议选择当前代码范围外的地址进行。
[md]
应该不会吧,按网上别人的方法定位了倒数第2页的地址,放了一个数组占满了,以前用MDK时的习惯。擦写都在这一页地址。不过现在尝试用STM32CubelIDE和HAL库,遇到不少问题。
[md]您好,说一下你用的芯片型号,我看一下FLASH的排列。eclipse有时候使用并不如keil好。我也经常会发生类似的问题。从提示上分析是不能找到断点的地址或者程序溢出导致。
这个是STM32G030F6P6,以前都是用寄存器写的,现在想偷个懒。直接用的STM32CubelIDE,自带STM32CubelMX的版本。
[md]STM32G030F6P6。
好像是1个bank、16页,1页2K。我用的是倒数第2页。
是啊,看提示不明白出问题在哪了。前面仿真都正常,flash我通过定义的数组查看的,初始值、擦除后的值都正常,与估算的地址也对应。
[md]cubeide功能很强大,但是就因为功能丰富,用起来很冗余,对新手不友好
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有些不解,但还是用了。
但是又出现问题,这个片子突然擦除不了了。所以,后面的写入无法验证,看了下仿真中检查返回值都正常。
换了个板子,同系列不同型号的,这段程序仿真正常了。。
写在最后:
一开始调试用的那个片子,不知道动了哪,我用的那一页,自编程擦除不了了。
但烧写正常。
(好在我从来不怀疑自己写的程序有问题,总有多块板子换着用,证明芯片没坏。)
谁知道是咋回事,怎么解决?
这个产品的FLASH结构有些变化,增加的ECC功能(目前很多认证需要这个)。所以它的存贮结构为64bit数据+8位ECC。 因此烧录时需要 double world (64bit)。 这一点在手册上FLASH章节有描述。所以库函数只有这个两个选项。
从参数上看,这两种烧录方式速度比以往的更快了,而且增加了ECC校验,简化了功能安全设计,是厂家提升的新功能。
你好,我采用展示的方法进行FLASH写操作,一进入HAL_FLASH_Program()函数就立刻报错