从零开始一起学stm32(三)---串口通信

1.通信的分类

2.串口通信协议

2.1通信协议的概念

2.2通信协议的物理层和数据链接层

3.stm32中USART的讲解

3.1普通的串口功能和串口个数

3.2原理图上的串口连接

3.3 串口收发数据的原理图分析

3.4 寄存器和库函数操作

4.作业:通过上位机电脑往stm32发送数据,并回显给电脑;

5. Stm32中printf的用法

1.通信的分类

通信:不同设备之间进行数据的传输

串行通信和并行通信:例如8位数据

串行通信:在时钟脉冲下,在一根线上,每次发送一个位。---8次

并行通信:在时钟脉冲下,在8根线上,同时各发送一位数据。 --1次

特点:

串行通信:传输距离相对远。硬件连接方便--所用接口少

并行通信:传输速度快,传输距离短

 

  串行通信:

方式:异步串行通信和同步串行通信

异步串行:两个设备的工作频率一样,但是不在同一个脉冲下接收和发送数据

同步串行:两个设备在相同时钟下,在同一个脉冲下接收或发送数据。--同发同收

  串行通信的模式:

单工通信:只能接收或则发送。 -- 收音机

半双工通信:在同一时刻,只能接收或则发送。 -- 对讲机(IIC CAN 485)

全双工通信:在同一时刻,既能接收又能发送。 -- 电话   (USART SPI)

2.串口通信协议:

  1. 协议:两个相互通信的设备之间,进行数据传输的一种规定!

规定了:设备的连接和通信的方式---物理层和数据链接层

1.物理层

所接管脚:TX(发送管脚)  RX(接收管脚)   GND(接地);

2.数据链接层---RS232协议--数据传输的格式

开始位+数据位+奇偶校验位+停止位

   1         5~8                  1                1

一帧数据:开始位+数据位+停止位

1.总线在发送或接收前应处于空闲状态--没有数据传输时,总线处于高电平状态!

2.开始位:要发送数据时,先发送一个低电平信号,这个信号叫开始信号,表示开              始发送数据了

3.数据位:要发送的数据;---8位

4.奇偶校验位:奇校验、偶校验、无校验

5.停止位:表示传输数据的结束,---停止位为高电平信号

 

3.stm32中USART的讲解

串口的作用:1 数据的发送和接收--用于MCU与外设通信;

                2 软件开发调试的重要手段;

  3.1串口个数

Stm32一共有5个USART---USART1~3   UART4、UART5

Stm32F103ZET6---只有3个  USART1、USART2、USART3

普通的串口接收和发送功能:----实现电脑和stm32的通信!

 

  3.2原理图上的串口连接

1.物理层 

原理图:

 

 

原理图:

所用引脚: PA9    PA10 

 电脑   stm32

 TXD         RX    --把stm32上PA10作为串口的接收功能!-----输入:浮空输入

 RXD        TX     --把stm32上的PA9作为串口的发送功能!---输出:复用推挽输出

     GND       GND

复用功能:找到对应的管脚把它作为第二种功能!---外设功能:USART1  RX/TX

必须要打开对应的外设时钟!

2.所用协议的格式:

开始位 + 数据位  +奇偶校验位 + 停止位

  1位         8位             0位                 1位

常用格式:1+8+0+1==10位数据

 

3.3 串口收发数据的原理图分析

3.数据的传输-----接收数据和发送数据

     发送数据和接收数据:

  数据传输的速度---波特率:每秒钟传输数据的位数;

  常用的波特率:4800  9600  115200 bits/s

 

 

1.发送数据--TX管脚

发送移位寄存器:按位发送数据,一位一位发送--波特率

从发送数据寄存器得到数据---一帧数据

数据总线通过写操作,往发送数据寄存器发送数据

关键点:数据是一帧一帧的发送,如何去判断上一帧数据发送完成?

判断TDR或者是发送移位寄存器中是否还有数据。。。

  1. 接收数据--RX引脚

接收移位寄存器:按位接收

接收数据寄存器:要判断接收数据寄存器里面是否接收到数据;

数据总线通过读操作,读取接收数据寄存器的数据;

关键点:如何判断是否要接收数据?

判断发送数据寄存器中是否有数据...没有数据,说明没有接收到,或者是上一次数据已经被读出;

 

3.4 寄存器和库函数操作

1.寄存器操作:

DR:           发送数据寄存器和接收数据寄存器其实是不存在的,只有数据寄存器

SR:  位7~5

TXE: TDR数据寄存器

TC:   发送移位寄存器

RXNE:接收移位寄存器

BRR:                           波特率不用配置--115200

CR1:          UE:   串口使能位,串口工作;

M:    字长--数据的长度

TE:   发送使能

RE:   接收使能

CR2:      STOP:停止位配置

CLKEN:时钟使能--串口USART1时钟!---第六章RCC

 

2.库函数操作:

驱动层:

  1. 查看原理图:查看管脚信息--PA9/PA10  --USART1
  2. 打开时钟---串口时钟、GPIO口时钟

GPIOA时钟 和USART1时钟

  1. GPIO口的配置---

PA9----TX---复用推挽输出

PA10--RX---浮空输入

  1. 协议的配置

模式:  发送和接收模式

数据位:8位     也即一个字节一个字节接收数据

停止位:1位

波特率:115200

不使用奇偶校验位;

不使用硬件流控制;

  1. 使能串口---打开串口

USART1使能!

应用层

  1. 回显:

用到串口助手---

通过串口助手就可以实现电脑和stm32数据的传输;

Stm32上面有COM端口,被串口助手检测到,

  1. 上位机(电脑)给下位机(stm32)发送数据

1.通过串口助手发送数据;

2.Stm32接收数据:判断收接收到数据---RXNE接收到数据会被置位

查询RXNE的状态----USART_GetFlagStatus()

  1. 接收数据

USART_ReceiveData();

  1. Stm32把接收到的数据,发送给电脑
  1. 判断发送数据寄存器是否为空!

查询TXE或者TC的状态---USART_GetFlagStatus();

2.发送数据

USART_SendData();

  1. 通过电脑发送0和1来控制灯和蜂鸣器的工作状态
  1. 上位机发送1控制灯亮,发送0控制灯灭

void USART1_Config(void)

{

     USART_InitTypeDef  USART_InitStruct;

    //打开时钟

    //配置 

    //配置协议 

//    USART_Init();

    //使能串口

}

void USART1_Echo(void)

{

    //先接收数据

    while(USART_GetFlagStatus()==RESET);

    //接收数据

    //判断TXE /TC是否为1

    while(USART_GetFlagStatus()==RESET);

    //发送数据

}

 

 

 

 

4.stm32中printf的用法:---printf的重定向

C语言中的标准库中所用的标准输出函数,默认的输出设备是显示器,要实现串口或LCD的输出,必须重新定义标准库函数里与输出函数相关的函数

printf()函数使用了int fputc(int ch,FILE *f)完成其功能。要使用printf,就需要重写这个函数。

使用的是fput这个库函数---头文件stdio.h

  1. 单个字符的操作:

fputc

函数原型:int  fputc(int c, FILE *fp);

功能:把一字节代码c写入fp指向的文件中

返回值:正常,返回c;出错,为EOF(-1)

在这里,是stm32通过串口发送数据,到上位机;

  1. 添加stdio.h头文件
  2. 编写fputc函数
  3. 使用keil中的微库--魔术棒--target--use microlib 勾选上

编写

int  fputc(int c, FILE *fp)

{

判断发送状态TC;

发送数据;

返回值;

}    

 

作业:

1 回显--检测接收和发送是否能使用

2 发送一个字符--操作LED灯(文本模式--ASCII)

3发送一个字符串(控制LED的亮灭)

  11 10 代表第1个灯亮

 20 21 代表第2个灯的亮灭

作业:

模拟RS232协议去接收数据:

*123#---4个灯亮,蜂鸣器延时响

*456#---4个灯灭,蜂鸣器延时响

 

例如:*12*1#*123#

*---一旦检测到*,就代表开始要接收数据!

#---一旦检测到#,就代表数据传输结束!

 

猜你喜欢

转载自blog.csdn.net/qq_38639426/article/details/88628578