HAL库_概述

1> 文件介绍

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

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> 头文件包含关系

2

“老哥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库_移植

1

  • 根据硬件划分为4层:
  • CORE: CPU,内核相关文件;
  • MCU: MCU, SoC相关文件;
  • BSP:板级支持包,单板外设相关文件;
  • APP: 应用开发文件, main.c;

3.1> 裸奔工程模板

😀套娃奔来。。。。。。。。。
31

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);

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值