熟女俱乐部五十路二区av,又爽又黄禁片视频1000免费,国产卡一卡二卡三无线乱码新区,中文无码一区二区不卡αv,中文在线中文a

"); //-->

博客專欄

EEPW首頁 > 博客 > GD32F4x 如何開啟讀保護(hù)功能(芯片加密)?

GD32F4x 如何開啟讀保護(hù)功能(芯片加密)?

發(fā)布人:魚鷹談單片機(jī) 時(shí)間:2021-11-21 來源:工程師 發(fā)布文章

來源:公眾號(hào)【魚鷹談單片機(jī)】

作者:魚鷹Osprey

ID   :emOsprey

在芯片加密時(shí),時(shí)常會(huì)用到讀保護(hù)功能,這個(gè)功能可以保證你的代碼不被 J-link,ST-link 之類的調(diào)試器讀取,STM32 系列相關(guān)資料網(wǎng)上有很多,但是 GD32 的資料目前來說還是比較少。

GD32F103 、GD32F303 與 STM32F103 基本上兼容的,甚至可以直接使用ST 的庫操作,所以替換起來還是相當(dāng)方便的。

但是 F4 系列的差別還是很大的,官方的例子也不是很多,網(wǎng)上的資料也不是很全,所以不得不啃文檔了。

本來魚鷹準(zhǔn)備直接搜 STM32F4x 關(guān)于讀保護(hù)的,看看能不能從 ST 的代碼中找到相關(guān)的函數(shù),從而替換成 GD 的庫操作,但最終沒有找到,還好從參考手冊(cè)中找到了。

說實(shí)話,GD 的庫操作有兩點(diǎn)非常不滿意:

直接操作地址,而不是像 ST 一樣通過結(jié)構(gòu)體指針間接操作,給調(diào)試帶來不便。

沒有參數(shù)檢查功能,這樣導(dǎo)致任何參數(shù)都能進(jìn)入函數(shù),從而造成不可預(yù)知的破壞。

牢騷歸牢騷,在目前缺芯的大環(huán)境下,也只能用國產(chǎn)替代了,誰叫它便宜呢,再怎么說也不能和錢過不去是吧。

所以今天魚鷹就來談?wù)勅绾螁⒂眯酒淖x保護(hù)功能,這應(yīng)該是所有產(chǎn)品上市前都會(huì)添加的一個(gè)功能。

首先看看 GD32F1的或者說 STM32F1的:

開啟讀保護(hù):

if(FLASH_GetReadOutProtectionStatus() != SET)
{
  FLASH_Unlock();
  FLASH_ReadOutProtection(ENABLE);
  FLASH_Lock();
}

關(guān)閉:

if(FLASH_GetReadOutProtectionStatus() != RESET)
{
  FLASH_Unlock();
  FLASH_ReadOutProtection(DISABLE);
  FLASH_Lock();
}

事實(shí)上,讀保護(hù)一旦開啟,如果解除讀保護(hù),同時(shí)也會(huì)由硬件自動(dòng)清除掉代碼,所以如果你通過調(diào)試器取消讀保護(hù)時(shí),會(huì)自動(dòng)清除代碼,防止被它人讀取數(shù)據(jù)。

而一旦開啟了讀保護(hù),你是無法通過調(diào)試器讀取 FLASH 的,你讀取的數(shù)據(jù)全是 0xff ,同時(shí)也無法通過調(diào)試器在線調(diào)試,所以,正在開發(fā)的產(chǎn)品一般不會(huì)加入這個(gè)功能,只有量產(chǎn)時(shí)才會(huì)加入,否則出現(xiàn)問題難定位。

如果需要重新下載,可以使用 KEIL 軟件的這個(gè)擦除按鈕:

1.jpg

擦除之后就可以繼續(xù)下載了(最好調(diào)試器里有復(fù)位引腳控制芯片復(fù)位)。

當(dāng)然,你也可以先用工具解除讀保護(hù),如何解除自行上網(wǎng)搜索即可。

另外,還有一種方式是使用 KEIL  RAM 運(yùn)行的方式,直接在芯片 RAM 中執(zhí)行相關(guān)代碼解除讀保護(hù),這樣就不需要其它工具了,有時(shí)間魚鷹會(huì)具體介紹如何操作,記得關(guān)注魚鷹。

然后再看 GD32F4x的操作,這個(gè)操作魚鷹在網(wǎng)上找了一圈,沒有發(fā)現(xiàn),覺得有必要寫一寫,方便大家:

if(ob_spc_get() != SET)
{
  ob_unlock();
  ob_security_protection_config(FMC_LSPC);
  ob_start();  // 特別注意這條語句
  ob_lock();
}

可以看到其實(shí)也是很簡單的操作類似庫函數(shù)即可,有幾點(diǎn)需要注意:

ob_security_protection_config 函數(shù)有參數(shù),目前的參數(shù)表示低級(jí)別的保護(hù),還有更高級(jí)別的保護(hù),但是那種保護(hù)是永久性的,無法解除,也就是說你無法通過調(diào)試器下載代碼了,只能通過你編寫的程序里面自帶更新的代碼更新,否則就變成磚頭了(芯片可以用,但無法調(diào)試與更新程序)。一般來說低級(jí)別保護(hù)足夠了。

必須調(diào)用 ob_start 函數(shù)啟動(dòng)改寫,否則無法真正寫入到寄存器(上電會(huì)恢復(fù))。ST 好像沒有這個(gè)。

ob_start 函數(shù)里面有死循環(huán),所以不建議大家直接使用該庫函數(shù),而是自己按它的實(shí)現(xiàn)方法重新寫一個(gè),這樣出現(xiàn)問題,可以快速定位(畢竟很少人有勇氣懷疑庫函數(shù)有問題而去查看庫函數(shù)實(shí)現(xiàn)),最起碼在死循環(huán)前加一條打印信息吧。

另外,產(chǎn)品一般會(huì)禁用 SW 引腳的調(diào)試功能,F(xiàn)1 和 F4 的方式不一樣:

F1 的由專門語句負(fù)責(zé):

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,DISABLE);

而F4 就是把 PA13、P14 重新配置即可(即不使用默認(rèn)功能,可設(shè)置為下拉輸入):

rcu_periph_clock_enable(RCU_GPIOA);
gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_PULLDOWN,  GPIO_PIN_13 | GPIO_PIN_14);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13 | GPIO_PIN_14);

ST 也是操作類似的庫函數(shù)實(shí)現(xiàn)。

本周的分享到此結(jié)束,有幫助的話,歡迎轉(zhuǎn)發(fā)支持魚鷹。

*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



關(guān)鍵詞: 單片機(jī)

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉