STM32F407VET6-FLASH读写操作-数据写入失败-求解

STM32HAL库-针对芯片内部FLASH读保护实现防篡改、破解功能
https://blog.csdn.net/qq_36075612/article/details/116241705
你好,大师,你这个代码我想用在STM32F407VET6项目里,修改了几行代码,编译通过,但有四个警告,

img


警告信息:
converting a packed 'SystemParamTypeDef' pointer (alignment 1) to a 'uint32_t' {aka 'long unsigned int'} pointer (alignment 4) may result in an unaligned pointer value [-Waddress-of-packed-member]
翻译:将压缩的“SystemParamTypeDef”指针(对齐1)转换为“uint32_t”{aka“long unsigned int”}指针(对齐4)可能会导致未对齐的指针值[-压缩成员的地址]
下到芯片串口打印:

Flash_Test!!!
DisableReadProtection!!!
Device_id:0xFFFFFFFF, Hardware_Version:0xFFFFFFFF, Application_Version:0xFFFFFFFF, Application_Status:0xFFFFFFFF 
UPDATA!!! 
Device_id:0xFFFFFFFF, Hardware_Version:0xFFFFFFFF, Application_Version:0xFFFFFFFF, Application_Status:0xFFFFFFFF

这应该是数据没写进去吧?请教一下怎么改?

FLASH_If_Write(DATASTOREADDR, (uint32_t*)&SystemParam_default, page);
FLASH_If_Read(DATASTOREADDR, (uint32_t*)&SystemParam_read, page);
很久没弄了,都忘差不多了,凭借一点点记忆,给你回答此问题,这两个接口,需要自己实现,读写失败,原因大部分是F1与F4扇区不一致,你参考对应的datasheet,就懂了datasheet有详细说明,也可以查看这个 FLASH_EraseInitTypeDef 结构体,F1与F4它们的区别

该回答引用GPTᴼᴾᴱᴺᴬᴵ
警告信息提示的是指针对齐的问题,不影响程序的正常运行,可以忽略这些警告。
至于数据写入失败的问题,可能是因为FLASH写入的操作不正确或者写入的地址不正确。建议您检查以下几个方面:

  1. 检查FLASH是否被锁定或者写保护。如果FLASH被锁定或者写保护,则无法进行写操作。可以通过读取FLASH的状态寄存器来检查是否被锁定或者写保护。
  2. 检查写入的地址是否正确。在STM32F407VET6中,FLASH的起始地址是0x08000000,结束地址是0x080FFFFF。如果写入的地址不在这个范围内,写入操作就会失败。
  3. 检查写入的数据是否正确。在程序中,需要将要写入的数据先复制到缓冲区中,然后再将缓冲区中的数据写入FLASH。如果复制的数据不正确或者缓冲区中的数据没有被正确写入FLASH,写入操作就会失败。

希望这些提示能帮助您解决问题。

这个跟警告没有关系。
怀疑是flash的驱动有问题,导致没有写入到flash中。

参考GPT和自己的思路,这个警告信息是指你在代码中把一个结构体类型的指针转换成了另一个类型的指针,但两者的内存对齐方式不同,可能会导致未对齐的指针值。具体的原因需要看代码中的具体实现。

关于数据没写进去的问题,建议你按照以下步骤进行排查:

1 确认你的写入操作是正确的:检查你的代码是否正确地调用了HAL_FLASH_Program() 函数,并且传递了正确的参数(如地址、数据等)。

2 确认你的芯片没有其他的读保护或写保护:如果你的芯片已经启用了其他类型的保护机制,那么就不能正常地对其进行写入操作。你可以通过读取FLASH的状态寄存器来确认是否有其他的保护机制启用。

3 确认你的代码没有其他的bug:在排除了硬件问题后,还需要检查代码中是否存在其他的bug或逻辑问题,例如:地址计算错误、数据类型不匹配、函数调用错误等等。
4 是否写入的地址是正确的?

5 是否写入的数据是正确的?

6 是否有其他代码或者硬件问题导致数据写入失败?
如果以上都没有问题,你可以在代码中添加一些调试信息,如打印输出等,帮助你进一步定位问题所在。

这个问题应该只有 Ch_champion 能回答

传入的结构体可以参考这样写,你试一下

  struct {
      char c;
      int d;
  }__attribute__((packed)) v;

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^