CH32V103系列MCU内部FLASH读写操作方式

描述

简介

CH32V103系列是以青稞V3A处理器为核心的32位通用MCU,该处理器是基于RISC-V开源指令集设计。片上集成了时钟安全机制、多级电源管理、通用DMA控制器。此系列具有1路USB2.0主机/设备接口、多通道12位ADC转换模块、多通道TouchKey、多组定时器、多路IIC/USART/SPI接口等丰富的外设资源。

本章教程将通过程序代码进行内部FLASH读写操作。

1、CH32V103内部FLASH简介及相关函数介绍

CH32V103芯片含有一个内部FLASH,其存储数据在掉电后不会丢失,主要用于存储程序代码。芯片在重新上电并复位后,可通过加载读取内部FLASH中程序代码运行。

通常,我们可通过两种方式对内部FLASH进行读写:一是通过下载器等外部工具读写内部FLASH,二是通过芯片运行程序代码读取自身内部FLASH。本章即通过第二种方法进行内部FLASH读写。此外,就读写速度而言,读写内部FLASH比外部FLASH快的多,且由于内部FLASH掉电后数据不会丢失,因此内部FLASH剩余空间可用于存储重要数据和关键记录。

由于内部FLASH可被通过外部工具或程序代码读写,为了防止内部FLASH中存储数据被获取,某些应用会禁止读写内部FLASH内容,或在第一次运行时计算加密信息并记录到某些区域,然后删除自身的部分加密代码,这些应用都涉及到内部FLASH的操作。

CH32V103内部FLASH主要包含主存储器和信息块两块区域,其中信息块又可被分为两块系统引导代码存储区域、用户选择字和厂商配置字区域。其中,主存储器区域主要用于用户的应用程序存储,以4K字节(32 页)单位进行写保护划分;除了“厂商配置字”区域出厂锁定,用户不可访问,其他区域在一定条件下用户可操作。

CH32V103内部FLASH具有2种编程/擦除方式,具体如下:

标准编程:此方式是默认编程方式(兼容方式)。这种模式下CPU以单次2字节方式执行编程,单次1K字节执行擦除及整片擦除操作。

快速编程:此方式采用页操作方式(推荐)。经过特定序列解锁后,执行单次128字节的编程及128字节擦除。

关于CH32V103内部FLASH具体信息,可参考CH32V103应用手册。CH32V103内部FLASH标准库函数具体内容如下:

RISC-V

 

RISC-V

2、硬件设计

本章教程主要通过程序代码进行内部FLASH读写操作,使用CH32V103内部资源,无需进行硬件连接。

3、软件设计

CH32V103内部FLASH编程/擦除方式有两种,一种是标准编程,一种是快速编程,本章即使用上述这两种方式分别进行内部FLASH读写操作,程序编程主要分3个步骤:

1、对内部FLASH进行解锁;

2、对内部FLASH进行页擦除;

3、对内部FLASH进行读写操作。

根据上述操作步骤,编写具体程序,具体程序如下:

flash.h文件

RISC-V

flash.h文件主要包含相关定义和函数声明;

flash.c文件

RISC-V

 

RISC-V

 

RISC-V

 

RISC-V

flash.c文件主要包含两个函数,一个是内部FLASH标准编程函数Flash_Test,一个是内部FLASH快速编程函数Flash_Test_Fast,这两个函数具体执行过程如下:

内部FLASH标准编程函数Flash_Test执行过程:

(1)调用FLASH_Unlock函数进行解锁;

(2) 根据起始地址及结束地址计算需要擦除页数;

(3) 调用FLASH_ClearFlag函数清除各种标志位;

(4) 使用for循环以及调用FLASH_ErasePage函数擦除页数,每次擦除一页;

(5) 使用while循环并调用FLASH_ProgramWord函数向起始地址至结束地址的存储区域都写入变量“Data”存储的数值数值;

(6) 调用FLASH_Lock函数进行上锁;

(7) 使用指针读取写入的数据内容并校验。

内部FLASH快速编程函数Flash_Test_Fast执行过程与标准编程执行过程类似,具体如下:

(1)调用FLASH_Unlock_Fast函数进行解锁;

(2) 调用FLASH_ErasePage_Fast函数擦除指定闪存页;

(3) 调用FLASH_BufReset函数复位闪存缓冲区,执行清除内部128字节缓存区操作;

(4) 调用FLASH_BufLoad函数向指定地址开始连续写入16字节数据(4字节/次操作,写的地址每次偏移量为4),然后执行加载到缓冲区;

(5) 调用FLASH_ProgramPage_Fast函数启动一次快速页编程动作,编程指定的闪存页;

(6) 调用FLASH_Lock_Fast函数进行上锁;

(7) 使用for循环读取编程地址进行数据校验并返回校验值。

以上两个函数执行过程可对照CH32V103应用手册第24章闪存操作流程进行程序编写,更有助于理解编程。

main.c函数

RISC-V

main.c函数主要进行函数初始化以及根据flash.c文件两个函数返回值输出相应信息。

4、下载验证

将编译好的程序下载到开发板并复位,串口打印情况具体如下:

RISC-V

根据串口打印信息可知,内部FLASH标准编程和快速编程测试成功。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分