STM32F4 flash写入偶尔出现的异常调试

编程入门 行业动态 更新时间:2024-10-28 00:28:55

STM32F4 flash写入偶尔出现的<a href=https://www.elefans.com/category/jswz/34/1771210.html style=异常调试"/>

STM32F4 flash写入偶尔出现的异常调试

今天在新的设备上,使用XMODEM协议下载升级问题,之前用了很多年都没出问题,突然在这个F4上面出问题了,单独调用都是好的,最后通过不断的调试发现原因,以前写入FLASH都是调用单字节或者单字烧写,最近修改了一个底层函数,批量写入多个字,由于写入的数据如果不是32bit对齐,就会出现异常,刚好xmodem协议前面有3个字节头,刚好不是4字节对齐。

//128B数据包格式
typedef struct
{u8	X_Start;u8	X_PackNum;u8	X_bPackNum;u8	X_PackData[128];u8	X_CRC16H;u8	X_CRC16L;
}XMODEM_128B_PACK;//1024B数据包格式
typedef struct
{u8	X_Start;u8	X_PackNum;u8	X_bPackNum;u8	X_PackData[1024];u8	X_CRC16H;u8	X_CRC16L;
}XMODEM_1KB_PACK;

最终修改方法是,通过判断输入的内存是否32bit对齐,如果是的,直接访问,如果不是的,则转换为BYTE数组后手动组装为32bit。


/*************************************************************************************************************************
* 函数			:	STM32FLASH_STATUS STM32FLASH_WriteMultipledWord(u32 faddr, u32 data[], u32 dWordCount)
* 功能			:	在FLASH指定地址写入多个字的数据(32bit连续写入,提高效率)
* 参数			:	faddr:指定地址(此地址必须为4的倍数);data:要写入的数据
* 返回			:	STM32FLASH_STATUS
* 依赖			:	底层
* 作者			:	cp1300@139
* 时间			:	2020-02-08
* 最后修改时间 	: 	2020-02-08
* 说明			: 	警告,地址必须为4的倍数2020-02-08执行PG=1须增加延时,否则可能出现顺序错误,不会执行flash解锁不会判断是否能写入2020-06-29修复如果data[]没有32bit对齐崩溃问题
*************************************************************************************************************************/
STM32FLASH_STATUS STM32FLASH_WriteMultipledWord(u32 faddr, u32 data[], u32 dWordCount)
{STM32FLASH_STATUS status;u8 *p = (u8*)data;u32 offset = 0;vu32 temp;bool is32bit = (((u32)data)%4)?FALSE:TRUE;status=STM32FLASH_WaitDone(200);	 	//判断状态if(status==STM32FLASH_OK)				//没有错误{FLASH->CR&=~(3<<8);					//清除PSIZE原来的设置FLASH->CR|=2<<8;					//设置为32bit宽,确保VCC=2.7~3.6V之间!!FLASH->CR|=1<<0;					//编程使能,测试发现使能编程后不延时会出现编程顺序错误nop;nop;nop;nop;					//2020-02-08 此处必须增加延时,否则可能出现顺序错误	while(dWordCount --){if(is32bit == TRUE)				//32bit对齐的{*(vu32*)faddr=*data++;		//写入数据}else //没有32bit对齐{temp = p[offset++];temp |= (u32)p[offset++]<<8;temp |= (u32)p[offset++]<<16;temp |= (u32)p[offset++]<<24;*(vu32*)faddr=temp;				//使用临时变量存储要写入的数据,防止data[]不是32bit对齐,如果写入vu32变量将会导致异常}faddr +=4;							//地址自增+4status=STM32FLASH_WaitDone(200);	//等待操作完成,一个字编程,最多100us.if(status!=STM32FLASH_OK)			//有错误{break;}}if(status!=STM32FLASH_BUSY)			//非忙{	FLASH->CR&=~(1<<0);				//清除PG位}} if(status != STM32FLASH_OK){DEBUG("FLASH写入错误(%d)FLASH_SR=0x%X  FLASH_CR=0x%X\r\n",status, FLASH->SR, FLASH->CR);}return status;
} 

 

更多推荐

STM32F4 flash写入偶尔出现的异常调试

本文发布于:2024-03-08 10:48:38,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1720660.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:异常   flash

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!