stm32三路串口发送和接收函数代码
时间: 2023-07-29 17:10:28 浏览: 86
以下是STM32三路串口发送和接收函数的代码:
```c
#include "stm32f10x.h"
// USART1初始化函数
void USART1_Init(u32 bound)
{
// 使能USART1和GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
// 配置USART1的GPIO引脚
GPIO_InitTypeDef GPIO_InitStructure;
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速度50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // USART1_RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA
// 配置USART1的工作参数
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = bound; // 波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_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
USART_Cmd(USART1, ENABLE); // 使能USART1
}
// USART2初始化函数
void USART2_Init(u32 bound)
{
// 使能USART2和GPIOA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置USART2的GPIO引脚
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; // USART2_TX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // GPIO速度50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; // USART2_RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA
// 配置USART2的工作参数
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = bound; // 波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_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(USART2, &USART_InitStructure); // 初始化USART2
USART_Cmd(USART2, ENABLE); // 使能USART2
}
// USART3初始化函数
void USART3_Init(u32 bound)
{
// 使能USART3和GPIOB时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// 配置USART3的GPIO引脚
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // USART3_TX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // GPIO速度50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化GPIOB
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; // USART3_RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入
GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化GPIOB
// 配置USART3的工作参数
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = bound; // 波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_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(USART3, &USART_InitStructure); // 初始化USART3
USART_Cmd(USART3, ENABLE); // 使能USART3
}
// USART1发送一个字节
void USART1_SendByte(uint8_t byte)
{
USART_SendData(USART1, byte); // 发送数据
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); // 等待发送完成
}
// USART2发送一个字节
void USART2_SendByte(uint8_t byte)
{
USART_SendData(USART2, byte); // 发送数据
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); // 等待发送完成
}
// USART3发送一个字节
void USART3_SendByte(uint8_t byte)
{
USART_SendData(USART3, byte); // 发送数据
while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); // 等待发送完成
}
// USART1接收一个字节
uint8_t USART1_ReceiveByte(void)
{
while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); // 等待接收完成
return USART_ReceiveData(USART1); // 返回接收到的数据
}
// USART2接收一个字节
uint8_t USART2_ReceiveByte(void)
{
while (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET); // 等待接收完成
return USART_ReceiveData(USART2); // 返回接收到的数据
}
// USART3接收一个字节
uint8_t USART3_ReceiveByte(void)
{
while (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET); // 等待接收完成
return USART_ReceiveData(USART3); // 返回接收到的数据
}
```
这里我们分别实现了三个串口的初始化函数和发送、接收函数。在使用时,只需要根据需要调用对应的函数即可。注意,在复用GPIO引脚时需要特别注意GPIO初始化的模式设置。