首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >M-Arch(4)第三个示例:Flash读写操作

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

作者头像
滚神大人
发布于 2021-09-10 07:36:05
发布于 2021-09-10 07:36:05
88500
代码可运行
举报
文章被收录于专栏:趣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
6650
M-Arch(番外7)GD32L233评测-FLASH读写
M-Arch(雅特力M4)【AT-START-F425测评】No.05 FLASH
今儿这个是flash的读写测试,AT32F425R8T7-7拥有64K的flash空间。
滚神大人
2022/06/09
6290
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
3.9K0
【GD32L233C-START】6、flash读写——使用内部flash存储数据
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
4400
M-Arch(8)第七个示例:串口和DMA
由于之前我们已经使用了串口1(STM中是USART1,GD中是USART0),本文中以串口2作为示例(STM中是USART2,GD中是USART1)。
滚神大人
2022/03/22
6590
M-Arch(8)第七个示例:串口和DMA
利用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(5)第四个示例:ADC&DMA
本文我们将总结下ADC和DMA的基本使用方法,并给出示例,从中我们可以看到GD和STM在设计上的差别。
滚神大人
2021/10/08
6030
M-Arch(6)第五个示例:DAC
本文我们将总结下DAC的基本使用方法,并通过DAC生成任意频率的正弦波,三角波和方波。
滚神大人
2021/10/08
5090
M-Arch(3)第二个示例:随机数
先来啰嗦的说一下随机数的概念,真随机数指通过物理现象来产生的随机数,比如噪声,核裂变等,伪随机数是通过软件算法可重复生成的随机数。
滚神大人
2021/09/10
4420
STM32Cube-18 | 使用QSPI读写SPI Flash(W25Q64)
本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件QSPI外设与 SPI Flash 通信(W25Q64)。
Mculover666
2020/07/16
4.8K0
STM32Cube-18 | 使用QSPI读写SPI Flash(W25Q64)
M-Arch(10)第九个示例:SPI与DS1302
本文我们将介绍下SPI的概念,以及如何使用三线SPI的时序驱动DS1302时钟芯片,同时我们也将给出用模拟IO方式驱动DS1302的方法。
滚神大人
2021/11/02
9160
M-Arch(7)第六个示例:时钟频率
通常所说的系统时钟就是指时钟系统,它是由振荡器(信号源)、定时唤醒器、分频器等组成的电路。常用的信号源有晶体振荡器和RC振荡器,如下图所示:
滚神大人
2021/10/08
7540
SFUD | 一个简洁实用的开源项目,帮你轻松搞定SPI Flash
如果有的话,你很幸运哈哈,在对的时间遇到对的库,接下来 mculover666 带你一起手把手在裸机移植 SFUD。
Mculover666
2020/07/16
2.9K0
SFUD | 一个简洁实用的开源项目,帮你轻松搞定SPI Flash
【STM32笔记】使用STM32内部Flash额外的空间来存储数据
STM32 芯片内部的 FLASH 存储器,主要用于存储我们代码。如果内部FLASH存储完我们的代码还有剩余的空间,那么这些剩余的空间我们就可以利用起来,存储一些需要掉电保存的数据。
正念君
2019/11/27
8K0
【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
stm32cubemx软件库_STM32cube
前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用
全栈程序员站长
2022/09/28
9330
stm32cubemx软件库_STM32cube
STM32F103-FLASH读写
用户11186929
2024/07/01
1990
(39)STM32——FLASH闪存
        通过这两个步骤,即可解锁 FLASH_CR,如果写入错误,那么 FLASH_CR 将被锁定,直到下次复位后才可以再次解锁。
小点点
2022/12/12
1.6K0
(39)STM32——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(番外7)GD32L233评测-FLASH读写
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档