图 3.3.2.29 点击按钮“Select Folder for Objects…”
图 3.3.2.30 选择 OBJ 目录为中间文件存放目录
选择完 OBJ 目录为编译中间文件存放目录之后,点击 OK 回到 Output 选项卡。这里我们还
要勾上“Create HEX File”选项。Create HEX File 选项选上是要求编译之后生成 HEX
文件。Browse Information 选项选上是方便我们查看工程中的一些函数变量定义等。但是
对于 HAL 库勾选之后编译速度极其慢,为了加快开发速度我们不勾选。具体操作方法如下
图 3.3.2.31 所示:
图 3.3.2.31 勾选上 Create HEX file 选项
13)
接下来在编译之前,我们先把 main.c 文件里面的内容替换为如下内容:
#include "sys.h"
#include "delay.h"
#include "usart.h"
/************************************************
ALIENTEK 探索者 STM32F407 开发板实验 0-1
Template 工程模板-新建工程章节使用-HAL 库版本
技术支持:www.openedv.com
淘宝店铺: http://eboard.taobao.com
关注微信公众平台*"正点原子",免费获取 STM32 资料。
广州市星翼电子科技有限公司
作者:正点原子 @ALIENTEK
************************************************/
/***注意:本工程和教程中的新建工程 3.3 小节对应***/
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(336,8,2,7);
//设置时钟,168Mhz
__HAL_RCC_GPIOF_CLK_ENABLE(); //开启 GPIOF 时钟
GPIO_Initure.Pin=GPIO_PIN_9|GPIO_PIN_10;
//PF9,10
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP;
//上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH;
//高速
HAL_GPIO_Init(GPIOF,&GPIO_Initure);
while(1)
{
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_SET);
//PF9 置 1
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,GPIO_PIN_SET);
//PF10 置 1
Delay(0x7FFFFF);
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_RESET); //PF9 置 0
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,GPIO_PIN_RESET); //PF10 置 0
Delay(0x7FFFFF);
}
}
上面这段代码,大家如果不方便自己编写,可以直接打开我们光盘库函数源码目录“4,
程序源码\标准例程-HAL 库版本\实验 0-1 Template 工程模板-新建工程章节使用 ”找到我们已
经新建好的工程模板 USER 目录下面的 main.c 文件,直接复制过来即可。
14)
下面我们点击编译按钮
编译工程,可以看到工程编译通过没有任何错误和警告。
图 3.3.2.32 编译工程
这里大家可能会遇到编译之后会有一个警告,警告的内容是:“warning: #1-D: last line of
file ends without a newline”。我们只需要在 main.c 函数结尾加一个回车即可解决,这个
是 MDK 自身的 BUG。
15)
到这里,一个基于 HAL 库的工程模板就建立完成,同时在工程的 OBJ 目录下面生成了
对应的 hex 文件。大家可以参考后面我们 3.4 小节的内容,将 hex 文件下载到开发板,会发现
两个 led 灯不停的闪烁现象。
16)
这里还一个地方需要大家修改一下,那就是关于系统初始化之后的中断优先级分组组
号的设置。默认情况下调用 HAL 初始化函数 HAL_Init 之后,会设置分组为组 4,这里我们正
点原子所有实验使用的是分组 2,所以我们修改 HAL_Init 函数内部,重新设置分组为组 2 即可。
具体方法是:打开 HALLIB 分组之下的 stm32f4xx_hal.c 文件,搜索函数 HAL_Init,找到函数体,
里面默认有这样一行代码:
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
我们将入口参数 NVIC_PRIORITYGROUP_4 修改为 NVIC_PRIORITYGROUP_2 即可。关于中
断优先级分组相关知识请参考本手册 4.5 小节即可。
工程编译通过之后,接下来我们会教大家怎么对 STM32F4 芯片进行程序下载。
3.4 程序下载与调试
上一节,我们学会了如何在 MDK 下创建 STM32F4 工程。本节,我们将向读者介绍 STM32F4
的代码下载以及调试。这里的调试包括了软件仿真和硬件调试(在线调试)。通过本章的学习,
你将了解到:1、STM32F4 程序下载;2、利用 STLINK 对 STM32F4 进行下载与在线调试。
3.4.1 STM32 串口程序下载
STM32F4 的程序下载有多种方法:USB、串口、JTAG、SWD 等,这几种方式,都可以用
来给 STM32F4 下载代码。不过,最简单也是最经济的,就是通过串口给 STM32F4 下载代码。
本节,我们将向大家介绍,如何利用串口给 STM32F4(以下简称 STM32)下载代码。
STM32 的串口下载一般是通过串口 1 下载的, 本手册的实验平台 ALIENTEK 探索者
STM32F4 开发板,不是通过 RS232 串口下载的,而是通过自带的 USB 串口来下载。看起来像
是 USB 下载(只需一根 USB 线,并不需要串口线)的,实际上,是通过 USB 转成串口,然后
再下载的。
下面,我们就一步步教大家如何在实验平台上利用 USB 串口来下载代码。
首先要在板子上设置一下,在板子上把 RXD 和 PA9(STM32 的 TXD),TXD 和 PA10(STM32
的 RXD)通过跳线帽连接起来,这样我们就把 CH340G 和 MCU 的串口 1 连接上了。这里由于
ALIENTEK 这款开发板自带了一键下载电路,所以我们并不需要去关心 BOOT0 和 BOOT1 的
状态,但是为了让下下载完后可以按复位执行程序,我们建议大家把 BOOT1 和 BOOT0 都设置
为 0。设置完成如图 3.4.1.1 所示: