历史上的今天
返回首页

历史上的今天

今天是:2024年12月25日(星期三)

正在发生

2018年12月25日 | STM32F407.FLASH 读写经验

2018-12-25 来源:eefocus

现象:

如下代码:


//从指定地址开始写入指定长度的数据
//该函数对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        STMFLASH_Unlock();                                                                        //解锁  
        addrx=WriteAddr;                                //写入的起始地址
        endaddr=WriteAddr+NumToWrite*4;        //写入的结束地址
        if(addrx<0X1FFF0000)                        //只有主存储区,才需要执行擦除操作!!
        {
                while(addrx                {
                        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                {
                        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,都快要被我刷爆了...


最后,眼看着今晚又要3点了,万念俱灰之际,找来stm32f4的编程手册(其实一直在看,寄存器看了N遍了...),发现



这感情十分吻合啊,bus stall...

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        STMFLASH_Unlock();                                                                        //解锁 
        FLASH->ACR&=~(1<<10);                        //FLASH擦除期间,必须禁止数据fetch!!!搞了我两晚上才发现这个问题!
        addrx=WriteAddr;                                //写入的起始地址
        endaddr=WriteAddr+NumToWrite*4;        //写入的结束地址
        if(addrx<0X1FFF0000)                        //只有主存储区,才需要执行擦除操作!!
        {
                while(addrx                {
                        if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF)//有非0XFFFFFFFF的地方,要擦除这个扇区
                        {   
                                status=STMFLASH_EraseSector(STMFLASH_GetFlashSector(addrx));
                                if(status)break;        //发生错误了
                        }else addrx+=4;
                } 
        }
        if(status==0)
        {
                while(WriteAddr                {
                        if(STMFLASH_WriteWord(WriteAddr,*pBuffer))//写入数据
                        { 
                                break;        //写入异常
                        }
                        WriteAddr+=4;
                        pBuffer++;
                } 
        }
        FLASH->ACR|=1<<10;                //FLASH擦除结束,开启数据fetch
        STMFLASH_Lock();//上锁



下载,测试....

奇迹出现了...运行正常了.

推荐阅读

史海拾趣

富瀚(Fullhan)公司的发展小趣事
检查保护器的接线是否正确无误,特别是与电动机和控制电路的接线部分。
康奈特(CNNT)公司的发展小趣事

随着电子行业的快速发展,康奈特意识到单一的镜片业务已经无法满足市场需求。于是,公司开始积极布局多元化战略,通过收购和合作的方式,拓展了眼镜框、眼镜配件等相关业务。同时,公司还加大了对智能眼镜、VR/AR眼镜等新兴领域的研发投入,为未来的市场竞争打下了坚实基础。

ABL Aluminum Components公司的发展小趣事

随着业务规模的不断扩大,ABL公司开始面临供应链管理的挑战。为了应对这一挑战,公司引入了先进的供应链管理系统,实现了从原材料采购、生产制造到产品销售的全程监控。同时,ABL公司还与供应商建立了长期稳定的合作关系,确保了原材料的稳定供应和成本控制。通过优化供应链管理,ABL公司提高了生产效率和市场响应速度,进一步巩固了市场地位。

圣邦微电子(Fangtek)公司的发展小趣事

ABL Aluminum Components公司自成立以来,一直注重技术创新。早期,公司研发出了一种新型铝合金材料,这种材料具有优异的导电性和轻量化特点,迅速在电子行业引起关注。随着技术的不断迭代,ABL公司逐步将这种材料应用于手机、电脑等消费电子产品的内部组件,大大提高了产品的性能和用户体验。凭借这一技术优势,ABL公司逐渐在电子行业中占据了一席之地。

AVG [AVG Semiconductors(HITEK)]公司的发展小趣事

AVG深知在竞争激烈的电子行业中,单打独斗难以取得长远的发展。因此,公司积极寻求与行业内外的合作伙伴建立紧密的合作关系。通过与上下游企业建立供应链合作关系,AVG确保了原材料的稳定供应和产品质量的可靠性;通过与高校和研究机构合作开展技术研发,AVG不断引入新的技术和创新思路。这些合作伙伴关系的建立,为AVG的发展提供了有力支持,也促进了整个电子行业的共赢发展。

Good Sky Electric Co Ltd公司的发展小趣事
电气维护保养是确保摇臂钻床长期稳定运行的重要环节。在维护时,应首先断开电源并锁定开关,以确保安全。然后,可以依次检查电气元件的外观是否完好、接线是否牢固、接触是否良好等。对于老化的元件或损坏的部件,应及时进行更换或修复。此外,还应定期清洁电气元件和散热系统,以保持良好的工作环境和散热效果。

问答坊 | AI 解惑

最具潜力的IC职位投票

不知道哪种最有前途?大家来投投票吧 如果职位不全,欢迎大家补充…

查看全部问答>

波特图的相位是这样看的吗?

先选一个参考位,为-180.那么-90~-180为相位超前。比-180小的为相位滞后。对吗? …

查看全部问答>

wince 通过CF卡里添加阿拉伯字体

我在project.reg 里添加了如下内容 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\FontPath]     \"FontPath\"=\"\\\\Hard Disk\\\\Font\"  ; 字库文件所在目录 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\FontLink\\SystemL ...…

查看全部问答>

【问题还在,俄第神纳!】

本以为解决了,结果还不行! 目前的情况: 计算机发信号给LED显示屏,中间用433无线模块传输。发送端通过232转485接无线模块,接收端模块通过485接显示屏。正常。但因为433模块不好用,所以客户想用我们的超级无线传输模块。但是,他要求,用我们 ...…

查看全部问答>

vxworks 驱动开发 月薪一万左右

找人做vxworks bsp和驱动,月薪1万左右,急!有意者请简历至mengliu123@126.com,此岗位为全职,无经验者勿扰,谢谢!…

查看全部问答>

05.16【每日一问】:PWM

今天起晚了 想早点起来发问题的   大家讨论讨论啊   你是怎样理解或者计算PWM的精度和分辨率的   可以用实际的程序来讨论或者计算 …

查看全部问答>

msp430模数转换AD出现的问题

使用AD采样一个电压信号,开机后显示数值710稳定,过了大约5分钟数值变为692 这是怎么回事?使用的是内部1.5V基准 有同鞋遇到过同样的问题没?…

查看全部问答>

【设计工具】利用 Xilinx FPGA 打造出高端比特精度和周期精度浮点 DSP 算法实现方案

       系统要求和可用 FPGA 的当前趋势使浮点实现方法变得更加重用。本白皮书和视频说明了(与其它设计流程的不同之处)DSP 系统生成器 13.3 如何为用户提供针对比特精度、周期精度、单精度、双精度和定制精度浮点 ...…

查看全部问答>

见过双卡双待的,见过双电池的手机吗

看电池的商标,打的是基伍,在印度曾经是市场占有率第一哦!…

查看全部问答>