HAL库常用的函数:

目录

HAL库:

1.GPIO常用函数:

[1.HAL_GPIO_ReadPin( )](#1.HAL_GPIO_ReadPin( ))

[2.HAL_GPIO_WritePin( )](#2.HAL_GPIO_WritePin( ))

[3.HAL_GPIO_TogglePin( )](#3.HAL_GPIO_TogglePin( ))

[4.HAL_GPIO_EXTI_IRQHandler( )](#4.HAL_GPIO_EXTI_IRQHandler( ))

[5.HAL_GPIO_EXTI_Callback( )](#5.HAL_GPIO_EXTI_Callback( ))

2.UART常用函数:

1.HAL_UART_Init()

发送函数:

2.HAL_UART_Transmit()

[3.HAL_UART_Transmit_IT( )](#3.HAL_UART_Transmit_IT( ))

[4.HAL_UART_Transmit_DMA( )](#4.HAL_UART_Transmit_DMA( ))

接收函数:

[5.HAL_UART_Receive( )](#5.HAL_UART_Receive( ))

6.HAL_UART_Receive_IT()

[7.HAL_UART_Receive_DMA( )](#7.HAL_UART_Receive_DMA( ))

UART中断处理函数

UART的中断回调函数:

中断接收回调函数示例:

3.SPI常用函数:

4.定时器常用函数:

[1. HAL_TIM_Base_Init 函数](#1. HAL_TIM_Base_Init 函数)

[2.TIM_Base_InitTypeDef 这个结构体类型](#2.TIM_Base_InitTypeDef 这个结构体类型)

1.按键扫描函数


HAL库:

1.GPIO常用函数:

HAL_GPIO_Init()

这个函数主要用来初始化我们需要用到的引脚,设置其工作频率、工作模式、上下拉等参数。如果使用CubeMX配置工程,所有参数在Cube中调配,函数自动在工程中生成,无需要手动初始化。

HAL_GPIO_DeInit()

HAL_GPIO_Init能够实现对GPIO的初始化,那么HAL_GPIO_DeInit就是与其相反的操作,能够将GPIO口恢复至默认状态,即各个寄存器复位时的值

1.HAL_GPIO_ReadPin( )

读取我们想要知道的引脚的电平状态、函数返回值类型为GPIO_PinState = 0或1。

复制代码
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
例:pin_State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
2.HAL_GPIO_WritePin( )

给某个引脚写0或1,GPIO_PIN_RESET 也可写成0;GPIO_PIN_RSET 也可写成1

复制代码
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
例:HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9,GPIO_PIN_RESET)
3.HAL_GPIO_TogglePin( )

翻转某个引脚的电平状态

复制代码
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
例:HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
4.HAL_GPIO_EXTI_IRQHandler( )

这个函数是外部中断服务函数,用来响应外部中断的触发,函数实体里面有两个功能,1是清除中断标记位,2是调用下面要介绍的回调函数。如果使用CUbeMX生产,无需自己手写,直需要在main.c中重新定义相应的回调函数即可

复制代码
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);//配置好CubeMX后,自动生产
5.HAL_GPIO_EXTI_Callback( )

中断回调函数,可以理解为中断函数具体要响应的动作。

复制代码
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

2.UART常用函数:

1.HAL_UART_Init()
  • 功能:初始化UART外设。

  • 参数:huart是指向UART_HandleTypeDef结构体的指针,该结构体包含了UART模块的配置信息。

  • 返回值:返回一个枚举类型的值,表示初始化是否成功。可能的返回值包括HAL_OK(成功)、HAL_ERROR(错误)、HAL_BUSY(正忙,配置失败的一种)和HAL_TIMEOUT(超时,配置失败的一种)。

    HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)

发送函数:

2.HAL_UART_Transmit()
  • 功能:发送指定长度的数据。

  • 参数:

    • huart:指向UART_HandleTypeDef结构体的指针。
    • pData:指向要发送的数据的指针。
    • Size:要发送的数据的长度。
    • Timeout:发送超时时间。
  • 返回值:返回一个枚举类型的值,表示发送是否成功。

    HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

3.HAL_UART_Transmit_IT( )
  • 功能:以中断方式发送指定长度的数据。

  • 参数:与HAL_UART_Transmit相同。

  • 返回值:返回一个枚举类型的值,表示发送是否成功启动。

    HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

4.HAL_UART_Transmit_DMA( )
  • 功能:以DMA(直接存储器访问)方式发送指定长度的数据。

  • 参数:与HAL_UART_Transmit相同。

  • 返回值:返回一个枚举类型的值,表示发送是否成功启动。

    HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

接收函数:

5.HAL_UART_Receive( )
  • 功能:接收指定长度的数据。

  • 参数:与HAL_UART_Transmit相同。

  • 返回值:返回一个枚举类型的值,表示接收是否成功。

    HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

6.HAL_UART_Receive_IT()
  • 功能:以中断方式接收指定长度的数据。

  • 参数:与HAL_UART_Transmit相同。

  • 返回值:返回一个枚举类型的值,表示接收是否成功启动。

    HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

7.HAL_UART_Receive_DMA( )
  • 功能:以DMA方式接收指定长度的数据。

  • 参数:与HAL_UART_Transmit相同。

  • 返回值:返回一个枚举类型的值,表示接收是否成功启动。

    HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

UART中断处理函数

UART中断处理函数通常是由HAL库内部调用的,但用户需要编写相应的中断服务函数(ISR)和回调函数来处理UART中断。例如,当使用中断方式发送或接收数据时,用户需要编写ISR来调用HAL库提供的HAL_UART_IRQHandler函数,并在回调函数中处理发送或接收完成的事件。

UART的中断回调函数:

  • HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart): 当UART传输完成时调用。
  • HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart): 当UART接收完成时调用。
  • HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart): 当UART传输一半数据时调用(如果使能了此中断)。
  • HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart): 当UART接收一半数据时调用(如果使能了此中断)。
  • HAL_UART_ErrorCallback(UART_HandleTypeDef *huart): 当UART发生错误时调用(如噪声、帧错误、溢出等)。
复制代码
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)  
{  
    if (huart->Instance == USART1)  
    {  
        // 处理USART1传输完成的事件  
        // ...  
    }  
}  
  
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)  
{  
    if (huart->Instance == USART1)  
    {  
        // 处理USART1接收完成的事件  
        // ...  
    }  
}

示例代码:

复制代码
UART_HandleTypeDef huart1;  
uint8_t txData[] = "Hello, UART!";  
uint8_t rxData[10];  
  
// UART初始化  
huart1.Instance = USART1;  
huart1.Init.BaudRate = 115200;  
huart1.Init.WordLength = UART_WORDLENGTH_8B;  
huart1.Init.StopBits = UART_STOPBITS_1;  
huart1.Init.Parity = UART_PARITY_NONE;  
huart1.Init.Mode = UART_MODE_TX_RX;  
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;  
huart1.Init.OverSampling = UART_OVERSAMPLING_16;  
HAL_UART_Init(&huart1);  
  
// 发送数据  
HAL_UART_Transmit(&huart1, txData, strlen((char *)txData), HAL_MAX_DELAY);  
  
// 接收数据  
HAL_UART_Receive(&huart1, rxData, 10, HAL_MAX_DELAY);

void USART1_IRQHandler(void)  
{  
    HAL_UART_IRQHandler(&huart1);  
}

HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); // 设置中断优先级  
HAL_NVIC_EnableIRQ(USART1_IRQn);         // 使能USART1中断
中断接收回调函数示例:
复制代码
uint8_t dataRcvd;
void main(void)
{
    HAL_UART_Receive_IT(&huart1,&dataRcvd,1);
    while(1)
    {

    }


}

void HAL_URAT_RxCpltCallback()
{
    if(huart->Instance == USART1)
    {
    }
    else if( )
    {
    }
    
    HAL_UART_Receive_IT(&huart1,&dataRcvd,1);
}

3.SPI常用函数:

A47 STM32_HAL库函数 之 SPI通用驱动 所有函数的介绍及使用_hal库spi有关函数配置-CSDN博客

HAL_MAX_DELAY

4.定时器常用函数:

1. HAL_TIM_Base_Init 函数

定时器的初始化函数,其声明如下:

HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim);

⚫ 函数描述: 用于初始化定时器。

⚫ 函数形参: 形参 1 是 TIM_HandleTypeDef 结构体类型指针变量(亦称定时器句柄),结构体定义如下:

复制代码
typedef struct {

TIM_TypeDef *Instance; /* 外设寄存器基地址 */

TIM_Base_InitTypeDef Init; /* 定时器初始化结构体*/

HAL_TIM_ActiveChannel Channel; /* 定时器通道 */

DMA_HandleTypeDef *hdma[7]; /* DMA 管理结构体 */

HAL_LockTypeDef Lock; /* 锁定资源 */

__IO HAL_TIM_StateTypeDef State; /* 定时器状态 */

__IO HAL_TIM_ChannelStateTypeDef ChannelState;

/* 定时器通道状态 */

__IO HAL_TIM_ChannelStateTypeDef ChannelNState; /* 定时器互补通道状态 */

__IO HAL_TIM_DMABurstStateTypeDef DMABurstState; /* DMA 溢出状态 */
 }TIM_HandleTypeDef;

1)Instance:指向定时器寄存器基地址。

2)Init:定时器初始化结构体,用于配置定时器的相关参数。

3)Channel:定时器的通道选择,基本定时器没有该功能。

4)hdma[7]:用于配置定时器的 DMA 请求。

5)Lock:ADC 锁资源。

6)State:定时器工作状态。

7)ChannelState/ChannelNState:定时器通道/互补通道工作状态。

8)DMABurstState:DMA 溢出状态。

2.TIM_Base_InitTypeDef 这个结构体类型
复制代码
typedef struct 
{ 
 uint32_t Prescaler; /* 预分频系数 */ 
 uint32_t CounterMode; /* 计数模式 */ 
 uint32_t Period; /* 自动重载值 ARR */ 
 uint32_t ClockDivision; /* 时钟分频因子 */ 
 uint32_t RepetitionCounter; /* 重复计数器 */ 
 uint32_t AutoReloadPreload; /* 自动重载预装载使能 */ 
} TIM_Base_InitTypeDef;

1)Prescaler:预分频系数,即写入预分频寄存器的值,范围 0 到 65535。

2)CounterMode:计数器计数模式,这里基本定时器只能向上计数。

3)Period:自动重载值,即写入自动重载寄存器的值,范围 0 到 65535。

4)ClockDivision:时钟分频因子,也就是定时器时钟频率 CK_INT 与数字滤波器所使用的采样 时钟之间的分频比,基本定时器没有此功能。

5)RepetitionCounter:设置重复计数器寄存器的值,用在高级定时器中。

6)AutoReloadPreload:自动重载预装载使能,即控制寄存器 1 (TIMx_CR1)的 ARPE 位。

⚫ 函数返回值: HAL_StatusTypeDef 枚举类型的值。

1.按键扫描函数

复制代码
#define KEY0        HAL_GPIO_ReadPin(KEY0_GPIO_PORT, KEY0_GPIO_PIN)     /* 读取KEY0引脚 */
#define KEY1        HAL_GPIO_ReadPin(KEY1_GPIO_PORT, KEY1_GPIO_PIN)     /* 读取KEY1引脚 */
#define KEY2        HAL_GPIO_ReadPin(KEY2_GPIO_PORT, KEY2_GPIO_PIN)     /* 读取KEY2引脚 */
#define WK_UP       HAL_GPIO_ReadPin(WKUP_GPIO_PORT, WKUP_GPIO_PIN)     /* 读取WKUP引脚 */


#define KEY0_PRES    1              /* KEY0按下 */
#define KEY1_PRES    2              /* KEY1按下 */
#define KEY2_PRES    3              /* KEY2按下 */
#define WKUP_PRES    4              /* KEY_UP按下(即WK_UP) */

void key_init(void);                /* 按键初始化函数 */
uint8_t key_scan(uint8_t mode);     /* 按键扫描函数 */

/**
 * @brief       按键扫描函数
 * @note        该函数有响应优先级(同时按下多个按键): WK_UP > KEY2 > KEY1 > KEY0!!
 * @param       mode:0 / 1, 具体含义如下:
 *   @arg       0,  不支持连续按(当按键按下不放时, 只有第一次调用会返回键值,
 *                  必须松开以后, 再次按下才会返回其他键值)
 *   @arg       1,  支持连续按(当按键按下不放时, 每次调用该函数都会返回键值)
 * @retval      键值, 定义如下:
 *              KEY0_PRES, 1, KEY0按下
 *              KEY1_PRES, 2, KEY1按下
 *              KEY2_PRES, 3, KEY2按下
 *              WKUP_PRES, 4, WKUP按下
 */
uint8_t key_scan(uint8_t mode)
{
    static uint8_t key_up = 1;  /* 按键按松开标志 */
    uint8_t keyval = 0;

    if (mode) key_up = 1;       /* 支持连按 */

    if (key_up && (KEY0 == 0 || KEY1 == 0 || KEY2 == 0 || WK_UP == 1))  /* 按键松开标志为1, 且有任意一个按键按下了 */
    {
        delay_ms(10);           /* 去抖动 */
        key_up = 0;

        if (KEY0 == 0)  keyval = KEY0_PRES;

        if (KEY1 == 0)  keyval = KEY1_PRES;

        if (KEY2 == 0)  keyval = KEY2_PRES;

        if (WK_UP == 1) keyval = WKUP_PRES;
    }
    else if (KEY0 == 1 && KEY1 == 1 && KEY2 == 1 && WK_UP == 0)         /* 没有任何按键按下, 标记按键松开 */
    {
        key_up = 1;
    }

    return keyval;              /* 返回键值 */
}
相关推荐
西岸行者12 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意12 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码12 天前
嵌入式学习路线
学习
毛小茛12 天前
计算机系统概论——校验码
学习
babe小鑫12 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms12 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下12 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。12 天前
2026.2.25监控学习
学习
im_AMBER12 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J12 天前
从“Hello World“ 开始 C++
c语言·c++·学习