STM32的USART串口通信

1、简介

(1)串口协议

串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。

在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;STM32标准库则是在寄存器与用户代码之间的软件层。对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。简单来说物理层规定我们用嘴巴还是用肢体来交流,协议层则规定我们用中文还是英文来交流。

(2)R232标准
MAX232芯片是专为RS-232标准串口设计的单电源电平转换芯片,使用+5v单电源供电。MAX232芯片的作用是将单片机输出的TTL电平转换成PC机能接收的232电平或将PC机输出的232电平转换成单片机能接收的TTL电平(单片机的TTL电平规则是Signal<0.8V=0、Signal>2V=1),常用接口电路如下:

在这里插入图片描述

(3)R485标准

SP3485芯片是+3.3V低功耗半双工收发器,适用于RS-485和RS-422串行协议,作为RS-485串行协议时的电路设计图如下:

在这里插入图片描述

(4)RS232、485电平与TTL电平的区别

RS-232
1、 在RS-232-C中任何一条信号线的电压均为负逻辑关系。
即:逻辑“1”为-3到-15V;逻辑“0”为+3到+15V。

2、 RS-232-C接口连接器一般使用型号为DB-9插头座,通常插头在DCE端,插座在DTE端。PC机的RS-232口为9芯针插座。一些设备与PC机连接的RS-232接口,因为不使用对方的传送控制信号,只需要三条接口线,即“发送数据TXD”、“接收数据RXD”和“信号地GND”。RS-232传输线采用屏蔽双绞线。
RS-485
RS485采用差分信号负逻辑.
逻辑"1"以两线间的电压差为-(2~6)V表示
逻辑"0"以两线间的电压差为+(2~6)V表示。
接口信号电平比RS-232-C降低了,就不易损坏接口电路的芯片, 且该电平与TTL电平兼容,可方便与TTL电路连接。RS-485的数据最高传输速率为10Mbps。

TTL
TTL电平信号被利用的最多是因为通常数据表示采用二进制规定,+5V等价于逻辑“1”,0V等价于逻辑“0”。

(5)CH340芯片

CH340 是一个USB 总线的转接芯片,实现USB 转串口、USB 转IrDA 红外或者USB 转打印口。

在串口方式下,CH340 提供常用的MODEM联络信号,用于为计算机扩展异步串口,或者将普通的串口设备直接升级到USB 总线。

在红外方式下,CH340 外加红外收发器即可构成USB 红外线适配器,实现SIR 红外线通讯。

2、准备工作

(1)STM32F103C8T6最小核心板
(2)USB转TTL
(3)CH340驱动(USB串口驱动)_XP_WIN7共用
(4)串口调试助手XCOM V2.3

3、安装CH340驱动

(1)文件网盘:https://pan.baidu.com/s/1td7Y95lZehL9IYTZluCzhg

提取码:u7iw

(2)找到SETUP.EXE

在这里插入图片描述

安装

在这里插入图片描述

安装成功

(3)在电脑设备管理器处查看有无com端口出现,有即可证明成功。

在这里插入图片描述

4、代码编写

(1)在创建好的工程中:

ustart.c

void uart_init(u32 pclk2,u32 bound)
{
    
      	 
	float temp;
	u16 mantissa;
	u16 fraction;	   
	temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
	mantissa=temp;				 //得到整数部分
	fraction=(temp-mantissa)*16; //得到小数部分	 
    mantissa<<=4;
	mantissa+=fraction; 
	RCC->APB2ENR|=1<<2;   //使能PORTA口时钟  
	RCC->APB2ENR|=1<<14;  //使能串口时钟 
	GPIOA->CRH&=0XFFFFF00F;//IO状态设置
	GPIOA->CRH|=0X000008B0;//IO状态设置 
	RCC->APB2RSTR|=1<<14;   //复位串口1
	RCC->APB2RSTR&=~(1<<14);//停止复位	   	   
	//波特率设置
 	USART1->BRR=mantissa; // 波特率设置	 
	USART1->CR1|=0X200C;  //1位停止,无校验位.
#if EN_USART1_RX		  //如果使能了接收
	//使能接收中断 
	USART1->CR1|=1<<5;    //接收缓冲区非空中断使能	    	
	MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级 
#endif
}

test.c

#include "sys.h"
#include "usart.h"		
#include "delay.h"	 
int main(void)
{
    
    				 
	u16 t; u16 len; u16 times=0;
	Stm32_Clock_Init(9);	//系统时钟设置
	delay_init(72);	  		//延时初始化
	uart_init(72,115200); 	//串口初始化为115200
  	while(1)
	{
    
    
		if(USART_RX_STA&0x8000)
		{
    
     
			len=USART_RX_STA&0x3FFF;//得到此次接收到的数据长度
			printf("\r\n Hello Windows! \r\n\r\n");
			for(t=0;t<len;t++)
			{
    
    
				USART1->DR=USART_RX_BUF[t];
				while((USART1->SR&0X40)==0);//等待发送结束
			}
			printf("\r\n\r\n");//插入换行
			USART_RX_STA=0;
		}else
		{
    
    
			times++;
			if(times%200==0)printf("Hello Windows!\r\n"); 
			delay_ms(10); 
		}
	}	 
} 

(2)编译成功后烧录代码:

在这里插入图片描述

(3)用XCOM观查串口输出:

在这里插入图片描述
实验成功。

猜你喜欢

转载自blog.csdn.net/m0_58406663/article/details/127361034