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


 
					
				
 
			
			
			
						
			 
					
				 
					
				 
					
				 
					
				 我要赚赏金
 我要赚赏金 STM32
STM32 MCU
MCU 通讯及无线技术
通讯及无线技术 物联网技术
物联网技术 电子DIY
电子DIY 板卡试用
板卡试用 基础知识
基础知识 软件与操作系统
软件与操作系统 我爱生活
我爱生活 小e食堂
小e食堂

