STM32F407 Flash操作笔记

发布者:SerendipitySoul最新更新时间:2018-12-25 来源: eefocus关键字:STM32F407  Flash操作 手机看文章 扫描二维码
随时随地手机看文章

简述


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。


关键字:STM32F407  Flash操作 引用地址:STM32F407 Flash操作笔记

上一篇:STM32 PWM快速开关端口电平问题
下一篇:STM32 录制与播放空调/TV遥控器的红外信号

推荐阅读最新更新时间:2024-03-16 16:21

对Nor Flash操作(S3C2440)
Nor Flash介绍 Nor Flash的连接线有地址线,数据线,片选信号读写信号等,Nor Flash的接口属于内存类接口,Nor Flash可以向内存一样读,但是不能像内存一样写,需要做一些特殊的操作才能进行写操作,读只需像内存一样读很简单。 nor 的原理图 FLASH简介 常用的Flash类型有Nor Flash和NAND Flash两种。 Nor Flash由Intel公司在1988年发明,以替代当时在市场上占据主要地位的EPROM和E2PROM。NAND Flash由Toshiba公司在1989年发明。两者的主要差别如下表: Nor Flash支持XIP,即代码可以直接在Nor Flash上执行,无需复制
[单片机]
对Nor <font color='red'>Flash</font>的<font color='red'>操作</font>(S3C2440)
S3C2440-裸机篇-10 | 使用S3C2440操作Nand Flash
1. Nor Flash与Nand Flash Nor Nand 接口 引脚多,类似于RAM 引脚较少 容量 小(1-32MB) 大(128-512MB) 读操作 简单,和RAM相同 简单,和RAM相同 写操作 发出特定命令才能写入 发出特定命令才能写入 价格 贵 便宜 比较 无坏块 有坏块 XIP 可以 不可以 应用场合 存储关键性代码(比如uboot,kernel) 存储海量数据(允许错误) 2. JZ2440开发板上的Nand Flash JZ2440开发板上板载了一个Nand Flash,型号为K9F2G08U0C,大小为256MB,连接在S3C2440的nand控制器上,原理图如下:
[单片机]
S3C2440-裸机篇-10 | 使用S3C2440<font color='red'>操作</font>Nand <font color='red'>Flash</font>
【STM32】stm32f407 + DS18B20 碰出不一样的火花
前言 之前在这篇文章:【STM32学习记录4】1.44寸TFT液晶屏显示字符、汉字和图片 卖了一个关子: 开发板:stm32f407VET6 开发环境:keil5 MDK 一、硬件基础——DS18B20 1.DS18B20简介 2.硬件连接 根据手册,DS18B20的硬件接法很简单,分为以下两种: 需要注意的是不管哪一种接法DQ上一定要接个上拉电阻 1.【寄生接法】 DS18B20_GND → to→ STM32F407_GND DS18B20_VCC → to→ STM32F407_GND DS18B20_DQ → to→ STM32F407_P** DQ引脚可接任意IO口 关于寄生方式,
[单片机]
【STM32】<font color='red'>stm32f407</font> + DS18B20 碰出不一样的火花
STM32F407】第2章 ThreadX USBX协议栈介绍
2.1 初学者重要提示 1、 ThreadX是小型RTOS的巅峰之作,通过了各行各业的安全认证,并且大部分都是最高安全标准。作为 中间件 的USBX文件系统也通过了各种安全认证。 2.2 Express Logic公司介绍 ThreadX的作者是William lamie(同样是Nucleus RTOS的原始作者,于1990年发布)。1996的时候成立了Express Logic,并于1997发布首版ThreadX RTOS。 ThreadX4发布于2001年,ThreadX5发布于2005年,ThreadX6发布于2020年。 FileX – ThreadX的嵌入式文件系统于1999年发布首版。 NetX – Thr
[单片机]
【<font color='red'>STM32F407</font>】第2章 ThreadX USBX协议栈介绍
STM32F407中断学习笔记
中断与事件的区别 相同点:中断和事件都是触发的一种,都是可以设置触发的; 异同点: 中断触发后必须有中断处理子程序IRQ handle,例如比如按键中断触发,实现一个LED的闪烁,可以在按键按下后,在中断处理程序中实现某个LED的电平反转 但在事件中,事件是没有中断处理子程序的,事件发生后,会直接发出一个脉冲信号给与之联动的操作,也可以同样实现LED电平的反转,只要有事件发生,就会有一个脉冲信号,这样的好处是,不需要CPU干预了,可以节省CPU的处理资源,相比中断处理,速度还更快,因为硬件的速度总是比软件处理快。 EXTI 功能框图 EXTI 可分为两大部分功能,一个是产生中断,另一个是产生事件,这两个功能从硬件上就有所
[单片机]
<font color='red'>STM32F407</font>中断学习笔记
STM32F407的GPIO操作
/* #include stm32f4_discovery.h #include stm32f4xx_conf.h uint32_t Gb_TimingDelay; void Delay(uint32_t nTime); void main( ) { SysTick_Config(SystemCoreClock / 1000); //设置systemtick 一毫秒中断 RCC- AHB1ENR |= 0x00000008; //使能GPIOD 时钟 RCC- APB2ENR |= (1 14); //使能syscfg 时钟 GPIOD- MODER &= 0x00FFFFFF; //设置PD12,13,14,
[单片机]
stm32f407硬件spi读写sst25vf闪存flash代码
void SPI_FLASH_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* Enable the SPI periph */ RCC_APB2PeriphClockCmd(FLASH_SPI_CLK, ENABLE); /* Enable SCK, MOSI and MISO GPIO clocks */ RCC_AHB1PeriphClockCmd(FLASH_SPI_SCK_GPIO_CLK | FL
[单片机]
stm32f407_hal库_工程模板
硬件平台: stm32f407ve 软件平台: win10 (OS Name: Microsoft Windows 10 Enterprise OS Version: 10.0.18363 N/A Build 18363) Keil5 5.26.2 HAL库版本: 2.14.0(目前下载的最新的) 1.在工程路径下建立一个空的文件夹 2.打开keil5,没有建立工程,应该示空白工程(我的版本是5.26.2)。 3.我现在安装的hal库的版本: 4. 新建工程 5. 选择工程保存的路径,就是第一步新建的文件夹
[单片机]
stm32f407_hal库_工程模板
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved