64 lines
1.7 KiB
C
64 lines
1.7 KiB
C
/*
|
|
* @Author: 张小明 zxm5337@163.com
|
|
* @Date: 2024-05-23 11:18:12
|
|
* @LastEditors: 张小明 zxm5337@163.com
|
|
* @LastEditTime: 2024-05-23 11:24:58
|
|
* @FilePath: \Proxi_CheckBoard\User\App\flash.c
|
|
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
|
*/
|
|
#include "flash.h"
|
|
#include "stm32f4xx_hal.h"
|
|
|
|
//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;
|
|
}
|
|
|
|
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();//上锁
|
|
}
|
|
|
|
void FlashWrite(uint32_t StartAddress,uint32_t data)
|
|
{
|
|
HAL_FLASH_Unlock();//解锁
|
|
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,StartAddress,data);
|
|
HAL_FLASH_Lock();//上锁
|
|
}
|
|
|
|
uint32_t FlashRead(uint32_t StartAddress)
|
|
{
|
|
return *(uint32_t *)StartAddress;
|
|
}
|