请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32之串口通信

[复制链接]
STMCU小助手 发布时间:2022-1-18 19:56
一、RS232通信协议
1、概念  
  个人计算机上的通讯接口之一,由电子工业协会(Electronic Industries Association,EIA) 所制定的异步传输标准接口。     
2、电气特性
  逻辑1(MARK):  -3V~-15V
  逻辑0(SPACE):  +3~+15V
3、接口
  实现全双工异步通信只需要三根线:RX、TX和GND。
二、常见COMS电平转RS232电平的芯片--MAX3232
9 N5 E5 M9 O7 y5 |5 N
132108078907498.png

- S0 s" Z0 u7 o. V
1、逻辑输入与逻辑输出特性
132109518288917.png
2、RS232接口端输入特性
132112591712387.png
3、RS232接口端输出特性
132114422961393.png
三、STM32串口硬件电路
1、芯片内部串口电路
141018189533144.png
2、开发板串口硬件电路
132120067188005.png
四、STM32串口编程
1、整体流程
① 开启GPIO时钟和USARTX时钟
② 配置TX和RX引脚
③ 初始化USART控制器
2、细节实现
① 开启GPIO时钟和USARTX时钟
  1. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
复制代码

0 K" \  I. S+ A% W! V, x. W
② 配置TX和RX引脚
  1. /* Configure USART1 Tx (PA.09) as alternate function push-pull */8 G3 U) }% g! d+ t
  2.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;* @, c. g  K1 w; Z+ W
  3.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    . r/ A' A) X2 L8 e* X4 T- i
  4.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;) I4 [& Y" T- p! L" B8 W
  5.         GPIO_Init(GPIOA, &GPIO_InitStructure);& k7 @. s& B& Y* A
  6.     3 l2 v% m2 S8 X9 @
  7.         /* Configure USART1 Rx (PA.10) as input floating */
    , _, ^5 o5 \- x! a( ^
  8.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;9 ]' X* i% d6 q" k
  9.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
      K0 Q( S) y# A0 N9 k. ?
  10.         GPIO_Init(GPIOA, &GPIO_InitStructure);
复制代码

0 L' [6 F' Z' ^/ X" t
③ 初始化USART控制器
  1. /* USART1 mode config */7 a8 D* ]3 D2 h5 y  C
  2.         USART_InitStructure.USART_BaudRate = 115200;
    1 h6 [4 _+ w, |' d
  3.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;0 a3 P* E5 l$ {2 l
  4.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
    2 d0 k. E6 Y* B  C( Y8 z8 a, L
  5.         USART_InitStructure.USART_Parity = USART_Parity_No ;0 S3 a" k6 N4 o5 J" [, ^7 k
  6.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    ( J, W( R( y! h( x$ T
  7.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;9 `. m* A, t: b: R8 u& _6 ]
  8.         USART_Init(USART1, &USART_InitStructure);
    6 ~6 z1 i% v; r; U  q" y
  9.         USART_Cmd(USART1, ENABLE);
复制代码

; z4 g' l7 v1 K* L+ `, U
五、STM32串口疑惑
1、串口时钟使能与控制器使能的关系
  为何USART时钟使能了,还需要在配置USART控制器的时候再使能一次?
  1. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);' t4 M3 H3 E+ g! H
  2. USART_Cmd(USART1, ENABLE);
复制代码

2 Q6 u4 m4 {9 ]0 c1 O
1> USART的时钟使能
  APB2 peripheral clock enable register  (RCC_APB2ENR)
- }9 y, m! Z# O' b4 O6 Q
141032139066894.png

' Q7 U8 @3 j; \# v1 w  F+ C" z
2> USART控制器使能
  USART Control register 1(USART_CR1)
. V- I/ R: d5 n& @
# [  q  Z( g( c) l7 I" }! }
141037504848087.png
3> 原因
  
141054298282659.png
) N1 K' l/ D) e# h# O
RCC_APB2ENR:  控制APB2时钟是否供应给USART控制器
USART_CR1:   控制USART控制器的分频器和输出是否工作
2、TDR与RDR共用一个特殊功能寄存器地址
USART_DR功能描述:
  包含了发送或接收的数据。由于它是由两个寄存器组成的,一个给发送用(TDR) ,一个给接收用(RDR) ,该寄存器兼具读和写的功能。TDR寄存器提供了内部总线和输出移位寄存器之间的并行接口(参见图236 )。RDR寄存器提供了输入移位寄存器和内部总线之间的并行接口。(摘自《STM32参考手册》)
  笔者的理解是:当对USART_DR进行读操作的时候,访问的是RDR;当对USART_DR进行写操作的时候,访问的是TDR。
六、串口调试时需要注意的地方
1、通过MDK结合一些调试器可以单步、任意断点等等方式进行代码的调试。可是,这种调试方法对于调试操作系统,比如uCOS-II,还有那些必须要全速运行才能进行调试的情况,就显得力不从心。串口调试正是用于这些地方,可以在程序全速运行的情况下,实时的打印系统的运行信息。
2、串口调试也有它的局限性,由于串口的波特率相对于STM32这样高速运行的单片机显得迟钝,很多情况下不能及时的打印系统的运行信息。甚至有些情况下,我们原本那些串口调试的代码会成为影响我们系统实时性最主要的因素。
& B& f1 K' f: w  f* L
收藏 评论0 发布时间:2022-1-18 19:56

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版