首页 > 其他分享 >STM32HAL库开发-了解HAL库(一)

STM32HAL库开发-了解HAL库(一)

时间:2024-01-11 11:34:00浏览次数:22  
标签:HAL USART STM32HAL NVIC UART 开发 InitStructure GPIO

HAL库借鉴了面向对象的设计思想,将外设驱动封装为对象,屏蔽了底层硬件,提高了开发效率,但程序执行效率较低。

HAL库的文件类型可认为分为以下两类

库文件:
    stm32f4xx_hal_ppp.c/.h            // 主要的外设或者模块的驱动源文件,包含了该外设的通用API
    stm32f4xx_hal_ppp_ex.c/.h        // 外围设备或模块驱动程序的扩展文件。这组文件中包含特定型号或者系列的芯片的特殊API。以及如果该特定的芯片内部有不同的实现方式,则该文件中的特殊API将覆盖_ppp中的通用API。
    stm32f4xx_hal.c/.h                // 此文件用于HAL初始化,并且包含DBGMCU、重映射和基于systick的时间延迟等相关的API
    其他库文件
用户级别文件:
    stm32f4xx_hal_msp_template.c    // 只有.c没有.h。它包含用户应用程序中使用的外设的MSP初始化和反初始化(主程序和回调函数)。使用者复制到自己目录下使用模板。
    stm32f4xx_hal_conf_template.h    // 用户级别的库配置文件模板。使用者复制到自己目录下使用
    system_stm32f4xx.c                // 此文件主要包含SystemInit()函数,该函数在刚复位及跳到main之前的启动过程中被调用。 **它不在启动时配置系统时钟(与标准库相反)**。 时钟的配置在用户文件中使用HAL API来完成。
    startup_stm32f4xx.s                // 芯片启动文件,主要包含堆栈定义,中断向量表等
    stm32f4xx_it.c/.h                // 中断服务函数的相关实现
    main.c/.h                        //main

HAL库对底层进行了封装,HAL库下用户代码处理可分为以下三部分

①句柄(ppp_HandleTypeDef)

②MSP(MCU Specific Package)

③回调函数(xxx_Callback)

1.句柄

为了实现各型号芯片HAL库的通用性,HAL库设计了统一的外设句柄类型:ppp_HandleTypeDef.(ppp代表外设名称)

与标准库中利用固件结构体变量+固件库Init函数实现初始化外设不同,HAL库通过定义ppp_HandleTypeDef的全局变量,针对需求配置结构体中成员即可

以USART1初始化为例,在库函数中:

//USART1端口配置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //速度50MHz
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
    GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10
//USART1 初始化设置
    USART_InitStructure.USART_BaudRate = bound;//波特率设置
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
    USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
    USART_InitStructure.USART_HardwareFlowControl =         
    USART_HardwareFlowControl_None;//无硬件数据流控制
    USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;    //收发模式
    USART_Init(USART1, &USART_InitStructure); //初始化串口1    
    USART_Cmd(USART1, ENABLE);  //使能串口1     
    //USART_ClearFlag(USART1, USART_FLAG_TC);   
#if EN_USART1_RX    
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断
    //Usart1 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;        //子优先级3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器
#endif    
}      

使用GPIO、USART、NVIC结构体变量完成了收发功能的串口初始化

而在HAL库中

   UART_HandleTypeDef Usart1Handle;        // 定义串口句柄

   UartHandle.Instance        = USART1;   // 初始化串口实例 USART1

   UartHandle.Init.BaudRate   = 9600;     // 设置波特率

   UartHandle.Init.WordLength = UART_WORDLENGTH_8B; // 8位数据位

   UartHandle.Init.StopBits   = UART_STOPBITS_1;   // 一个停止位

   UartHandle.Init.Parity     = UART_PARITY_NONE; // 奇偶校验位无

   UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE; // 硬件控制流无

   UartHandle.Init.Mode       = UART_MODE_TX_RX;    // RX和TX模式

   if(HAL_UART_Init(&UartHandle) != HAL_OK)        //使能结构体变量 

   {

     Error_Handler();

   }

同样是USART初始化结构体变量,需要定义为全局变量,其中 Usart1Handle就被称为串口的句柄,我们可以查看HAL库中串口结构体的成员

typedef struct
{
      USART_TypeDef                 *Instance;        /*!< UART registers base address        */
      UART_InitTypeDef              Init;             /*!< UART communication parameters      */
      uint8_t                       *pTxBuffPtr;      /*!< Pointer to UART Tx transfer Buffer */
      uint16_t                      TxXferSize;       /*!< UART Tx Transfer size              */
      uint16_t                      TxXferCount;      /*!< UART Tx Transfer Counter           */
      uint8_t                       *pRxBuffPtr;      /*!< Pointer to UART Rx transfer Buffer */
      uint16_t                      RxXferSize;       /*!< UART Rx Transfer size              */
      uint16_t                      RxXferCount;      /*!< UART Rx Transfer Counter           */  
      DMA_HandleTypeDef             *hdmatx;          /*!< UART Tx DMA Handle parameters      */ 
      DMA_HandleTypeDef             *hdmarx;          /*!< UART Rx DMA Handle parameters      */
      HAL_LockTypeDef               Lock;             /*!< Locking object                     */
      __IO HAL_UART_StateTypeDef    State;            /*!< UART communication state           */
      __IO uint32_t                 ErrorCode;        /*!< UART Error code                    */
}UART_HandleTypeDef;

HAL库结构体中提供了所有串口可以配置的参数。

句柄贯穿了整个USART收发的流程,如开启串口中断

HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);

 

标签:HAL,USART,STM32HAL,NVIC,UART,开发,InitStructure,GPIO
From: https://www.cnblogs.com/xujingxing/p/17958072

相关文章

  • 金蝶云星空快速二次开发框架
    金蝶云星空快速二次开发框架【VSEP.Zian.Kd.Extend】【VSEP.Zian.Kd.Extend】介绍环境:支持私有云和公有云可配置性强:统一的配置读取方式,类似springboot方式根据指定的账套加载不同的配置文件,框架会自动识别加载不同环境的参数可维护性高:可根据配置相关的WebApi框架实现在线调......
  • 使用devtoolset进行高效的编程开发
    随着编程语言和工具的不断发展,开发者们需要时刻保持对技术的更新和学习。而在Linux平台上,使用编程工具也需要一定的技巧和效率。本文将介绍devtoolset在编程开发中的使用,包括基本概念,安装,使用方法等等。当你完全掌握这些知识后,你将会在Linux上实现高效的编程开发。一、devtoolset......
  • 创新工具:2024年开发者必备的一款表格控件
    前言在现代工作环境中,信息的处理和管理是至关重要的。表格是一种常见的数据呈现和整理工具,被广泛应用于各行各业。然而,随着技术的不断发展,市场对表格控件的需求也越来越高。随着工作效率的重要性日益凸显,一款高效的表格控件成为了开发者们的首选,因此本文小编将从葡萄城公司的纯前......
  • WhatsApp自动点赞工具开发代码分享!
    在数字时代的浪潮下,社交媒体成为了人们日常生活中不可或缺的一部分,而在众多社交媒体平台中,WhatsApp以其强大的通讯功能和简洁的设计,成为了全球范围内的热门选择。不少开发者看到了商机,开发出各种辅助工具,其中尤以自动点赞工具最为受欢迎,本文将为你揭示如何开发一款简单的WhatsApp自......
  • 安卓开发板_基于联发科MTK8788平台平板电脑_安卓智能硬件定制
    联发科MT8788安卓核心板平台介绍:MTK8788设备具有集成的蓝牙、fm、wlan和gps模块,是一个高度集成的基带平台,包括调制解调器和应用处理子系统,启用LTE/LTE-A和C2K智能设备应用程序。该芯片集成了工作在2.0GHz的ARMCortex-A73、最高可达2.0GHz的ARMCortex-A53和功能强大的多标准视频编......
  • 软件测试/测试开发全日制培训|Pytest的异常处理
    前言在断言一些代码块或者函数时会引发意料之中的异常或者其他失败的异常导致程序无法运行时,使用raises捕获匹配到的异常可以让代码继续运行。Python的异常处理:try...except...else...finally...,示例如下:try:print("正常的操作")exceptTypeError:print("发生TypeError......
  • ios开发中:当一个 viewcontroller 中嵌套了一个 viewcontroller.view,pushViewcontrolle
    在iOS开发中,当你在一个UIViewController中嵌套另一个UIViewController的视图时,即使嵌套的视图能够正确显示,该嵌套的UIViewController实例可能不会被完全加入到视图控制器层次结构中。这可能导致一些问题,比如无法使用pushViewController:animated:方法进行导航。原因这种......
  • 软件测试/测试开发全日制|Pytest结合yaml实现数据驱动
    前言我们之前介绍过pytest的参数化,我们使用了@pytest.mark.parametrize(argnames,argvalues)来实现批量传送参数的目的,但是我们不进行数据驱动的话,我们一旦对数据进行变更,就需要在代码里对我们的参数进行逐一的修改,这对我们来说,是额外增加的工作量,而通过专门存储数据的文件来实现......
  • 全志T113开发板Qt远程调试
    1引言通常情况下工程师在调试Qt程序时,需要频繁制作镜像烧录到核心板来测试Qt程序是否完善,这样的操作既费时又费力。这时我们可以通过QtCreator设备功能,定义设备后,在x86_64虚拟机上交叉编译qt程序,将程序远程部署到arm64的机子上,然后远程调试,大大提高开发效率。2. 调试环境本文基于H......
  • 全志T113开发板Qt远程调试
    1引言 通常情况下工程师在调试Qt程序时,需要频繁制作镜像烧录到核心板来测试Qt程序是否完善,这样的操作既费时又费力。这时我们可以通过QtCreator设备功能,定义设备后,在x86_64虚拟机上交叉编译qt程序,将程序远程部署到arm64的机子上,然后远程调试,大大提高开发效率。  2. 调试......