STM32F103我司量产产品中大量使用的一款单片机,之前的代码使用的是STM32的标准库,但是在最新的产品开发中,参考代码使用了STM32的HAL库,所以有必要了解一下HAL库的使用方式。但是HAL库代码很多,读起来费时费力,好在ST官方有一款叫做STM32CubeMX的软件,可以非常便捷地生成采用HAL的初始代码,本文分享一下使用STM32CubeMX生成STM32初始代码的过程。
本文使用到的软件及版本:
Keil:5.23
pack:
Keil.STM32F1xx_DFP.2.4.0
Keil.STM32F4xx_DFP.2.17.0
ARM.CMSIS.5.9.0
Keil.ARM_Compiler.1.7.2
Keil.MDK-Middleware.7.16.0
STM32CubeMX:6.8.0
Keil、Pack及STM32CubeMX的安装过程,本文就不写了,读者可以自行查找网上的资料。本文的例子很简单,就是使用STM32F103的串口打印出几个字符,过程如下:
1. 运行STM32CubeMX,点击“ACCESS TO MCU SELECTOR”,如下图
2. 在出现的窗口中选择“STM32F103ZET6”,也就是硬件板子上所用的处理器型号,如下图
3. 点击右侧窗口中“Part NO”下的“STM32F103ZE”后,再点击右上角出现的“Start Project”按钮,如下图
4. 左侧的“System Code”中SYS已经自动选择,点击SYS,在右侧出现的Debug窗口中选择“Serial Wire”,也就是后续使用的下载器的类型,如下图
5. 点击“ Connectivity”下面的USART1,然后勾选右侧窗口“NVIC Settings”中“USART1 global interrupt”后面的“Enabled”,如下图
6. 查看USART1对应的GPIO Settings是否正确,如下图
7. 点击上方的“Clock Configuration”,由于在实际的产品中,为了缩小板卡尺寸,我们会使用STM32F103T8U6芯片,并且使用内部的RC Clock,所以时钟配置如下图所示
8. 点击上方的“Project Manager”,设定工程保存目录及所用的软件版本,如下图
9. 点击左侧的“Code Generator”,做如下配置,这样可以减小工程的大小而且目录结构更清晰。
10. 点击上方的“Tools”后,无需任何操作,直接“GENERATE CODE”即可,如下图
代码生成后,会有提示信息,如下图
点击“Open Folder”后,可以看到工程目录如下图所示
11. 使用Keil打开MDK-ARM文件夹中的工程文件,修改usart.c,将fputc及fgetc重定向,并将stdio.h包含近来,如下
#include <stdio.h>
/* USER CODE BEGIN 0 */
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
return ch;
}
/* USER CODE END 0 */
12. 在main.c中MX_USART1_UART_Init();之后增加一行打印信息
printf("\r\nzencheer comport\r\n");
13. 这里还有一个关键的步骤,就是要设定使用“Use MicroLIB”,否则串口将无法正常打印,如下图
14. 将整个工程编译,并将二进制文件下载至硬件板卡中,在电脑上可以看到单片机通过串口输出的信息,如下图
完成以上完整过程也就是10分钟的时间,对于不太熟悉STM32 HAL库的工程师来说,STM32CubeMX实在是太方便了,工程师要将心思花在应用软件的开发上即可,可以大大缩短产品开发周期。