Arm 无法写入闪存-STM32L462

Arm 无法写入闪存-STM32L462,arm,stm32,microcontroller,hal,flash-memory,Arm,Stm32,Microcontroller,Hal,Flash Memory,我试图通过解析通过UART发送的十六进制文件将数据闪存到闪存中。但是擦了闪光灯之后,我就不能写了。这是我的代码: 擦除闪存的代码: |闪烁|清除|标记(闪烁|标记|操作错误|闪烁|标记|操作错误|闪烁|标记|| 闪光标志(闪光标志); /*获取要删除的第一页*/ 第一页=添加FLASH第12页; /*获取要从第一页删除的页数*/ NbOfPages=243; /*去银行*/ BankNumber=FLASH\u BANK\u 1; EraseInitStruct.TypeErase=闪存_Typ

我试图通过解析通过UART发送的十六进制文件将数据闪存到闪存中。但是擦了闪光灯之后,我就不能写了。这是我的代码:

擦除闪存的代码:

|闪烁|清除|标记(闪烁|标记|操作错误|闪烁|标记|操作错误|闪烁|标记||
闪光标志(闪光标志);
/*获取要删除的第一页*/
第一页=添加FLASH第12页;
/*获取要从第一页删除的页数*/
NbOfPages=243;
/*去银行*/
BankNumber=FLASH\u BANK\u 1;
EraseInitStruct.TypeErase=闪存_TypeErase_页面;
EraseInitStruct.Banks=银行编号;
EraseInitStruct.Page=第一页;
EraseInitStruct.NbPages=NbOfPages;
HAL_flashx_Erase(&EraseInitStruct,&PAGEError);
编写flash的代码:

uint64\u t flashData=0;
uint32_t flashWriteAddress=(扩展地址|记录地址| k);
nibblearrayout64(&data[recordDataOffset],(uint32_t)i)//将半字节[]转换为uint64_t并存储在flashData中
清除位(闪存->CR,闪存CR PER);
HAL_FLASH_程序(FLASH_类型程序_双字、flashWriteAddress、(uint64_t)flashData);
将半字节数组转换为uint64的代码:

void nibbleArrayToUInt64(uint8*var,uint32最低位置)
{
uint8_t字节;
flashData=0;

对于(int j=0;j您应该在擦除或写入之前解锁闪存。例如:

HAL_FLASH_Unlock();
FLASH_EraseInitTypeDef pEraseInit;
pEraseInit.Banks = 0;
pEraseInit.NbSectors = 1;
pEraseInit.Sector = FLASH_SECTOR_2;
pEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;
pEraseInit.VoltageRange = FLASH_VOLTAGE_RANGE_3;
uint32_t sectorError;
HAL_FLASHEx_Erase(&pEraseInit, &sectorError);
HAL_FLASH_Unlock();
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, VERSION_SAVE_ADDRESS, version);
HAL_FLASH_Lock();

您能否更具体地说明错误。是否只有HAL_FLASH_程序失败,并且早期擦除已成功完成?第一次写入是否会立即失败?它是否真的会返回任何这些错误代码?或者是否存在导致每个错误代码的特定序列?错误代码的含义是:error_PROG:the FLASH at地址未被擦除。错误\u PGA:写入地址未与双字地址对齐。错误\u PGS:操作顺序不正确,或以前的错误未被清除。是。擦除操作成功。是,即使第一次写入也失败。错误代码设置为0x42。对于所有写入,都设置了相同的错误代码。这是我的变量的地址,数据在ram中
0x0200004a8
。我认为它是对齐的。第一个写入地址是
0x08006000
@Codo BTW。现在我没有得到
HAL\u FLASH\u ERROR\u PROG
,但我仍然得到另外两个。错误代码0x40。我可能是错误的,但问题很可能在问题中显示的代码之外n、 它或者与操作序列、地址计算或类似的操作有关。我也对错误代码感到困惑?它们来自何处?据我了解,0x42是Sizer和Oper的组合,这没有意义。不。在我的例子中,0x42是这3个错误的组合。PGA | PGS | PROGA是StackOverflo的核心思想在OP问题解决很久之后,这是一个对访问者有用的问题和答案的不断增加的集合——这一概念与讨论论坛完全不同。因此,请为您自己的问题写一个解释解决方案的答案,并为新问题开始一个新问题。我已经通过创建init解锁了它函数。尝试在擦除和写入函数之前调用解锁函数。删除行“CLEAR_BIT(FLASH->CR,FLASH_Cru PER)”,如果问题仍然存在,则将其更改为SET_BIT。
HAL_FLASH x_erase
已清除位。我已修复此问题。稍后将更新。感谢您的帮助。
HAL_FLASH_Unlock();
FLASH_EraseInitTypeDef pEraseInit;
pEraseInit.Banks = 0;
pEraseInit.NbSectors = 1;
pEraseInit.Sector = FLASH_SECTOR_2;
pEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;
pEraseInit.VoltageRange = FLASH_VOLTAGE_RANGE_3;
uint32_t sectorError;
HAL_FLASHEx_Erase(&pEraseInit, &sectorError);
HAL_FLASH_Unlock();
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, VERSION_SAVE_ADDRESS, version);
HAL_FLASH_Lock();