STMF103C8T6 && H7B0VBT6 Flash记录

STM32F103C8T6
flash大小为64KB
在这里插入图片描述
在这里插入图片描述
建立flash.h flash.c文件

flash.h内容如下

#ifndef FLASH_H
#define FLASH_H

#include "stm32f1xx_hal.h"

typedef enum{
	Page0 =  0x08000000,Page1 =  0x08000400,Page2 =  0x08000800,Page3 =  0x08000C00,Page4 =  0x08001000,
	Page5 =  0x08001400,Page6 =  0x08001800,Page7 =  0x08001C00,Page8 =  0x08002000,Page9 =  0x08002400,
	Page10 = 0x08002800,Page11 = 0x08002C00,Page12 = 0x08003000,Page13 = 0x08003400,Page14 = 0x08003800,
	Page15 = 0x08003C00,Page16 = 0x08004000,Page17 = 0x08004400,Page18 = 0x08004800,Page19 = 0x08004C00,
	Page20 = 0x08005000,Page21 = 0x08005400,Page22 = 0x08005800,Page23 = 0x08005C00,Page24 = 0x08006000,
	Page25 = 0x08006400,Page26 = 0x08006800,Page27 = 0x08006C00,Page28 = 0x08007000,Page29 = 0x08007400,
	Page30 = 0x08007800,Page31 = 0x08007C00,
	/*******************************************/
	Page32 = 0x08008000,Page33 = 0x08008400,Page34 = 0x08008800,Page35 = 0x08008C00,Page36 = 0x08009000,
	Page37 = 0x08009400,Page38 = 0x08009800,Page39 = 0x08009C00,Page40 = 0x0800A000,Page41 = 0x0800A400,
	Page42 = 0x0800A800,Page43 = 0x0800AC00,Page44 = 0x0800B000,Page45 = 0x0800B400,Page46 = 0x0800B800,
	Page47 = 0x0800BC00,Page48 = 0x0800C000,Page49 = 0x0800C400,Page50 = 0x0800C800,Page51 = 0x0800CC00,
	Page52 = 0x0800D000,Page53 = 0x0800D400,Page54 = 0x0800D800,Page55 = 0x0800DC00,Page56 = 0x0800E000,
	Page57 = 0x0800E400,Page58 = 0x0800E800,Page59 = 0x0800EC00,Page60 = 0x0800F000,Page61 = 0x0800F400,
	Page62 = 0x0800F800,Page63 = 0x0800FC00
}Flash_page_t;

uint16_t FlashRead_HalfWord(Flash_page_t addr,uint32_t next);
void FlashWrite_HalfWord(Flash_page_t addr,uint16_t *data,uint16_t count);
#endif

flash.c如下:

#include "flash.h"

/*
	@param  next:表示读取下一个16位数据
*/
uint16_t FlashRead_HalfWord(Flash_page_t addr,uint32_t next){
	return  *((uint16_t*)(addr + next*2));
}

/*
 @param count表示写入几个16位数据
*/
void FlashWrite_HalfWord(Flash_page_t addr,uint16_t *data,uint16_t count){
	FLASH_EraseInitTypeDef erase;
	erase.NbPages = 1;
	erase.PageAddress = addr;
	erase.TypeErase = FLASH_TYPEERASE_PAGES;
	uint32_t err = 0;
	uint16_t  j = 0;
	
	//解锁
	if(HAL_FLASH_Unlock() != HAL_OK) return;
		FLASH_WaitForLastOperation(0xffff);
	//擦除
	if(HAL_FLASHEx_Erase(&erase,&err) != HAL_OK) return;
		FLASH_WaitForLastOperation(0xffff);
	//写入
	for(;j<count;j++){
		if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,addr + 2*j,*data) != HAL_OK) return; 		
		FLASH_WaitForLastOperation(0xffff);
		data++;
	}	
	//上锁
	if(HAL_FLASH_Lock() != HAL_OK) return;
	FLASH_WaitForLastOperation(0xffff);
}

调用:

uint16_t buf[] = {123,456,789,6514};
FlashWrite_HalfWord(Page63,(uint16_t*)buf,sizeof(buf));

printf("flash Page63 %d\r\n",FlashRead_HalfWord(Page63,0));
printf("flash Page63 %d\r\n",FlashRead_HalfWord(Page63,1));
printf("flash Page63 %d\r\n",FlashRead_HalfWord(Page63,2));
printf("flash Page63 %d\r\n\r\n",FlashRead_HalfWord(Page63,3));

结果
在这里插入图片描述

STM32H7B0VBT6
在这里插入图片描述
flash大小128KB
flash.h如下:

#ifndef FLASH_H
#define FLASH_H
#include "stm32h7xx_hal.h"

typedef enum {
	Sector0 = 0x08000000,	
	Sector1 = 0x08002000,	
	Sector2 = 0x08004000,
	Sector3 = 0x08006000,
	Sector4 = 0x08008000,
	Sector5 = 0x0800A000,
	Sector6 = 0x0800C000,
	Sector7 = 0x0800E000,
	Sector8 = 0x08010000,
	Sector9 = 0x08012000,
	Sector10 = 0x08014000,
	Sector11 = 0x08016000,
	Sector12 = 0x08018000,
	Sector13 = 0x0801A000,
    Sector14 = 0x0801C000,
    Sector15 = 0x0801E000
}Flash_Setctor_t;
uint16_t FlashRead_HalfWord(Flash_Setctor_t addr,uint32_t offset);
void FlashWrite_HalfWord(Flash_Setctor_t addr,uint32_t *data);
#endif

Flash分布图
在这里插入图片描述
flash.c如下:

#include "flash.h"

uint16_t FlashRead_HalfWord(Flash_Setctor_t addr,uint32_t offset){
	return    *(uint16_t*)(addr + offset*2);
}

void FlashWrite_HalfWord(Flash_Setctor_t addr,uint32_t *data){
	FLASH_EraseInitTypeDef   erase;
	erase.Banks = FLASH_BANK_1;			//擦除bank1
	erase.NbSectors = 1;				//擦除一个扇区就行
	
//	erase.Sector = FLASH_SECTOR_7;		//擦除第7个扇区
	erase.Sector = (addr - Sector0)/1024/8;	//计算这是第几个扇区
	
	erase.TypeErase = FLASH_TYPEERASE_SECTORS; //按照sector擦除
	//erase.VoltageRange = FLASH_PSIZE_HALF_WORD;  
	uint32_t SectorError = 0;

	if(HAL_FLASHEx_Unlock_Bank1() != HAL_OK) return;
	 FLASH_WaitForLastOperation(0xffff,FLASH_BANK_1);
	
	if(HAL_FLASHEx_Erase(&erase,&SectorError) != HAL_OK) return;
	 FLASH_WaitForLastOperation(0xffff,FLASH_BANK_1);

	if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD,addr,(uint32_t)data)) return;
	 FLASH_WaitForLastOperation(0xffff,FLASH_BANK_1);

	if(HAL_FLASHEx_Lock_Bank1() != HAL_OK) return;
	 FLASH_WaitForLastOperation(0xffff,FLASH_BANK_1);
}

在这里插入图片描述

在这里插入图片描述

调用结果如下:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ho_Yim

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值