失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > STM32的USART串口通信

STM32的USART串口通信

时间:2023-08-29 01:59:28

相关推荐

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)文件网盘:/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);//得到USARTDIVmantissa=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; //复位串口1RCC->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); //串口初始化为115200while(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观查串口输出:

实验成功。

如果觉得《STM32的USART串口通信》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。