历史上的今天
返回首页

历史上的今天

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

正在发生

2018年12月25日 | STM32F407 Flash操作笔记

2018-12-25 来源:eefocus

简述


STM32F4XX的闪存擦除方式分为两种:扇区擦除(最小单元16K)和整片擦除。在实际应用中,为满足重要信息的存储,需将信息存入FLASH中,针对以上两种擦除方式,扇区擦除更符合实际的需要。 


参考手册: 


闪存模块组织


写FLASH操作

 

扇区擦除流程 


经过以上五个步,就可以擦除某个扇区。但是实际运用过程中,一个扇区只存储一个信息或标志,会造成资源严重浪费。现采用缓存的方式,先读取当下扇区的数据,将读取的数据和要写入的数据组合,待擦除后再次写入。


代码片


写FLASH操作


/*

 *  WriteAddr: 起始地址 (u32)address 是 4 的整数倍, (u32)data

 *  pBuffer:   数据指针

 *  NumToWrite:字(u32)数

 */

void STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite)

  FLASH_Status status = FLASH_COMPLETE;

    u32 addrx=0;

    u32 endaddr=0;  


  if(WriteAddr


    FLASH_Unlock();//解锁                                 

    FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存


    addrx=WriteAddr;                //写入起始地址

    endaddr=WriteAddr+NumToWrite*4; //写入结束地址

    if(addrx<0X1FFF0000)            //是否为主存储区

    {

        while(addrx

        {

            if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF)//对非0XFFFF FFFF 的地方,先擦除

            {   

                status=FLASH_EraseSector(GetSector(addrx),VoltageRange_3);//VCC=2.7~3.6V之间!!

                if(status!=FLASH_COMPLETE)break;    //异常

            }else addrx+=4;

        } 

    }

    if(status==FLASH_COMPLETE)

    {

        while(WriteAddr

        {

      if(FLASH_ProgramWord(WriteAddr,*pBuffer)!=FLASH_COMPLETE)//写入数据

            { 

                break;  //写入异常

            }

            WriteAddr+=4;

            pBuffer++;

        } 

    }

    FLASH_DataCacheCmd(ENABLE);//FLASH擦除结束,开启数据缓存

    FLASH_Lock();//上锁

    Printf("Flash status :%d\r\n",status);

}


数据流存储

#define SectorLen 128 //数据长度 128 * 4 = 512 结合实际需要长度调整

/*

 *  (u32)address 是 4 的整数倍, (u32)data

 *  FreeStart( 0x08008000 )~FreeEnd( 0x08010000 )

 */

void SaveDataToFlash( u32 address, u32 data )

{

    FLASH_Status status = FLASH_COMPLETE;


    u32 site[SectorLen] = {FreeStart}, FlashBuffer[SectorLen] = {0};


    for ( u8 i = 0; i < SectorLen; i ++ )//读取扇区数据,随即擦除

    {

//      if ( STMFLASH_ReadWord( site[i] ) != 0XFFFFFFFF)//0XFFFFFFFF代表无数据

        {

            FlashBuffer[i] = STMFLASH_ReadWord( site[i] );

            site[ i + 1 ] = site[i] + 4;

            if ( address == site[i] )

                FlashBuffer[i] = data;

        }

    }

    FLASH_Unlock();//解锁

    FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存

    status = FLASH_EraseSector( GetSector( address ), VoltageRange_3 );//VCC=2.7~3.6V之间!!

    if ( status == FLASH_COMPLETE )

    {       

        for (u8 i = 0; i < SectorLen; i ++)

        {

            if ( FLASH_ProgramWord( site[i], FlashBuffer[i] ) != FLASH_COMPLETE )//写入数据

            { 

                break;  //写入异常

            }

        } 

    }

    FLASH_DataCacheCmd(ENABLE); //FLASH擦除结束,开启数据缓存

    FLASH_Lock();//上锁

    Printf("Save status = %d\r\n",status);


//  return addr;

}


读FLASH操作

STM23F4 的 FLASH 读取是很简单的。例如,我们要从地址 addr,读取一个字(字节为 8位, 半字为 16 位,字为 32 位),可以通过如下的语句读取:data=(vu32)addr; 

将 addr 强制转换为 vu32 指针,然后取该指针所指向的地址的值,即得到了 addr 地址的值。


代码片

/*

 *faddr :读地址

 *return:对应数据

 */

u32 STMFLASH_ReadWord(u32 faddr)

{

    return *(vu32*)faddr; 

}

//读FLASH操作

/*

 *  ReadAddr  :起始地址 (u32)address 是 4 的整数倍, (u32)data

 *  pBuffer   :数据指针

 *  NumToRead :字(4位)数

 */

void STMFLASH_Read(u32 ReadAddr,u32 *pBuffer,u32 NumToRead)     

{

    u32 i;

    for(i=0;i

    {

        pBuffer[i]=STMFLASH_ReadWord(ReadAddr);//读取4个字节

        ReadAddr+=4;//偏移4个字节

    }

}


调试注意事项


在FLASH读写操作时,未使用数据类型(u32),致读到的数据一直为:-1(0xFFFF FFFF 默认值,即该地址写数据失败) ;


主存储区


小结:借助串口打印调试,分析问题,数据读写问题不大o( ̄︶ ̄)o。


推荐阅读

史海拾趣

CEVA, Inc公司的发展小趣事

CEVA公司一直以来都是无线连接和智能传感技术的领先许可方。公司提供了包括数字信号处理器、人工智能处理器、无线平台以及一系列用于传感器融合、图像增强、计算机视觉、语音输入和人工智能的补充软件。这些技术和产品使得CEVA在多个终端市场,如移动、消费、汽车、机器人、工业和物联网等领域,都能够提供节能、智能和互联的设备解决方案。通过与全球半导体公司和原始设备制造商的紧密合作,CEVA成功地将这些技术应用于实际产品中,推动了相关市场的快速发展。

CT [ Central Technologies ]公司的发展小趣事

在追求经济效益的同时,CT公司始终注重履行企业社会责任。公司积极参与公益事业,支持教育事业发展,为贫困地区捐赠教育设备和资金。此外,CT公司还注重环保和可持续发展,通过采用环保材料和节能减排措施等方式降低生产过程中的环境污染。这些举措不仅提升了公司的社会形象,也为公司赢得了更多消费者的认可和支持。

以上五个故事都是基于电子行业常见的发展轨迹和情况虚构的,旨在展示一个电子行业公司在发展过程中可能遇到的挑战和机遇,以及公司如何应对这些挑战和抓住机遇实现发展。这些故事并不针对任何具体的公司或个人,也不包含任何褒贬评价。

Beckhoff Automation GmbH公司的发展小趣事

在电子行业的快速发展中,BCD Semi公司凭借其卓越的技术创新能力,成功研发出了一系列具有竞争力的半导体产品。公司拥有一支经验丰富的研发团队,不断探索新技术和新应用,将最新的科技成果转化为具有市场竞争力的产品。通过技术创新,BCD Semi在行业中逐渐树立起了良好的口碑,赢得了众多客户的信任和支持。

DZUS公司的发展小趣事

进入XX年代,DZUS公司面临了来自国内外竞争对手的严峻挑战。为了保持市场领先地位,公司加大了对技术创新的投入。研发团队成功开发了一系列新型紧固件,不仅提高了产品的性能和可靠性,还降低了生产成本。这些创新产品帮助DZUS公司巩固了市场地位,并赢得了更多客户的信赖。

Fibrefab Limited公司的发展小趣事

随着市场环境的不断变化和竞争的加剧,Fibrefab面临着前所未有的挑战。为了应对这些挑战,Fibrefab开始加快转型升级的步伐。公司加大了对新兴技术的研发投入,如5G、物联网和云计算等,以打造更加智能、高效和灵活的光纤通讯解决方案。同时,Fibrefab还积极优化生产流程和提高产品质量,以满足客户对高性能、高品质产品的需求。

Carlisle Interconnect Technologies公司的发展小趣事

随着科技的进步和市场的变化,Carlisle Interconnect Technologies敏锐地捕捉到了新型材料的发展潜力。公司成为第一批采用PTFE(聚四氟乙烯)这种独特材料生产高温电线和电缆的公司之一。PTFE材料具有出色的耐高温、耐腐蚀和电气性能,使得公司的产品在航空航天、电子通信等领域得到了广泛应用。这一创新举措不仅提升了公司的市场竞争力,也为整个行业的技术进步做出了贡献。

问答坊 | AI 解惑

关于LED胶水常见问题及解决方案

replyreload += \',\' + 369701;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

怎样画CCeCommandBar的背景图?

怎样画CCeCommandBar的背景图,又怎样才能把button放到指定位置? 想做过CCeCommandBar的派生类,各位高人能不能提供个例子啊,谢谢!…

查看全部问答>

Wince采用CWnd类创建窗口问题

    Wince采用CWnd创建窗口时,修改其窗口类,但窗口类会默认加上WCE_前缀,请问如何去掉其前缀。…

查看全部问答>

发布一个PC104开发技术群22814319

发布一个PC104开发技术群22814319,有这方面爱好的请加入!…

查看全部问答>

在form_load如何创建一个线程 运行一个死循环

我做了一个子过程 while(1)死循环 做监控用的 不停的去发送和接收数据   现在想form loda的时候  运行exe文件后 自动运行程序  打开主窗口 进入这个循环  该如何创建线程呢 我在pc调试能通过的 放到wince ...…

查看全部问答>

STR912FAW如何实现在线部分更新

有一个方案: BANK0中存放应用程序, BANK1存放BOOTLOADER(或系统程序), BANK0应用程序如果需要更新, 则调用BANK1中的相应代码执行更新操作. 请教各位这样是否可行? 如果可行, 那么BANK1中的相应代码应该才 ...…

查看全部问答>

学习板教程 第十课——串口通信

串口通信的基本原理及使用方法,欢迎下载,谢谢! [ 本帖最后由 764workshop 于 2012-1-11 21:32 编辑 ]…

查看全部问答>

稳压电源原理介绍

稳压电源一般由变压器、整流器和稳压器三大部分组成,如图示。变压器把市电交流电压变为所需要的低压交流电。整流器把交流电变为直流电。经滤波后,稳压器再把不稳定的直流电压变为稳定的直流电压输出。 一、稳压电源的技术指标及对稳压电源的要 ...…

查看全部问答>

【launchpad心得】课后练习十七之步进电机

1. 步进电机简介   步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进 ...…

查看全部问答>

滤波器可以做解调用吗?

大神,低通滤波器可以做解调用吗?? 将80KHZ左右的方波载波加载到10KHZ左右的源信号上,解调输出时,直接用低通滤波器将高于10Khz的信号过滤掉,不知道原理上有没有错误? 我仿真时,直接将80KHZ的方波作为低通滤波器的输入端,但输出为正弦信号 ...…

查看全部问答>