HAL库常用的函数:

目录

HAL库:

1.GPIO常用函数:

1.HAL_GPIO_ReadPin(        )

 2.HAL_GPIO_WritePin(        )

3.HAL_GPIO_TogglePin(        )

4.HAL_GPIO_EXTI_IRQHandler(          )

5.HAL_GPIO_EXTI_Callback(        )

​编辑

2.UART常用函数:

1.HAL_UART_Init()

发送函数:

2.HAL_UART_Transmit()

3.HAL_UART_Transmit_IT( )

4.HAL_UART_Transmit_DMA( )

接收函数:

5.HAL_UART_Receive( )

6.HAL_UART_Receive_IT()

7.HAL_UART_Receive_DMA( )

UART中断处理函数

UART的中断回调函数:

中断接收回调函数示例:

3.SPI常用函数:

4.定时器常用函数:

1. HAL_TIM_Base_Init 函数

2.TIM_Base_InitTypeDef 这个结构体类型

3. HAL_TIM_Base_Start_IT

5.HAL_TIM_PWM_Init 函数

6.HAL_TIM_PWM_ConfigChannel 函数

7. HAL_TIM_PWM_Start 函数

8.预分配器PSC,计数器CNT,自动重装寄存器ARR,捕获比较寄存器CCR

示例代码:

9.HAL_TIM_IC_Init 函数

10.HAL_TIM_IC_ConfigChannel 函数

12.HAL_TIM_IC_Start_IT 函数

14.HAL_TIM_Encoder_Start():

15.HAL_TIM_Encoder_Stop():

16.__HAL_TIM_GET_COUNTER():

17.__HAL_TIM_IS_TIM_COUNTING_DOWN():

18.HAL_TIM_Encoder_Start_IT():

19.HAL_TIM_PeriodElapsedCallback():

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有关函数配置-优快云博客

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 枚举类型的值。

3. HAL_TIM_Base_Start_IT

函数 HAL_TIM_Base_Start_IT 函数是更新定时器中断和使能定时器的函数。

其声明如下: HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);

⚫ 函数描述: 该函数调用了__HAL_TIM_ENABLE_IT 和__HAL_TIM_ENABLE 两个函数宏定义,分别 是更新定时器中断和使能定时器的宏定义。

⚫ 函数形参: 形参 1 是 TIM_HandleTypeDef 结构体类型指针变量,即定时器句柄。

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

⚫ 注意事项: 下面分别列出单独使能/关闭定时器中断和使能/关闭定时器方法

__HAL_TIM_ENABLE_IT(htim, TIM_IT_UPDATE); /* 使能句柄指定的定时器更新中断 */ 
__HAL_TIM_DISABLE_IT (htim, TIM_IT_UPDATE); /* 关闭句柄指定的定时器更新中断 */ 
__HAL_TIM_ENABLE(htim); /* 使能句柄 htim 指定的定时器 */ 
__HAL_TIM_DISABLE(htim); /* 关闭句柄 htim 指定的定时器 */

定时器中断配置步骤

1)开启定时器时钟 HAL 中定时器使能是通过宏定义标识符来实现对相关寄存器操作的,方法如下: __HAL_RCC_TIMx_CLK_ENABLE(); /* x=1~14 */

2)初始化定时器参数,设置自动重装值,分频系数,计数方式等 定时器的初始化参数是通过定时器初始化函数 HAL_TIM_Base_Init 实现的。 注意:该函数会调用:HAL_TIM_Base_MspInit 函数,我们可以通过后者存放定时器时钟 和中断等初始化的代码。

3)使能定时器更新中断,开启定时器计数,配置定时器中断优先级 通过 HAL_TIM_Base_Start_IT 函数使能定时器更新中断和开启定时器计数。 通过 HAL_NVIC_EnableIRQ 函数使能定时器中断,通过 HAL_NVIC_SetPriority 函数设置 中断优先级。

4)编写中断服务函数 定时器中断服务函数为:TIMx_IRQHandler 等,当发生中断的时候,程序就会执行中断服 务函数。HAL 库提供了一个定时器中断公共处理函数 HAL_TIM_IRQHandler,该函数又会调用HAL_TIM_PeriodElapsedCallback 等一些回调函数,需要用户根据中断类型选择重定义对应的中 断回调函数来处理中断程序。

5.HAL_TIM_PWM_Init 函数

定时器的 PWM 输出模式初始化函数,其声明如下:

HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim);

⚫ 函数描述: 用于初始化定时器的 PWM 输出模式。

⚫ 函数形参: 形参 1 是 TIM_HandleTypeDef 结构体类型指针变量,基本定时器的时候已经介绍。

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

⚫ 注意事项: 该函数实现的功能以及使用方法和 HAL_TIM_Base_Init 类似,作用都是初始化定时器的 ARR 和 PSC 等参数。为什么 HAL 库要提供这个函数而不直接让我们使用 HAL_TIM_Base_Init 函数呢?这是因为 HAL 库为定时器的针对 PWM 输出定义了单独的 MSP 回调函数HAL_TIM_PWM_MspInit,所以当我们调用 HAL_TIM_PWM_Init 进行 PWM 初始化之后,该函 数内部会调用 MSP 回调函数 HAL_TIM_PWM_MspInit。当我们使用 HAL_TIM_Base_Init 初始化定时器参数的时候,它内部调用的回调函数是 HAL_TIM_Base_MspInit,这里大家注意区分。

6.HAL_TIM_PWM_ConfigChannel 函数

定时器的 PWM 通道设置初始化函数。其声明如下

HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, 
TIM_OC_InitTypeDef *sConfig, uint32_t Channel); 

⚫ 函数描述: 该函数用于设置定时器的 PWM 通道。

⚫ 函数形参: 形参 1 是 TIM_HandleTypeDef 结构体类型指针变量,用于配置定时器基本参数。 形参 2 是 TIM_OC_InitTypeDef 结构体类型指针变量,用于配置定时器的输出比较参数。 重点了解一下 TIM_OC_InitTypeDef 结构体指针类型,其定义如下:

typedef struct 
{ 
 uint32_t OCMode; /* 输出比较模式选择,寄存器的时候说过了,共 8 种模式 */ 
 uint32_t Pulse; /* 设置比较值 */ 
 uint32_t OCPolarity; /* 设置输出比较极性 */ 
 uint32_t OCNPolarity; /* 设置互补输出比较极性 */ 
 uint32_t OCFastMode; /* 使能或失能输出比较快速模式 */ 
 uint32_t OCIdleState; /* 选择空闲状态下的非工作状态(OC1 输出) */ 
 uint32_t OCNIdleState; /* 设置空闲状态下的非工作状态(OC1N 输出) */ 
} TIM_OC_InitTypeDef; 

我们重点关注前三个结构体成员。成员变量 OCMode 用来设置模式,这里我们设置为 PWM 模式 1。成员变量 Pulse 用来设置捕获比较值。成员变量 TIM_OCPolarity 用来设置输出极性。 其他成员 TIM_OutputNState,TIM_OCNPolarity,TIM_OCIdleState 和 TIM_OCNIdleState 后面 用到再介绍。 形参 3 是定时器通道,范围:TIM_CHANNEL_1 到 TIM_CHANNEL_4。比如定时器 14 只 有 2 个通道,那选择范围就只有 TIM_CHANNEL_1~2,所以要根据具体情况选择。

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

7. HAL_TIM_PWM_Start 函数

定时器的 PWM 输出启动函数,其声明如下:

HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel); 

⚫ 函数描述: 用于使能通道输出和启动计数器,即启动 PWM 输出。

⚫ 函数形参: 形参 1 是 TIM_HandleTypeDef 结构体类型指针变量。 形参 2 是定时器通道,范围:TIM_CHANNEL_1 到 TIM_CHANNEL_4。

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

⚫ 注意事项: 对于单独使能定时器的方法,在上一章定时器实验我们已经讲解。实际上,HAL 库也同样 提供了单独使能定时器的输出通道函数,函数为:

void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, 
uint32_t ChannelState); 

HAL_TIM_PWM_Start 函数内部也调用了该函数

8.预分配器PSC,计数器CNT,自动重装寄存器ARR,捕获比较寄存器CCR

HAL前面是两道下划线__

在HAL库代码里面进行过重定义

示例代码:
TIM_HandleTypeDef htim; // 定时器句柄  
  
void MX_TIM_Init(void) {  
    // 初始化定时器为PWM模式  
    TIM_OC_InitTypeDef sConfigOC = {0};  
    htim.Instance = TIMx; // TIMx为所选的定时器实例,如TIM1、TIM2等  
    htim.Init.Prescaler = 83; // 预分频器值,根据系统时钟和所需PWM频率计算得出  
    htim.Init.CounterMode = TIM_COUNTERMODE_UP; // 计数器模式  
    htim.Init.Period = 999; // 自动重装载值,决定PWM信号的周期  
    htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 时钟分频  
    htim.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; // 自动重装载预装载使能  
    if (HAL_TIM_PWM_Init(&htim) != HAL_OK) {  
        // 初始化错误处理  
    }  
    sConfigOC.OCMode = TIM_OCMODE_PWM1; // PWM模式1  
    sConfigOC.Pulse = 499; // 初始脉冲宽度,决定占空比  
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; // 输出极性为高电平有效  
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; // 快速模式禁用  
    if (HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) {  
        // 配置错误处理  
    }  
    HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1); // 启动PWM输出  
}  
  
int main(void) {  
    HAL_Init(); // 初始化HAL库  
    SystemClock_Config(); // 配置系统时钟  
    MX_GPIO_Init(); // 初始化GPIO(如果需要)  
    MX_TIM_Init(); // 初始化定时器为PWM模式  
  
    while (1) {  
        // 主循环,可以在此处调整PWM信号的占空比或频率  
        // 例如:__HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_1, newCompareValue);  
    }  
}
#include "stm32fxx_hal.h" // 包含正确的HAL头文件,根据你的STM32型号选择  
  
TIM_HandleTypeDef htim; // 定时器句柄  
  
// 中断回调函数  
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {  
    if (htim->Instance == TIMx) { // 检查是否为所选的定时器实例  
        // 在这里处理中断事件,比如更新PWM占空比  
        // 例如:__HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_1, newCompareValue);  
        // 注意:newCompareValue 应该是你希望设置的新占空比对应的比较值  
  
        // 为了演示,我们简单地切换占空比(假设初始占空比为50%)  
        static uint16_t compareValue = 499; // 初始占空比50%(对于999的ARR值)  
        compareValue = (compareValue == 0) ? 499 : 0; // 切换占空比  
        __HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_1, compareValue);  
    }  
}  
  
void MX_TIM_Init(void) {  
    // 初始化定时器为PWM模式  
    TIM_OC_InitTypeDef sConfigOC = {0};  
    htim.Instance = TIMx; // TIMx为所选的定时器实例,如TIM1、TIM2等  
    htim.Init.Prescaler = 83; // 预分频器值,根据系统时钟和所需PWM频率计算得出  
    htim.Init.CounterMode = TIM_COUNTERMODE_UP; // 计数器模式  
    htim.Init.Period = 999; // 自动重装载值,决定PWM信号的周期  
    htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 时钟分频  
    htim.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; // 自动重装载预装载使能  
    if (HAL_TIM_PWM_Init(&htim) != HAL_OK) {  
        // 初始化错误处理  
        Error_Handler();  
    }  
    sConfigOC.OCMode = TIM_OCMODE_PWM1; // PWM模式1  
    sConfigOC.Pulse = 499; // 初始脉冲宽度,决定占空比50%  
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; // 输出极性为高电平有效  
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; // 快速模式禁用  
    if (HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) {  
        // 配置错误处理  
        Error_Handler();  
    }  
  
    // 配置定时器中断  
    HAL_TIM_Base_Start_IT(&htim); // 启动定时器基础中断(周期结束时产生中断)  
  
    // 注意:如果你使用的是HAL库的旧版本,可能需要单独配置NVIC中断优先级和使能中断  
    // 例如:  
    // HAL_NVIC_SetPriority(TIMx_IRQn, 0, 0); // 设置中断优先级  
    // HAL_NVIC_EnableIRQ(TIMx_IRQn); // 使能中断  
  
    // 启动PWM输出  
    HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1);  
}  
  
// 中断服务函数(如果你没有使用HAL库的中断回调机制)  
// void TIMx_IRQHandler(void) {  
//     HAL_TIM_IRQHandler(&htim); // 调用HAL库的中断处理函数  
// }  
  
int main(void) {  
    HAL_Init(); // 初始化HAL库  
    SystemClock_Config(); // 配置系统时钟  
    MX_GPIO_Init(); // 初始化GPIO(如果需要)  
    MX_TIM_Init(); // 初始化定时器为PWM模式并配置中断  
  
    while (1) {  
        // 主循环,可以在此处执行其他任务  
        // PWM占空比的更新将在中断回调函数中处理  
    }  
}  
  
// 错误处理函数(根据你的需求实现)  
void Error_Handler(void) {  
    // 错误处理代码,比如进入死循环或重置系统  
    while (1) {  
    }  
}
9.HAL_TIM_IC_Init 函数

定时器的输入捕获模式初始化函数,其声明如下:

HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim); 

⚫ 函数描述: 用于初始化定时器的输入捕获模式。

⚫ 函数形参: 形参 1 是 TIM_HandleTypeDef 结构体类型指针变量,介绍基本定时器的时候已经介绍。

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

⚫ 注意事项: 与 PWM 输出实验一样,当使用定时器做输入捕获功能时,在 HAL 库中并不使用定时器初 始化函数 HAL_TIM_Base_Init 来实现,而是使用输入捕获特定的定时器初始化函数 HAL_TIM_IC_Init。该函数内部还会调用输入捕获初始化回调函数 HAL_TIM_IC_MspInit 来初 始化输入通道对应的 GPIO(复用),以及输入捕获相关的配置

10.HAL_TIM_IC_ConfigChannel 函数

定时器的输入捕获通道设置初始化函数。其声明如下:

HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, 
TIM_IC_InitTypeDef *sConfig, uint32_t Channel); 

⚫ 函数描述: 该函数用于设置定时器的输入捕获通道。

⚫ 函数形参:

形参 1 是 TIM_HandleTypeDef 结构体类型指针变量,用于配置定时器基本参数。 形参 2 是 TIM_IC_InitTypeDef 结构体类型指针变量,用于配置定时器的输入捕获参数。 重点了解一下 TIM_IC_InitTypeDef 结构体指针类型,其定义如下

typedef struct 
{ 
 uint32_t ICPolarity; /* 输入捕获触发方式选择,比如上升、下降和双边沿捕获 */ 
 uint32_t ICSelection; /* 输入捕获选择,用于设置映射关系 */ 
 uint32_t ICPrescaler; /* 输入捕获分频系数 */ 
 uint32_t ICFilter; /* 输入捕获滤波器设置 */ 
} TIM_IC_InitTypeDef;

形参 3 是定时器通道,范围:TIM_CHANNEL_1 到 TIM_CHANNEL_4。

⚫ 函数返回值:

HAL_StatusTypeDef 枚举类型的值。

12.HAL_TIM_IC_Start_IT 函数

启动定时器输入捕获模式函数,其声明如下:

HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, 
uint32_t Channel); 

⚫ 函数描述: 用于启动定时器的输入捕获模式,且开启输入捕获中断。

⚫ 函数形参: 形参 1 是 TIM_HandleTypeDef 结构体类型指针变量。 形参 2 是定时器通道,范围:TIM_CHANNEL_1 到 TIM_CHANNEL_4。

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

⚫ 注意事项: 如果我们不需要开启输入捕获中断,只是开启输入捕获功能,HAL 库函数为:

HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel); 

13.HAL_TIM_Encoder_Init()

  • 此函数用于初始化定时器以编码器模式工作。它配置定时器的相关参数,如输入通道、预分频器、自动重装载值等,以适应编码器的信号特性。

14.HAL_TIM_Encoder_Start()

此函数用于启动定时器的编码器模式。它使定时器开始接收并处理来自编码器的信号,从而进行计数和方向判断。

15.HAL_TIM_Encoder_Stop()

此函数用于停止定时器的编码器模式。它停止定时器对编码器信号的接收和处理。

16.__HAL_TIM_GET_COUNTER()

此函数用于获取定时器的当前计数值。在编码器模式下,这个计数值反映了编码器的脉冲数,从而可以计算出编码器的旋转角度或位移。

17.__HAL_TIM_IS_TIM_COUNTING_DOWN()

此函数用于判断定时器是否在倒计时(即判断编码器的旋转方向)。在编码器模式下,如果定时器在倒计时,通常意味着编码器在反向旋转;如果定时器在正计数,则意味着编码器在正向旋转。

18.HAL_TIM_Encoder_Start_IT()

此函数用于以中断方式启动定时器的编码器模式。它使定时器在接收到编码器信号时产生中断,从而可以在中断服务函数中处理编码器的数据。

19.HAL_TIM_PeriodElapsedCallback()

此函数是定时器中断的回调函数。当定时器达到预设的周期或编码器产生一定的脉冲数时,此函数会被调用。在编码器模式下,可以在此函数中读取编码器的计数值并重置计数器。

TIM_HandleTypeDef htim; // 定时器句柄  
  
void MX_TIM_Init(void) {  
    // 初始化定时器为编码器模式  
    TIM_Encoder_InitTypeDef sConfig = {0};  
    htim.Instance = TIMx; // TIMx为所选的定时器实例,如TIM1、TIM2等  
    htim.Init.Prescaler = 0; // 预分频器值  
    htim.Init.CounterMode = TIM_COUNTERMODE_UP; // 计数器模式  
    htim.Init.Period = 0xFFFF; // 自动重装载值  
    htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 时钟分频  
    htim.Init.RepetitionCounter = 0; // 重复计数器值  
    htim.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; // 自动重装载预装载使能  
    if (HAL_TIM_Encoder_Init(&htim, &sConfig) != HAL_OK) {  
        // 初始化错误处理  
    }  
}  
  
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {  
    if (htim->Instance == TIMx) { // 检查是否为所选的定时器实例  
        short encoder_count = (short)__HAL_TIM_GET_COUNTER(htim); // 获取编码器的计数值  
        __HAL_TIM_SET_COUNTER(htim, 0); // 重置计数器  
        char direction = __HAL_TIM_IS_TIM_COUNTING_DOWN(htim); // 判断编码器的旋转方向  
        // 在此处处理编码器的数据  
    }  
}  
  
int main(void) {  
    HAL_Init(); // 初始化HAL库  
    SystemClock_Config(); // 配置系统时钟  
    MX_GPIO_Init(); // 初始化GPIO  
    MX_TIM_Init(); // 初始化定时器为编码器模式  
    HAL_TIM_Encoder_Start_IT(&htim, TIM_CHANNEL_ALL); // 以中断方式启动编码器模式  
  
    while (1) {  
        // 主循环  
    }  
}

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;              /* 返回键值 */
}

HAL是针对STM32系列芯片开发的一套驱动,提供了一系列的API函数,方便开发者对芯片进行配置和控制。下面是几个HAL的核心函数的介绍和代码示例: 1. GPIO控制函数 GPIO控制函数用于对芯片的GPIO口进行配置和控制。常用函数包括GPIO_Init()、GPIO_ReadPin()和GPIO_WritePin()。 ```c // GPIO初始化函数 void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init); // 读取GPIO口的电平 GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); // 设置GPIO口的电平 void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); ``` 2. 中断控制函数 中断控制函数用于对芯片的中断进行配置和控制。常用函数包括HAL_NVIC_SetPriority()、HAL_NVIC_EnableIRQ()和HAL_NVIC_DisableIRQ()。 ```c // 设置中断优先级 void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority); // 使能中断 void HAL_NVIC_EnableIRQ(IRQn_Type IRQn); // 禁止中断 void HAL_NVIC_DisableIRQ(IRQn_Type IRQn); ``` 3. 定时器控制函数 定时器控制函数用于对芯片的定时器进行配置和控制。常用函数包括HAL_TIM_Base_Init()、HAL_TIM_Base_Start()和HAL_TIM_Base_Stop()。 ```c // 初始化定时器 HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim); // 启动定时器 HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim); // 停止定时器 HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim); ``` 以上是HAL的一些核心函数和代码示例,开发者可以根据自己的需求进行选择和使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值