单片机
返回首页

stm32f103zet6怎么保存flash参数

2023-10-10 来源:elecfans

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

  主存储器,该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每页 2K 字节。注意,小容量和中容量产品则每页只有 1K 字节。从上图可以看出主存储器的起始地址就是0X08000000, B0、B1 都接 GND 的时候,就是从 0X08000000开始运行代码的。

  stm32f103zet6怎么保存flash参数

  信息块,该部分分为 2 个小部分,其中启动程序代码,是用来存储 ST 自带的启动程序,用于串口下载代码,当 B0 接 V3.3,B1 接 GND 的时候,运行的就是这部分代码。用户选择字节,则一般用于配置写保护、读保护等功能,本章不作介绍。


  闪存存储器接口寄存器,该部分用于控制闪存读写等,是整个闪存模块的控制机构。对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。


  在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。


  flash大小64K。本例子0x0800 0000~0x800 3000作为bootloader使用,0x0800 3000~0x0800 C000作为程序存放地址,0x0800 C000~0x0800 FFFF作为本例子的数据存放区域。


  程序:

  #include “stm32f10x_flash.h”

  #define PageSize 1024

  u32 data[10] = {1,2,3,4,5,6,7,8,9,10};

  u32 data_temp[10] = {0};

  u8 flash_write(u32 StartAddr,u32 *p_data,u32 size);

  int flash_read(u32 StartAddr,u32 *p_data,u32 size);

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

  * flash的写函数:输入:

  u32 StartAddr flash起始地址

  u32 *p_data 待写入数据指针u32 size写入数据的数量

  输出:0:正确执行

  非0:出错

  注意:输入数据一定是u32 的指针,即数据一定是按照4字节对齐写入的。

  所以:size也是u32的个数(字节数的4分之一)

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

  u8 flash_write(u32 StartAddr,u32 *p_data,u32 size)

  {

  volatile FLASH_Status FLASHStatus;

  u32 EndAddr=StartAddr+size*4;

  vu32 NbrOfPage = 0;

  u32 EraseCounter = 0x0, Address = 0x0;

  int i;

  int MemoryProgramStatus=1;

  //为一是通过

  FLASH_Unlock(); //解锁函数

  NbrOfPage=((EndAddr-StartAddr)》》10)+1;//有多少个页被擦除//清除所有已有标志

  FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);

  //擦页

  FLASHStatus=FLASH_COMPLETE;

  for(EraseCounter=0;(EraseCounter《NbrOfPage)&&(FLASHStatus==FLASH_COMPLETE);EraseCounter++)

  {

  FLASHStatus=FLASH_ErasePage(StartAddr+(PageSize*EraseCounter));

  }

  //开始写数据

  Address = StartAddr;

  i=0;

  while((Address《EndAddr)&&(FLASHStatus==FLASH_COMPLETE))

  { FLASHStatus=FLASH_ProgramWord(Address,p_data[i++]);

  Address=Address+4;

  }

  //检验数据是否出错

  Address = StartAddr;

  i=0;

  while((Address 《 EndAddr) && (MemoryProgramStatus != 0))

  {

  if((*(vu32*) Address) != p_data[i++])

  { MemoryProgramStatus = 0;

  return 1;

  }

  Address += 4;

  }

  return 0;

  }

  int flash_read(u32 StartAddr,u32 *p_data,u32 size)

  {

  u32 EndAddr=StartAddr+size*4;

  int MemoryProgramStatus=1;

  u32 Address = 0x0;

  int i=0;

  Address = StartAddr;

  while((Address 《 EndAddr) && (MemoryProgramStatus != 0))

  {

  p_data[i++]=(*(vu32*) Address);

  Address += 4;

  }

  return 0;

  }

  调用例子:

  flash_write(0x0800C000,&data[0],10);

  flash_read(0x0800C000,&data_temp[0],10);

  注意:#define PageSize 1024 根据不同型号有1K与2K的不同

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

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

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

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

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


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

最新器件
精选电路图
  • 光控音效发生器电路

  • 优化电路板布局的简单方法

  • 一个简单的立体声平衡指示器电路

  • 分享一个电网倾角计电路

  • 使用NE555和磁簧开关的橱柜照明电路

  • 一种构建12V和230V双直流电源的简单方法

    相关电子头条文章