首頁(yè) > 評(píng)測(cè) > 優(yōu)雅使用J-Link解除APM32F003的讀保護(hù)
優(yōu)雅使用J-Link解除APM32F003的讀保護(hù)
- [導(dǎo)讀]
- 最近拿到了一塊APM32F003F6 MINI開(kāi)發(fā)板,發(fā)現(xiàn)其在同價(jià)位的芯片中有著豐富的資源和優(yōu)秀的低功耗水平。準(zhǔn)備拿來(lái)做一些小產(chǎn)品的
前言
最近拿到了一塊APM32F003F6 MINI開(kāi)發(fā)板,發(fā)現(xiàn)其在同價(jià)位的芯片中有著豐富的資源和優(yōu)秀的低功耗水平。準(zhǔn)備拿來(lái)做一些小產(chǎn)品的開(kāi)發(fā)。板子美照如下所示(截取官網(wǎng)資源)。
1 APM32F003的讀保護(hù)設(shè)置
在開(kāi)發(fā)過(guò)程中,發(fā)現(xiàn)其對(duì)代碼保護(hù)如同APM32F4一樣,可以設(shè)置讀保護(hù)。如其手冊(cè)描述,APM32F003支持寫(xiě)保護(hù)和讀保護(hù)。
通過(guò)手冊(cè)描述和使用相關(guān)的庫(kù)函數(shù),我們可以將庫(kù)函數(shù)封裝,方便我們一個(gè)指令進(jìn)行讀寫(xiě)保護(hù)。
- /*!
- * [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();
- }
在我們的功能函數(shù)里面對(duì)ReadOutProtectionConfig()函數(shù)進(jìn)行調(diào)用即可完成對(duì)芯片的讀寫(xiě)保護(hù)。如:
- /*!
- * [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)
- {
- }
- }
以上代碼是實(shí)現(xiàn)了一個(gè)讀保護(hù)設(shè)置后,閃燈5下后解除讀保護(hù)。(值得注意的是:APM32F003手冊(cè)是說(shuō)明“在配置完選項(xiàng)字節(jié)后,需要復(fù)位才能生效 ”)。
2 為什么需要使用J-Link解除APM32F003讀保護(hù)
由于我們的代碼出廠后不想讓有心之人看到我們的二進(jìn)制內(nèi)容,我們會(huì)對(duì)芯片進(jìn)行讀保護(hù),且不會(huì)留解除讀保護(hù)的“后門(mén)”,以防用戶誤操作將產(chǎn)品弄壞。所以我們迫切需要一個(gè)工具能夠在開(kāi)發(fā),維護(hù)階段,在沒(méi)有設(shè)置解除讀保護(hù)的“后門(mén)”的情況下對(duì)芯片進(jìn)行解除讀保護(hù)操作。
而在開(kāi)發(fā)階段,我們最常用的工具就是J-Link,如何使用J-Link解決該問(wèn)題便是我們的需求。
3 J-Link解除讀保護(hù)的原理
書(shū)接上回“https://bbs.21ic.com/icview-3223010-1-1.html”我在J-Link的安裝目錄下面找到了相應(yīng)J-Link的使用手冊(cè)。我們可以在手冊(cè)中看到,對(duì)使用J-Link Commander給芯片下載代碼的一個(gè)例子。
(圖片來(lái)源:[J-Link Commander - SEGGER Wiki](https://wiki.segger.com/J-Link_Commander#Perform_flash_download))
在例子中我們可以看到-Link Commander使用了“w4”指令對(duì)STM32F103ZE的一些外設(shè)進(jìn)行了寫(xiě)值設(shè)置,以使得可以下載STM32F103ZE的外置Flash。
同理我們也可以依葫蘆畫(huà)瓢,理論上我們可以通過(guò)將我們對(duì)APM32F003芯片的解除寫(xiě)保護(hù)的代碼。
4 APM32F003解除讀保護(hù)分析
下面我們看一下官方源碼中對(duì)于解除讀保護(hù),我們操作了那些寄存器。
- FMC_Unlock()函數(shù)內(nèi)容
- void FMC_Unlock(void)
- {
- FMC->KEY = FMC_KEY_1;
- FMC->KEY = FMC_KEY_2;
- }
對(duì)FMC 關(guān)鍵字(FMCwKey)寫(xiě)入解鎖的鍵值以解鎖 FMC。
- FMC_EraseOptionByte()函數(shù)內(nèi)容
- 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. 對(duì)FMC的OBKEY寫(xiě)入解鎖鍵值以解鎖對(duì)OB的操作。
2. 通過(guò)FMC的CTRL2寄存器,擦除選項(xiàng)字節(jié)。
3. 寫(xiě)入讀保護(hù)等級(jí)至OB的READPROT寄存器,然后通過(guò)FMC的CTRL2寄存器進(jìn)行編程。
4. 等待編程完成。
- FMC_Lock函數(shù)內(nèi)容
- void FMC_Lock(void)
- {
- FMC->CTRL2_B.LOCK = BIT_SET;
- }
通過(guò)FMC的CTRL2寄存器的LOCK位寫(xiě)1,鎖定FMC的CTRL2寄存器。
5 J-Link 解除 APM32F003讀保護(hù)實(shí)現(xiàn)
有了解除讀保護(hù)的C代碼,我們簡(jiǎn)單的就可以將其“翻譯”成J-Link的指令。下面是各個(gè)部分指令情況及其解析。
1. 規(guī)定選擇的連接接口,連接的目標(biāo)芯片類型及相應(yīng)的連接速度(必須)。
- si 1
- device CORTEX-M0
- speed 100
- JTAGConfg -1,-1
2. 停止運(yùn)行當(dāng)前芯片的程序(一般而言初始連接上芯片時(shí),程序均處于暫停暫停),保證芯片沒(méi)有在進(jìn)行中的Flash操作(必須)。
- h
- r
- h
3. 解鎖代碼的指令實(shí)現(xiàn)(必須)。
- 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寄存器內(nèi)容,看看是否回到復(fù)位值(非必須)。
- mem32 0x40011010 0x01
- sleep 10
5. 復(fù)位芯片以使解除讀保護(hù)操作生效(必須)。
- r
我們新建一個(gè)文本文件,將上述代碼保存至文件,然后將文件后綴名更改為“.jflash”(詳情請(qǐng)查閱附件),最后使用“JLink.exe”打開(kāi)即可(硬件要連接好)。對(duì)已經(jīng)上了讀保護(hù)的APM32F003芯片進(jìn)行解除讀保護(hù)操作。
6 注意事項(xiàng)
1. 芯片上讀保護(hù)后使用Keil的下載命令會(huì)有如下提示彈框。
2. 使用本腳本文件,需保證硬件連接正常。
-
- 本文系21ic原創(chuàng),未經(jīng)許可禁止轉(zhuǎn)載!
網(wǎng)友評(píng)論
- 聯(lián)系人:巧克力娃娃
- 郵箱:board@21ic.com
- 我要投稿
-
歡迎入駐,開(kāi)放投稿
- NRF52810藍(lán)牙數(shù)字耳機(jī)找人定制
預(yù)算:¥30005天前
- 125KW模塊式PCS軟硬件外包開(kāi)發(fā)
預(yù)算:¥1100000015小時(shí)前
- 12V汽車(chē)啟動(dòng)電源項(xiàng)目BMS設(shè)計(jì)
預(yù)算:¥50000023小時(shí)前
- 數(shù)據(jù)可視化軟件 開(kāi)發(fā)
預(yù)算:¥5000023小時(shí)前
- PLC項(xiàng)目調(diào)試修改
預(yù)算:¥100001天前
- 起動(dòng)電機(jī)控制器開(kāi)發(fā)
預(yù)算:¥1100001天前