STM32内部FLASH读写操作详解

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32 芯片内部的 FLASH 存储器,主要用于存储我们代码。如果内部FLASH存储完我们的代码还有剩余的空间,那么这些剩余的空间我们就可以利用起来,存储一些需要掉电保存的数据。本文以STM32103ZET6为例。

STM32103ZET6属于大容量产品,其闪存模块组织如下:

其主存储器大小为512KB,分为256页,每页大小都为2KB。我们的程序一般默认烧写到第0页的起始地址(0x08000000)处。

当BOOT0引脚和BOOT1引脚都接GND时,就是从这个地址开始运行代码的。这个地址在keil中可以看到:

假如我们要下载的程序大小为4.05KB,则第0、1、2页用于保存我们的程序,我们需要掉电保存的数据只能保存在第3~第255页这一部分空间内。

我们最终要下载的程序大小可在工程对应的.map文件中看到。.map文件可以双击工程的Target的名字快速打开,如:

下面对STM32内部FLASH进行简单的读写测试:

内部FLASH读写测试

流程图如下:

本流程图省略异常情况,只考虑成功的情况:

示例代码:

本例的关键代码如下(以读写第255页为例):

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

*------------------------------------------STM32 Demo---------------------------------------------------

*

* 工程说明:STM32内部FLASH实验

* 作者:ZhengNian

* 博客:zhengnianli.github.io

* 公众号:嵌入式大杂烩

*

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

#define MAIN_CONFIG

#include "config.h"

/* STM32F103ZET6有256页,每一页的大小都为2KB */

#define ADDR_FLASH_PAGE_255 ((uint32_t)0x0807F800) /* Page255 2KB */

/* FLASH读写测试结果 */

#define TEST_ERROR -1 /* 错误(擦除、写入错误) */

#define TEST_SUCCESS 0 /* 成功 */

#define TEST_FAILED 1 /* 失败 */

/* Flash读写测试buf */

#define BufferSize 6

uint16_t usFlashWriteBuf[BufferSize] =

{0x0101,0x0202,0x0303,0x0404,0x0505,0x0606};

uint16_t usFlashReadBuf[BufferSize] = {0};

/* 供本文件调用的函数声明 */

static int FlashReadWriteTest(void);

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

** 函数: main

**------------------------------------------------------------------------------------------------------

** 参数: void

** 返回: 无

** 说明: 主函数

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

int main(void)

{

/* 上电初始化 */

SysInit();

/* 内部Flash读写测试 */

if (TEST_SUCCESS == FlashReadWriteTest())

{

printf("Flash test success!\n");

}

else

{

printf("Flash test failed!\n");

}

while (1)

{}

}

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

** 函数: FlashReadWriteTest, 内部Flash读写测试函数

**------------------------------------------------------------------------------------------------------

** 参数: void

** 返回: TEST_ERROR:错误(擦除、写入错误) TEST_SUCCESS:成功TEST_FAILED:失败

** 说明: 无

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

static int FlashReadWriteTest(void)

{

uint32_t ucStartAddr;

/* 解锁 */

FLASH_Unlock();

/* 擦除操作 */

ucStartAddr = ADDR_FLASH_PAGE_255;

if (FLASH_COMPLETE != FLASH_ErasePage(ucStartAddr))

{

printf("Erase Error!\n");

return TEST_ERROR;

}

else

{

ucStartAddr = ADDR_FLASH_PAGE_255;

printf("擦除成功,此时FLASH中值为:\n");

for (int i = 0; i < BufferSize; i++)

{

usFlashReadBuf[i] = *(uint32_t*)ucStartAddr;

printf("ucFlashReadBuf[%d] = 0x%.4x\n", i, usFlashReadBuf[i]);

ucStartAddr += 2;

}

}

/* 写入操作 */

ucStartAddr = ADDR_FLASH_PAGE_255;

printf("\n往FLASH中写入的数据为:\n");

for (int i = 0; i < BufferSize; i++)

{

if (FLASH_COMPLETE != FLASH_ProgramHalfWord(ucStartAddr, usFlashWriteBuf[i]))

{

printf("Write Error!\n");

return TEST_ERROR;

}

printf("ucFlashWriteBuf[%d] = 0x%.4x\n", i, usFlashWriteBuf[i]);

ucStartAddr += 2;

}

/* 上锁 */

FLASH_Lock();

相关文档
最新文档