STM32F407.FLASH读写经验

阅读: 评论:0

STM32F407.FLASH读写经验
现象:
如下代码:
//从指定地址开始写⼊指定长度的数据
//该函数对OTP区域也有效!可以⽤来写OTP区!
//OTP区域地址范围:0X1FFF7800~0X1FFF7A0F
//WriteAddr:起始地址(此地址必须为4的倍数!!)
//pBuffer:数据指针
//NumToWrite:字(32位)数(就是要写⼊的32位数据的个数.)
void STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite)
{
u8 status=0;
u32 addrx=0;
u32 endaddr=0;
if(WriteAddr<STM32_FLASH_BASE||WriteAddr%4)return;        //⾮法地址
STMFLASH_Unlock();                                                                        //解锁
addrx=WriteAddr;                                //写⼊的起始地址
endaddr=WriteAddr+NumToWrite*4;        //写⼊的结束地址
if(addrx<0X1FFF0000)                        //只有主存储区,才需要执⾏擦除操作!!
{
while(addrx<endaddr)                //扫清⼀切障碍.(对⾮FFFFFFFF的地⽅,先擦除)
{
if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF)//有⾮0XFFFFFFFF 的地⽅,要擦除这个扇区
{
printf("S");
status=STMFLASH_EraseSector(STMFLASH_GetFlashSector(addrx));
if(status)break;        //发⽣错误了
}else addrx+=4;
}
}
if(status==0)
{
while(WriteAddr<endaddr)//写数据
{
if(STMFLASH_WriteWord(WriteAddr,*pBuffer))//写⼊数据
{
break;        //写⼊异常
}
WriteAddr+=4;
pBuffer++;
}
}
STMFLASH_Lock();//上锁
}
红⾊的printf,加上,程序运⾏正常.
红⾊的printf去掉,程序随即进⼊死循环,死在等待FLASH空闲⾥⾯,⼀旦JTAG,并设置断点在这⾥,则可以不要printf,也可以正常运⾏.
⾮常诡异.
试过的⽅法:
1,官⽅代码替换掉我的代码,结果,失败.
2,把printf,换成延时,失败.
3,把代码结构改了,失败.
4,把printf,换成直接写DR的⽅式发送,失败.
5,清FLASH->SR标记位,失败.
6,将系统的delay_us,换成i--之类的延时,失败.
7,加多等待FLASH操作结束,失败.
...
总之,2个晚上,就在不停的尝试各种可能的解决⽅案.不停的刷代码,估计这板⼦上的F4,
总之,2个晚上,就在不停的尝试各种可能的解决⽅案.不停的刷代码,估计这板⼦上的F4,都快要被我刷爆了...
最后,眼看着今晚⼜要3点了,万念俱灰之际,来stm32f4的编程⼿册(其实⼀直在看,寄存器看了N遍了...),发现
这感情⼗分吻合啊,
shit,才想起来,在系统时钟初始化的时候,默认是设置了DATA FETCHES的,仿真看下FLASH->ACR的DCEN位,果然是1.
⽴即修改代码如下:
//从指定地址开始写⼊指定长度的数据
//该函数对OTP区域也有效!可以⽤来写OTP区!
//OTP区域地址范围:0X1FFF7800~0X1FFF7A0F
//WriteAddr:起始地址(此地址必须为4的倍数!!)
//pBuffer:数据指针
//NumToWrite:字(32位)数(就是要写⼊的32位数据的个数.)
void STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite)
{
u8 status=0;
u32 addrx=0;
u32 endaddr=0;
if(WriteAddr<STM32_FLASH_BASE||WriteAddr%4)return;        //⾮法地址
STMFLASH_Unlock();                                                                        //解锁FLASH->ACR&=~(1<<10);                        //FLASH擦除期间,必须禁⽌数据fetch搞了我两晚上才发现这个问题!
addrx=WriteAddr;                                //写⼊的起始地址
endaddr=WriteAddr+NumToWrite*4;        //写⼊的结束地址
if(addrx<0X1FFF0000)                        //只有主存储区,才需要执⾏擦除操作!!
{
while(addrx<endaddr)                //扫清⼀切障碍.(对⾮FFFFFFFF的地⽅,先擦除)
{
if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF)//有⾮0XFFFFFFFF 的地⽅,要擦除这个扇区
{
status=STMFLASH_EraseSector(STMFLASH_GetFlashSector(addrx));
if(status)break;        //发⽣错误了
}else addrx+=4;
}
}
if(status==0)
{
while(WriteAddr<endaddr)//写数据
{
if(STMFLASH_WriteWord(WriteAddr,*pBuffer))//写⼊数据
{
break;        //写⼊异常
}
WriteAddr+=4;
pBuffer++;
}
}
FLASH->ACR|=1<<10;                //FLASH擦除结束,开启数据fetch
STMFLASH_Lock();//上锁
}
下载,测试....
下载,测试....
奇迹出现了...运⾏正常了.

本文发布于:2023-05-06 11:38:42,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/3/89632.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:地址   失败   代码   数据   擦除   指定
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图