HAL库
1> 文件介绍
1.1>Cortex-M4内核相关文件
文件目录:
STM32Cube_FW_F4_V1.25.0\Drivers\CMSIS\Include
文件名称:
core_cm4.h
mpu_armv7.h // Cortex-M4内核基于ARM-V7架构
cmsis_version.h
cmsis_compiler.h
cmsis_armcc.h // Keil 编译器
1.2>STM32F407相关文件
1-启动文件 startup_stm32f407xx.s
文件目录:F407_YS\STM32Cube_FW_F4_V1.25.0\Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm
2-系统初始化文件 system_stm32f4xx.c
文件目录:
STM32Cube_FW_F4_V1.25.0\Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates
3-头文件:
stm32f4xx.h
stm32f407xx.h
system_stm32f4xx.h
文件目录:
STM32Cube_FW_F4_V1.25.0\Drivers\CMSIS\Device\ST\STM32F4xx\Include
1.3>F407外设驱动
h文件目录:STM32Cube_FW_F4_V1.25.0\Drivers\STM32F4xx_HAL_Driver\Inc
c文件目录:STM32Cube_FW_F4_V1.25.0\Drivers\STM32F4xx_HAL_Driver\Src
1.4> 其他文件
h文件目录:STM32Cube_FW_F4_V1.25.0\Drivers\STM32F4xx_HAL_Driver\Inc
stm32f4xx_hal_conf_template.h
stm32f4xx_hal_msp_template.c
这些文件只是个模板,需要改名为stm32f4xx_hal_conf.h 添加到自己的工程种;
2> 文件关系
2.1> 头文件包含关系
“老哥3”
stm32f4xx_hal.h : HAL库总纲;
stm32f407xx.h: 整个MCU的描述;
core_cm4.h : ARM内核相关文件;
- stm32f4xx.h 作用
他包含了多个芯片,在工程移植过程中,更换芯片后,只需更改宏定义;
#if defined(STM32F405xx)
#include "stm32f405xx.h"
#elif defined(STM32F415xx)
#include "stm32f415xx.h"
#elif defined(STM32F407xx)
#include "stm32f407xx.h"
#elif defined(STM32F417xx)
#include "stm32f417xx.h"
2.2> .c 与 .h
stm32f4xx_hal_ppp.c -> stm32f4xx_hal.h
所以.c 都包含stm32f4xx_hal.h.
3> HAL库_移植
- 根据硬件划分为4层:
- CORE: CPU,内核相关文件;
- MCU: MCU, SoC相关文件;
- BSP:板级支持包,单板外设相关文件;
- APP: 应用开发文件, main.c;
3.1> 裸奔工程模板
😀套娃奔来。。。。。。。。。
3.2> 注意事项
- 移植,用CubeMX生成一个最小系统工程,进行移植;
- 代码严格分层,不要修改库文件内容(除你帮ST干活);
4> HAL库_使用
4.1> 外设结构体
对外设进行操作,首先需要抽象出这个外设的模样,比如GPIO这个外设,Abstract他:
typedef struct
{
__IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */
__IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */
__IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */
__IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */
__IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */
__IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */
__IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */
__IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */
__IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */
} GPIO_TypeDef;
// 初始化参数结构体;
typedef struct
{
uint32_t Pin;
uint32_t Mode;
uint32_t Pull;
uint32_t Speed;
uint32_t Alternate;
} GPIO_InitTypeDef;
外设寄存器分类:
1> 控制寄存器:控制单元的寄存器:使能/失能控制等,BSRR;
2> 数据寄存器:数据通路中的寄存器,比如IDR,ODR;
3> 配置寄存器:配置模式,速度等,比如MODER,OTYPER,OSPEED;
4> 状态寄存器:显示外设状态;
4.2> 初始化函数
HAL_GPIO_Init(){}
4.3> 功能函数
/* 每个外设给用户的是一组寄存器,因此主要的操作就是读/写 */
HAL_GPIO_ReadPin(){}
HAL_GPIO_WritePin(){}
/* 对中断的处理,通过回调函数 */
HAL_GPIO_EXTI_Callback(){}
5> HAL库_封装层级
5.1> 1层:基地址宏定义
stm32f407xx.h:
#define PERIPH_BASE 0x40000000UL
#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000UL)
#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000UL)
5.2> 2层:基地址宏定义+结构体封装
stm32f407xx.h:
typedef struct
{
__IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */
__IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */
__IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */
__IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */
__IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */
__IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */
__IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */
__IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */
__IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */
} GPIO_TypeDef;
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
5.3> 3层:基地址宏定义+结构体封装+位封装
stm32f407xx.h:
/*---------- GPIO PIN 定义 -----------------*/
/****************** Bits definition for GPIO_BSRR register ******************/
#define GPIO_BSRR_BS0_Pos (0U)
#define GPIO_BSRR_BS0_Msk (0x1UL << GPIO_BSRR_BS0_Pos) /*!< 0x00000001 */
#define GPIO_BSRR_BS0 GPIO_BSRR_BS0_Msk
#define GPIO_BSRR_BS1_Pos (1U)
#define GPIO_BSRR_BS1_Msk (0x1UL << GPIO_BSRR_BS1_Pos) /*!< 0x00000002 */
#define GPIO_BSRR_BS1 GPIO_BSRR_BS1_Msk
#define GPIO_BSRR_BS2_Pos (2U)
#define GPIO_BSRR_BS2_Msk (0x1UL << GPIO_BSRR_BS2_Pos) /*!< 0x00000004 */
#define GPIO_BSRR_BS2 GPIO_BSRR_BS2_Msk
#define GPIO_BSRR_BS3_Pos (3U)
#define GPIO_BSRR_BS3_Msk (0x1UL << GPIO_BSRR_BS3_Pos) /*!< 0x00000008 */
#define GPIO_BSRR_BS3 GPIO_BSRR_BS3_Msk
#define GPIO_BSRR_BS4_Pos (4U)
#define GPIO_BSRR_BS4_Msk (0x1UL << GPIO_BSRR_BS4_Pos) /*!< 0x00000010 */
#define GPIO_BSRR_BS4 GPIO_BSRR_BS4_Msk
#define GPIO_BSRR_BS5_Pos (5U)
#define GPIO_BSRR_BS5_Msk (0x1UL << GPIO_BSRR_BS5_Pos) /*!< 0x00000020 */
#define GPIO_BSRR_BS5 GPIO_BSRR_BS5_Msk
#define GPIO_BSRR_BS6_Pos (6U)
#define GPIO_BSRR_BS6_Msk (0x1UL << GPIO_BSRR_BS6_Pos) /*!< 0x00000040 */
#define GPIO_BSRR_BS6 GPIO_BSRR_BS6_Msk
#define GPIO_BSRR_BS7_Pos (7U)
#define GPIO_BSRR_BS7_Msk (0x1UL << GPIO_BSRR_BS7_Pos) /*!< 0x00000080 */
#define GPIO_BSRR_BS7 GPIO_BSRR_BS7_Msk
// 上面这些好像没啥用???????????????
方便进行或运算;
#define GPIO_PIN_0 ((uint16_t)0x0001) /* Pin 0 selected */
#define GPIO_PIN_1 ((uint16_t)0x0002) /* Pin 1 selected */
#define GPIO_PIN_2 ((uint16_t)0x0004) /* Pin 2 selected */
#define GPIO_PIN_3 ((uint16_t)0x0008) /* Pin 3 selected */
#define GPIO_PIN_4 ((uint16_t)0x0010) /* Pin 4 selected */
#define GPIO_PIN_5 ((uint16_t)0x0020) /* Pin 5 selected */
#define GPIO_PIN_6 ((uint16_t)0x0040) /* Pin 6 selected */
#define GPIO_PIN_7 ((uint16_t)0x0080) /* Pin 7 selected */
#define GPIO_PIN_8 ((uint16_t)0x0100) /* Pin 8 selected */
#define GPIO_PIN_9 ((uint16_t)0x0200) /* Pin 9 selected */
#define GPIO_PIN_10 ((uint16_t)0x0400) /* Pin 10 selected */
#define GPIO_PIN_11 ((uint16_t)0x0800) /* Pin 11 selected */
#define GPIO_PIN_12 ((uint16_t)0x1000) /* Pin 12 selected */
#define GPIO_PIN_13 ((uint16_t)0x2000) /* Pin 13 selected */
#define GPIO_PIN_14 ((uint16_t)0x4000) /* Pin 14 selected */
#define GPIO_PIN_15 ((uint16_t)0x8000) /* Pin 15 selected */
#define GPIO_PIN_All ((uint16_t)0xFFFF) /* All pins selected */
5.4> 4层:基地址宏定义+结构体封装+位封装+函数封装
stm32f4xx_hal_gpio.h:
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);