用MDK为多核的MCU创建编译工程要略比单核MCU复杂一些。本文以STM32H745双核MCU为例示范如何创建一个工程。其实,STM32CubeMX已支持自动生成MDK编译工程了,但其生成的文件树结构复杂,且还生成很多无用文件,所以这里示范如何以一种更直观的文件树结构创建工程。因只是介绍创建过程,不关注编程代码,这里借用了STM32CubeMX来快速生成源文件。
由于如何使用STM32CubeMX配置和生成源代码不是本文的主题,所以下面生成一个非常简单的工程,且设置过程也多有省略。如你对STM32CubeMX不熟悉,建议了解一下STM32CubeMX。如果你已经有自己的源代码了,可以跳过这一步。
打开STM32CubeMX后,开始选择MCU
选择STM32H745ZI双核MCU或者选择你自己已有的双核MCU
配置MCU外设
作为示范这里只简单配置了三个LED和一个按键,未配置其它外设。
配置MCU时钟
生成源代码
指定源代码的生成目录和工程名,然后选择IDE为MDK-ARM。我的MDK版本是5.29,所以选择了V5.27。你也可以选择V5.0,我没注意到有什么差别。
生成源代码后直接退出STM32CubeMX
查看新生成的工程文件夹,文件夹中应有如下文件和子目录
为MDK工程创建一个文件夹
文件夹的位置和名称可自定义,这里以STM32H7MDK文件夹为例
启动MDK,然后选择生成一个新工程
在前面创建的MDK工程文件夹下指定一个工程文件名
选择MCU
双核MCU下有两个核,分别是CM7和CM4,这里先选择其中任意一个即可。后面会在这个工程下再创建另一个。这里以先生成CM7核为例。
不需要MDK生成任何源文件,所以这里直接按Cancel键退出
在MDK中按下面的管理工程项图标,开始创建工程目录
创建工程目录
首先通过鼠标双击Target1更改其名称为STM32H7_CM7,这是为CM7核创建的目录。然后再为CM4核创建一个目录STM32H7_CM4。这两个目录的名称可以自定义成其它名称。
其次再通过鼠标双击Source Group 1更改其名称为App_CM7。这是为CM7应用层源代码建立的目录。然后再分别为CM4应用层,CMSIS公共层和STM32的驱动库层创建源代码目录。
最后创建好的结果如下图,然后按OK退出。
通过前一步在新的MDK工程文件夹下已生成了如下的工程文件和子目录:
在MDK工程文件夹下创建三个存放源代码文件的子目录
在Objects子目录下为CM7和CM4核分别各创建一个目标文件子目录,用于存放编译生成的文件。
将第一步用STM32CubeMX生成的源文件拷贝到MDK工程文件夹下
首先将CM4和CM7核的.c和.h源文件分别拷贝到AppCM4和AppCM7子目录下
拷好的AppCM4子目录下应有如下源代码文件
拷贝好的AppCM7子目录下应有如下源代码文件。注意尽管文件名称与AppCM4子目录内的文件相同,但拷贝的来源及源代码文件的内容是完全不同的。
将公共头文件和启动代码等拷贝到CMSIS子目录下
由于STM32CubeMX将这些文件生成在不同的子目录下,所以需要从多个地方拷贝。
首先拷贝共通的头文件:
然后拷贝STM32H745的相关头文件(或选择与你使用的MCU相关的头文件)
再拷贝底层汇编语言的启动文件
还有拷贝上层C语言的启动文件
以上所有文件拷贝完后,CMSIS子目录下应有如下这些文件
将STM32H7的驱动函数库整个目录拷贝到MDK工程文件夹下
将编译链接配置文件拷贝到MDK工程文件夹下
至此所有源代码相关文件都拷贝完了,MDK工程文件夹下应有如下文件和子目录
前一步拷贝到MDK工程文件夹下的源代码文件还没有加入到MDK工程中。下面回到MDK中加入相关的源代码。在MDK中按下面的管理工程项图标:
选择App_CM7,然后按Add Files...添加CM7核的应用层源文件
选择AppCM7子目录下的所有.c文件,然后添加进来。
添加完后的结果如下
再选择App_CM4,与前面的步骤相同,按Add Files...添加CM4核的应用层源文件,将AppCM4子目录下的所有.c文件添加进来。
添加启动文件
启动文件有两类:.c文件和.s汇编文件。注意添加汇编文件时要先选择.s后缀,然后才能选择并添加。
添加STM32库文件
由于我们只生成了一个非常简单的工程,除GPIO外没有配置其它外设,所以这里只添加必用的库文件。其它库文件与配置的外设有关,需要根据你的配置添加。
由于文件很多,上图只显示出了部分要添加的库文件。下图显示了所有需要添加的库文件。添加完后,按OK键返回。
编译选项需要对CM7和CM4分别设置。这里先选CM7,然后按下面的目标选项图标:
设置CM7核的内存区间
设置CM7核的生成目标代码的文件名,并选择生成HEX文件,然后选择生成目标文件的子目录
MDK缺省时,对CM7和CM4核使用了相同的目标文件名和目标文件子目录,所以编译后会相互覆盖彼此的文件。这里将其分开,分别取不同的目标文件名和子目录。
目标文件子目录选择Objects子目录下的STM32H7_CM7文件夹。鼠标双击STM32H7_CM7文件夹进入后,按OK键返回。
如下图箭头所指,确认目标文件路径选择正确后,进入下一项设置。
添加CM7核的编译宏定义,然后选择添加include文件路径名
反复按右上角的方框添加include文件路径如下:
添加完后的结果如下。然后进入下一项设置。
设置CM7核的编译链接文件
首先要取消缺省设置,然后按...选择自定义的链接文件。
自定义的链接文件选择MDK工程文件夹下的stm32h745xx_flash_CM7.sct文件。
按Open后,下图箭头所指位置应正确显示该链接文件名。到此为止,CM7核的编译选项就设置完了,按OK键返回,准备开始CM4核的设置。
先在目标目录框中选择CM4核
然后按目标选项图标开始为CM4进行设置
选择设备
因为最开始生成MDK工程时选择的是CM7核,所以这里要将设备切换为CM4核,然后按Target开始CM4核的编译选项设置。
CM4核的编译选项设置过程与CM7相同,先设置内存空间,然后进入下一项。
设置CM4核的生成目标代码的文件名,并选择生成HEX文件,然后选择生成目标文件的子目录
目标文件子目录选择Objects子目录下的STM32H7_CM4文件夹。鼠标双击STM32H7_CM4文件夹进入后,按OK键返回。
如下图箭头所指,确认目标文件路径选择正确后,进入下一项设置。
添加CM4核的编译宏定义,然后选择添加include文件路径名
按右上角的方框添加include文件路径如下。注意这里选择的是AppCM4子目录而不是AppCM7子目录
确认添加完后的结果后。进入下一项设置。
设置CM4核的编译链接文件
自定义的链接文件选择MDK工程文件夹下的stm32h745xx_flash_CM4.sct文件。
按Open后,确认下图箭头所指位置显示的链接文件名,然后按OK结束设置。至此CM4和CM7核的编译选项全部设置完了。
也许你已经注意到了,App_CM7和App_CM4下的源文件都存在与两个核的目录内,这样编译任意一个核时,两类源文件都会编译进来,这显然是我们不希望的。所以要在编译CM7核时屏蔽掉CM4的源文件,同理在编译CM4核时屏蔽掉CM7的源文件。
首先在CM4核的目录中屏蔽CM7的源文件
鼠标点击要屏蔽的App_CM7目录,然后按鼠标右键弹出子对话框,再按其第一个选项。
取消右上角选项,然后按OK键。
此时你应注意到App_CM7目录及其以下的文件都添加了一个禁止图标。然后还要屏蔽CM7核的启动文件,鼠标点击startup_stm32h745xx_CM7.s文件,然后按鼠标右键弹出子对话框,再按其第一个选项。
然后再选择CM7核,屏蔽CM4核的相关源文件
鼠标点击要屏蔽的App_CM4目录,然后按鼠标右键弹出子对话框,再按其第一个选项。
取消右上角选项,然后按OK键。
鼠标点击startup_stm32h745xx_CM4.s文件,然后按鼠标右键弹出子对话框,再按其第一个选项。
取消右上角选项,然后按OK键。
按编译图标开始编译CM7核的目标文件
编译成功后,再选择CM4核开始编译。
最后CM4核也编译成功,整个MDK工程生成完成。
到此结束。