本帖最后由 RISCVLAR 于 2020-12-10 18:34 编辑
CH32V103应用教程——设置FLASH读写保护及解除
本章教程将使用CH32V103内部FLASH进行FLASH读写保护及解除设置。
1、用户选择字简介及相关函数介绍
用户选择字固化在FLASH中,在系统复位后会被重新装载到相应寄存器,用户可以任意的进行擦除和编程。用户选择字信息块总共有8个字节(4个字节为写保护,1个字节为读保护,1个字节为配置选项,2 个字节存储用户数据),每个位都有其反码位用于装载过程中的校验。
① 用户选择字解锁
通过写入序列到FLASH_OBKEYR寄存器可解锁用户选择字操作。解锁后,FLASH_CTLR寄存器的OBWRE位将置1,表示可以进行用户选择字的擦除和编程。通过将FLASH_CTLR寄存器的“OBWRE”位,软件清0来再次锁定。
解锁序列:1)向 FLASH_OBKEYR 寄存器写入 KEY1 = 0x45670123;
2)向 FLASH_OBKEYR 寄存器写入 KEY2 = 0xCDEF89AB。
注:用户选择字操作需要解除“LOCK”和“OBWRE”两层锁定
② 用户选择字编程
只支持标准编程方式,一次写入半字(2 字节)。实际过程中,对用户选择字进行编程时,FPEC只使用半字中的低字节,并自动计算出高字节(高字节为低字节的反码),然后开始编程操作,这将保证用户选择字中的字节和它的反码始终是正确的。
1)检查 FLASH_CTLR 寄存器 LOCK 位,如果为 1,需要执行“解除闪存锁”操作。
2)检查 FLASH_STATR 寄存器的 BSY 位,以确认没有其他正在进行的编程操作。
3)检查 FLASH_CTLR 寄存器 OBWRE 位,如果为 0,需要执行“用户选择字解锁”操作。
4)设置 FLASH_CTLR 寄存器的 OBPG 位为‘1’,开启用户选择字编程。
5)写入要编程的半字(2 字节)到指定地址。
6)等待 BYS 位变为‘0’或 FLASH_STATR 寄存器的 EOP 位为‘1’表示编程结束,将 EOP 位清 0。
7)读编程地址数据校验。
8)继续编程可以重复 5-7 步骤,结束编程将 OBPG 位清 0。
注:当修改选择字中的“读保护”变成“非保护”状态时,会自动执行一次整片擦除主存储区操作。如果修改“读保护”之外的选型,则不会出现整片擦除的操作。
③ 用户选择字擦除
直接擦除整个 128 字节用户选择字区域。
1)检查FLASH_CTLR寄存器LOCK位,如果为1,需要执行“解除闪存锁”操作。
2)检查FLASH_STATR寄存器的BSY位,以确认没有正在进行的编程操作。
3)检查FLASH_CTLR寄存器OBWRE位,如果为0,需要执行“用户选择字解锁”操作。
4)设置FLASH_CTLR寄存器的OBER 位为‘1’,开启用户选择字擦除。
5)等待BYS位变为‘0’或FLASH_STATR寄存器的EOP位为‘1’表示擦除结束,将 EOP 位清 0。
6)读擦除地址数据校验。
7)结束将 OBER 位清 0。
④ 解除读保护
闪存是否读保护,由用户选择字决定。读取FLASH_OBR寄存器,当RDPRT 位为‘1’表示当前闪存处于读保护状态,闪存操作上受到读保护状态的一系列安全防护。解除读保护过程如下:
1)擦除整个用户选择字区域,此时读保护字段RDPR将变成0xFF,此时读保护仍然有效。
2)用户选择字编程,写入正确的RDPR代码0xA5以解除闪存的读保护。(此步骤首先将导致系统自动对闪存执行整片擦除操作)
3)进行上电复位以重新加载选择字节(包括新的RDPR码),此时读保护被解除。
⑤ 解除写保护
闪存是否写保护,由用户选择字决定。读取FLASH_WPR寄存器,每个比特位代表4K字节闪存空间,当比特位为‘1’表示非写保护状态,为‘0’表示写保护。解除写保护过程如下:
1)擦除整个用户选择字区域。
2)写入正确的RDPR码 0xA5,允许读访问;
3)进行系统复位,重新加载选择字节(包括新的WRPR[3:0]字节),写保护被解除。
关于CH32V103用户选择字具体信息,可参考CH32V103应用手册。关于CH32V103内部FLASH标准库函数,前面已经介绍,在此不再赘述。
2、硬件设计
本章教程为设置内部FLASH读写保护及解除,使用CH32V103内部资源,无需进行硬件连接。
3、软件设计
本章教程主要进行FLASH读写保护以及解除设置,主要通过触摸按键控制。
当按下触摸按键1,则执行写保护状态反转:若目前芯片处于写保护状态,按下触摸按键1则解除写保护;若目前不在写保护状态,按下触摸按键1则设置写保护。
当按下触摸按键2,则执行读保护状态反转:若目前芯片处于读保护状态,按下触摸按键2则解除读保护;若目前不在读保护状态,按下触摸按键2则设置读保护。
关于触摸按键程序在前面章节已经介绍,本章主要进行读写保护及解除程序介绍,具体程序如下:
flash.h文件
- #ifndef __FLASH_H
- #define __FLASH_H
- #include "ch32v10x_conf.h"
- void WriteProtect_Toggle(void);
- void ReadProtect_Toggle(void);
- #endif
flash.h文件主要进行函数的声明;
flash.c文件
|