资讯动态

《嵌入式通讯协议栈实战》2 UART

发布时间:2026/8/8 8:46:45 来源:尧图企业网站定制
第 2 篇UART——串口的坑比你想象的多1. 物理层TTL、RS232、RS485 的区别标准电平距离节点数TTL00V, 13.3V1m1对1RS232-12V/12V15m1对1RS485差分 ±2V1200m最多 256 个2. GD32 UART DMA 空闲中断voiduart_dma_init(void){rcu_periph_clock_enable(RCU_USART0);rcu_periph_clock_enable(RCU_DMA0);// UART 配置 115200-8-N-1usart_deinit(USART0);usart_baudrate_set(USART0,115200);usart_word_length_set(USART0,USART_WL_8BIT);usart_stop_bit_set(USART0,USART_STB_1BIT);usart_parity_config(USART0,USART_PM_NONE);// DMA 接收循环模式dma_parameter_struct dma_init_struct;dma_deinit(DMA0,DMA_CH4);dma_init_struct.directionDMA_PERIPHERAL_TO_MEMORY;dma_init_struct.periph_addr(uint32_t)USART_RDATA(USART0);dma_init_struct.memory_addr(uint32_t)rx_dma_buf;dma_init_struct.numberRX_BUF_SIZE;dma_init_struct.periph_incDMA_PERIPH_INCREASE_DISABLE;dma_init_struct.memory_incDMA_MEMORY_INCREASE_ENABLE;dma_init(DMA0,DMA_CH4,dma_init_struct);dma_circulation_enable(DMA0,DMA_CH4);// 循环接收usart_dma_receive_config(USART0,USART_RECEIVE_DMA_ENABLE);usart_interrupt_enable(USART0,USART_INT_IDLE);// 空闲中断usart_enable(USART0);}3. 环形缓冲区 空闲中断断帧voidUSART0_IRQHandler(void){if(usart_interrupt_flag_get(USART0,USART_INT_FLAG_IDLE)){usart_data_receive(USART0);// 清除 IDLE 标志uint16_tlenRX_BUF_SIZE-dma_transfer_number_get(DMA0,DMA_CH4);ringbuf_write(rx_ring,rx_dma_buf,len);// 通知解析任务xSemaphoreGiveFromISR(xRXSemaphore,woken);}}空闲中断是 UART 断帧的最优雅方案——不需要帧头帧尾不需要固定长度一帧结束后自动触发。下一篇UART 协议设计——定义你自己的通讯协议

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价