首頁(yè) > 評(píng)測(cè) > 優(yōu)雅使用J-Link解除APM32F003的讀保護(hù)

優(yōu)雅使用J-Link解除APM32F003的讀保護(hù)

  
  • 作者:kai迪皮
  • 來(lái)源:21ic BBS
  • [導(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ù)。

  1. /*!
  2. * [url=home.php?mod=space&uid=247401]@brief[/url]       Flash Read Out Protection Config.
  3. *
  4. * @param       rdp : Set the chip read protection level
  5. *               This parameter can be one of the following variables:
  6. *               FMC_RDP_ENABLE : Enable read protection
  7. *               FMC_RDP_DISABLE : Disable read protection
  8. *
  9. * @retval      None
  10. *
  11. * @note
  12. */
  13. void ReadOutProtectionConfig(FMC_RDP_T rdp)
  14. {
  15.     FMC_Unlock();
  16.     FMC_ConfigReadOutProtection(rdp);
  17.     FMC_Lock();
  18. }
復(fù)制代碼

在我們的功能函數(shù)里面對(duì)ReadOutProtectionConfig()函數(shù)進(jìn)行調(diào)用即可完成對(duì)芯片的讀寫(xiě)保護(hù)。如:

  1. /*!
  2. * [url=home.php?mod=space&uid=247401]@brief[/url]       Main program
  3. *
  4. * @param       None
  5. *
  6. * @retval      None
  7. *
  8. * @note
  9. */
  10. int main(void)
  11. {
  12.     uint32_t i = 0;
  13.  
  14.     LedInit();
  15.  
  16.     /* Enable read protection */
  17.     ReadOutProtectionConfig(FMC_RDP_ENABLE);
  18.  
  19.     for (i = 0; i < 10; i++)
  20.     {
  21.     Delay(0x7ffff);
  22.     Board_LedToggle(BOARD_LED2);
  23.     Board_LedToggle(BOARD_LED3);
  24.     }
  25.  
  26.     /* Disable read protection */
  27.     ReadOutProtectionConfig(FMC_RDP_DISABLE);
  28.  
  29.     while (1)
  30.    {
  31.  
  32.    }
  33. }
復(fù)制代碼

以上代碼是實(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)容

  1. void FMC_Unlock(void)
  2. {
  3.     FMC->KEY = FMC_KEY_1;
  4.     FMC->KEY = FMC_KEY_2;
  5. }
復(fù)制代碼

對(duì)FMC 關(guān)鍵字(FMCwKey)寫(xiě)入解鎖的鍵值以解鎖 FMC。
- FMC_EraseOptionByte()函數(shù)內(nèi)容

  1. FMC_STATE_T FMC_EraseOptionByte(void)
  2. {
  3.     uint16_t rpKey;
  4.     FMC_STATE_T state;
  5.  
  6.     rpKey = FMC->OBCS_B.READPROT ? 0 : FMC_RP_KEY;
  7.  
  8.     state = FMC_WaitForReady(FMC_DELAY_ERASE);
  9.  
  10.     if(state == FMC_STATE_COMPLETE)
  11.     {
  12.         FMC->OBKEY = FMC_KEY_1;
  13.         FMC->OBKEY = FMC_KEY_2;
  14.  
  15.         FMC->CTRL2_B.OBE = BIT_SET;
  16.         FMC->CTRL2_B.STA = BIT_SET;
  17.  
  18.         state = FMC_WaitForReady(FMC_DELAY_ERASE);
  19.  
  20.         if(state == FMC_STATE_COMPLETE)
  21.         {
  22.             FMC->CTRL2_B.OBE = BIT_RESET;
  23.  
  24.             FMC->CTRL2_B.OBP = BIT_SET;
  25.  
  26.             OB->READPROT = rpKey;
  27.  
  28.             state = FMC_WaitForReady(FMC_DELAY_PROGRAM);
  29.  
  30.             if(state != FMC_STATE_TIMEOUT)
  31.             {
  32.                 FMC->CTRL2_B.OBP = BIT_RESET;
  33.             }
  34.         }
  35.         else if(state != FMC_STATE_TIMEOUT)
  36.         {
  37.             FMC->CTRL2_B.OBE = BIT_RESET;
  38.         }
  39.     }
  40.  
  41.     return state;
  42. }
  43.  
復(fù)制代碼


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)容

  1. void FMC_Lock(void)
  2. {
  3.     FMC->CTRL2_B.LOCK = BIT_SET;
  4. }
復(fù)制代碼

通過(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)的連接速度(必須)。

  1. si 1
  2. device CORTEX-M0
  3. speed 100
  4. JTAGConfg -1,-1
復(fù)制代碼


2. 停止運(yùn)行當(dāng)前芯片的程序(一般而言初始連接上芯片時(shí),程序均處于暫停暫停),保證芯片沒(méi)有在進(jìn)行中的Flash操作(必須)。

  1. h
  2. r
  3. h
復(fù)制代碼


3. 解鎖代碼的指令實(shí)現(xiàn)(必須)。

  1. w4 0x40011004 0x45670123
  2. w4 0x40011004 0xCDEF89AB
  3. w4 0x40011008 0x45670123
  4. w4 0x40011008 0xCDEF89AB
  5. sleep 100
  6. w4 0x40011010 0x00000220
  7. w4 0x40011010 0x00000260
  8. sleep 100
  9.  
  10. w4 0x40011010 0x00000200
  11. w4 0x40011010 0x00000210
  12. w4 0x00020400 0xFFFF00A5
  13. sleep 100
  14. w4 0x40011010 0x00000080
復(fù)制代碼



4. 讀取FMC的CTRL2寄存器內(nèi)容,看看是否回到復(fù)位值(非必須)。

  1. mem32 0x40011010 0x01
  2. sleep 10
復(fù)制代碼


5. 復(fù)位芯片以使解除讀保護(hù)操作生效(必須)。

  1. r
復(fù)制代碼


    我們新建一個(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)放投稿

熱門(mén)標(biāo)簽
項(xiàng)目外包 more+