/* * @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; }