参考正点原子视频

通信方式

并行通信

  • 传输原理:数据各个位同时传输
  • 优点:速度快(一个引脚传输一个位)
  • 缺点:占用引脚资源多

串行通信

  • 传输原理:数据按位顺序传输
  • 优点:占用引脚资源少(一个引脚都可以)
  • 缺点:速度相对较慢

串行通信

按照数据传送方向,分为

  • 单工:数据传输只支持数据在一个方向上传输
  • 半双工:允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信
  • 全双工:允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力

串口通信三种传送方式

串行通信的通信方式

  • 同步通信:带时钟同步信号传输。 -SPI,IIC通信接口
  • 异步通信:不带时钟同步信号。 -UART(通用异步收发器),单总线

在同步通信中,收发设备上方会使用一根信号线传输信号,在时钟信号的驱动下双方进行协调,同步数据。例如,通讯中通常双方会统一规定在时钟信号的上升沿或者下降沿对数据线进行采样。

在异步通信中不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些用于同步的信号位,或者将主题数据进行打包,以数据帧的格式传输数据。通讯中还需要双方规约好数据的传输速率(也就是波特率)等,以便更好地同步。常用的波特率有4800bps、9600bps、115200bps等。

在同步通讯中,数据信号所传输的内容绝大部分是有效数据,而异步通讯中会则会包含数据帧的各种标识符,所以同步通讯效率高,但是同步通讯双方的时钟允许误差小,稍稍时钟出错就可能导致数据错乱,异步通讯双方的时钟允许误差较大。

常见的串行通信接口

STM32的串口通信接口

  • UART:通用异步收发器
  • USART:通用同步异步收发器

UART异步通信方式引脚连接方式

  • RXD:数据输入引脚。数据接收
  • TXD:数据发送引脚。数据发送


UART异步通信方式特点

  • 全双工异步通信
  • 分数波特率发生器系统,提供精确的波特率。发送和接受共用的可编程波特率,最高可达4.5Mbits/s
  • 可编程的数据子长度(8位或者9位)
  • 可配置的停止位(支持1或者2位停止位)
  • 可配置的使用DMA多缓冲器通信
  • 单独的发送器和接收器使能位
  • 检测标志:1接受缓冲器 2发送缓冲器空 3传输结束标志
  • 多个带标志的中断源。触发中断
  • 其他:检验控制,四个错误检测标志

串口通信过程

STM32串口异步通信需要定义的参数

  1. 起始位
  2. 数据位(8位或者9位)
  3. 奇偶校验位(第9位)
  4. 停止位(4,15,2位)
  5. 波特率设置

USART框图

常用的串口相关寄存器

  • USART_SR状态寄存器
  • USART_DR数据寄存器
  • USART_BRR波特率寄存器

波特率计算方法

串口操作相关库函数

void USART_Init();//串口初始化:波特率,数据字长,奇偶检验位,硬件流控以及收发使能
void USART_Cmd();//使能串口
void USART_ITConfig();//使能相关中断void USART_SendData();//发送数据到串口,DR
uint16_ USART_ReceiveData();//接受数据,从DR读取接受到的数据FlagStatus USART_GetFlagStatus();//获取状态标志位
void USART_ClearFlag();//清除状态标志位
ITStatus USART_GetITStatus();//获取中断状态标志位
void USART_ClearTPendingBit();//清除中断状态标志位

USART_InitTypeDef

typedef struct
{//设置波特率uint32_t USART_BaudRate;            /*!< This member configures the USART communication baud rate.The baud rate is computed using the following formula:- IntegerDivider = ((PCLKx) / (16 * (USART_InitStruct->USART_BaudRate)))- FractionalDivider = ((IntegerDivider - ((u32) IntegerDivider)) * 16) + 0.5 *///设置字长度uint16_t USART_WordLength;          /*!< Specifies the number of data bits transmitted or received in a frame.This parameter can be a value of @ref USART_Word_Length *///设置停止位uint16_t USART_StopBits;            /*!< Specifies the number of stop bits transmitted.This parameter can be a value of @ref USART_Stop_Bits *///设置奇偶校验uint16_t USART_Parity;              /*!< Specifies the parity mode.This parameter can be a value of @ref USART_Parity@note When parity is enabled, the computed parity is insertedat the MSB position of the transmitted data (9th bit whenthe word length is set to 9 data bits; 8th bit when theword length is set to 8 data bits). *///设置通信模式uint16_t USART_Mode;                /*!< Specifies wether the Receive or Transmit mode is enabled or disabled.This parameter can be a value of @ref USART_Mode *///设置硬件流uint16_t USART_HardwareFlowControl; /*!< Specifies wether the hardware flow control mode is enabledor disabled.This parameter can be a value of @ref USART_Hardware_Flow_Control */
} USART_InitTypeDef;

串口配置的一般步骤

STM32串口配置的一般步骤(库函数)

  1. 串口时钟使能:RCC_APBxPeriphClockCmd();
    GPIO时钟使能:RCC_AHBxPeriphClockCmd();
  2. 引脚复用映射:GPIO_PinAFConfig();
  3. GPIO端口模式配置:GPIO_Init(); 模式配置为GPIO_Mode_AF_PP
  4. 串口参数初始化:USART_Init();
  5. 开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)
    NVIC_Init();
    USART_ITConfig();
  6. 使能串口:USART_Cmd();
  7. 编写中断处理函数:USARTx_IRQHandler();
  8. 串口数据收发:
    void USART_SendData();//发送数据到串口,DR
    uint16_t USART_ReceiveData();//接收数据,从DR读取接收的数据
  9. 串口传输状态获取:
    FlagStatus USART_GetFlagStatus();
    void USART_ClearITPendingBit();

例子配置

void uart_init(u32 bound){GPIO_InitTypeDef GPIO_InitStructure;//GPIO端口设置USART_InitTypeDef USART_InitStructure;//USART端口设置NVIC_InitTypeDef NVIC_InitStructure;//NVIC中断设置RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);   //开启USART1和GPIOA的时钟,使能//USART1_TX   GPIOA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHzGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//根据指定参数初始化GPIOA//USART1_RX  GPIOA.10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10GPIO_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 ;//抢占优先级为3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //子优先级为3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化NVIC//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); //根据指定参数初始化串口1USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断(USART1_IRQHandler)USART_Cmd(USART1, ENABLE);//使能串口1}void USART1_IRQHandler(void)//串口1中断服务程序{u8 Res;//8位无标志字符
#if SYSTEM_SUPPORT_OS  //如果SYSTEM_SUPPORT_OS为真,则需要支持OSOSIntEnter();
#endifif(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//接受中断(接收到的数据必须是0x0d 0x0a结尾)      {Res =USART_ReceiveData(USART1);   //读取接收到的数据if((USART_RX_STA&0x8000)==0)//接收未完成{if(USART_RX_STA&0x4000)//接收到了0x0d{if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始else USART_RX_STA|=0x8000;   //接收完成了}else //还没收到0x0d{    if(Res==0x0d)USART_RX_STA|=0x4000;else{USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;USART_RX_STA++;if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收  }        }}          }
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OSOSIntExit();
#endif
}

STM32串口通信基本原理相关推荐

  1. stm32串口通信(初学者对于串口通信的理解)

    stm32串口通信(初学者对于串口通信的理解) 标签: stm32串口通信单片机 2015-01-24 10:12 987人阅读 评论(0) 收藏 举报  分类: stm32 版权声明:本文为博主原创 ...

  2. STM32串口通信中使用printf发送数据配置方法 开发环境 Keil

    STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK) 已有 12456 次阅读2011-6-29 23:29 | 在STM32串口通信程序中使用printf发送数据, ...

  3. STM32——串口通信

    STM32--串口通信 宗旨:技术的学习是有限的,分享的精神是无限的. 一.异步串口通信协议 STM32 的串口非常强大,它不仅支持最基本的通用串口同步.异步通信,还具有 LIN 总线功能(局域互联网 ...

  4. openmv和stm32串口通信完成二维码识别

    openmv和stm32串口通信完成二维码识别 文章目录 前言 一.所用的硬件: 二.openmv端 2.stm32端 总结 前言 注:我只是个大一的小白,本文只完成基本功能,希望能帮助有困惑的人(我 ...

  5. Ardunio下的STM32串口通信

    文章目录 任务要求 Ardunio下的STM32串口通信 软件准备 编译烧录 标准库函数与HAL库函数的stm32编程方式差异 国人版的MCU集成开发平台 stduino IDE 总结 任务要求 安装 ...

  6. 安装STM32CubeMX,stm32串口通信

    目录 一.串口通信和RS-232标准 1.串口通信 波特率 数据位 停止位 奇偶校验 2.RS-232标准 二.安装STM32CubeMX,搭建STM32的开发环境 1.安装jdk 2.安装STM32 ...

  7. STM32串口通信原理及实验讲解

    串口通信基本原理 串口 串口,顾名思义,即为串行接口,是处理器与外部设备进行串行通信的接口.串行通信是指数据按位进行顺序传输,这种方法占用引脚资源少,但速度相对较慢.串行通信按数据传输方向可分为三种: ...

  8. 串口通信基本原理介绍

    串口通信基本原理介绍 一. 什么是串口通信? 串行通信是指仅用一根接收线和一根发送线就能将数据以位进行传输的一种通讯方式.尽管串行通信的速度比按字节传输的并行通信慢,但是串口可以在仅仅使用两根线的情况 ...

  9. 【串口通信】K210与STM32串口通信、K210与OpenMV串口通信

    [串口通信]K210与STM32串口通信.K210与OpenMV串口通信 串口通信 前言 为何需要串口通信 K210如何进行串口通信 K210串口配置 K210串口发送相关定义 K210串口发送测试 ...

  10. 通过python实现安卓手机与stm32串口通信

    一.材料 (1)安卓终端1台,本文使用的魅蓝手机 (2)stm32微控制器(可以串口通信的) 二.通信内容 上位机发送AA,熄灭stm32上的LED灯 上位机发送BB,点亮stm32上的LED灯 上位 ...

最新文章

  1. 医 系统 springboot搜索到的spring boot 的javaweb项目
  2. nacos oaut服务地址_用户认证的例子:Spring Security oAuth2 + Spring Cloud Gateway + Nacos + Dubbo...
  3. 数据透视表和数据交叉表_数据透视表的数据提取
  4. 外设驱动库开发笔记11:SHT3x系列温湿度传感器驱动
  5. 吴恩达深度学习——2.2 Logistic回归
  6. Retrofit的使用教程(二)
  7. C#4.0新特性学习(四)—匿名方法及Lambda表达式
  8. Linux-HA实战(1)— Heartbeat安装
  9. linux删除java_Linux卸载jdk
  10. 用两个栈实现一个队列【C语言】
  11. cad直线和圆弧倒角不相切_在cad绘制倒圆角的方法技巧步骤详解
  12. input中加入图标实现搜索框
  13. DBCO-PEG4-SUE DBCO-PEG4-蔗糖
  14. bmp怎样转成jpg?
  15. 键盘部分失灵/被锁定解决办法
  16. 用python写诗歌网站要注意什么_如何利用深度学习写诗歌(使用Python进行文本生成)...
  17. 天下无贼是假的,天下无票倒是真的;如来神掌是假功夫,能买到车票才是真功夫。
  18. 通过伴随矩阵怎么求逆矩阵
  19. CentOS7的磁盘分区操作
  20. 酷我音乐mp3歌曲URL地址提取(作背景音乐)

热门文章

  1. ThinkPHP5零食商城系统(前后台)
  2. 进销存excel_超实用Excel完整进销存管理系统,多功能实现,轻松套用赶GET
  3. 常见网络游戏的端口列表
  4. unity3d开发微信小游戏2
  5. 通达信接口程序怎么设计出K线图?
  6. linux不能识别隶书怎么办,[ArchLinux]使用Fontconfig配置字体控制台/sublime/fcitx输入法选字条中文显示高低宽窄不一, 请问应该怎么调整...
  7. 【全套H5前端教程--打包下载地址】
  8. “ISO9001:2015质量管理体系 要求”学习笔记
  9. jmeter连接mysql时jdbc下载
  10. nema0183 java解析_NEMA-0183(GPRMC GPGGA)详细解释