Stm32F401RCT6内部FLASH数据的分区和F103的已经不一样了,读写格式化的方法网上内容不多,自己摸索了一下,基本可以,还存在一个问题
读取:
uint16_t f[5];
uint8_t tx[10];
f[0] = *(volatile uint16_t*)0x08020000; //STMFLASH_ReadHalfWord(0x0803F000);
f[1] = *(volatile uint16_t*)0x08020002; //STMFLASH_ReadHalfWord(0x0803F000);
f[2] = *(volatile uint16_t*)0x08020004; //STMFLASH_ReadHalfWord(0x0803F000);
f[3] = *(volatile uint16_t*)0x08020006; //STMFLASH_ReadHalfWord(0x0803F000);
f[4] = *(volatile uint16_t*)0x08020008; //STMFLASH_ReadHalfWord(0x0803F000);
//f[0] = 0x1234;
tx[0] = f[0]>>8;
tx[1] = f[0] & 0xff;
tx[2] = f[1]>>8;
tx[3] = f[1] & 0xff;
tx[4] = f[2]>>8;
tx[5] = f[2] & 0xff;
tx[6] = f[3]>>8;
tx[7] = f[3] & 0xff;
tx[8] = f[4]>>8;
tx[9] = f[4] & 0xff;
HAL_UART_Transmit(&huart1, tx, 10, 0xff);//查看数据
如果没有任何数据写入的时候读取应该都是0xFF的数据。
写入:
HAL_FLASH_Unlock();
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, 0x8020000, dat[0]);
HAL_Delay(10);
dat[0] = 0x0052;
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, 0x8020002, dat[0]);
HAL_Delay(10);
dat[0] = 0xff00;
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, 0x8020004, dat[0]);
HAL_Delay(10);
dat[0] = 0x55AA;
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, 0x8020006, dat[0]);
HAL_Delay(10);
dat[0] = 0xf0f4;
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, 0x8020008, dat[0]);
HAL_Delay(10);
HAL_FLASH_Lock();
测试数据随便写的,写入后再次读取,数据是刚刚写入的数据,应该是成功的。
格式化扇区:
FLASH全盘格式化后,数据都是0xFF的,如果写入会产生不同的数据,但是数据是不能删除的,只能通过扇区格式化来删除数据,格式化后又恢复到0xFF的,不能单独删除某个字节的。
该芯片的flash分的扇区是上图的情况
格式化扇区
HAL_FLASH_Unlock();
HAL_StatusTypeDef FlashStatus = HAL_OK;
uint32_t SectorError = 0;
FLASH_EraseInitTypeDef FlashEraseInit;
FlashEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS; //擦除类型,扇区擦除
FlashEraseInit.Sector = FLASH_SECTOR_5; //要擦除的扇区
FlashEraseInit.NbSectors = 1; //一次只擦除一个扇区
//FlashEraseInit.VoltageRange = FLASH_VOLTAGE_RANGE_3; //电压范围,VCC=2.7~3.6V之间!!
if (HAL_FLASHEx_Erase(&FlashEraseInit, &SectorError) != HAL_OK)
{
uint8_t tx[5] = "error";
HAL_UART_Transmit(&huart1, tx, 5, 0xff);
//break; //发生错误了
}else{
uint8_t tx[2] = "ok";
HAL_UART_Transmit(&huart1, tx, 2, 0xff);
}
FlashStatus = FLASH_WaitForLastOperation(FLASH_WAITETIME); //等待上次操作完成
while(FlashStatus != HAL_OK ){}
// FLASH_Erase_Sector(FLASH_SECTOR_4, FLASH_VOLTAGE_RANGE_3);
HAL_Delay(10);
HAL_FLASH_Lock();
格式化也是正常的,因为格式化后读取的数据变成了0xFF。
不过最后还存在一个严重的问题未解决:
在格式化后,想再次刷写数据产生错误:
目前还没有想出方法解决,只能重新用programmer软件全盘格式化来解决。不知道问题出在哪里。