介绍

  在实际发布的产品中,在GD32芯片的内部FLASH存储了控制程序,如果不作任何保护措施的话,可以使用下载器直接把内部FLASH的内容读取回来,得到bin或hex文件格式的代码拷贝,别有用心的厂商会利用该方法山寨产品。为此,GD32芯片提供了多种方式保护内部FLASH的程序不被非法读取,但在默认情况”下该保护功能是不开启的,若要开启该功能,需要改写内部FLASH选项字节(Option Bytes)中的配置。
  GD32的选项字节地址和功能都跟STM32一样:

  其中前面带“n”的是不带“n”的取反,即nUSER的值等于(~USER)、nRDP的值等于(~RDP),GD32利用反码来确保选项字节内容的正确性。
  每次系统复位后,闪存的可选字节块被重加载到FMC_OBSTAT和FMC_WP寄存器,可选字节生效。可选字节的补字节具体为可选字节取反。当可选字节被重装载时,如果可选字节的补字节和可选字节不匹配,FMC_OBSTAT寄存器的OBERR位将被置1,可选字节被强制设置为0xFF。若可选字节和其补字节同为0xFF,则OBERR位不置位。可选字节详情见下表。

选项字节操作函数

选项字节锁定和解锁

和flash一样,对选项字节进行擦除和编程都需要先解锁。

ob_unlock();ob_lock();

选项字节擦除函数

        /* erase all the option Bytes */fmc_state = ob_erase();

选项字节编程函数

  FMC提供了一个32位整字/16位半字编程功能,可用来修改可选字节块内容。可选字节块共有8对可选字节。每对可选字节的高字节是低字节的补。当低字节被修改时,FMC自动生成该选项字节的高字节。
  需要注意的是,执行整字/半字编程操作需要检查目的地址是否已经被擦除。 如果该地址没有被擦除, 对该地址写一个非0x0值, FMC_STAT0寄存器的PGERR位将被置1,对该地址的编程操作无效(当写内容为0x0时,即使目的地址没有被
正常擦除,也可以正确编程)。
  当可选字节被改变时,需要系统复位使之生效。

使能写保护

/*!\brief      enable write protection\param[in]  ob_wp: specify sector to be write protected, set the bit to 1 if you want to protect the corresponding pages. meanwhile, sector macro could used to set specific sector write protected. one or more parameters can be selected which are shown as below:\arg        OB_WPx(x = 0..31): write protect specify sector\arg        OB_WP_ALL: write protect all sector\param[out] none\retval     state of FMC, refer to fmc_state_enum
*/
fmc_state_enum ob_write_protection_enable(uint32_t ob_wp)

  选项字节的WP[30:0]中的每个bit设置每4KB flash空间的保护状态,比如最低位设置最开始4KB空间的写保护状态,即0x0800 0000 - 0x0800 0FFF。这31位总计可设置前124KB的闪存保护状态。 WP[31],第31位可设置闪存剩下部分的保护状态。
  库函数都已经把每个扇区的宏定义写好了:

/* option bytes write protection */
#define OB_WP_0                    ((uint32_t)0x00000001U)                       /*!< erase/program protection of sector 0  */
#define OB_WP_1                    ((uint32_t)0x00000002U)                       /*!< erase/program protection of sector 1  */
#define OB_WP_2                    ((uint32_t)0x00000004U)                       /*!< erase/program protection of sector 2  */
#define OB_WP_3                    ((uint32_t)0x00000008U)                       /*!< erase/program protection of sector 3  */
#define OB_WP_4                    ((uint32_t)0x00000010U)                       /*!< erase/program protection of sector 4  */
#define OB_WP_5                    ((uint32_t)0x00000020U)                       /*!< erase/program protection of sector 5  */
#define OB_WP_6                    ((uint32_t)0x00000040U)                       /*!< erase/program protection of sector 6  */
#define OB_WP_7                    ((uint32_t)0x00000080U)                       /*!< erase/program protection of sector 7  */
#define OB_WP_8                    ((uint32_t)0x00000100U)                       /*!< erase/program protection of sector 8  */
#define OB_WP_9                    ((uint32_t)0x00000200U)                       /*!< erase/program protection of sector 9  */
#define OB_WP_10                   ((uint32_t)0x00000400U)                       /*!< erase/program protection of sector 10 */
#define OB_WP_11                   ((uint32_t)0x00000800U)                       /*!< erase/program protection of sector 11 */
#define OB_WP_12                   ((uint32_t)0x00001000U)                       /*!< erase/program protection of sector 12 */
#define OB_WP_13                   ((uint32_t)0x00002000U)                       /*!< erase/program protection of sector 13 */
#define OB_WP_14                   ((uint32_t)0x00004000U)                       /*!< erase/program protection of sector 14 */
#define OB_WP_15                   ((uint32_t)0x00008000U)                       /*!< erase/program protection of sector 15 */
#define OB_WP_16                   ((uint32_t)0x00010000U)                       /*!< erase/program protection of sector 16 */
#define OB_WP_17                   ((uint32_t)0x00020000U)                       /*!< erase/program protection of sector 17 */
#define OB_WP_18                   ((uint32_t)0x00040000U)                       /*!< erase/program protection of sector 18 */
#define OB_WP_19                   ((uint32_t)0x00080000U)                       /*!< erase/program protection of sector 19 */
#define OB_WP_20                   ((uint32_t)0x00100000U)                       /*!< erase/program protection of sector 20 */
#define OB_WP_21                   ((uint32_t)0x00200000U)                       /*!< erase/program protection of sector 21 */
#define OB_WP_22                   ((uint32_t)0x00400000U)                       /*!< erase/program protection of sector 22 */
#define OB_WP_23                   ((uint32_t)0x00800000U)                       /*!< erase/program protection of sector 23 */
#define OB_WP_24                   ((uint32_t)0x01000000U)                       /*!< erase/program protection of sector 24 */
#define OB_WP_25                   ((uint32_t)0x02000000U)                       /*!< erase/program protection of sector 25 */
#define OB_WP_26                   ((uint32_t)0x04000000U)                       /*!< erase/program protection of sector 26 */
#define OB_WP_27                   ((uint32_t)0x08000000U)                       /*!< erase/program protection of sector 27 */
#define OB_WP_28                   ((uint32_t)0x10000000U)                       /*!< erase/program protection of sector 28 */
#define OB_WP_29                   ((uint32_t)0x20000000U)                       /*!< erase/program protection of sector 29 */
#define OB_WP_30                   ((uint32_t)0x40000000U)                       /*!< erase/program protection of sector 30 */
#define OB_WP_31                   ((uint32_t)0x80000000U)                       /*!< erase/program protection of sector 31 */
#define OB_WP_ALL                  ((uint32_t)0xFFFFFFFFU)                       /*!< erase/program protection of all sectors */

比如,要写保护扇区0,执行:

ob_write_protection_enable(OB_WP_0);

要写保护扇区0、1、2,执行:

ob_write_protection_enable(OB_WP_0|OB_WP_1|OB_WP_2);

使能读保护

  FMC提供了一个安全保护功能来阻止非法读取闪存。 此功能可以很好地保护软件和固件免受非法的用户操作。
  未保护状态:当将SPC字节和它的补字节被设置为0x5AA5,系统复位以后,闪存将处于非安全保护状态。主存储块和可选字节块可以被所有操作模式访问。
  已保护状态:当设置SPC字节和它的补字节值为任何除0x5AA5外的值,系统复位以后,安全保护状态生效。需要注意的是, 若该修改过程中,MCU的调试模块依然和外部JTAG/SWD设备相连,需要用上电复位代替系统复位以使得修改后的保护状态生效。在安全保护状态下,主存储闪存块仅能被用户代码访问且前4KB的闪存自动处于页擦除/编程保护状态下。 在调试模式下,或从SRAM中启动时,以及从boot loader区启动时,这些模式下对主存储块的操作都被禁止。如果在这些模式下读主存储块,将产生总线错误。如果在这些模式下,对主存储块进行编程或擦除操作, FMC_STAT寄存器的WPERR位将被置1。 但这些模式下都可以对可选字节块进行操作,从而可以通过该方式失能安全保护功能。如果将SPC字节和它的补字节设置为0x5AA5,安全保护功能将失效,并自动触发一次整片擦除操作。

/*!\brief      configure security protection\param[in]  ob_spc: specify security protectiononly one parameter can be selected which is shown as below:\arg        FMC_NSPC: no security protection\arg        FMC_USPC: under security protection\param[out] none\retval     state of FMC, refer to fmc_state_enum
*/
fmc_state_enum ob_security_protection_config(uint8_t ob_spc)

要使能读保护,执行

ob_security_protection_config(FMC_USPC);

要取消读保护,执行

ob_security_protection_config(FMC_NSPC);

GD32的flash读保护和写保护相关推荐

  1. stm32使用 ST-LINK Utility量产,程序读保护、写保护

    一.下载 ST-LINK Utility 去ST官网下载ST-LINK Utility,下载链接,安装. 二.使用ST-Link链接板子,打开ST-LINK Utility,点连接,如果正常,则stm ...

  2. GD32的flash读、擦除、写操作

    GD32的flash特征 1.在flash的前256K字节空间内,CPU执行指令零等待:在此范围外,CPU读取指令存在较长延时: 2.对于flash大于512KB(不包括等于512KB)的GD32F1 ...

  3. STM32调试过程中,读保护,写保护造成的无法擦写芯片问题的解决办法和相关讨论

    调试Flash读保护时,Jlink不能下载程序 发布: 2010-1-20 22:54 | 作者: linew | 来源: StmFans思蜕盟 OPELC 自由电子联盟 调试flash读保护时,点了 ...

  4. GD32篇 一、GD32程序设置读保护,防止程序被读取

    GD32篇 记录 一.GD32开发版程序设置读保护,防止程序被读取 二.GD32TIMER输出PWM 平台:PC 系统:Win10 1909 开发版:GD32F103RCT6 软件:Keil.STM3 ...

  5. stm32 软件怎么设置写保护_STM32F407 读保护,写保护,解锁过程【芯片已设置读保护,无法读取更多信息】...

    硬件准备: CH340 USB转TTL串口一个 STM32F407 板子一块 设置从ISP启动 软件准备: 1,flash_loader_demo_v2.8.0.exe 或者 FlashLoader ...

  6. STM32F407 读保护,写保护,解锁过程【芯片已设置读保护,无法读取更多信息】...

    问题描述: 从ISP方式连接STM32F407开发板,无法读取任何数据,无法下载程序. DTR电平置高(+3-+12V),复位 RTS置高(+3-+12V),选择进入BootLoader ...延时1 ...

  7. STM32HAL库-针对芯片内部FLASH读保护实现防篡改、破解功能(详解)

    目录 概述 一.使用方法 二.STM32CubeMx配置​ 三.Examples 四.运行结果 五.总结 概述 本篇文章介绍如何使用STM32HAL库,针对芯片读写保护实现防篡改.破解功能(详解),本 ...

  8. STM32HAL库-F4-针对芯片内部FLASH读保护实现防篡改、破解功能(详解)

    概述 本篇文章介绍如何使用STM32HAL库,针对芯片读写保护实现防篡改.破解功能(详解),本案例还包含内部FLASH读写数据,本质就是操作Flash. 硬件:STM32F401CEU6最小系统板(内 ...

  9. STM32F4xx 读保护 写保护 芯片被锁 解锁

    问题描述: 从ISP方式连接STM32F407开发板,无法读取任何数据,无法下载程序. DTR电平置高(+3-+12V),复位 RTS置高(+3-+12V),选择进入BootLoader ...延时1 ...

  10. STM32 读保护功能和清除读保护功能设置【转】

    1.STM32对内部Flash的保护措施  所有STM32的芯片都提供对Flash的保护,防止对Flash的非法访问 - 写保护和读保护.    1).读保护即大家通常说的"加密" ...

最新文章

  1. jekyll 博客对搜索引擎的SEO提升方法--head中的meta标签和Jekyll SEO Tag
  2. 6.1-6.4 gzip、Bzip2、xz
  3. JZOJ 2256. 【BZOJ 2256】【ZJOI 2008】树的统计
  4. jap和java有关系吗_hibernate与jpa有什么区别和联系?
  5. 循环划线_经济内外双循环下的思考!
  6. presto是如何保证作业内存不会发生冲突和溢出
  7. 被绿以后,我成了年薪百万的“小三劝退师”
  8. LeetCode(728)——自除数(JavaScript)
  9. 2010年11月8日,早会资料(日本的文化节)。CSDN博客系统出现问题了,这篇我就不改了,留着,在写一个。
  10. IP报文分片抓包简析
  11. PS基础教程:[8]蒙版使用实例
  12. 上传文件到服务器速度慢怎么解决,网络上传速度慢怎么办(解读其上传速度慢原由)...
  13. C语言程序设计现代方法第二版,第八章课后编程题——第9题生成贯穿10乘10字符组的随机步法
  14. 计算机内存容量影响游戏的吗,内存容量对整机游戏性能影响有多大?
  15. CreateEvent
  16. Python数据分析:实时更新全国全球疫情分析
  17. android中留言板功能,js 实现简易留言板功能
  18. ctfshow-超级玛丽
  19. C语言 第五周知识点随记
  20. 理论篇一: 如何设计游戏棋牌平台 - 服务端 - 简介

热门文章

  1. 什么是聚合页面?网站优化做聚合页面的好处
  2. 兴奋神经递质——谷氨酸与大脑健康
  3. C语言程序设计(2020)编程题答案——第14章结构体、共用体和用户定义类型
  4. Verilog HDL简介
  5. Python基础——标准数据类型
  6. 新品推荐∣平行光源OPT-PL系列
  7. win10 windows 键(徽标键) 失效解决办法
  8. 业内人士揭露餐馆秘密:滋补汤基本没营养
  9. 【前端作业系列】HTML基础点 , 训练<有序列表><无序列表>(2022年6月15日作业)
  10. 中风后下肢麻木瘀阻案