1. 基础知识
2. 配置
配置STM32CubeMX,“Asynchronous”为异步
Baud Rate的设置值要与首发设备相同(异步的条件)
如要使用中断则对NVIC进行配置
3. 发送函数
阻塞式发送函数(在发送过程中,暂停单片机,直到发送完毕)
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef*huart, //所要发送给的外设、串口
uint8_t *pDate, //指向发送数据的缓冲区
uint16_t Size, //发送多少字节的数据
uint32_t Timeout); //超时时间
非阻塞式发送函数
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleYtpeDef *huart, uint8_t *pDate, uint16_t Size);
发送完毕中断回调函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
发送一半中断回调函数
void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);
4. 发送示例
要求
使用非阻塞式的串口发送函数,将发送缓数组dat_Txd中的前5个数据发送到USART1,在数据发送完成后,反转PB9引脚的输出电平。
实现
普通方式
HAL_UART_Transmit(&huart1,dat_Txd,5,10000);
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
中断方式
HAL_UART_Transmit_IT(&huart1,dat_Txd,5);
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
}
}
5. 接收函数
阻塞式接收函数(在接受到数据之前单片机会一直停滞,直到接收到数据)(不推荐)
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart,
uint8_t *pDate,
uint16_t Size,
uint32_t Timeout);
非阻塞式接收函数(推荐)
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleYtpeDef *huart,
uint8_t *pDate,
uint16_t Size);
接收完毕中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
接收一半中断回调函数
void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);
6. 接收示例
要求
使用非阻塞式的串口接收函数,接收USART1中的一个字节,将其保存在dat_Rxd变量中,在数据发送完成后,若该字节为0x5A,则反转PB8引脚的输出电平。
实现
uint8_t dat_Rxd=0;
HAL_UART_Transmit_IT(&huart1,&dat_Rxd,1); //放在main()函数里
void HAL_UART_RxCpltCallback(UART_HandleTypeDer *huart) //放在main()函数外
{
if(huart->Instance == USART1)
{
if(dat_Rxd == 0x5A) //此处0x5A表示16进制输入的5A
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
}
}
评论区