[应用相关] STM32之串口通信

[复制链接]
1337|18
 楼主| parameters 发表于 2019-7-22 14:54 | 显示全部楼层 |阅读模式
一、RS232通信协议
1、概念  
  个人计算机上的通讯接口之一,由电子工业协会(Electronic Industries Association,EIA) 所制定的异步传输标准接口。

 楼主| parameters 发表于 2019-7-22 14:54 | 显示全部楼层
2、电气特性

  逻辑1(MARK):  -3V~-15V

  逻辑0(SPACE):  +3~+15V
 楼主| parameters 发表于 2019-7-22 14:54 | 显示全部楼层
3、接口

  实现全双工异步通信只需要三根线:RX、TX和GND。
 楼主| parameters 发表于 2019-7-22 14:54 | 显示全部楼层
二、常见COMS电平转RS232电平的芯片--MAX3232

658055d355dba1cfc4.png
 楼主| parameters 发表于 2019-7-22 14:55 | 显示全部楼层
1、逻辑输入与逻辑输出特性

966845d355dc91a106.png
 楼主| parameters 发表于 2019-7-22 14:55 | 显示全部楼层
2、RS232接口端输入特性

668375d355ddd322c4.png
 楼主| parameters 发表于 2019-7-22 14:55 | 显示全部楼层
3、RS232接口端输出特性

464905d355decc600a.png
 楼主| parameters 发表于 2019-7-22 14:56 | 显示全部楼层
三、STM32串口硬件电路

1、芯片内部串口电路

900025d355dfdb3d1c.png
 楼主| parameters 发表于 2019-7-22 14:56 | 显示全部楼层
2、开发板串口硬件电路

972745d355e163833d.png
 楼主| parameters 发表于 2019-7-22 14:56 | 显示全部楼层
四、STM32串口编程

1、整体流程

① 开启GPIO时钟和USARTX时钟

② 配置TX和RX引脚

③ 初始化USART控制器
 楼主| parameters 发表于 2019-7-22 14:57 | 显示全部楼层
2、细节实现

① 开启GPIO时钟和USARTX时钟
  1. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);



② 配置TX和RX引脚
  1. /* Configure USART1 Tx (PA.09) as alternate function push-pull */
  2.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  3.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  4.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  5.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  6.    
  7.         /* Configure USART1 Rx (PA.10) as input floating */
  8.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  9.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  10.         GPIO_Init(GPIOA, &GPIO_InitStructure);


③ 初始化USART控制器
  1. /* USART1 mode config */
  2.         USART_InitStructure.USART_BaudRate = 115200;
  3.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  4.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  5.         USART_InitStructure.USART_Parity = USART_Parity_No ;
  6.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  7.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  8.         USART_Init(USART1, &USART_InitStructure);
  9.         USART_Cmd(USART1, ENABLE);

 楼主| parameters 发表于 2019-7-22 14:59 | 显示全部楼层
五、STM32串口疑惑

1、串口时钟使能与控制器使能的关系

  为何USART时钟使能了,还需要在配置USART控制器的时候再使能一次?
  1. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
  2. USART_Cmd(USART1, ENABLE);

1> USART的时钟使能

  APB2 peripheral clock enable register  (RCC_APB2ENR)

83635d355eb15c138.png

2> USART控制器使能

  USART Control register 1(USART_CR1)

584595d355eba8030c.png

3> 原因

   540625d355ec3d4569.png

RCC_APB2ENR:  控制APB2时钟是否供应给USART控制器

USART_CR1:   控制USART控制器的分频器和输出是否工作
 楼主| parameters 发表于 2019-7-22 14:59 | 显示全部楼层
2、TDR与RDR共用一个特殊功能寄存器地址

USART_DR功能描述:

  包含了发送或接收的数据。由于它是由两个寄存器组成的,一个给发送用(TDR) ,一个给接收用(RDR) ,该寄存器兼具读和写的功能。TDR寄存器提供了内部总线和输出移位寄存器之间的并行接口(参见图236 )。RDR寄存器提供了输入移位寄存器和内部总线之间的并行接口。(摘自《STM32参考手册》)

  笔者的理解是:当对USART_DR进行读操作的时候,访问的是RDR;当对USART_DR进行写操作的时候,访问的是TDR。
 楼主| parameters 发表于 2019-7-22 14:59 | 显示全部楼层
六、串口调试时需要注意的地方

1、通过MDK结合一些调试器可以单步、任意断点等等方式进行代码的调试。可是,这种调试方法对于调试操作系统,比如uCOS-II,还有那些必须要全速运行才能进行调试的情况,就显得力不从心。串口调试正是用于这些地方,可以在程序全速运行的情况下,实时的打印系统的运行信息。

2、串口调试也有它的局限性,由于串口的波特率相对于STM32这样高速运行的单片机显得迟钝,很多情况下不能及时的打印系统的运行信息。甚至有些情况下,我们原本那些串口调试的代码会成为影响我们系统实时性最主要的因素。
 楼主| parameters 发表于 2019-7-22 15:00 | 显示全部楼层
参考资料:《STM32库开发实战指南》

       《STM32芯片手册》
wakayi 发表于 2019-8-12 11:42 | 显示全部楼层
非常感谢楼主分享
wowu 发表于 2019-8-12 11:46 | 显示全部楼层

非常感谢楼主分享
xiaoqizi 发表于 2019-8-12 11:58 | 显示全部楼层
非常感谢楼主分享
yaweq 发表于 2019-8-12 17:42 | 显示全部楼层
MARK一下,准备学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

361

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部