【嵌入式学习笔记】嵌入式入门3——串口

1.数据通信的基础概念

1.1.串行/并行通信

数据通信按数据通信方式分类:串行通信、并行通信
【嵌入式学习笔记】嵌入式入门3——串口_第1张图片

1.2.单工/半双工/全双工通信

数据通信按数据传输方向分类:单工通信、半双工通信、全双工通信

  • 单工通信:数据只能沿一个方向传输
  • 半双工通信:数据可以沿两个方向传输,但需要分时进行
  • 全双工通信:数据可以同时进行双向传输
    【嵌入式学习笔记】嵌入式入门3——串口_第2张图片

1.3.同步/异步通信

数据通信按数据同步方式分类:同步通信、异步通信

  • 同步通信:共用同一时钟信号
  • 异步通信:没有时钟信号,通过在数据信号中加入起始位和停止位等一些同步信号
    【嵌入式学习笔记】嵌入式入门3——串口_第3张图片

1.4.比特率与波特率

  • 比特率:每秒钟传送的比特数,单位bit/s
  • 波特率:每秒钟传送的码元数,单位Baud
  • 比特率 = 波特率 * log2 M ,M表示每个码元承载的信息量
  • 二进制系统中,波特率数值上等于比特率

1.5.常见的串行通信接口

【嵌入式学习笔记】嵌入式入门3——串口_第4张图片

2.串口(RS-232)

2.1.什么是串口

串口:即串行通信接口,指按位发送和接收的接口,如:RS-232/422/485等。

RS-232接口(DB9)
【嵌入式学习笔记】嵌入式入门3——串口_第5张图片

2.2.RS-232电平与COMS/TTL电平对比

电平标准 逻辑1 逻辑0
RS-232电平 -15V ~ -3V +3V ~ +15V
COMS电平 3.3V 0V
TTL电平 5V 0V

2.3.设备间的RS-232通信示意图

【嵌入式学习笔记】嵌入式入门3——串口_第6张图片

2.4.STM32串口与电脑USB口通信示意图

【嵌入式学习笔记】嵌入式入门3——串口_第7张图片

2.5.RS-232异步通信协议

【嵌入式学习笔记】嵌入式入门3——串口_第8张图片

  • 启动位:必须占1个位长,保持逻辑0电平
  • 有效数据位:可选5、6、7、8、9个位长,LSB在前,MSB在后
  • 校验位:可选占1个位长,也可以没有该位
  • 停止位:必须有,可选占0.5、1、1.5、2个位长,保持逻辑1电平

一般情况下,启动位为1,数据位为8,校验位为0,停止位为1。

3.STM32的USART

3.1.STM32的USART简介

  • USART:通用同步异步收发器,Universal synchronous asynchronous receiver transmitter
  • UART: 通用异步收发器,Universal asynchronous receiver transmitter,
  • USART/UART都可以与外部设备进行全双工异步通信
  • 对于USART,既可以作为USART使用,也可以作为UART使用,我们常用USAT的功能

3.2. STM32的USART主要特征

  • 全双工异步通信
  • 单线半双工通信
  • 单独的发送器和接收器使能位
  • 可配置使用DMA的多缓冲器通信
  • 多个带标志的中断源

3.3. STM32的USART框图

  • STM32的USRAT简化框图
    【嵌入式学习笔记】嵌入式入门3——串口_第9张图片

着重关注:
①发送/接收数据的流程
②相关寄存器作用
③设置波特率

  • F1/F4/F7框图
    【嵌入式学习笔记】嵌入式入门3——串口_第10张图片
  • H7框图
    【嵌入式学习笔记】嵌入式入门3——串口_第11张图片

3.4.设置USART波特率(以F1为例)

【嵌入式学习笔记】嵌入式入门3——串口_第12张图片
【嵌入式学习笔记】嵌入式入门3——串口_第13张图片
【嵌入式学习笔记】嵌入式入门3——串口_第14张图片把USARTDIV的值写入USART_BRR寄存器

uint16_t mantissa; 
uint16_t fraction; 
mantissa=39; 
fraction=0.0625*16+0.5=0x01;          /* USARTDIV = DIV_Mantissa + (DIV_Fraction/16) 四舍五入*/
USART1->BRR = (mantissa << 4) + fraction;

波特率设置通用公式推演(F1)

【嵌入式学习笔记】嵌入式入门3——串口_第15张图片
设置USART/UART波特率(F4)
【嵌入式学习笔记】嵌入式入门3——串口_第16张图片
【嵌入式学习笔记】嵌入式入门3——串口_第17张图片
设置USART/UART波特率(F7)
【嵌入式学习笔记】嵌入式入门3——串口_第18张图片
【嵌入式学习笔记】嵌入式入门3——串口_第19张图片
设置USART/UART波特率(H7)
【嵌入式学习笔记】嵌入式入门3——串口_第20张图片

3.5.USART寄存器介绍(F1)

  • BRR寄存器在上一节已经讲过,不再赘述
  • 控制寄存器1(CR1)
    该寄存器需要完成的配置:
    位13:使能USART
    位12:配置8个数据位
    位10:禁止检验控制
    位5:使能接收缓冲区非空中断
    位3:使能发送
    位2:使能接收
    【嵌入式学习笔记】嵌入式入门3——串口_第21张图片
  • 控制寄存器2(CR2)
    该寄存器需要完成的配置:配置1个停止位
    【嵌入式学习笔记】嵌入式入门3——串口_第22张图片
  • 控制寄存器3(CR3)
    该寄存器需要完成的配置:配置不选择半双工模式
    【嵌入式学习笔记】嵌入式入门3——串口_第23张图片
  • 数据寄存器(DR)
    设置好控制和波特率寄存器后,往该寄存器写入数据即可发送,接收数据则读该寄存器
    【嵌入式学习笔记】嵌入式入门3——串口_第24张图片
  • 状态寄存器(SR)
    根据TC位可以知道能否发数据,根据RXNE位知道是否收到数据
    【嵌入式学习笔记】嵌入式入门3——串口_第25张图片

4.HAL库外设初始化MSP回调机制

  • 当多个PPP外设同时使用MSP函数,则可以通过判断外设寄存器基地址区分是哪个外设,再配置PPP外设用到的硬件
  • 当多个PPP外设共用该函数,文件不好管理,而且放到一起看着比较乱,这时候就不建议使用该函数
    【嵌入式学习笔记】嵌入式入门3——串口_第26张图片
    【嵌入式学习笔记】嵌入式入门3——串口_第27张图片

5.HAL库中断回调机制

  • 当多个PPP外设同时使用中断回调函数,则可以通过判断外设寄存器基地址区分是哪个外设进入中断,并执行相应的处理
  • 当多个PPP外设共用该函数文件不好管理,这时候就不建议使用该函数
    【嵌入式学习笔记】嵌入式入门3——串口_第28张图片
    【嵌入式学习笔记】嵌入式入门3——串口_第29张图片

6.USART/UART异步通信配置步骤

【嵌入式学习笔记】嵌入式入门3——串口_第30张图片

  • HAL_UART_Init(UART_HandleTypeDef *huart)关键结构体(F1).
typedef struct 
{    uint32_t BaudRate; 		/* 波特率 */ 
     uint32_t WordLength; 		/* 字长 */
     uint32_t StopBits; 		/* 停止位 */ 
     uint32_t Parity; 			/* 奇偶校验位 */ 
     uint32_t Mode; 			/* UART 模式 */ 
     uint32_t HwFlowCtl; 		/* 硬件流设置 */ 
     uint32_t OverSampling; 	/* 过采样设置 */ 
}UART_InitTypeDef
  • HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size).
    作用:以中断的方式接收指定字节的数据
    形参 1 是 UART_HandleTypeDef 结构体类型指针变量
    形参 2 是指向接收数据缓冲区
    形参 3 是要接收的数据大小,以字节为单位

  • HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout).
    作用:以阻塞的方式发送指定字节的数据
    形参 1 :UART_HandleTypeDef 结构体类型指针变量
    形参 2:指向要发送的数据地址
    形参 3:要发送的数据大小,以字节为单位
    形参 4:设置的超时时间,以ms单位

7.IO引脚复用功能

7.1.STM32F1的IO引脚复用

  • 通用:IO端口的输入或输出是由GPIO外设控制,我们称之为通用
  • 复用:IO端口的输入或输出是由其它非GPIO外设控制,我们称之为复用
  • 各IO支持什么复用功能:可查数据手册引脚定义
  • IO复用功能冲突问题:同一时间IO只能用作一种复用功能,否则会发生冲突
  • 遇到IO复用功能冲突:可考虑重映射功能

AFIO寄存器的作用就是复用功能IO和调试配置的,STM32F103共有6个AFIO的寄存器:事件控制寄存器AFIO_EVCR、复用重映射和调试IO配置寄存器AFIO_MAPR、外部中断配置寄存器AFIO_EXTICR1-4。可以参考文章http://t.csdn.cn/hJJeL

7.3.STM32F4/F7/H7的IO引脚复用

为了解决F1系列存在的IO复用功能冲突问题,F4往后的系列都加入了复用器,有如下特点:

  • 每个 IO 引脚都有一个复用器
  • 复用器采用 16 路复用功能输入(AF0 到 AF15)
  • 复用器一次仅允许一个外设的复用功能 (AF) 连接到 IO 引脚
  • 通过GPIOx_AFRL和GPIOx_AFRH寄存器进行配置

复位完成后,所有 IO 都会连接到系统的复用功能 0 (AF0)。注意,中断的复用使用的是SYSCFG_EXTICR寄存器
【嵌入式学习笔记】嵌入式入门3——串口_第31张图片
【嵌入式学习笔记】嵌入式入门3——串口_第32张图片

8.编程实战:通过串口接收或者发送一个字符

源码暂不贴出

9.解读例程源码:串口实验(接收不定长字符,并发送出去)

【嵌入式学习笔记】嵌入式入门3——串口_第33张图片
【嵌入式学习笔记】嵌入式入门3——串口_第34张图片

【注意】printf也可以实现串口发送,速度其实并不快(115200波特率下1ms大约11字节),调试时可以用,做开发尽量不用

你可能感兴趣的:(嵌入式学习专栏(STM32),学习,笔记,单片机,stm32,嵌入式硬件)