IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> M-Arch(4)第三个示例:Flash读写操作 -> 正文阅读

[嵌入式]M-Arch(4)第三个示例:Flash读写操作

前言

回顾下之前的章节:

  • 第一章节中我们描述了整个框架的核心设计思路以及主要的文件架构

  • 第二章节中我们基于一个简单的定时器OS实现了串口的数据打印,并完成了通用crc模块的设计和测试

  • 第三章节中我们给出了真随机数和伪随机数的概念和代码示例,并在架构上对接口进行了重构

本文我们将回顾下FMC的知识,并给出Flash读写的接口设计和示例,这在设计升级程序时十分重要。

闪存结构

闪存控制器(FMC),提供了片上闪存需要的所有功能。一般而言,MCU的Flash包括4个部分:

  • 主存储区(Main memory),其特点是可读可写,存放的是程序;如果空间足够,也可以用来存放数据(参数,记录等)。

  • 系统存储区(System memory),有的翻译叫存储块,实际上就是Boot Loader,只读。

  • 一次性存储区OTP(One Time Program),其特点是只能由1写为0,不能由0写为1,可以用来存储保护性或防伪性内容。

  • 选项字节(Option bytes),存放的是系统的一些配置数据,上电时加载到寄存器中。

Flash读写的流程和注意事项在芯片手册中写的清清白白,就不赘述了;如果大家感兴趣,可以对着厂家给的API接口比对着看,理解会更好一点。

FMC测试

FMC的操作实际上比较简单,厂家给的API都很成熟,需要注意的几个点:

  1. FMC不能“自杀”,即不能由程序自己写自己,所以FMC只能写非程序区的Flash。

  2. FMC操作上需要先unlock,操作完之后记得lock。

  3. STM和GD的接口略微有些不一样,使用上需要注意。

主存读写测试

配置Flash程序区:

flash配置

接口封装统一(io_fmc.h):

#ifdef?STM32
#define?fmc_sector_erase????FLASH_ErasePage
#define?fmc_unlock??????????FLASH_Unlock
#define?fmc_lock????????????FLASH_Lock
#define?fmc_word_program????FLASH_ProgramWord
#endif

测试函数:

多嘴一句,STM32给的擦除扇区接口的入口参数是扇区首地址,GD32给的接口是扇区编号,从软件使用的角度来看,GD32的更优。

static?uint8_t?fmc_test_flag?=?0;
static?void?fmc_test(void)
{
#ifdef?FMC_TEST
????#define?FMC_TEST_DATA_COUNT?5
????uint32_t?index?=?0;
#ifdef?GD32
????uint32_t?addr?=??0x08100000;
????uint32_t?sector?=?CTL_SECTOR_NUMBER_12;
#endif
#ifdef?STM32
????uint32_t?addr?=??0x08040000;
????uint32_t?sector?=?addr;
#endif
????uint32_t?*pdata?=?(uint32_t?*)addr;
????int32_t?fmc_state;

????if?(fmc_test_flag)
????{
????????return;
????}
????fmc_test_flag?=?1;

????/*?1.?before?erase?*/
????printf("before?erase,\tdata?=?");
????for?(index?=?0;?index?<?FMC_TEST_DATA_COUNT;?index++)
????{
????????printf("0x%X?",?pdata[index]);
????}
????printf("\r\n");

????/*?2.?after?erase?*/
????fmc_unlock();
????fmc_state?=?fmc_sector_erase(sector);
????fmc_lock();
????printf("after?erase[%d]\tdata?=?",?fmc_state);
????for?(index?=?0;?index?<?FMC_TEST_DATA_COUNT;?index++)
????{
????????printf("0x%X?",?pdata[index]);
????}
????printf("\r\n");

????/*?2.?after?program?*/
????fmc_unlock();
????for?(index?=?0;?index?<?FMC_TEST_DATA_COUNT;?index++)
????{
????????fmc_state?=?fmc_word_program(addr,?index+9);
????????addr?+=?4;
????????printf("programing?[0x%0X]?state?=?[%d]\r\n",?addr,?fmc_state);
????}
????fmc_lock();
????printf("after?program,\tdata?=?");
????for?(index?=?0;?index?<?FMC_TEST_DATA_COUNT;?index++)
????{
????????printf("0x%X?",?pdata[index]);
????}
????printf("\r\n");
????
#endif
????
}

测试结果(GD32,正常状态返回值是0):

before?erase,?data?=?0x9?0xA?0xB?0xC?0xD?
after?erase[0]?data?=?0xFFFFFFFF?0xFFFFFFFF?0xFFFFFFFF?0xFFFFFFFF?0xFFFFFFFF?
programing?[0x8100004]?state?=?[0]
programing?[0x8100008]?state?=?[0]
programing?[0x810000C]?state?=?[0]
programing?[0x8100010]?state?=?[0]
programing?[0x8100014]?state?=?[0]
after?program,?data?=?0x9?0xA?0xB?0xC?0xD?

测试结果(STM32,正常状态返回值是4):

before?erase,?data?=?0x9?0xA?0xB?0xC?0xD?
after?erase[4]?data?=?0xFFFFFFFF?0xFFFFFFFF?0xFFFFFFFF?0xFFFFFFFF?0xFFFFFFFF?
programing?[0x8040004]?state?=?[4]
programing?[0x8040008]?state?=?[4]
programing?[0x804000C]?state?=?[4]
programing?[0x8040010]?state?=?[4]
programing?[0x8040014]?state?=?[4]
after?program,?data?=?0x9?0xA?0xB?0xC?0xD

OTP和OB展示

注:STM32F103不包含OTP区。

通过Keil的调试功能可以查看Flash地址的数据,当然也可以直接在程序中读取。

STM OB的描述:

STM OB数据:

GD32 OB数据:

GD32 OPT数据:

--EOF--

放个码,求粉,谢谢!

求粉
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-06 11:19:00  更:2021-09-06 11:20:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 9:22:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计