解决stm32f103同一个扇区flash只能擦除一次,再次擦除报FLASH_ERROR_PG错误问题

项目中用到stm32内部flash存储一些系统运行数据,每次上电重新加载保存的数据。早先用法如下图所示,擦除之前每次要关闭总中断,解锁flash,擦除对应扇区,然后写入数据。

	__disable_irq();									//关总中断
	FLASH_Unlock();										//解锁
	

	
	FLASH_ErasePage(STM32_FLASH_BASE);//擦除起始扇区

	for(i = 0;i<12;i++)
	{
		                     FLASH_ProgramHalfWord(STM_IDADDR+i*2,pBuffer[i]);   					  				
	}
	
	FLASH_ProgramHalfWord(STM_SETADDR,SET_FLAG);   					  				

	

	FLASH_Lock();//上锁	
	__enable_irq() ;									//开总中断

如果每次系统运行只保存一次数据,那么程序可以正常运行,由于后期更改需求,系统参数需要动态保存,这样就引出发现的问题同一个扇区flash只能擦除一次,再次擦除报FLASH_ERROR_PG错误。经过多番折腾查找资料,终于发现了问题,每次擦除时没有清除标志位,导致每次上电只能擦写一次。每次擦除写入前加入清除标志位

    FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);

 

即可解决问题修改后程序如下。

	__disable_irq();									//关总中断
	FLASH_Unlock();										//解锁
	
	FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); 
	
	FLASH_ErasePage(STM32_FLASH_BASE);//擦除起始扇区

	for(i = 0;i<12;i++)
	{
		FLASH_ProgramHalfWord(STM_IDADDR+i*2,pBuffer[i]);   					  				
	}
	
	FLASH_ProgramHalfWord(STM_SETADDR,SET_FLAG);   					  				

	

	FLASH_Lock();//上锁	
	__enable_irq() ;									//开总中断

完毕!

你可能感兴趣的:(STM32,ARM,stm32,flash,单片机)