精华内容
下载资源
问答
  • UART串口通信协议

    2021-02-02 11:18:39
    一.概述 UART的优点 1.仅需两根线即可进行全双工数据传输(电源线除外)。 2.不需要时钟或任何其他定时信号。...通信协议 UART数据帧结构 Start Bit (1bit) Data Frame (5.

    一.概述

    1.UART的优点

    1.仅需两根线即可进行全双工数据传输(电源线除外)。

    2.不需要时钟或任何其他定时信号。

    3.奇偶校验位确保将基本错误检查集成到数据包帧中。

    2.UART的缺点

    1.帧中数据的大小是有限的。

    2.与并行通信相比,数据传输速度较慢。

    3.发送器和接收器必须统一传输规则,并且必须选择适当的波特率。

    4.不支持多个主机或从机。

    二.通信协议

    UART数据帧结构

    Start Bit

    (1bit) 

    Data Frame

    (5-9bit) 

    Parity Bit

    (0-1bit)

    Stop Bits

    (1-2bit) 

     

    1.Start Bit :

    UART数据传输线通常在不传输数据时保持在高电平。 为了开始数据传输,发送UART在一个时钟周期内将传输线从高电平拉低到低电平。 当接收UART检测到高电压到低电压转换时,它开始以波特率的频率读取数据帧中的位。

    2.Data Frame:

    数据帧包含正在传输的实际数据。 如果使用奇偶校验位,则可以是五位,最多八位。 如果不使用奇偶校验位,则数据帧的长度可以为九位(如果数据位9位,在编程的时候数据buf就要定义为16为int16_t类型)。 在大多数情况下,数据首先以LSB发送。

    3.Parity Bit:

    奇偶校验位是接收UART判断传输期间是否有数据错误的方式。串口校验分几种方式:

    (1).无校验(no parity

    (2).奇校验(odd parity

    (3).偶校验(even parity

    (4).mark parity:校验位始终为‘1

    (5).space parity:校验位始终为‘0

    4.Stop Bits

    发送端 UART 将数据传输线从低电压驱动到高电压持续1-2两位数据的时间宽度来表示整个数据包的传输已经结束。由于数据是在传输线按特定的时间间隔与时间宽度来传输的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容错性越好,但是数据传输率同时也越慢

    5.Baud Rate

    发送UART和接收UART必须在波特率上达成一致,才能成功进行数据传输。波特率以每秒比特数为单位。 一些标准波特率是4800 bps9600 bps19200 bps115200 bps等。其中9600 bps是最常用的波特率之一。对于9600波特系统,一位需要1 /9600 bps)≈104.2 µs。系统实际上无法每秒传输9600位有意义的数据,因为开销位(开始,停止,校验)和一字节传输之间的延迟可能需要额外的时间。

     

    三.电气规范

    1.电压标准

    UART 通常使用 TTL 电平。具体的电压等级需要参考MCU的数据手册和目标的数据手册。

    TTL与CMOS电压标准

    电平标准

    子标准

    VOH

    VOL

    VIH

    VIL

    TTL(Transistor-Transistor Logic)

    LVTTL(Low Voltage TTL)

    5V

    >=2.4

    <=0.5

    >=2.0

    <=0.8

    3.3V

    >=2.4

    <=0.4

    >=2.0

    <=0.8

    2.5V

    >=2.0

    <=0.2

    >=1.7

    <=0.7

    CMOS(Complementary Metal Oxide Semiconductor)

    LVCMOS (Low Voltage CMOS)

     

    5V

    >=4.45

    <=0.5

    >=3.5

    <=1.5

    3.3V

    >=3.2

    <=0.1

    >=2.0

    <=0.7

    2.5V

    >=2.0

    <=0.1

    >=1.7

    <=0.7

     

    2.IO 配置

    TX:

    UART数据传输线通常在不传输数据时保持在高电平。且在UART的传输过程中没有线与等操作,故UART的端口可以配置为推挽(Push-pull)或是开漏(Open-drain)加上拉电阻。

    RX:

    RX可以配置为浮空输入。

     

    展开全文
  • UART串口通信协议的FPGA实现

    千次阅读 2020-10-20 21:21:31
    UART串口通信协议,全称叫做通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART。UART是异步通信,它只需要一根线就可以进行数据的通信。 1、基本概念 波特率:指每秒传输的bit...

    引言

          UART串口通信协议,全称叫做通用异步收发器(Universal Asynchronous Receiver/Transmitter),通常称作UART。UART是异步通信,它只需要一根线就可以进行数据的通信。

    1、基本概念

    • 波特率:指每秒传输的bit位数(bit)。一般波特率配置为4800,9600,115200等;
    • 起始位:先发出一个逻辑”0”信号,表示传输字符的开始;
    • 数据位:可以是5~8位逻辑”0”或”1”。一般情况下都选择8位而不选择7,因为这样能尽可能避免数据的丢失或者混乱。从数据低位开始传输(即从LSB端开始发送数据,而且是串行发送);
    • 校验位:当数据位加上校验位后,当1”的位数为偶数时,叫做偶校验,为奇数时,叫做奇校验,主要用于差错控制;
    • 停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平;
    • 空闲位:处于逻辑“1”状态,表示当前线路上没有数据传送。

       具体的时序图如下图所示:

    在这里插入图片描述

    2、Verilog实现代码

    • uart_tx.v
    module uart_tx #(
    parameter BAUD_DIV = 14'd10416     //波特率时钟,9600bps,100Mhz/9600=10416,波特率可调,意为一位数据占用多少时钟周期
    )
    (
    input clk,                   //100M时钟
    input [7:0] uart_tx_data_i,    //待发送数据
    input uart_tx_en_i,            //发送发送使能信号
    output uart_tx_o,               //串口输出
    output uart_tx_done         // 串口发送结束信号 1:正在发送 0:发送完成
        );
        
    parameter BAUD_DIV_CAP = BAUD_DIV / 2;      //波特率时钟中间采样点,100Mhz/9600/2=5208,波特率可调
     
     //-------------------------串口计数,中值采样----------------------  
    reg [13:0] baud_div=0;              //波特率设置计数器
    reg baud_bps=0;                     //数据发送点信号,高有效
    reg uart_send_flag=0;             //数据发送标志位
        
    always@(posedge clk)
    begin
        if(baud_div==BAUD_DIV_CAP)    //当波特率计数器计数到数据发送中点时,产生采样信号baud_bps,用来发送数据
            begin
                baud_bps<=1'b1;
                baud_div<=baud_div+1'b1;
            end
        else if(baud_div<BAUD_DIV && uart_send_flag)//数据发送标志位有效期间,波特率计数器累加,以产生波特率时钟
            begin
                baud_div<=baud_div+1'b1;
                baud_bps<=0;    
            end
        else
            begin
                baud_bps<=0;
                baud_div<=0;
            end
    end
    
    //------------------------生成串口发送标志位,串口数据加载与卸载--------------------------
    reg [9:0] send_data=10'b1111111111;//待发送数据寄存器,1bit起始信号+8bit有效信号+1bit结束信号
    reg [3:0] bit_num=0;    //发送数据个数计数器
    reg uart_tx_o_r=1;        //发送数据寄存器,初始状态位高 
        
    always@(posedge clk)
    begin
        if(uart_tx_en_i)    //接收数据发送使能信号时,产生数据发送标志信号
            begin
                uart_send_flag<=1'b1;
                send_data<={1'b1,uart_tx_data_i,1'b0};//待发送数据寄存器装填,1bit起始信号0+8bit有效信号+1bit结束信号
            end
        else if(bit_num==4'd10)    //发送结束时候,清楚发送标志信号,并清除待发送数据寄存器内部信号
            begin
                uart_send_flag<=1'b0;
                send_data<=10'b1111_1111_11;
            end
    end
     
     //-------------------------串口数据发送----------------------------   
    always@(posedge clk)
    begin
        if(uart_send_flag)    //发送有效时候
            begin
                if(baud_bps)//检测发送点信号
                    begin
                        if(bit_num<=4'd9)
                            begin
                                uart_tx_o_r<=send_data[bit_num];    //发送待发送寄存器内数据,从低位到高位
                                bit_num<=bit_num+1'b1;
                            end
                    end
                else if(bit_num==4'd10)
                    bit_num<=4'd0;
            end
        else
            begin
                uart_tx_o_r<=1'b1;    //空闲状态时,保持发送端位高电平,以备发送时候产生低电平信号
                bit_num<=0;
            end
    end
    
    assign uart_tx_o=uart_tx_o_r;
    assign uart_tx_done = uart_send_flag;
    endmodule
    
    
    • uart_rx.v 
    module uart_rx #(
    parameter [13:0] BAUD_DIV     = 14'd10416 //波特率时钟,9600bps,100Mhz/9600=10416
    )
    (
    	input clk,
    	input uart_rx_i,
    	
    	output [7:0] uart_rx_data_o,
    	output uart_rx_done
     );
      
    parameter  BAUD_DIV_CAP = BAUD_DIV /2;//波特率时钟中间采样点,100Mhz/9600/2=5208
    
    
    //------------------------计数控制-------------------------------
    reg [13:0] baud_div=0;				            //波特率设置计数器
    reg baud_bps=0;					                //数据采样点信号
    reg bps_start=0;					            //波特率启动标志
    always@(posedge clk)
    begin
    	if(baud_div==BAUD_DIV_CAP)		            //当波特率计数器计数到采样点时,产生采样信号baud_bps
    		begin
    			baud_bps<=1'b1;
    			baud_div<=baud_div+1'b1;
    		end
    	else if(baud_div<BAUD_DIV && bps_start)    //当波特率计数器启动时,计数器累加
    		begin
    			baud_div<=baud_div+1'b1;
    			baud_bps<=0;
    		end
    	else
    		begin
    			baud_bps<=0;
    			baud_div<=0;
    		end
    end
    
    //--------------------通过低电平判断是否有数据输入---------------------
    reg [4:0] uart_rx_i_r=5'b11111;			      //数据接收缓存器
    always@(posedge clk)
    begin
    	uart_rx_i_r<={uart_rx_i_r[3:0],uart_rx_i};
    end
    //数据接收缓存器,当连续接收到五个低电平时,即uart_rx_int=0时,作为接收到起始信号
    wire uart_rx_int=uart_rx_i_r[4] | uart_rx_i_r[3] | uart_rx_i_r[2] | uart_rx_i_r[1] | uart_rx_i_r[0];
    
    
    //------------------------数据接收----------------------------------------
    reg [3:0] bit_num=0;	//接收数据个数计数器
    reg uart_rx_done_r=0;	//数据接收完成寄存器
    reg state=1'b0;
    
    reg [7:0] uart_rx_data_o_r0=0;//数据接收过程中,数据缓存器
    reg [7:0] uart_rx_data_o_r1=0;//数据接收完成,数据寄存器
    
    always@(posedge clk)
    begin
    	uart_rx_done_r<=1'b0;
    	case(state)
    		1'b0 : 
    			if(!uart_rx_int)//当连续接收到五个低电平时,即uart_rx_int=0时,作为接收到起始信号,启动波特率时钟
    				begin
    					bps_start<=1'b1;
    					state<=1'b1;
    				end
    		1'b1 :			
    			if(baud_bps)	//每次等待波特率采样中心时,接收数据,放入数据缓存器中
    				begin
    					bit_num<=bit_num+1'b1;
    					if(bit_num<4'd9)	//接收1bit起始信号,8bit有效信号,1bit结束信号
    						uart_rx_data_o_r0[bit_num-1]<=uart_rx_i;
    				end
    			else if(bit_num==4'd10) //接收完成时候,接收数据个数计数器清零,产生接收完成标志位,并将数据写入数据寄存器,关闭波特率时候
    				begin
    					bit_num<=0;
    					uart_rx_done_r<=1'b1;
    					uart_rx_data_o_r1<=uart_rx_data_o_r0;
    					state<=1'b0;//进入状态0,再次循环检测
    					bps_start<=0;
    				end
    		default:;
    	endcase
    end
    assign uart_rx_data_o=uart_rx_data_o_r1;		
    assign uart_rx_done=uart_rx_done_r;
    endmodule
    
    
    •  uart_tb.v
    `timescale 1ns/1ps
    module uart_tb ();
     
    reg clk;                  //100M时钟
    reg [7:0] uart_tx_data_i;   //待发送数据
    reg uart_tx_en_i;            //发送发送使能信号
    wire uart_tx_o;              //串口输出
    wire uart_tx_done;        // 串口发送结束信号 1:正在发送 0:发送结束
    
    wire [7:0] uart_rx_data_o;//接受并行数据
    wire uart_rx_done;//接收结束信号
    
    reg [8:0] tx_data_r[0:39];//待发送数据寄存数组
    reg [5:0] tx_icount;//发送计数
    initial
    begin
    	clk = 1'b1;
    	//寄存器组赋初值
    	$readmemh("F:/PID/uart/tx_data.txt",tx_data_r);
    	tx_icount = 6'd0;
    end
    
    always #5 clk = ~clk;
    //输入数据
    always @ (posedge clk) begin
    	if(!(uart_tx_done) && (!uart_tx_en_i))begin//控制上一数据传输完成然后输入下一数据
    		uart_tx_en_i <= 1'b1;
    		uart_tx_data_i <= tx_data_r[tx_icount];
    		tx_icount <= tx_icount + 1'd1;
    		if(tx_icount == 6'd40)
    			tx_icount <= 6'd0;
    	end
    	else 
    		uart_tx_en_i <= 1'b0;
    end
    uart_tx tx_demo(
    	.clk(clk),
    	.uart_tx_data_i(uart_tx_data_i),
    	.uart_tx_en_i(uart_tx_en_i),
    	.uart_tx_o(uart_tx_o),
    	.uart_tx_done(uart_tx_done)
    	);
    
    uart_rx rx_demo(
    	.clk(clk),
    	.uart_rx_i(uart_tx_o),
    	.uart_rx_data_o(uart_rx_data_o),
    	.uart_rx_done(uart_rx_done)
    	);
    
    endmodule
    
    • 仿真波形

    展开全文
  • 一、前言1、简介 写的这篇博客,是为了简单讲解一下UART通信协议,以及UART能够实现的一些功能,还有有关使用STM32...2、UART简介 嵌入式开发中,UART串口通信协议是我们常用的通信协议(UART、I2C、SPI等)之一...

    413437d159e153e124166b37737252a6.png

    一、前言

    1、简介

      写的这篇博客,是为了简单讲解一下UART通信协议,以及UART能够实现的一些功能,还有有关使用STM32CubeMX来配置芯片的一些操作,在后面我会以我使用的STM32F429开发板来举例讲解(其他STM32系列芯片大多数都可以按照这些步骤来操作的),如有不足请多多指教。

    2、UART简介

      嵌入式开发中,UART串口通信协议是我们常用的通信协议(UART、I2C、SPI等)之一,全称叫做通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)。

    3、准备工作

    1)Keil5

      链接:点击下载
      提取码:wrt9

    2)STMCubeMX5.1.0版本

      链接:点击下载
      提取码:20xs

    3)STMF429开发板

    953b030fd48388a266dafbd369aaf9e0.png
    注:
      只要是stm32的开发板都可以用到的,在STM32CubeMx里选对型号、配置好就行了。

    二、UART详解

    1、UART简介

      嵌入式开发中,UART串口通信协议是我们常用的通信协议(UART、I2C、SPI等)之一,全称叫做通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),是异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输,它能将要传输的资料在串行通信与并行通信之间加以转换,能够灵活地与外部设备进行全双工数据交换。

    注:
      在此开发板中,是有USART(Universal Synchronous Asynchronous Receiver and Transmitter通用同步异步收发器)串口的,USART相当于UART的升级版,USART支持同步模式,因此USART 需要同步始终信号USART_CK(如STM32 单片机),通常情况同步信号很少使用,因此一般的单片机UART和USART使用方式是一样的,都使用异步模式。因为USART的使用方法上跟UART基本相同,所以在此就以UART来讲该通信协议了。

    2、UART通信协议

    f7e4a144c86e0a5b92e104b91fe772a7.png

    1)起始位

      当未有数据发送时,数据线处于逻辑“1”状态;先发出一个逻辑“0”信号,表示开始传输字符。

    2)数据位

      紧接着起始位之后。资料位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。

    3)奇偶校验位

      资料为加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。

    4)停止位

      它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

    5)空闲位或起始位

      处于逻辑“1”状态,表示当前线路上没有资料传送,进入空闲状态。

      处于逻辑“0”状态,表示开始传送下一数据段。

    6)波特率

      表示每秒钟传送的码元符号的个数,是衡量数据传送速率的指标,它用单位时间内载波调制状态改变的次数来表示。

      常用的波特率有:9600、115200……

      时间间隔计算:1秒除以波特率得出的时间,例如,波特率为9600的时间间隔为1s / 9600(波特率) = 104us。

    3、UART功能说明

      接口通过三个引脚从外部连接到其它设备。任何 USART 双向通信均需要 至少两个引脚:接收数据输入引脚 (RX) 和发送数据引脚输出 (TX):RX:接收数据输入引脚就是串行数据输入引脚。过采样技术可区分有效输入数据和噪声,从而用于恢复数据。TX:发送数据输出引脚。如果关闭发送器,该输出引脚模式由其 I/O 端口配置决定。如果使 能了发送器但没有待发送的数据,则 TX 引脚处于高电平。在单线和智能卡模式下,该 I/O 用于发送和接收数据(USART 电平下,随后在 SW_RX 上接收数据)。

    1)正常 USART 模式下,通过这些引脚以帧的形式发送和接收串行数据:

    • 发送或接收前保持空闲线路
    • 起始位
    • 数据(字长 8 位或 9 位),最低有效位在前
    • 用于指示帧传输已完成的 0.5 个、1 个、1.5 个、2 个停止位
    • 该接口使用小数波特率发生器 - 带 12 位尾数和 4 位小数
    • 状态寄存器 (USART_SR)
    • 数据寄存器 (USART_DR)
    • 波特率寄存器 (USART_BRR) - 12 位尾数和 4 位小数。
    • 智能卡模式下的保护时间寄存器 (USART_GTPR)。

    2)在同步模式下连接时需要以下引脚:

    • SCLK:发送器时钟输出。该引脚用于输出发送器数据时钟,以便按照 SPI 主模式进行同步发送(起始位和结束位上无时钟脉冲,可通过软件向最后一个数据位发送时钟脉冲)。RX 上可同步接收并行数据。这一点可用于控制带移位寄存器的外设(如 LCD 驱动器)。时钟相位和极性可通过软件编程。在智能卡模式下,SCLK 可向智能卡提供时钟。在硬件流控制模式下需要以下引脚:
    • nCTS:“清除以发送”用于在当前传输结束时阻止数据发送(高电平时)。
    • nRTS:“请求以发送”用于指示 USART 已准备好接收数据(低电平时)。

    USART框图如下:

    f08b32e6790aa0df7dca68d2b104a220.png

    4、UART工作原理

    1)发送接收

      发送逻辑对从发送FIFO 读取的数据执行“并→串”转换。控制逻辑输出起始位在先的串行位流,并且根据控制寄存器中已编程的配置,后面紧跟着数据位(注意:最低位 LSB 先输出)、奇偶校验位和停止位。

      在检测到一个有效的起始脉冲后,接收逻辑对接收到的位流执行“串→并”转换。此外还会对溢出错误、奇偶校验错误、帧错误和线中止(line-break)错误进行检测,并将检测到的状态附加到被写入接收FIFO 的数据中。

    2)波特率产生

      波特率除数(baud-rate divisor)是一个22 位数,它由16 位整数和6 位小数组成。波特率发生器使用这两个值组成的数字来决定位周期。通过带有小数波特率的除法器,在足够高的系统时钟速率下,UART 可以产生所有标准的波特率,而误差很小。

    3)数据收发

      发送时,数据被写入发送FIFO。如果UART 被使能,则会按照预先设置好的参数(波特率、数据位、停止位、校验位等)开始发送数据,一直到发送FIFO 中没有数据。一旦向发送FIFO 写数据(如果FIFO 未空),UART 的忙标志位BUSY 就有效,并且在发送数据期间一直保持有效。BUSY 位仅在发送FIFO 为空,且已从移位寄存器发送最后一个字符,包括停止位时才变无效。即 UART 不再使能,它也可以指示忙状态。

      在UART 接收器空闲时,如果数据输入变成“低电平”,即接收到了起始位,则接收计数器开始运行,并且数据在Baud16 的第8 个周期被采样。如果Rx 在Baud16 的第8 周期仍然为低电平,则起始位有效,否则会被认为是错误的起始位并将其忽略。

      如果起始位有效,则根据数据字符被编程的长度,在 Baud16 的每第 16 个周期(即一个位周期之后)对连续的数据位进行采样。如果奇偶校验模式使能,则还会检测奇偶校验位。

      最后,如果Rx 为高电平,则有效的停止位被确认,否则发生帧错误。当接收到一个完整的字符时,将数据存放在接收FIFO 中。

    4)中断控制

      出现以下情况时,可使UART 产生中断:

    • FIFO 溢出错误
    • 线中止错误(line-break,即Rx 信号一直为0 的状态,包括校验位和停止位在内)
    • 奇偶校验错误
    • 帧错误(停止位不为1)
    • 接收超时(接收FIFO 已有数据但未满,而后续数据长时间不来)
    • 发送
    • 接收

      由于所有中断事件在发送到中断控制器之前会一起进行“或运算”操作,所以任意时刻 UART 只能向中断产生一个中断请求。通过查询中断状态函数,软件可以在同一个中断服务函数里处理多个中断事件(多个并列的if 语句)。

    5)FIFO 操作

      FIFO 是“First-In First-Out”的缩写,意为“先进先出”,是一种常见的队列操作。 Stellaris 系列ARM 的UART 模块包含有2 个16 字节的FIFO:一个用于发送,另一个用于接收。可以将两个FIFO 分别配置为以不同深度触发中断。可供选择的配置包括:1/8、 1/4、1/2、3/4 和7/8 深度。例如,如果接收FIFO 选择1/4,则在UART 接收到4 个数据时产生接收中断。

    发送FIFO的基本工作过程: 只要有数据填充到发送FIFO 里,就会立即启动发送过程。由于发送本身是个相对缓慢的过程,因此在发送的同时其它需要发送的数据还可以继续填充到发送 FIFO 里。当发送 FIFO 被填满时就不能再继续填充了,否则会造成数据丢失,此时只能等待。这个等待并不会很久,以9600 的波特率为例,等待出现一个空位的时间在1ms 上下。发送 FIFO 会按照填入数据的先后顺序把数据一个个发送出去,直到发送 FIFO 全空时为止。已发送完毕的数据会被自动清除,在发送FIFO 里同时会多出一个空位。

    接收FIFO的基本工作过程: 当硬件逻辑接收到数据时,就会往接收FIFO 里填充接收到的数据。程序应当及时取走这些数据,数据被取走也是在接收FIFO 里被自动删除的过程,因此在接收 FIFO 里同时会多出一个空位。如果在接收 FIFO 里的数据未被及时取走而造成接收FIFO 已满,则以后再接收到数据时因无空位可以填充而造成数据丢失。

      收发FIFO 主要是为了解决UART 收发中断过于频繁而导致CPU 效率不高的问题而引入的。在进行 UART 通信时,中断方式比轮询方式要简便且效率高。但是,如果没有收发 FIFO,则每收发一个数据都要中断处理一次,效率仍然不够高。如果有了收发FIFO,则可以在连续收发若干个数据(可多至14 个)后才产生一次中断然后一并处理,这就大大提高了收发效率。

      完全不必要担心FIFO 机制可能带来的数据丢失或得不到及时处理的问题,因为它已经帮你想到了收发过程中存在的任何问题,只要在初始化配置UART 后,就可以放心收发了, FIFO 和中断例程会自动搞定一切。

    6)回环操作

      UART 可以进入一个内部回环(Loopback)模式,用于诊断或调试。在回环模式下,从Tx 上发送的数据将被Rx 输入端接收。

    三、CubeMx配置

    说明:
      在使用STM32CubeMx配置的时候,首先要选择正在使用的芯片的型号,再配置芯片的时钟,然后才去配置所需要用到的功能。

    1、新建项目

    1)选择新建

    fd2b571a814f62cb852eca98cc6d4799.png

    2)选择芯片型号

    c62267daa31d8e2986e5df936e8817bf.png

    2、时钟配置

    1)配置界面

    8777c461ee1de1f38be9518e77c2c48e.png

    2)时钟模式配置

    19bb1cd6cf551e4a099ff2b0a47844fe.png

    3)设置调试接口

    76e5a0b874e956401834c8e8c0caeeab.png

    4)时钟配置(尽量将下面方框内的值设成最高值即可)

    c92a42c0d7118c3cf24f311e0aeb9b1b.png

    3、功能配置

    1)启用串口

    8762c305de1b4fd565939302a441a441.png

    2)配置串口(默认即可,波特率为115200)

    3bf1f047adac76734ae4d5d286bfefb7.png

    4、生成工程

    1)项目信息设置

    5e384d504cd2f1f4d9508414b918be46.png

    2)选择生成必要的代码

    7d46dc8fa635741cf1d7fd8387260661.png

    3)生成代码

    3ac7fdceb9e2fbdf68536c53c777a897.png

    4)打开项目(生成代码成功后会弹出窗口,可以直接打开工程)

    7b1f1367fd0cb0ea0dc9ec806ad0e11b.png
    注:
      因为STM32CubeMX自动生成的代码中,没有设置把每次下载烧写都重置一下,所以生成代码后,我们需要自己选上该功能,步骤如下:1)功能界面

    7df6074330f02b7f1cf907f567102fd0.png

    2)选择小锤子

    11316e670cecd4b79fbba6639b79c549.png

    3)选择Debug->Settings

    35693941e922787328e5291228f2e691.png

    4)选择Flash Download->勾选Reset and Run

    5983075282bb708206a0cc7e3208e0ba.png


      完成上面的操作后,在每次烧写都会重置,并运行新下载烧写的程序了。

    四、HAL库关键函数说明

    1、初始化/还原初始化函数

    /* Initialization/de-initialization functions  **********************************/
    HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart);                                                    //根据UART_InitTypeDef中指定的参数初始化UART模式,并创建关联的句柄。
    HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart);                                              //根据UART_InitTypeDef中指定的参数初始化半双工模式并创建关联句柄。
    HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLength);                         //根据UART_InitTypeDef中指定的参数初始化LIN模式,并创建关联的句柄。
    HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Address, uint32_t WakeUpMethod);  //根据UART_InitTypeDef中指定的参数初始化多处理器模式,并创建关联的句柄。
    HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart);                                                  //非初始化UART外围设备。
    void HAL_UART_MspInit(UART_HandleTypeDef *huart);                                                              //弱函数UART MSP初始化
    void HAL_UART_MspDeInit(UART_HandleTypeDef *huart);                                                            //弱函数UART MSP初始化还原

    2、IO口操作函数

    /* IO operation functions *******************************************************/
    HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);//以阻塞模式发送大量数据。
    HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); //在阻塞模式下接收大量数据。
    HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);               //以非阻塞模式发送大量数据。
    HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);                //在非阻塞模式下接收大量数据。
    HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);              //以非阻塞模式发送大量数据。
    HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);               //在非阻塞模式下接收大量数据。
    HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart);                                                 //暂停DMA传输。
    HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart);                                                //恢复DMA传输。
    HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart);                                                  //停止DMA传输。

    3、传输中断函数

    /* Transfer Abort functions */
    HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart);            //中止正在进行的传输(阻塞模式)。
    HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart);    //中止正在进行的传输传输(阻塞模式)。
    HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart);     //中止正在进行的接收传输(阻塞模式)。
    HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart);         //中止正在进行的传输(中断模式)。
    HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart); //中止正在进行的传输(中断模式)。
    HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart);  //中止正在进行的接收传输(中断模式)。

    4、中断处理及回调函数

    void HAL_UART_IRQHandler(UART_HandleTypeDef *huart);                    //函数处理UART中断请求。
    void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);                //Tx传输完成回调函数。
    void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);            //Tx半传输完成回调函数。
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);                //Rx传输完成回调函数。
    void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);            //Rx完成一半传输回调函数。
    void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart);                 //UART错误回调函数。
    void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart);             //UART中止完成回调函数。
    void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart);     //UART中止完成回调函数。
    void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart);      //UART中止接收完整的回调函数。

    五、结尾

    1、总结

      这篇博客主要是讲解一下UART串口通信协议的时序、功能以及工作原理,还有使用STM32CubeMX来配置USART。而还未讲到有关HAL库函数的函数调用,有了STM32CubeMX生成的这个HAL库函数,我们基本不用管协议上的事情了,可以直接调用里面的发送或接收函数来实现UART通信。而我也会在后续继续编写有关HAL库的调用说明,详细说一下HAL库是如何使用的。

    嵌入式物联网资料分享交流群:332650978 入群有全套学习视频资料电子书免费赠送!

    参考资料:

    嵌入式开发直播课 - STM32 USART串口的应用www.makeru.com.cn物联网开发 - PWM脉宽调制技术www.makeru.com.cn
    5a3321bfde7dfb9a99ce5ef0707cdc83.png
    物联网开发入门直播课 - 基于STM32讲解串口操作www.makeru.com.cn
    c77044c2a2b583f62642851f1303216a.png
    物联网开发入门直播课 - 通过Z-stack协议栈实现串口透传www.makeru.com.cn嵌入式开发直播课 - 轻松掌握STM32电机驱动www.makeru.com.cn
    c77044c2a2b583f62642851f1303216a.png
    展开全文
  • 一、前言1、简介写的这篇博客,是为了简单讲解一下UART通信协议,以及UART能够实现的一些功能,还有有关使用STM32...2、UART简介嵌入式开发中,UART串口通信协议是我们常用的通信协议(UART、I2C、SPI等)之一,全称叫...

    一、前言

    1、简介

    写的这篇博客,是为了简单讲解一下UART通信协议,以及UART能够实现的一些功能,还有有关使用STM32CubeMX来配置芯片的一些操作,在后面我会以我使用的STM32F429开发板来举例讲解(其他STM32系列芯片大多数都可以按照这些步骤来操作的),如有不足请多多指教。

    2、UART简介

    嵌入式开发中,UART串口通信协议是我们常用的通信协议(UART、I2C、SPI等)之一,全称叫做通用异步收发传输器(Universal

    Asynchronous Receiver/Transmitter)。

    3、准备工作

    1)Keil5

    链接:点击

    提取码:wrt9

    2)STMCubeMX5.1.0版本

    链接:点击

    提取码:20xs

    3)STMF429开发板

    注:

    只要是stm32的开发板都可以用到的,在STM32CubeMx里选对型号、配置好就行了。

    二、UART详解

    1、UART简介

    嵌入式开发中,UART串口通信协议是我们常用的通信协议(UART、I2C、SPI等)之一,全称叫做通用异步收发传输器(Universal

    Asynchronous

    Receiver/Transmitter),是异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输,它能将要传输的资料在串行通信与并行通信之间加以转换,能够灵活地与外部设备进行全双工数据交换。

    注:

    在此开发板中,是有USART(Universal Synchronous Asynchronous Receiver and

    Transmitter通用同步异步收发器)串口的,USART相当于UART的升级版,USART支持同步模式,因此USART

    需要同步始终信号USART_CK(如STM32

    单片机),通常情况同步信号很少使用,因此一般的单片机UART和USART使用方式是一样的,都使用异步模式。因为USART的使用方法上跟UART基本相同,所以在此就以UART来讲该通信协议了。

    2、UART通信协议

    1)起始位

    当未有数据发送时,数据线处于逻辑“1”状态;先发出一个逻辑“0”信号,表示开始传输字符。

    2)数据位

    紧接着起始位之后。资料位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。

    3)奇偶校验位

    资料为加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。

    4)停止位

    它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。

    由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

    5)空闲位或起始位

    处于逻辑“1”状态,表示当前线路上没有资料传送,进入空闲状态。

    处于逻辑“0”状态,表示开始传送下一数据段。

    6)波特率

    表示每秒钟传送的码元符号的个数,是衡量数据传送速率的指标,它用单位时间内载波调制状态改变的次数来表示。

    常用的波特率有:9600、115200……

    时间间隔计算:1秒除以波特率得出的时间,例如,波特率为9600的时间间隔为1s / 9600(波特率) = 104us。

    3、UART功能说明

    接口通过三个引脚从外部连接到其它设备。任何 USART 双向通信均需要 至少两个引脚:接收数据输入引脚 (RX)

    和发送数据引脚输出 (TX):

    RX:接收数据输入引脚就是串行数据输入引脚。过采样技术可区分有效输入数据和噪声,从而用于恢复数据。

    TX:发送数据输出引脚。如果关闭发送器,该输出引脚模式由其

    I/O 端口配置决定。如果使 能了发送器但没有待发送的数据,则 TX 引脚处于高电平。在单线和智能卡模式下,该 I/O

    用于发送和接收数据(USART 电平下,随后在 SW_RX 上接收数据)。

    1)正常 USART 模式下,通过这些引脚以帧的形式发送和接收串行数据:

    发送或接收前保持空闲线路

    起始位

    数据(字长 8 位或 9 位),最低有效位在前

    用于指示帧传输已完成的 0.5 个、1 个、1.5 个、2 个停止位

    该接口使用小数波特率发生器 - 带 12 位尾数和 4 位小数

    状态寄存器 (USART_SR)

    数据寄存器 (USART_DR)

    波特率寄存器 (USART_BRR) - 12 位尾数和 4 位小数。

    智能卡模式下的保护时间寄存器 (USART_GTPR)。

    2)在同步模式下连接时需要以下引脚:

    SCLK:发送器时钟输出。该引脚用于输出发送器数据时钟,以便按照 SPI

    主模式进行同步发送(起始位和结束位上无时钟脉冲,可通过软件向最后一个数据位发送时钟脉冲)。RX

    上可同步接收并行数据。这一点可用于控制带移位寄存器的外设(如 LCD 驱动器)。时钟相位和极性可通过软件编程。在智能卡模式下,SCLK

    可向智能卡提供时钟。在硬件流控制模式下需要以下引脚:

    nCTS:“清除以发送”用于在当前传输结束时阻止数据发送(高电平时)。

    nRTS:“请求以发送”用于指示 USART 已准备好接收数据(低电平时)。

    USART框图如下:

    4、UART工作原理

    1)发送接收

    发送逻辑对从发送FIFO

    读取的数据执行“并→串”转换。控制逻辑输出起始位在先的串行位流,并且根据控制寄存器中已编程的配置,后面紧跟着数据位(注意:最低位

    LSB 先输出)、奇偶校验位和停止位。

    在检测到一个有效的起始脉冲后,接收逻辑对接收到的位流执行“串→并”转换。此外还会对溢出错误、奇偶校验错误、帧错误和线中止(line-break)错误进行检测,并将检测到的状态附加到被写入接收FIFO

    的数据中。

    2)波特率产生

    波特率除数(baud-rate divisor)是一个22 位数,它由16 位整数和6

    位小数组成。波特率发生器使用这两个值组成的数字来决定位周期。通过带有小数波特率的除法器,在足够高的系统时钟速率下,UART

    可以产生所有标准的波特率,而误差很小。

    3)数据收发

    发送时,数据被写入发送FIFO。如果UART

    被使能,则会按照预先设置好的参数(波特率、数据位、停止位、校验位等)开始发送数据,一直到发送FIFO 中没有数据。一旦向发送FIFO

    写数据(如果FIFO 未空),UART 的忙标志位BUSY 就有效,并且在发送数据期间一直保持有效。BUSY 位仅在发送FIFO

    为空,且已从移位寄存器发送最后一个字符,包括停止位时才变无效。即 UART 不再使能,它也可以指示忙状态。

    在UART 接收器空闲时,如果数据输入变成“低电平”,即接收到了起始位,则接收计数器开始运行,并且数据在Baud16 的第8

    个周期被采样。如果Rx 在Baud16 的第8 周期仍然为低电平,则起始位有效,否则会被认为是错误的起始位并将其忽略。

    如果起始位有效,则根据数据字符被编程的长度,在 Baud16 的每第 16

    个周期(即一个位周期之后)对连续的数据位进行采样。如果奇偶校验模式使能,则还会检测奇偶校验位。

    最后,如果Rx 为高电平,则有效的停止位被确认,否则发生帧错误。当接收到一个完整的字符时,将数据存放在接收FIFO

    中。

    4)中断控制

    出现以下情况时,可使UART 产生中断:

    FIFO

    溢出错误

    线中止错误(line-break,即Rx 信号一直为0 的状态,包括校验位和停止位在内)

    奇偶校验错误

    帧错误(停止位不为1)

    接收超时(接收FIFO

    已有数据但未满,而后续数据长时间不来)

    发送

    接收

    由于所有中断事件在发送到中断控制器之前会一起进行“或运算”操作,所以任意时刻 UART

    只能向中断产生一个中断请求。通过查询中断状态函数,软件可以在同一个中断服务函数里处理多个中断事件(多个并列的if 语句)。

    5)FIFO 操作

    FIFO 是“First-In First-Out”的缩写,意为“先进先出”,是一种常见的队列操作。 Stellaris

    系列ARM 的UART 模块包含有2 个16 字节的FIFO:一个用于发送,另一个用于接收。可以将两个FIFO

    分别配置为以不同深度触发中断。可供选择的配置包括:1/8、 1/4、1/2、3/4 和7/8 深度。例如,如果接收FIFO

    选择1/4,则在UART 接收到4 个数据时产生接收中断。

    发送FIFO的基本工作过程: 只要有数据填充到发送FIFO

    里,就会立即启动发送过程。由于发送本身是个相对缓慢的过程,因此在发送的同时其它需要发送的数据还可以继续填充到发送 FIFO 里。当发送

    FIFO 被填满时就不能再继续填充了,否则会造成数据丢失,此时只能等待。这个等待并不会很久,以9600

    的波特率为例,等待出现一个空位的时间在1ms 上下。发送 FIFO 会按照填入数据的先后顺序把数据一个个发送出去,直到发送 FIFO

    全空时为止。已发送完毕的数据会被自动清除,在发送FIFO 里同时会多出一个空位。

    接收FIFO的基本工作过程: 当硬件逻辑接收到数据时,就会往接收FIFO

    里填充接收到的数据。程序应当及时取走这些数据,数据被取走也是在接收FIFO 里被自动删除的过程,因此在接收 FIFO

    里同时会多出一个空位。如果在接收 FIFO 里的数据未被及时取走而造成接收FIFO

    已满,则以后再接收到数据时因无空位可以填充而造成数据丢失。

    收发FIFO 主要是为了解决UART 收发中断过于频繁而导致CPU 效率不高的问题而引入的。在进行 UART

    通信时,中断方式比轮询方式要简便且效率高。但是,如果没有收发

    FIFO,则每收发一个数据都要中断处理一次,效率仍然不够高。如果有了收发FIFO,则可以在连续收发若干个数据(可多至14

    个)后才产生一次中断然后一并处理,这就大大提高了收发效率。

    完全不必要担心FIFO

    机制可能带来的数据丢失或得不到及时处理的问题,因为它已经帮你想到了收发过程中存在的任何问题,只要在初始化配置UART

    后,就可以放心收发了, FIFO 和中断例程会自动搞定一切。

    6)回环操作

    UART 可以进入一个内部回环(Loopback)模式,用于诊断或调试。在回环模式下,从Tx 上发送的数据将被Rx

    输入端接收。

    三、CubeMx配置

    说明:

    在使用STM32CubeMx配置的时候,首先要选择正在使用的芯片的型号,再配置芯片的时钟,然后才去配置所需要用到的功能。

    1、新建项目

    1)选择新建

    2)选择芯片型号

    2、时钟配置

    1)配置界面

    2)时钟模式配置

    3)设置调试接口

    4)时钟配置(尽量将下面方框内的值设成最高值即可)

    3、功能配置

    1)启用串口

    2)配置串口(默认即可,波特率为115200)

    4、生成工程

    1)项目信息设置

    2)选择生成必要的代码

    3)生成代码

    4)打开项目(生成代码成功后会弹出窗口,可以直接打开工程)

    注:

    因为STM32CubeMX自动生成的代码中,没有设置把每次下载烧写都重置一下,所以生成代码后,我们需要自己选上该功能,步骤如下:

    1)功能界面

    2)选择小锤子

    3)选择Debug->Settings

    4)选择Flash Download->勾选Reset and Run

    完成上面的操作后,在每次烧写都会重置,并运行新下载烧写的程序了。

    四、HAL库关键函数说明

    1、初始化/还原初始化函数

    HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef

    *huart); //根据UART_InitTypeDef中指定的参数初始化UART模式,并创建关联的句柄。

    HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef

    *huart); //根据UART_InitTypeDef中指定的参数初始化半双工模式并创建关联句柄。

    HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart,

    uint32_t BreakDetectLength); //根据UART_InitTypeDef中指定的参数初始化LIN模式,并创建关联的句柄。

    HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef

    *huart, uint8_t Address, uint32_t WakeUpMethod); //根据UART_InitTypeDef中指定的参数初始化多处理器模式,并创建关联的句柄。

    HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef

    *huart); //非初始化UART外围设备。

    void HAL_UART_MspInit(UART_HandleTypeDef

    *huart); //弱函数UART MSP初始化

    void HAL_UART_MspDeInit(UART_HandleTypeDef

    *huart); //弱函数UART

    MSP初始化还原

    2、IO口操作函数

    HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart,

    uint8_t *pData, uint16_t Size, uint32_t

    Timeout);//以阻塞模式发送大量数据。

    HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart,

    uint8_t *pData, uint16_t Size, uint32_t Timeout);

    //在阻塞模式下接收大量数据。

    HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef

    *huart, uint8_t *pData, uint16_t Size); //以非阻塞模式发送大量数据。

    HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef

    *huart, uint8_t *pData, uint16_t Size); //在非阻塞模式下接收大量数据。

    HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef

    *huart, uint8_t *pData, uint16_t Size); //以非阻塞模式发送大量数据。

    HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef

    *huart, uint8_t *pData, uint16_t Size); //在非阻塞模式下接收大量数据。

    HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef

    *huart); //暂停DMA传输。

    HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef

    *huart); //恢复DMA传输。

    HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef

    *huart); //停止DMA传输。

    3、传输中断函数

    HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef

    *huart); //中止正在进行的传输(阻塞模式)。

    HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef

    *huart); //中止正在进行的传输传输(阻塞模式)。

    HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef

    *huart); //中止正在进行的接收传输(阻塞模式)。

    HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef

    *huart); //中止正在进行的传输(中断模式)。

    HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef

    *huart); //中止正在进行的传输(中断模式)。

    HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef

    *huart); //中止正在进行的接收传输(中断模式)。

    4、中断处理及回调函数

    void HAL_UART_IRQHandler(UART_HandleTypeDef

    *huart); //函数处理UART中断请求。

    void HAL_UART_TxCpltCallback(UART_HandleTypeDef

    *huart); //Tx传输完成回调函数。

    void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef

    *huart); //Tx半传输完成回调函数。

    void HAL_UART_RxCpltCallback(UART_HandleTypeDef

    *huart); //Rx传输完成回调函数。

    void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef

    *huart); //Rx完成一半传输回调函数。

    void HAL_UART_ErrorCallback(UART_HandleTypeDef

    *huart); //UART错误回调函数。

    void HAL_UART_AbortCpltCallback(UART_HandleTypeDef

    *huart); //UART中止完成回调函数。

    void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef

    *huart); //UART中止完成回调函数。

    void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef

    *huart); //UART中止接收完整的回调函数。

    嵌入式物联网资料分享交流群:707159742 入群有全套学习视频资料电子书免费赠送!

    参考资料:

    展开全文
  • 一、前言 1、简介  写的这篇博客,是为了简单讲解一下UART通信协议,以及UART能够实现的一些功能,还有有关使用STM32CubeMX来配置芯片的一些... 嵌入式开发中,UART串口通信协议是我们常用的通信协议(UART、I2C...
  • 一、前言 1、简介  在上一篇UART详解中,已经有了关于UART的详细介绍了,也... 嵌入式开发中,UART串口通信协议是我们常用的通信协议之一,全称叫做通用异步收发传输器(Universal Asynchronous Receiver/Transm...
  • 一、前言 ... 嵌入式开发中,UART串口通信协议是我们常用的通信协议之一,全称叫做通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)。 3、准备工作  在UART详解中已经有...
  • 一、前言1、简介 写的这篇博客,是为了简单讲解一下UART通信协议,以及UART能够实现的一些功能,还有有关使用STM32...2、UART简介 嵌入式开发中,UART串口通信协议是我们常用的通信协议(UART、I2C、SPI等)之一...
  • UART串口通信协议概述

    万次阅读 2018-12-12 22:05:38
    1.UART协议介绍 UART是一种通用串行数据总线,用于异步通信UART能实现双向通信,在嵌入式设计中,常用于主机与辅助设备通信UART包括RS232、RS449、RS423等接口标准规范和总线标准规范,即UART是异步串行通信口...
  • 2、UART简介 嵌入式开发中,UART串口通信协议是我们常用的通信协议之一,全称叫做通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)。3、准备工作 在UART详解中已经有了详细的说明,按照里面的....
  • 前几天刚开始学习FPGA,正好学到UART...接下来是正题UART通信协议,主要是通过状态机编写 发送部分之一 //状态机 always@(*) begin case(state) S_IDLE: if(tx_data_valid == 1'b1) next_state <= S_...
  •  前面在UART发送中已经讲解过如何调用HAL库的HAL_UART_Transmit函数来实现串口发送,而在调用这个函数来实现串口发送的话,但是在发送数据或者字符的时候,需要将数据或字符都先转换成字符并存在一个数组,或者分...
  • 通信协议篇——UART串口通信

    千次阅读 2019-11-12 20:48:15
    通信协议篇——UART串口通信
  • 基于FPGA Uart串口通信实验

    万次阅读 多人点赞 2017-09-04 19:16:10
    基于FPGA Uart串口通信实验首先需要了解uart串口通信协议,根据个人专业需求不同,了解的层面可以不同。 UART简介 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART。UART通信在...
  • Android UART串口通信总结

    千次阅读 2018-09-01 14:24:28
    通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器,UART作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。 数据结...
  • UART串口通讯协议解析

    千次阅读 2021-02-26 11:44:04
    UART串口通讯协议解析概述接口通信协议 概述 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART。它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 618
精华内容 247
关键字:

uart串口通信协议