这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 换逻辑分析仪STM32F103(寄存器)串口1打印

共5条 1/1 1 跳转至

换逻辑分析仪STM32F103(寄存器)串口1打印

工程师
2024-06-25 00:23:13   被打赏 13 分(兑奖)     打赏
STM32F103C8T6的串口通信功能是其核心功能之一,主要用于与PC、其他微控制器或外设进行数据交换。以下是关于STM32F103C8T6串口通信的详细解释,包括其串口类型、配置步骤和注意事项:串口类型STM32F103C8T6具有多个串口接口,包括UART(通用异步收发器)和USART(通用同步/异步收发器)。这些串口接口提供了灵活的通信方式,支持全双工、半双工和单工通信。UART(通用异步收发器):UART是一种异步通信接口,使用两根线(一根用于发送数据,一根用于接收数据)进行数据传输。其优点是简单易用,不需要额外的时钟信号,适用于低成本通信场景。

USART(通用同步/异步收发器):USART是UART的扩展版本,不仅支持异步通信,还支持同步通信。

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



上面说了理论知识,下面开始串口:

发送(TX)和接收(RX)引脚

image.png

原理图:

image.png

使用的是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毫秒

控制流程图:


image.png

读操作走向:

image.png

写操作走向:

image.png

波特率产生框图:

image.png


输出结果:

image.png


总结:

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


8df276516b4a35fd3867c4785ad3270.png

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

image.png