STM32H743使用1.3.0版HAL库函数连续写flash的时候,写入不完整,只能循环写入三次(每次写入32字节)
帅不帅 2021-04-08 04:57:55 STM32H743使用1.3.0版HAL库函数连续写flash的时候,写入不完整,只能循环写入三次(每次写入32字节)。
我的代码如下:
/* FLASH 解锁 ***************************************************/
status = HAL_FLASH_Unlock();
if(status != HAL_OK)
return -1;
FirstSector = GetSector(FLASH_USER_START_ADDR);
NbOfSectors = GetSector(FLASH_USER_END_ADDR)- FirstSector + 1;
/* 擦除待使用的扇区**********************************************/
/* 构建 EraseInit structure*/
EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;
EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
EraseInitStruct.Banks = FLASH_BANK_1;
EraseInitStruct.Sector = FirstSector;
EraseInitStruct.NbSectors = NbOfSectors;
/* 开始擦除操作 */
if (HAL_FLASHEx_Erase(&EraseInitStruct, §ORError) != HAL_OK)
{
/*擦除出错,返回 */
return -2;
}
/* 以“falsh字(256bits--32字节)”的大小为单位写入数据 *************/
Address = FLASH_USER_START_ADDR;
while (Address < (FLASH_USER_START_ADDR + 0x80))
{
if ( HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, Address, (uint64_t)(uint32_t)my_DATA) == HAL_OK)
{
Address = Address + 32;
}
else
{
/*写入出错,打印出错地址并返回 */
printf("flash写入的出错地址是 0x%X\r\n",Address);
return -3;
}
}
/* 给FLASH 上锁,防止内容被篡改*/
status = HAL_FLASH_Lock();
if(status != HAL_OK)
{
return -4;
}
/* 从FLASH 中读取出数据进行校验***************************************/
/* MemoryProgramStatus = 0: 写入的数据正确
MemoryProgramStatus != 0: 写入的数据错误,其值为错误的个数 */
Address = FLASH_USER_START_ADDR;
MemoryProgramStatus = 0;
while (Address < (FLASH_USER_START_ADDR + 0x80))
{
Data32 = *(__IO uint32_t*)Address;
if (Data32 != DATA_32)
{
MemoryProgramStatus++;
}
printf("地址 0x%x 中数据内容是 0x%X\r\n",Address,Data32);
Address = Address + 4;
}
printf("校验错误数为(/4字节) : 0x%X\r\n",MemoryProgramStatus);
/* 数据校验不正确 */
if (MemoryProgramStatus)
{
return -5;
}
else /*数据校验正确*/
{
return 0;
}
下载运行打印结果是这样:
stm32h743 内部flash的读写测试实验
地址 0x80a0000 中数据内容是 0x87654321
地址 0x80a0004 中数据内容是 0x87654321
地址 0x80a0008 中数据内容是 0x87654321
地址 0x80a000c 中数据内容是 0x87654321
地址 0x80a0010 中数据内容是 0x87654321
地址 0x80a0014 中数据内容是 0x87654321
地址 0x80a0018 中数据内容是 0x87654321
地址 0x80a001c 中数据内容是 0x87654321
地址 0x80a0020 中数据内容是 0x87654321
地址 0x80a0024 中数据内容是 0x87654321
地址 0x80a0028 中数据内容是 0x87654321
地址 0x80a002c 中数据内容是 0x87654321
地址 0x80a0030 中数据内容是 0x87654321
地址 0x80a0034 中数据内容是 0x87654321
地址 0x80a0038 中数据内容是 0x87654321
地址 0x80a003c 中数据内容是 0x87654321
地址 0x80a0040 中数据内容是 0x87654321
地址 0x80a0044 中数据内容是 0x87654321
地址 0x80a0048 中数据内容是 0x87654321
地址 0x80a004c 中数据内容是 0x87654321
地址 0x80a0050 中数据内容是 0x87654321
地址 0x80a0054 中数据内容是 0x87654321
地址 0x80a0058 中数据内容是 0x87654321
地址 0x80a005c 中数据内容是 0x87654321
地址 0x80a0060 中数据内容是 0xFFFFFFFF
地址 0x80a0064 中数据内容是 0xFFFFFFFF
地址 0x80a0068 中数据内容是 0xFFFFFFFF
地址 0x80a006c 中数据内容是 0xFFFFFFFF
地址 0x80a0070 中数据内容是 0xFFFFFFFF
地址 0x80a0074 中数据内容是 0xFFFFFFFF
地址 0x80a0078 中数据内容是 0xFFFFFFFF
地址 0x80a007c 中数据内容是 0xFFFFFFFF
校验错误数为(/4字节) : 0x8
无论写入的边界是多少,都是只能写入3次,后面的读出来就是0xffffffff。为了展示打印结果修改为了只写如0x80个数据。在debug时观察是没问题的,后面的地址可以写入正确的0x87654321。什么原因?请各位指点,不胜感谢!