FLASH硬件写保护功能 ========================================= 本章主要介绍如何将内置flash的代码与资源区域设置为写保护状态,该功能适用于ad16n_flash_release_v1.1.0以及之后的SDK版本,本章介绍内容包括以下几点: - 介绍SDK中与写保护相关的工具,以及写保护参数文件; - 对于A0芯片,用户如何根据flash手册添加写保护参数; - 介绍程序中如何打开与关闭内置flash写保护; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ flash写保护工具说明 ################################ SDK的下载目录(路径:apps\app\post_build\uc03\)中存放有“flash_write_protect”文件夹,文件夹中包含以下文件: :: flash_wp_info.csv:该文件以文本形式记录各种flash的写保护参数 csv2dir.bat:该脚本实现将上述csv文件转成小机可识别的dir_sys_info文件 .. image:: 1-1-fwp-tools.png :alt: "图1.1 flash写保护工具“ :align: center .. centered:: 图1.12 flash写保护工具 其中,flash_wp_info.csv文件中涵盖了内封flash的绝大部分型号。对于A0芯片,用户可自行根据使用的flash型号datasheet添加相应的写保护参数以及指令。 添加完成后,点击csv2dir.bat脚本,即可生成dir_sys_info文件,将该文件放在下载目录中,添加到download.bat的资源文件中下载到小机中,小机即可识别并添加写保护。 运行csv2dir.bat脚本时,需要注意是否有执行成功。 .. image:: 1-2-fwp-csv2dir-succ.png :alt: "图1.2 csv2dir.bat脚本执行成功显示信息“ :align: center .. centered:: 图1.2 csv2dir.bat脚本执行成功显示信息 1-3-fwp-csv2dir-succ.png 图2 csv2dir.bat脚本执行成功显示信息 没有执行成功时,需要关注错误信息,重新修改flash_wp_info.csv文件;下图的错误信息显示同时存在两组相同的flash写保护参数。 .. image:: 1-3-fwp-csv2dir-fail.png :alt: "图1.3 csv2dir.bat脚本执行失败显示信息“ :align: center .. centered:: 图1.3 csv2dir.bat脚本执行失败显示信息 新增flash写保护参数与指令 **************************************************************************************************** 如下对于A0的芯片,用户可自行根据需要使用的flash的datasheet,在flash_wp_info.csv文件中添加写保护参数以及相关指令,下文以华邦W25Q32 FLASH为例,介绍根据手册添加参数。 Flash SR1、SR2寄存器和写保护范围 **************************************************************************************************** 在Flash datasheet中,可通过查找关键字“BP1”快速找到SR1寄存器,查找关键字“LB1”快速找到SR2寄存器;检查SR1寄存器中是否有SEC、TB、BP2、BP1、BP0位,检查SR2寄存器是否有CMP位; .. image:: 1-4-fwp-red-sr1.png :alt: "图1.4 flash SR1寄存器“ :align: center .. centered:: 图1.4 flash SR1寄存器 .. image:: 1-5-fwp-red-sr2.png :alt: "图1.5 flash SR2寄存器“ :align: center .. centered:: 图1.5 flash SR2寄存器 通过查找关键字“Density”快速搜索写保护列表,并查看flash支持的写保护范围 .. image:: 1-6-fwp-range.png :alt: "图1.6 flash写保护范围“ :align: center .. centered:: 图1.6 flash写保护范围-1 .. image:: 1-7-fwp-range.png :alt: "图1.7 flash写保护范围“ :align: center .. centered:: 图1.7 flash写保护范围-2 如何添加flash写保护参数 **************************************************************************************************** 打开flash_wp_info.csv文件并根据1.2中的信息填写参数,我司配置flash写保护范围从0地址开始,向后覆盖。 表格找到上一组flash数据空两至三行后,在第一行填写flash标号、flash id以及写使能(Write Enable)指令。 .. image:: 1-8-fwp-info.png :alt: "图1.8 flash标号、ID以及写使能指令信息“ :align: center .. centered:: 图1.8 flash标号、ID以及写使能指令信息 第二行开始填写flash写保护参数,最大支持9组flash写保护参数。 通过保护范围的大小,设置SEC、TB、BP0、BP1、BP2(不同的flash SEC和TB标识可能是其它,如BP4、BP3)和CMP的值。 例如:当CMP = 0时,SEC-TB-BP2-BP1-BP0为0b01101,可保护000000h - 0fffffh范围内1MB的数据。 .. image:: 1-9-fwp-range_info.png :alt: "图1.9 flash写保护范围填写说明(1)“ :align: center .. centered:: 图1.9 flash写保护范围填写说明(1) 例如:当CMP = 1时,SEC TB BP2 BP1 BP0为0b00001,可保护000000h - 3effffh范围内4032KB的数据。 .. image:: 1-10-fwp-range_info.png :alt: "图1.10 flash写保护范围填写说明2“ :align: center .. centered:: 图1.10 flash写保护范围填写说明2 Flash读写SR1、SR2指令 **************************************************************************************************** Flash配置写保护时,需要读写SR1、SR2寄存器。查找手册找到读写SR1、SR2的指令,并填入表格中。如果datasheet上有31H命令,优先使用分开写SR1、SR2模式; .. image:: 1-11-fwp-SR1-SR2.png :alt: "图1.11 flash 分开写SR1和SR2寄存器指令“ :align: center .. centered:: 图1.11 flash 分开写SR1和SR2寄存器指令 若上述分开写SR1、SR2模式在芯片运行中添加写保护不成功,则使用01H指令连续写SR1、SR2模式; .. image:: 1-12-fwp-SR1-SR2.png :alt: "图1.12 flash 连续写SR1和SR2寄存器指令“ :align: center .. centered:: 图1.12 flash 连续写SR1和SR2寄存器指令 部分Flash不存在SR2寄存器,则无需写SR2相关指令。 .. image:: 1-13-fwp-SR1.png :alt: "图1.13 flash只读写SR1寄存器指令“ :align: center .. centered:: 图1.13 flash只读写SR1寄存器指令 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 程序中开启与关闭写保护功能 ################################################# SDK中默认会在内置flash初始化的最后,配置flash写保护状态。 .. image:: 2-1-fwp-location.png :alt: "图2.1 SDK中添加写保护位置“ :align: center .. centered:: 图2.1 SDK中添加写保护位置 配置flash写保护时,SDK会从res资源文件中查找dir_sys_info,并解析其中的文件,获取与正在运行的内置flash相匹配的写保护信息,再操作内置flash添加写保护功能; .. image:: 2-2-fwp-resouce-tab.png :alt: "图2.2 download_bat.c中将dir_sys_info添加到资源列表中“ :align: center .. centered:: 图2.2 download_bat.c中将dir_sys_info添加到资源列表中 .. image:: 2-3-fwp-info-path.png :alt: "图2.3 小机识别flash写保护信息文件路径“ :align: center .. centered:: 图2.3 小机识别flash写保护信息文件路径 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 写保护相关函数 ################################################# 函数int norflash_set_write_protect(u8 enable_write_protect) **************************************************************************************************** 该函数实现开启或关闭内置flash写保护功能,其中参数: :: 1.Enable_write_protect: a)1:开启写保护; b)0:关闭写保护 2.返回值: a)开启写保护成功:写保护最大地址; b)关闭写保护成功/开启写保护失败:0 *注:开启写保护时返回0,可能是开启失败,也可能是代码加上资源区大小仍小于flash的最小保护范围。* 函数u16 norflash_read_sr1_sr2(void) **************************************************************************************************** 该函数实现获取内置flash的Status Register 1和Status Register 2寄存器,其返回值高8位为SR2,低8位为SR1; 函数u32 flash_code_protect_callback(u32 offset, u32 len) **************************************************************************************************** 该函数实现软件上限制驱动操作内置flash(存放代码的flash),内置flash进行写或擦除操作前会回调该函数,判断会操作到代码与资源区域,则不进行相应操作,可减低程序跑飞导致程序以外擦写flash的概率。其中参数: :: 1.offset:设备进行写或擦除操作的地址 2.len:设备进行写或擦除操作的长度 3.返回值: 0:可正常进行写或擦除操作 1:不进行写或擦除操作;