STM32 flash读写实验

芯片信号:STM32F072

流程:页擦除->写flash->读flash

1.页擦除

void Flash_ErasePage(uint32_t ulStartPage,uint8_t ucNmbPage)
{
  FLASH_EraseInitTypeDef ErasePageSt; 
  uint32_t PageError = 0;
    
  /* Fill EraseInit structure*/
  ErasePageSt.TypeErase   = FLASH_TYPEERASE_PAGES;
  ErasePageSt.PageAddress = ulStartPage;
  ErasePageSt.NbPages     = ucNmbPage;
  
  HAL_FLASH_Unlock();
  __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR|FLASH_FLAG_PGERR);    
  while (HAL_FLASHEx_Erase(&ErasePageSt, &PageError) != HAL_OK)
	{
    HAL_FLASH_Unlock();
    __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR|FLASH_FLAG_PGERR);
  }    
  HAL_FLASH_Lock();
}

2.按字节(8位)写

bool Flash_ByteWrite(uint32_t WriteAddr,uint8_t *pBuffer,uint8_t ByteNumToWrite)
{
	  uint16_t i = 0;
	  uint16_t Data = 0;
	  uint32_t Addr = 0;
	  uint16_t HalfWordNum = 0;
	
	  if(ByteNumToWrite % 2 == 0)
		{
		  HalfWordNum = ByteNumToWrite / 2;
		}
		else
		{
		  HalfWordNum = ByteNumToWrite / 2 + 1;
		}

    HAL_FLASH_Unlock();
		
		for(i = 0;i < HalfWordNum;i++)
		{
			Data = (*(pBuffer + i * 2 + 1) << 8) | *(pBuffer + i * 2);
			Addr = WriteAddr + 2 * i;
			HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,Addr,Data);
		}
	
    HAL_FLASH_Lock();
  
    return true;
}

3.按半字(16位)写

bool Flash_HalfWordWrite(uint32_t WriteAddr, uint16_t *pBuffer, uint32_t HalfWordNum)
{
	  uint16_t i = 0;

    HAL_FLASH_Unlock();
		
		for(i = 0;i < HalfWordNum;i++)
		{
			HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,WriteAddr + i * 2,*(pBuffer + i));
		}
	
    HAL_FLASH_Lock();
  
    return true;
}

4.按字节(8位)读

void Flash_ByteRead(uint32_t ReadAddr, uint8_t *pBuffer, uint32_t ByteNumToRead)   	
{
  uint32_t i = 0;
  
  for(i = ReadAddr; i<(ReadAddr+ByteNumToRead); i++)
  {
    pBuffer[i-ReadAddr] = *(__IO uint8_t *)i;
  }
}

5.读写实验

uint8_t i = 0;
void flashReadWriteTest(void)
{
	if(i == 0)
	{
	  Flash_ErasePage(0x08008000,1);
		
	  Flash_HalfWordWrite(0x08008000,(uint16_t*)&gg,4);
	  //Flash_ByteWrite(0x08008000,(uint8_t*)&gg,8);
	  Flash_ByteRead(0x08008000,(uint8_t*)&gg1,8);
	  i =1;
	}
}

实验结果

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值