历史上的今天
返回首页

历史上的今天

今天是:2025年01月31日(星期五)

2020年01月31日 | stm32中flash的写入与读取

2020-01-31 来源:eefocus

stm32中flash应用的常见函数:

1.擦除函数:

FLASH_Status FLASH_ErasePage(u32 Page_Address)只要()里面的数是flash第xx页中对应的任何一个地址!就是擦除xx页全部内容。


2.flash写入函数:

STMFLASH_Write(uint32_t WriteAddr,uint32_t *pBuffer,uint32_t NumToWrite)

入参:

WriteAddr:要写入flash中的首地址,stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实际的flash大小,不同的芯片flash大小不同,因此从理论上来说该地址可以从0x08000000进行写入,但实际要考虑代码所占空间大小,所以该地址要错过代码段的地址,以防擦除时将代码也擦除了。

pBuffer:该参数为要写入flash中的数据的地址。

NumToWrite:该参数为要写入的数据的长度。


源码展示:

int STMFLASH_Write(uint32_t WriteAddr,uint32_t *pBuffer,uint32_t NumToWrite)

    FLASH_EraseInitTypeDef FlashEraseInit;

    HAL_StatusTypeDef FlashStatus=HAL_OK;

    uint32_t SectorError=0;

    uint32_t addrx=0;

    uint32_t endaddr=0;

    int result = 0;

    if(WriteAddr      return -1; //非法地址

    }

    HAL_FLASH_Unlock();             //解锁

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

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

    if(addrx<0X1FFF0000)

    {

        while(addrx        {

             if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF)//有非0XFFFFFFFF的地方,要擦除这个扇区

            {   

              FlashEraseInit.TypeErase=FLASH_TYPEERASE_PAGES;            //擦除类型,整页擦除 

              FlashEraseInit.PageAddress=FLASH_SAVE_ADDR;                //要擦除的页

              FlashEraseInit.NbPages=1;                                  //一次只擦除一个页

              if(HAL_FLASHEx_Erase(&FlashEraseInit,&SectorError)!=HAL_OK) 

              {

                result = -1;

                break;//发生错误了

              }

            }else addrx+=4;

            FLASH_WaitForLastOperation(FLASH_WAITETIME);                //等待上次操作完成

        }

    }

    FlashStatus=FLASH_WaitForLastOperation(FLASH_WAITETIME);            //等待上次操作完成

    if(FlashStatus==HAL_OK)

    {

       while(WriteAddr       {

          if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,WriteAddr,*pBuffer)!=HAL_OK)//写入数据

          {

            result = -1;

            break; //写入异常

          }

          WriteAddr+=4;

          pBuffer++;

       }  

    }

    HAL_FLASH_Lock();           //上锁

    return result;


3.从flash中读取指定地址的字:


uint32_t STMFLASH_ReadWord(uint32_t faddr)

{

return *(uint32_t*)faddr; 

}


函数入参:

faddr:要读取字的地址。

4.从flash中读取多个字节函数:

STMFLASH_Read(uint32_t ReadAddr,uint8_t *pBuffer,uint32_t NumToRead)

函数入参:

ReadAddr:要读取数据的首地址。

pBuffer:读取数据之后的地址。

NumToRead:要读取字节的大小。

函数源码:


void STMFLASH_Read(uint32_t ReadAddr,uint8_t *pBuffer,uint32_t NumToRead)   

{

    uint32_t i;

    uint32_t tmp;

    for(i=0;i    {

        tmp = STMFLASH_ReadWord(ReadAddr + i*4);//读取4个字节.

        memcpy(&pBuffer[i*4], (void *)&tmp, 4);

    }

    //处理NumToRead不是4的整倍数情况,处理余数.

    int remain = NumToRead % 4;

    tmp = STMFLASH_ReadWord(ReadAddr + i*4);

    memcpy(&pBuffer[i*4], (void *)&tmp, remain);

}


总之从flash中读取和写入数据的关键在于数据的大小以及对地址的处理上,其他部分基本一样。

推荐阅读

史海拾趣

Glorious Sources Co Ltd公司的发展小趣事
采取更有效的抗干扰措施如电磁屏蔽、电源滤波等以提高电路的稳定性和可靠性。
Coherent Inc公司的发展小趣事

Coherent Inc.在激光技术领域取得了多项技术突破,如固态激光器、半导体激光器、气体激光器、飞秒激光器等。这些技术的突破不仅提升了公司的产品性能和质量,也使其在行业中处于领先地位。公司的产品广泛应用于科学研究、工业制造、医疗诊断和治疗、通信等领域,为这些领域的发展做出了重要贡献。

Apacer公司的发展小趣事

随着科技的不断发展,Apacer宇瞻科技紧跟时代步伐,不断创新产品。2006年,公司推出了存储容量高达2GB的microSD卡,这款数码卡体积仅为普通SD卡的四分之一,但存储容量却与之不相上下。这一创新产品不仅满足了市场对高容量、小型化存储设备的需求,也进一步巩固了宇瞻科技在市场上的地位。

DMS Electronic Components, Inc公司的发展小趣事

DMS自创立之初,就致力于电子元器件的技术创新。公司投入大量研发资源,成功开发出一系列高性能、低成本的电子元器件,这些产品迅速在市场上获得了认可。随着技术的不断进步,DMS不断推出新产品,满足了客户日益增长的需求,逐渐在电子行业中树立了技术领先的形象。

CT Micro公司的发展小趣事
  1. 创业初期与技术创新

CT Micro公司最初由几位电子工程领域的专家创立,他们看到了微型计算机断层扫描(Micro-CT)技术在电子行业中的巨大潜力。初期,公司面临着资金短缺和技术难题,但他们通过不断研发和创新,成功开发出了一款具有高性价比的Micro-CT设备,迅速获得了市场的认可。

  1. 市场拓展与合作伙伴关系

随着产品的成熟,CT Micro开始积极寻求市场拓展。他们与多家电子制造企业建立了合作关系,为这些企业提供Micro-CT设备的定制服务。通过与这些企业的合作,CT Micro不仅扩大了市场份额,还进一步提升了产品的技术水平和应用范围。

  1. 研发升级与产品迭代

面对日益激烈的市场竞争,CT Micro不断投入研发力量,对Micro-CT设备进行升级和迭代。他们成功推出了多款新型设备,具有更高的分辨率、更快的扫描速度和更低的辐射剂量。这些新产品的推出,进一步巩固了CT Micro在电子行业中的领先地位。

  1. 国际化战略与市场拓展

随着国内市场的饱和,CT Micro开始实施国际化战略。他们积极参与国际展览和研讨会,展示自己的产品和技术实力。同时,他们还在海外设立了销售和服务中心,为国际客户提供更加便捷的服务。通过这些努力,CT Micro成功打开了国际市场的大门。

  1. 社会责任与可持续发展

在快速发展的同时,CT Micro也积极履行社会责任。他们注重环保和可持续发展,采用环保材料和节能技术生产产品。此外,他们还积极参与公益事业,为贫困地区的教育和医疗事业贡献力量。这些举措不仅提升了公司的社会形象,也为其可持续发展奠定了坚实基础。

请注意,这些故事框架是虚构的,并不代表CT Micro公司的实际发展情况。如果您需要了解CT Micro公司或类似公司的真实故事,建议您查阅相关公司的官方网站、新闻报道或行业分析报告。

ASSMANN WSW components公司的发展小趣事

ASSMANN WSW components公司的创立源于一个对电子行业充满热情的家族。起初,它只是一个小型家族企业,专注于为当地电子市场提供连接器和其他基础电子元件。然而,凭借其出色的产品质量和专业的服务态度,ASSMANN WSW逐渐赢得了客户的信任和好评。随着时间的推移,公司的业务范围逐渐扩大,不仅在国内市场取得了显著成绩,还开始进军国际市场。

问答坊 | AI 解惑

C8051单片机原理及应用

C8051单片机原理及应用…

查看全部问答>

100M示波器到手了,用起来超爽

本信息来自合作QQ群:AVR单片机学习与交流群(17727270) 群管理员在坛子里的ID:铜河 100M、4通道,2G采样,25k记录 据说,这个虽然是100M,但实测是200M…

查看全部问答>

wince网络实时传输数据

最近遇到一个问题: 环境如下     wince下串口每秒发送15K数据,我的串口读写缓冲区设置4K,全局数据设置为20K 现在有两个解决办法     请大家分析一下那个更好   1.wince socket同步发送 ...…

查看全部问答>

有关存储设备

可能还是一个白痴问题,请高手们说说嵌入式开发使用的存储设备类型有哪些?WinCE支持的最大硬盘容量是多大?各个版本的WinCE支持的最大内存是多少?…

查看全部问答>

请教运算放大器的使用问题

我现在用一个运算放大器调整单片机的采样信号.放大器的型号为LF412,资料里电源连接方式是双电源供电,如接+/-15v,由于我现在的输入信号只有正的.我把负电源接地,正电源接+15v,请问这样做行吗?…

查看全部问答>

大家觉得这个4*4键盘扫描程序怎样,我修改了一点点。

这个程序不是原创的,但是我修改了一点点,理解起来轻松了很多。大家觉得怎样,如果有较好的不妨拿出来分享讨论一下吧 !                   & ...…

查看全部问答>

教你如何正确选择LED护栏管厂家

LED护栏管(数码管)现今已是非常普遍、流行的夜景照明亮化产品,因此,各个行业及酒店KTV、事业单位纷纷安装,用于展示自我形象、产品及服务。   一、考虑价格   商家常用招数之一。当然是越便宜客户越高兴;不过,羊毛出在羊身上,太便宜肯 ...…

查看全部问答>

06.23【每周讨论】我们年轻,富有正义。对于社会中的不文明现象该怎样看待呢?

06.23【每周讨论】年轻的我们,富有正义、满怀激情。对于社会中的不文明现象该怎样看待呢?我们年轻人,富有正义、满怀激情,眼里容不下一粒沙。社会中那些不文明的现象经常在我们的周围发生,却让我们感到无可奈何。若为此感到懊恼的话,那你永远 ...…

查看全部问答>

【M4 开发板入门】EKK-LM4F232 开发起步摘要(README FIRST ABSTRACT)

EEWORLD 的朋友,当拿到 LM4F232 的评估板后,可以先看看我的 README FIRST 摘要,希望能有些帮助。 一、开发板简介 1.板上主要资源:三轴加速度测量器,OLED 屏,Stellaris ICDI 仿真器,温度传感器,具备 USB Host,Device 和 OTG 功能。 2.打 ...…

查看全部问答>

烧写程序的过程中对程序memory的处理

1.在烧写程序时,是不是芯片的所有memory都要先进行校验?   2.在程序没使用内部flash的情况下,会不会在烧写程序也要对flash的memory进行校验。     3.以上校验memory时,是要先对flash解锁的吗?   经过查阅TI的CSM相 ...…

查看全部问答>