之前文章中已经总结如何下载,具体查看【07】STM32·HAL库开发-新建寄存器版本MDK工程 |下载STM32Cube固件包 | 新建MDK工程步骤中的第1.1小节。
新建HAL库版本MDK工程简要步骤:
1.新建工程文件夹:D/M/O/P/U文件夹,5个文件夹;
2.新建工程框架:工程命名,选芯片;
3.添加文件:建分组,添加.s、.c;
4.魔术棒设置:T/O/L/C/D/U,6个选项卡;
5.添加main.c:编写自己的代码。
在桌面新建一个工程根目录文件夹,并在该文件夹里新建D/M/O/P/U文件夹。
在【Drivers】文件夹中新建【BSP】文件夹,由于只是创建新工程此处为空文件夹,有外设时可根据外设添加此文件夹代码;【CMSIS】文件夹,直接复制正点原子资料A盘->8.STM32参考资料->1,STM32CubeF1固件包->精简版CMSIS中的【CMSIS】文件夹,如果想知道保留了哪些文件,可以查看文章【07】STM32·HAL库开发-新建寄存器版本MDK工程 |下载STM32Cube固件包 | 新建MDK工程步骤中的章节2.1.1;【SYSTEM】文件夹随意拷贝正点原子F1系列工程中的【SYSTEM】文件夹;
【STM32F1xx_HAL_Driver】文件夹直接拷贝HAL固件库文件夹中的【STM32F1xx_HAL_Driver】文件夹,并删除除了【Inc】和【Src】文件夹以外的其他文件。
【Middlewares】文件夹文件夹用于存放正点原子和其他第三方提供的中间层代码(组件/Lib 等),如: USMART、MALLOC、 TEXT、 FATFS、 USB、 LWIP、各种 OS、各种 GUI 等。目前不用操作。
该文件夹用于存放编译器编译工程输出的中间文件,比如: .hex、 .bin、 .o 文件等。目前不用操作。
该文件夹用于存放编译器(MDK、 IAR 等)工程文件,我们主要用 MDK,为了方便区分,我们在该文件夹下新建: MDK-ARM 文件夹,用于存放 MDK 的工程文件。在该文件夹下创建【MDK-ARM】文件夹。
该文件夹用于存放用户编写的代码,如: HAL 库用户配置文件、 main.c 文件、中断处理文件,以及分散加载文件等。main.c文件在创建工程时创建,其他文件从HAL库固件包中复制,如0下所示:
从以下目录中获取stm32f1xx_hal_conf.h(此文件也可以从STM32Cube_FW_F1_V1.8.0\Drivers\STM32F1xx_HAL_Driver\Inc中获取,将文件stm32f1xx_hal_conf_template.h文件名改为stm32f1xx_hal_conf.h即可)和stm32f1xx_it.h文件。
从以下目录中获取stm32f1xx_it.c文件。
将工程保存到【MDK-ARM】文件夹中,并自由命名,这里我命名为“f103”。选择自己开发板对应的芯片,这里以STM32RCT6为例。
在以下界面选择Cancel即可。
生产工程后,自动生成以下三个文件夹,【DebugConfig】文件夹不能删除,此文件中保存调试的设置信息,如果删除在调试时会发生错误。删除【Listings】和【Objects】文件夹,因为编译产生的中间层文件会在MDK软件中设置输出到【Output】文件夹。
删除后的【MDK-ARM】如下所示:
工程名:Template
分组名:Startup,User,Drivers/SYSTEM,Drivers/STM32F1xx_HAL_Driver ,Readme
最终设置工程名和分组名如下所示:
在设置工程名和分组名界面,找到【Add Files】添加【Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\arm】文件夹中的启动文件。
在【User】分组中添加【User】文件夹中的stm32f1xx_it.c和【Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates】的system_stm32f1xx.c文件。
添加【Drivers\SYSTEM】文件夹中,各自文件夹的.c文件。
新建工程时对HAL库进行裁剪,根据需要进行保留,新建工程最终保留如下所示:
点击【OK】,工程右侧最终如下图所示。
其中有“小钥匙”符号的原因是官方的固件包设置的是只读模式,取消只读权限即可让其消失。
设置Objects输出文件夹、生成.hex文件(勾选【Creat HEX File】)、输出浏览信息。勾选【Browse Information】可以在程序中使用Goto definition,如果不勾选,编译速度会变快。
设置全局宏定义(表示使用了HAL库驱动,USE_HAL_DRIVER和STM32F103xE之间用英文逗号隔开。)、优化等级(不用修改,默认为Level 0)、勾选【C99 Mode】、设置头文件包含路径。
定义USE_HAL_DRIVER和STM32F103xE这两个宏的原因是在stm32f1xx.h中,需要定义了宏USE_HAL_DRIVER才可以使用HAL库,可以在stm32f1xx.h文件中定义,也可以在MDK中进行全局宏定义。定义宏STM32F103xE也是在stm32f1xx.h存在条件编译,头文件中描述了FLASH、SRAM、外设基地址的信息,如果要开发此系列,必须定义该宏。
#if defined (USE_HAL_DRIVER)
#include "stm32f1xx_hal.h"
#endif /* USE_HAL_DRIVER */
#if defined(STM32F100xB)
#include "stm32f100xb.h"
#elif defined(STM32F100xE)
#include "stm32f100xe.h"
...
设置使用的仿真器类型、选择的下载接口等。这里以ST-Link下载方式为例,选择SWD方式,时钟选择最大即可。
设置下载功能、下载算法、下载算法起始地址和大小等。勾选【Reset and Run】程序复位后自动执行,【Erase Full Chip】是擦除全片,【Erase Sectors】是擦除部分,【Do not Erase】是不进行擦除,其余默认即可。
添加分散加载文件(北极星/MiniPro H750,需要用外部的FLASH存储代码)。具体参考【07】STM32·HAL库开发-新建寄存器版本MDK工程 |下载STM32Cube固件包 | 新建MDK工程步骤中的2.4.7小节。
点击新建文件图标,或者Ctrl+N新建文件,Ctrl+S保存到【User】文件夹,命名为main.c,并添加到工程分组【User】中。
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
void led_init(void); /* LED初始化函数声明 */
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
delay_init(72); /* 延时初始化 */
led_init(); /* LED初始化 */
while(1)
{
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET); /* PB5置1 */
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_RESET); /* PE5置0 */
delay_ms(500);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET); /* PB5置0 */
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_SET); /* PE5置1 */
delay_ms(500);
}
}
/**
* @brief 初始化LED相关IO口, 并使能时钟
* @param 无
* @retval 无
*/
void led_init(void)
{
GPIO_InitTypeDef gpio_initstruct;
__HAL_RCC_GPIOD_CLK_ENABLE(); /* IO口PB时钟使能 */
__HAL_RCC_GPIOA_CLK_ENABLE(); /* IO口PE时钟使能 */
gpio_initstruct.Pin = GPIO_PIN_2; /* LED0引脚 */
gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP; /* 推挽输出 */
gpio_initstruct.Pull = GPIO_PULLUP; /* 上拉 */
gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
HAL_GPIO_Init(GPIOD, &gpio_initstruct); /* 初始化LED0引脚 */
gpio_initstruct.Pin = GPIO_PIN_8; /* LED1引脚 */
HAL_GPIO_Init(GPIOA, &gpio_initstruct); /* 初始化LED1引脚 */
}
拷贝以上程序到main.c中(led_init
函数中需要根据自己板子LED引脚进行设置),编译工程会报以下错误,双击此错误,跳转到报错位置,删除#include "main.h"
。
..\..\User\stm32f1xx_it.c(23): error: #5: cannot open source input file "main.h": No such file or directory
再次编译会出现以下警告,说明HAL_IncTick
未声明,在stm32f1xx_it.c中包含stm32f1xx_hal.h头文件即可0错误,0警告。
..\..\User\stm32f1xx_it.c(140): warning: #223-D: function "HAL_IncTick" declared implicitly
将程序下载到板子中,可以看到LED灯交替闪烁。