初级会员

- 积分
- 67
- 金钱
- 67
- 注册时间
- 2021-8-9
- 在线时间
- 16 小时
|
1金钱
本帖最后由 黑夜难掩星芒 于 2022-12-2 18:32 编辑
做的是一个用flash模拟eeprom的实验。在运行到HAL_FLASH_Program函数里面时就会跳转到flasherror,具体位置在下图所示:
试过将要写入的数据加一个attribute,地址对齐之类的操作,都没什么效果,求解
#define FLASH_OP_ADDR (uint32_t)0x080E0000
#define FLASH_SECTOR_NUM 7 //H723
#define FLASH_WAIT_TIME 50000
uint32_t USER_FLASH_Read(uint32_t faddr) //读flash的数据
{
return *(__IO uint32_t*)faddr;
}
void USER_FLASH_Program(uint32_t faddr, uint32_t data)
{
HAL_FLASH_Unlock(); //解锁
FLASH_WaitForLastOperation(FLASH_WAIT_TIME, FLASH_BANK_1); //等待上一次操作完成
HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, faddr, data); //往对应地址写数据
FLASH_WaitForLastOperation(FLASH_WAIT_TIME, FLASH_BANK_1);
HAL_FLASH_Lock(); //上锁
}
void USER_FLASH_Erase_Sector(uint8_t Sector_Number)
{
FLASH_EraseInitTypeDef FLASH_Erase_Init;
uint32_t Sector_Error = 0;
HAL_FLASH_Unlock();
FLASH_WaitForLastOperation(FLASH_WAIT_TIME, FLASH_BANK_1);
FLASH_Erase_Init.Sector = Sector_Number; //要擦除的哪一扇区
FLASH_Erase_Init.NbSectors = 1; //擦除扇区的个数
FLASH_Erase_Init.TypeErase = FLASH_TYPEERASE_SECTORS ; //擦除扇区模式
FLASH_Erase_Init.VoltageRange = FLASH_VOLTAGE_RANGE_3; //电压范围
HAL_FLASHEx_Erase(&FLASH_Erase_Init, &Sector_Error); //擦除操作
FLASH_WaitForLastOperation(FLASH_WAIT_TIME, FLASH_BANK_1);
HAL_FLASH_Lock();
}
//主函数的内容
uint32_t a = 123;
uint32_t b = 0;
USER_FLASH_Erase_Sector(FLASH_SECTOR_7);
USER_FLASH_Program(FLASH_OP_ADDR, a);
b = USER_FLASH_Read(FLASH_OP_ADDR);
printf("b=%d\r\n",b);
这是H723ZG的flash分布图
|
最佳答案
查看完整内容[请看2#楼]
解决了,原来是HAL_FLASH_Program()函数的第三个参数dataaddress的问题,这个参数需要传入的是需要写入数据的地址(注意不是指针),然后再强制转换为uint32_t的形式。即(uint32_t)(&(数据)),并且这个函数对于H723ZG来说会一次性写入256bit数据。太坑爹了这函数,你一个数据地址为什么不弄成指针的形式。。。
|