一、文档背景
随着嵌入式系统的快速发展,基于ARM架构的微控制器在工业控制、物联网、消费电子等领域的应用日益广泛。作为主流的嵌入式开发工具链之一,Keil MDK(Microcontroller Development Kit)通过其PACK(Software Pack)生态系统为开发者提供了便捷的设备支持、中间件集成和代码模板管理功能。处理器PACK包作为MDK工具链的核心扩展组件,能够将特定处理器的硬件描述、启动代码、外设驱动、调试配置等信息进行标准化封装,从而简化开发流程并提升开发效率。
当前,半导体行业不断推出新型处理器架构与定制化芯片,及时为开发者提供适配的PACK支持包已成为芯片厂商及生态合作伙伴的重要任务。通过规范化的PACK包制作流程,开发者可以快速在MDK环境中集成目标处理器,确保工具链对硬件资源的完整支持,同时降低项目移植与维护成本。
本文档旨在为PACK包开发工程师提供一套完整的制作指南,涵盖处理器PACK包的规范定义、工具链适配、配置流程及验证方法,帮助开发者高效完成从硬件描述到工具支持的标准化封装工作,最终推动软硬件生态的无缝协同与快速部署。
二、 解决的问题或者进行问题分析
本文档通过规范化的PACK包制作流程,旨在解决上述问题:
● 统一硬件抽象:通过PDSC(Pack Description File)和SVD(System View Description)文件,将处理器硬件信息结构化封装,实现MDK工具链的自动识别与配置。
● 标准化工具接口:集成调试配置、Flash算法和启动代码,确保开发环境开箱即用,减少手动干预。
● 生态兼容性设计:支持CMSIS标准、第三方中间件和用户代码模板的集成,提升资源复用率。
● 版本可控性:通过PACK版本管理和依赖声明,确保工具链与硬件/软件的同步更新。
三、 Keil MDK的处理器PACK的制作流程
1. 创建一个处理器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”中,把执行文件名称修改为“MVCM3XXX_16”,如图3-15所示:

图3-15
17. 在Keil MDK中修改“FlashDev.c”中的一个参数,通过构建工程创建“MVCM3XXX_16.FLM”文件(在具体芯片的PACK开发中,需要调整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. 创建一个新工程,验证处理器名称,如图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. 添加多个发布版本信息后,会无法生成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"/>”之后。
六、结论
经过完整的开发流程,基于CMSIS-Pack标准规范成功完成了Cortex-M处理器的Keil MDK Pack包制作。该软件包严格遵循ARM架构技术规范,集成了目标处理器的完整设备支持文件(DFP),包含关键组件:寄存器定义头文件、系统启动代码(Startup Code)、Flash编程算法。通过MDK工具链的自动化验证测试,确认了Pack包在器件识别、代码编译、烧录调试等环节的功能完整性。
注:
该文档还需要完善,先发出供大家参考与交流。