STM32F4操作内部FLASH简洁版
地址布局
擦除
擦除使用HAL_FLASHEx_Erase()
函数,需要解锁操作完后再上锁
擦除的单位是扇区,sector_index
对应着上表中的扇区序号
int test_flash_erasr(uint32_t sector_index)
{FLASH_EraseInitTypeDef EraseInitStruct;uint32_t SectorError = 0;EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS; // 擦除整个扇区EraseInitStruct.Sector = sector_index; // 扇区序号,非地址EraseInitStruct.NbSectors = 1; // 连续擦除的扇区数量EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3; // 电压范围HAL_FLASH_Unlock();HAL_StatusTypeDef status = HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError);if (status != HAL_OK){printf("Flash Erase Error: %d\r\n", status);HAL_FLASH_Lock();return -1;}HAL_FLASH_Lock();return 0;
}
写
写使用HAL_FLASH_Program()
函数,需要解锁操作完后再上锁
可以按字节、半字、字和双字数据写入,这里按字写入
void test_flash_write(uint32_t address, uint8_t *buff, size_t size)
{HAL_FLASH_Unlock();uint32_t *data = (uint32_t *)buff;for (size_t i = 0; i < size / 4; i++){HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address + i * 4, data[i]);}HAL_FLASH_Lock();
}
读
读可以直接按地址取值,这里以dump hex为例
void test_dump_hex(uint8_t *data, size_t size)
{for (size_t i = 0; i < size; i++){if (i % 16 == 0){printf("\r\n%08X: ", i);}printf("%02X ", data[i]);}printf("\r\n");
}test_dump_hex(0x8040000, 128);
测试
test_dump_hex(0x8040000, 128);test_flash_erasr(FLASH_SECTOR_6);test_dump_hex(0x8040000, 128);test_flash_write(0x8040000, data, 128);test_dump_hex(0x8040000, 128);
结果如下:
00000000: 42 54 4C 44 00 03 E9 07 00 00 06 12 0F 18 04 FF
00000010: 88 49 00 00 22 51 49 AA 00 00 00 30 00 00 00 30
00000020: FF 00 FF FF 00 00 08 00 D0 BA AC AC 00 00 FF FF
00000030: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000040: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000050: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000060: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000070: FF FF FF FF FF FF FF FF FF FF FF FF AC 0B FD EF00000000: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000010: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000020: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000030: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000040: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000050: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000060: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000070: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00000000: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000010: 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
00000020: 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
00000030: 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
00000040: 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
00000050: 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
00000060: 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
00000070: 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F