STM32出现flash_error_program问题

出错类型分析

  1. FLASH_BUSY

    • 值:1

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

  2. FLASH_ERROR_RD

    • 值:2

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

  3. FLASH_ERROR_PGS

    • 值:3

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

  4. FLASH_ERROR_PGP

    • 值:4

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

  5. FLASH_ERROR_PGA

    • 值:5

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

  6. FLASH_ERROR_WRP

    • 值:6

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

  7. FLASH_ERROR_PROGRAM

    • 值:7

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

  8. FLASH_ERROR_OPERATION

    • 值:8

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

  9. FLASH_COMPLETE

    • 值:9

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

出现问题可能的原因

  1. 硬件问题

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

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

  2. 软件问题

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

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

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

  3. 目标设备问题

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

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

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

  4. 电源问题

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

  5. 环境因素

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

由于本人使用设备之前代码都可以正常读写,所以问题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);

代码呈上

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值