STM32 串口编程
1.基本概念
- USART/ UART (同步/异步)收发器
收发两个设备间需要同步发送时钟,叫同步收发器。
接收设备的频率能自动匹配发送设备的频率,叫异步收发器。
一般都用异步收发器
1.串口配置
串口配置使用STM32CubeIDE工具进行自动配置。配置的内容包括基本配置和高级配置
基本配置:
1.波特率 Baud Rate
2.字节长度 Word Length
3.极性 Parity
4.停止位 Stop Bits
使用默认参数即可,也可以更改成你需要的参数。
需要注意两个串口之间通讯,这些基本配置必须一致,才能正常通讯。
异步串行数据的一般格式是:起始位+数据位+停止位,其中起始位1 位,数据位可以是5、6、7、8位,停止位可以是1、1.5、2位。
串口空闲时是高电平,开始位把电平拉低一个时钟。停止位是高电平。
极性位是指校验位,是奇校验还是偶校验,默认情况是无校验。
高级配置
过采样 :采用16次过采样应该是能更好的防误判,抗干扰。
2.串口编程
结构体
串口的结构体是 **UART_HandleTypeDef**,在该机构体中,又包含
Instance : 存放串口寄存器的数值。
串口发送
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
函数参数中要指名是哪个串口,发送的字符串指针和发送的长度。
串口中断发送的函数。发送完成后,会发送串口中断,直接进入回调函数TxCpltCallback()。
串口发送时要注意两次发送不能离得太近,否则函数会自动退出,返回“HAL_BUSY”,如果是这样,记得下次轮回的时候再发送一遍。
串口发送还要注意串口没有发送完毕之前,不要使用串口发送的字符串数组,否则会莫名的改变发送的内容。
3. STM32特殊功能
1.串口FIFO
HAL 串口编程
宏定义
- 复位 UART handle的gstate和RxState __HAL_UART_RESET_HANDLE_STATE(HANDLE)
- 刷新DR寄存器 __HAL_UART_FLUSH_DRREGISTER(HANDLE)
- 检查FLAG标志(SR寄存器) __HAL_UART_GET_FLAG(HANDLE, FLAG)
- 清楚FLAG标志位(SR寄存器) __HAL_UART_CLEAR_FLAG(HANDLE, FLAG)
- 清除UART PE挂起标志 __HAL_UART_CLEAR_PEFLAG(HANDLE)
- 清除FE挂起标志(实际跟上一个是一样的) __HAL_UART_CLEAR_FEFLAG(HANDLE
- 清除NE挂起标志(跟上一个也是一样的) __HAL_UART_CLEAR_NEFLAG(HANDLE)
- 清除接收溢出标志(还是一样的) __HAL_UART_CLEAR_OREFLAG(HANDLE)
- 清除IDEL标志(还是一样) __HAL_UART_CLEAR_IDLEFLAG(HANDLE)
- 中断使能 __HAL_UART_ENABLE_IT(HANDLE, INTERRUPT)
- 中断禁止 __HAL_UART_DISABLE_IT(HANDLE, INTERRUPT)
- 查看中断使能位 __HAL_UART_GET_IT_SOURCE(HANDLE, IT)
- 使能CTS流 __HAL_UART_HWCONTROL_CTS_ENABLE(HANDLE)
- 禁止CTS流 __HAL_UART_HWCONTROL_CTS_DISABLE(HANDLE)
- 使能RTS串口流引脚 __HAL_UART_HWCONTROL_RTS_ENABLE(HANDLE)
- 禁止RTS串口流引脚 __HAL_UART_HWCONTROL_RTS_DISABLE(HANDLE)
- 使能一位取样模式 __HAL_UART_ONE_BIT_SAMPLE_ENABLE(HANDLE)
- 禁止一位取样模式 __HAL_UART_ONE_BIT_SAMPLE_DISABLE(HANDLE)
- 使能串口 __HAL_UART_ENABLE(HANDLE)
- 禁止串口 __HAL_UART_DISABLE(HANDLE)
函数
- 接收一帧中断 HAL_UARTEx_ReceiveToIdle(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint16_t *RxLen, uint32_t Timeout)
参考资料
STM32HAL库使用详解 https://blog.csdn.net/limint86/article/details/107356472/
dma串口发送数据后一直显示HAL_UART_STATE_BUSY_TX https://blog.csdn.net/m0_57145940/article/details/125485352