STM32 HAL FLASH 读写例程

//FLASH写入数据测试
void Flash_WriteData(uint32_t addr,uint16_t *data,uint16_t Size)
{
    //1、解锁FLASH
  HAL_FLASH_Unlock();

    //2、擦除FLASH
    //初始化FLASH_EraseInitTypeDef
    FLASH_EraseInitTypeDef f;
    f.TypeErase = FLASH_TYPEERASE_PAGES;
    f.PageAddress = addr;
    f.NbPages = 1;
    //设置PageError
    uint32_t PageError = 0;
    //调用擦除函数
    HAL_FLASHEx_Erase(&f, &PageError);

    //3、对FLASH烧写
	  uint32_t TempBuf = 0;
	  for(uint32_t i = 0;i< Size ;i++)
	 {
		 TempBuf = ~(*(data+i));
		 TempBuf <<= 16;
		 TempBuf += *(data+i); //取反校验
		 HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD , addr + i * 4, TempBuf);
	 }
  
    //4、锁住FLASH
  HAL_FLASH_Lock();
}

//FLASH读取数据测试,成功返回1
uint8_t Flash_ReadData(uint32_t addr,uint16_t *data,uint16_t Size)
{
  uint32_t temp;
	uint8_t result = 1;
  for(uint32_t i = 0;i< Size ;i++)
	{
			temp = *(__IO uint32_t*)(addr + i * 4);
		  if((uint16_t)temp == (uint16_t)(~(temp>>16)))
			{
				*(data+i) = (uint16_t)temp;
			}
			else
			{
				result = 0;
			}
	}
  return result;
}


以下是基于STM32 HAL库的Flash读写一个字节的例程: ```c #include "stm32f4xx_hal.h" #define FLASH_USER_START_ADDR ADDR_FLASH_SECTOR_5 //Flash起始地址 #define FLASH_USER_END_ADDR ADDR_FLASH_SECTOR_5 + FLASH_SECTOR_SIZE -1 //Flash结束地址 #define FLASH_PAGE_SIZE ((uint32_t)0x400) //Flash页大小 #define FLASH_TIMEOUT ((uint32_t)0xFFFF) //Flash操作超时时间 /* Flash读一个字节 */ uint8_t Flash_ReadByte(uint32_t addr) { return (*(__IO uint8_t*)addr); } /* Flash写一个字节 */ HAL_StatusTypeDef Flash_WriteByte(uint32_t addr, uint8_t data) { HAL_StatusTypeDef status = HAL_OK; /* 使能Flash写入 */ status = HAL_FLASH_Unlock(); if(status != HAL_OK) { return status; } /* 擦除要写入的页 */ uint32_t page_error = 0; FLASH_Erase_Sector(FLASH_SECTOR_5, FLASH_VOLTAGE_RANGE_3); status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, addr, data); if(status != HAL_OK) { return status; } /* 禁止Flash写入 */ status = HAL_FLASH_Lock(); return status; } int main(void) { HAL_Init(); __HAL_RCC_FLASH_CLK_ENABLE(); uint8_t data = 0xAA; uint8_t read_data = 0; /* 写入数据 */ Flash_WriteByte(FLASH_USER_START_ADDR, data); /* 读取数据 */ read_data = Flash_ReadByte(FLASH_USER_START_ADDR); while(1) { /* 业务逻辑处理 */ } return 0; } ``` 需要注意的是,Flash的写入需要先擦除对应的Flash页,因此在写入之前需要调用`FLASH_Erase_Sector()`函数擦除要写入的Flash页。同时,在写入之前需要先调用`HAL_FLASH_Unlock()`函数使能Flash写入,在写入完成后需要调用`HAL_FLASH_Lock()`函数禁止Flash写入。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值