【发布时间】:2017-08-05 23:40:15
【问题描述】:
我在尝试管理 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;
}
发生编译器错误,因为 HAL 中没有 FLASH->AR(地址寄存器)。
我发现阅读了RM0090 Reference manual,现在我需要使用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)
in usbd_storage_if.c 将 USB 堆栈调用转换为内部闪存。
【问题讨论】:
-
闪存的最小可擦除大小是一个扇区......
标签: c gcc stm32 hal usb-mass-storage