stm32f103zet6怎么保存flash参数

发布者:InnovateMind最新更新时间:2023-10-10 来源: elecfans关键字:stm32f103zet6 手机看文章 扫描二维码
随时随地手机看文章

  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。


关键字:stm32f103zet6 引用地址:stm32f103zet6怎么保存flash参数

上一篇:每一个GPIO如何配置成一个外部中断触发源
下一篇:基于STM32的多功能γ能谱仪设计

小广播
设计资源 培训 开发板 精华推荐

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

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

更多开源项目推荐
换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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