/* Includes ----------------------------------------------------------------- */ #include "bsp/flash.h" #include #include /* Private define ----------------------------------------------------------- */ /* Private macro ------------------------------------------------------------ */ /* Private typedef ---------------------------------------------------------- */ /* Private variables -------------------------------------------------------- */ /* Private function -------------------------------------------------------- */ /* Exported functions ------------------------------------------------------- */ /// @brief 擦除指定的Flash扇区 /// @param sector 扇区编号,0~7对应Bank1的扇区 void BSP_Flash_EraseSector(uint32_t sector) { FLASH_EraseInitTypeDef flash_erase; uint32_t sector_error; // 仅支持sector 0~7,属于Bank1 if (sector < 8) { flash_erase.TypeErase = FLASH_TYPEERASE_SECTORS; flash_erase.Banks = FLASH_BANK_1; flash_erase.Sector = sector; flash_erase.NbSectors = 1; flash_erase.VoltageRange = FLASH_VOLTAGE_RANGE_3; HAL_FLASH_Unlock(); FLASH_WaitForLastOperation(HAL_MAX_DELAY, FLASH_BANK_1); HAL_FLASHEx_Erase(&flash_erase, §or_error); HAL_FLASH_Lock(); } } /// @brief 写入指定地址的字节数据到Flash /// @param address Flash地址,必须是32字节对齐 /// @param buf 指向要写入的数据缓冲区 /// @param len 要写入的字节数,必须是32的倍数 void BSP_Flash_WriteBytes(uint32_t address, const uint8_t *buf, size_t len) { HAL_FLASH_Unlock(); while (len > 0) { uint8_t flash_word[32]; size_t write_len = (len >= 32) ? 32 : len; memset(flash_word, 0xFF, 32); memcpy(flash_word, buf, write_len); // 地址需32字节对齐 uint32_t aligned_addr = address & ~0x1F; HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, aligned_addr, (uint32_t)flash_word); address += write_len; buf += write_len; len -= write_len; } HAL_FLASH_Lock(); } /// @brief 从指定地址读取字节数据到缓冲区 /// @param address Flash地址,必须是32字节对齐 /// @param buf 指向要读取数据的缓冲区 /// @param len 要读取的字节数,必须是32的倍数 void BSP_Flash_ReadBytes(uint32_t address, void *buf, size_t len) { memcpy(buf, (void *)address, len); }