超子物联网HAL库笔记:准备篇

超子物联网 HAL库学习 汇总入口:

超子物联网HAL库笔记:[汇总]

写作不易,如果您觉得写的不错,欢迎给博主来一波点赞、收藏~让博主更有动力吧!

1. HAL库简介

HAL库

  • HAL库(Hardware Abstraction Layer)是STMicroelectronics提供的STM32微控制器的硬件抽象层库。
  • 它通过一套统一的API接口,简化了对STM32外设的配置和操作,使开发者能够更快速地进行嵌入式系统开发,而不必深入了解底层硬件细节。

HAL库的优点

  • 高层次抽象:HAL库提供了高层次的抽象接口,简化了对硬件外设的操作。开发者可以通过调用库函数完成复杂的硬件配置,而不必直接操作寄存器。
  • 易于使用:由于提供了丰富的库函数和示例代码,开发者可以快速上手进行开发,减少了开发时间。
  • 一致性和移植性:HAL库在不同的STM32系列中保持了一致的API接口,增强了代码的移植性和重用性。如果需要更换STM32系列微控制器,代码的修改量较小。
  • 简化调试:由于HAL库屏蔽了底层的寄存器操作,调试过程中更容易定位和解决问题,减少了开发和维护的复杂性。
  • 代码维护性好:HAL库的高层次封装和良好的代码结构使得代码更容易维护和更新。

对比标准固件库的不同

  1. 抽象层次:
    • 标准固件库:直接操作寄存器,提供底层硬件访问,要求开发者对STM32微控制器的寄存器有较深入的理解。
    • HAL库:提供高层次的抽象接口,屏蔽底层寄存器操作,使开发者可以更快速地进行开发。
  2. 码复杂性:
    • 标准固件库:代码较复杂,涉及大量的寄存器配置,开发者需要处理更多的细节。
    • HAL库:代码简洁易读,通过调用库函数进行配置和操作,减少了代码量和复杂性。
  3. 学习曲线:
  • 标准固件库:学习曲线较陡,需要花费较多时间了解和掌握硬件细节。
  • HAL库:学习曲线较缓,提供了丰富的示例代码和文档,开发者可以快速上手。
  1. 开发效率:
  • 标准固件库:适合对性能和功耗有严格要求的项目,但开发和调试时间较长。
  • HAL库:提高了开发效率,适合快速开发和原型设计,缩短了开发周期。
  1. 移植性:
  • 标准固件库:不同系列的STM32微控制器之间存在较大的差异,代码移植工作量较大。
  • HAL库:提供一致的API接口,增强了代码的移植性和重用性,不同系列之间的移植工作量较小。

2. 创建HAL库工程模板

1. 制作文件模板

  • 先找一个位置,存放工程模板

  • 在工程模板中 添加 User、Library 、 Hardware 、 CMSIS 文件夹:

    • User:
      • main.c
    • Library:
      • Include
      • Source
    • Hardware:
      • Include
      • Source
    • CMSIS :
      • Include
      • Source
  • 下载HAL库 源码 STM32Cube MCU和MPU包: 相关产品

  • 解压并打开

  • 拷贝HAL库(Library)

    1. 进入\\STM32Cube_FW_F1_V1.8.0\\Drivers\\STM32F1xx_HAL_Driver 把头文件夹 Inc 和源文件夹 Src 移动到自己的Library的对应的文件中
  • 拷贝启动文件(CMSIS\Include)

    1. 先进入内核文件\\STM32Cube_FW_F1_V1.8.0\\Drivers\\CMSIS
    2. 进入头文件\\CMSIS\\Include 把所有文件拷贝到自己的CMSIS/Include 文件中 再进入\\CMSIS\\Device\\ST\\STM32F1xx\\Include 把所有文件拷贝到自己的CMSIS/Include文件中
  • 拷贝源文件(CMSYS\Source)

    1. 进入\\STM32Cube_FW_F1_V1.8.0\\Drivers\\CMSIS\\Device\\ST\\STM32F1xx\\Source\\Templates
    2. \\Templates 文件的的system_stm32f1xx.c拷贝到自己的CMSIS/Source文件中
    3. 再进入/arm文件下,把所有文件拷贝到自己的CMSIS/Source文件中
  • 编辑Hardware文件夹

    分别在源文件家和头文件夹添加stm32f1xx_it.c 和stm32f1xx_it.h 代码如下

stm32f1xx_it.c

/*-------------------------------------------------*/
/*                                                 */
/*          实现各种中断服务函数的源文件           */
/*                                                 */
/*-------------------------------------------------*/

#include "stm32f1xx_hal.h"   
#include "stm32f1xx_it.h"  

/*-------------------------------------------------*/
/*函数名:不可屏蔽中断处理函数                     */
/*参  数:无                                       */
/*返回值:无                                       */
/*-------------------------------------------------*/
void NMI_Handler(void)
{

}

/*-------------------------------------------------*/
/*函数名:硬件出错后进入的中断处理函数             */
/*参  数:无                                       */
/*返回值:无                                       */
/*-------------------------------------------------*/
void HardFault_Handler(void)
{

}
/*-------------------------------------------------*/
/*函数名:软中断,SWI 指令调用的处理函数           */
/*参  数:无                                       */
/*返回值:无                                       */
/*-------------------------------------------------*/
void SVC_Handler(void)
{
	
}
/*-------------------------------------------------*/
/*函数名:可挂起的系统服务处理函数                 */
/*参  数:无                                       */
/*返回值:无                                       */
/*-------------------------------------------------*/
void PendSV_Handler(void)
{
	
}
/*-------------------------------------------------*/
/*函数名:SysTic系统嘀嗒定时器处理函数             */
/*参  数:无                                       */
/*返回值:无                                       */
/*-------------------------------------------------*/
void SysTick_Handler(void)
{  
	HAL_IncTick();	
}

stm32f1xx_it.h

/**
  ******************************************************************************
  * @file    GPIO/GPIO_IOToggle/Inc/stm32f1xx_it.h
  * @author  MCD Application Team
  * @brief   This file contains the headers of the interrupt handlers.
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2016 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F1xx_IT_H
#define __STM32F1xx_IT_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */

void NMI_Handler(void);
void HardFault_Handler(void);
void MemManage_Handler(void);
void BusFault_Handler(void);
void UsageFault_Handler(void);
void SVC_Handler(void);
void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);

#ifdef __cplusplus
}
#endif

#endif /* __STM32F1xx_IT_H */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

最后需要把自己的Library文件中的Include 文件中的stm32f1xx_hal_conf_template.h 更名为 stm32f1xx_hal_conf.h 。否则编译会找不到这个头文件

文件结构

CMSIS
    Include
        cmsis_armcc.h
        cmsis_armclang.h
        cmsis_compiler.h
        cmsis_gcc.h
        cmsis_iccarm.h
        cmsis_version.h
        core_armv8mbl.h
        core_armv8mml.h
        core_cm0.h
        core_cm0plus.h
        core_cm1.h
        core_cm23.h
        core_cm3.h
        core_cm33.h
        core_cm4.h
        core_cm7.h
        core_sc000.h
        core_sc300.h
        mpu_armv7.h
        mpu_armv8.h
        stm32f100xb.h
        stm32f100xe.h
        stm32f101x6.h
        stm32f101xb.h
        stm32f101xe.h
        stm32f101xg.h
        stm32f102x6.h
        stm32f102xb.h
        stm32f103x6.h
        stm32f103xb.h
        stm32f103xe.h
        stm32f103xg.h
        stm32f105xc.h
        stm32f107xc.h
        stm32f1xx.h
        system_stm32f1xx.h
        tz_context.h
    Source
        startup_stm32f100xb.s
        startup_stm32f100xe.s
        startup_stm32f101x6.s
        startup_stm32f101xb.s
        startup_stm32f101xe.s
        startup_stm32f101xg.s
        startup_stm32f102x6.s
        startup_stm32f102xb.s
        startup_stm32f103x6.s
        startup_stm32f103xb.s
        startup_stm32f103xe.s
        startup_stm32f103xg.s
        startup_stm32f105xc.s
        startup_stm32f107xc.s
        system_stm32f1xx.c
DebugConfig
    Project_STM32F103C8_1.0.0.dbgconf
    Target_1_STM32F103C8_1.0.0.dbgconf
Hardware
    Include
        stm32f1xx_it.h
    Source
        stm32f1xx_it.c
Library
    Include
        Legacy
            stm32f1xx_hal_can_ex_legacy.h
            stm32f1xx_hal_can_legacy.h
            stm32_hal_legacy.h
        stm32f1xx_hal.h
        stm32f1xx_hal_adc.h
        stm32f1xx_hal_adc_ex.h
        stm32f1xx_hal_can.h
        stm32f1xx_hal_cec.h
        stm32f1xx_hal_conf.h
        stm32f1xx_hal_cortex.h
        stm32f1xx_hal_crc.h
        stm32f1xx_hal_dac.h
        stm32f1xx_hal_dac_ex.h
        stm32f1xx_hal_def.h
        stm32f1xx_hal_dma.h
        stm32f1xx_hal_dma_ex.h
        stm32f1xx_hal_eth.h
        stm32f1xx_hal_exti.h
        stm32f1xx_hal_flash.h
        stm32f1xx_hal_flash_ex.h
        stm32f1xx_hal_gpio.h
        stm32f1xx_hal_gpio_ex.h
        stm32f1xx_hal_hcd.h
        stm32f1xx_hal_i2c.h
        stm32f1xx_hal_i2s.h
        stm32f1xx_hal_irda.h
        stm32f1xx_hal_iwdg.h
        stm32f1xx_hal_mmc.h
        stm32f1xx_hal_nand.h
        stm32f1xx_hal_nor.h
        stm32f1xx_hal_pccard.h
        stm32f1xx_hal_pcd.h
        stm32f1xx_hal_pcd_ex.h
        stm32f1xx_hal_pwr.h
        stm32f1xx_hal_rcc.h
        stm32f1xx_hal_rcc_ex.h
        stm32f1xx_hal_rtc.h
        stm32f1xx_hal_rtc_ex.h
        stm32f1xx_hal_sd.h
        stm32f1xx_hal_smartcard.h
        stm32f1xx_hal_spi.h
        stm32f1xx_hal_sram.h
        stm32f1xx_hal_tim.h
        stm32f1xx_hal_tim_ex.h
        stm32f1xx_hal_uart.h
        stm32f1xx_hal_usart.h
        stm32f1xx_hal_wwdg.h
        stm32f1xx_ll_adc.h
        stm32f1xx_ll_bus.h
        stm32f1xx_ll_cortex.h
        stm32f1xx_ll_crc.h
        stm32f1xx_ll_dac.h
        stm32f1xx_ll_dma.h
        stm32f1xx_ll_exti.h
        stm32f1xx_ll_fsmc.h
        stm32f1xx_ll_gpio.h
        stm32f1xx_ll_i2c.h
        stm32f1xx_ll_iwdg.h
        stm32f1xx_ll_pwr.h
        stm32f1xx_ll_rcc.h
        stm32f1xx_ll_rtc.h
        stm32f1xx_ll_sdmmc.h
        stm32f1xx_ll_spi.h
        stm32f1xx_ll_system.h
        stm32f1xx_ll_tim.h
        stm32f1xx_ll_usart.h
        stm32f1xx_ll_usb.h
        stm32f1xx_ll_utils.h
        stm32f1xx_ll_wwdg.h
        stm32_assert_template.h
    Source
        Legacy
            stm32f1xx_hal_can.c
        stm32f1xx_hal.c
        stm32f1xx_hal_adc.c
        stm32f1xx_hal_adc_ex.c
        stm32f1xx_hal_can.c
        stm32f1xx_hal_cec.c
        stm32f1xx_hal_cortex.c
        stm32f1xx_hal_crc.c
        stm32f1xx_hal_dac.c
        stm32f1xx_hal_dac_ex.c
        stm32f1xx_hal_dma.c
        stm32f1xx_hal_eth.c
        stm32f1xx_hal_exti.c
        stm32f1xx_hal_flash.c
        stm32f1xx_hal_flash_ex.c
        stm32f1xx_hal_gpio.c
        stm32f1xx_hal_gpio_ex.c
        stm32f1xx_hal_hcd.c
        stm32f1xx_hal_i2c.c
        stm32f1xx_hal_i2s.c
        stm32f1xx_hal_irda.c
        stm32f1xx_hal_iwdg.c
        stm32f1xx_hal_mmc.c
        stm32f1xx_hal_msp_template.c
        stm32f1xx_hal_nand.c
        stm32f1xx_hal_nor.c
        stm32f1xx_hal_pccard.c
        stm32f1xx_hal_pcd.c
        stm32f1xx_hal_pcd_ex.c
        stm32f1xx_hal_pwr.c
        stm32f1xx_hal_rcc.c
        stm32f1xx_hal_rcc_ex.c
        stm32f1xx_hal_rtc.c
        stm32f1xx_hal_rtc_ex.c
        stm32f1xx_hal_sd.c
        stm32f1xx_hal_smartcard.c
        stm32f1xx_hal_spi.c
        stm32f1xx_hal_sram.c
        stm32f1xx_hal_tim.c
        stm32f1xx_hal_timebase_rtc_alarm_template.c
        stm32f1xx_hal_timebase_tim_template.c
        stm32f1xx_hal_tim_ex.c
        stm32f1xx_hal_uart.c
        stm32f1xx_hal_usart.c
        stm32f1xx_hal_wwdg.c
        stm32f1xx_ll_adc.c
        stm32f1xx_ll_crc.c
        stm32f1xx_ll_dac.c
        stm32f1xx_ll_dma.c
        stm32f1xx_ll_exti.c
        stm32f1xx_ll_fsmc.c
        stm32f1xx_ll_gpio.c
        stm32f1xx_ll_i2c.c
        stm32f1xx_ll_pwr.c
        stm32f1xx_ll_rcc.c
        stm32f1xx_ll_rtc.c
        stm32f1xx_ll_sdmmc.c
        stm32f1xx_ll_spi.c
        stm32f1xx_ll_tim.c
        stm32f1xx_ll_usart.c
        stm32f1xx_ll_usb.c
        stm32f1xx_ll_utils.c
Listings
    Project.map
Objects
    main.d
    main.o
    Project.axf
    Project.build_log.htm
    Project.htm
    Project.lnp
    Project.sct
    Project_Project.dep
    startup_stm32f101xb.o
    stm32f1xx_hal.d
    stm32f1xx_hal.o
    stm32f1xx_hal_cortex.d
    stm32f1xx_hal_cortex.o
    stm32f1xx_hal_gpio.d
    stm32f1xx_hal_gpio.o
    stm32f1xx_hal_gpio_ex.d
    stm32f1xx_hal_gpio_ex.o
    stm32f1xx_hal_rcc.d
    stm32f1xx_hal_rcc.o
    stm32f1xx_hal_rcc_ex.d
    stm32f1xx_hal_rcc_ex.o
    system_stm32f1xx.d
    system_stm32f1xx.o
User
    main.c

2. Keil 创建工程

  1. 创建工程、选择User为目录。

  2. 点击木箱子设置分组

    • User 、 Library 、 Hardware 、 CMSIS
  3. 导入文件

    • 这里只导入必备的。以后用哪个再加那个
    • Library:
      • stm32f1xx_hal.c
      • stm32f1xx_hal_cortex.c
      • stm32f1xx_hal_gpio.c
      • stm32f1xx_hal_gpio_ex.c
      • stm32f1xx_hal_rcc.c
      • stm32f1xx_hal_rcc_ex.c
    • CNSIS:
      • system_stm32f1xx.c
      • startup_stm32f103xb.s
    • User:
      • main.c
  4. 在魔术棒中设置:

    C/C++中: 在Define输入STM32F103xB (目的是通知编译器我们用的是xb) 添加头文件路径(Hardware、CMSIS、Library)。以后有别的添加则再添加。 Target中:

    选择ARM编译器为v6.16 否则会报错

  5. 在main.c中引入头文件stm32f1xx_hal.h (在hal.c中可找到)

  6. 最后编译即可。0错误0警告

3. HAL库结构初步分析

  • 以HAL库的串口为例来讲解

    1. 串口分为USART和UART 他们分别是同步通信和异步通信。一般我们用异步的

      所以这里我们添加uart.c的文件。

    2. hal库之中,串口包含三种方式: 轮询、中断、DMA。所以在库文件中必须添加DMA

      所以我们这里添加DMA.c的文件

  • 在HAL库中每个外设都有两个关键的部分:

    1. Private:(私有的),是HAL库内部自己调用的
    2. Exported:(对外的),我们的应用程序中去调用。Exported分为四个部分
      • types,各种Struct结构体,用于外设功能配置。对应了CubeMax软件的配置项
      • constants,上方各种Struct结构体中的成员的可以配置的选项
      • macro,宏定义,相当于直接对寄存器操作。因为在某些时候调用api反而效率不高
      • functions,API函数。

    这些是可以在文件中验证的。hal_uart.c中 可见

    我们对CubeMax的操作,实际上就是与这些结构体、成员变量一一对应的

    一个外设的相关结构体会被定义在一个总的结构体中。比如串口是UART_HandleTypedef

相关推荐
yuwinter7 分钟前
鸿蒙HarmonyOS学习笔记(2)
笔记·学习·harmonyos
为祖国添砖爪哇40 分钟前
【物联网原理与应用】实验二:红外传感实验
物联网
游走于计算机中摆烂的1 小时前
启动前后端分离项目笔记
java·vue.js·笔记
你可以叫我仔哥呀2 小时前
ElasticSearch学习笔记三:基础操作(一)
笔记·学习·elasticsearch
maxiumII2 小时前
Diving into the STM32 HAL-----DAC笔记
笔记·stm32·嵌入式硬件
美式小田5 小时前
单片机学习笔记 9. 8×8LED点阵屏
笔记·单片机·嵌入式硬件·学习
猫爪笔记5 小时前
前端:HTML (学习笔记)【2】
前端·笔记·学习·html
_不会dp不改名_5 小时前
HCIA笔记3--TCP-UDP-交换机工作原理
笔记·tcp/ip·udp
-一杯为品-6 小时前
【51单片机】程序实验5&6.独立按键-矩阵按键
c语言·笔记·学习·51单片机·硬件工程
雪兽软件7 小时前
商业物联网:拥抱生产力的未来
物联网