博客專欄

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

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

        發布人:魚鷹談單片機 時間:2021-11-21 來源:工程師 發布文章

        來源:公眾號【魚鷹談單片機】

        作者:魚鷹Osprey

        ID   :emOsprey

        在芯片加密時,時常會用到讀保護功能,這個功能可以保證你的代碼不被 J-link,ST-link 之類的調試器讀取,STM32 系列相關資料網上有很多,但是 GD32 的資料目前來說還是比較少。

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

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

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

        說實話,GD 的庫操作有兩點非常不滿意:

        直接操作地址,而不是像 ST 一樣通過結構體指針間接操作,給調試帶來不便。

        沒有參數檢查功能,這樣導致任何參數都能進入函數,從而造成不可預知的破壞。

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

        所以今天魚鷹就來談談如何啟用芯片的讀保護功能,這應該是所有產品上市前都會添加的一個功能。

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

        開啟讀保護:

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

        關閉:

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

        事實上,讀保護一旦開啟,如果解除讀保護,同時也會由硬件自動清除掉代碼,所以如果你通過調試器取消讀保護時,會自動清除代碼,防止被它人讀取數據。

        而一旦開啟了讀保護,你是無法通過調試器讀取 FLASH 的,你讀取的數據全是 0xff ,同時也無法通過調試器在線調試,所以,正在開發的產品一般不會加入這個功能,只有量產時才會加入,否則出現問題難定位。

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

        1.jpg

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

        當然,你也可以先用工具解除讀保護,如何解除自行上網搜索即可。

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

        然后再看 GD32F4x的操作,這個操作魚鷹在網上找了一圈,沒有發現,覺得有必要寫一寫,方便大家:

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

        可以看到其實也是很簡單的操作類似庫函數即可,有幾點需要注意:

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

        必須調用 ob_start 函數啟動改寫,否則無法真正寫入到寄存器(上電會恢復)。ST 好像沒有這個。

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

        另外,產品一般會禁用 SW 引腳的調試功能,F1 和 F4 的方式不一樣:

        F1 的由專門語句負責:

        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,DISABLE);

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

        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 也是操作類似的庫函數實現。

        本周的分享到此結束,有幫助的話,歡迎轉發支持魚鷹。

        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: 單片機

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 宿松县| 呈贡县| 三门县| 廊坊市| 肇源县| 东台市| 香河县| 马公市| 九江市| 河北区| 上饶市| 永泰县| 龙州县| 余庆县| 凉城县| 上杭县| 东兴市| 靖西县| 榆林市| 商洛市| 乐亭县| 饶阳县| 建平县| 泗阳县| 武宁县| 台南县| 巴楚县| 册亨县| 普宁市| 漳平市| 房山区| 略阳县| 阳山县| 伊金霍洛旗| 武平县| 汉中市| 通州区| 五华县| 乌兰县| 仙居县| 醴陵市|