STM32CubeMX 简介
STM32CubeMX是ST意法半导体近几年来大力推荐的STM32芯片图形化配置工具,允许用户使用图形化向导生成C初始化代码,可以大大减轻开发工作、时间和费用。STM32CubeMX几乎覆盖了STM32全系列芯片。它具有如下特性:
- 直观的选择MCU型号,可指定系列、封装、外设数量等条件;
- 微控制器图形化配置;
- 自动处理引脚冲突;
- 动态设置时钟树,生成系统时钟配置代码;
- 可以动态设置外围和中间件模式和初始化;
- 功耗预测;
- C代码工程生成器覆盖了STM32微控制器初始化编译软件,如IAR,KEIL,GCC;
- 可以独立使用或者作为Eclipse插件使用。
对于STM32CubeMX和STM32Cube的关系这里我们还需要特别说明一下,STM32Cube包含STM32CubeMX图形工具和STM32Cube库两个部分,使用STM32CubeMX配置生成的代码,是基于STM32Cube库的。也就是说,我们使用STM32CubeMX配置出来的初始化代码,和STM32Cube库兼容,例如硬件抽象层代码就是使用的STM32的HAL库。不同的STM32系列芯片,会有不同的STM32Cube库支持,而STM32CubeMX图形工具只有一种。所以我们配置不同的STM32系列芯片,选择不同的STM32Cube库即可。
使用STM32CubeMX工具配置工程模板与GPIO工程创建
大多数情况下,我们都只使用STM32CubeMX来生成工程的时钟系统初始化代码以及外设的初始化代码,因为用户控制逻辑代码是无法在STM32CubeMX中完成的,需要用户自己根据需求来实现。使用STM32CubeMX配置工程的一般步骤为:
- 工程初步建立和保存
- RCC设置
- 时钟系统(时钟树)配置
- GPIO功能引脚配置
- 生成工程源码
- 编写用户代码
接下来我们将按照上面6个步骤,依次教大家使用STM32CubeMX工具生成一个完整的工程。
工程初步建立和保存
工程建立的方法有两种方法,第一种方法是打开STM32CubeMX之后在主界面点击NewProject按钮,第二种方法是在菜单栏依次点击File→New Project。
点击新建工程按钮之后,会弹出MCU选择窗口。选择与我们使用的芯片STM32F429IGT,最后双击或者点击右上角开始。
工程新建好之后会直接进入Pinout选项卡,这个时候界面会展示芯片完整引脚图,
在引脚图中,我们可以对引脚功能进行配置。图中黄色的引脚主要是一些电源和GND引脚。如果某个引脚被使用,那么会显示为绿色。
RCC 设置
对STM32芯片而言,RCC配置的重要性不言而喻。在STM32CubeMX中,RCC相关设置却非常简单, 因为它把时钟系统独立出来进行配置。
在操作界面,依次点击选项卡Pinout→System Core→RCC便可进入RCC配置栏
- RCC配置栏实际上只有5个配置项。选项High Speed Clock(HSE)用来 peizHSE,第二个选项 Low Speed Clock(LSE)用来配置 LSE,选项Master Clock Output 1用来选择是否使能MCO1引脚时钟输出,选项Master Clock Output 2用来选择是否使能MCO2引脚时钟输出,最后一个选项Audio Clock Input(I2S_CKIN)用来选择是否从I2S_CKIN(PC9)输入I2S时钟。这里大家要注意,因为选项Master Clock Output 2和选项Audio Clock Input(I2S_CKIN)都是使用的PC9引脚,所以如果我们使能了其中一个,那么另一个选项会自动显示为红色,也就是不允许配置,这就是STM32CubeMX的自动冲突检测功能。
本小节我们只使用到HSE,所以我们设置选项High Speed Clock(HSE)的值为Crystal/Ceramic Resonator(使用晶振/陶瓷振荡器)即可。
还可以看出,在我们打开了HSE之后,右边的引脚图中,相应的引脚会由灰色变为绿色,表示该引脚已经被使用。
时钟系统(时钟树)配置
在使用STM32CubeMX配置时钟树之前,大家需要充分理解STM32时钟系统,只有熟练掌握了 STM32 时钟系统,那么在软件中配置时钟树才会得心应手。
点击Clock Configuration选项卡即可进入时钟系统配置栏
进入Clock Configuration配置栏之后可以看到,界面展现一个完整的STM32F429时钟系统框图。这个时钟系统框图跟我们之前时钟系统章节讲解的时钟系统框图实际是一模一样的,只不过调整了一下显示顺序。从这个时钟树配置图可以看出,配置的主要是外部晶振大小,分频系数,倍频系数以及选择器。在我们配置的工程中,时钟值会动态更新,如果某个时钟值在配置过程中超过允许值,那么相应的选项框会红色提示。
这里,我们将配置系统时钟为180MHz,同时,还配置了AHB,APB1,APB2和Systick的相关分频系数。下面两部分第一部分是配置系统时钟,第二部分是配置 AHB, APB1 和 APB2 的分频系数。
我们把系统时钟配置分为6个步骤,详细过程为:
- 时钟源参数设置:HSE或者HSI配置。这里我们选择HSE为时钟源,所以我们之前必须在RCC配置中我们开启HSE。
- 时钟源选择:HSE还是HSI。这里我们配置选择器选择HSE即可。
- PLL分频系数M配置。分频系数M我们设置为25。
- 主PLL倍频系数N配置。倍频系数N我们设置为360。
- 主PLL分频系数P配置。分频系数P我们配置为2。
系统时钟时钟源选择:PLL,HSI还是HSE。这里毫无疑问,我们选择PLL,选择器选择PLLCLK即可。经过上面的6个步骤,就会生成标准的180MHz系统时钟。
接下来只需要配置AHB,APB1,APB2和Systick的分频系数,就可以完全实现函数Stm32_Clock_Init配置的时钟系统。
AHB,APB1和APB2总线时钟以及Systick时钟的最终来源都是系统时钟SYSCLK。其中AHB总线时钟 HCLK是由SYSCLK经过AHB预分频器之后的来,如果我们要设置HCLK为180MHz,那么我们只需要配置图中标号⑦的地方为1即可。得到HCLK之后,接下来我们将在图标号⑧~⑩处同样的方法依次配置Systick, APB以及APB2分频系数分别为1,4和2即可。配置完成之后,那么HCLK=180MHZ,Systick时钟为180/1MHz=180MHz,PCLK1=180MHz/4=45MHz,PCLK2=180MHz/2=90MHz。
GPIO 功能引脚配置
本小节,将讲解怎么使用STM32CubeMX工具配置STM32的GPIO口。本小节将配置PB0和PB1两个IO口的相关参数。STM32CubeMX可以直接在芯片引脚图上配置IO口参数。
这里回到STM32CubeMX的Pinout选项,在搜索栏输入PB0和PB1即可找到PB0和PB1在引脚图中的位置
接下来,我们在上图引脚图中点击PB0,在弹出的下拉菜单中,选择IO口的功能为GPIO_Output。
同样的方法,我们配置PB1选择功能为GPIO_Output即可。这里我们需要说明一下,如果我们要配置IO 口为外部中断引脚或者其他复用功能,我们选择相应的选项即可。配置完IO口功能之后,还要配置IO口的速度,上下拉等参数。这些参数是在Configuration选项卡中配置的。
如果是对应旧版本软件可以在视图中找到:
依次点击Configuration→GPIO即可进入IO口详细配置界面,进入IO口配置界面之后,界面会列出所有使用到的IO口的参数配置。
我们选中PB0栏,就会在显示框下方显示对应的IO口详细配置信息,然后我们对参数进行配置。
生成工程源码
过上面4个步骤,一个完整的系统已经配置完成。接下来,将使用STM32CubeMX生成我们需要的工程源码。
分别在框中填入工程的名字,工程保存的地址即可(注意该软件不能出现中文字符)
以及选择MDK
点击生成代码:
配置完成后,点击OK开始生产源码。源码生产完成之后,就保存在Project Location选项配置的目录中,同时弹出生成成功提示界面,可以点击界面的“Open Folder”按钮打开工程保存目录,也可以点击界面的“Open Project”按钮直接使用IDE打开工程。
至此,一个完整的STM32F429工程就已经生成完成。
工程模板结构与HALGPIO库函数使用
工程模板详解
在编写用户程序之前,首先我们打开生成的工程模板进行编译,发现没有任何错误和警告。
其中Drivers/CMSIS文件夹下system_stm32f4xx.c与Application/MDK-ARM下的startup_stm32f429xx.s均为STM32F429软件最小系统必要文件。
Drivers/STM32F4xx_HAL_Driver文件夹下为HAL库关于硬件的程序必要文件。
Application/User目录下的stm32f4_it.c文件为中断服务函数存放文件,main.c为用户应用层主要文件,stm32f4xx_hal_msp.c为硬件、外设初始化回调函数存放文件。
main.c
main.c结构主要分为以下几个部分:
- hal库头文件包含
- hal函数声明
- main函数
- hal函数定义
main函数主要分为以下几个部分:
- HAL库初始化
- 系统时钟初始化
- 外设初始化
- While(1)
以上结构在所有工程模板中都是通用,用户编写应用程序都是从main.c出发。
需要注意编写用户程序时需要将自编写内容放入一下结构,这样在下次更新硬件配置文件时,自写内容才不会被覆盖。
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
stm32f4_it.c
stm32f4_it.c主要分为一下三个部分:
- 头文件
- 系统中断函数
- 用户中断函数
头文件包括#include "stm32f4xx_hal.h"、#include "stm32f4xx.h"、#include "stm32f4xx_it.h"。
系统中断函数有NMI_Handler、HardFault_Handler、MemManage_Handler、BusFault_Handler、UsageFault_Handler、DebugMon_Handler、SysTick_Handler七个系统常用中断服务函数。
用户中断函数在本章不做过多描述,在后续章节使用到时进行解释。
中断服务函数内部进行用户程序添加也需按照工程规范,在code begin – code end内进行。
HAL GPIO库函数
关于HAL库可调用函数可在对于.c文件.h文件内找到,下面给出关于GPIO输出的两个重要函数:
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
HAL_GPIO_Init函数是GPIO初始化函数,其在工程模板内自动生成代码中已被调用,无需进行二次使用,但若需要更新的引脚进行初始化,则可进行二次使用。
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
HAL_GPIO_WritePin函数是GPIO输出函数,主要参数有三个:
- 端口号
- 引脚号
- 输出状态
端口号用GPIOA,GPIOB…GPIOK表示,这在stm32f429xx.h内可以查到,GPIO_Pin用GPIO_PIN_0…GPIO_PIN_15表示,这在stm32f429xx_hal_gpio.h内可以查到。GPIO_PinState是一个枚举体类型,定义如下:
typedef enum { GPIO_PIN_RESET = 0, GPIO_PIN_SET }GPIO_PinState;
GPIO_PIN_RESET表示置0,GPIO_PIN_SET表示置1。
上述三个引脚状态都是一个规范性命名,最好根据库函数定义进行使用。
GPIO工程应用软件设计
在main函数前定义delay函数:
void delay(void) { unsigned int i,j; for(i=0;i<100;i++) for(j=0;j<1000;j++); }
在while(1)内添加以下语句:
while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_RESET); delay(); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_SET); delay(); }
进行编译下载,可看到板载两盏LED进行闪烁。
群号:621154399
有问题欢迎大家加入我们一起交流,这个群是开源性技术交流群。