我是靠谱客的博主 落寞石头,最近开发中收集的这篇文章主要介绍STM32-OTA(三)读写FLASH读写FLASH,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

读写FLASH

1. 简述

STM32的写FLASH相对简单,直接读即可,写FLASH相对复杂。首先看STM32的内存大小和分配。

用到的HAL库函数:

HAL_StatusTypeDef HAL_FLASH_Unlock(void);
HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError);
HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout);
HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data);
HAL_StatusTypeDef HAL_FLASH_Lock(void);

2. 读写FLASH代码

#define STM32_FLASH_BASE 0x08000000

/* 获取扇区号 */
static uint8_t bsp_flash_get_sector(uint32_t addr)
{
	if (addr < ADDR_FLASH_SECTOR_1)       return FLASH_SECTOR_0;
	else if (addr < ADDR_FLASH_SECTOR_2)  return FLASH_SECTOR_1;
	else if (addr < ADDR_FLASH_SECTOR_3)  return FLASH_SECTOR_2;
	else if (addr < ADDR_FLASH_SECTOR_4)  return FLASH_SECTOR_3;
	else if (addr < ADDR_FLASH_SECTOR_5)  return FLASH_SECTOR_4;
	else if (addr < ADDR_FLASH_SECTOR_6)  return FLASH_SECTOR_5;
	else if (addr < ADDR_FLASH_SECTOR_7)  return FLASH_SECTOR_6;
	else if (addr < ADDR_FLASH_SECTOR_8)  return FLASH_SECTOR_7;
	else if (addr < ADDR_FLASH_SECTOR_9)  return FLASH_SECTOR_8;
	else if (addr < ADDR_FLASH_SECTOR_10) return FLASH_SECTOR_9;
	else if (addr < ADDR_FLASH_SECTOR_11) return FLASH_SECTOR_10;   
	return FLASH_SECTOR_11;	
}

/* 读FLASH */
uint32_t bsp_flash_read(uint32_t addr)
{
	return *(__IO uint32_t*)(addr);
}

/* 写FLASH */
void bsp_flash_write(uint32_t addr)
{
	FLASH_EraseInitTypeDef f;
	uint32_t sector_error=0;
	uint32_t start_addr = addr;
	uint32_t end_addr = start_addr + (size * 4);
	
	/* 1. 判断地址合法 */
	if ((start_addr < STM32_FLASH_BASE) || (addr % 4)) return;
	
	/* 2. 解锁 */
	HAL_FLASH_Unlock(); 
	
	/* 3. 擦除 */
	if (addr < 0x1FFF0000) 
	{
		while (addr < end_addr) 
		{
			if (hal_flash_read(addr) != 0XFFFFFFFF) 
			{
				f.TypeErase = FLASH_TYPEERASE_SECTORS;
				f.Sector = hal_flash_get_sector(addr);
				f.NbSectors = 1;
				f.VoltageRange = FLASH_VOLTAGE_RANGE_3;
				if (HAL_FLASHEx_Erase(&f, &sector_error)!=HAL_OK) break;
			} 
			else addr += 4;     
			FLASH_WaitForLastOperation(50000);
		}
	}
	
	/* 4. 写入 */
	addr = start_addr;
	while (addr < end_addr) 
	{
		if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, *data) != HAL_OK) break;	
		addr += 4;
		data++;
	}
	
	/* 5. 上锁 */
	HAL_FLASH_Lock();    
}

最后

以上就是落寞石头为你收集整理的STM32-OTA(三)读写FLASH读写FLASH的全部内容,希望文章能够帮你解决STM32-OTA(三)读写FLASH读写FLASH所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部