找回密码
 注册
关于网站域名变更的通知
查看: 214|回复: 1
打印 上一主题 下一主题

【疯壳·无人机教程10】开源编队无人机-串口(基础收发)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-9-8 10:59 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
COCOFLY教程
——疯壳·无人机·系列
串口(基础收发)

; V8 P  d: L4 I! X9 _
7 J6 ~$ k  E0 Q  S' J/ [
2 e/ Y: |7 e  Z! I, s! c# ?2 X8 |% m' h' ^2 ^. W$ _( \

- A% N/ Q6 H' p    图17 J2 L4 G8 |4 ?( n; p- |
& D8 h( z; x# k% w

' l0 ?8 f; C& G- ]/ ^& i    一、串口简介% p1 P$ G; n5 o
$ P( I( a; T; R2 e
    在嵌入式开发领域讲的串口通常指的是 UART,UART 即为通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)。是一种通用串行数据总线, 用于异步通信。该总线双向通信,可以实现全双工传输和接收。$ z, ~' P; S" ~4 T1 }, m# K
    UART 常常用于两个单片机之间进行数据传输,如下图所示。% t$ Y# Z- V/ \" y: p$ }
/ K- V$ I; k$ G0 `& f% B. e
   
, [# Y1 X/ Z2 q: P    图2
0 }" M$ u( ?9 _! D8 R0 W, h5 U  m    其通信过程如下图所示。
+ O5 N% u/ _  m0 x
; \- [. ], A2 |
' J5 k0 }6 Z# G  u! n) z图3( i& M- d) Q1 f, T' E3 ^
    STM32F103 提供了 3 路串口,支持同步单线通信和半双工单线通信、支持LIN、支持调制解调器操作、智能卡协议和 IrDA SIR ENDEC 规范、具有 DMA 等。可配置为串口的引脚是有限制的,所以在设计硬件电路时需要注意哪些引脚可以配置为串口引脚,如下表所示。
/ U# U  {( x1 [  M1 C& q: t; @    串口管脚映射$ `, p1 T# {8 v; @  e" m( i) _
8 @( m/ O* o6 E9 Z; H
   
% i8 L0 X% @0 x9 x$ K& g1 _5 U- d    图4
0 t  B- [. h* j+ u& S5 b2 h% J+ T) p# g1 c* r& I
6 E% c$ u  N' D6 O2 _4 d$ V2 X

1 U% [* w; a$ U1 o    二、UART 串口通讯协议% d- x0 U' `/ C" M# _1 o; X
# \$ v1 u# P, G
    串口通讯过程中一帧数据包含了起始位、数据位、停止位以及可有可无的奇偶校验位,除了需要知道这些概念外,还需要理解波特率的概念。/ A2 s" {, F4 D) N3 l+ J( w
    (1)起始位,当未有数据发送时,数据线处于逻辑“1”状态;先发出一个逻辑“0”信号,表示开始传输字符;+ U6 R+ Z" k0 _& h
    (2)数据位,紧接着起始位之后的 8 个数据。从最低位开始传送;
5 P% P' h# S: l! ~, v    (3)奇偶校验位,一般不用;" _/ o& G0 _* j0 a
    (4)停止位,一般为 1 位(也可以是 1.5 位或者 2 位),为高电平。作为结束的标志;
- z, T% ^" ~! b! q  ]3 k/ ~    (5)波特率,波特率表示每秒钟传送的码元符号的个数,是衡量数据传送速率的指标。( k* v# O4 _0 e! l
    如下图所示,为一帧串口数据的帧组成。% z7 Y% S# P* x5 c0 E
# A" H& x: f- `' u! o$ _# ]
0 u/ P" x& |' L; M
图5
5 A: q7 N8 V- W8 R' X! U3 C    三、UART 串口寄存器
6 a: @) X+ ~8 `8 B5 |
' _/ H% @2 S/ |  ]; _5 P6 W; n3 `    STM32F103 与串口相关的寄存器众多,这里只讲解重要的几个寄存器。$ e5 |+ L- i0 J& _
    (1)USART_SR:状态寄存器,如下图所示:0 L% v* T  q3 D3 K& a2 K" x

2 J& Q3 t. U2 I  Z# u, w
; D7 ~: J7 c% W$ L! f$ e2 l: c图6
' S7 l7 N3 s& J, U& b/ q    需要了解的位有:TXE:发送寄存器为空;TC:发送完成;RXNE:读取数据寄存器不为空;ORE:上溢错误;FE:帧错误;PE:奇偶校验错误。" F4 H; n& f6 d% u) D$ t
    (2)USART_DR:该寄存器只有低 8 位有效,而且具有读写操作,有关该寄存器中的数据是要发送的数据还是接受到的数据取决于执行的操作是“读取” 还是“写入”。 如下图所示:
/ a( }) [2 C/ r4 S2 S  j6 u) m% ~: V' k0 ]' Q
   
7 O. b) t! b$ {$ b6 S    图7
4 v* C' e5 J1 [) F! ?
4 M( b) g2 a, I, k/ v% b    (3)USART_BRR:波特率寄存器,用于设置串口通讯的波特率,如下图所示:8 s$ b; Z* T/ ?% f0 Q' j
. A0 O; Z. v/ ^7 H
   
: e9 E4 `  X4 P$ \6 N    图87 e' b( H; W4 v8 R$ N; \
    其中在寄存器中会设定相应的值,DIV_Mantissa[11:0]用来设定分频系数的整数部分,DIV_Fraction[3,0]用来设定分频系数的小数部分。/ k3 {5 v. d0 y. _+ Y
    串口的波特率计算公式如下:
( A  Z! F6 k3 N
* j- C4 m" Q) `: k0 O7 Y! e) u5 n    $ [# v+ R: P0 w1 w7 i
    公式1$ u. z$ w, ]: j, A2 u2 Y, `
3 S3 v- V+ p" ^) q9 o7 a! i" |
    这里的 fPCLKx(x=1、2)是给外设的时钟(PCLK1 用于 USART2、3、4、5, PCLK2 用于USART1,这里 STM32F103CBT6 没有的串口就不讲解)。USARTDIV是一个无符号的浮点数。假设串口波特率为 115200,使用的是串口 1,串口的时钟为 PCLK2 的时钟(即 APB2 总线的时钟)为 72MHz,如下图所示。
1 |+ r6 _& O" |3 j0 X$ N) N
) z. J7 S( a, |: X  k, y4 K     6 r" S/ U; `/ m* ~8 ~
    图9
( O6 D# t; u+ V% k    根据公式可得:
( {& w3 [$ g( `" P8 ~! {- ]8 V    USARTDIV=72000000/(115200*16)=39.0625" J( v( a* B% H- l

, @% B3 X; f: j+ |: p0 q    所以小数部分 DIV_Fraction=0.0625*16=1=0x01。
- d: t: M1 C. k' Q; \& C1 c4 @! ^5 E" v# X8 ?; x

$ e9 d  f9 N% n0 h% @# q1 I0 u    整数部分 DIV_Mantissa=39=0x27。
1 t& _; \" n% s0 m, w8 Q7 d% g- j7 ?
    四、串口基础收发实验9 }+ N, n1 ?9 z1 D5 w3 Q8 `9 \" x

$ |5 S3 p0 Q, Y/ k- t  K    串口收发实验使用 STM32 的串口 1 即 UART1,通过串口模块连接电脑,使用串口调试助手来进行通信,STM32 收到数据后把收到的数据在发回电脑。串口引脚如下图所示:4 A$ J7 Q% m) o8 `! S- E+ N
  p2 h+ i* R8 _& p2 [* p- g  m
    & x: P1 [4 b" Z7 c6 {& D! k5 r
    图103 M5 ]4 H# E: Q" h% R
    两个串口引脚分别与 PA9 与 PA10 引脚相连,那么我们就对 PA9 与 PA10 引脚以及串口模块进行配置,配置代码(通过调用官方库)。
% x1 v* I$ g- g& \" J! E6 B" L    代码编写的思路如下:
6 N! J7 y; t" w) ?9 `! ?  ^8 n: ?: Z. c2 o0 J: L' c+ z- d% l
    编程思路( m: A  h( J3 G  Z. j8 {0 j

1 v( t5 {  k& V; }& D    
$ t! O6 T% ]7 j# l) e    表1
! X- O9 |: m% E    串口初始化代码如下:- S* b. P- A3 D2 t, B
) i" j" `) r. e- H" s4 R
    6 p  {7 ]6 M+ U) N
    图11: J% G  l6 p# `: Z' x. V( j- Z
    串口中断函数代码如下:
$ e0 h! a& H4 V. o$ B9 }5 R0 I0 J( W" h
   
$ M6 d/ V0 P8 a- t0 V    图12
, E& {' {+ G4 U7 [6 P    设置串口 1 的波特率为 115200,代码如下:
9 O7 |' j  f- J" |! c/ r( ]- c
# g, T/ C/ l3 \" ~8 w; f    
3 i/ |. ^" R; N6 x* @" v    图135 J. e1 Z, r# E

1 ?5 W1 s" W/ U- X2 {  `    保存、编译、下载代码,把飞控上的 USART1 上接的视觉模块先拔下来, 然后接上 USB 转串口模块,如下图所示:
5 ^- G( Y- @0 r) O5 W8 B/ k2 {7 Y0 z3 y  x- b2 G( E! `' ?9 F
     9 y7 A+ O  H* Y
    图14
* B8 x! H# Y4 @  \/ ~( E3 ^    然后在把 USB 转串模块插到电脑的 USB 口,打开电脑端的串口调试助手, 找到对应的 COM 口(前提是安装了 USB 转串口驱动),设置波特率为 115200, 打开,在串口调试助手的输入框内输入“www.fengke.club”,点发送,然后可以看到串口调试助手收到来自 STM32 的回发信息,也是“www.fengke.club”,如下图所示。
$ ^# B9 P! o, Z  V. A  Z+ y* |, T1 o7 i
  & b2 J5 V# k% d$ s2 a) @
    图150 J* ?; }$ d! W6 v

5 C6 @' E1 s' ]: }; _
8 @4 E4 ^/ }; `& {8 j8 }' B2 `3 E8 h! F8 x
    文件下载请点击: 【3】串口(基础收发).pdf (889.23 KB, 下载次数: 0) 8 I; W, z& Q6 V2 e) A
6 q% i3 h6 N& [, m0 ]8 ~/ H2 e
  • TA的每日心情
    奋斗
    2022-1-21 15:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2022-9-9 14:18 | 只看该作者
    在ARM中,控制的外设比较多,所以串口数量要比较多些
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-10-13 00:04 , Processed in 0.140625 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表