以下是使用STM32固件库进行串口通信的示例代码:
#include "stm32fxx.h"
#include <stdio.h>
USART_InitTypeDef USART_InitStructure;
// 串口初始化配置
void USART_Configuration(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USARTx, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// 配置TX引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_USART_TX;
GPIO_Init(GPIOx, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOx, GPIO_PinSource_USART_TX, GPIO_AF_USARTx);
// 配置RX引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_USART_RX;
GPIO_Init(GPIOx, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOx, GPIO_PinSource_USART_RX, GPIO_AF_USARTx);
// USART配置
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
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(USARTx, &USART_InitStructure);
USART_Cmd(USARTx, ENABLE);
}
// 通过串口发送数据
void USART_SendData(USART_TypeDef* USARTx, uint8_t data)
{
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
USART_SendData(USARTx, data);
}
// 通过串口接收数据
uint8_t USART_ReceiveData(USART_TypeDef* USARTx)
{
while(USART_GetFlagStatus(USARTx, USART_FLAG_RXNE) == RESET);
return USART_ReceiveData(USARTx);
}
// 重定向标准库的printf函数到串口
int __io_putchar(int ch)
{
USART_SendData(USARTx, (uint8_t) ch);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
return ch;
}
int main(void)
{
// 初始化串口
USART_Configuration();
// 通过串口发送数据
USART_SendData(USARTx, 'H');
USART_SendData(USARTx, 'e');
USART_SendData(USARTx, 'l');
USART_SendData(USARTx, 'l');
USART_SendData(USARTx, 'o');
while (1)
{
// 通过串口接收数据
uint8_t rx_data = USART_ReceiveData(USARTx);
// 处理接收到的数据
// ...
// 在此处可以进行其他操作或延时等待
}
}
请根据实际情况修改以下部分:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USARTx, ENABLE);
:USARTx
替换为要使用的串口(例如:USART1
、USART2
)。GPIO_InitStructure.GPIO_Pin = GPIO_Pin_USART_TX;
和GPIO_InitStructure.GPIO_Pin = GPIO_Pin_USART_RX;
:替换为实际使用的串口引脚。GPIO_PinAFConfig(GPIOx, GPIO_PinSource_USART_TX, GPIO_AF_USARTx);
和GPIO_PinAFConfig(GPIOx, GPIO_PinSource_USART_RX, GPIO_AF_USARTx);
:GPIOx
、GPIO_AF_USARTx
和GPIO_PinSource_USART_xxx
替换为相应的GPIO端口、复用功能号和对应的引脚源。USART_InitStructure.USART_BaudRate = 9600;
:根据需要设置波特率。- 在
main
函数中,根据需要使用USART_SendData(USARTx, data)
发送数据和使用USART_ReceiveData(USARTx)
接收数据。
同时,你可以通过重定向标准库的 printf
函数到串口,以便使用 printf
直接通过串口输出调试信息。在上例中,我们通过重载 __io_putchar
函数来实现这一点。
注:通过实验发现波特率较高时,传输越稳定,出现乱码的情况越少。优先115200。具体情况正在研究。