Terry 发表于 2015-11-27 15:08:45

STM32 内部FLASH编程

编译环境:我用的是(Keil)MDK4.7.2   
stm32库版本:我用的是3.5.0
一、本文不对FLASH的基础知识做详细的介绍,不懂得地方请查阅有关资料。
  对STM32 内部FLASH进行编程操作,需要遵循以下流程:
  FLASH解锁
  清除相关标志位
  擦除FLASH(先擦除后写入的原因是为了工业上制作方便,即物理实现方便)
  写入FLASH
  锁定FLASH
实例:
#define FLASH_PAGE_SIZE    ((uint16_t)0x400) //如果一页为1K大小
#define WRITE_START_ADDR   ((uint32_t)0x08008000)//写入的起始地址
#define WRITE_END_ADDR      ((uint32_t)0x0800C000)//结束地址
uint32_t EraseCounter = 0x00, Address = 0x00;//擦除计数,写入地址
uint32_t Data = 0x3210ABCD;//要写入的数据
uint32_t NbrOfPage = 0x00;//记录要擦除的页数
volatile FLASH_Status FLASHStatus = FLASH_COMPLETE;/*FLASH擦除完成标志*/
void main()
{
/*解锁FLASH*/
 FLASH_Unlock();
/*计算需要擦除FLASH页的个数 */
 NbrOfPage = (WRITE_END_ADDR - WRITE_START_ADDR) / FLASH_PAGE_SIZE;
/* 清除所有挂起标志位 */
  FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);      
/* 擦除FLASH 页*/
 for(EraseCounter = 0; (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++)
  {
      FLASHStatus = FLASH_ErasePage(WRITE_START_ADDR + (FLASH_PAGE_SIZE * EraseCounter));
  }
/* 写入FLASH*/
 Address = WRITE_START_ADDR;
 while((Address < WRITE_END_ADDR) && (FLASHStatus == FLASH_COMPLETE))
  {
      FLASHStatus = FLASH_ProgramWord(Address, Data);
      Address = Address + 4;
  }
/* 锁定FLASH*/
 FLASH_Lock();
}

mzh 发表于 2015-11-30 16:16:59

很实用的东西,谢谢楼主

feel 发表于 2015-12-10 21:29:39

好厉害,好想学习下

弦动 发表于 2016-9-22 13:42:24

谢谢分享~~~~~~~~~~~~~~~~~~

jipin 发表于 2016-9-23 09:16:52

请教如果要用FLASH存储一个结构体数据需要如何处理

Terry 发表于 2016-9-30 10:19:52

jipin 发表于 2016-9-23 09:16
请教如果要用FLASH存储一个结构体数据需要如何处理

我们可以先写flash写的基础函数,比如:
int8_t flash_write(uint8_t * buf_to_save , uint16_t len , uint32_t w_flash_addr);
参数1:待写入数据地址
参数2:待写入数据长度
参数3:Flash地址
其实,上层调用写接口的时候,不需要关心写入内容的数据结构
页: [1]
查看完整版本: STM32 内部FLASH编程