|
擦除后,可看到整页为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_,地址用的擦除页的首地址。 出现的问题,大致查找了几天,可能比较少见吧。 |
楼主你好,从手册上看,这个系列的FLASH结构和烧录方式同F1等不太一样。 并不是FLASH保持FF就可以烧录了。 在手册中有描述,还是需要擦除。它的FAST PROGRAM 并不是通过节省擦除时间来提升速度的,而且还必须一次写256bytes 才行。 另外从库函数中看,应该使用HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data) 这个函数。 具体请参考手册和附图。 实测有效,并且跟编译器无关,用CUBEIDE很方便的。
非常感谢废鱼、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_Program_Fast()放在RAM裏執行。
楼主,你擦除的地址是不是程序内的地址?如果想要测试FLASH的使用,建议选择当前代码范围外的地址进行。
楼主,你擦除的地址是不是程序内的地址?如果想要测试FLASH的使用,建议选择当前代码范围外的地址进行 ...
[md] 应该不会吧,按网上别人的方法定位了倒数第2页的地址,放了一个数组占满了,以前用MDK时的习惯。擦写都在这一页地址。不过现在尝试用STM32CubelIDE和HAL库,遇到不少问题。
请问楼主是具体用的哪个型号? 因为不同STM32系列或者同一系列不同容量之间都有一些差别。比如一次可以写入的字节数,DUBAL bank 等。 所以有具体型号和函数具体地址内容才好判断。另外,对于STM32在擦除或烧录程序空间时,接口电压升高,这时候去操作时通常无法保证正确返回数据,最好是在烧录结束后再去观察结果是否正确。
放在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有些不解,但还是用了。 但是又出现问题,这个片子突然擦除不了了。所以,后面的写入无法验证,看了下仿真中检查返回值都正常。 换了个板子,同系列不同型号的,这段程序仿真正常了。。
写在最后: 一开始调试用的那个片子,不知道动了哪,我用的那一页,自编程擦除不了了。 但烧写正常。 (好在我从来不怀疑自己写的程序有问题,总有多块板子换着用,证明芯片没坏。) 谁知道是咋回事,怎么解决?
[md]非常感谢废鱼、xmshao、butterflyspring的作答。 昨天回家换了块板子已经调试成功。
这个产品的FLASH结构有些变化,增加的ECC功能(目前很多认证需要这个)。所以它的存贮结构为64bit数据+8位ECC。 因此烧录时需要 double world (64bit)。 这一点在手册上FLASH章节有描述。所以库函数只有这个两个选项。 从参数上看,这两种烧录方式速度比以往的更快了,而且增加了ECC校验,简化了功能安全设计,是厂家提升的新功能。
楼主你好,从手册上看,这个系列的FLASH结构和烧录方式同F1等不太一样。 并不是FLASH保持FF就可以烧录了。 ...
你好,我采用展示的方法进行FLASH写操作,一进入HAL_FLASH_Program()函数就立刻报错