YTM32的flash應用答疑-詳解寫保護功能

YTM32的flash應用答疑-詳解寫保護功能

文章目錄

  • YTM32的flash應用答疑-詳解寫保護功能
    • Introduction
    • Principle
    • Operation & Demonstration
      • Demo #1 驗證基本的寫保護功能
      • Demo #2 編程CUS_NVR設定EFM_ADDR_PROT初值
      • Demo #3 啟用寫保護后試試塊擦除操作
    • Conclusion

Introduction

客戶提出了一種應用場景:在使用某些授權軟件(算法)的場景中,軟件(算法)供應商向MCU的一些預留的存儲區中寫入專用的授權憑證,該憑證一機一碼,各不相同,從而確保軟件(算法)不會被非法復制。但對于MCU的應用開發者來說,經常需要刷寫片內存儲空間,更新程序或者數據,此時希望小心保存位于MCU內部存儲器上的憑證,在開發和后期正常使用的過程中,不要被意外擦除,否則重新授權需要又需要額外的費用、時間和流程等。

絕大多數MCU的片內flash存儲器管理模塊都提供了寫保護功能,當對已經設置保護功能的存儲區進行擦寫操作時,擦寫的實際效果將失效,被保護存儲區中的數據得以幸免留存,已達到防止誤擦除的效果。

Principle

YTM32B1MD14微控制器為例,其中片內flash控制器模塊EFM,對應有EFM_ADDR_PROT[0]EFM_ADDR_PROT[1]寄存器,其中每個比特可以保護8KB的存儲區,按序分布,覆蓋全部的片內flash的地址區域。

EFM_ADDR_PROT寄存器位的值為0時,寫保護發生作用,對應位的值為1時,寫保護不起作用,可以正常擦寫。

有兩種方式可以配置EFM_ADDR_PROT寄存器的值:

  • CUS_NVR0x100x18地址寫數,這里的配置值將作為EFM_ADDR_PROT寄存器的初值,在硬件復位后自動生效(由boot rom復制到EFM_ADDR_PROT寄存器中)。但寫入每個寄存器初值時要注意,高32位數必須為0x5A5A5A5A ,然后才是32位的有效配置值。
  • EFM_ADDR_PROT寄存器直接寫數,寫數之后在程序運行過程中生效,但復位后受CUS_NVR中的初值影響,在軟件生效之前,需要保護的區域可能有被篡改的風險。
    • 在軟件中,從1寫0是可以的,但從0寫1是無效的。在程序運行中,只能上鎖不能解鎖。如果想重新操作,只能復位重來。

需要特別注意的是,CUS_NVR也是位于flash存儲器上,具體是在pflash1的尾端。如圖x所示。

在這里插入圖片描述
在這里插入圖片描述

圖x CUS_NVR的物理存儲位置

這里的EFM_ADDR_PROT保護的是地址空間,而不是物理存儲。對于YTM32B1MD14這種用兩個pflash物理存儲器集成在一起具有硬件AB面分區的內部存儲設備,若交換了物理存儲區,切換了地址空間和實際物理存儲器的映射關系,則原有的配置下實際執行保護的區域也會發生變化。實際上,CUS_NVRBOOT SWAP操作的初始化參數共用的一個 Sector,因此在執行 BOOT_SWAP命令(交換pflash0pflash1的地址映射區域) 后,關閉調試接口和地址保護的配置會丟失,需要重新配置。同理,擦除CUS_NVRSWAP BOOT信息也會丟失,如需要重映射后的地址空間,需要重新執行BOOT SWAP操作。

另外,如果在flash塊上對任意一塊存儲區啟用了寫保護,則整塊flash存儲器的塊擦除操作都不能生效。但如果通過在CUS_NVR中解除寫保護配置后復位,就可以恢復對整塊flash的擦除操作。

Operation & Demonstration

設計用例,演示flash寫保護的起作用的情況。

Demo #1 驗證基本的寫保護功能

  • 默認上電復位后,MCU未對任何地址啟用寫保護功能。
  • 先向0x3E000 - 0x40000(pflash0的最后一個8KB存儲塊)擦除后再寫一組數據。通過調試器觀察flash存儲區的數據已經生效。

在這里插入圖片描述

  • 然后執行EFM_ADDR_PROT |= (1u << 31u),配置寫保護。
  • 再試著擦除0x3E000 - 0x40000內存區間的數據。執行擦除操作之后,通過調試器觀察flash存儲區的數據是否仍留存。

在這里插入圖片描述

通過實驗可以觀察到,當配置寫保護后,再次試圖擦除指定內存區域的存儲空間后,原來寫入的數據仍然保留,未受擦除操作影響。

Demo #2 編程CUS_NVR設定EFM_ADDR_PROT初值

在之前的用例中,可以看到在默認情況下,EFM_ADDR_PROT[0]EFM_ADDR_PROT[1]寄存器的值都是0xFFFFFFFF。如圖x所示。

在這里插入圖片描述

圖x EFM_ADDR_PROT寄存器的默認值

通過向CUS_NVR0x100x18地址寫數,更改寫保護的初值。但此時,因為尚未復位,芯片硬件也沒有執行從CUS_NVREFM_ADDR_PROT導入配置的操作,因此,仍然可以擦寫 flash。如圖x所示。

在這里插入圖片描述

圖x 在CUS_NVR啟用寫保護后未復位

在調試環境中復位芯片,重新執行演示用例程序,從log和寄存器觀察窗口中可以觀察到,CUS_NVR中配置的初值已經載入到了EFM_ADDR_PROT寄存器。在執行后續的擦寫操作時,可以看到實際的flash存儲的值沒有因為擦寫操作而變化,說明寫保護作用已經生效。如圖x所示。

在這里插入圖片描述

圖x 在CUS_NVR啟用寫保護后復位生效

注意:在MD和ME的芯片里,NVR里的數據對于用戶不是直接可見的,需要通過專門的讀操作才能拿到其中存放的數據。

再繼續試一下解除寫保護的情況。重新復位芯片,在log交換中解除寫保護。發現此時不需要復位,EFM_ADDR_PROT的寄存器的值就已經同步過來了, 對應當下就可以恢復對flash的擦寫操作。如圖x所示。

在這里插入圖片描述

圖x 在CUS_NVR解除寫保護后立即生效

Demo #3 啟用寫保護后試試塊擦除操作

在測試用例中:

  • 先在未啟用寫保護的情況下,在flash中寫好預設的數據,復位。
  • CUS_NVR中啟用寫保護,復位,讓寫保護生效。
  • 再試著執行塊擦除操作。

在這里插入圖片描述

圖x 試圖擦除啟用寫保護的flash塊

從圖x中可以看到,啟用寫保護之后,執行flash塊擦除操作后,預先存入flash中的數據未受影響。

Conclusion

本文專門講解和驗證了YTM32的flash寫保護的功能。

  • EFM_ADDR_PROT寄存器中的每個bit可以控制啟用對應一塊區域(8KB for MD),但只能開啟寫保護不能解除。如需解除必須復位,重新導入CUS_NVR的值。
  • 在運行軟件時,可以直接寫EFM_ADDR_PROT寄存器啟用寫保護。但只能1變0(啟用寫保護),不能0變1(解除寫保護)。
  • EFM_ADDR_PORT寄存器的初值是從CUS_NVR導入的,因此可以通過擦寫CUS_NVR設定片內flash存儲的上電復位默認狀態。
  • CUS_NVR中啟用寫保護需要復位后才能生效,但解除寫保護是可以不等復位立即生效的。
  • 如果在flash塊上對任意一塊存儲區啟用了寫保護,則整塊flash存儲器的塊擦除操作都不能生效。

本文中使用了兩個測試工程如下,或者私信作者獲取。

  • https://gitee.com/suyong_yq/arm-mcu-sdk-release/blob/master/ytm32-evk/evb-ytm32b1md-q100_efm_flash_write_protect_mdk.zip
  • https://gitee.com/suyong_yq/arm-mcu-sdk-release/blob/master/ytm32-evk/evb-ytm32b1md-q100_efm_flash_write_protect_cus_nvr_mdk.zip

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14464.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14464.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14464.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

報名倒計時兩周|2024 OpenTiny 開源之夏項目直播解讀回顧

5月16日&#xff0c;OpenTiny 開源社區成功舉辦了以《OpenTiny 開源之夏項目解讀直播》為主題的直播活動。此次直播中&#xff0c;華為云的高級前端工程師曾令卡、華為云的高級前端工程師伍其和與10位開源之夏技術專家攜手組成項目導師團&#xff0c;面向廣大開發者一同深入探討…

Java類和對象(五)—— 抽象類、接口、Object類和內部類

抽象類 在繼承體系下&#xff0c;父類有些方法可能是要被重寫的&#xff0c;如果我們事先就知道某些方法需要重寫的話&#xff0c;我們可以不用在父類里面具體實現這個方法&#xff0c;這時候我們會用到抽象方法&#xff0c;這時候我們會用到關鍵字abstract關鍵字來修飾 publ…

BatBot智慧能源管理平臺,更加有效地管理能源

隨著能源消耗的不斷增加&#xff0c;能源管理已成為全球面臨的重要問題。BatBot智慧能源管理作為一種的能源管理技術&#xff0c;促進企業在用能效率及管理有著巨大的提升。 BatBot智慧能源管理是一種基于人工智能技術的能源管理系統&#xff0c;通過智能分析和優化能源使用&…

【JAVA |再談接口、Object、內部類】Object類中子類重寫,Cloneable 接口、比較器、內部類

??謝謝大家捧場&#xff0c;祝屏幕前的小伙伴們每天都有好運相伴左右&#xff0c;一定要天天開心哦&#xff01;?? &#x1f388;&#x1f388;作者主頁&#xff1a; &#x1f388;丠丠64-CSDN博客&#x1f388; ?? 帥哥美女們&#xff0c;我們共同加油&#xff01;一起…

Internet動態路由選擇—RIP與OSPF

剛做完網絡層動態路由選擇的實驗&#xff0c;寫下此篇記錄實驗過程&#xff0c;鞏固學習成果。 參考書目&#xff1a;《計算機網絡》北京理工大學出版社-劉陽老師編 路由選擇可分為兩種策略&#xff1a; - 靜態路由選擇策略 - 動態路由選擇策略 靜態路由即管理員手動配置路由…

Java 商品入庫系統 案例

測試類 package 練習.商品入庫系統;import java.util.ArrayList; import java.util.Scanner; public class Test {public static final int Enrool 1;public static final int Search 2;public static final int Delect 3;public static final int Exit 4;public static…

在docker上部署postgresSQL主從

文章目錄 一、主從規劃二、創建PostgresSQL的Docker鏡像三、主庫部署1、建立pgsql主庫的data地址2、啟動docker鏡像3、docker內操作4、修改配置文件 四、部署從數據庫1、建立psql備庫的data地址2、啟動docker鏡像3、備庫從主庫同步4、檢查是否同步 五、測試主從數據庫 一、主從…

#2495. 滑動窗口 /【模板】單調隊列

題目描述 有一個長為 ( n ) 的序列 ( a )&#xff0c;以及一個大小為 ( k ) 的窗口。現在這個窗口從左邊開始向右滑動&#xff0c;每次滑動一個單位&#xff0c;求出每次滑動后窗口中的最大值和最小值。例如&#xff1a; 數組是 ([1, 3, -1, -3, 5, 3, 6, 7])&#xff0c; ( …

【深度強化學習】關于同一設備上cuda和gpu計算結果不一致問題

文章目錄 問題描述關于seed: 跟原文一致補充:萬能seed 問題結論cpu和gpu差異來源分析浮點數精度的差異補充報錯&#xff1a;Expected all tensors to be on the same device&#xff01;常見運算上的差異累加運算的差異exp運算的差異matmul運算的差異 forward上的差異&#xff…

【LeetCode 隨筆】面試經典 150 題【中等+困難】持續更新中。。。

文章目錄 189. 輪轉數組122. 買賣股票的最佳時機 II55. 跳躍游戲45. 跳躍游戲 II274. H 指數 &#x1f308;你好呀&#xff01;我是 山頂風景獨好 &#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01; &#x1f49d;希望您在這里可以感受到一份輕松…

機器學習云環境搭建

在 https://support.huaweicloud.com/browsertg-obs/obs_03_1003.html 下載對應版本的 OBS Broswer 軟件&#xff0c;如圖&#xff0c;紅框內的為安裝文件&#xff0c;藍色框內的為對應安裝文件的校驗文件&#xff08;無需下載&#xff09; 以 64 位機為例&#xff0c;下載完…

景源暢信電商:抖店需要的成本高嗎?

在數字化時代的浪潮中&#xff0c;短視頻平臺迅速崛起&#xff0c;成為連接用戶與商家的新橋梁。抖音作為其中的佼佼者&#xff0c;不僅改變了人們的娛樂方式&#xff0c;也催生了新型的電商模式——抖店。許多人好奇&#xff0c;入駐這樣一個充滿活力的平臺&#xff0c;需要承…

618知識狂歡,挑本好書,點亮智慧生活!

618精選編程書單&#xff1a;提升你的代碼力 一年一度的618又到啦&#xff01;今年的618就不要亂買啦&#xff0c;衣服買多了會被淘汰&#xff0c;電子產品買多了會過時&#xff0c;零食買多了會增肥&#xff0c;最后怎么看都不劃算。可是如果你購買知識&#xff0c;堅持閱讀&a…

第N2周:Embeddingbag與Embedding詳解

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 | 接輔導、項目定制&#x1f680; 文章來源&#xff1a;K同學的學習圈子 目錄 什么是詞嵌入&#xff1f; Embedding與EmbeddingBag詳解 Embedding Embeddi…

代碼隨想錄算法訓練營第十七天|LeetCode110 平衡二叉樹、LeetCode257 二叉樹的所有路徑

題1&#xff1a; 指路&#xff1a;LeetCode110 平衡二叉樹 思路與代碼&#xff1a; 左右子樹的高度差小于等于1。對于這個題&#xff0c;遞歸比迭代方便太多&#xff0c;我也想過迭代&#xff0c;但是我沒有寫出來&#xff0c;大家可以自己試一下。遞歸代碼如下&#xff1a;…

如何為ChatGPT編寫有效的提示詞:軟件開發者的指南

作為一名軟件開發者&#xff0c;特別是使用Vue進行開發的開發者&#xff0c;與ChatGPT等AI助手高效互動&#xff0c;可以極大地提升你的開發效率。本文將深入探討如何編寫有效的提示詞&#xff0c;以便從ChatGPT中獲取有用的信息和幫助。 1. 明確目標 在編寫提示詞之前&#…

后端之路第二站(正片)——SprintBoot之:分層解耦

很抽象&#xff0c;我自己也不好理解&#xff0c;僅作為一個前端轉后端的個人理解 一、先解釋一個案例&#xff0c;以這個案例來分析“三層架構” 這里我先解釋一下黑馬程序員里的這個案例&#xff0c;兄弟們看視頻的可以跳過這節課&#xff1a;Day05-08. 請求響應-響應-案例_…

【webrtc】m98:Call的創建及Call對音頻接收處理

call中多個流共享相同的輔助組件 這幾個是與外部共用的 線程傳輸send控制module 線程任務隊列工廠call的輔助組件中各種統計以及接收測的cc是自己創建的 call自己的多個輔助組件是外部傳遞來的 call 創建多個接收流 這里用一個set 來保存所有指針,并沒有要map的意思:

【因果推斷從入門到精通二】隨機實驗3

目錄 檢驗無因果效應假說 硬幣投擲的特殊性何在&#xff1f; 檢驗無因果效應假說 無因果效應假說認為&#xff0c;有些人存活&#xff0c;有些人死亡&#xff0c;但接受mAb114治療而不是ZMapp與此無關。在174例接受mAb14治療的患者中&#xff0c;113/17464.9%存活了28天&…