Stm32F401RCT6内部FLASH数据擦除读写方法

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的,不能单独删除某个字节的。
Stm32F401RCT6内部FLASH数据擦除读写方法_第1张图片
该芯片的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。
不过最后还存在一个严重的问题未解决:
在格式化后,想再次刷写数据产生错误:
Stm32F401RCT6内部FLASH数据擦除读写方法_第2张图片
目前还没有想出方法解决,只能重新用programmer软件全盘格式化来解决。不知道问题出在哪里。

你可能感兴趣的:(stm32,嵌入式硬件,单片机)