STM32CubeMX——串口数据收发基础(HAL 库)
·
一、STM32CubeMX 中关于 USART 的配置(以 USART1 为例):
1、配置异步通信:
2、
此处硬件流控制不使能:
3、设置数据属性:
4、使能 USART1 中断:
此处有需要则使能 USART1 中断:
二、代码编写:
1、HAL 库中关于串口收发重要函数:
① 阻塞式发送函数:
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
/* 阻塞式发送函数,发送未完成时函数阻塞 */
/*
huart 参数: 实例,句柄
如 &huart1
pData 参数: 存放要发送的数据的指针
Size 参数: 存放要发送的数据的长度
Timeout 参数:超时时间,超过此长度仍未发送成功则阻塞完毕,停止发送,函数执行完毕
*/
② 非阻塞式发送函数:
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
/* 非阻塞式发送函数,发送一半时或完毕后响应发送中断 */
/*
huart 参数: 实例,句柄
如 &huart1
pData 参数: 存放要发送的数据的指针
Size 参数: 存放要发送的数据的长度
*/
__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
/* 发送完毕中断回调函数 */
__weak void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);
/* 发送一半中断回调函数 */
③ 阻塞式接收函数:
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
/* 阻塞式接收函数,接收未完成时函数阻塞 */
/*
huart 参数: 实例,句柄
如 &huart1
pData 参数: 存放接收到的数据
Size 参数: 存放要接收的长度
Timeout 参数:超时时间,超过此长度仍未接收成功则阻塞完毕,停止接收,函数执行完毕
*/
④ 非阻塞式接收函数:
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
/* 非阻塞式接收函数,接收一半时或完毕后响应接收中断 */
/*
huart 参数: 实例,句柄
如 &huart1
pData 参数: 存放接收到的数据
Size 参数: 存放要接收的长度
*/
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
/* 接收完毕中断回调函数 */
__weak void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);
/* 接收一半中断回调函数 */
2、参考代码:
可以注意到usart.c
中的定义和初始化函数:
示例: 从串口接收一个 16 进制数,若接收到的数为0xA1
,则翻转 LED0,并向串口发送字符串Toggle LED0!\r\n
,若接收到的数为0xA2
,则翻转 LED1,并向串口发送字符串Toggle LED1!\r\n
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1, &cmd, 1);
/* USER CODE END 2 */
/* USER CODE BEGIN 0 */
#define LED0_Tog HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_8);
#define LED1_Tog HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_2);
uint8_t cmd = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1){
if(cmd == 0xA1){
LED0_Tog;
HAL_UART_Transmit(&huart1, "Toggle LED0!\r\n", sizeof("Toggle LED0!\r\n"),10000);
}
if(cmd == 0xA2){
LED1_Tog;
HAL_UART_Transmit(&huart1, "Toggle LED1!\r\n", sizeof("Toggle LED1!\r\n"),10000);
}
HAL_UART_Receive_IT(&huart1, &cmd, 1);
}
}
/* USER CODE END 0 */
此处串口接收循环在中断中形成闭环,此闭环也可以在main
函数中的while
中形成,如:
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_UART_Receive_IT(&huart1, &cmd, 1);
/* USER CODE END WHILE */
/* USER CODE BEGIN 0 */
#define LED0_Tog HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_8);
#define LED1_Tog HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_2);
uint8_t cmd = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1){
if(cmd == 0xA1){
LED0_Tog;
HAL_UART_Transmit(&huart1, "Toggle LED0!\r\n", sizeof("Toggle LED0!\r\n"),10000);
}
if(cmd == 0xA2){
LED1_Tog;
HAL_UART_Transmit(&huart1, "Toggle LED1!\r\n", sizeof("Toggle LED1!\r\n"),10000);
}
}
}
/* USER CODE END 0 */
更多推荐
已为社区贡献3条内容
所有评论(0)