前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >M-Arch(番外7)GD32L233评测-FLASH读写

M-Arch(番外7)GD32L233评测-FLASH读写

作者头像
滚神大人
发布2022-03-22 12:07:47
5350
发布2022-03-22 12:07:47
举报
文章被收录于专栏:趣Python

前言

今儿这个是flash的读写测试。

闪存结构

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

  • 主存储区(Main memory),其特点是可读可写,存放的是程序;如果空间足够,也可以用来存放数据(参数,记录等)。
  • 系统存储区(System memory),有的翻译叫存储块,实际上就是Boot Loader,只读。
  • 一次性存储区OTP(One Time Program),其特点是只能由1写为0,不能由0写为1,可以用来存储保护性或防伪性内容。
  • 选项字节(Option bytes),存放的是系统的一些配置数据,上电时加载到寄存器中。

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

GD32L233 Flash结构

GD32F450 Flash结构

在flash分区的专用名称中,记住下面这个公式可以很好的理解分区:

页(Page)< 扇区(Sector) < 块(Block,bank)< 芯片(Chip)

一般容量小的就是分页,容量大就分块+扇区。

FMC测试

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

  1. FMC不能“自杀”,即不能由程序自己写自己,所以FMC只能写非程序区的Flash。
  2. FMC操作上需要先unlock,操作完之后记得lock。

代码:

代码语言:javascript
复制
static void fmc_test(void)
{
#ifdef FMC_TEST
    #define FMC_TEST_DATA_COUNT 5
    static uint8_t fmc_test_flag = 0;
    uint32_t index = 0;
#if defined(GD32)
    uint32_t addr =  0x08100000;
    uint32_t sector = CTL_SECTOR_NUMBER_12;
#endif
#if defined(GD32M0)    
    uint32_t addr =  0x0803E000;
    uint32_t sector = addr;
    #define fmc_sector_erase fmc_page_erase
#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
}

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

代码语言:javascript
复制
before erase, data = 0x9 0xA 0xB 0xC 0xD 
after erase[0] data = 0xFFFFFFFF 0xFFFFFFFF 0xFFFFFFFF 0xFFFFFFFF 0xFFFFFFFF 
programing [0x803E004] state = [0]
programing [0x803E008] state = [0]
programing [0x803E00C] state = [0]
programing [0x803E010] state = [0]
programing [0x803E014] state = [0]
after program, data = 0x9 0xA 0xB 0xC 0xD 

OTP和OB展示

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

GD32L233 OB数据:

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 闪存结构
  • FMC测试
  • OTP和OB展示
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档