目录
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的中断回调函数:
中断接收回调函数示例:
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);
}
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; /* 返回键值 */
}