前言
最近拿到了一塊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()函數進行調用即可完成對芯片的讀寫保護。如:
以上代碼是實現了一個讀保護設置后,閃燈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. 使用本腳本文件,需保證硬件連接正常。
/*! * [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) ? ?{ ? ? ?} }
-
芯片
+關注
關注
455文章
50714瀏覽量
423139 -
函數
+關注
關注
3文章
4327瀏覽量
62571 -
代碼
+關注
關注
30文章
4779瀏覽量
68521
原文標題:APM32芯得 EP.09 | 使用J-Link解除APM32F003的讀保護
文章出處:【微信號:geehysemi,微信公眾號:Geehy極海半導體】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論