STM32出现flash编程错误如何解决

出错类型分析

  1. FLASH_BUSY

  2. 值:1

  3. 解释:闪存正在忙于执行一个操作,无法立即开始新的操作。

  4. FLASH_ERROR_RD

  5. 值:2

  6. 解释:闪存读取错误。可能由于硬件故障或不正确的操作导致。

  7. FLASH_ERROR_PGS

  8. 值:3

  9. 解释:闪存编程顺序错误。可能由于不正确的编程顺序或步骤导致。

  10. FLASH_ERROR_PGP

  11. 值:4

  12. 解释:闪存编程 parallelism 错误。可能由于并行编程设置不正确导致。

  13. FLASH_ERROR_PGA

  14. 值:5

  15. 解释:闪存编程对齐错误。可能由于编程地址未对齐导致。

  16. FLASH_ERROR_WRP

  17. 值:6

  18. 解释:闪存写保护错误。可能由于尝试写入受保护的区域导致。

  19. FLASH_ERROR_PROGRAM

  20. 值:7

  21. 解释:闪存编程错误。可能由于编程数据错误或硬件故障导致。

  22. FLASH_ERROR_OPERATION

  23. 值:8

  24. 解释:闪存操作错误。可能由于不正确的操作或参数导致。

  25. FLASH_COMPLETE

  26. 值:9

  27. 解释:闪存操作完成,没有错误。

出现问题可能的原因

  1. 硬件问题

  2. 连接问题:编程器与目标设备(如微控制器、闪存芯片)之间的连接可能不良,导致数据传输错误。

  3. 设备损坏:编程器或目标设备可能存在物理损坏,导致无法正常编程。

  4. 软件问题

  5. 不兼容的软件版本:编程器软件版本可能与目标设备不兼容,导致编程错误。

  6. 错误的配置:编程器软件的配置可能不正确,例如选择了错误的设备型号或错误的编程选项。

  7. 软件bug:编程器软件本身可能存在bug,导致编程过程中出现错误。

  8. 目标设备问题

  9. 写保护:目标设备可能处于写保护状态,阻止对其进行编程。

  10. 擦除问题:在编程之前,目标设备可能没有正确擦除,导致新的数据无法写入。

  11. 设备锁定:某些设备可能被锁定,需要特定的解锁步骤才能进行编程。

  12. 电源问题

  13. 电源不稳定:编程过程中,电源不稳定可能导致数据传输错误或设备损坏。

  14. 环境因素

  15. 电磁干扰:周围环境中的电磁干扰可能影响数据传输的稳定性。

由于本人使用设备之前代码都可以正常读写,所以问题1、2、4、5问题先排除掉

出错的源码

void PVD_STMFLASH_Noclean_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite)	
{ 
	FLASH_Status status = FLASH_COMPLETE;
	uint32_t endaddr=0;	
	if(WriteAddr < STM32_FLASH_BASE || WriteAddr % 4)return;	//非法地址
	FLASH_Unlock();									//解锁 
	FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存
	endaddr=WriteAddr+NumToWrite*4;	//写入的结束地址
	if(status == FLASH_COMPLETE)
	{
		while(WriteAddr<endaddr)//写数据
		{
			if(FLASH_ProgramWord(WriteAddr,*pBuffer)!=FLASH_COMPLETE)//写入数据
			{ 
				break;	//写入异常
			}
			WriteAddr+=4;
			pBuffer++;
		}
	}
	FLASH_DataCacheCmd(ENABLE);	//FLASH擦除结束,开启数据缓存
	FLASH_Lock();//上锁
} 

 乍一看没什么问题,但是Debug时一直出现FLASH_ProgramWord(WriteAddr,*pBuffer)返回flash_error_program的问题,结合前面几种问题分析:

  • 读保护? FLASH_Unlock();    这里已经解锁,那么不应该有读保护
  • 擦除问题?通过Memory可以查看,要写入的内存全部都是0xFF,是允许写入的
  • 设备锁定?不存在,因为我并没有加锁
  • 那么问题究竟在哪?

    正确代码

    void PVD_STMFLASH_Noclean_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite)	
    { 
    	FLASH_Status status = FLASH_COMPLETE;
    	uint32_t endaddr=0;	
    	if(WriteAddr < STM32_FLASH_BASE || WriteAddr % 4)return;	//非法地址
    	FLASH_Unlock();									//解锁 
    	FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR |FLASH_FLAG_WRPERR |FLASH_FLAG_PGAERR |FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR | FLASH_FLAG_BSY| FLASH_FLAG_RDERR);
    	FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存
    	endaddr=WriteAddr+NumToWrite*4;	//写入的结束地址
    	if(status == FLASH_COMPLETE)
    	{
    		while(WriteAddr<endaddr)//写数据
    		{
    			if(FLASH_ProgramWord(WriteAddr,*pBuffer)!=FLASH_COMPLETE)//写入数据
    			{ 
    				break;	//写入异常
    			}
    			WriteAddr+=4;
    			pBuffer++;
    		}
    	}
    	FLASH_DataCacheCmd(ENABLE);	//FLASH擦除结束,开启数据缓存
    	FLASH_Lock();//上锁
    } 

    结果:标志位没有清除,导致程序错误,到此问题结束,程序运行正常。

    FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR |FLASH_FLAG_WRPERR |FLASH_FLAG_PGAERR |FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR | FLASH_FLAG_BSY| FLASH_FLAG_RDERR);

    代码呈上

    作者:小张张张!!

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32出现flash编程错误如何解决

    发表回复