一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

雅特力AT32F402/F405安全庫

雅特力 AT32 MCU ? 2025-01-20 18:37 ? 次閱讀

目前越來越多的微控器(MCU)應用需要使用到復雜的算法及中間件解決方案(middleware solution),因此,如何保護軟件方案商開發(fā)出來的核心算法等知識產(chǎn)權(quán)代碼(IP-Code),便成為微控制器應用中一項很重要的課題。因為這一重要的需求,AT32F402/405系列提供了安全庫區(qū)(SLIB)的功能,以防止重要的IP-Code被終端用戶的程序做修改或讀取,進而達到保護的目的。本文檔將詳細闡述AT32F402/405系列安全庫區(qū)的應用原理和軟件使用方法。

應用原理

安全庫區(qū)的應用原理

  • 設(shè)定以密碼保護主閃存中指定范圍的程序區(qū)(即安全庫區(qū)),軟件方案商可將核心算法存放到此區(qū)域,以達到保護的功能,其余空白程序區(qū)可以提供給終端商客戶進行二次開發(fā)。
  • 安全庫區(qū)劃分為唯讀區(qū)(SLIB_READ_ONLY)及指令區(qū)(SLIB_INSTRUCTION),并可選擇部分或是整個安全庫區(qū)存放唯讀區(qū)或者指令區(qū)。
  • 唯讀安全庫區(qū)(SLIB_READ_ONLY)的數(shù)據(jù)能透過I-Code和D-Code總線讀取,不能寫入。
  • 指令安全庫區(qū)(SLIB_INSTRUCTION)內(nèi)的程序代碼僅能被MCU透過I-Code總線抓取指令(僅能被執(zhí)行),不能透過D-Code總線以讀取數(shù)據(jù)的方式讀取(包含ISP/ICP/調(diào)試模式以及從內(nèi)部RAM啟動的程序),以讀取數(shù)據(jù)的方式去訪問SLIB_INSTRUCTION時,讀到的數(shù)值全都是0xFF。
  • 安全庫區(qū)的程序代碼及數(shù)據(jù),除非輸入正確的密碼,否則無法被擦除。在密碼不正確時,對安全庫區(qū)執(zhí)行寫入或擦除,將會在FLASH_STS寄存器的EPPERR位置"1"提出警告。
  • 終端用戶執(zhí)行主閃存的整片擦除時,安全庫區(qū)的程序代碼及數(shù)據(jù)不會被擦除。
  • 當安全庫區(qū)的保護功能被啟動后,可以透過在SLIB_PWD_CLR寄存器寫入先前設(shè)置的密碼來解除保護功能。解除安全庫區(qū)的保護時,芯片將會執(zhí)行主閃存的整片擦除(包含安全庫區(qū)的內(nèi)容)。因此即使軟件方案商設(shè)置的密碼被泄漏,也不會有程序代碼外泄的疑慮。

下圖是包含安全庫區(qū)的主閃存區(qū)映射示意圖,安全庫區(qū)的程序代碼可以很容易地被終端用戶調(diào)用并執(zhí)行, 但不能直接被讀取,因而達到保護的功能。

圖1. 帶有安全庫區(qū)的主閃存區(qū)映射

7fb480d6-d71a-11ef-9434-92fbcf53809c.png

安全庫區(qū)的范圍大小是以扇區(qū)(sector)為單位做設(shè)定,每一扇區(qū)的大小以實際MCU型號為準。表1是AT32F402/405系列各型號的主閃存大小、每扇區(qū)大小及可設(shè)置范圍。另外啟動程序代碼區(qū)在開啟了主存擴展功能后,整個20KB區(qū)域也是可以作為安全庫區(qū)。

表1. AT32F402/405各型號閃存大小總表

7fbfd1a2-d71a-11ef-9434-92fbcf53809c.png

如何啟動安全庫區(qū)保護

默認狀態(tài)下,安全庫區(qū)設(shè)定寄存器始終是不可讀且被寫保護。要想對安全庫區(qū)設(shè)定寄存器進行寫操作,首先要對安全庫區(qū)設(shè)定寄存器解鎖,對SLIB_UNLOCK寄存器寫入解鎖0xA35F6D24值,通過查看SLIB_MISC_STS寄存器的SLIB_ULKF位確認解鎖成功,隨后便允許對安全庫區(qū)設(shè)定寄存器寫入設(shè)定值。

啟動主閃存安全庫區(qū)的步驟如下:

  • 檢查FLASH_STS寄存器的OBF位,以確認沒有其他正在進行的閃存操作;
  • 對SLIB_UNLOCK寄存器寫入0xA35F6D24,以進行安全庫區(qū)解鎖;
  • 檢查SLIB_MISC_STS寄存器的SLIB_ULKF位,以確認解鎖成功;
  • 在SLIB_SET_RANGE寄存器設(shè)定要保護的區(qū)域,包含SLIB的起始和結(jié)束地址以及SLIB指令區(qū)的起始地址;
  • 等待OBF位變?yōu)椤?’;
  • 在SLIB_SET_PWD寄存器設(shè)定安全區(qū)域密碼;
  • 等待OBF位變?yōu)椤?’;
  • 燒錄將存入安全庫區(qū)的代碼;
  • 進行系統(tǒng)復位,重裝載安全庫區(qū)設(shè)定字;
  • 讀出SLIB_STS0/STS1寄存器用于判斷安全庫區(qū)設(shè)定結(jié)果。

注意事項:

  • 可在主閃存和主閃存擴展區(qū)中設(shè)置安全庫區(qū),實際可設(shè)置范圍參見表1;
  • 安全庫區(qū)代碼必須以扇區(qū)為單位進行燒錄,且起始地址必須與主閃存地址或者擴展區(qū)地址對齊;
  • 中斷向量表是數(shù)據(jù)型態(tài)且通常會被放置在閃存的第一扇區(qū)(扇區(qū)0)內(nèi),請勿將閃存的第一扇區(qū)設(shè)定為安全庫區(qū)的指令區(qū);

關(guān)于安全庫區(qū)設(shè)定寄存器的詳細說明,請參閱AT32F402/405系列技術(shù)手冊。

啟動安全庫區(qū)的程序可參考安全庫區(qū)應用范例project_l0中位于main.c中的slib_enable()函數(shù)。亦可使用雅特力的ICP或ISP刻錄工具做設(shè)定,后面章節(jié)將會有詳細的說明。


如何解除安全庫區(qū)保護

當安全庫區(qū)的保護功能被啟動后,可以透過在SLIB_PWD_CLR寄存器寫入先前設(shè)置的密碼來解除保護功能。解除安全庫區(qū)的保護時,芯片將會執(zhí)行主閃存的整片擦除(包含安全庫區(qū)的內(nèi)容)。解除主閃存安全庫區(qū)的步驟如下:

  • 檢查FLASH_STS寄存器的OBF位,以確認沒有其他正在進行的編程操作;
  • 在SLIB_PWD_CLR寄存器寫入先前設(shè)置的安全區(qū)域密碼;
  • 進行系統(tǒng)復位,重裝載安全庫區(qū)設(shè)定字;
  • 讀出SLIB_STS0寄存器用于判斷安全庫區(qū)設(shè)定結(jié)果。

編排及執(zhí)行安全庫區(qū)的程序

如前面章節(jié)所提到,在指令安全庫區(qū)(SLIB_INSTRUCTION)內(nèi)的的程序代碼可以被MCU經(jīng)由I-Code總線抓取,但不能經(jīng)由D-Code總線以讀取數(shù)據(jù)的方式去讀出,這樣的保護是全面性的,也就是說在指令安全庫區(qū)之內(nèi)的程序代碼,也不能讀取同樣被放置在指令安全庫區(qū)之內(nèi)的數(shù)據(jù),例如C程序代碼常被編譯成的文字池(literal pool)、分支表(branch table)或常數(shù)(constant)等之類當指令被執(zhí)行時會經(jīng)由D-Code總線去讀取的數(shù)據(jù)。這代表指令安全庫區(qū)之內(nèi)只能放置指令,不能放置任何數(shù)據(jù)。因此用戶在編排要放置在指令安全庫區(qū)之內(nèi)的程序代碼時,必須配置編譯程序(compiler)的設(shè)定去產(chǎn)生只執(zhí)行(execute-only)的代碼以避免上述那些型態(tài)的數(shù)據(jù)產(chǎn)生。圖2及圖3是一般常見的文字池跟分支表的例子:switch()是C程序中常用的跳轉(zhuǎn)指令,此例子中的sclk_source變量是去讀取CRM_CFG寄存器,圖2可看到編譯出來的匯編代碼(assembly code)“LDR R7, [PC, #288]”,會用程序計數(shù)器(program counter, PC)間接尋址的方式去取得CRM_CFG寄存器的地址,而CRM_CFG的地址會被以常數(shù)的方式存放在鄰近的指令區(qū)(也在指令安全庫區(qū)之內(nèi)),因此執(zhí)行switch()指令時就會發(fā)生數(shù)據(jù)的讀取。如果指令安全庫區(qū)內(nèi)有這類的程序代碼,在執(zhí)行的時候就會產(chǎn)生錯誤。第三章的范例程序?qū)f明如何設(shè)定編譯程序的配置來避免這樣的問題。

圖2. 文字池例子(1)

7fd15b16-d71a-11ef-9434-92fbcf53809c.png

圖3. 文字池例子(2)

7ff5c7c6-d71a-11ef-9434-92fbcf53809c.png

一、不可將中斷向量表設(shè)置為安全庫區(qū)的指令區(qū)

中斷向量表包含每個中斷處理程序的入口點地址,由MCU通過D-Code總線讀取。通常,中斷向量表位于主閃存第一扇區(qū)(sector 0)的起始地址0x08000000,因此在設(shè)置指令安全庫區(qū)時,必須遵守以下的規(guī)則:

  • 不可將主閃存的第一扇區(qū)設(shè)置為安全庫區(qū)的指令區(qū)。

二、安全庫區(qū)代碼與用戶區(qū)代碼的關(guān)聯(lián)性

受安全庫區(qū)保護的程序代碼(IP-Code)可以從位于用戶代碼區(qū)(安全庫區(qū)之外的區(qū)域)的函數(shù)庫中調(diào)用函數(shù)。在這種情形下,IP-Code將會包含這些函數(shù)的地址,允許PC(程序計數(shù)器)在執(zhí)行IP-Code時跳轉(zhuǎn)到這些函數(shù)。一旦安全庫區(qū)被啟動,這些函數(shù)的地址就不能被改變,此時,這些位于用戶代碼區(qū)的函數(shù)的地址就必須固定下來,否則PC將跳轉(zhuǎn)到錯誤的地址而無法正常工作。因此在設(shè)置安全庫區(qū)的時候,應該將所有與IP-Code相關(guān)聯(lián)的函數(shù)都一起編排到安全庫區(qū)之內(nèi)以避免此情況發(fā)生。下圖顯示出一個被保護的函數(shù)Function_A()調(diào)用到用戶區(qū)內(nèi)的函數(shù)Function_B()的例子。圖4. 安全庫區(qū)的函數(shù)調(diào)用用戶區(qū)函數(shù)的例子

800c4082-d71a-11ef-9434-92fbcf53809c.png

此外,另一個最常見的情形就是使用到C語言的標準函式庫,例如memset()及memcpy()這類函數(shù)。如果IP-Code跟用戶區(qū)代碼都有調(diào)用到這類函數(shù),就會有上述問題的困擾。列舉兩種常用的解決方法:1) 將其編譯到安全庫區(qū)范圍內(nèi),具體如何實現(xiàn)可以查看keil或IAR的相關(guān)文檔。2) 避免在IP-Code內(nèi)使用C的標準函式庫,若非要使用,就必須將用到的函數(shù)改寫為其他名稱,以下是一個范例,在IP-Code 中寫一個my_memset()函數(shù)取代原先的memset()。圖5. 自定義函數(shù)范例

801bc93a-d71a-11ef-9434-92fbcf53809c.png

安全庫區(qū)范例程序

本章節(jié)將以為例介紹安全庫區(qū)的使用范例,并詳述完成此范例程序所需的每一個步驟。

范例需求

一、硬件需求

  • 帶有AT32F402RCT7芯片的AT-START-F402實驗板
  • AT-Link仿真器,用來調(diào)試范例程序

二、軟件需求

  • Keil μvision IDE(本范例使用μvision V5.36.0.0)或IAREmbedded workbench IDE(本范例使用IAR V8.22.2)
  • 雅特力ICP或ISP刻錄工具,主要是用來啟動或解除安全庫區(qū)的設(shè)置

范例概述

本應用指南提供了兩個范例項目,展示了軟件開發(fā)商開發(fā)智權(quán)代碼(IP-Code)給終端用戶應用的場景。其中

  • Project_L0為方案商開發(fā)算法并編排到安全庫區(qū)的示例
  • Project_L1為終端用戶應用此算法的示例

Project_L0完成的算法將預先下載刻錄到AT32F402芯片并設(shè)置安全庫區(qū)保護,同時提供下列各項設(shè)定訊息給終端客戶應用程序使用:

  • 主閃存區(qū)塊的映像,說明安全庫區(qū)所占用的區(qū)域以及用戶可開發(fā)程序的區(qū)域
  • 包含算法函數(shù)定義的頭文件,讓終端用戶可以用來調(diào)用相關(guān)的函數(shù)
  • 符號定義文件(symbol definition file),此符號文件內(nèi)含IP-Code的各個函數(shù)的實際地址,讓終端用戶程序可以正確的調(diào)用,下圖為此范例的示意圖。

圖6. 范例流程示意圖

803d40c4-d71a-11ef-9434-92fbcf53809c.png

軟件方案商可以參考Project_L0范例開發(fā)算法代碼,并參考Project_L1提供終端用戶使用,下圖為應用示意圖。圖7. 應用示意圖

804bc5ae-d71a-11ef-9434-92fbcf53809c.png

安全庫區(qū)保護的代碼:FIR低通濾波器

本范例使用CMSIS-DSP庫提供的FIR低通濾波器(FIR lowpass filter)算法作為被安全庫保護的IPCode,關(guān)于FIR低通濾波器算法可詳閱CMSIS-DSP的相關(guān)文件,這里僅著重在說明如何設(shè)置安全庫以保護此算法及如何被終端用戶的程序代碼調(diào)用。范例中的低通濾波器的輸入信號是一個混和了頻率各為1KHz及15KHz的兩個正弦波的訊號,而低通濾波器的截止頻率約為6KHz。經(jīng)過低通濾波后,將15KHz的訊號濾除而僅剩下1KHz的正弦波輸出。下圖為FIR低通濾波功能的示意圖。圖8. FIR低通濾波器

805912cc-d71a-11ef-9434-92fbcf53809c.png

使用到的CMSIS DSP庫的函數(shù)及文件包括:

  • arm_fir_init_f32()

此函數(shù)的功能是做濾波器函數(shù)的初始化設(shè)定,包含在arm_fir_init_f32.c文件里

  • arm_fir_f32()

此函數(shù)為濾波器算法的主要部分,包含在arm_fir_f32.c文件里

  • FIR_lowpass_filter()

此函數(shù)為使用上述兩個基本函數(shù)寫成的FIR低通濾波器全局函數(shù),供終端用戶調(diào)用,包含在fir_filter.c文件里

  • fir_coefficient.c

此C文件內(nèi)含F(xiàn)IR濾波器函數(shù)所使用的系數(shù)(只讀的常數(shù)),在范例中會將這些系數(shù)放置到唯讀安全庫區(qū)

在此范例中,MCU內(nèi)嵌的FPU及DSP指令會被用來做信號處理以及浮點運算,以達到準確的運算及正確的輸出信號。

Project_L0: 方案商范例

在此階段的范例程序,將完成下列幾個項目:

  • 將算法的相關(guān)函數(shù)編譯成只可執(zhí)行(execute-only)的代碼
  • 將算法的程序代碼編排放置到主閃存區(qū)的指定扇區(qū),以下用扇區(qū)A指示
  • 將濾波器函數(shù)的系數(shù)編排放置到主閃存區(qū)的指定扇區(qū),以下用扇區(qū)B指示
  • 在主程序中執(zhí)行FIR_lowpass_filter()以驗證其正確性
  • 驗證成功后,將扇區(qū)A設(shè)置為指令安全庫區(qū),并將扇區(qū)B設(shè)置為唯讀安全庫區(qū),此部分可在范例的主程序中以調(diào)用slib_enable()函數(shù)來完成,或使用Artery ICP Programmer來完成(建議使用ICP工具完成設(shè)置)
  • 產(chǎn)出終端用戶程序調(diào)用低通濾波函數(shù)時需用到的頭文件及符號定義文件

一、產(chǎn)生只執(zhí)行(Execute-only)代碼

每一種工具鏈(toolchain)都有自己的設(shè)定選項,可以防止編譯程序生成文字池(literal pools)和分支表(branch table)這些在指令執(zhí)行時會發(fā)生讀取數(shù)據(jù)的指令格式,例如”LDR Rn, [PC, #offset]”這類指令。關(guān)于文字池及分支表的例子可參照章節(jié)2.4的說明。以Keil μvision為例,Keil μvision有Execute-only Code的選項來做設(shè)定,設(shè)定的方式如下:Keil μvision:使用Execute-only Code選項設(shè)置的方式是:

  • 選擇C文件群組或個別的C文件,范例中是把要保護的相關(guān)C文件都放在fir_filter群組
  • 按鼠標右鍵然后選擇對應文件,例如本例程的Option for File ‘a(chǎn)rm_fir_f32.c’,如下圖

圖9. Keil進入Option界面

8066d88a-d71a-11ef-9434-92fbcf53809c.png
  • 勾選C/C++窗口里的Execute-only Code選項,然后--execute_only命令就會被加到編譯過程控制字符串里,如下圖

圖10. Keil選擇Execute-only Code

807c0d36-d71a-11ef-9434-92fbcf53809c.png
  • 本例程中有三個文件位于SLIB_INSTRUCTION區(qū),分別是arm_fir_f32.c、arm_fir_init_f32.c和fir_filter.c,這三個文件都需要配置產(chǎn)生為只執(zhí)行代碼。

IAR:使用No data read in code memory選項設(shè)置的方式是:

  • 選擇fir_filter群組里對應的文件,按鼠標右鍵選擇Option

圖11. IAR進入Option界面

808d646e-d71a-11ef-9434-92fbcf53809c.png
  • 如下圖,在"C/C++"窗口內(nèi)勾選Override inherited settings以及No data read in code memory

圖12. IAR設(shè)置C/C++窗口選項

809ad9dc-d71a-11ef-9434-92fbcf53809c.png
  • 本例程中有三個文件位于SLIB_INSTRUCTION區(qū),分別是arm_fir_f32.c、arm_fir_init_f32.c和fir_filter.c,這三個文件都需要配置產(chǎn)生為只執(zhí)行代碼。

AT32 IDE:添加Other compiler flags關(guān)鍵字設(shè)置的方式是:

  • 選擇工程中fir_filter群組里對應的文件,按鼠標右鍵選擇Properties

圖13. AT32 IDE進入Properties界面

80afe214-d71a-11ef-9434-92fbcf53809c.png
  • 點選C/C++Build->Settings->GNU ARM Cross C Complier->Miscellaneous,在”O(jiān)ther compiler flags”填入-mpure-code以及-mslow-flash-data這兩個關(guān)鍵字,然后按Apply設(shè)定生效

圖14. AT32 IDE設(shè)置Miscellaneous

80c71ef2-d71a-11ef-9434-92fbcf53809c.png

二、編排安全庫區(qū)的地址

前面章節(jié)提到的,主閃存的第一扇區(qū)(sector 0)會被用來存放中斷向量表。下圖為主閃存的映射及RAM的使用分區(qū)。RAM的分區(qū)主要是為了避免SLIB保護區(qū)的代碼與終端用戶的代碼用到相同的RAM而產(chǎn)生的沖突問題。圖15. 范例程序的主閃存映像及RAM分區(qū)

80d5c4fc-d71a-11ef-9434-92fbcf53809c.png

Keil μvision的scatter file步驟如下:

  • 到Project→Optios for Target→Linker窗口,取消Use memory layout from Target Dialog選項,然后按Edit按鍵來開啟slib-w-xo.sct文件做修改,如下圖

圖16. Keil設(shè)置Linker窗口選項

80e55782-d71a-11ef-9434-92fbcf53809c.png
  • 打開scatter file之后,將需要放到指令安全庫區(qū)(SLIB_INSTRUCTION)的代碼的目標文件(object file)放到名為LR_SLIB_INSTRUCTION的專用加載區(qū),并將標示修改為execute-only(+XO),同時也要將SLIB_READ_ONLY占用的區(qū)域保留起來放到名為LR_SLIB_READ_ONLY的專用加載區(qū),避免編譯程序?qū)⑵渌荌P-Code的函數(shù)編排到SLIB區(qū)內(nèi),RW_IRAM1是指定給安全庫區(qū)算法的函數(shù)使用,目的是為了避免終端用戶的項目也用到同樣的RAM區(qū)塊,而造成程序執(zhí)行時發(fā)生錯誤,如下所示

圖17. Keil scatter修改

80feeb98-d71a-11ef-9434-92fbcf53809c.png
  • IP-Code用到的RAM以及數(shù)據(jù)安全庫區(qū)FIR低通濾波器函數(shù)使用到的常數(shù)編排地址,除了上述的修改scatter file方式之外,也可以代碼中使用Keil的__attribute__((at(address)))描述元將變量或常數(shù)放置到固定的地址

IAR的ICF file步驟如下:

  • 開啟\project_l0\IAR_V8.2\目錄下的icf文件,添加三個新的加載區(qū),如下所示,其中SLIB_RAM區(qū)塊的RAM保留給算法的函數(shù)使用

圖18. icf文件中SLIB地址定義

810fee70-d71a-11ef-9434-92fbcf53809c.png
  • 在ICF文件中,也要將SLIB占用的區(qū)域保留起來,避免編譯程序?qū)⑵渌荌P-Code的函數(shù)編排到SLIB區(qū)內(nèi),同時將IP-Code使用的RAM區(qū)域保留起來

圖19. icf文件中地址分配

812a8dc0-d71a-11ef-9434-92fbcf53809c.png
  • IP-Code用到的RAM和ROM,修改icf文件,如下圖

圖20. icf文件中SLIB使用的RAM修改

813ce0b0-d71a-11ef-9434-92fbcf53809c.png
  • IP-Code用到的RAM以及數(shù)據(jù)安全庫區(qū)FIR低通濾波器函數(shù)使用到的常數(shù)編排地址,除了上述的修改ICF文件方式之外,也可以代碼中使用IAR的@描述元將變量或常數(shù)放置到固定的地址

AT32 IDE的ld file步驟如下:

  • 修改ld文件,劃出安全庫區(qū)所需的區(qū)域,如下圖

圖21. ld文件中使用的RAM和ROM范圍修改

81619fa4-d71a-11ef-9434-92fbcf53809c.png
  • 將算法代碼放到.slib_inst section,低通濾波器的系數(shù)放到.slib_read_only section,并將算法使用到的全局變量指定到.slib_ram section,如下圖

圖22. ld文件中編排放置位置

81726a5a-d71a-11ef-9434-92fbcf53809c.png
  • 在Project->Properties->C/C++Build->Setting->GNU ARM Cross C Linker->General設(shè)定中的Script files,加入改好后的ld文件。

圖23. 添加修改后的ld文件

8181f9ac-d71a-11ef-9434-92fbcf53809c.png
  • 本范例會使用到gcc的數(shù)學運算函數(shù)庫libm.a,在Properties->GNU ARM Cross C Linker->Miscellaneous設(shè)定中的Other linker flags填入--specs=rdimon.specs,linker才不會出現(xiàn)錯誤訊息,如下圖

圖24. 添加額外關(guān)鍵字避免編譯報錯

818cd49e-d71a-11ef-9434-92fbcf53809c.png

三、啟用安全庫區(qū)保護

要啟用安全庫區(qū)的保護功能,有以下兩種方式:(1) 使用ICP刻錄工具Artery ICP Programmer(建議用此方式)要使用ICP Programmer,請參照以下步驟:

  • 連接AT-Link到AT-START-F402板子上并上電
  • 開啟ICP Programmer,選擇用AT-Link連接,然后添加Project_L0范例編譯后產(chǎn)出的HEX或BIN文件,如下圖

圖25. 配置ICP Programmer

81aa28fa-d71a-11ef-9434-92fbcf53809c.png
  • 按下載按鍵,會出現(xiàn)下載選項的頁面,此頁面會顯示SLIB的狀態(tài)及相關(guān)的參數(shù),設(shè)定啟用密碼0x55665566(可自定義)并勾選啟用SLIB,然后按開始下載,即可完成程序的燒錄并啟用SLIB,如下圖

圖26. 設(shè)置下載選項參數(shù)

81bb880c-d71a-11ef-9434-92fbcf53809c.png

關(guān)于ICP Programmer的詳細說明,請參閱ICP Programmer用戶手冊。(2) 使用范例程序main.c之中的slib_enable()函數(shù)在低通濾波函數(shù)測試正確后執(zhí)行過一次此函數(shù),就可以啟用安全庫區(qū)的保護功能。要執(zhí)行此函數(shù),只要在main.c中使能#define USE_SLIB_FUNCTION即可。

四、Project_L0執(zhí)行流程

在此范例中,F(xiàn)IR低通濾波器會針對混和1KHz及15KHz正弦波的輸入信號testInput_f32_1kHz_15kHz 做計算,計算后輸出的1KHz正弦波數(shù)據(jù)存放到testOutput,然后會跟預先用MATLAB軟件計算好且存放在refOutput中的數(shù)據(jù)做比對,如果誤差值小于預期值(訊噪比SNR大于預設(shè)的門坎),板子上綠色的LED燈會一值閃爍,反之則是紅色的LED燈一值閃爍,下圖是Project_L0的整個流程圖27. Project_L0執(zhí)行流程

81cb9238-d71a-11ef-9434-92fbcf53809c.png

要執(zhí)行此范例程序,請按照下列步驟:(1) 使用Keil μvision開啟\utilities\AT32F402_405_slib_demo\project_l0\mdk_v5\目錄下的Project_L0項目,并重新編譯。(2) 在下載代碼之前,先檢查AT-START-F402板子上的芯片是否已經(jīng)有SLIB或讀寫保護(FAP/EPP),如果有,就請先用ICP刻錄工具將這些保護都解除,然后再下載代碼。(3) 下載成功后并開始值執(zhí)行后,會看到板子上的LED3燈持續(xù)快速閃爍。(4) 按下板子上的USER按鍵,就會執(zhí)行低通濾波器的運算。(5) 比對運算結(jié)果,若結(jié)果正確,綠色LED4燈會持續(xù)閃爍。反之,則是紅色LED2燈持續(xù)閃爍。(6) 在比對結(jié)果正確的條件下,如果main.c中的USE_SLIB_FUNCTION有被定義且芯片未啟用過SLIB的話,就會執(zhí)行slib_enable()函數(shù)去設(shè)置SLIB,若設(shè)置失敗,紅色LED2燈會一直亮著。若設(shè)置成功,綠色LED4燈會點亮約3秒鐘然后執(zhí)行系統(tǒng)重置(system reset)來啟動SLIB。然后程序又回到步驟(3)。

五、產(chǎn)生頭文件及符號定義文件

頭文件(header file)跟符號定義文件(symbol definition file)是終端客戶應用范例Project_L1在調(diào)用FIR低通濾波函數(shù)時需要用到。在范例中,就是main.c中包含的fir_filter.h文件。符號定義文件的產(chǎn)出方法跟使用的工具鏈(toolchain)相關(guān)。使用Keil μvision產(chǎn)生符號定義文件方法如下:

  • 進入Ottions forTarget→Linker設(shè)定畫面
  • 在Misc controls這一欄,添加--symdefs=fir_filter_symbol.txt命令,如下圖

圖28. 設(shè)置Keil Misc controls選項

81daebd4-d71a-11ef-9434-92fbcf53809c.png
  • 重新編譯整個項目后,在project_l0\mdk_v5\Objects 目錄下就會產(chǎn)生一個名為fir_filter_symbol.txt的符號定義文件
  • 這個符號定義文件包含了整個項目全部的符號定義,所以需要修改,只保留終端用戶會調(diào)用的低通濾波函數(shù)的定義,刪減后的fir_filter_symbol.txt顯示如下

圖29. 修改后的fir_filter_symbol.txt內(nèi)容

81f1802e-d71a-11ef-9434-92fbcf53809c.png

使用IAR產(chǎn)生符號定義文件方法如下:

  • 選擇Project→Option→Build Actions

圖30. 設(shè)置IAR Build Actions選項

81fba3ec-d71a-11ef-9434-92fbcf53809c.png
  • 然后在Post-build命令行中輸入以下命令

$TOOLKIT_DIR$\bin\isymexport.exe--edit "$PROJ_DIR$\steering_file.txt"

"$TARGET_PATH$" "$PROJ_DIR$\fir_filter_symbol.o"

  • 此處fir_filter_symbol.o是要產(chǎn)出的符號定義文件,steering_file.txt放在project_l0\iar_v8.2目錄下,是用來選擇要產(chǎn)生哪些函數(shù)的符號,需根據(jù)安全庫區(qū)調(diào)用的內(nèi)容進行手動編輯,內(nèi)容如下,其中"show"是用來選擇函數(shù)的命令

圖31. 編輯的steering_file.txt內(nèi)容

820dea48-d71a-11ef-9434-92fbcf53809c.png

使用AT32 IDE產(chǎn)生符號定義文件方法如下:

  • 創(chuàng)建一個keep_sym.txt文件,用來選擇要產(chǎn)生哪些函數(shù)的符號,需根據(jù)安全庫區(qū)調(diào)用的內(nèi)容進行手動編輯
  • 創(chuàng)建一個postbuild.sh文件,文件內(nèi)容見工程,主要是用于生成包含函數(shù)名稱和地址的.ld文件
  • 選中project_l0工程,按鼠標右鍵選擇Properties
  • 點選C/C++Build->Settings->Build Steps->Post-build steps->Command中,填入"../postbuild.sh" "${BuildArtifactFileName}",點擊Apply生效
  • 編譯后,DEBUG文件夾中會生成一個keep_sym_app.ld文件

圖32. AT32 IDE添加post-build命令

821ffb34-d71a-11ef-9434-92fbcf53809c.png

Project_L1: 終端用戶范例

Project_L1范例會使用到在Project_L0中調(diào)試好,并已經(jīng)被刻錄到AT32F402芯片的主閃存中且被SLIB保護的FIR低通濾波器函數(shù)。根據(jù)Project_L0提供的頭文件、符號定義文件以及主閃存區(qū)塊映像,終端用戶就可以參照Project_L1做到

  • 建立一個應用項目
  • 引用Project_L0提供的頭文件及符號定義文件到項目里
  • 調(diào)用FIR低通濾波器函數(shù)
  • 開發(fā)并調(diào)試用戶自己的應用程序

注意事項:Project_L1必須使用跟Project_L0開發(fā)時一樣的工具鏈及相同版本的編譯程序,不然有可能會因為版本差異的兼容性問題,而無法使用Project_L0提供的代碼。例如本范例中Project_L0使用的是Keil μvision V5.36.0.0,那Project_L1也要使用同樣的這個版本。

一、建立用戶的應用項目

因為Project_L0啟用的安全庫區(qū)已經(jīng)占用了一些特定的主閃存扇區(qū),Project_L1的代碼必須參照Project_L0提供的主閃存區(qū)塊映像來編排放置的地址。圖15為此范例的主閃存區(qū)塊映射,其中sector2至sector 5為安全庫區(qū)所占用,終端用戶需使用linker control file將這個區(qū)域隔離起來,避免代碼在編譯時被編排到這個區(qū)域內(nèi),方式如下:Keil μvision的scatter file可參照project_l1\mdk_v5\目錄的end_user_code.sct文件,將主閃存空間切成兩個區(qū)塊,中間空出來的區(qū)域就是SLIB保護區(qū)。此外,RAM的區(qū)域也要保留0x20017000之后的區(qū)域。如下圖圖33. 修改后的scatter文件

82360816-d71a-11ef-9434-92fbcf53809c.png

IAR的ICF file可參照project_l1\iar_V8.2\目錄下enduser.icf文件中如下圖的部分圖34. 修改后的icf文件824e0dbc-d71a-11ef-9434-92fbcf53809c.pngAT32 IDE的ld file可參照project_l1\at32_ide\目錄下FLASH_enduser.ld文件修改,添加如下圖的行圖35. ld文件添加project_l0生成的文件8265f2b0-d71a-11ef-9434-92fbcf53809c.png

二、在項目中加入符號定義文件

Project_L0所產(chǎn)生的符號定義文件fir_filter_symbol.txt必須被添加到Project_L1項目中,才能被正確的編譯并鏈結(jié)到SLIB保護區(qū)的代碼。在Keil μvision中加入符號定義文件工程中添加fir_filter_symbol.txt這個符號定義文件,如下圖:圖36. 在Keil加入symbol definition file

8281f69a-d71a-11ef-9434-92fbcf53809c.png

將文件加入fir_filter群組后,必須將它的文件類型更改為Object文件,而不是原來的文本(text)文件,修改方式如下圖37. 修改符號定義文件的類型為Object file

8295493e-d71a-11ef-9434-92fbcf53809c.png

在IAR中加入符號定義文件將fir_filter_symbol.o這個Object文件加到加到fir_filter群組即可,如下圖圖38. 在IAR中加入符號定義文件

82a60be8-d71a-11ef-9434-92fbcf53809c.png

在AT32 IDE中加入符號定義文件例程中將keep_sym_app.ld放在了fir_filter文件夾內(nèi)添加進工程,在Project->Properties->C/C++Build->Setting->GNU ARM Cross C Linker->Library中添加keep_sym_app.ld所在路徑圖39. 在AT32 IDE中添加ld路徑

82ad85ee-d71a-11ef-9434-92fbcf53809c.png

三、調(diào)用SLIB保護區(qū)的函數(shù)

當filter.h頭文件被main.c引用且符號定義文件也正確地加入項目之后,保護區(qū)的低通波器函數(shù)就可以被調(diào)用。方式如下:FIR_lowpass_filter(inputF32, outputF32, TEST_LENGTH_SAMPLES);其中:inputF32 :指向包含輸入信號數(shù)據(jù)表的指針outputF32 :指向存放輸出信號數(shù)據(jù)表的指針TEST_LENGTH_SAMPLES :要被處理的信號樣本數(shù)

四、Project_L1執(zhí)行流程

Project_L1的執(zhí)行流程如下圖,說明如下:

  • 開始執(zhí)行后LED3燈會持續(xù)閃爍
  • 按下AT-START板子上的USER按鍵,F(xiàn)IR_lowpass_filter()開始做運算
  • 如運算結(jié)果正確,綠色LED4燈持續(xù)閃爍,如運算結(jié)果錯誤則紅色LED2燈持續(xù)閃爍

圖40. Project_L1流程圖

82c4a9cc-d71a-11ef-9434-92fbcf53809c.png

五、調(diào)試模式下的SLIB保護

當終端用戶在開發(fā)應用程序時,會用到開發(fā)工具調(diào)試代碼,以下將以Keil μvision為例,說明在調(diào)試模式下,SLIB如何防止保護區(qū)內(nèi)的代碼被以數(shù)據(jù)的方式讀取

  • 開啟Project_L1項目并重新編譯
  • 點擊”Start/Stop Debug Session”進入調(diào)試模式
  • 在”Disassembly”窗口點擊數(shù)標右鍵,然后選擇”Show Disassembly at Address”,如下圖

圖41. 進入Show Disassembly at Address

82d59f20-d71a-11ef-9434-92fbcf53809c.png
  • 輸入SLIB_INSTRUCTION扇區(qū)地址

圖42. 設(shè)置Show Code at Address82eeb78a-d71a-11ef-9434-92fbcf53809c.png可以看到代碼都是0x00圖43. 代碼查看82fd3b66-d71a-11ef-9434-92fbcf53809c.png

  • 同樣地在Memory窗口輸入地址,也會看到全部是0x00

圖44. Memory窗口查看代碼83113210-d71a-11ef-9434-92fbcf53809c.png

  • 在Memory窗口,輸入SLIB_READ_ONLY地址,因為這個區(qū)塊允許被D-Code數(shù)據(jù)總線讀取,所以可以看到原來的數(shù)值

圖45. Memory窗口查看SLIB_READ_ONLY起始頁面8320158c-d71a-11ef-9434-92fbcf53809c.png對安全庫區(qū)的數(shù)據(jù)嘗試做修改,F(xiàn)LASH_STS寄存器的EPPERR位置”1”提出警告,顯示寫保護發(fā)生作用圖46. SLIB寫測試8334db5c-d71a-11ef-9434-92fbcf53809c.png如果有使能寫保護錯誤中斷,繼續(xù)執(zhí)行程序就會進入中斷程序里面圖47. 寫保護錯誤中斷834c7960-d71a-11ef-9434-92fbcf53809c.png

方案商和終端用戶代碼整合及下載操作流程

方案商和終端用戶的代碼設(shè)計完成后,需要下載到同一個MCU中,這就涉及到各自代碼的安全性問題。以下列舉兩種常用下載操作流程供用戶參考,仍然是以上面Project_L0和Project_L1為例。操作中涉及到AT-Link的離線下載模式,詳細描述可以參考ICP使用文檔及AT-Link使用文檔。

方案商和終端用戶代碼分別燒錄

方案商先燒錄SLIB代碼到MCU,然后終端用戶再燒錄應用代碼到MCU,步驟如下:(1)方案商將編譯完成的工程中SLIB部分的代碼提取并保存成BIN或者HEX檔,這步可以通過各個IDE軟件或者ICP工具實現(xiàn),例如在KEIL工程中,user選項中添加fromelf.exe--bin--output.\Listings\@L.bin !L,編譯生成對應固件的bin檔,將對應的SLIB段文件添加后綴名.bin格式,本例中修改為ER_SLIB_INSTRUCTION.bin和ER_SLIB_READ_ONLY.bin,對應的就是SLIB-INSTRUCTION文件和SLIB-DATA文件,也可以新版ICP直接打開工程完整HEX檔然后點擊文件->文件另存為bin格式,分段的bin名對應地址,如下圖。圖48. 生成SLIB代碼部分bin文件8387cf88-d71a-11ef-9434-92fbcf53809c.png(2) 將bin通過ICP工具,在線燒錄到MCU,如下圖圖49. ICP在線燒錄MCU839ba22e-d71a-11ef-9434-92fbcf53809c.png(3) 或者通過ICP工具配置成離線項目工程保存到AT-Link,然后經(jīng)過AT-Link離線燒錄到MCU,保存離線項目工程如下圖。圖50. AT-Link離線燒錄到????MCU83b6af38-d71a-11ef-9434-92fbcf53809c.png(4) 經(jīng)過步驟2或者步驟3,終端用戶拿到燒錄好SLIB部分的MCU,此時SLIB狀態(tài)會顯示為已啟用,終端用戶通過在線燒錄或者離線燒錄應用代碼到MCU完成整個過程,在線燒錄如下圖。圖51. 終端用戶燒錄代碼到MCU83dcb80e-d71a-11ef-9434-92fbcf53809c.png

方案商和終端用戶代碼合并燒錄

方案商的SLIB代碼和終端用戶的應用代碼整合到一個離線項目工程中,通過AT-Link離線燒錄一次下載到MCU,步驟如下:(1) 方案商將編譯完成的工程按照上一章節(jié)所述方法處理,得到SLIB部分的BIN檔。(2) 方案商通過ICP制作離線項目工程并保存到PC,可以根據(jù)最終需求配置各種參數(shù),比如限制下載次數(shù)、項目文件綁定AT-Link、下載完成后開啟FAP等,保存離線項目工程如下圖注意:離線項目工程本身已經(jīng)經(jīng)過加密,為進一步提升安全性,方案商還可以將slib.bin制作成加密的slib.benc文件再添加到離線項目工程中,但此時的離線項目工程只能在對應匹配加密秘鑰的AT-Link上才能使用圖52. 制作離線項目工程83f1471a-d71a-11ef-9434-92fbcf53809c.png(3) 終端用戶拿到該離線項目工程,用ICP打開項目文件,通過添加文件功能,可以添加應用代碼部分到該離線項目工程,然后再保存到PC或者直接存儲到AT-Link,通過執(zhí)行離線下載完成操作,項目文件添加方法如下圖。注意:為防止代碼泄露被破解等風險,離線項目工程添加代碼文件時其余配置都不可更改,所以需要方案商預先將最終配置設(shè)置好圖53. 添加項目文件

8407ce4a-d71a-11ef-9434-92fbcf53809c.png
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17718

    瀏覽量

    358193
  • 雅特力
    +關(guān)注

    關(guān)注

    0

    文章

    177

    瀏覽量

    8400
  • AT32
    +關(guān)注

    關(guān)注

    1

    文章

    120

    瀏覽量

    2498
收藏 人收藏

    評論

    相關(guān)推薦

    AT32F402/405時鐘配置入門指南

    AT32F402/405時鐘配置本應用入門指南主要介紹兩部分內(nèi)容:1、基于提供的V2.x.x 的板級支持包來進行時鐘源碼的配置及修改2
    發(fā)表于 10-26 06:37

    AT32F402/405 I 2C使用指南

    AT32F402/405 I2C使用指南本文主要就I2C 總線接口的基本功能進行講解和案列解析。
    發(fā)表于 10-26 08:17

    AT32F402/405 DMA使用指南

    AT32F402/405 DMA使用指南主要就DMA 的基本功能進行講解和案列解析。
    發(fā)表于 10-26 07:29

    AT32F402/405的GPIO功能及固件驅(qū)動程序API的配置和使用

    AT32F402/405 GPIO Application Note介紹AT32F402/405的GPIO功能及固件驅(qū)動程序API的配置和使用,并對BSP例程的軟件設(shè)計加以說明,同時演
    發(fā)表于 10-26 07:03

    AT32F402/405 PWC應用筆記

    AT32F402/405 PWC應用筆記主要以低功耗為基礎(chǔ)進行講解和案例解析。
    發(fā)表于 10-26 06:33

    AT32F402/405安全應用說明

    AT32F402/405 Security Library Application Note主要在闡述AT32F402/405系列安全庫區(qū)的
    發(fā)表于 10-26 08:30

    AT32F421

    AT32F421 AT32
    發(fā)表于 03-30 10:39 ?2247次閱讀
    <b class='flag-5'>雅</b><b class='flag-5'>特</b><b class='flag-5'>力</b>AT32<b class='flag-5'>F</b>421

    展臺首日速遞,AT32 MCU精彩亮相

    熱門領(lǐng)域產(chǎn)品齊聚,一展科技創(chuàng)新風采。新品登場,AT32F402/F405拓展高速USB應用新紀元A
    的頭像 發(fā)表于 08-24 08:17 ?793次閱讀
    <b class='flag-5'>雅</b><b class='flag-5'>特</b><b class='flag-5'>力</b>展臺首日速遞,AT32 MCU精彩亮相

    AT32F402和AT32F405系列MCU 9月正式投入量產(chǎn)

    力作為32位MCU創(chuàng)新領(lǐng)導者,領(lǐng)先業(yè)界研發(fā)USB OTG產(chǎn)品拓展其功能性,于近日正式推出主流型AT32F402和AT32F405系列新品,集成獨立的HS USB OTG(內(nèi)建PHY
    發(fā)表于 09-06 14:55 ?1626次閱讀

    AT32講堂088 | AT32F402/F405時鐘配置

    介紹如何結(jié)合提供的V2.x.x的板級支持包(BSP)來配置時鐘。以下介紹時鐘配置的方法主要分兩種:1、以手動編寫代碼調(diào)用BSP中提供的驅(qū)動函數(shù)接口來進行時鐘配
    的頭像 發(fā)表于 09-15 08:08 ?814次閱讀
    AT32講堂088 | <b class='flag-5'>雅</b><b class='flag-5'>特</b><b class='flag-5'>力</b><b class='flag-5'>AT32F402</b>/<b class='flag-5'>F405</b>時鐘配置

    AT32F402/F405 ADC使用指南

    ADC簡介ADC控制器的功能極其強大。其包含但不限于以下內(nèi)容時鐘及狀態(tài),由數(shù)字和模擬時鐘兩個部分組成支持分辨率為12位的轉(zhuǎn)換,采樣周期支持廣范圍的配置自校準,自帶校準功能以糾正數(shù)據(jù)偏移基本模式,支持多種模式,不同模式可組合使用滿足多種應用不同優(yōu)先權(quán)的通道,普通通道與搶占通道具備不同的優(yōu)先權(quán)多種獨立的觸發(fā)源,包括TMR、EXINT、軟觸發(fā)等多種觸發(fā)選擇數(shù)據(jù)后級
    的頭像 發(fā)表于 01-10 17:27 ?704次閱讀
    <b class='flag-5'>雅</b><b class='flag-5'>特</b><b class='flag-5'>力</b><b class='flag-5'>AT32F402</b>/<b class='flag-5'>F405</b> ADC使用指南

    AT32F402/F405 GPIO應用筆記

    GPIO特性AT32F402/405支持多達56個雙向I/O引腳,這些引腳分為5組,分別為PA0-PA15、PB0-PB15、PC0-PC15、PD2、PF0-PF1、PF4-PF7、PF11、每個
    的頭像 發(fā)表于 01-10 17:28 ?597次閱讀
    <b class='flag-5'>雅</b><b class='flag-5'>特</b><b class='flag-5'>力</b><b class='flag-5'>AT32F402</b>/<b class='flag-5'>F405</b> GPIO應用筆記

    AT32F402/F405時鐘配置

    電子發(fā)燒友網(wǎng)站提供《AT32F402/F405時鐘配置.pdf》資料免費下載
    發(fā)表于 01-15 15:24 ?0次下載
    <b class='flag-5'>雅</b><b class='flag-5'>特</b><b class='flag-5'>力</b><b class='flag-5'>AT32F402</b>/<b class='flag-5'>F405</b>時鐘配置

    AT32F402/F405 PWC 應用筆記

    關(guān)系電壓調(diào)節(jié)器,電壓調(diào)節(jié)器的幾個工作狀態(tài)省電模式,包括睡眠模式、深度睡眠模式、待機模式圖1.電源域框圖PWC基本功能解析供電方案一、功能介紹AT32F402/40
    的頭像 發(fā)表于 01-20 18:37 ?319次閱讀
    <b class='flag-5'>雅</b><b class='flag-5'>特</b><b class='flag-5'>力</b><b class='flag-5'>AT32F402</b>/<b class='flag-5'>F405</b> PWC 應用筆記

    AT32F402/F405入門使用指南

    搭建AT32開發(fā)環(huán)境一、調(diào)試工具及開發(fā)板目前AT32F402/AT32F405開發(fā)板都自帶AT-Link-EZ調(diào)試工具,AT-Link-EZ如下圖左邊紅框所示,它也可拆開后單獨搭配其他電路板使用,支持IDE在線調(diào)試、在線燒錄、USB轉(zhuǎn)串口等功能。圖1.AT-START
    的頭像 發(fā)表于 03-28 18:59 ?262次閱讀
    <b class='flag-5'>雅</b><b class='flag-5'>特</b><b class='flag-5'>力</b><b class='flag-5'>AT32F402</b>/<b class='flag-5'>F405</b>入門使用指南