首页 / 资讯中心 / 文章详情

STM32串口通信实验报告

STM32串口通信实验报告 ★ FEATURED ARTICLE
STM32 串口通信实验报告一、实验目的了解串口协议和 RS-232、RS-485 标准以及 RS-232、RS-485 电平与 TTL 电平的区别。掌握 STM32 串口通信的工作原理和编程方法实现 USART1 数据收发。掌握轮询、中断、DMA 三种串口数据传输方式的区别与编程实现。学会使用 Keil 软件仿真和逻辑分析仪观察串口波形计算实际波特率。二、实验环境项目说明硬件平台STM32F103C8T6 开发板开发环境Keil MDK 5.36 STM32CubeMX库函数STM32 标准外设库 (StdPeriph Library)仿真方式Keil 软件仿真无需硬件串口参数USART1, 115200-8-N-1, PA9(TX)/PA10(RX)三、基础简答题串口协议与 RS-232、RS-485 标准串口协议UART** 是一种异步串行通信协议无需时钟线通信双方约定波特率即可进行数据传输。一帧数据由起始位、数据位、校验位和停止位组成通过 TX/RX 两根线实现全双工通信。RS-232** 采用负逻辑电平标准逻辑 1 对应 -3V 至 -15V逻辑 0 对应 3V 至 15V为单端信号传输距离约 15 米适用于点对点通信。RS-485** 采用差分信号传输方式通过 A、B 两根线的电压差判定逻辑电平传输距离可达 1200 米支持多点总线连接抗干扰能力强。TTL 电平与 RS-232/RS-485 的区别特性TTL 电平RS-232 电平RS-485 电平逻辑 00 ~ 0.8V3 ~ 15VA 比 B 高 200mV逻辑 12.0 ~ 3.3V-3 ~ -15VB 比 A 高 200mV信号方式单端对地单端对地差分线间MCU 的 UART 输出为 TTL 电平不能直接连接 RS-232 或 RS-485 设备必须经过电平转换芯片如 MAX232、MAX485。CH340 模块工作原理CH340 是 USB 转串口芯片其工作原理为USB 接口连接电脑芯片内部完成 USB 协议与 UART 协议的转换TTL 串口引脚直接输出 3.3V 电平信号。电脑安装驱动后CH340 枚举为虚拟 COM 口串口助手通过该 COM 口即可与 STM32 通信。接线方式CH340 的 TXD → STM32 的 RXPA10CH340 的 RXD → STM32 的 TXPA9GND 必须共地。只接 TX/RX 不接 GND 能否通信不能正常工作。UART 是单端信号电平相对于地线GND判定。两块开发板的 GND 不连通时两地电位存在电势差接收端读取的电平会发生偏移导致误码、乱码甚至完全无法通信。共地是串口通信的基本要求。四、任务一轮询方式串口通信实验内容配置 USART1 为 115200 波特率、8 位数据位、1 位停止位、无校验位。STM32 连续发送 “hello windows!” 字符串观察不加延时和加延时两种情况下 PC 端的接收现象。上位机发送字符#暂停发送发送字符*恢复发送。核心代码#includestm32f10x.h#includeDelay.h#includestdio.huint8_ttx_enable1;voidUSART1_Init(void){GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);/* PA9 TX - 复用推挽输出 */GPIO_InitStructure.GPIO_ModeGPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_PinGPIO_Pin_9;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure);/* PA10 RX - 浮空输入 */GPIO_InitStructure.GPIO_ModeGPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_PinGPIO_Pin_10;GPIO_Init(GPIOA,GPIO_InitStructure);/* USART1: 115200-8-N-1 */USART_InitStructure.USART_BaudRate115200;USART_InitStructure.USART_WordLengthUSART_WordLength_8b;USART_InitStructure.USART_StopBitsUSART_StopBits_1;USART_InitStructure.USART_ParityUSART_Parity_No;USART_InitStructure.USART_HardwareFlowControlUSART_HardwareFlowControl_None;USART_InitStructure.USART_ModeUSART_Mode_Tx|USART_Mode_Rx;USART_Init(USART1,USART_InitStructure);USART_Cmd(USART1,ENABLE);}intfputc(intch,FILE*f){while(USART_GetFlagStatus(USART1,USART_FLAG_TC)RESET);USART_SendData(USART1,(uint8_t)ch);returnch;}intmain(void){USART1_Init();printf(STM32 UART Ready!\r\n);while(1){if(tx_enable){printf(hello windows!\r\n);Delay_ms(50);/* 注释此行 不加延时观察丢数据 */}/* 查询方式接收上位机命令 */if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)SET){uint8_tchUSART_ReceiveData(USART1);if(ch#){tx_enable0;printf([Paused]\r\n);}elseif(ch*){tx_enable1;printf([Resumed]\r\n);}}}}实验现象与分析不加延时连续发送PC 端串口助手接收窗口出现数据丢失、字符残缺和乱码现象。原因是 STM32 发送速度过快PC 端操作系统串口接收缓冲区来不及处理导致数据溢出丢失。加 50ms 延时PC 端接收窗口整齐输出 “hello windows!”无丢字符现象。说明加适当延时可以解决接收端缓冲区溢出问题。—![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ff91352fcecd4ea68d5d23dc52dec4d0.jpeg#pic_center五、任务二中断方式与 DMA 方式中断方式串口接收开启 USART1 接收中断在中断服务函数中判断是否接收到#或*字符控制发送使能标志。/* stm32f10x_it.c 中添加 */voidUSART1_IRQHandler(void){if(USART_GetITStatus(USART1,USART_IT_RXNE)!RESET){uint8_tchUSART_ReceiveData(USART1);if(ch#){tx_enable0;printf([Paused]\r\n);}elseif(ch*){tx_enable1;printf([Resumed]\r\n);}}}中断方式下CPU 不需要循环查询接收状态只有收到数据时才进入中断处理提高了 CPU 利用率。相比轮询方式优点是实时性高、CPU 占用率低。DMA 方式串口发送配置 DMA1 Channel4对应 USART1_TX将发送缓冲区数据通过 DMA 自动搬运到 USART1 数据寄存器。uint8_ttx_buf[]hello windows! DMA mode test\r\n;voidDMA_Configuration(void){DMA_InitTypeDef DMA_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);DMA_DeInit(DMA1_Channel4);DMA_InitStructure.DMA_PeripheralBaseAddr(uint32_t)USART1-DR;DMA_InitStructure.DMA_MemoryBaseAddr(uint32_t)tx_buf;DMA_InitStructure.DMA_DIRDMA_DIR_PeripheralDST;DMA_InitStructure.DMA_BufferSizesizeof(tx_buf)-1;DMA_InitStructure.DMA_PeripheralIncDMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryIncDMA_MemoryInc_Enable;DMA_InitStructure.DMA_PeripheralDataSizeDMA_PeripheralDataSize_Byte;DMA_InitStructure.DMA_MemoryDataSizeDMA_MemoryDataSize_Byte;DMA_InitStructure.DMA_ModeDMA_Mode_Normal;DMA_InitStructure.DMA_PriorityDMA_Priority_Medium;DMA_InitStructure.DMA_M2MDMA_M2M_Disable;DMA_Init(DMA1_Channel4,DMA_InitStructure);USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);}DMA 方式下数据搬运完全由硬件完成CPU 不需要参与发送过程发送大块数据时效率最高。三种方式对比传输方式CPU 占用发送效率适用场景轮询方式最高最低简单实验、低速传输中断方式中等中等交互式收发、实时响应DMA 方式最低最高大量数据、高速率传输六、任务三Keil 软件仿真与波特率分析逻辑分析仪观察波形在 Keil 调试模式下菜单View → Analysis Windows → Logic Analyzer点Setup → New (Insert)输入PORTA.9Display Type 选Bit运行仿真几秒后暂停Zoom In 放大波形正确的串口波形时序空闲态高电平起始位1 位低电平下降沿标志帧开始数据位8 位低位在前停止位回到高电平所有位宽度一致时序状态正确波特率计算USART1 挂载在 APB2 总线上APB2 时钟为 72MHz。波特率计算公式BaudRate fPCLK / (16 × USARTDIV)配置波特率 115200 时USARTDIV 72000000 / (16 × 115200) ≈ 39.0625 实际波特率 115200 bps在逻辑分析仪中测量单个位的宽度 T_bit实际波特率 1 / T_bit误差在 ±2% 以内属于正常范围。七、实验总结通过本次实验掌握了 STM32 串口通信的基本原理和三种数据传输方式的编程实现。轮询方式简单直观但 CPU 占用高中断方式实时性好适合交互式收发DMA 方式效率最高适合大量数据传输。实验中观察到不加延时连续发送时 PC 端丢数据的现象加深了对串口通信速率匹配和缓冲区溢出的理解。通过 Keil 软件仿真和逻辑分析仪功能在没有示波器的条件下也能观察到串口输出波形并计算波特率达到了实验目的。
阅读完成 · 觉得有帮助?
咨询建站