精华内容
下载资源
问答
  • labview串口通讯程序框图

    热门讨论 2010-07-28 16:46:43
    包含多个不同应用的串口通讯的labview程序
  • STM32串口通信相关知识 一、串行通信接口背景知识 处理器与外部设备通信的两种方式:并行通信和串行通信 并行通信 传输原理:数据各个位同时传输。 优点:速度快 缺点:占用引脚资源多 串行通信 传输原理:...

    STM32串口通信相关知识

    一、串行通信接口背景知识

    处理器与外部设备通信的两种方式:并行通信和串行通信

    并行通信

    传输原理:数据各个位同时传输。

    优点:速度快

    缺点:占用引脚资源多

    串行通信

    传输原理:数据按位顺序传输。

    优点:占用引脚资源少

    缺点:速度相对较慢

    串行通信按照数据传送方向分为:

    (a)单工:数据传输只支持数据在一个方向上传输

    (b)半双工:允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信

    (c)全双工:允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。

    串行通信的通信方式

    (1)同步通信:带时钟同步信号传输。比如,SPI、IIC通信接口。

    (2)异步通信:不带时钟同步信号。比如,UART(通用异步收发器)、单总线。

    异步通信UART包含三点知识:

    (1) 物理层(电气层:接口决定):

    通信接口(RS232,RS485,RS422,TTL)

    (2) 数据格式(数据层:芯片决定)

    包括起始位,停止位,校验位,数据位等

    (3) 通信协议(协议层:程序决定)

     

    二、STM32串口通信过程和数据格式

     

     

    三、串口通信框图和波特率计算方法

     

    RX接收串口输入的数据,并把它传到接收移位寄存器,再把它传到接收数据寄存器,之后CPU通过总线去读取它。CPU通过总线写入发送数据寄存器,并把它传到发送移位寄存器,之后TX把数据发送出去。

    发送移位寄存器和接收移位寄存器的发送和接收是由波特率所控制的。从发送控制和接收控器分别有两个箭头指向了发送移位寄存器和接收移位寄存器。

    而发送控制和接收器控制的时钟是由图中左下角产生的,图中右下角产生分数分频系数USARTDIV

    波特率计算公式

    控制寄存器1(USART_CR1)的位15

     

    展开全文
  • 串口通信的基本概念及原理理解 2017/11/12 22:52 1.同步通信和异步通信: 异步通信:指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致,即...
    一.串口通信的基本概念及原理理解 2017/11/12 22:52
    1.同步通信和异步通信:
    异步通信:指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致,即发送方和接收方没有统一的时钟节拍、而各自按照自己的节拍工作。
    异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的时间间隔是任意的,但每个字符中的各位是以固定的时间传送的,即字符之间不一定有“位间隔”的整数倍的关系,但同一字符内的各位之间的距离均为“位间隔”的整数倍。如下图所示。

    同步通信时要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,即保持位同步关系,也保持字符同步关系。以上图异步通信传输示意图做参考。
    2.电平信号和差分信号
    (1)、电平信号和差分信号是用来描述通信线路传输方式的。也就是说如何在通信线路上表达1和0.
    (2)、电平信号的传输线中有一个参考电平线(一般是GND),然后信号线上的信号值是由信号线电平和参考电平线的电压差决定。
    (3)、差分信号的传输线中没有参考电平,所有都是信号线。然后1和0的表达靠信号线之间的电压差。
    总结:电平信号的2根通信线之间的电平差异容易受到干扰,传输容易失败;差分信号不容易受到干扰因此传输质量比较稳定,现代通信一般都使用差分信号,电平信号几乎没有了。
    总结2:看起来似乎相同根数的通信线下,电平信号要比差分信号要快;但是实际还是差分信号快,因为差分信号抗干扰能力强,因此1个发送周期更短。
    3.并行串行通讯概念及特点
    (1)并行通信是指数据的各位同时在多根数据线上发送或接收.
    串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。其只需要少数几条线就可以。
    (2)并行特点:控制简单、传输速度快;由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难.信号线占用多。
    (3)在系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的远距离通信.
    串行特点:传输线少,长距离传送时成本低,但数据的传送控制比并行通信复杂.
    总结:其实这么多年发展,最终胜出的是:异步、串行、差分,譬如USB和网络通信。
    4.串口通信的基本概念
    4.1 串口通信的特点:异步、电平信号、串行
    (1)、异步:串口通信的发送方和接收方之间是没有统一的时钟信号的。
    (2)、电平信号:串口通信出现的时间较早,速率较低,传输的距离较近,所以干扰还不太明显,因此当时使用了电平信号传输。后期出现的传输协议都改成差分信号传输了。
    (3)、串行通信:串口通信每次同时只能传输1个二进制位。
    4.2 RS232电平和TTL电平
    (1)电平信号是用信号线电平减去参考线电平得到电压差,这个电压差决定传输值是1或0.
    (2)在电平信号时多少V代表1,多少V代表0不是固定的,取决于电平标准。譬如RS232电平中-3V~-15V表示1;+3~+15V表示0;TTL电平则是+5V表示1,0V表示0.
    (3)不管哪种电平都是为了在传输线上表示1和0.区别在于适用的环境和条件不同。RS232的电平定义比较大,适合干扰大、距离远的情况;TTL电平电压范围小,适合距离近且干扰小的情况。
    总结:串口通信时因为是异步通信,所以通信双方必须事先约定好通信参数,这些通信参数包括:波特率、数据位、奇偶校验位、停止位(串口通信中起始位定义是唯一的,所以一般不用选择)
    4.3 串行通信的制式
    单工:单向的(或者是收或者是发)
    半双工:(串行通信)收/发不可同时进行
    全双工:(串行通信)收/发可同时进行
    如图所示:

    串口通信线最少需要2根(GND和信号线),可以实现单工通信,也可以使用3根通信线(Tx、Rx、GND)来实现全双工。
    5.S5PV210串行通信接口详解
    5.1S5PV210的串口控制器工作原理框图

    (1)transmitter由发送缓冲区和发送移位器构成。我们要发送信息时,首先将信息进行编码(一般用ASCII码)成二进制流,然后将一帧数据(一般是8位)写入发送缓冲区(从这里以后程序就不用管了,剩下的发送部分是硬件自动的),发送移位器会自动从发送缓冲区中读取一帧数据,然后自动移位(移位的目的是将一帧数据的各个位分别拿出来)将其发送到Tx通信线上。
    (2)receiver由接收缓冲区和接收移位器构成。当有人通过串口线向我发送信息时,信息通过Rx通信线进入我的接收移位器,然后接收移位器自动移位将该二进制位保存入我的接收缓冲区,接收完一帧数据后receiver会产生一个中断给CPU,CPU收到中断后即可知道receiver接收满了一帧数据,就会来读取这帧数据。
    (3)串口控制器中有一个波特率发生器作用是产生串口发送/接收的节拍时钟。波特率发生器其实就是个时钟分频器,它的工作需要源时钟(APB总线来),然后内部将源时钟进行分频(软件设置寄存器来配置)得到目标时钟,然后再用这个目标时钟产生波特率(硬件自动的)。
    5.2S5PV210串行通信接口扩展功能详解
    FIFO模式及其作用
    (1)典型的串口设计,发送/接收缓冲区只有1字节,每次发送/接收只能处理1帧数据。这样在单片机中没什么问题,但是到复杂SoC中(一般有操作系统的)就会有问题,会导致效率低下,因为CPU需要不断切换上下文。
    (2)解决方案就是想办法扩展串口控制器的发送/接收缓冲区,譬如将发送/接收缓冲器设置为64字节,CPU一次过来直接给发送缓冲区64字节的待发送数据,然后transmitter慢慢发,发完再找CPU再要64字节。但是串口控制器本来的发送/接收缓冲区是固定的1字节长度的,所以做了个变相的扩展,就是FIFO。
     FIFO(数据结构中的先入先出队列,这里这个大的缓冲区叫FIFO是因为这个缓冲区的工作方式类似于FIFO这种数据结构。,例如OV7670等摄像头的FIFO芯片,原理也一样。
    DMA模式及其作用
    (1)DMA direct memory access,直接内存访问。DMA本来是DSP中的一种技术,DMA技术的核心就是在交换数据时不需要CPU参与,模块可以自己完成。例如STM32的内部DMA寄存器
    (2)DMA模式要解决的问题和上面FIFO模式是同一个问题,就是串口发送/接收要频繁的折腾CPU造成CPU反复切换上下文导致系统效率低下。
    (3)传统的串口工作方式(无FIFO无DMA)效率是最低的,适合低端单片机;高端单片机上CPU事物繁忙所以都需要串口能够自己完成大量数据发送/接收。这时候就需要FIFO或者DMA模式。FIFO模式是一种轻量级的解决方案,DMA模式适合大量数据迸发式的发送/接收时。
    IrDA模式及其用法
    (1)IrDA其实就是红外线通信
    (2)红外通信的原理是发送方固定间隔时间向接收方发送红外信号(表示1或0)或者不发送红外信号(表示0或者1),接收方每隔固定时间去判断有无红外线信号来接收1和0.
    (3)分析可知,红外通信和串口通信非常像,都是每隔固定时间发送1或者0(判断1或0的物理方式不同)给接收方来通信。因此210就利用串口通信来实现了红外发送和接收。
    (4)210的某个串口支持IrDA模式,开启红外模式后,我们只需要向串口写数据,这些数据就会以红外光的方式向外发射出去(当然是需要一些外部硬件支持的),然后接收方接收这些红外数据即可解码得到我们的发送信息。
    5.3S5PV210串行通信与中断与时钟设计
    5.3.1、串行通信与中断的关系
    (1)发送方可以选择使用中断,也可以选择不使用中断。
    • 使用中断:发送方先设置好中断并绑定一个中断处理程序,然后发送方丢一帧数据给transmitter,transmitter发送耗费一段时间来发送这一帧数据,这段时间内发送方CPU可以去做别的事情,等transmitter发送完成后会产生一个TXD中断,该中断会导致事先绑定的中断处理程序执行,在中断处理程序中CPU会切换回来继续给transmitter放一帧数据,然后CPU切换离开;
    • 不使用中断:发送方事先禁止TXD中断(当然也不需要给相应的中断处理程序了),发送方CPU给一帧数据到transmitter,然后transmitter耗费一段时间来发送这帧数据,这段时间CPU在这等着(CPU没有切换去做别的事情),待发送方发送完成后CPU再给它一帧数据继续发送直到所有数据发完。CPU是怎么知道transmitter已经发送完了?有一个状态寄存器,状态寄存器中有一个位叫发送缓冲区空标志,transmitter发送完成(发送缓冲区空了)就会给这个标志位置位,CPU就是通过不断查询这个标志位为1还是0来指导发送是否已经完成的。
    (2)因为串口通信是异步的,异步的意思就是说发送方占主导权。也就是说发送方随时想发就能发,但是接收方只有时刻等待才不会丢失数据。所以这个差异就导致发送方可以不用中断,而接收方不得不使用中断模式
    5.3.2、210串行通信接口的时钟设计
    (1)在S5PV210的串口控制器工作原理框图中,串口控制器中有一个波特率发生器,所以,发送transmitter和接收receiver都需要一个时钟信号,那么这个时钟从哪里来?
    • 源时钟信号是外部APB总线(PCLK_PSYS,66MHz)提供给串口模块的(这就是为什么我们说串口是挂在APB总线上的),在上一节总结的时钟框架图中,可以查阅到。
    • 然后进到串口控制器内部后给波特率发生器(实质上是一个分频器),在波特率发生器中进行分频,分频后得到一个低频时钟,这个时钟就是给transmitter和receiver使用的。
    (2)串口通信中时钟的设置主要看寄存器设置。重点的有:
    • 寄存器源设置(为串口控制器选择源时钟,一般选择为PCLK_PSYS,也可以是SCLK_UART),还有波特率发生器的2个寄存器。
    (3)波特率发生器有2个重要寄存器
    • UBRDIVn和UDIVSLOTn,其中UBRDIVn是主要的设置波特率的寄存器,UDIVSLOTn是用来辅助设置的,目的是为了校准波特率的。

    展开全文
  • STM32下的USART串口通信程序

    千次阅读 2020-12-01 14:33:20
    STM32的USART串口通信实践

    一、STM32的USART简介

    通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。
    串行通信一般是以帧格式传输数据,即是一帧一帧的传输,每帧包含有起始信号、数据信息、停止信息,可能还有校验信息。USART就是对这些传输参数有具体规定,当然也不是只有唯一一个参数值,很多参数值都可以自定义设置,只是增强它的兼容性。
    USART满足外部设备对工业标准(NRZ异步串行数据格式的要求,并且使用了小数波特率发生器,可以提供多种波特率,使得它的应用更加广泛。[USART]支持同步单向通信和半双工单线通信;还支持局域互连网络LN、智能卡(SmartCard)协议与IhDA(红外线数据协会)SIR ENDEC规范。
    USART支持使用DMA,可实现高速数据通信,
    USART在 STM32应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一个USART通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、如果出错哪具体哪里出错等等。[1]

    二、 USART功能框图

    USART 的功能框图包含了USART最核心内容,掌握了功能框图,对 USART就有一个整体的把握,在编程时就思路就非常清晰。USART功能框图见下图:[1]
    在这里插入图片描述

    1. ①功能引脚
    2. ②数据寄存器
    3. ③控制器
    4. ④小数波特率生成
    5. 校验控制
    6. 中断控制

    具体内容请参考野火官方书籍《零死角玩转STM32——F103指南者》,或者STM32串口通信USART学习笔记

    三、 USART接发通信实验

    USART只需两根信号线即可完成双向通信,对硬件要求低,使得很多模块都预留USART接口来实现与其他模块或者控制器进行数据传输,比如GSM模块,WIFI模块、蓝牙模块等等。在硬件设计时,注意还需要一根“共地线”
    我们可以将数据发送到串口调试助手,我们还可以在串口调试助手发送数据给控制器,控制器程序根据接收到的数据进行下一步工作。
    以下将开展USART接发通信实验
    任务要求如下:
    1)设置波特率为115200,1位停止位,无校验位。
    2)STM32系统给上位机(win10)连续发送“hello windows! ”,上位机接收程序可以使用“串口调试助手“,也可自己编程
    3)当上位机给stm32发送“Stop,stm32”后,stm32停止发送。

    3.1实验环境

    ①STM32核心板(stm32F103)
    ②MDK KEIL5
    ③实验所用串口:USART1
    ④驱动:CH340

    3.2 硬件设计

    3.2.1硬件原理图

    在这里插入图片描述

    CH340G芯片 的作用是将电脑的USB电平转换为串口的TTL电平。
    因此在实验前,确保自己的电脑已经安装了CH340的驱动。
    但一般我们在市面上买到的USB-TTL接线器已将整个模块焊接在整体了,这里大家只做个初步了解原理就行。

    USB-TTL与STM32F103具体连接方式如下:
    在这里插入图片描述

    3.3 软件程序设计

    • 核心代码-串口初识化
    void uart_init(u32 bound){
      //GPIO端口设置
      GPIO_InitTypeDef GPIO_InitStructure;
    	USART_InitTypeDef USART_InitStructure;
    	NVIC_InitTypeDef NVIC_InitStructure;
    	 
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟
      
    	//USART1_TX   GPIOA.9
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
      GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
       
      //USART1_RX	  GPIOA.10初始化
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
      GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  
    
      //Usart1 NVIC 配置
      NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
    	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
      
       //USART 初始化设置
    
    	USART_InitStructure.USART_BaudRate = bound;//串口波特率
    	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
    	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
    	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
    	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
    
      USART_Init(USART1, &USART_InitStructure); //初始化串口1
      USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
      USART_Cmd(USART1, ENABLE);                    //使能串口1 
    
    }
    
    • 主函数
    int main(void)
     {	
        u8 Stopflag[]="Stop,stm32";     //停止发送信号
        u8 Beginflag[]="Begin,stm32";   //恢复发送信号
     	u16 t,len;  	
    	u16 times=0;    //设置计数器
        u16 flag=1,flag_S,flag_B;   //设置标志位
    	delay_init();	    	 //延时函数初始化	  
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    	uart_init(115200);	 //串口初始化为115200
     	//LED_Init();			     //LED端口初始化
    	//KEY_Init();          //初始化与按键连接的硬件接口
     	while(1)
    	{
            flag_S=flag_B=1;
    		if(USART_RX_STA&0x8000)
    		{					   
    			len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
    			printf("\r\n您发送的消息为:\r\n");
    			for(t=0;t<len;t++)
    			{
                    if(Stopflag[t]!=USART_RX_BUF[t]) flag_S=0;  //若接受数据与停止发送信号不同将flag_S置为0
                    if(Beginflag[t]!=USART_RX_BUF[t]) flag_B=0; //若接受数据与恢复发送信号不同将flag_B置为0
    				USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
    				while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
    			}
    			printf("\r\n\r\n");//插入换行
                if(flag_S==1)   //如果flag_S==1表示上位机发送的是停止发送信号
                {
                    flag=0;
                    printf("已停止发送\r\n\r\n");
                }
                if(flag_B==1)   //如果flag_B==1表示上位机发送的是恢复发送信号 
                {  
                    flag=1;
                    printf("已恢复发送\r\n\r\n");
                }
    			USART_RX_STA=0;
    		}
            else
    		{
                //flag为1表示允许stm32发送数据
                if(flag==1) times++;
    			if(times%100==0&&flag==1)    printf("hello Windows!\r\n"); 
    			//if(times%30==0&&flag==1) LED=!LED;   //闪烁LED,提示系统正在运行.
    			delay_ms(10);   
    		}
    	}	 
     }
    

    3.3 烧录程序

    这里用的是USB-TTL接线器,需要专门的软件以及与正确的连线才可以烧录程序。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    四、 效果演示

    演示时需要对XCOM进行相对应的设置才可以正常进行串口通信。
    在这里插入图片描述
    在这里插入图片描述
    可以通过动态图可见,基本完成了STM32的串口通信和标志位停止发送的实践要求。

    五、 总结

    通过此次是实践学习,我明白了串口通信的基本知识和STM32串口通信的基本设置与操作,其中也遇到了不少问题,特别感谢我的老师以及同学对我的耐心讲解和网上资料。

    六、 参考资料

    [1] 《零死角玩转STM32——F103指南者》
    [2]STM32串口通信USART学习笔记
    [3]STM32平台的USART串口通信

    展开全文
  • STM32 的USART 简介通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于USART 还有一个UART(Universal ...

    STM32 的USART 简介

    通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于USART 还有一个UART(Universal Asynchronous Receiver and Transmitter),它是在USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是UART。

    串行通信一般是以帧格式传输数据,即是一帧一帧的传输,每帧包含有起始信号、数据信息、停止信息,可能还有校验信息。USART 就是对这些传输参数有具体规定,当然也不是只有唯一一个参数值,很多参数值都可以自定义设置,只是增强它的兼容性。USART 满足外部设备对工业标准NRZ 异步串行数据格式的要求,并且使用了小数波特率发生器,可以提供多种波特率,使得它的应用更加广泛。

    USART 支持同步单向通信和半双工单线通信;还支持局域互连网络LIN、智能卡(SmartCard)协议与lrDA(红外线数据协会) SIR ENDEC 规范。

    USART 支持使用DMA,可实现高速数据通信,有关DMA 具体应用将在DMA 章节作具体讲解。

    USART 在STM32 应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一个USART 通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、如果出错哪具体哪里出错等等。

    USART 功能框图

    USART 的功能框图包含了USART 最核心内容,掌握了功能框图,对USART 就有一个整体的把握,在编程时就思路就非常清晰。USART 功能框图见图1。

    5682796f8168e1fc7da2675879426f78.png
    图1 USART 功能框图

    功能引脚

    TX:发送数据输出引脚。

    RX:接收数据输入引脚。

    SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。

    nRTS:请求以发送(Request To Send),n 表示低电平有效。如果使能RTS 流控制,当USART 接收器准备好接收新数据时就会将nRTS 变成低电平;当接收寄存器已满时,nRTS 将被设置为高电平。该引脚只适用于硬件流控制。

    nCTS:清除以发送(Clear To Send),n 表示低电平有效。如果使能CTS 流控制,发送器在发送下一帧数据之前会检测nCTS 引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。

    SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。USART 引脚在STM32F103ZET6 芯片具体分布见表1。

    241c2e3dbc1ec401cdbec987bb68db08.png
    表1 STM32F103VET6 芯片的USART 引脚

    系统控制器有三个USART 和两个UART,其中USART1 和时钟来源于APB2 总线时钟,其最大频率为72MHz,其他四个的时钟来源于APB1 总线时钟,其最大频率为36MHz。UART 只是异步传输功能,所以没有SCLK、nCTS 和nRTS 功能引脚。

    数据寄存器

    USART 数据寄存器(USART_DR)只有低9 位有效,并且第9 位数据是否有效要取决于USART 控制寄存器1(USART_CR1)的M位设置,当M位为0 时表示8 位数据字长,当M位为1 表示9 位数据字长,我们一般使用8 位数据字长。

    USART_DR 包含了已发送的数据或者接收到的数据。USART_DR 实际是包含了两个寄存器,一个专门用于发送的可写TDR,一个专门用于接收的可读RDR。当进行发送操作时,往USART_DR 写入数据会自动存储在TDR 内;当进行读取操作时,向USART_DR读取数据会自动提取RDR 数据。

    TDR 和RDR 都是介于系统总线和移位寄存器之间。串行通信是一个位一个位传输的,发送时把TDR 内容转移到发送移位寄存器,然后把移位寄存器数据每一位发送出去,接收时把接收到的每一位顺序保存在接收移位寄存器内然后才转移到RDR。USART 支持DMA 传输,可以实现高速数据传输,具体DMA 使用将在DMA 章节讲解。

    控制器

    USART 有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等等。使用USART 之前需要向USART_CR1 寄存器的UE 位置1 使能USART,UE 位用来开启供给给串口的时钟。发送或者接收数据字长可选8 位或9 位,由USART_CR1 的M位控制。

    发送器

    当USART_CR1 寄存器的发送使能位TE 置1 时,启动数据发送,发送移位寄存器的数据会在TX 引脚输出,低位在前,高位在后。如果是同步模式SCLK也输出时钟信号。

    一个字符帧发送需要三个部分:起始位+数据帧+停止位。起始位是一个位周期的低电平,位周期就是每一位占用的时间;数据帧就是我们要发送的8 位或9 位数据,数据是从最低位开始传输的;停止位是一定时间周期的高电平。

    停止位时间长短是可以通过USART 控制寄存器2(USART_CR2)的STOP[1:0]位控制,可选0.5 个、1 个、1.5 个和2 个停止位。默认使用1 个停止位。2 个停止位适用于正常USART 模式、单线模式和调制解调器模式。0.5 个和1.5 个停止位用于智能卡模式。

    当选择8 位字长,使用1 个停止位时,具体发送字符时序图见图2。

    abb91a3da0ddcd0f7bce40c375bd4cf9.png
    图2 字符发送时序图

    当发送使能位TE 置1 之后,发送器开始会先发送一个空闲帧(一个数据帧长度的高电平),接下来就可以往USART_DR 寄存器写入要发送的数据。在写入最后一个数据后,需要等待USART 状态寄存器(USART_SR) 的TC 位为1, 表示数据传输完成, 如果USART_CR1 寄存器的TCIE 位置1,将产生中断。

    在发送数据时,编程的时候有几个比较重要的标志位我们来总结下。

    2cb164b0356b164b41265713828722d4.png

    接收器

    如果将USART_CR1 寄存器的RE 位置1,使能USART 接收,使得接收器在RX 线开始搜索起始位。在确定到起始位后就根据RX 线电平状态把数据存放在接收移位寄存器内。接收完成后就把接收移位寄存器数据移到RDR 内,并把USART_SR 寄存器的RXNE 位置1,同时如果USART_CR2 寄存器的RXNEIE 置1 的话可以产生中断。

    在接收数据时,编程的时候有几个比较重要的标志位我们来总结下。

    cd3c6bf81a8991aac51fde3ee7b4f52e.png

    小数波特率生成

    波特率指数据信号对载波的调制速率,它用单位时间内载波调制状态改变次数来表示,单位为波特。比特率指单位时间内传输的比特数,单位bit/s(bps)。对于USART 波特率与比特率相等,以后不区分这两个概念。波特率越大,传输速率越快。

    USART 的发送器和接收器使用相同的波特率。计算公式如下:

    公式 21-1 波特率计算

    903466e0bd3d6eda9c30eb3a50ba912d.png

    其中,fPLCK 为USART 时钟, USARTDIV 是一个存放在波特率寄存器(USART_BRR)的一个无符号定点数。其中DIV_Mantissa[11:0] 位定义USARTDIV 的整数部分,DIV_Fraction[3:0]位定义USARTDIV 的小数部分。

    例如: DIV_Mantissa=24(0x18) , DIV_Fraction=10(0x0A) , 此时USART_BRR 值为0x18A;那么USARTDIV 的小数位10/16=0.625;整数位24,最终USARTDIV 的值为24.625。

    如果知道USARTDIV 值为27.68,那么DIV_Fraction=16*0.68=10.88,最接近的正整数为11,所以DIV_Fraction[3:0]为0xB;DIV_Mantissa=整数(27.68)=27,即为0x1B。波特率的常用值有2400、9600、19200、115200。下面以实例讲解如何设定寄存器值得到波特率的值。

    我们知道USART1 使用APB2 总线时钟,最高可达72MHz,其他USART 的最高频率为36MHz。我们选取USART1 作为实例讲解,即fPLCK=72MHz。为得到115200bps 的波特率,此时:

    1c5b4e6e55be7ecb9b4511115329ba12.png

    解得USARTDIV=39.0625 , 可算得DIV_Fraction=0.0625*16=1=0x01 ,DIV_Mantissa=39=0x17,即应该设置USART_BRR 的值为0x171。

    校验控制

    STM32F103 系列控制器USART 支持奇偶校验。当使用校验位时,串口传输的长度将是8 位的数据帧加上1 位的校验位总共9 位,此时USART_CR1 寄存器的M位需要设置为1,即9 数据位。将USART_CR1 寄存器的PCE 位置1 就可以启动奇偶校验控制,奇偶校验由硬件自动完成。启动了奇偶校验控制之后,在发送数据帧时会自动添加校验位,接收数据时自动验证校验位。接收数据时如果出现奇偶校验位验证失败,会见USART_SR 寄存器的PE 位置1,并可以产生奇偶校验中断。使能了奇偶校验控制后,每个字符帧的格式将变成:起始位+数据帧+校验位+停止位。

    中断控制

    USART 有多个中断请求事件,具体见表2。

    2153bf86c3b75267e23fa69055cb1b61.png
    表2 USART 中断请求

    http://weixin.qq.com/r/ey4gONXE7IiTrZFb93tp (二维码自动识别)

    点击链接观看更多相关课程

    电堂科技c.51diantang.com
    展开全文
  • UART串行接口简称串口,是我们各类芯片最常用的一种异步通信接口,通过串口我们就可以建立起计算机和我们实验板之间的通信和控制关系,也就是我们通常所说的上下位机通信串口可以说是不同平台互相通信、控制的一个...
  • 完成基本和串口调试助手功能...因此基于labview简单易操作进行了程序框图搭建和前面板规划,实现串口选择,字符串、txt文本发送和接收,定时发送等功能。因为是自己从头做起,所以设计说明书较为详细,可供初学者参考。
  • USART—串口通信

    2018-04-17 17:42:33
    包括STM32单片机USART串口发送和接收程序程序串口通信协议简介,STM32串口功能框图讲解,串口初始化结构体讲解,代码讲解,以及发送和接收程序,控制RGB灯程序,十分的详细
  • 串口通信课程设计报告,包括程序框图什么的
  • 串口通信

    2021-03-05 16:19:42
    串口通信的基本原理4.S5PV210串行通信接口详解1:串口原理5.S5PV210串行通信接口详解2:串口周边6.S5PV210串行通信接口详解3:串口与中断7.S5PV210串行通信编程实战8.RS232与RS485的区别 前言 S5PV210 1.通信涉及的...
  • 51单片机串行通信

    2018-07-24 15:05:44
    51单片机串行通信,使用串口USART/UART进行双机通信,收发数据,包括发送端程序和接收端程序
  • 描述串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以...
  • 论述了异步串行通信的基本概念,根据中断驱动的软件模拟异步串行通信的要求,设计了PIC单片机与PC机之间的接口电路和通信程序框图,单片机程序利用PIC单片机指令集编写,PC机程序利用VB编写。  关键词:PIC单片机...
  • STM32 USART—串口通信

    2018-07-24 14:53:21
    本资源包括两个发送和接收程序,并且详细介绍了串口通信协议、STM32串口功能框图讲解、串口初始化结构体讲解、代码讲解、以及发送和接收程序、控制RGB灯程序。代码注释十分的详细、程序书写规范,可以作为很好的参考...
  • 串口通信通信的基本概念串行和并行通信全双工、半双工和单工同步和异步通信的速率串口通信串口通信协议简介RS232标准USB转串口原生的串口到串口串口功能框图固件库结构体和函数程序中断接收和发送串口控制LED亮灭 ...
  • CPLD的串口通信设计

    2020-10-22 23:50:01
    本文选用CPLD是ALTERA公司的EPM240T100,结合MAX232接口芯片进行串口通信设计,框图如下图1所示。图1CPLD串口通信模块硬件设计二、VHDL程序模块设计及描述使用VHDL对CPL
  • LabVIEW串口通信基础知识 读取串口字节 我们新建一个空白 VI,借助串口调试助手和虚拟串口,在 LabVIEW 中编写的一个最简单的例子:写一个基本的读取串口字节的程序,在程序框图中编程如下: 注意这里,串口配置放...
  • 【STM32】5分钟了解STM32的串口通信

    万次阅读 多人点赞 2020-08-21 10:18:28
    串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节的通信方式。文章主要是串口通信简介和STM32的串口通信
  • STM32系统学习——USART(串口通信

    万次阅读 多人点赞 2017-11-30 14:48:42
    串口通信是一种设备间非常常用的串行通行方式,其简单便捷,大部分电子设备都支持。 一、物理层 常用RS-232标准,主要规定了信号的用途、通信接口以及信号的电平标准。 “DB9接口”之间通过串口信号线建立...
  • 摘要:USB总线(Universal Setial Bus通用串行总线)是用来连接外围设备与计算机的新式接口,文中给出...LabVIEW是一种以图形化语言为基础设计虚拟仪器的软件,LabVIEW采用图形模式的结构框图来构建程序代码,LabVIEW程序
  • 文章目录一、通讯的基本概念二、USART串口通信(简单介绍)三、USART串口通信实践四、效果演示五、参考资料 一、通讯的基本概念 数据传输的方式 ① 串行通讯 指设备之间通过少 量数据信号线(一般是 8根以下),...
  • 串行通信基本原理

    千次阅读 2016-09-08 10:02:55
    一,串行通信和并行通信 并行通信:数据各个位同时进行传输 优点:速度快 缺点:占用IO资源多 串行通信:数据按位顺序进行传输 优点:占用IO资源少 缺点:速度较慢 二,三种串行传输方式1,单工通信     只支持从发送方...
  • 一、RS232C串行接口标准简介RS232C是1969年有电子工业协会(EIA)公布的标准,RS是推荐标准(recommended standard)的缩写。该标准的用途是定义数据终端设备(DTE)与数据通信设备(DCE)接口的电气特性。图1是个人计算机...
  • s5pv210串口通信笔记

    2019-05-30 15:07:04
    1、S5PV210串口通信原理框图 peripheral BUS (外设总线) 与SOC连接 APB:给 peripheral BUS 提供时钟的总线 AHB 如何发送? Transmit Buffer Register Transmit Shifter 发送移位器 ...
  • STM32串行通信USART程序例举链接:http://blog.csdn.net/dragon12345666/article/details/24883111 1、STM32串行通信USART的相关...2、STM32串行通信USART的框图: 3、STM32串行通信USART相关的...
  • 本文主要通过一个简单的实例来介绍labVIEW与单片机的串口通信实现过程,包括下位机单片机的硬件与软件设计,上位机LabVIEW的前面板和程序框图设计。  1.概述  在现代测控系统中,我们经常会采用上位机和下位机的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,388
精华内容 1,355
关键字:

串行通信的程序框图