JNH官网

【ARM】Keil MDK处理器PACK的制作流程

一、文档背景

随着嵌入式系统的快速发展,基于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包在器件识别、代码编译、烧录调试等环节的功能完整性。


注:

该文档还需要完善,先发出供大家参考与交流。

jnh官网 jnh官网 jnh官网 jnh官网 金年会 金年会 金年会 金年会