stm32f103zet6怎么保存flash参数

发布时间:2023-10-10  

  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。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>