首页 > 评测 > 优雅使用J-Link解除APM32F003的读保护
优雅使用J-Link解除APM32F003的读保护
- [导读]
- 最近拿到了一块APM32F003F6 MINI开发板,发现其在同价位的芯片中有着丰富的资源和优秀的低功耗水平。准备拿来做一些小产品的
前言
最近拿到了一块APM32F003F6 MINI开发板,发现其在同价位的芯片中有着丰富的资源和优秀的低功耗水平。准备拿来做一些小产品的开发。板子美照如下所示(截取官网资源)。
1 APM32F003的读保护设置
在开发过程中,发现其对代码保护如同APM32F4一样,可以设置读保护。如其手册描述,APM32F003支持写保护和读保护。
通过手册描述和使用相关的库函数,我们可以将库函数封装,方便我们一个指令进行读写保护。
- /*!
- * [url=home.php?mod=space&uid=247401]@brief[/url] Flash Read Out Protection Config.
- *
- * @param rdp : Set the chip read protection level
- * This parameter can be one of the following variables:
- * FMC_RDP_ENABLE : Enable read protection
- * FMC_RDP_DISABLE : Disable read protection
- *
- * @retval None
- *
- * @note
- */
- void ReadOutProtectionConfig(FMC_RDP_T rdp)
- {
- FMC_Unlock();
- FMC_ConfigReadOutProtection(rdp);
- FMC_Lock();
- }
在我们的功能函数里面对ReadOutProtectionConfig()函数进行调用即可完成对芯片的读写保护。如:
- /*!
- * [url=home.php?mod=space&uid=247401]@brief[/url] Main program
- *
- * @param None
- *
- * @retval None
- *
- * @note
- */
- int main(void)
- {
- uint32_t i = 0;
- LedInit();
- /* Enable read protection */
- ReadOutProtectionConfig(FMC_RDP_ENABLE);
- for (i = 0; i < 10; i++)
- {
- Delay(0x7ffff);
- Board_LedToggle(BOARD_LED2);
- Board_LedToggle(BOARD_LED3);
- }
- /* Disable read protection */
- ReadOutProtectionConfig(FMC_RDP_DISABLE);
- while (1)
- {
- }
- }
以上代码是实现了一个读保护设置后,闪灯5下后解除读保护。(值得注意的是:APM32F003手册是说明“在配置完选项字节后,需要复位才能生效 ”)。
2 为什么需要使用J-Link解除APM32F003读保护
由于我们的代码出厂后不想让有心之人看到我们的二进制内容,我们会对芯片进行读保护,且不会留解除读保护的“后门”,以防用户误操作将产品弄坏。所以我们迫切需要一个工具能够在开发,维护阶段,在没有设置解除读保护的“后门”的情况下对芯片进行解除读保护操作。
而在开发阶段,我们最常用的工具就是J-Link,如何使用J-Link解决该问题便是我们的需求。
3 J-Link解除读保护的原理
书接上回“https://bbs.21ic.com/icview-3223010-1-1.html”我在J-Link的安装目录下面找到了相应J-Link的使用手册。我们可以在手册中看到,对使用J-Link Commander给芯片下载代码的一个例子。
(图片来源:[J-Link Commander - SEGGER Wiki](https://wiki.segger.com/J-Link_Commander#Perform_flash_download))
在例子中我们可以看到-Link Commander使用了“w4”指令对STM32F103ZE的一些外设进行了写值设置,以使得可以下载STM32F103ZE的外置Flash。
同理我们也可以依葫芦画瓢,理论上我们可以通过将我们对APM32F003芯片的解除写保护的代码。
4 APM32F003解除读保护分析
下面我们看一下官方源码中对于解除读保护,我们操作了那些寄存器。
- FMC_Unlock()函数内容
- void FMC_Unlock(void)
- {
- FMC->KEY = FMC_KEY_1;
- FMC->KEY = FMC_KEY_2;
- }
对FMC 关键字(FMCwKey)写入解锁的键值以解锁 FMC。
- FMC_EraseOptionByte()函数内容
- FMC_STATE_T FMC_EraseOptionByte(void)
- {
- uint16_t rpKey;
- FMC_STATE_T state;
- rpKey = FMC->OBCS_B.READPROT ? 0 : FMC_RP_KEY;
- state = FMC_WaitForReady(FMC_DELAY_ERASE);
- if(state == FMC_STATE_COMPLETE)
- {
- FMC->OBKEY = FMC_KEY_1;
- FMC->OBKEY = FMC_KEY_2;
- FMC->CTRL2_B.OBE = BIT_SET;
- FMC->CTRL2_B.STA = BIT_SET;
- state = FMC_WaitForReady(FMC_DELAY_ERASE);
- if(state == FMC_STATE_COMPLETE)
- {
- FMC->CTRL2_B.OBE = BIT_RESET;
- FMC->CTRL2_B.OBP = BIT_SET;
- OB->READPROT = rpKey;
- state = FMC_WaitForReady(FMC_DELAY_PROGRAM);
- if(state != FMC_STATE_TIMEOUT)
- {
- FMC->CTRL2_B.OBP = BIT_RESET;
- }
- }
- else if(state != FMC_STATE_TIMEOUT)
- {
- FMC->CTRL2_B.OBE = BIT_RESET;
- }
- }
- return state;
- }
1. 对FMC的OBKEY写入解锁键值以解锁对OB的操作。
2. 通过FMC的CTRL2寄存器,擦除选项字节。
3. 写入读保护等级至OB的READPROT寄存器,然后通过FMC的CTRL2寄存器进行编程。
4. 等待编程完成。
- FMC_Lock函数内容
- void FMC_Lock(void)
- {
- FMC->CTRL2_B.LOCK = BIT_SET;
- }
通过FMC的CTRL2寄存器的LOCK位写1,锁定FMC的CTRL2寄存器。
5 J-Link 解除 APM32F003读保护实现
有了解除读保护的C代码,我们简单的就可以将其“翻译”成J-Link的指令。下面是各个部分指令情况及其解析。
1. 规定选择的连接接口,连接的目标芯片类型及相应的连接速度(必须)。
- si 1
- device CORTEX-M0
- speed 100
- JTAGConfg -1,-1
2. 停止运行当前芯片的程序(一般而言初始连接上芯片时,程序均处于暂停暂停),保证芯片没有在进行中的Flash操作(必须)。
- h
- r
- h
3. 解锁代码的指令实现(必须)。
- w4 0x40011004 0x45670123
- w4 0x40011004 0xCDEF89AB
- w4 0x40011008 0x45670123
- w4 0x40011008 0xCDEF89AB
- sleep 100
- w4 0x40011010 0x00000220
- w4 0x40011010 0x00000260
- sleep 100
- w4 0x40011010 0x00000200
- w4 0x40011010 0x00000210
- w4 0x00020400 0xFFFF00A5
- sleep 100
- w4 0x40011010 0x00000080
4. 读取FMC的CTRL2寄存器内容,看看是否回到复位值(非必须)。
- mem32 0x40011010 0x01
- sleep 10
5. 复位芯片以使解除读保护操作生效(必须)。
- r
我们新建一个文本文件,将上述代码保存至文件,然后将文件后缀名更改为“.jflash”(详情请查阅附件),最后使用“JLink.exe”打开即可(硬件要连接好)。对已经上了读保护的APM32F003芯片进行解除读保护操作。
6 注意事项
1. 芯片上读保护后使用Keil的下载命令会有如下提示弹框。
2. 使用本脚本文件,需保证硬件连接正常。
- 本文系21ic原创,未经许可禁止转载!
网友评论
- 联系人:巧克力娃娃
- 邮箱:board@21ic.com
- 我要投稿
-
欢迎入驻,开放投稿
-
人均百万?英伟达中国员工收入曝光! 2024-08-29
-
《黑神话:悟空》玩家硬盘升级攻略:提升游戏体验,畅享3A大作 2024-08-29
-
数睿数据参加《系统与软件工程 低代码开发平台通用技术要求》国家标准编制 2024-08-29
- NRF52810蓝牙数字耳机找人定制
预算:¥30005天前
- 125KW模块式PCS软硬件外包开发
预算:¥1100000015小时前
- 12V汽车启动电源项目BMS设计
预算:¥50000023小时前
- 数据可视化软件 开发
预算:¥5000023小时前
- PLC项目调试修改
预算:¥100001天前
- 起动电机控制器开发
预算:¥1100001天前