前言

使用的开发板为STM32F429,大部分内容参考正点原子的 <STM32F429开发指南——HAL库版本>。写这个的原因是主要是记录一些遇到的错误解决办法。

新建工程模板

1. 建立一个文件夹,还新建下面 4 个子文件夹:CORE ,HALLIB,OBJ 和 USER。这些名字是可以随便取的。

2. 打开 MDK,点击菜单 Project –>New Uvision Project ,然后将目录定位到刚才建立的文件夹 Template 之下的 USER 子目录。

接下来会出现一个选择 Device 的界面,就是选择我们的芯片型号,这里我们定位到STMicroelectronics 下面的 STM32F429IGT6。选择 STMicroelectronics - STM32F4 Series-STM32F429 - STM32F429IG - STM32F429IGTx 。

注意:一定要安装对应的器件 pack 才会显示这些内容 ,必须先安装 MDK 才能安装 pack 包)。

点击 OK,MDK 会弹出 Manage Run-Time Environment 对话框,直接点击 Cancel,即可。得到如图所示界面:

这样,在USER 目录下面会自动生成一些文件:

其中 DebugConfig 文件夹用于存储一些调试配置文件, Listings 和 Objects 文件夹用来存储 MDK 编译过程的一些中间文件。我们可以把 Listings 和 Objects 文件夹删除,用OBJ 文件夹来存放编译中间文件。当然,不删除这两个文件夹也没有关系,只是我们不用它而已。

Template.uvprojx 是工程文件,可以直接双击它运行工程。

3. 接下来我们将从STM32CubeL4 包里面复制一些我们新建工程需要的关键文件到我们的工程目录中。 打开官方 STM32CubeF4 包,定位到我们之前准备好的 HAL 库包的目录:\STM32Cube_FW_F4_V1.10.0\Drivers\STM32F4xx_HAL_Driver 下面,将目录下面的 Src,Inc 文件夹复制到我们刚才建立的 HALLIB 文件夹下面。

4. 我们要将 STM32CubeF4 包里面相关的启动文件以及一些关键头文件复制到我们的工程目录 CORE 之下。打开 STM32CubeF4 包,定位到目录\STM32Cube_FW_F4_V1.11.0\Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm 下面,将文件 startup_stm32f429xx.s 复制到 CORE 目录下面 。然后定位到目录\STM32Cube_FW_F4_V1.11.0\Drivers\CMSIS\Include,将里面的五个头文件:cmsis_armcc.h,core_cm4.h,core_cmFunc.h,core_cmInstr.h ,core_cmSimd.h 同样复制到 CORE 目录下面。

5. 定位到目录:\STM32Cube_FW_F4_V1.11.0\Drivers\CMSIS\Device\ST\STM32F4xx\Include 将里面的 3 个文件stm32f4xx.h,system_stm32f4xx.h 和 stm32f429xx.h 复制到 USER 目录之下。

然后进入目录\STM32Cube_FW_F4_V1.11.0\Projects\STM32F429I-Discovery\Templates 目录下,这个目录下面有好几个文件夹。

首先我们打开Inc目录,将目录下面的3个头文件stm32f4xx_it.h,stm32f4xx_hal_conf.h 和main.h全部复制到USER目录下面。然后我们打开 Src 目录,将下面的四个源文件 system_stm32f4xx.c,stm32f4xx_it.c, stm32f4xx_hal_msp.c 和 main.c 同样全部复制到 USER 目录下面。

6.SYSTEM 文件夹内容是 ALIENTEK 为开发板用户编写的一套非常实用的函数库,比如系统时钟初始化,串口打印,延时函数等,这些函数被很多工程师运用到自己的工程项目中。大家也可以根据自己需求决定是否需要 SYSTEM 文件夹,对于 STM32F429 的工程模板,如果没有加入 SYSTEM 文件夹,那么大家需要自己定义系统时钟初始化。

7. 下面我们将前面复制过来的文件加入我们的工程中。右键点击 Target1,选择 Manage Project Items,Project Targets 一栏,我们将 Target 名字修改为 Template,然后在 Groups 一栏删掉一个 Source Group1,建立四个 Groups:USER,SYSTEM,CORE,和 HALLIB。

然后点击 OK,可以看到我们的 Target 名字以及 Groups 情况如下图所示:

8. 我们按照步骤 7 的方法, 右键点击点击 Tempate,选择 Manage Project Items.然后选择需要添加文件的 Group。这里第一步我们选择HALLIB,然后点击右边的 Add Files,定位到我们刚才建立的目录\HALLIB\Src 下面,将里面所有的文件选中(Ctrl+A),然后点击 Add,然后 Close.可以看到 Files 列表下面包含我们添加的文件。这里需要说明一下,对于我们写代码,如果我们只用到了其中的某个外设,我们就可以不用添加 没有用到的外设的库文件。例如我只用 GPIO,我可以只用添加 stm32l4xx_hal_gpio.c 而其他外设相关的可以不用添加。这里我们全部添加进来是为了后面方便,不用每次添加,当然这样的坏处是工程太大,编译起来速度慢,用户可以自行选择。

例如 stm32f4xx_hal_dsi.c , stm32f4xx_hal_iptim.c 和stm32f4xx_hal_msp_template.c 三个文件不需要引入工程。stm32f4xx_hal_dsc.c 是 mipi 接口相关函数,STM32F429 没有这个接口,所以这个文件可以不用引入。stm32f4xx_hal_iptim.c 文件是低功耗定时器相关函数, STM32F429 也没有这 个功能,也不需要引入。stm32f4xx_hal_msp_template.c 文件内容是一些空函数,一般也不需要引入。

9.将 Groups 定位到 CORE,USER 和 SYSTEM 分组之下,添加需要的文件。CORE 分组下面需要添加的文件为一些头文件以及启动文件 startup_stm32f429xx.s(注意,默认添加的时候文件类型为.c,添加.h 头文件和 startup_stm32f429xx.s 启动文件的时候,你需要选择文件类型为 All files 才能看得到这些文件)。USER 分组下面需要添加的文件 USER 目录下面所有的.c 文件:main.c,stm32f4xx_hal_msp.c,stm32f4xx_it.c 和 system_stm32f4xx.c 四个文件。 SYSTEM 分组下面需要添加 SYSTEM 文件夹下所有子文件夹内的.c 文件,包括 sys.c,usart.c 和 delay.c 三个源文件。添加完必要的文件到工程之后,最后点击 OK,回到工程主界面。

10.如果没有设置头文件路径,那么工程会出现报错头文件路径找不到。这里我们需要添加的头文件路径包括:\CORE, \USER\,\SYSTEM\delay ,\SYSTEM\usart,SYSTEM\sys 以及\HALLIB\Inc。这里还需要提醒大家,HAL库存放头文件子目录是\HALLIB\Inc,不是 HALLIB\Src

11.添加全局宏定义标识符,所谓全局宏定义标识符,就是在工程中任何地方都可见。添加方法是点击魔术棒之后,进入 C/C++选项卡,然后在 Define 输入框连输入:USE_HAL_DRIVER,STM32F429xx

注意这里是两个标识符USE_HAL_DRIVER 和 STM32F429xx,他们之间是用逗号隔开的

12. MDK 默认编译后的中间文件存放目录为 USER 目录下面的 Listings 和 Objects子目录,这里为了和我们 ALIENTEK 工程结构保持一致,我们重新选择存放到目录 OBJ 目录之下。点击魔术棒 ,然后选择“Output”选项下面的“Select folder for objects…”,然后选择目录为我们上面新建的 OBJ 目录,然后依次点击 OK 即可。

回到 Output 选项卡。这里我们还要勾上“Create HEX File”选项和 Browse Information 选项。Create HEX File 选项选上是要求编译之后生成 HEX 文件。而 Browse Information 选项选上是方便我们查看工程中的一些函数变量定义等。

13. 接下来在编译之前,我们先把 main.c 文件里面的内容替换为如下内容:

#include "main.h"void Delay(__IO uint32_t nCount);
void Delay(__IO uint32_t nCount)
{
while(nCount--){}
}int main(void)
{GPIO_InitTypeDef GPIO_Initure;HAL_Init(); //初始化 HAL 库Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz__HAL_RCC_GPIOB_CLK_ENABLE(); //开启 GPIOB 时钟GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1; //PB1,0GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出GPIO_Initure.Pull=GPIO_PULLUP; //上拉GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速HAL_GPIO_Init(GPIOB,&GPIO_Initure);while(1){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); //PB1 置 1HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET); //PB0 置 1Delay(0x7FFFFF);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET); //PB1 置 0HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET); //PB0 置 0Delay(0x7FFFFF);}
}

错误解决

到这里,官方的教程就算是结束了。正常是可以直接编译通过,但实际上并非如此。点击编译后有错误。

解决办法如下:

这里还要注意的是,要删掉一个文件。

stm32f4xx_hal_timebase_tim_template.c:工程中若添加此文件,则会与delay.c文件冲突,调用delay_ms()函数时会陷入死循环。该文件在HALLIB 文件下。

这样编译后就没有错误了。 

最后一步,要下载验证,还需要配置参数。

在Debug这里选择ST-Link Debugger,然后选择Settings。

到这里,一个基于 HAL 库的工程模板就完成了。

STM32F429 笔记(一)- Keil 创建HAL工程相关推荐

  1. keil添加hal库_一、使用HAL库建立STM32工程

    一.建立一个空文件夹,在其中建立四个空文件夹 Doc : 存放说明文档等 Libraries : 存放CMSIS文件和HAL库文件 Project :存放Keil工程 User : 存放用户自己的文件 ...

  2. keil添加hal库_Stm32CubeMX生成的hal库工程加入标准库的库函数的方法

    本帖最后由 seawind1986 于 2017-4-7 22:30 编辑 第一步用Stm32CubeMX创建一个工程并生成Keil MDK的工程,不多赘述. 001.jpg (127.92 KB, ...

  3. 使用Keil MDK以及标准外设库创建STM32工程

    应部分网友要求,最新加入固件库以及开发环境使用入门视频教程,同时提供例程模板,个人录制,欢迎指正.下载地址:http://dl.dbank.com/c0w0ehqynd 2013.3补充在线视频教程 ...

  4. (2)stm32开发之使用Keil MDK以及标准外设库创建STM32工程

    通过上一节对标准外设库的介绍,想必各位读者对标准外设库已经有了基本的认识,然而由于标准外设库中文件众多,很多初学者在开始很长一段时间内甚至都无法完全自己建立一个工程,很多人只是依赖标准外设库或给定的工 ...

  5. keil创建无启动文件及自定义.sct文件的工程

    需求背景:在Cortex-M0/M4处理器中实现主程序常驻ROM,子程序动态加载到RAM中运行. 由于Cortex-M0/M4处理器没有MMU,很难像带MMU的处理器那样给程序划分虚拟地址,实际上只能 ...

  6. keil stm32标准库放在哪里_使用Keil MDK以及标准外设库创建STM32工程

    应部分网友要求,最新加入固件库以及开发环境使用入门视频教程,同时提供例程模板,个人录制,欢迎指正.下载地址:http://dl.dbank.com/c0w0ehqynd 2013.3补充在线视频教程 ...

  7. stm32开发之使用Keil MDK以及标准外设库创建STM32工程

    通过上一节对标准外设库的介绍,想必各位读者对标准外设库已经有了基本的认识,然而由于标准外设库中文件众多,很多初学者在开始很长一段时间内甚至都无法完全自己建立一个工程,很多人只是依赖标准外设库或给定的工 ...

  8. keil创建工程没有atmel_keil创建工程步骤详解

    iPhone的ECID是什么? ECID就是iPhone的身份证号,每一个iPhone都有自己的独特的ECID,有了这个ECID,就能确定一部iPhone的信息,获取方式可以通过在手机查看.查看注册表 ...

  9. 【嵌入式基础】用C语言编程、寄存器实现LED流水灯程序;stm32CubeMX+Keil使用HAL库点亮流水灯

    本文主要介绍STM32F103系列芯片的地址映射和寄存器映射原理,GPIO端口的初始化设置步骤.利用C语言编程和寄存器点亮流水灯以及stm32CubeMX+Keil使用HAL库点灯 目录 一.STM3 ...

最新文章

  1. SAP ECC6.0-中建信息版
  2. 2038: [2009国家集训队]小Z的袜子(hose)+莫队入门
  3. C#String与string大小写的区别
  4. 职称计算机考试选择题,职称计算机考试综合选择题「附答案」.docx
  5. 美加州希望立法叫停加密手机
  6. javascript必须知道的知识要点(一)
  7. 论文浅尝 | 通过文本到文本神经问题生成的机器理解
  8. 超全超详细的HTTP状态码大全
  9. 再获信通院权威认证,优等生华为云GaussDB数据库凭什么?
  10. Springboot在线电影系统实战开发
  11. linux获取weblogic版本,LINUX查看JDK和Weblogic版本命令
  12. linux安装过程中的硬盘分区工具是,Linux硬盘分区管理工具
  13. 硅谷华人码农成语大全
  14. 全国各省市区域mysql_中国省市区数据表(MySQL版)
  15. 微信小程序 实现点击收藏功能
  16. 2018APP推广计划方案(完整版)
  17. Cuba在Linux(Ubuntu)的安装
  18. win10 系统 chrome内核浏览器 微软雅黑字体难看的解决方法
  19. 无法连接imssage信息服务器,苹果iPhone X用iMessage发短信信息总是失败解决方法
  20. Mapper method 'comxx' has an unsupported return type

热门文章

  1. 基于Python实现的英文文本信息检索系统
  2. 网络7层协议,4层,5层?理清容易混淆的几个概念
  3. Android错误提示及解决方案(持续更新)
  4. win10看视频全屏底边任务栏还在
  5. mtd block device和block device区别,MTD设备的一般不宜挂载fat,ext2,ext3等文件系统原因
  6. python中如何调取wind数据_python实现从wind导入数据
  7. flash源文件小,导出后变大的问题
  8. 基于Android studio个人财务记账管理系统
  9. 干货| 乐队的混音应该如何改善?职业混音师的建议 MZD Studios
  10. Unity演示场景枫丹白露(Fontainebleau)技术分析