×
单片机 > 单片机程序设计 > 详情

STM32 串口详细讲解

发布时间:2020-06-16 发布时间:
|

什么是串口

UART : Universal Asynchronous Receiver/Transmitter 通用异步收发器

USART : Universal Synchronous Asynchronous Receiver/Transmitter 通用同步/异步收发器


一种是常用也是最简单的串行数据传输协议。数据线只需要两根就可以实现全双工。


Tx: 发送数据线

Rx: 接收数据线


    A  B

  TX -----------> Rx

  Rx


全双工: 两个设备可以同时发送和接收

串行数据: 发送只一根线,一次只能发送一bit. 一bit接着一bit发送和接收。


模块通信: 上位机 下位机

通信一般需要两个设备,我们把这两个设备,人为叫做上位机, 下位机。

上位机: 把处理性能强的机子,上位机。数据大部分处理都在上位机完成。

下位机: 把数据采集的终端,处理性能单一的机子,下位机。


串口只有一根发送数据线,假如 A要发送一个字符数据  10101010 给B


 A --------        ---------

  -------- ------- ...

   

 高电平周期是多长?即使是不发送数据Tx线上也有一个电平状态,接收方

 它怎么知道你是在发送呢?....


UART数据如何传输?

UART protocol 串口协议。

串口发送和接收数据是以帧为单位. Frame


1帧(Frame)= 1 start bit(起始位) + 5-9bits数据位 + 0/1bit 校验位  + stop bits(0.5, 1,1,5,2)

起始位: 一个周期的低电平

数据位: 5-9bits数据位,具体是多少bits,需要双方协商。并且传送是先传送LSB(最低位) … MSB

校验位:

 0 bit :没有校验位

1 bit :校验位. “赖子” X

D0 D1 D2 … Dn X

奇校验:要保证传输的1为奇数

D0 D1 D2 … Dn X 要保证这一串数据中1的个数为奇数

1 0 1 0 1 0 1 0 X(1)

1 0 1 0 1 0 1 1 X(0)


偶校验:要保存传输的1为偶数



停止位: 高电平

0.5 个停止位。 半个周期的高电平

1 个停止位    

1.5 个停止位

2 个停止位


Baudrate(波特率): 传输速率。

决定 时间周期。


115200 bps: bits per second


物理层标准  the physical layer standards


 TTL level UART : TTL电平串口

 RS-232:

 RS-422:

 RS-485:

 

  TTL level UART:

  逻辑低电平(0)  0V

  逻辑高电平(1)  5V/3.3V

  RS-232: 适合较长距离传输

  逻辑低电平(0)  +3v~+15V

  逻辑高电平(1)  -3v~-15v

 


  TTL UART RS-232 RS-422    RS-485


电平 1 3.3V/5V 1 -5V ~ -15V +/- 2v +/- 1.5v

0 0V 0 5V ~ +15V


信号 单端信号   单端信号  差分信号   差分信号


传输长度 < 2m <15m <1200m <1200m


 不同标准的串口,引脚也不一样。TX/Rx是一定存在的。

  TTL

  RX

  TX

  GND

  VCC


STM32F4xx 串口控制器


TX

RX


硬件流控:

RTS: Request To Send 请求发送信号

终端告诉对方可以向我传输数据啦。


 CTS: Clear To Send  清除发送信号

  对方告知终端,我要向你发送数据啦

 

 RTS  -------> CTS(对方)

 CTS 


标志位:


 TXE: Transmit data Register Empty

  发送数据寄存器为空。

  不代表上一次数据已经发送完成啦,因为数据有可能还在 shifter里面

  但是此时您可以向TDR写数据啦。

 

 TC :  Transmit Complete

  发送完成。

  发送移位寄存器中的数据已经发送到Tx引脚上面去了。

 

 RXNE: Read Data register Not Empty

  接收数据寄存器不为空。意思是你可以读数据啦。


STM32F4xx串口代码流程

(1) GPIO口配置

串口的TX/RX 引脚是由GPIO口来复用的。

a. 使能GPIO分组的时钟

RCC_AHB1PeriphClockCmd

b. 配置GPIO口的功能 GPIO_Init

c. 选择具体的复用功能

GPIO_PinAFConfig

(2) usart配置

a. 使能usart时钟

b. USART_Init


  USART_Init(USART_TypeDef * USARTx, USART_InitTypeDef * USART_InitStruct);

 

  typedef struct

  {

  uint32_t USART_BaudRate; // 波特率


  uint16_t USART_WordLength;    //传输字长  ,如下两个任选其一:

  USART_WordLength_8b

  USART_WordLength_9b

  在STM32中:传输字长=数据位数+检验位数


  uint16_t USART_StopBits;      //停止位数,如下 :

  USART_StopBits_1  1bit停止位

  USART_StopBits_1_5 1.5bit停止位

  USART_StopBits_2 2 bits停止位

  USART_StopBits_0_5 0.5bit停止位


  uint16_t USART_Parity;   //校验方式,如下:

  USART_Parity_No  无校验

  USART_Parity_Odd  奇校验

  USART_Parity_Even 偶校验


  uint16_t USART_Mode;    //串口模式, 如下:可以组合

  USART_Mode_Tx 发送模式

  USART_Mode_Rx 接收模式


  USART_Mode_Tx | USART_Mode_Rx 发送和接收模式

 

  uint16_t USART_HardwareFlowControl;  //硬件流控

  USART_HardwareFlowControl_None      无硬件流控

  USART_HardwareFlowControl_RTS       RTS 请求发送。你可以接收对方的数据。

  USART_HardwareFlowControl_CTS       CTS 清除发送,你可以发数据给对方。

  USART_HardwareFlowControl_RTS_CTS   RTS_CTS 发送和接收都用流控

  } USART_InitTypeDef;


(3) 中断的配置

USART_ITConfig

在STM32中一个USART只对应一个中断通道,但是引起串口中断的

事件有很多,比如:

TXE -> 发送寄存器为空,可以引起串口中断

TC -> 发送完成,可以引起串口中断

RXNE -> 接收寄存器不为空,可以引起串口中断

……

只不过,这些事件需要"中断控制位使能"


  USART_ITConfig(USART1, USART_IT_RXNE,ENABLE);

  USART_ITConfig就是用来把一个串口的XX事件,配置成是否引起串口中断的

 

  在串口中断函数里面,就需要判断是哪个串口事件,引起了中断!!!

 

  NVIC_Init()


(4) 使能串口

USART_Cmd


 接收(中断函数)

  USART1_IRQHanlder()

  {

  if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

  {

  //有数据可读啦

 

  data = USART_ReceiveData(USART1);  //读取接收到的数据

  }

 

 

 

  //清除USART1的中断标志

  USART_GetITStatus

  }

 USART_GetITStatus用来获取串口的xx事件标志位


 发送数据

 USART_SendData(USART1, 0x55);

 while (USART_GetFlagStatus(USRAT1, USART_FLAG_TXE)  == RESET); //等待发送结束 


关键字:STM32  串口 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
基于AT91M42800A的LED显示系统设计