pstd2/User/App/flash.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;
}