stm32 - 如何写入STM32 Flash
问题描述
我想从我的用户代码写入 STM32F407VGT 的闪存扇区 11 以存储一些数据。我用过stm32f4xx_hal_flash.c
图书馆。我首先使用以下代码擦除扇区:
void Flash_Init(void)
{
FLASH_EraseInitTypeDef pEraseInit;
pEraseInit.Banks = FLASH_BANK_1;
pEraseInit.NbSectors = 1;
pEraseInit.Sector = FLASH_SECTOR_10;
pEraseInit.VoltageRange = FLASH_VOLTAGE_RANGE_3;
pEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;
if(HAL_FLASH_Unlock() == HAL_OK)
{
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR );
HAL_FLASHEx_Erase(&pEraseInit,0);
HAL_FLASH_Lock();
}
}
程序在到达HAL_FLASHEx_Erase(&pEraseInit,0);
函数时挂起。我的分散文件如下所示:
LR_IROM1 0x08000000 0x01000000 { ; load region size_region
ER_IROM1 0x08000000 0x01000000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00020000 { ; RW data
.ANY (+RW +ZI)
}
RW_IRAM2 0x10000000 0x00010000 {
.ANY (+RW +ZI)
}
}
我必须先做些什么才能让这个功能起作用吗?
解决方案
您想写入扇区 11,但您的 pEraseInit.Sector 变量在您的 init 函数中是 FLASH_SECTOR_10 。所以你应该把 FLASH_SECTOR_10 改成 FLASH_SECTOR_11。此外,如果您使用 CubeMX,您可以尝试在没有 init 功能的情况下执行写入和读取功能。
uint32_t flash_read(uint32_t address){
return *(uint32_t*)address;
}
void flash_write(uint32_t address, uint32_t data){
HAL_FLASH_Unlock();
FLASH_Erase_Sector(FLASH_SECTOR_11,VOLTAGE_RANGE_1);
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,address,data);
HAL_FLASH_Lock();
}
推荐阅读
- memory-management - 安全写入两个python进程内的cython c包装器中的变量或python进程的不同内存
- python - 如何对数据帧进行重采样
- java - 调用 EntityManagerFactory 时 JavaFX 窗口停止工作
- ios - NSUserActivity:当用户从我的应用程序的最近日志中点击(或拨打电话)时,将调用哪个方法?
- linkedin - linkedin 应用验证状态显示 Review in Progress
- reactjs - 反应表搜索过滤器在控制台窗口上工作,但在反应表中它不显示过滤器数据
- angular - 当我使用 MatDialog 时,ngOnInit 只会在第一次触发。为什么?
- amazon-web-services - 使用 IAM 限制 AWS 云资源和用户
- google-pagespeed - 灯塔返回错误:ERRORED_DOCUMENT_REQUEST
- c - Azure 球体错误“id 返回 1 退出状态”