擦除后,可看到整页为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_,地址用的擦除页的首地址。 出现的问题,大致查找了几天,可能比较少见吧。 |
keil安装pack中提示Encountered an improper argument. 如何解决
stm32cubide搜索不到.h文件里的文本
stm32cubeide-boot loader跳转APP异常问题
我用过stm32cubemax 但是我给stm32cubeide整服了
STM32G030F6 ADC+DMA多通道非连续采样无法正常工作?
STM32G0B1VE的CAN过滤器个数问题
STM2cubeide使用Freertos v2提示错误问题
STM32G0B1adc+dma采样数据错位
cubeIDE在运行时显示Failed to execute MI command是什么问题呢?
为什么ETH配置中没有Advanced Parameters?
非常感谢废鱼、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()函数就立刻报错