一、文檔背景
隨著嵌入式系統(tǒng)的快速發(fā)展,基于ARM架構的微控制器在工業(yè)控制、物聯網、消費電子等領域的應用日益廣泛。作為主流的嵌入式開發(fā)工具鏈之一,Keil MDK(Microcontroller Development Kit)通過其PACK(Software Pack)生態(tài)系統(tǒng)為開發(fā)者提供了便捷的設備支持、中間件集成和代碼模板管理功能。處理器PACK包作為MDK工具鏈的核心擴展組件,能夠將特定處理器的硬件描述、啟動代碼、外設驅動、調試配置等信息進行標準化封裝,從而簡化開發(fā)流程并提升開發(fā)效率。
當前,半導體行業(yè)不斷推出新型處理器架構與定制化芯片,及時為開發(fā)者提供適配的PACK支持包已成為芯片廠商及生態(tài)合作伙伴的重要任務。通過規(guī)范化的PACK包制作流程,開發(fā)者可以快速在MDK環(huán)境中集成目標處理器,確保工具鏈對硬件資源的完整支持,同時降低項目移植與維護成本。
本文檔旨在為PACK包開發(fā)工程師提供一套完整的制作指南,涵蓋處理器PACK包的規(guī)范定義、工具鏈適配、配置流程及驗證方法,幫助開發(fā)者高效完成從硬件描述到工具支持的標準化封裝工作,最終推動軟硬件生態(tài)的無縫協(xié)同與快速部署。
二、 解決的問題或者進行問題分析
本文檔通過規(guī)范化的PACK包制作流程,旨在解決上述問題:
● 統(tǒng)一硬件抽象:通過PDSC(Pack Description File)和SVD(System View Description)文件,將處理器硬件信息結構化封裝,實現MDK工具鏈的自動識別與配置。
● 標準化工具接口:集成調試配置、Flash算法和啟動代碼,確保開發(fā)環(huán)境開箱即用,減少手動干預。
● 生態(tài)兼容性設計:支持CMSIS標準、第三方中間件和用戶代碼模板的集成,提升資源復用率。
● 版本可控性:通過PACK版本管理和依賴聲明,確保工具鏈與硬件/軟件的同步更新。
三、 Keil MDK的處理器PACK的制作流程
1. 創(chuàng)建一個處理器PACK制作的工作目錄,如E:KeilMDKPackDevicePack。
2. 將“Pack_with_Device_Support.zip”解壓后的“01_Basic_Pack”目錄下的文件復制到工作目錄,(注:去掉Files目錄的只讀屬性)如圖3-1所示:

圖3-1
3. 從“C:UsersPeterAppDataLocalArmPacksARMCMSIS5.7.0CMSISUtilities”目錄及子目錄下,把“
packChk.exe、PACK.xsd、SVDConv.exe”文件復制到工作目錄下:,如圖3-2所示:

圖3-2
4. 打開“MyVendor.MVCM3.pdsc”文本,在“<devices>”部分添加如下內容,如圖3-3所示:
<devices>
<family Dfamily="MVCM3 Series" Dvendor="Generic:5">
<processor Dcore="Cortex-M3" DcoreVersion="r2p1" Dfpu="0" Dmpu="0" Dendian="Little-endian"/>
<description>
The MVCM3 device family contains an ARM Cortex-M3 processor, running up to 100 MHz with a versatile set of on-chip peripherals.
</description>
<!-- ************************ Sub-family 'MVCM3100' **************************** -->
<subFamily DsubFamily="MVCM3100">
<processor Dclock="50000000"/>
<!-- ************************* Device 'MVCM3110' ***************************** -->
<device Dname="MVCM3110">
<memory name="IROM1" access="rx" start="0x00000000" size="0x4000" startup="1" default="1"/>
<memory name="IRAM1" access="rw" start="0x20000000" size="0x0800" init ="0" default="1"/>
</device>
<!-- ************************* Device 'MVCM3120' ***************************** -->
<device Dname="MVCM3120">
<memory name="IROM1" access="rx" start="0x00000000" size="0x8000" startup="1" default="1"/>
<memory name="IRAM1" access="rx" start="0x20000000" size="0x1000" init ="0" default="1"/>
</device>
</subFamily>
<!-- ************************ Sub Family 'MVCM3200' **************************** -->
<subFamily DsubFamily="MVCM3200">
<processor Dclock="100000000"/>
<!-- ************************* Device 'MVCM3250' ***************************** -->
<device Dname="MVCM3250">
<memory name="IROM1" access="rx" start="0x00000000" size="0x4000" startup="1" default="1"/>
<memory name="IRAM1" access="rw" start="0x20000000" size="0x0800" init ="0" default="1"/>
</device>
<!-- ************************* Device 'MVCM3260' ***************************** -->
<device Dname="MVCM3260">
<memory name="IROM1" access="rx" start="0x00000000" size="0x8000" startup="1" default="1"/>
<memory name="IRAM1" access="rw" start="0x20000000" size="0x1000" init ="0" default="1"/>
</device>
</subFamily>
</family>
</devices>

圖3-3
5. 將“Pack_with_Device_Support.zip”解壓后的“02_System_and_Startup”目錄下的內容復制到工作目錄的Files目錄下,如圖3-4所示:

圖3-4
6. 在“MyVendor.MVCM3.pdsc”文件的<conditions>部分添加如下內容,如圖3-5所示:
<condition id="MVCM3 CMSIS-Core">
<!-- conditions selecting Devices -->
<description>MyVendor MVCM3 Series devices and CMSIS-Core (Cortex-M)</description>
<require Cclass="CMSIS" Cgroup="Core"/>
<require Dvendor="Generic:5" Dname="MVCM3*"/>
</condition>
<condition id="Startup ARM">
<description>Startup assembler file for ARMCC</description>
<require Tcompiler="ARMCC"/>
</condition>
<condition id="Startup GCC">
<description>Startup assembler file for GCC</description>
<require Tcompiler="GCC"/>
</condition>
<condition id="Startup IAR">
<description>Startup assembler file for IAR</description>
<require Tcompiler="IAR"/>
</condition>

圖3-5
7. 在“MyVendor.MVCM3.pdsc”文件的<components>部分添加如下內容,如圖3-6所示:
<component Cclass="Device" Cgroup="Startup" Cversion="1.0.0" condition="MVCM3 CMSIS-Core">
<description>System Startup for MyVendor MVCM3 Series</description>
<files>
<!-- include folder -->
<file category="include" name="Device/Include/"/>
<file category="source" name="Device/Source/ARM/startup_MVCM3xxx.s" attr="config" condition="Startup ARM" version="1.0.0"/>
<file category="source" name="Device/Source/GCC/startup_MVCM3xxx.S" attr="config" condition="Startup GCC" version="1.0.0"/>
<file category="source" name="Device/Source/IAR/startup_MVCM3xxx.s" attr="config" condition="Startup IAR" version="1.0.0"/>
<file category="source" name="Device/Source/system_MVCM3xxx.c" attr="config" version="1.0.0"/>
</files>
</component>

圖3-6
8. 在“MyVendor.MVCM3.pdsc”文件的中添加一個新版本信息,如圖3-7所示:

圖3-7
9. 將“Pack_with_Device_Support.zip”解壓后的“03_SVD_File”目錄下的內容復制到工作目錄的Files目錄下,如圖3-8所示:

圖3-8
10. 打開“FilesSVD”目錄下的“MVCM3xxx.svd”文件,修改如圖3-9的內容:

圖3-9
11. 在工作目錄下運行:SVDConv.exe FilesSVDMVCM3xxx.svd --generate=header –-fields=macro,沒有出錯,如圖3-10所示:

圖3-10
12. 把生成的 MVCM3xxx.h移到工作目錄的DeviceInclude目錄下,如圖3-11所示:

圖3-11
13. 在“MyVendor.MVCM3.pdsc”文件中添加如圖3-12的內容:

圖3-12
14. 將“Pack_with_Device_Support.zip”解壓后的“04_Flash_Programming”目錄下的內容復制到工作目錄下,如圖3-13所示:

圖3-13
15. 把“ _Template_Flash”目錄下的“NewDevice.uvproj”修改為“MVCM3XXX_16.uvproj”,如圖3-14所示:

圖3-14
16. 打開“MVCM3XXX_16.uvproj”工程,在選項配置的“Output”中,把執(zhí)行文件名稱修改為“MVCM3XXX_16”,如圖3-15所示:

圖3-15
17. 在Keil MDK中修改“FlashDev.c”中的一個參數,通過構建工程創(chuàng)建“MVCM3XXX_16.FLM”文件(在具體芯片的PACK開發(fā)中,需要調整FlashPrg.c文件中的編程算法。)如圖3-16所示:

圖3-16
18. 把“MVCM3XXX_16.FLM”文件移到Files目錄下新建的Flash目錄下,如圖3-17所示:

圖3-17
19. 通17與18步,再生成MVCM3XXX_32.FLM,并移到Files目錄下新建的Flash目錄下,在“MyVendor.MVCM3.pdsc”文件中添加如圖3-18的內容:

圖3-18
20. 在“MyVendor.MVCM3.pdsc”文件中添加新的版本信息,如圖3-19所示:

圖3-19
21. 將“Pack_with_Device_Support.zip”解壓后的“05_Device_Properties”目錄下的內容復制到工作目錄Files目錄下,如圖3-20所示:

圖3-20
22. 在“MyVendor.MVCM3.pdsc”文件中添加其他通用屬性,如圖3-21所示:

圖3-21
23. 在“MyVendor.MVCM3.pdsc”文件的<components>部分添加如下內容,如圖3-22所示:
<component Cclass="Device" Cgroup="HAL" Csub="GPIO" Cversion="1.0.0" condition="MVCM3 CMSIS-Core">
<description>GPIO HAL for MyVendor MVCM3 Series</description>
<files>
<file category="header" name="Device/Include/GPIO.h"/>
<file category="source" name="Device/Source/GPIO.c"/>
</files>
</component>
<component Cclass="Device" Cgroup="HAL" Csub="ADC" Cversion="1.0.0" condition="MVCM3 CMSIS-Core">
<description>ADC HAL for MyVendor MVCM3 Series</description>
<files>
<file category="header" name="Device/Include/ADC.h"/>
<file category="source" name="Device/Source/ADC.c"/>
</files>
</component>
<component Cclass="CMSIS Driver" Cgroup="I2C" Cversion="1.0.0" condition="MVCM3 CMSIS-Core" maxInstances="3">
<description>I2C Driver for MVCM3 Series</description>
<RTE_Components_h>
#define RTE_Drivers_I2C0 /* Driver I2C0 */
#define RTE_Drivers_I2C1 /* Driver I2C1 */
#define RTE_Drivers_I2C2 /* Driver I2C2 */
</RTE_Components_h>
<files>
<file category="source" name="Drivers/I2C/I2C_MVCM3.c"/>
<file category="header" name="Drivers/I2C/I2C_MVCM3.h"/>
</files>
</component>
<component Cclass="CMSIS Driver" Cgroup="UART" Cversion="1.0.0" condition="MVCM3 CMSIS-Core" maxInstances="5">
<description>UART Driver for MVCM3 Series</description>
<RTE_Components_h>
#define RTE_Drivers_UART0 /* Driver UART0 */
#define RTE_Drivers_UART1 /* Driver UART1 */
#define RTE_Drivers_UART2 /* Driver UART2 */
#define RTE_Drivers_UART3 /* Driver UART3 */
#define RTE_Drivers_UART4 /* Driver UART4 */
</RTE_Components_h>
<files>
<file category="source" name="Drivers/UART/UART_MVCM3.c"/>
<file category="header" name="Drivers/UART/UART_MVCM3.h"/>
</files>
</component>

圖3-22
24. 在“MyVendor.MVCM3.pdsc”文件的 <examples>部分添加如下內容,如圖3-23所示:
<examples>
<example name="Dummy" doc="Abstract.txt" folder="Examples/dummy">
<description>Dummy project</description>
<board name="MVCM3 Starter Kit" vendor="MyVendor"/>
<project>
<environment name="uv" load="dummy.uvprojx"/>
</project>
<attributes>
<category>Getting Started</category>
</attributes>
</example>
</examples>

圖3-23
25. 在“MyVendor.MVCM3.pdsc”文件中添加新的版本信息,如圖3-24所示:

圖3-24
26. 安裝解壓工具7-Zip ,打開“gen_pack.bat”文件,修改“PackChk.exe”文件的路徑,如圖3-25所示:

圖3-25
27. 在命令行下運行“gen_pack.bat”,可以看到“Emdoor.MyPack.1.0.4.pack”的生成,如圖3-26所示:

圖3-26
四、驗證處理器PACK的功能
1. 雙擊“MyVendor.MVCM3.1.0.4.pack”安裝MVCM3的PACK包。
2. 創(chuàng)建一個新工程,驗證處理器名稱,如圖4-1所示:

圖4-1
3. 打開“Manage Run-Time Environment”,驗證啟動代碼與HAL部分,如圖4-2所示:

圖4-2
4. 找開選項配置部分,驗證SVD部分,如圖4-3所示:

圖4-3
5. 打開Flash下載窗體,驗證Flash部分,如圖4-4所示:

圖4-4
五、討論分析
1. 添加多個發(fā)布版本信息后,會無法生成PACK。
答:最新版本必須放在最前面。
2. 在PDSC文件中處理器的屬性說明,如“<book name="Docs/dui0552a_cortex_m3_dgug.pdf" title="Cortex-M3 Generic User Guide"/>”,不能隨意放。
答:需放在“<processor Dcore="Cortex-M3" DcoreVersion="r2p1" Dfpu="0" Dmpu="0" Dendian="Little-endian"/>”之后。
六、結論
經過完整的開發(fā)流程,基于CMSIS-Pack標準規(guī)范成功完成了Cortex-M處理器的Keil MDK Pack包制作。該軟件包嚴格遵循ARM架構技術規(guī)范,集成了目標處理器的完整設備支持文件(DFP),包含關鍵組件:寄存器定義頭文件、系統(tǒng)啟動代碼(Startup Code)、Flash編程算法。通過MDK工具鏈的自動化驗證測試,確認了Pack包在器件識別、代碼編譯、燒錄調試等環(huán)節(jié)的功能完整性。
注:
該文檔還需要完善,先發(fā)出供大家參考與交流。