STM32串口通信基础:一字节传输解析

9 下载量 31 浏览量 更新于2024-08-31 收藏 797KB PDF 举报
本文主要介绍了STM32串口通信的基础知识,包括串口通信所需的引脚、一个字节的发送和接收过程,并给出了基于STM32F1的串口1初始化配置的示例代码。 STM32串口通信是嵌入式系统中常见的一种通信方式,它基于UART(通用异步收发传输器)协议。在STM32芯片上,通常使用GPIO引脚来实现串口功能,其中TX引脚用于数据发送,RX引脚用于数据接收,而GND作为公共接地参考,确保信号的稳定传输。 在进行串口通信时,若两设备间仅进行A发B收的数据交互,只需将A的TX连接到B的RX,同时GND相连。传输过程中,数据被组织成帧,一般包含起始位、数据位、奇偶校验位(可选)和停止位。以8位数据传输为例,一个完整的字节传输可能包含1个起始位(低电平)、8个数据位和1个停止位(高电平)。 发送一个字节时,例如0x01,发送器会根据预设的波特率和帧格式,将该字节转换为时序信号。起始位后,按顺序发送8个数据位,最后发送停止位。发送数据时,0x01会存储在发送数据寄存器(TDR),然后逐位移位至移位寄存器,由时钟脉冲控制数据的传输。 接收端则需配置相同的波特率和帧格式,以便正确解码接收到的信号。当RX引脚检测到起始位(低电平持续时间与波特率相关)后,按照预设的时序,依次读取数据位,将其存储在接收数据寄存器(RDR)中。通过读取RDR,接收端可以获取到发送端发送的字节0x01。 在STM32F1系列微控制器中,初始化串口1的配置代码如下: ```c void uart_init(u32 baudrate) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); // 启用USART1和GPIOA时钟 // 配置GPIO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // 对应USART1_TX GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // 对应USART1_RX GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置USART USART_InitStructure.USART_BaudRate = baudrate; // 设置波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 数据位8位 USART_InitStructure.USART_StopBits = USART_StopBits_1; // 停止位1位 USART_InitStructure.USART_Parity = USART_Parity_No; // 无奇偶校验 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 无硬件流控 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 使能接收和发送 USART_Init(USART1, &USART_InitStructure); // 启用USART1中断 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 预优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 子优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_Cmd(USART1, ENABLE); // 启用USART1 } ``` 以上代码展示了如何配置GPIO端口和USART,以及设置中断,以支持串口通信。注意,实际应用中还需要根据具体需求调整中断优先级和处理函数,以实现完整的串口通信功能。