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, &SECTORError) != 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。什么原因?請各位指點,不勝感謝!
uj5u.com熱心網友回復:
上面程式在執行回圈寫入的時候并沒有報錯。只是后面讀出來的資料為fffffff轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/273894.html
標籤:單片機/工控
下一篇:如何用wdf開發檔案過濾驅動
