STM32 flash 读写操作

发布者:Haifeeng最新更新时间:2018-05-01 来源: eefocus关键字:STM32  flash  读写操作 手机看文章 扫描二维码
随时随地手机看文章

一、Flash简介

  通过对stm32内部的flash的读写可以实现对stm32的编程操作。



  stm32的内置可编程Flash在许多场合具有十分重要的意义。如其支持ICP(In Circuit Programming,在电路编程;在线编程)特性使得开发人员对stm32可以警醒调试开发,可以通过JTAG和SWD接口对stm32进行程序烧写;支持IAP(In Application Programming,在应用中编程)使得开发人员可以在stm32运行程序的时候对其内部程序进行更新操作。对一些对数据安全有要求的场合,可编程FLASH可以结合stm32内部唯一的身份标识实现各种各样的防破解方案。并且stm32的FLASH在一些轻量级的防掉电存储方案中也有立足之地。



  stm32的FLASH分为主存储块和信息块。主存储块用于保存具体的程序代码和用户数据,信息块用于负责由stm32出厂时放置2KB的启动程序(BootLoader)和512B的用户配置信息区。



  主存储器是以页为单位划分的。stm32根据FLASH主存储块容量、页面的不同,系统存储器的不同,分为小容量、中容量、大容量、互联型,共四类产品。



小容量产品:主存储块1-32KB,     每页1KB。系统存储器2KB

中容量产品:主存储块64-128KB,   每页1KB。系统存储器2KB

大容量产品:主存储块256KB以上,  每页2KB。系统存储器2KB

互联型产品:主存储块256KB以上,  每页2KB。系统存储器18KB

  对于具体一个产品属于哪类,可以查数据手册,或根据以下简单的规则进行区分: 

STM32F101xx、STM32F102xx 、STM32F103xx产品,根据其主存储块容量,一定是小容量、中容量、大容量产品中的一种,STM32F105xx、STM32F107xx是互联型产品。



  对Flash的写入操作要遵循“先擦除后写入”的原则。



  stm32的内置Flash编程操作都是以页为单位写入的,而写入的操作必须要以32位字或16位半字宽度数据为单位,允许跨页写;写入非字或半字长数据时将导致stm32内部总线错误。


代码实现


二 程序代码


flash.h


#ifndef __FLASH_H  

#define __FLASH_H  

#include "stm32f10x.h"  

u8 Write_Flash(char *buff, u8 len);  

void Read_Flash(char *buff, u8 len);  

#endif  

flash.c


#include "flash.h"  

#include "stm32f10x_it.h"  

#define WriteFlashAddress    ((u32)0x08020000)//读写起始地址(内部flash的主存储块地址从0x08000000开始)  

  

/******************************************************************************* 

* 函数名:Write_Flash 

*描述    :写STM32指定地址的Flash 

*输入    :buff:写入数据缓冲区,len:写入数据长度 

*输出    :无 

*返回值    :u8:写成功返回1,失败返回0 

*说明    :无 

*******************************************************************************/  

u8 Write_Flash(char *buff, u8 len)  

{      

    volatile FLASH_Status FLASHStatus;  

    u8 k=0;  

    u32 Address;  

  

    Address = WriteFlashAddress;  

    FLASHStatus = FLASH_COMPLETE;  

    FLASH_Unlock();//解锁  

    FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);//清除所有标志  

    FLASHStatus = FLASH_ErasePage(WriteFlashAddress);//扇区擦除  

    if(FLASHStatus == FLASH_COMPLETE)  

    {  

        for(k=0;(k

        {  

            FLASHStatus = FLASH_ProgramWord(Address, buff[k]);//写入一个字(32位)的数据入指定地址  

            Address = Address + 4;//地址偏移4个字节  

        }          

        FLASH_Lock();//重新上锁,防止误写入  

    }  

    else  

    {  

        return 0;  

    }  

    if(FLASHStatus == FLASH_COMPLETE)  

    {  

        return 1;  

    }  

    return 0;  

}  

  

/******************************************************************************* 

* 函数名:Read_Flash 

*描述    :读STM32指定地址的Flash 

*输入    :buff:读出数据缓冲区,len:读出数据长度 

*输出    :无 

*返回值    :无 

*说明    :无 

*******************************************************************************/  

void Read_Flash(char *buff, u8 len)  

{  

    u8 k;  

    u32 Address;  

      

    Address = WriteFlashAddress;  

    for(k=0;k

    {  

        buff[k] =  (*(vu32*) Address);//读指定地址的一个字的数据  

        Address += 4;//地址偏移4个字节          

    }  

}  


main.c


int main(void)  

{      

    

    u32 in_data[5]={11,22,33,44,55};//要写入的数据  

    u32 out_data[5];//读存放  

    int i;  

    u8 STATUS=0;  

        USART1_Config();//串口1配置  

    GPIO_Configuration();//GPIO配置,用于点亮led  

    STATUS=Write_Flash(in_data,5);  

    Delay(0x02FFFF);  

    if(STATUS)  

    {  

            GPIO_SetBits(GPIOD, GPIO_Pin_13);//点亮led1  

            Read_Flash(out_data,5);  

            //printf("\r\n The Five Data Is : \r\n");  

            //for(i=0;i<5;i++)  

            //{  

                  //  printf("\r %d \r",out_data[i]);  

            //}  

    }  

    while(1);  


关键字:STM32  flash  读写操作 引用地址:STM32 flash 读写操作

上一篇:基于arm7的(lpc2388)flash的读写操作
下一篇:STM32F103系列 PB4引脚问题

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

基于STM32的八种GPIO输入输出模式解析
最近在看数据手册的时候,发现STM32的GPIO输入输出模式的配置种类有8种之多(输入和输入各4种): (1)GPIO_Mode_AIN模拟输入 (2)GPIO_Mode_IN_FLOATING浮空输入 (3)GPIO_Mode_IPD下拉输入 (4)GPIO_Mode_IPU上拉输入 (5)GPIO_Mode_Out_OD开漏输出 (6)GPIO_Mode_Out_PP推挽输出 (7)GPIO_Mode_AF_OD复用开漏输出 (8)GPIO_Mode_AF_PP复用推挽输出 我们平时接触的最多的也就是推挽输出、开漏输出、上拉输入这三种,但对于各种模式下IO口的内部电路和典型应用,STM32的数据手册中也未曾做过详细的说明和归纳
[单片机]
基于<font color='red'>STM32</font>的八种GPIO输入输出模式解析
STM32定时器产生PWM彻底应用
这次学习STM32花了很长时间,一个礼拜多,也有颇多收获,学习过程也有颇多曲折。这次的任务是:用STM32的一个定时器在四个通道上产生四路频率可调占空比可调的PWM波。 看到这个题,我先看STM32的数据手册,把STM32的定时器手册看完就花了一天,但是看了一遍任然不知道所云,就看库函数,略有点理解,就想一哈把这个程序调出来,于是就花了一天多时间仿照网上别人的程序来写,花了一天多写出来调试,结果行不通,做了无用功,于是静下心来想想,还是一步一步的来。 我先用STM32的通用定时器用PWM模式产生四路相同占空比,不同频率的PWM波,配置如下: RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM
[单片机]
点亮LED(库函数实现)
本次测试采用的芯片是STM32F103CB 我的开发板如下: 此开发板有8个led,分别为D11,D12,D13,D14,D15,D16,D17,D18。查询核心板的电路图后知道其对应芯片的控制引脚为P0.0,P0.1,P0.2,P0.3,P0.4,P0.5,P0.6,P0.7,P0.8。 现在开始测试点亮D11。主要源代码如下: 1 //main.c 2 #include pbdata.h 3 #include led.h 4 5 int main(void) 6 { 7 led_init(); 8 led_setBit(); 9 } 1 //pbdata.h 2 #ifndef _pbdata
[单片机]
点亮LED(库函数实现)
STM32电机矢量控制】记录9——状态观测器与锁相环
状态观测器: 理论依据:根据控制理论,如果一个系统能够完全通过其检测到的输出值来重构其系统状态,则认为该系统是可观测的。其作用于无传感器转子的位置和速度的检测反馈,再作用到PARK变换和转矩磁链控制上。 Luenberger观测器的离散化: (其观测器的闭环参数为经验验证值) 引入估测电流( iα,iβ )的反馈值并离散化(T 为采样时间),可得当前的反向电动势 eα 和eβ; 再由反向电动势 eα 和eβ 的计算出转子的位置角。 可以将其定义式相除,可得到转子位置角,但是这方法是开环的,对耦合在反电动势里的干扰非常敏感,它会使反电动势成为非正弦信号) 程序中使用的是锁相环方式,以PI闭环方式调节ωr以保持其输入为0 (电角度领先
[单片机]
【<font color='red'>STM32</font>电机矢量控制】记录9——状态观测器与锁相环
一文搞懂STM32开发用的HAL库
前言   相比较早几年使用标准库开发来讲,最近几年HAL库的使用是越来越多,那么我们开发应当使用哪一种呢,本文着重介绍常用的几种开发方式及相互之间的区别,白猫也好、黑猫也好,抓到耗子就是好猫。 STM32三种开发方式   通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的。一般大多数都会选用标准库和HAL库,而极少部分人会通过直接配置寄存器进行开发。   网上关于标准库、HAL库的描述相信是数不胜数。可是一个对于很多刚入门的朋友还是没法很直观的去真正了解这些不同开发发方式彼此之间的区别,所以笔者想以一种非常直白的方式,用自己的理解去将这些东西表述出来,
[单片机]
一文搞懂<font color='red'>STM32</font>开发用的HAL库
TMS320F2812片内Flash在线烧写技术
TMS320F2812(以下简称F2812)是美国德州仪器公司(TI)新一代32位定点数字信号处理器(DSP),主要应用于逆变器控制、电机控制等领域,并拥有工作频率高达150 MHz的32位DSP内核处理器,可以高效可靠地实现自适应控制和状态控制等。因此,TMS320F28X系列DSP已成为自动控制领域的首选控制器件。F2812片内拥有高达128 KBx16位的F1ash程序存储器,可以满足大多数程序存储需要。在研究基于JTAG接口的两种常用Flash烧写技术(CCS插件烧写技术和Flash281x_API函数库烧写技术)的基础上,提出了一种利用RS485与PC机的串行通讯实现Flash烧写的方法。 片内Flash简
[单片机]
TMS320F2812片内<font color='red'>Flash</font>在线烧写技术
基于VSCode搭建STM32开发环境
众所周知, Keil 是一款收费软件,虽然可以Po解使用,但很多 公司 还是有点害怕,想必有不少读者都收到过**函。 之前,开发 单片机 项目,可以说 Keil 是最佳选择之一,但VSCode横空问世之后,这种格局被打破。 因为 VSCode 免费且好用,可以安装各种插件,很多 工程师 逐渐从Keil 转向了 VSCode。而且,VSCode还能实现 Keil 不能实现的一些功能。 下面就给大家分享一下 VSCode 搭建 STM32 开发环境的一些常规且使用的功能。 一、需要的软件和工具 下载 最新版 VS Code: 安装好插件,具有良好的代码补全与调试功能。 下载 LLVM:用于代码补全,其实可以理解
[单片机]
基于VSCode搭建<font color='red'>STM32</font>开发环境
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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