STM32HAL库常用函数速查手册(V1.0.0.20221019_BETA)
前言
写程序时想不起来函数很麻烦,于是做了这么一个手册,常用的一些部分都加了注释标注了中文,搜集资料主要来源于CSDN和官方手册,主要用于速查常用函数以及一些常用代码。关于使用STM32CubeMX配置相关步骤以及各种外设寄存器请查阅其他教程及官方资料。
---张百川 2022.10.19
目录
0x01 GPIO
GPIO定义的全部函数
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);
void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);
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);
GPIO_InitTypeDef结构体定义
typedef struct
{
uint32_t Pin; /*!< 选择引脚
*/
uint32_t Mode; /*!< 设置引脚模式
*/
uint32_t Pull; /*!< 引脚是否上拉或下拉
*/
uint32_t Speed; /*!< 设置引脚速度
*/
} GPIO_InitTypeDef;
1.HAL_GPIO_Init
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);
功能: GPIO初始化
实例:
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
2.HAL_GPIO_DeInit
void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);
功能:在函数初始化之后的引脚恢复成默认的状态,即各个寄存器复位时的值
实例:
HAL_GPIO_Init(GPIOC, GPIO_PIN_4);
3.HAL_GPIO_ReadPin
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:读取引脚的电平状态、函数返回值为0或1
实例:
HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4);
4.HAL_GPIO_WritePin
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
功能:引脚写0或1
实例:
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4,0);
5.HAL_GPIO_TogglePin
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
翻转引脚的电平状态
实例:
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_4); //常用在LED上
6.HAL_GPIO_LockPin
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:锁住引脚电平,比如说一个管脚的当前状态是1,当这个管脚电平变化时保持锁定时的值。
实例:
HAL_GPIO_LockPin(GPIOC, GPIO_PIN_4);
7.HAL_GPIO_EXTI_IRQHandler
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
功能: 外部中断服务函数,清除中断标志位
实例:
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
8.HAL_GPIO_EXTI_Callback
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
功能: 中断回调函数,可以理解为中断函数具体要响应的动作。
实例:
HAL_GPIO_EXTI_Callback(GPIO_PIN_4);
0x02 UART
UART结构体定义
typedef struct __UART_HandleTypeDef
{
USART_TypeDef *Instance; /*!< UART 寄存器地址 */
UART_InitTypeDef Init; /*!< UART 通信参数 */
UART_AdvFeatureInitTypeDef AdvancedInit; /*!< UART高级功能初始化参数 */
uint8_t *pTxBuffPtr; /*!< 指向UART Tx传输缓冲区的指针 */
uint16_t TxXferSize; /*!< UART Tx传输大小 */
__IO uint16_t TxXferCount; /*!< UART Tx传输计数器 */
uint8_t *pRxBuffPtr; /*!< 指向UART Rx传输缓冲区的指针 */
uint16_t RxXferSize; /*!< UART Rx传输大小 */
__IO uint16_t RxXferCount; /*!< UART Rx传输计数器 */
uint16_t Mask; /*!< UART Rx RDR register mask */
uint32_t FifoMode; /*!< Specifies if the FIFO mode is being used.
This parameter can be a value of @ref UARTEx_FIFO_mode. */
uint16_t NbRxDataToProcess; /*!< Number of data to process during RX ISR execution */
uint16_t NbTxDataToProcess; /*!< Number of data to process during TX ISR execution */
__IO HAL_UART_RxTypeTypeDef ReceptionType; /*!< Type of ongoing reception */
void (*RxISR)(struct __UART_HandleTypeDef *huart); /*!< Function pointer on Rx IRQ handler */
void (*TxISR)(struct __UART_HandleTypeDef *huart); /*!< Function pointer on Tx IRQ handler */
DMA_HandleTypeDef *hdmatx; /*!< UART Tx DMA句柄参数 */
DMA_HandleTypeDef *hdmarx; /*!< UART Rx DMA句柄参数 */
HAL_LockTypeDef Lock; /*!< 锁定对象(项目) */
__IO HAL_UART_StateTypeDef gState; /*!< 与全局句柄管理相关的UART状态信息,也与Tx操作相关。这个参数
可以是@ref HAL_UART_StateTypeDef */
__IO HAL_UART_StateTypeDef RxState; /*!< 与Rx操作相关的UART状态信息。这参数可以是 @ref HAL_UART_StateTypeDef的值 */
__IO uint32_t ErrorCode; /*!< UART Error code */
} UART_HandleTypeDef;
1.串口发送/接收函数
HAL_UART_Transmit(); //串口发送数据,使用超时管理机制
HAL_UART_Receive(); //串口接收数据,使用超时管理机制
HAL_UART_Transmit_IT(); //串口中断模式发送
HAL_UART_Receive_IT(); //串口中断模式接收
HAL_UART_Transmit_DMA();//串口DMA模式发送
HAL_UART_Transmit_DMA();//串口DMA模式接收
这几个函数的参数基本一致
串口发送数据:
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
功能:串口发送指定长度的数据。如果超时没发送完成,则不再发送,返回超时标志(HAL_TIMEOUT)。
参数:
UART_HandleTypeDef *huart UATR的别名 如 : UART_HandleTypeDef huart1; 别名就是huart1
*pData 需要发送的数据
Size 发送的字节数
Timeout 最大发送时间,发送数据超过该时间退出发送
举例:
HAL_UART_Transmit(&huart1, (uint8_t *)ZZX, 3, 0xffff); //串口发送三个字节数据,最大传输时间0xffff
中断接收数据:
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
功能:串口中断接收,以中断方式接收指定长度数据。
大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。接收到数据时,会触发串口中断。
再然后,串口中断函数处理,直到接收到指定长度数据,而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)
参数:
UART_HandleTypeDef *huart UATR的别名 如 : UART_HandleTypeDef huart1; 别名就是huart1
*pData 接收到的数据存放地址
Size 接收的字节数
举例:
HAL_UART_Receive_IT(&huart1,(uint8_t *)&value,1); //中断接收一个字符,存储到value中
2.串口中断函数
HAL_UART_IRQHandler(UART_HandleTypeDef *huart); //串口中断处理函数
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); //串口发送中断回调函数
HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); //串口发送一半中断回调函数(用的较少)
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); //串口接收中断回调函数
HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//串口接收一半回调函数(用的较少)
HAL_UART_ErrorCallback();//串口接收错误函数
串口接收中断回调函数:
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
功能:HAL库的中断进行完之后,并不会直接退出,而是会进入中断回调函数中,用户可以在其中设置代码,
串口中断接收完成之后,会进入该函数,该函数为空函数,用户需自行修改
参数:
UART_HandleTypeDef *huart //UATR的别名 如 : UART_HandleTypeDef huart1; 别名就是huart1
举例:
HAL_UART_RxCpltCallback(&huart1){ //用户设定的代码 }
串口中断处理函数:
HAL_UART_IRQHandler(UART_HandleTypeDef *huart);
功能:对接收到的数据进行判断和处理 判断是发送中断还是接收中断,然后进行数据的发送和接收,在中断服务函数中使用
如果接收数据,则会进行接收中断处理函数
/* UART in mode Receiver ---------------------------------------------------*/
if((tmp_flag != RESET) && (tmp_it_source != RESET))
{
UART_Receive_IT(huart);
}
如果发送数据,则会进行发送中断处理函数
/* UART in mode Transmitter ------------------------------------------------*/
if (((isrflags & USART_SR_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET))
{
UART_Transmit_IT(huart);
return;
}
3.串口查询函数
HAL_UART_GetState(); //判断UART的接收是否结束,或者发送数据是否忙碌
举例:
while(HAL_UART_GetState(&huart4) == HAL_UART_STATE_BUSY_TX) //检测UART发送结束
4.重新定向printf函数&scanf函数(已测试✓)
1. 打开或创建工程
打开或者创建自己要用到的工程,配置串口相关的GPIO、时钟、波特率等,本次使用STM32CubeMX创建工程,打开串口1,配置波特率为115200,数据位为8,停止位为1,无奇偶校验,这里不添加相关配置图片
2.CORE(记得添加MicroLib!)
记得添加MICROLib!!!!!---在KEIL勾选USE MicroLib
2.1 添加新文件Bsp_usart_fputc.c
//添加新文件Bsp_usart_fputc.c
#include "Bsp_usart_fputc.h"
extern UART_HandleTypeDef huart1;
/**
* @brief 重写这个函数,重定向printf函数到串口
*
* @param None
* @retval None
*
* @attention None
*
*/
int fputc(int ch, FILE * f)
{
#ifdef HAL_USART
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);///<普通串口发送数据
#endif
#ifdef HAL_USART_DMA
HAL_UART_Transmit_DMA(&huart1,(uint8_t *)&ch,1);///<DMA串口发送数据
#endif
#ifdef N_HAL_USART
USART_SendData(USART1, (uint8_t) ch);///<标准库串口发送数据
#endif
#ifdef N_HAL_USART
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET){}///<等待发送完成
#else
while(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TC) == RESET){}///<等待发送完成
#endif
return ch;
}
/**
* @brief 重定向scanf函数到串口
*
* @param None
* @retval None
*
* @attention None
*
*/
int fgetc(FILE * F)
{
uint8_t ch = 0;
#ifdef HAL_USART
HAL_UART_Receive(&huart1,&ch, 1, 0xffff);///<普通串口接收数据
#endif
#ifdef HAL_USART_DMA
HAL_UART_Receive_DMA(&huart1,(uint8_t *)&ch,1);///<DMA串口发送数据
#endif
#ifdef N_HAL_USART
USART_SendData(USART1, (uint8_t) ch);///<标准库串口接收数据
#endif
#ifdef N_HAL_USART
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET){}///<等待发送完成
#else
while(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TC) == RESET){}///<等待发送完成
#endif
return ch;
}
2.2 添加新文件Bsp_usart_fputc.h
//添加新文件Bsp_usart_fputc.h
#ifndef _BSP_USART_FPUTC_C_
#define _BSP_USART_FPUTC_C_
#include "stdio.h" ///<添加头文件
#include "stm32f1xx_hal.h" ///<添加头文件
///选择串口发送数据的类型
#define HAL_USART ///<HAL普通串口发送数据
//#define HAL_USART_DMA ///<HAL DMA 串口发送数据
//#define N_HAL_USART ///<标准库串口发送数据
#endif
3. 修改main.c文件
添加头文件Bsp_usart_fputc.h
在main()函数里添加测试代码:
printf(“Hello world!\r\n”); //测试内容
5.其他(全部函数介绍)
1、HAL_UART_Init(UART_HandleTypeDef * husart)
初始化串口的的函数:
用法为
UART_HandleTypeDef huart1;
huart1.xxx = ssss;
...
HAL_USART_Init(&huart1); //需要注意点的是函数的输入参数是指针类型
下方为huart4的初始化
UART_HandleTypeDef huart4;
huart4.Instance = UART4;
huart4.Init.BaudRate = 115200;
huart4.Init.WordLength = UART_WORDLENGTH_8B;
huart4.Init.StopBits = UART_STOPBITS_1;
huart4.Init.Parity = UART_PARITY_NONE;
huart4.Init.Mode = UART_MODE_TX_RX;
huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart4.Init.OverSampling = UART_OVERSAMPLING_16;
huart4.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart4.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart4.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart4) != HAL_OK)
2、void HAL_UART_MspInit (UART_HandleTypeDef * husart)
串口回调函数,主要进行硬件部分的初始化
例如开启串口的时钟和管脚的配置,本函数被上一个函数自动调用。
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};
if(uartHandle->Instance==UART4)
{
/* USER CODE BEGIN UART4_MspInit 0 */
/* USER CODE END UART4_MspInit 0 */
/* UART4 clock enable */
__HAL_RCC_UART4_CLK_ENABLE();
__HAL_RCC_GPIOI_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**UART4 GPIO Configuration
PI9 ------> UART4_RX
PA0 ------> UART4_TX
*/
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* UART4 interrupt Init */
HAL_NVIC_SetPriority(UART4_IRQn, 1, 2);
HAL_NVIC_EnableIRQ(UART4_IRQn);
/* USER CODE BEGIN UART4_MspInit 1 */
/* USER CODE END UART4_MspInit 1 */
}
3.HAL_StatusTypeDef HAL_UART_Transmit (UART_HandleTypeDef * husart, uint8_t * pTxData, uint16_t Size, uint32_t Timeout);
串口发送数据的函数,最重要的函数之一。单工以阻塞模式发送大量数据。
huart :要发送数据的串口指针,ptxData:要发送的数据,注意此处的指针形式,Size:发送数据的长度(字节数) Timeout:发送数据超时时间
发送数据的大小要注意是u8类型的(0-255)
HAL_UART_Transmit(&huart4,"222",3,2);
//发送一个字符串
u8 num = 10;
HAL_UART_Transmit(&huart4,&num,1,2);
//发送一个数字
u16 num = 0xffde;
u8 temp;
temp = num>>8;
HAL_UART_Transmit(&huart4,&temp,1,1);
temp = num;
HAL_UART_Transmit(&huart4,&temp,1,1);
//发送一个十六位的数据
注意:使用本函数发送十六位或者二十四位数据的时候下面的方法是错误的:
u16 num = 0x1234;
HAL_UART_Transmit(&huart4,&num,2,2);
此方法打印出的数据为 34 12 。不是想要输出的1234需要注意。
4、HAL_StatusTypeDef HAL_UART_Receive (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size,uint32_t Timeout)
串口接收数据的库函数,阻塞的方式接收数据。
huart :要发送数据的串口指针,pData:接收数据缓存地址,注意此处的指针形式,Size:接收数据的长度(字节数) Timeout:数据接收等待时间,CPU等待这个时间用来接收数据。
注意本函数不会因为设置接收接收字符数和实际接收到的数据量不一致而发生冲突,接收到的数据小于设定接收量时少的那部分补零,多于设定量时直截取需要的数据量。
uint16_t numd[3];
HAL_UART_Receive(&huart4,numd,3,1000);
HAL_UART_Transmit(&huart4,numd,3,1);
//等一秒时间接收三位数据
5、HAL_StatusTypeDef HAL_UART_Transmit_IT (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)
使用中断的方式发送数据,对应上面的阻塞方式发送数据。
本函数的使用需要慎重考虑前后程序,要注意本函数发送方式为中断方式,如果本函数后面直接跟着用HAL_UART_Transmit函数,那么后面数据不会发送。可通过增加短延时解决
uint16_t numd[3];
HAL_UART_Receive(&huart4,numd,3,1000);
while(HAL_UART_Transmit_IT(&huart4,numd,3)==HAL_OK);
HAL_Delay(10); //不加延时以下数据无法使用阻塞方式发送
num1= num23>>8;
HAL_UART_Transmit(&huart4,&num1,1,1);
num1 = num23;
HAL_UART_Transmit(&huart4,&num1,1,1);
6、HAL_StatusTypeDef HAL_UART_Receive_IT (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)
一种中断模式接收数据的函数。
huart :接收数据串口指针。pdata 接收区的指针 size 接受数据量字节长度,一般设置接收长度为1,每次接受一个字节的数据就进入中断处理。
注意如果设置接收数据不为1,而是某个固定的值,当串口接受的数据量不满足这个值的时候,串口中断不会被触发。一直等待接收数据满足设定值才会触发中断。如果出现接收出错可以使用HAL_USART_ErrorCallback函数来重置接收。
本函数必须在接受回调函数中再次调用才能经行下一次的接收。
#define num 1
uint16_t numd[num];
void UART_Init()
{
.....
HAL_UART_Receive_IT(&huart4,numd,num);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);//接收完成回调函数
{
HAL_UART_Receive_IT(&huart,numd,num);
}
7、HAL_StatusTypeDef HAL_UART_Transmit_DMA (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)
使用DMA的方式发送数据。
huart :发送数据串口指针。pdata 发送数据数组的首地址 size 发送数据量字节长度。使用这个函数之前需要做uart函数关于DMA设置的初始化。使用本函数发送完毕之后需要清除传输完成标志关闭DMA后才能够再次调用本函数。
因为DMA发送数据可以有两种形式一种是循环发送,另一种是单次发送。如果使用单次发送的情况下,本函数发送完毕之后就无法再次通过调用的方式发送数据。如果需要通过不断调用的方法发送数据可以将清除标志等函数放置在本函数之后,中间必须要隔着其他的函数(实现延时的功能)此方法适用于发送数据量不多的情况下。如果发送的数据量大的情况需要配合DMA的发送完成中断,在发送完成中断中清除标志位等操作。
#define SEND_BUF_SIZE 6
u8 SendBuff[SEND_BUF_SIZE]="123456"; //发送数据缓冲区
UART_HandleTypeDef UART1_Handler;
HAL_UART_Transmit_DMA(&UART1_Handler,SendBuff,SEND_BUF_SIZE);//开启DMA传输
.... //用于数据量不多的情况下可以使用此方法清除完成标志
if(__HAL_DMA_GET_FLAG(&UART1TxDMA_Handler,DMA_FLAG_TCIF3_7))//等待DMA2_Steam7传输完成
{
__HAL_DMA_CLEAR_FLAG(&UART1TxDMA_Handler,DMA_FLAG_TCIF3_7);//清除DMA2_Steam7传输完成标志
HAL_UART_DMAStop(&UART1_Handler); //传输完成以后关闭串口DMA
}
//使用中断的方法清除发送完毕标志位
//DMA初始化中开启DMA通道所在的中断
HAL_NVIC_SetPriority(DMA2_Stream7_IRQn,0,1);
HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn);
void XferCpltCallback()
{
if(__HAL_DMA_GET_FLAG(&UART1TxDMA_Handler,DMA_FLAG_TCIF3_7))//等待DMA2_Steam7传输完成
{
__HAL_DMA_CLEAR_FLAG(&UART1TxDMA_Handler,DMA_FLAG_TCIF3_7);//清除DMA2_Steam7传输完成标志
HAL_UART_DMAStop(&UART1_Handler); //传输完成以后关闭串口DMA
}
}
void DMA2_Stream7_IRQHandler()
{
HAL_DMA_IRQHandler(&UART1TxDMA_Handler);
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
XferCpltCallback();
}
8、HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart,uint8_t * pData, uint16_t Size)
huart :接收数据串口指针。pdata 接收数据数组的首地址 size 接收数据量字节长度。使用DMA的方式接收数据。
#define SEND_BUF_SIZE 6
u8 SendBuff[SEND_BUF_SIZE]=""; //发送数据缓冲区
UART_HandleTypeDef UART1_Handler;
HAL_UART_Receive_DMA(&UART1_Handler,SendBuff,SEND_BUF_SIZE);//开启DMA传输
9、HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef* huart)
huart:串口指针,暂停DMA数据传输。
HAL_UART_DMAPause(&UART1_Handler);
10、HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart)
huart:串口指针,从暂停状态中恢复DMA传送。
HAL_UART_DMAResume(&UART1_Handler);
11、HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart)
huart:串口指针,停止DMA的传输。
HAL_UART_DMAStop(&UART1_Handler);
使用本函数停止DMA的传输之后可以再次使用HAL_UART_Transmit_DMA打开DMA传输,无法使用HAL_UART_DMAResume打开。
12、HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart)
huart:串口指针.中止uart的中断、DMA形式的发送和接收数据。使用本函数没法阻止阻塞方法发送和接受数据。本函数只能阻止本次的数据传输,如果打开了接收中断会被关闭需要重新断模式接收数据。
HAL_UART_Abort(&UART1_Handler);
13、HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart)
huart:串口指针。中止串口中断方式或者DMA方式的发送数据。
用法同上
14、HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart)
huart:串口指针。中止串口中断方式或者DMA方式的接收数据。
用法同上
15、HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart)
huart:串口指针。中止串口中断或者DMA的中断。
用法同上
16、HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart)
huart:串口指针。中止串口中断方式或者DMA方式的发送数据并且关闭发送中断和DMA中断。
用法同上
17、HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart)
huart:串口指针。中止串口中断方式或者DMA方式的接收数据并且关闭发送中断和DMA中断。
用法同上
18、void HAL_UART_IRQHandler (UART_HandleTypeDef * huart)
这个函数属于串口中断处理请求函数。它需要添加在对应串口中断处理函数中。
void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
/* USER CODE END USART2_IRQn 0 */
HAL_UART_IRQHandler(&huart2);
/* USER CODE BEGIN USART2_IRQn 1 */
/* USER CODE END USART2_IRQn 1 */
}
19、void HAL_UART_TxCpltCallback (UART_HandleTypeDef * huart)
本函数是串口发送 数据完毕的回调函数。需要开启发送中断,当串口使用中断模式发送完毕后才能自动调用本函数。
void HAL_UART_TxHalfCpltCallback (UART_HandleTypeDef * huart)
{
}
20、void HAL_UART_TxHalfCpltCallback (UART_HandleTypeDef * huart)
发送数据一半回调函数,不常用。
21、void HAL_UART_ErrorCallback (UART_HandleTypeDef * husart)
串口收发数据出错时的回调函数。当使用中断方式接收数据,数据接收的数量不满足设定的值的时候,可以使用本函数重置接收流程。
void HAL_UART_ErrorCallback (UART_HandleTypeDef * husart)
{
HAL_UART_Receive_IT(&UART1_Handler,(u8 *)aRxBuffer, RXBUFFERSIZE);
}
22、HAL_StatusTypeDef HAL_LIN_SendBreak (UART_HandleTypeDef * huart)
LIN总线通信函数,发送一个断开连接的标识。
23、HAL_StatusTypeDef HAL_MultiProcessor_EnableMuteMode (UART_HandleTypeDef * huart)
多核处理器开启串口静音模式。
24、HAL_StatusTypeDef HAL_MultiProcessor_DisableMuteMode (UART_HandleTypeDef * huart)
多核处理器关闭串口静音模式。
25、void HAL_MultiProcessor_EnterMuteMode (UART_HandleTypeDef * huart)
多核处理器进入串口静音模式。
0x03 TIM
TIM(定时器定义的函数)
/*
* @Descript 定时器服务函数
* @param htim 相关定时器指针
* @return void
*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim);
/*
* @Descript 定时器启动函数
* @param htimx 相关定时器指针
* @return void
*/
void HAL_TIM_Base_Start_IT(&htimx);
/*
* @Descript PWM启动函数
* @param htimx 相关定时器指针
* @param TIM_CHANNEL_x 相关PWM通道
* @return void
*/
void HAL_TIM_PWM_Start(&htimx, TIM_CHANNEL_x);
/*
* @Descript PWM占空比更改
* @param htimx 相关定时器指针
* @param TIM_CHANNEL_x 相关PWM通道
* @param Pulse Duty_cycle = Pulse / Counter Period
* @return void
*/
void __HAL_TIM_SET_COMPARE(&htimx, TIM_CHANNEL_x, Pulse);
/*
* @Descript PWM频率更改
* @param htimx 相关定时器指针
* @param Counter_Period PWM_fre = TIM_frq / ( Prescaler + 1 ) / ( Counter Period + 1 )
* @return void
*/
void __HAL_TIM_SET_AUTORELOAD(&htimx, Counter_Period);
HAL_TIM_Encoder_Start(&htimx, TIM_CHANNEL_ALL); //编码器模式
count = __HAL_TIM_GET_COUNTER(&htimx);
direction = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htimx);
__HAL_TIM_SET_COUNTER(&htimx, 0);
1.PWM输出
呼吸灯的例程
定义变量:
/* USER CODE BEGIN 1 */
uint16_t pwmVal=0; //PWM占空比
/* USER CODE END 1 */c
然后使能TIM3的PWM Channel1 输出。
/* USER CODE BEGIN 2c */
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
/* USER CODE END 2 */
在while循环中添加代码:
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
while (pwmVal< 500)
{
pwmVal++;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比较值,修改占空比
// TIM3->CCR1 = pwmVal; //与上方相同
HAL_Delay(1);
}
while (pwmVal)
{
pwmVal--;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比较值,修改占空比
// TIM3->CCR1 = pwmVal; //与上方相同
HAL_Delay(1);c
}
HAL_Delay(200);
/* USER CODE END 3 */
}
2.定时器中断
定时器溢出时间计算公式:
$$
Tout=((arr+1)(psc+1))/Tclk
$$
例:arr=5000-1=4999 psc=7200-1=7199 Tclk=72Mhz Tout = (50007200)/72 us = 500ms
中断运行基本流程
void TIM3_IRQHandler(void) //首先进入中断函数
// ↓
HAL_TIM_IRQHandler(&htim2);//之后进入定时器中断处理函数,判断产生的是哪一类定时器中断(溢出中断/PWM中断.....) 和定时器通道 // ↓
void HAL_TIM_PeriodElapsedCallback(&htim2); //进入相对应中断回调函数 在中断回调函数中添加用户代码