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了。