历史上的今天

今天是:2024年08月23日(星期五)

正在发生

2021年08月23日 | 玩转STM32CubeMX | STM32内部FLASH

发布者:火星 来源: eefocus关键字:STM32CubeMX  STM32  内部FLASH 手机看文章 扫描二维码
随时随地手机看文章

1.内部FLASH简介

之前的文章中介绍过STM32F1利用SPI与外部FLASH(W25QXX芯片)通讯的例程,本例程将介绍STM32F1的内部FLASH,通过内部FLASH实现数据读写操作。


不同型号的STM32,其FLASH容量也有所不同,最小的只有16K字节,最大的则达到了1024K字节。此处我们使用的是STM32F103ZET6,其FLASH容量为512K字节,属于大容量产品,大容量产品的闪存模块组织图如下图示

STM32F1的闪存模块由:主存储器、信息块和闪存存储器接口寄存器3部分组成


*主存储器:用来存放代码和数据常量,起始地址是0x08000000,BOOT0和BOOT1都接GND时,就是从该起始地址运行代码的

 

*信息块:分为2个小部分,启动程序代码是用来存储ST自带的启动程序,用于串口下载代码,BOOT0接3.3V,BOOT1接GND时,运行的就是这部分代码;选择字节则一般用于配置写保护、读保护等功能

 

*闪存存储器接口寄存器:用于控制闪存读写等,是整个闪存模块的控制机构


对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理:编程与擦除的高电压由内部产生。在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行,即在进行写或擦除操作时,不能进行代码或数据的读取操作。


下面介绍闪存的读取、编程和擦除:

⏩ 闪存的读取

内置闪存模块可以在通用地址空间直接寻址,任何32位数据的读操作都能访问闪存模块的内容并得到相应的数据。


例如,要从地址addr,读取一个半字,可通过如下语句读取:

data = *(__IO uint16_t*)addr

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


⏩ 闪存的编程
STM32的闪存编程是由FPEC(闪存编程和擦除控制器)模块处理的,这个模块包含7个32位寄存器,它们分别是:


- FPEC键寄存器(FLASH_KEYR)


- 选择字节键寄存器(FLASH_OPTKEYR)


- 闪存控制寄存器(FLASH_CR)


- 闪存状态寄存器(FLASH_SR)


- 闪存地址寄存器(FLASH_AR)


- 选择字节寄存器(FLASH_OBR)


- 写保护寄存器(FLASH_WRPR)


其中FPEC键寄存器共有3中键值:
PDPRT=0x000000A5; KEY1=0x45670123; KEY2=0xCDEF89AB
STM32复位后,FPEC模块是被保护的,不能写入FLASH_CR寄存器;通过写入特定的序列到FLASH_KEYR寄存器可以打开FPEC模块(即写入KEY1和KEY2),只有在写保护被解除后,才能操作相关寄存器。


闪存编程过程如下图所示:

⏩ 闪存的擦除
闪存编程的时候,要先判断其写入地址的FLASH是被擦除了的(也就是其值必须是0xFFFF),否则无法写入。闪存擦除分为页擦除和整片擦除。


闪存页擦除过程如下图示:

官方固件HAL库FLASH操作的几个常见函数:


2.硬件设计

D1指示灯用来提示系统运行状态,K_UP按键用来控制FLASH的数据写入,K_DOWN按键用来控制FLASH的数据读取,数据的写入与读取信息通过串口1打印出来


*指示灯D1

 

*USART1串口

 

*STM32F1内部FLASH

 

*K_UP和K_DOWN按键


3.软件设计

3.1 STM32CubeMX设置

➡️ RCC设置外接HSE,时钟设置为72M

➡️ PC0设置为GPIO推挽输出模式、上拉、高速、默认输出电平为高电平

➡️ USART1选择为异步通讯方式,波特率设置为115200Bits/s,传输数据长度为8Bit,无奇偶校验,1位停止位

➡️ PA0设置为GPIO输入模式、下拉模式;PE3设置为GPIO输入模式、上拉模式

➡️输入工程名,选择路径(不要有中文),选择MDK-ARM V5;勾选Generated periphera initialization as a pair of ‘.c/.h’ files per IP ;点击GENERATE CODE,生成工程代码


3.2 MDK-ARM软件编程

➡️ 创建按键驱动文件key.c 和相关头文件key.h,驱动代码参考按键输入例程

➡️ 创建FLASH驱动文件stmflash.c 和相关头文件stmflash.h,这里仅介绍几个重要的函数,工程源文件下载方式见文末介绍


//读取指定地址的半字

uint16_t STMFLASH_ReadHalfWord(uint32_t faddr){

  return *(__IO uint16_t*)faddr; 

}

//不检查的写入

void STMFLASH_Write_NoCheck(uint32_t WriteAddr,uint16_t *pBuffer,uint16_t NumToWrite){  

  uint16_t i;

  for(i=0;i    HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,WriteAddr,pBuffer[i]);

    WriteAddr+=2;//一个地址对应8bits,写入半字,所以地址加2

  }  


//FLASH写函数比较复杂,详细代码请下载源文件查阅

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


void STMFLASH_Read(uint32_t ReadAddr,uint16_t *pBuffer,uint16_t NumToRead){

  uint16_t i;

  for(i=0;i    pBuffer[i]=STMFLASH_ReadHalfWord(ReadAddr); //读取2个字节

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

  }

}


➡️ 在main.c文件下编写STM32 flash测试代码


/* USER CODE BEGIN PV */

const uint8_t Text_Buf[] = {"STM32F103ZET6 FLASH TEST"};

#define TEXTSIZE sizeof(Text_Buf)

//设置FLASH保存地址(要大于FLASH起始地址)

#define FLASH_SAVE_ADDR 0x08070000

/* USER CODE END PV */

int main(void){

  /* USER CODE BEGIN 1 */

  uint8_t key;

  uint8_t Read_Buf[TEXTSIZE];

  /* USER CODE END 1 */

  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();

  MX_USART1_UART_Init();

  /* USER CODE BEGIN 2 */

  printf("STM32 Flash Test...rn");

  /* USER CODE END 2 */

  while (1){

    key = KEY_Scan(0);

    if(key == KEY_UP_PRES){

      STMFLASH_Write(FLASH_SAVE_ADDR,(uint16_t *)Text_Buf,TEXTSIZE);

      printf("FLASH Write : %srn",Text_Buf);

    }

    if(key == KEY_DOWN_PRES){

      STMFLASH_Read(FLASH_SAVE_ADDR,(uint16_t *)Read_Buf,TEXTSIZE);

      printf("FLASH Read : %srn",Read_Buf);

    }

    HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);

    HAL_Delay(200);

  }

}


4.下载验证

编译无误下载到开发板后,可以看到D1指示灯不断闪烁,当按下K_UP按键后数据写入到FLASH内,当按下K_DOWN按键后将写入的数据读取出来,同时串口打印出相应信息

关键字:STM32CubeMX  STM32  内部FLASH 引用地址:玩转STM32CubeMX | STM32内部FLASH

上一篇:STM32内部Flash读写操作接口
下一篇:STM32对内部Flash的保护措施

推荐阅读

  近日,GTM Research发布2017年度全球光伏组串式逆变器排名,多家中国光伏逆变器制造商上榜。   根据排名,华为、阳光电源、SMA位列全球三相组串式逆变器前三甲,锦浪排名第四。   全球单相组串式逆变器榜单中,锦浪、台达、古瑞瓦特、固德威均进入全球前十。   该报告显示,就细分市场而言,2017年全球三相组串式逆变器出货量为46.233GW,同...
STM32f103的时钟有四个来源高速外部时钟信号(HSE)、低速外部时钟信号(LSE)、高速内部时钟信号(HSI)和低速内部时钟信号(LSI),图中分别用蓝色的①~④标注。 ①HSE高速外部时钟:由外部4~16MHz的晶体或有源晶振提供,通常采用8MHz,ST三合一板上的也是8MHz。②LSI低速外部时钟:外部晶体提供,主要是给实时时钟(RTC),一般为32.768kHz。③HSI高速...
继华硕Zenfone 7闲鱼曝光后,该机又一次被数码博主 @顺利数码pro曝出,此次泄露照更加清晰。确认了华硕 Zenfone 7将采用旋转三摄像头和侧边指纹。华硕 ZenFone7/Pro 将于8月26日正式发布。配置方面,华硕 ZenFone7将采用一块京东方的 LCD 屏,尺寸为6.4英寸,分辨率为1080 x 2340,搭载骁龙865处理器 + 16GB 运存,配备索尼 IMX686主摄 +...
近日,盈趣科技发布半年度业绩报告,2021年上半年实现营业收入36.53亿元,同比增加113.4%;归属于上市公司股东的净利润5.7亿元,同比增加46.64%;基本每股收益盈利0.73元,同比增加46%。就主要业绩驱动因素,盈趣科技表示,智能制造行业发展空间广阔,公司坚持深耕UDM智能制造业务,坚持以国际知名企业客户与高端产品市场为主导地位,坚持“为客户提供一流...

史海拾趣

问答坊 | AI 解惑

基于DSP的自动指纹识别系统

摘要:文章介绍了一种基于TI公司的TMS320VC5402来构造指纹识别系统的方法。详细论述了系统的各个组成部分以及指纹识别算法的实现流程,结合VC5402的指令集和自身结构特点,讨论了如何高效的设计应用程序的方法。文章对如何将DSP的主机接口(HPI)改 ...…

查看全部问答∨

protel99se学习教程

protel99se学习教程…

查看全部问答∨

谁有XELTEK 编程器SuperPro.s电路原理图?

谁有XELTEK SuperPro.s电路原理图?…

查看全部问答∨

自动五线谱识别及音乐合成装置

记得很早以前看过一个概念产品-翻译笔,用一支笔沿着文字滑动,可以将这些文字翻译成另一种语言。当年的概念产品已经成为现实,已经有公司在销售了。如果有人想做类似的产品,这个五线谱识别装置应该是很好的预研试验。因为相对于文字来讲,五线 ...…

查看全部问答∨

今天收到了期待已久的测风仪

今天终于收到了之前提到的测风仪,东西很精致。     要感谢向农姐,还有dallas的工程师!谢谢你们给我这个认识新设备的机会!     先来个照片给大家看看 [ 本帖最后由 sjl2001 于 2009-12-21 10:08 编辑 ]…

查看全部问答∨

Linux为什么比BSD更受欢迎?

说到 Free Software 的 OS,当属 Linux,BSD 相对来讲是冷门多了.但BSD的风评可不会比Linux 差呀?那么是什么原因造成 Linux 比 BSD 更受欢迎呢? Linux 是出现约在 BSD 官司缠身、以及 Internet 开始风行之际.Linux 的开发者及爱好者正好能透过 Inter ...…

查看全部问答∨

新建DSP学习群,欢迎同好者加入!!!!

群号:24997450 群名:DSP学习群 本人新开的dsp学习群,欢迎大家加入及推荐朋友加入~~~~~~~~~~~~…

查看全部问答∨

求助 UCOS的时间性问题

请教大家一个问题 关于UC/OS-II 的比如 我的一个任务  TASKA  它需要每次进来的时候  计数一次  当计数到达1分钟的时候  需要置位标识位Flag1s=1我把这个意思用下边的简单程序表示 void TaskA (void *pData){   ...…

查看全部问答∨

LaunchPad答题

学习晚了,今天刚把题答完。希望还能够得到板子。…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved