下面是一个基于STM32的串口通信的简单代码案例。
首先,我们需要初始化串口的硬件相关配置。这可以通过STM32的寄存器进行操作。以下是一个典型的串口初始化函数:
#include "stm32f4xx.h"
void USART_Config(void)
{
// 使能串口时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
// 配置串口引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置串口使用的GPIO引脚为复用功能
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); // USART2_TX
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2); // USART2_RX
USART_InitTypeDef USART_InitStructure;
// 配置串口参数
USART_InitStructure.USART_BaudRate = 115200;
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(USART2, &USART_InitStructure);
// 使能串口
USART_Cmd(USART2, ENABLE);
}
接下来,我们需要实现数据的发送和接收函数。以下是一个简单的串口发送函数:
void USART_SendChar(char ch)
{
// 等待串口发送数据缓冲区为空
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
// 将数据发送到串口
USART_SendData(USART2, ch);
}
以下是一个简单的串口接收函数:
char USART_ReceiveChar(void)
{
// 等待串口接收到数据
while (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET);
// 从串口接收数据
return USART_ReceiveData(USART2);
}
现在,我们可以使用上述函数来实现串口通信。以下是一个简单的例子,其中发送字符串"Hello, World!",然后接收并打印收到的数据:
#include "stm32f4xx.h"
#include <stdio.h>
void USART_Config(void);
void USART_SendChar(char ch);
char USART_ReceiveChar(void);
int main(void)
{
USART_Config();
char data[] = "Hello, World!";
for (int i = 0; i < sizeof(data)/sizeof(data[0]) - 1; i++)
{
USART_SendChar(data[i]);
}
printf("\nReceived data: ");
char receivedData;
while (1)
{
receivedData = USART_ReceiveChar();
printf("%c", receivedData);
}
}
在上述代码中,我们使用了标准库函数printf
来打印收到的数据。为了使其工作,我们需要在STM32的工程设置中启用Semihosting功能,以便将输出显示在调试器的控制台上。
以上就是一个基于STM32的简单串口通信的代码案例。你可以根据自己的需求进行修改和扩展。请注意,上述代码只是一个简单的示例,实际的应用可能需要更多的错误检查和处理。