为了账号安全,请及时绑定邮箱和手机立即绑定

手把手带你创建HAL版本MDK工程模板

# 手把手带你创建HAL版本MDK工程模板


如何快速开发 STM32 项目?我们总不能每次开发一个项目就搭建一次工程,这样效率太低了。


通常我们会使用一个模板工程,需要开发新项目的时候拿出来添加一些对应的模块及业务代码,一个项目就开发完成了。


但对于新手朋友来讲,如何创建一个工程模板对他们来讲是个非常大的挑战。因为这个过程非常繁琐,虽然不复杂,但只要其中有一个环节做错了,那么就前功尽弃了,而且还不好排查。


本文将手把手带你创建 HAL 版本 MDK 工程模板,基于 STM32F103C8T6 芯片。文章参照正点原子的教程,并结合自己的工作经验写作而成,如果你能按照这个教程跟着操作,相信一定能够自己搭建一个HAL版本MDK工程模板。


## 1. 源码下载及前置阅读


本文首发 **良许嵌入式网** :https://www.lxlinux.net/e/ ,欢迎关注!


如果大家跟着本教程学习还是无法自己创建 HAL 版本的 MDK 工程模板,那么可以参考我给大家准备的源文件(由于平台限制,请点击以下链接阅读原文下载):


https://www.lxlinux.net/e/stm32/create-stm32-hal-project-template.html


如果不知道如何搭建 STM32 编程环境,不知道如何烧录 STM32 代码,可以阅读这篇文章:


https://www.lxlinux.net/e/stm32/stm32-quick-start-for-beginner.html


新手小白如果连 MDK 的使用都不熟悉,那么可以通过下文先熟悉一下 MDK 的使用:


https://www.lxlinux.net/e/stm32/mdk-development-tool-tutorial.html


如果你连代码都不知道怎么烧录到 STM32 的,可以参考下文,提供了 5 种代码烧录方式:


https://www.lxlinux.net/e/stm32/five-ways-to-flash-program-to-stm32.html


## 2. 文件下载


### 2.1 STM32Cube官方固件包


STM32Cube 官方固件包在 ST 公司的官网可以免费下载,网址为:


https://www.st.com/content/st_com/en.html


可以根据以下步骤找到官方固件包:


![](https://pic.imgdb.cn/item/65338050c458853aef8a1571.jpg)


![](https://pic.imgdb.cn/item/653380bcc458853aef8b7aed.jpg)


![](https://pic.imgdb.cn/item/65338210c458853aef900ec9.jpg)


![](https://pic.imgdb.cn/item/65338235c458853aef908e0f.jpg)


但由于官网在国外,下载速度很慢,而且需要填写各种信息,所以大家可以直接使用我给大家提供的固件包,反正也是从官网下载的。当前最新版本是 V1.8.5 。某度云链接:


链接:https://pan.baidu.com/s/10RXLzGog6CXSgZf6p8MGTQ?pwd=12kn 提取码:12kn


### 2.2 工程模板


如果有小伙伴根据本文档还是无法成功创建工程模板,那么可以参考我创建好的模板:


链接:https://pan.baidu.com/s/1lO7uJFJ28JeSk_TBi03Axw?pwd=0x8k 提取码:0x8k 


## 3. 新建工程文件夹


真正开发 STM32 项目,就不是简单一两个 .c 和 .h 文件那么简单了,而是有几十个甚至更多的文件构成,通过某些组织形式形成的工程文件。


我们先在任意一个位置(比如桌面)创建一个文件夹,命名为 stm32f103c8t6_template ,当然你命为其它名字也可以。


创建的工程模板由下面 5 个目录构成:


![](https://pic.imgdb.cn/item/65291748c458853aef885050.jpg)


这 5 个目录是做什么用的呢?具体作用如下表所示:


| 文件夹名称  | 作用                                                         |

| ----------- | ------------------------------------------------------------ |

| Drivers     | 存放与硬件相关的驱动层文件                                   |

| Middlewares | 存放中间层文件                                               |

| Output      | 存放工程编译输出文件                                         |

| Projects    | 存放 MDK 工程文件                                            |

| User        | 存放 HAL 库用户配置文件、main.c、中断处理文件,以及分散加载文件 |


接下来我们就具体来讲讲这 5 个目录文件到底要放一些什么文件。


### 3.1 Drivers文件夹


Drivers 文件夹里面又包含了 4 个文件夹,它们的作用如下:


| 文件夹名称           | 作用                                                    |

| -------------------- | ------------------------------------------------------- |

| BSP                  | 存放开发板板级支持包驱动代码,如各种外设驱动            |

| CMSIS                | 存放 CMSIS 底层代码,如启动文件(.s 文件)等            |

| SYSTEM               | 存放系统级核心驱动代码,如 sys.c、delay.c 和 usart.c 等 |

| STM32F1xx_HAL_Driver | 存放 ST 提供的 F1 系列 HAL 库驱动源码                   |


#### 3.1.1 BSP文件夹


我们平时所写的 LED 驱动、蜂鸣器驱动、ESP8266驱动等等,都是放在这个目录下面。


但由于咱这是工程模板,就先不考虑这些驱动了,所以这个目录就暂时为空就好,等后面用到什么外设再具体添加对应的文件即可。


#### 3.1.2 CMSIS文件夹


将官方提供的固件包下载,然后按下图提示进到 CMSIS 目录。


![](https://pic.imgdb.cn/item/652bd468c458853aeffb2853.jpg)


但这个 CMSIS 目录太过于庞大了,我们可以按以下步骤进行精简。


![](https://pic.imgdb.cn/item/652bd4b9c458853aeffc1b60.jpg)


![](https://pic.imgdb.cn/item/652bd524c458853aeffd67bb.jpg)


此外,在 CMSIS 文件夹下还需要拷备一个 Include 目录,但这个目录我也不知道哪里去搞,大家可以从我给大家提供的模板工程里直接复制即可。


![](https://pic.imgdb.cn/item/6533911ec458853aefc2ded0.jpg)


或者你也可以使用 STM32CubeMX 随便生成一个工程文件,然后找到下面这些文件,直接拷过来即可。


![](https://pic.imgdb.cn/item/653391eac458853aefc55809.jpg)


#### 3.1.3 SYSTEM文件夹


这个文件夹主要存放的是一些常用的系统级核心驱动代码,比如说时钟配置、延时函数、串口等等,像这些配置都是非常经常用到,我们没必要每次都自己手写,直接复用即可。


在这里我们直接使用正点原子给我们提供的三个模块代码,没法必要自己造轮子。


找到任何一个正点原子的项目(HAL版本),然后把整个 SYSTEM 文件夹拷备到 Drivers 目录下。


![](https://pic.imgdb.cn/item/652bb0fcc458853aefa1f82a.jpg)


#### 3.1.4 STM32F1xx_HAL_Driver文件夹


ST 公司提供的 HAL 库驱动源码都是放在这个文件夹里,这个直接从固件包里拷过来就可以了,路径如下:


![](https://pic.imgdb.cn/item/652bb35dc458853aefa7c76f.jpg)


这里使用的是 V1.8.5 ,当前最新版。


但进到这个目录后会发现,里面有很多东西,我们删掉其余的内容,只保留 Inc 及 Src 这两个文件夹即可。


![](https://pic.imgdb.cn/item/652bb41ec458853aefa9803a.jpg)


至此,drivers 文件夹全部处理完毕,如下图示:


![](https://pic.imgdb.cn/item/652bb4fec458853aefab960d.jpg)


### 3.2 Middlewares文件夹


这个文件夹主要存放的是中间层代码(组件/Lib 等),比如:FATFS、USB、LWIP、FreeRTOS,各种 GUI 等等。但作为模板工程,这些东西我们就先不添加,整个文件夹留空即可。


### 3.3 Output文件夹


该文件夹用于存放编译器编译工程输出的中间文件,比如:.hex、.bin、.o 文件等,所以我们暂时无需主动往里面放东西。


### 3.4 Projects文件夹


该文件夹用于存放编译器的工程文件。不同的开发工具所产生的工程文件是不一样的,常见的开发工具有:MDK、IAR ,等等。但我们最常用的还是 MDK ,所以我们就可以在这个文件夹下创建一个 MDK-ARM 文件夹。


![](https://pic.imgdb.cn/item/6533864fc458853aef9ed11f.jpg)


如果你使用其它开发工具,那么就创建一个对应的文件夹就可以了。


### 3.5 User文件夹


该文件夹用于存放用户编写的代码,如:HAL 库用户配置文件、main.c 文件、中断处理文件,以及分散加载文件等。


在这个文件夹里,我们需要将下面那三个文件拷贝到这里来:


![](https://pic.imgdb.cn/item/652bc709c458853aefd6c54b.jpg)


![](https://pic.imgdb.cn/item/652bc767c458853aefd7b3f5.jpg)


### 3.6 项目工程文件夹树状图


![](https://pic.imgdb.cn/item/653389a6c458853aefaa0c5a.jpg)


## 4. 新建工程框架


![](https://pic.imgdb.cn/item/652bca27c458853aefdeeabc.jpg)


![](https://pic.imgdb.cn/item/652bccbfc458853aefe5cd39.jpg)


如果没有看到下图中上面那个红框的内容,请阅读这篇文章【[零基础快速上手STM32开发(手把手保姆级教程)](https://www.lxlinux.net/e/stm32/stm32-quick-start-for-beginner.html)】,将 STM32F1 系列的固件包安装好。


![](https://pic.imgdb.cn/item/652bcde0c458853aefe8cedc.jpg)


![](https://pic.imgdb.cn/item/652bd1c5c458853aeff38533.jpg)


![](https://pic.imgdb.cn/item/652bd245c458853aeff4eef1.jpg)


## 5. 添加文件


### 5.1 创建目标及分组


![](https://pic.imgdb.cn/item/652bd38ac458853aeff88681.jpg)


### 5.2 向各分组添加文件


#### 5.2.1 添加Startup分组文件


![](https://pic.imgdb.cn/item/653224d4c458853aef2f4c34.jpg)


#### 5.2.2 添加User分组文件


![](https://pic.imgdb.cn/item/65322617c458853aef336097.jpg)


![](https://pic.imgdb.cn/item/65323379c458853aef5a3bcd.jpg)


#### 5.2.3 添加SYSTEM分组文件


![](https://pic.imgdb.cn/item/653234d9c458853aef5e9437.jpg)


#### 5.2.4 添加驱动文件


![](https://pic.imgdb.cn/item/653235cac458853aef613ba8.jpg)


到这一步就已经将所有的文件添加完毕了。但此时你们会发现驱动文件前面会有个小钥匙,如下图示:


![](https://pic.imgdb.cn/item/6532371cc458853aef65a1d6.jpg)


这是因为官方的固件包的文件设置了只读权限,我们只需要按下图的方式取消只读选项即可。


![](https://pic.imgdb.cn/item/653236a5c458853aef64286d.jpg)


## 6. 魔术棒设置


### 6.1 Target选项卡


![](https://pic.imgdb.cn/item/65323899c458853aef6a6504.jpg)


### 6.2 Output与Listing选项卡


![](https://pic.imgdb.cn/item/65323976c458853aef6cde8b.jpg)


![](https://pic.imgdb.cn/item/653239d3c458853aef6de047.jpg)


### 6.3 C/C++选项卡


![](https://pic.imgdb.cn/item/65323abdc458853aef707063.jpg)


![](https://pic.imgdb.cn/item/65323be5c458853aef7398c1.jpg)


![](https://pic.imgdb.cn/item/65323c51c458853aef74c272.jpg)


### 6.4 Debug选项卡


![](https://pic.imgdb.cn/item/65335e93c458853aef139457.jpg)


### 6.5 Utilities选项卡


![](https://pic.imgdb.cn/item/65335f6bc458853aef164a2e.jpg)


## 7. 代码修改


![](https://pic.imgdb.cn/item/65336264c458853aef1fef38.jpg)


![](https://pic.imgdb.cn/item/6533648ec458853aef26f9ae.jpg)


![](https://pic.imgdb.cn/item/65336516c458853aef28b544.jpg)


## 8. 烧录验证


经过以上操作,模板工程创建完成。此时可以按下图接线烧录验证,工程没问题的话,左侧 LED 灯将以 500ms 间隔闪烁。


如果不知道如何搭建 STM32 编程环境,不知道如何烧录 STM32 代码,可以阅读这篇文章:


【[零基础快速上手STM32开发(手把手保姆级教程)](https://www.lxlinux.net/e/stm32/stm32-quick-start-for-beginner.html)】


![](https://pic.imgdb.cn/item/65227653c458853aefde83ad.jpg)


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
Linux系统工程师
手记
粉丝
81
获赞与收藏
268

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消