最后就是 CMSIS
文件夹下的
Include
文件夹,里面都是内核的头文件,我们可以选择所有
文件都留下,或者也可以只需要如图
的内容。
CMSIS/Include
文件夹留下的文件
3
)
STM32MP1xx_HAL_Driver
文件夹
STM32MP1xx_HAL_Driver 文件夹存放的是
HAL
库驱动代码源文件,我们只需要如图的内容。
STM32H7xx_HAL_Driver
文件夹留下的文件
到这里,我们就完成了把官方固件包中必要的驱动文件添加到我们工程文件中了。
另外,我们还需要把正点原子提供的系统级核心驱动代码文件夹 SYSTEM
添加到我们自己
新建的
Drivers
文件夹里,
SYSTEM
可以在路径:
开发板光盘
A-
基础资料
\1
、程序源码
\3
、
M4
裸机驱动例程
\
实验
3
新建工程实验
-HAL
库版本
\Drivers
中拷贝得到,最终我们新建的
Drivers
文件夹目录下的文件构成如图
所示。
工程根目录下的
Drivers
文件夹
二、 Middlewares 文件夹
Middlewares 文件夹可以用于存放中间层组件文件和第三方中间层文件,比如:
USMART
、 MALLOC、TEXT
、
FATFS
、
USB
、
LWIP
、各种
OS
、各种
GUI
等等。我们新建工程实验暂时用不到,留空就行,后面的实验用到时将会陆续添加各种文件。
三、 Output 文件夹
Output 文件夹用于存放编译器编译工程输出的中间文件,比如:
.hex
、
.bin
、
.o
文件等等。
这里不需要操作,后面只需要在
MDK
里面设置该文件夹为编译输出文件的存放路径就行。
四、Projects 文件夹
Projects 文件夹用于存放
MDK
工程,因为我们的工程是基于
ARM
,所以我们在
Projects
文件夹里面新建一个命名为
MDK-ARM
的文件夹。
Projects 文件夹
五、 User 文件夹
User 文件夹用于存放
HAL
库用户配置文件、
main.c
、中断处理文件,以及分散加载文件。
我们首先从官方固件包里面直接拷贝官方的模板工程下的 HAL
库用户配置文件和中断处理文件到我们的 User
文件夹里。官方的模板工程路径:
STM32Cube_FW_MP1_V1.2.0\Projects\
STM32MP157C-DK2\Templates
,打开
Inc
文件夹,如图
所示。
官方模板工程根目录
我们将以上 Inc 文件夹下的 lock_resource.h、stm32mp1xx_hal_conf.h、stm32mp1xx_it.h 文件拷贝到 User 文件夹下,然后再在 User 文件夹下新建 SCRIPT 文件夹,该文件夹用于存放分 散加载文件,从 STM32Cube_FW_MP1_V1.2.0\Projects\STM32MP157C-DK2\Templates\MD K-ARM 下拷贝 stm32mp15xx_m4.sct 到新建的 SCRIPT 文件夹下:
拷贝官方模板工程文件
六、新建工程
下面我们新建一个工程,并将工程保存在前面新建的 MDK-ARM
文件夹下。
1.
建立初步工程
打开 Keil uVision5
,点击菜单
Project -->New Uvision Project
,如图
所示。
新建工程
然后弹出工程命名和保存的操作窗口,工程文件保存路径为:
实验
3
新建工程实验
-HAL 库版本\Projects\MDK-ARM
,工程名字我们取:
atk_mp1_m4
,最后点击保存即可。具体操作窗 口如图所示。
工程命名和保存
接下来会弹出一个选择 Device
的界面,就是选择我们的芯片设备型号,大家根据自己使用的芯片型号依次选择即可。STM32MP157
开发板的芯片型号是:
STM32MP157DAAx
,所以我们选择:STMicroelectronics->
STM32MP1 Series->
STM32MP157->
STM32MP157DAAx
(如果使
用的是其他芯片,选择相应的型号就可以了),如图
所示。
选择芯片型号
特别注意:一定要安装对应的器件支持包(即 pack 包)才会显示这些内容哦,如果没得选择,请关闭 MDK,然后安装光盘: 开发板光盘A- 基础资料 \3 、软件 \MDK5\ Keil.STM32MP1xx_DFP.1.3.0.pack 这个安装包后重试。
点击 OK 后,弹出 Manage Run-Time Environment 对话框,如图所示:
Manage Run-Time Environment 界面
在这个界面,我们可以添加自己需要的组件,从而方便构建开发环境,不过这里我们不需
要。我们直接点击
Cancel
即可。这样就得到了我们的初步工程,如图
所示。
初步工程
这只是一个工程的框架,我们还需要把自己需要用到的文件添加到工程里面。虽然前面,我们在工程文件夹里放了很多文件,但是它们并没有关联到工程里面
我们看看初步工程建立好后,MDK-ARM 文件夹的内容,如图所示。
工程文件夹 MDK-ARM 目录
这里我们说明一下,atk_mp1_m4.uvprojx
是工程文件,非常关键,不能轻易删除,
MDK5
生成的工程文件是以
.uvprojx
为后缀。
DebugConfig
,
Listings
和
Objects
三个文件夹是
MDK
自
动生成的文件夹。其中
DebugConfig
文件夹用于存储一些调试配置文件,
Listings
和
Objects
文
件夹用来存储
MDK
编译过程的一些中间文件。这里,我们把
Listings
和
Objects
文件夹删除,
我们后面会把编译中间文件存放到
Output
文件夹。当然,我们不删除这两个文件夹也没有关系,
只是我们不用它而已。
2
构建工程框架
2.1
工程分组
下面我们开始构建工程框架。右键点击 Target1
,选择
Manage Project Items
,如下图所示:
点击 Management Project Itmes
弹出工程目录管理界面,其中 Project Targets
一栏,我们将
Target
名字修改为
HAL_LED
,
然后在
Groups
一栏删掉
Source Group1
:
修改工程目录
然后再 分 别 建 立 五 项 目 录 分 组 : Startup
、
User
、
Drivers/SYSTEM
、 Drivers/STM32MP1xx_HAL_Driver、
Drivers/BSP
和
Readme
,如图
所示。
新建 GROUP
点击 OK 就新建好分组,在工程中也会对应显示这分组,如图所示。
工程分组情况
接下来我们要往各个分组添加我们需要的文件,方法如图所示。值得注意的是,图中步骤 5 还可以通过双击完成,这样对于一个分组要添加多个文件的时候很有用。步骤 4 默认是选择.c 文件类型,当我们打开对应路径找不到我们需要添加的文件时,就可以通过步骤 4 的下拉选项选择―All files‖,从而可以查看所有文件类型。图中选择实验 3 新建工程实验-HAL 库版本\Drivers\CMSIS\Device\ST\STM32MP1xx\Source\Templates\arm 下的 startup_stm32mp15xx.s 文件:
分组添加文件方法
按照这个方法往每个分组添加需要的文件,这个过程可能还需要用到这几个按钮,如图所示。
添加分组文件一些操作按钮
当我们选择好所以需要添加的文件后,点击 OK
,自动回到工程主界面,最终工程目录如图所示。
工程分组情况
可以看到分组中 stm32mp1xx_hal.c
文件有个小钥匙的符号,这可能是因为官方的固件包的
文件设置了只读权限,我们取消只读权限就好了,方法如图
所示。
取消工程文件夹的只读权限
接下来我们在 Drivers/User 下新建并保存 main.c 文件,如图所示。
工程文件新建保存方法
同样这样新建的文件也是没有关联到我们的工程中的,需要我们自己在 User
分组里添加,
方法请参考图
,最后如下图:
工程分组情况
2.2
设置
MDK
搜索路径
接下来我们要在 MDK
里面设置头文件搜索路径。也就是告诉
MDK
在那些目录下面去寻
找已经被包含的头文件。如果没有设置,那么工程会出现报错头文件路径找不到。具体操作如
图
所示。
添加
MDK
搜索路径
选好以后点击 OK
,头文件路径就添加完毕了。到这里我们就完成了构建整个工程的框架,
就是包括:工程分组和
MDK
搜索路径。
3.
魔术棒设置
3.1.
添加全局宏定义标识符
对于 STM32MP157
系列的工程,需要添加全局宏定义标识符,所谓全局宏定义标识符,就
是在工程中任何地方都可见。添加方法是点击魔术棒之后,进入
C/C++
选项卡,然后在
Define
输入框连输入
CORE_CM4,USE_HAL_DRIVER,STM32MP157Dxx
,注意这里标识符之间
用英文
逗号隔开
,关于这三个宏定义,操作步骤过程如下图所示:
添加全局宏定义标识符
3.2
设置编译中间文件存放路径
前面我们讲过,MDK 默认编译后的中间文件存放目录为 MDK-ARM 目录下面的 Listings 和 Objects 子目录,这里为了和我们正点原子工程结构保持一致,我们重新选择存放到 Output 文件夹里。其中包括两项选项卡输出设置,操作过程如图所示。
设置 Output 选项卡
设置 Listing 选项卡
然后,原来创建工程的时候生成的 Listings 和 Objects 文件夹可以删除掉:
可以删除 Listings 和 Objects 文件夹
4.
设置编译生成
.hex
文件
STM32MP157 的
M4
没有可用的
Flash
,我们实际上仿真的时候需要用到的编译后生成
的
.axf
文件进行仿真。下面我们配置编译后生成的文件,编译器默认编译后不生成
.hex
文件的,
需要我们自己设置,方可生成,我们将以下
3
个选项都勾选,如下图所示。
生成
.hex
文件设置方法
另外默认勾选
Browse Information
选项
,其作用是,浏览程序的时候具有跳转功能,方便
一层层的寻找各种函数,变量定义。但是有个不好的点是,勾选该选项后,编译器编译工程的
时间会更长。
5.
设置分散加载文件
分散加载文件也叫做链接脚本,用来描述程序在编译的时候应该怎么链接,关于分散加载
文件我们前面已经分析过。
设置分散加载文件
①、点击 Linker 标签,进行链接相关配置。
②、取消勾选―Use Memory Layout from Target Dialog‖,不使用 MDK 默认的配置,使用我 们自己创建的分散加载文件。
③、点击此按钮找到要使用的分散加载文件。
④、选择前面我们创建工程的时候添加的分散加载文件。
⑤、如果需要编辑分散加载文件内容的话就直接点击―Edit‖
即可在
MDK
下编辑。
⑥、点击 OK
完成设置。
6.
设置编译器版本
新版本的 MDK
提供两个版本编译器,分别是
ARM Compiler 5
和
ARM Compiler 6
(
ARM
Compiler 5
简称为
AC5
,将
ARM Compiler 6
简称
AC6
),默认使用的是
V6
版本的编译器,
V6 版本的编译器相较于 V5
版本的编译器来说编译器检查规则更严格,出现的告警会更多,且两
者的语法规则有些不同,例如:
AC5 和 AC6 语法不同
关于两个版本的编译器不同,可以参考 ARM
官网:
http://www.keil.com/appnotes/docs/apnt_298.asp
为了能兼容我们以前工程的代码,例如 SYSTEM
下的代码,我们设置编译器为
V5
版本,
否则编译时会报错:
选择编译器 5
七 编译工程
在编译前,我们先添加 main
函数,如果不添加
main
函数,编译的时候会提示找不到
main
函数。添加好以后保存工程,可以编译看看是否报错,如下图,编译无报错:
最后编译生成了 atk_mp1_m4.axf 文件。至此,基本的 HAL 库工程就添加完成了,我们可以在工程中添加我们的代码进行开发。
编译生成文件
本工程中只添加了部分 HAL 库文件,以后实验中我们需要什么文件再往里边添加即可, 例如,如果我们要测试窗口看门狗实验,我们需要往 Drivers/STM32MP1xx_HAL_driver 里边添 加 stm32mp1xx_hal_wwdg.c 文件。本工程只是一个简单的模板,我们也可以根据自己的实际情况更改工程中的目录和文件存放的位置。