STM32F103(五)——串口通信


参考资料:
《开发指南》P178 串口实验
《参考手册》P516 通用同步异步收发器

1. 串口通信

通信双方(cpu与外部设备)之间通信的两种方式:

  1. 并行通信
    ▶传输原理:数据各个位同时进行传输
    在这里插入图片描述
    ▶优点:速度快
    ▶缺点:占用引脚资源多
  2. 串行通信
    ▶传输原理:数据按位顺序传输
    在这里插入图片描述
    ▶优点:占用引脚资源少
    ▶缺点:速度相对较慢

1.1 串行通信

1.1.1 按数据传送方向分类

▶单工:
数据传输只支持数据在一个方向上传输,如图:
在这里插入图片描述

▶半双工:
运行数据在两个方向上传输,但是在同一时刻只允许在一个方向上传输。可理解为:可改变方向的单工传输。
在这里插入图片描述
▶全双工:
允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发生设备和接收设备都有独立的接收和发送能力。
在这里插入图片描述

1.1.2 按数据的通信方式分类

**▶同步通信:**带时钟同步信号传输。
即要求接收端时钟频率和发送端时钟频率一致;一旦开始时,发送方要以固定的节奏去发送数据,而接收方要以同样的节奏时刻做好接收数据的准备。
-SPI,IIC通信接口

**▶异步通信:**不带时钟同步信号。
收发双方可以有各自自己的时钟;异步通信在发送字符时,所发送的字符之间的时间间隔可以是任意的。发送端可以在任意时刻开始发送字符,因此必须在每一个字符的开始和结束的地方加上标志,即加上开始位和停止位,接收方是在数据的起始位和停止位的帮助下实现信息同步的
-UART(通用异步收发器),单总线

通俗的讲,异步是你扔出去一个内容,对方靠着内容前后他能嗅到的异样在人潮之中发现了它,把这个内容存下来;而同步是对方在时刻等着你发布号令,你告诉对方我要发送了哦,然后双方一拍即合。

1.1.3 常见的串行通信接口

在这里插入图片描述STM32的串口通信接口有:
◉UART:通用异步收发器
◉USART:通用同步异步收发器

有3个USART和2个UART
在这里插入图片描述

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

-RXD:数据输入引脚。数据接收
-RTD:数据输出引脚。数据发送

①芯片1和芯片2的连接方式:
在这里插入图片描述
②芯片与PC机的引脚连接方式:
在这里插入图片描述
说明:PC机的串口是DB9,与芯片的串口的TTL电平不兼容,所以需要通过RS232转换器,将芯片串口的TTL电平转换为232电平,因此才可以进行通信。

1.1.5 串口通信过程

数据接收过程:
在这里插入图片描述
数据来源于外部设备,一位一位的传输到芯片的数据接收引脚(RXD),传输的速度由波特率来决定。

数据发送过程:
在这里插入图片描述
类似于数据接收。

1.1.6 通信过程需定义的参数

①起始位
②数据位(8位或9位)
③奇偶校验位
④停止位(1,15,2位)
⑤波特率设置
例如:
在这里插入图片描述

2. 串口通信配置

2.1 常用库函数

在这里插入图片描述

2.2 串行通信的配置步骤

  1. 串口时钟使能,GPIO时钟使能
    RCC_APB2PeriphClockCmd();
  2. GPIO初始化(将GPIO配置为复用功能)
    GPIO_Init();
  3. 串口参数初始化
    USART_Init(); 初始化波特率,数据字长,奇偶校验,使能
  4. 使能串口
    USART_Cmd();
  5. 开启中断并且初始化中断
    NVIC_PriorityGroupConfig();中断优先级分组
    NVIC_Init(); 初始化优先级
    USART_ITConfig();开启串口接收中断
  6. 编写handler函数
    USARTx_IRQHandler();
  7. 串口数据收发
    void USART_SendData(); 发送数据
    uint16_t USART_ReceiveData(); 接收数据
  8. 串口传输状态获取
    FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
    void USART_ClearITPendingBit(USART_TyperDef* USARTx, uint16_t USART_IT);

USART_GetITStatus()和USART_GetFlagStatus()的区别

都是访问串口的SR状态寄存器,唯一不同是,USART_GetITStatus()会判断中断是否开启,如果没开启,也会返回false。

ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint32_t USART_IT)

该函数不仅会判断标志位是否置1,同时还会判断是否使能了相应的中断。所以在串口中断函数中,如果要获取中断标志位,通常使用该函数。------串口中断函数中使用。

FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint32_t USART_FLAG)

该函数只判断标志位。在没有使能相应的中断时,通常使用该函数来判断标志位是否置1。------做串口轮询时使用。

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值