尝试管理 STM32F4 微控制器中的内部闪存时,我走到了死胡同。有很多示例,但大多数都使用 SPL API 或低级寄存器操作。我正在使用 HAL 库。而且我找不到只擦除一页的功能(在stm32f4xx_hal_flash.c
和中stm32f4xx_hal_flash_ex.c
)。建议的功能,例如HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError)
或void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange)
不允许您仅擦除一页(2048 kByte)但仅擦除整个扇区(或扇区)。当我尝试使用类似的东西时:
void Internal_Flash_Erase(unsigned int pageAddress) {
while (FLASH->SR & FLASH_SR_BSY);
if (FLASH->SR & FLASH_SR_EOP) {
FLASH->SR = FLASH_SR_EOP;
}
FLASH->CR |= FLASH_CR_PER;
FLASH->AR = pageAddress;
FLASH->CR |= FLASH_CR_STRT;
while (!(FLASH->SR & FLASH_SR_EOP));
FLASH->SR = FLASH_SR_EOP;
FLASH->CR &= ~FLASH_CR_PER;
}
发生编译器错误,因为FLASH->AR
HAL 中没有(地址寄存器)。我发现阅读了RM0090 参考手册,现在我需要使用FLASH->CR
AR 并设置位FLASH_CR_SNB [3:6]
来选择扇区号。
现在我不知道如何只擦除一页。int8_t STORAGE_Write_FS (uint8_t lun,
uint8_t *buf,
uint32_t blk_addr,
uint16_t blk_len)
有必要在内部闪存中为该功能创建一个大容量存储设备:
usbd_storage_if.c
将 USB 堆栈调用转换为内部闪存。