Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >M-Arch(4)第三个示例:Flash读写操作

M-Arch(4)第三个示例:Flash读写操作

作者头像
滚神大人
发布于 2021-09-10 07:36:05
发布于 2021-09-10 07:36:05
89500
代码可运行
举报
文章被收录于专栏:趣Python趣Python
运行总次数:0
代码可运行

前言

回顾下之前的章节:

  • 第一章节中我们描述了整个框架的核心设计思路以及主要的文件架构
  • 第二章节中我们基于一个简单的定时器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):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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的更优。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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--

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 趣Python 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
M-Arch(番外7)GD32L233评测-FLASH读写
闪存控制器(FMC),提供了片上闪存需要的所有功能。一般而言,MCU的Flash包括4个部分:
滚神大人
2022/03/22
6840
M-Arch(番外7)GD32L233评测-FLASH读写
M-Arch(雅特力M4)【AT-START-F425测评】No.05 FLASH
今儿这个是flash的读写测试,AT32F425R8T7-7拥有64K的flash空间。
滚神大人
2022/06/09
6470
M-Arch(雅特力M4)【AT-START-F425测评】No.05 FLASH
【GD32L233C-START】6、flash读写——使用内部flash存储数据
1、关于GD32 Flash GD32 flash官方称为FMC。 2、关于GD32L233CCT6 flash 本次使用的GD32L233CCT6 flash大小为256k; 可以看出,分为64页,从0-63页,每页大小为4kb; 手册上说,支持32位整字和16位半字编程,但是库函数只有整字编程。 3、代码实现 #define FLASH_PAGE_SIZE 0x1000 //4k void FlashWrite(uint16_t len,uint8_t *da
ManInRoad
2022/04/04
4K0
【GD32L233C-START】6、flash读写——使用内部flash存储数据
STM32在线升级OTA,看这一篇就够啦~
本文主要讲解在线升级(OTA)的基础知识, 主要是针对IAP OTA从原理分析, 分区划分, 到代码编写和实验验证等过程阐述这一过程. 帮助大家加深对OTA的认识.
Mculover666
2020/07/16
12.9K5
STM32在线升级OTA,看这一篇就够啦~
M-Arch(8)第七个示例:串口和DMA
由于之前我们已经使用了串口1(STM中是USART1,GD中是USART0),本文中以串口2作为示例(STM中是USART2,GD中是USART1)。
滚神大人
2022/03/22
6750
M-Arch(8)第七个示例:串口和DMA
第4期 | SFUD,一款串行(SPI)Flash通用驱动库
本专栏由Mculover666创建,主要内容为寻找嵌入式领域内的优质开源项目,一是帮助开发者使用开源项目实现更多的功能,二是通过这些开源项目,学习大佬的代码及背后的实现思想,提升自己的代码水平,和其它专栏相比,本专栏的优势在于:
Mculover666
2020/07/16
1.9K0
第4期 | SFUD,一款串行(SPI)Flash通用驱动库
【STM32H7教程】第71章 STM32H7的内部Flash应用之模拟EEPROM
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第71章       STM32H7的内部Flash应用之模拟EEPR
Simon223
2020/03/11
2.3K0
M-Arch(11)第十个示例:PWM驱动有源蜂鸣器SFM-27-I
蜂鸣器有2种:无源蜂鸣器和有源蜂鸣器,所谓有源,是指蜂鸣器内部带有震荡源,通电就可以响;所谓无源,是指蜂鸣器内部不带震荡源,需要频率信号驱动。
滚神大人
2021/11/12
7610
M-Arch(11)第十个示例:PWM驱动有源蜂鸣器SFM-27-I
【STM32H7教程】第70章 STM32H7的内部Flash基础知识和HAL库API
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第70章       STM32H7的内部Flash基础知识和HAL库
Simon223
2020/03/11
2K0
从零编写STM32H7的MDK SPI FLASH下载算法
当我们要下载编译好的镜像到Flash时,首先要做的一步就是选择合适的Flash下载算法,而这个算法本身就是一个FLM文件:
AIoT-KK
2023/03/01
1.5K0
从零编写STM32H7的MDK SPI FLASH下载算法
利用MDK的FLM文件制作通用flash驱动
在进行Flash操作时,一般我们需要设计一套Flash抽象层,至少要包括flash的init,read、write、erase这些操作。但每更换一个单片机或者flash器件就要额外去编写flash驱动去适配init,read、write、erase。尽管有会者不难的属性加持,但适配所有的单片机或者flash器件,工作量也可想而知。
AIoT-KK
2023/03/01
2.7K1
利用MDK的FLM文件制作通用flash驱动
M-Arch(雅特力M4)【AT-START-F425测评】No.02 AT32F425开发环境搭建
之前在M-Arch中弄过STM32的M3,GD32的M4和M23,搭环境就顺风顺水了。
滚神大人
2022/04/18
5000
M-Arch(雅特力M4)【AT-START-F425测评】No.02 AT32F425开发环境搭建
M-Arch(5)第四个示例:ADC&DMA
本文我们将总结下ADC和DMA的基本使用方法,并给出示例,从中我们可以看到GD和STM在设计上的差别。
滚神大人
2021/10/08
6230
M-Arch(3)第二个示例:随机数
先来啰嗦的说一下随机数的概念,真随机数指通过物理现象来产生的随机数,比如噪声,核裂变等,伪随机数是通过软件算法可重复生成的随机数。
滚神大人
2021/09/10
4540
IAP升级要点总结
(1)程序分两部分,BOOT和APP分别编写; (2)flash空间划分(flash空间足够大的情况下,可以分成APP1和APP2进行备份升级);
ManInRoad
2022/02/09
1.2K0
IAP升级要点总结
【STM32笔记】使用STM32内部Flash额外的空间来存储数据
STM32 芯片内部的 FLASH 存储器,主要用于存储我们代码。如果内部FLASH存储完我们的代码还有剩余的空间,那么这些剩余的空间我们就可以利用起来,存储一些需要掉电保存的数据。
正念君
2019/11/27
8.2K0
M-Arch(6)第五个示例:DAC
本文我们将总结下DAC的基本使用方法,并通过DAC生成任意频率的正弦波,三角波和方波。
滚神大人
2021/10/08
5180
M-Arch(番外5)GD32L233评测-CRC(附 史上解释CRC最清楚的文章)
跟GD32F450相比,它可以支持计算7/8/16/32位的CRC校验码,而不仅仅是32位的校验码。
滚神大人
2022/03/22
1.1K0
M-Arch(番外5)GD32L233评测-CRC(附 史上解释CRC最清楚的文章)
M-Arch(2)第一个示例:串口和CRC
先把背景交代一下,上一篇讲了下基本的设计意图和框架,实际上整体框架已经有了,这篇先把整个框架再描述下,再来实现我们的第一个例子。
滚神大人
2021/09/10
4520
让QSPI FLASH(W25Q64)支持Fatfs文件系统
今天是过年放假的第一天(一共16天年假),但是说实话放不放假对我们做技术的人来说有放跟没放其实区别不大,因为自驱力是我们维持自身实力和饭碗的根本,16天的假期可以做很多事情学不少东西了,唯一的区别是终于可以好好睡个觉了,然后睡醒接着干就完了!想着小熊派板子上带了一个QSPI,有8MB的存储空间,那可不能浪费了呀!之前写的那些开源项目的图片资源其实放在这上面的,如何实现呢?方法如下:
杨源鑫
2021/02/23
3.5K1
让QSPI FLASH(W25Q64)支持Fatfs文件系统
推荐阅读
相关推荐
M-Arch(番外7)GD32L233评测-FLASH读写
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档