USART(通用同步/异步收发器):USART是UART的扩展版本,不仅支持异步通信,还支持同步通信。
串口配置步骤要实现STM32F103C8T6的串口通信,通常需要进行以下步骤:配置引脚:将STM32F103C8T6的相应引脚配置为串口通信的发送(TX)和接收(RX)引脚。这些引脚通常通过GPIO(通用输入/输出)端口进行配置。初始化串口:使用STM32的HAL(硬件抽象层)库或标准外设库来初始化串口。这包括设置波特率(数据传输速率)、数据位长度、停止位数量、奇偶校验等参数。这些参数需要与通信对端(如PC或其他微控制器)的设置相匹配。编写发送和接收函数:编写函数来发送和接收数据。发送函数负责将数据从STM32F103C8T6发送出去,而接收函数则负责接收来自外部设备的数据。这些函数可以根据具体的通信协议和需求进行编写。上面说了理论知识,下面开始串口:
发送(TX)和接收(RX)引脚

原理图:

使用的是CH340c串口芯片。
代码:
#include // 这里应该包含一些必要的头文件,例如 stdint.h, stdio.h 等,但代码中未明确给出
// 主函数
int main(void)
{
// 定义无符号16位整数变量t,用于循环计数
u16 t;
// 定义无符号16位整数变量len,用于存储接收到的数据长度
u16 len;
// 定义无符号16位整数变量times,用于计数循环次数
u16 times = 0;
// 系统时钟初始化,参数9可能是某个特定的时钟配置值
Stm32_Clock_Init(9); //系统时钟设置
// 串口初始化,配置波特率为115200,参数72可能是与串口时钟相关的值
uart_init(72, 115200); //串口初始化为115200
// 延时函数初始化,参数72可能与延时函数的时钟源有关
delay_init(72); //延时初始化
// LED初始化,配置与LED连接的硬件接口
LED_Init(); //初始化与LED连接的硬件接口
// 打印提示信息,告诉用户发送的消息将会显示
printf("\r\n您发送的消息为:\r\n\r\n");
// 无限循环
while(1)
{
// 检查USART_RX_STA的高16位是否为1,这通常表示有数据接收完成
if(USART_RX_STA & 0x8000)
{
// 获取此次接收到的数据长度(低14位)
len = USART_RX_STA & 0x3FFF; //得到此次接收到的数据长度
// 打印提示信息
printf("\r\n您发送的消息为:\r\n\r\n");
// 遍历并发送接收到的数据
for(t = 0; t < len; t++)
{
USART1->DR = USART_RX_BUF[t]; // 将接收到的数据发送回串口
// 等待数据发送完成(USART1->SR的某一位为1表示发送完成)
while((USART1->SR & 0X40) == 0); //等待发送结束
}
// 打印换行符,使输出更清晰
printf("\r\n\r\n"); //插入换行
// 清空接收完成标志
USART_RX_STA = 0;
}
else
{
// 计数器times自增
times++;
// 如果计数器times是5000的倍数
if(times % 5000 == 0)
{
// 打印欢迎信息和作者信息
printf("\r\n精英STM32F103开发板 串口实验\r\n");
printf("正点原子@ALIENTEK\r\n\r\n");
}
// 如果计数器times是200的倍数
if(times % 200 == 0)
{
// 提示用户输入数据,并以回车键结束
printf("请输入数据,以回车键结束\r\n");
}
// 如果计数器times是30的倍数
if(times % 30 == 0)
{
// 切换LED状态,提示系统正在运行
LED0 = !LED0; //闪烁LED,提示系统正在运行.
}
// 延时10毫秒
delay_ms(10);
}
}
}代码流程图:
main() | |-- 初始化 | |-- u16 t, len, times | |-- Stm32_Clock_Init() | |-- uart_init() | |-- delay_init() | |-- LED_Init() | |-- printf() | |-- while(1) |-- if (USART_RX_STA & 0x8000) | |-- 获取数据长度 len | |-- 打印提示信息 | |-- for 循环 (t = 0; t < len; t++) | |-- USART1->DR = USART_RX_BUF[t] | |-- 等待发送完成 | |-- 打印换行符 | |-- USART_RX_STA = 0 | |-- else |-- times++ |-- if (times % 5000 == 0) | |-- 打印欢迎信息和作者信息 |-- if (times % 200 == 0) | |-- 提示用户输入数据 |-- if (times % 30 == 0) | |-- 切换LED状态 |-- 延时10毫秒
控制流程图:

读操作走向:

写操作走向:

波特率产生框图:

输出结果:

总结:
使用STM32F103实现串口通信,看着很简单,其实要想完全弄明的,还是需要点时间的,我今天就遇到了问题,串口一直是乱码,所以还是要进一步的验证。

昨晚输出乱码的问题完美解决,是电脑没有设置好,今天拿公司的电脑输出就OK了。

我要赚赏金
