STM32 UART串口笔记
串口UART一帧 1 个字节硬件物理层面起始位 8 位数据位 校验位可选 停止位这完整一套叫 1 帧传输 1 字节0~255。TTL 串口TX、RX、GND 三条线实现设备间通讯。补充TTL 电平一般 3.3V/5VRS232 是正负差分电平二者不能直连。阻塞式串口通讯串口轮询UART 配置System Core 里的 SYS 选择 Serial WireSWD仅调试下载和 UART 功能本身无关Connectivity 里打开 UART1/UART2模式选 Asynchronous异步。调用函数HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);第 1 个参数串口句柄指针例huart1/huart2第 2 个参数数据缓冲区指针数组可以直接写数组名因为也是地址可以用(uint8_t *)强制转换消除一下警告第 3 个参数已知的收发数据数组/字符串长度可以写已知的固定长度也可以用strlen和sizeof直接读data在本文设置为2第 4 个参数超时时间单位 ms输入HAL_MAX_DELAY为无限等待时间。注意事项|是按位或不是逻辑或if 判断条件里逻辑或必须用||同理区分按位与 和逻辑与。数组名是地址常量不可直接赋值。对数组赋值只能逐个元素赋值或者使用内存拷贝函数。发送字符串时可以使用 strlen 获取有效字符长度接收字符串时硬件收到\0所以收到的不是 C 字符串禁止直接使用 strlen。串口中断_IT发送/接收寄存器非空中断UART 配置System Core 里的 SYS 选择 Serial WireSWD仅调试下载和 UART 功能本身无关Connectivity 里打开 UART1/UART2模式选 Asynchronous异步调用函数函数中断版函数后缀为_IT没有超时参数HAL_UART_Receive_IT(huart2, receivedata, 2); HAL_UART_Transmit_IT(huart2, receivedata, 2);注意该串口中断属于非阻塞函数调用函数只是启动一次收发函数立刻返回不会等待收发完成因此不要像之前一样在 while 循环里调用HAL_UART_Receive_IT否则旧接收任务还没完成就被新任务打断。我们要在stm32f1xx_it.c找到USART2_IRQHandler(void)ctrl加左键点击进入HAL_UART_IRQHandler(huart2)找到弱定义回调void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)。然后在 main.c 或者其他 C 文件中重写这个回调函数回调内部处理收到的数据并且再次调用HAL_UART_Receive_IT开启下一轮接收。存储接收数据的数组记得挪到main.c文件开头改为全局变量因为要在callback函数中调用DMA 串口传输DMA 通道自动搬运串口数据传输完成后触发中断通知 CPU大幅减少 CPU 占用。配置在前面串口中断配置的基础上在Connectivity-UART2-DMA Settings添加 TX、RX 的 DMA 通道内存开启地址自增UART 外设寄存器地址固定外设地址自增关闭。DMA 函数后缀为 DMA也是非阻塞也要使用callback函数HAL_UART_Receive_DMA(huart2, receivedata, 2); HAL_UART_Transmit_DMA(huart2, receivedata, 2);串口接收不定长数据空闲中断 IDLE原理UART 总线在收到数据后一段时间没有新字节触发 IDLE 空闲中断配合 DMA 实现不定长接收。不定长数据收发支持阻塞、普通中断、DMA 三种模式不同的模式使用前面讲的三种模式的配置只需要把代码前缀改为HAL_UARTEx_ReceiveToIdle就好了后缀还是和之前三种模式一样但是中断和DMA所需的回调函数不是之前那个在之前同样的位置搜索void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)替换我们之前的回调函数就好了。DMA 空闲不定长接收代码这里第三个参数要用回调函数的Size入参是本次收到的字节数HAL_UARTEx_ReceiveToIdle_DMA(huart2, receivedata, Size);DMA 默认开启半传输 HT 中断收到一半缓冲区数据就会进入回调容易误处理空闲中断场景建议添加以下代码关闭半传输中断__HAL_DMA_DISABLE_IT(hdma_usart2_rx, DMA_IT_HT);
上一篇/下一篇内容由系统自动关联
返回资讯列表 →