初级会员

- 积分
- 68
- 金钱
- 68
- 注册时间
- 2019-9-9
- 在线时间
- 20 小时
|

楼主 |
发表于 2022-2-22 17:22:58
|
显示全部楼层
对页的操作原函数如下:STM32G0系列对字节写入改成了64位写一次,不知道为什么这样操作,有点坑,
并且看到一位前辈说,STM32G0无法重复的写内存,如果第一次在内存中写入0xFF后,没有进行擦除操作是没法继续写入的,
所以在操作中加了擦除操作,就出现了上述的问题, HAL库提供的擦除函数 ,一擦出直接返回erro,看了其他F系列芯片好像没这个问题
void STMFLASH_Write(u32 WriteAddr,uint64_t *pBuffer,int WordSize)
{
static u32 u32sector_addr; //扇区地址
u32 u32retain_addr;
u32 u32flash_err = 0;
u16 i;
u32 offaddr; //去掉0X08000000后的地址
FLASH_EraseInitTypeDef flash_init;
HAL_StatusTypeDef flash_status;
if(WriteAddr<STM32_ADDR_FLASH_SECTOR_0||(WriteAddr>=(STM32_ADDR_FLASH_SECTOR_0+1024*STM32_FLASH_SIZE)))return;//非法地址
HAL_FLASH_Unlock(); //解锁
offaddr=WriteAddr-STM32_ADDR_FLASH_SECTOR_0; //实际偏移地址.
u32retain_addr= offaddr/STM_SECTOR_SIZE; //扇区地址 0~63 for STM32G031
if(u32sector_addr != u32retain_addr)
{
u8FlashErase_Flag = 1;
u32sector_addr = u32retain_addr;
}
if(u8FlashErase_Flag) //需要擦除
{
u8FlashErase_Flag = 0;
u32sector_addr = u32sector_addr*0x800 + STM32_ADDR_FLASH_SECTOR_0;
flash_init.TypeErase = FLASH_TYPEERASE_PAGES;
flash_init.Banks = FLASH_BANK_1;
flash_init.Page = u32sector_addr;
flash_init.NbPages = 1;
flash_status = HAL_FLASHEx_Erase(&flash_init, &u32flash_err); //擦除这个扇区
if(flash_status != HAL_OK)
{
printf("flash = %d \r\n",u32flash_err);
}
}
for(i = 0; i< WordSize; i++ )
{
if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, WriteAddr+(i*8), pBuffer[i]) != HAL_OK) //一次写入64字节
{
printf("写入异常!\r\n");
}
}
HAL_FLASH_Lock(); //上锁
}
|
|