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);
}
调用结果如下: