STM32 串口详细讲解

  1. 什么是串口
    UART : Universal Asynchronous Receiver/Transmitter 通用异步收发器
    USART : Universal Synchronous Asynchronous Receiver/Transmitter 通用同步/异步收发器

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

    Tx: 发送数据线
    Rx: 接收数据线

     	  A  			B
     	 TX -----------> Rx
     	 Rx <------------Tx
    

    全双工: 两个设备可以同时发送和接收
    串行数据: 发送只一根线,一次只能发送一bit. 一bit接着一bit发送和接收。

    模块通信: 上位机 下位机
    通信一般需要两个设备,我们把这两个设备,人为叫做上位机, 下位机。
    上位机: 把处理性能强的机子,上位机。数据大部分处理都在上位机完成。
    下位机: 把数据采集的终端,处理性能单一的机子,下位机。

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

     A --------        ---------
     		 --------			------- ...
     		 
     高电平周期是多长?即使是不发送数据Tx线上也有一个电平状态,接收方
     它怎么知道你是在发送呢?....
    
  2. 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
    
  3. 物理层标准  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
    
  4. STM32F4xx 串口控制器

    TX
    RX

    硬件流控:
    RTS: Request To Send 请求发送信号
    终端告诉对方可以向我传输数据啦。

     CTS: Clear To Send  清除发送信号
     	对方告知终端,我要向你发送数据啦
     	
     	
     	
     RTS  -------> CTS(对方)
     CTS  <-------  RTS(对方)
    

    标志位:

     TXE: Transmit data Register Empty
     	发送数据寄存器为空。
     	不代表上一次数据已经发送完成啦,因为数据有可能还在 shifter里面
     	但是此时您可以向TDR写数据啦。
     	
     TC :  Transmit Complete
     	发送完成。
     	发送移位寄存器中的数据已经发送到Tx引脚上面去了。
     	
     RXNE: Read Data register Not Empty
     	接收数据寄存器不为空。意思是你可以读数据啦。
    
  5. 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); //等待发送结束 
    

你可能感兴趣的:(C语言,STM32)