赞
踩
注意:F0F1系列和F4系列的Flash读写操作不相同


本例程使用的是F411CEU6的型号芯片

1.基本操作:
void FlashErase(void)
{
int sect = 0;
HAL_FLASH_Unlock();//解锁
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);//清除一些错误标志
FLASH_Erase_Sector(1,FLASH_VOLTAGE_RANGE_3);//擦除指定的闪存扇区1(0x08004000~0x08007FFF)
HAL_FLASH_Lock();//上锁
}
2.由开始地址计算出所在的扇区位置:
//F411CEU6 512k 8个扇区 uint32_t sectStartAddr[8]= { 0x08000000,//0 0x08004000,//1 0x08008000,//2 0x0800c000,//3 0x08010000,//4 0x08020000,//5 0x08040000,//6 0x08060000 //7 }; //获取Sector的编号 int GetSectorFromAddress(uint32_t address) { int sect; if( address < 0x08000000 || address > 0x0807FFFF ) return -1; for( int i=0; i<8; i++ ) { if( address >= sectStartAddr[i] && address < sectStartAddr[i+1] ) { sect = i; break; } } return sect; } //清除扇区 //StartAddress:取值范围(0x08000000~0x0807FFFF) void FlashErase(uint32_t StartAddress) { int sect = 0; HAL_FLASH_Unlock();//解锁 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);//清除一些错误标志 sect = GetSectorFromAddress(StartAddress);//获取地址所在的扇区 FLASH_Erase_Sector(sect,FLASH_VOLTAGE_RANGE_3);//擦除指定的闪存扇区(0~7) HAL_FLASH_Lock();//上锁 }

代码如下(32位数据写入,可以改成8/16/32/64位):
//写数据
void FlashWrite(uint32_t StartAddress,uint32_t data)
{
//可以添加一些 StartAddress地址 是否有效的判断
HAL_FLASH_Unlock();//解锁
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,StartAddress,data);
HAL_FLASH_Lock();//上锁
}

代码如下(示例):
//读数据
uint32_t FlashRead(uint32_t StartAddress)
{
return *(uint32_t *)StartAddress;
}
读取数据比较简单,直接返回地址的值就可以了

Flash的擦除和写都需要进行 解锁 操作完了别忘记 上锁
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。