STM32出现flash编程错误如何解决
出错类型分析
-
FLASH_BUSY:
-
值:1
-
解释:闪存正在忙于执行一个操作,无法立即开始新的操作。
-
FLASH_ERROR_RD:
-
值:2
-
解释:闪存读取错误。可能由于硬件故障或不正确的操作导致。
-
FLASH_ERROR_PGS:
-
值:3
-
解释:闪存编程顺序错误。可能由于不正确的编程顺序或步骤导致。
-
FLASH_ERROR_PGP:
-
值:4
-
解释:闪存编程 parallelism 错误。可能由于并行编程设置不正确导致。
-
FLASH_ERROR_PGA:
-
值:5
-
解释:闪存编程对齐错误。可能由于编程地址未对齐导致。
-
FLASH_ERROR_WRP:
-
值:6
-
解释:闪存写保护错误。可能由于尝试写入受保护的区域导致。
-
FLASH_ERROR_PROGRAM:
-
值:7
-
解释:闪存编程错误。可能由于编程数据错误或硬件故障导致。
-
FLASH_ERROR_OPERATION:
-
值:8
-
解释:闪存操作错误。可能由于不正确的操作或参数导致。
-
FLASH_COMPLETE:
-
值:9
-
解释:闪存操作完成,没有错误。
出现问题可能的原因
-
硬件问题:
-
连接问题:编程器与目标设备(如微控制器、闪存芯片)之间的连接可能不良,导致数据传输错误。
-
设备损坏:编程器或目标设备可能存在物理损坏,导致无法正常编程。
-
软件问题:
-
不兼容的软件版本:编程器软件版本可能与目标设备不兼容,导致编程错误。
-
错误的配置:编程器软件的配置可能不正确,例如选择了错误的设备型号或错误的编程选项。
-
软件bug:编程器软件本身可能存在bug,导致编程过程中出现错误。
-
目标设备问题:
-
写保护:目标设备可能处于写保护状态,阻止对其进行编程。
-
擦除问题:在编程之前,目标设备可能没有正确擦除,导致新的数据无法写入。
-
设备锁定:某些设备可能被锁定,需要特定的解锁步骤才能进行编程。
-
电源问题:
-
电源不稳定:编程过程中,电源不稳定可能导致数据传输错误或设备损坏。
-
环境因素:
-
电磁干扰:周围环境中的电磁干扰可能影响数据传输的稳定性。
由于本人使用设备之前代码都可以正常读写,所以问题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的问题,结合前面几种问题分析:
那么问题究竟在哪?
正确代码
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);
代码呈上
作者:小张张张!!