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

STM32F407用USART2与HC06蓝牙模块通信

[复制链接]
STMCU-管管 发布时间:2020-9-11 13:27
串口通信原理

想必玩过一点单片机的人都懂一点串口通信,而恐怕我们印象中的串口通信不过如此,两个芯片通过串口通信,需要共地、Tx(发送)和Rx(接收)相互连接即可:& ?1 |1 `7 }. b& C/ U0 o
! K, _' {) \7 Z" v
而实际上,串口通讯种类繁多,即使是通用异步收发器UART也有RS-232和RS-485等不同接口,有兴趣可以深入学习。


) H% Z+ A9 c! k1 V4 d; f: l首先串口通信指的是一种设备通信的协议而不是指接口。串口通信的概念非常简单,串口按位(bit)发送和接收字节。而我们所使用的USART和UART的区别是可以同步,你在STM32的datasheet里可以看到USART2_CK,而实际上我们很少使用,我们完全可以把USART当UART来用。


, d2 [' @3 L/ J: X8 V- Z: y2 d

HC06蓝牙模块' u' f+ V1 z/ e0 R0 T, L& Q% z

无线蓝牙透传模块。

. I7 d, m( d% K3 ]1 C
默认名字HC06、波特率9600bps、配对密码00000。
1 {9 Z; h! Q' H# I5 u) ~
+ p: A$ c( J5 [7 p; @* |) p

20200911132052.c2fcce60a11c0132b003f6bdb980039c.jpg
9 ~% E9 n; a+ I- a- R6 ]# l
用Arduino的时候想必是很傻瓜式的,如果用STM32来做还是要了解一番的。

7 C' n0 t4 |( {$ x  A/ x: o, r( Y4 y$ y  _5 A5 V" d9 U0 v
首先好好看一下datasheet,看一下AT指令集,然后用一个USB转TTL的模块(这里用的是CH340)和电脑连接:
# g, C, d  L$ s  t4 ~) W( @  F
20200911132104.c20b96f20877ed8130f4ce849250e465.jpg
' u: k& I# Y1 H5 Q, p' k
) ^& j$ B  V6 G* V: F& {( h6 s
可以看到HC06的指示灯一直在闪,说明蓝牙未连接。打开串口助手,试一试AT指令是否有效,然后你就可以设置波特率(建议就选默认的9600,据说快了会降低通信的稳定性),改名字和密码,详见datasheet。
. l# P  {8 w$ t" x, u

- i. W+ J! i4 A

7 h3 f( Z  z- e8 n: A0 X1 E
5 L1 S% k( [  [5 b1 Q/ B- o

9 w4 d" W0 @+ s# a

打开蓝牙串口APP,会自动连接,连接以后指示灯就从闪烁变成常亮了。在串口助手里把HEX显示给勾上,然后用APP发几条指令,会发现收到这样:

. E( k' }/ ~; ^! r0 C5 I7 T

20200911132141.f2cdb8d542190c09c605c91d8f1cc7a6.png

' `9 y, Y9 v% W) h' u- P4 X8 E
+ L* t& G/ f$ |, \
那就说明蓝牙这边不会出问题了,专心调试STM32吧 - -‘

2 [' p& E! @: m/ m

STM32F407的USART2配置
; h5 m2 d1 ]0 E7 {
1 b) o+ X7 w& M5 B5 f% a# V3 S  R: l

首先查datasheet表,找USART2对应的是哪个GPIO:
$ [6 H5 C; Y6 u1 x, W+ u

20200911132153.d2ad82e1743985b1db40e7c63d3916dc.png

8 ~- r  `1 v  e
/ R5 B7 i  n4 h7 g' Y% R6 g

千万不要忘记查看总线!4 |- U) G7 O& R1 q7 Q! s5 R, L4 C% N) k

20200911132203.49bee1bf408bc0c820315fefed479010.png

/ g  q& w( p$ a/ t1 ~; S: p" w  D' @, r
( r1 k" Z+ N0 t# K( w* h* w- @

+ n0 D4 x+ u1 q% g$ C* e# Y; L8 T6 ^1 U6 B0 ^- G
看了系统架构就会知道,F103和407的GPIO挂在不同的总线上。103挂在APB2上,而407挂在AHB1上,所以初始化时钟的时候千万要注意~


. [, D+ l) ]% a% A4 x; Z0 j- x, K

  1. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
复制代码

% ?. T( O4 P. n; w4 `% E! g

另外在配置GPIO时的参数也有不同:
7 }4 l; O9 R# w我们查看GPIO_InitTypeDef的定义:

& E% J$ C1 V; |2 G6 M

  1. //STM32F103中的定义:' E, g& S7 f4 X9 \% S
  2. typedef struct
    / U. d: p! ~: v% N. o
  3. {/ B) x) u! r& F7 e' B
  4.   uint16_t GPIO_Pin;  ) b9 p: b0 d: h
  5.   GPIOSpeed_TypeDef GPIO_Speed;4 o. E) H" {& `* E. d# `! P
  6.   GPIOMode_TypeDef GPIO_Mode;
    $ J3 t* \! @# d) b( Y
  7. }GPIO_InitTypeDef;
    & |  w% o1 {8 |1 Z$ X, q& f

  8. 1 l  A0 @! n& v6 V& L) y2 s  s
  9. //STM32F407中的定义:
    ; z8 E& E, f2 L) E+ g
  10. typedef struct) a, ~7 D" T6 ]+ M6 V" p
  11. {
    2 v" c# l' \) Q5 d- V
  12.   uint32_t GPIO_Pin;              
    & R% a  T8 S/ b8 K1 k
  13.   GPIOMode_TypeDef GPIO_Mode;     % _, V& _9 O7 g7 G* m, z$ L
  14.   GPIOSpeed_TypeDef GPIO_Speed;5 j& F& {# W/ {4 l0 D* m7 M
  15.   GPIOOType_TypeDef GPIO_OType;   ' ^: o! e9 w/ o2 E" W# Y$ K
  16.   GPIOPuPd_TypeDef GPIO_PuPd;     
    * ^# i. m1 ?7 z: F
  17. }GPIO_InitTypeDef;
复制代码

可以看到F407多出了两个参数,即GPIO_OType和GPIO_PuPd。

在F103需要分别设置两个引脚的Mode为复用推挽输出(GPIO_Mode_AF_PP)和浮空输入(GPIO_Mode_IN_FLOATING);但是在F407,两个引脚可以一起设置为GPIO_Mode_AF,并且都设置为推挽输出即可(这个我研究了好半天,据说是因为F1和F4的GPIO复用功能不同,F4复用功能不是在配置IO口模式这儿去配置,而是需要单独配置复用模式,然后再映射,总之就是F407配置串口复用的时候不管Rx还是Tx统统设置为复用推挽输出就好了。)

剩下的USART2初始化、中断初始化等都和F1一样。

最后详细代码如下:

bluetooth.h:

  1. <font face="Tahoma" size="3">#ifndef __USART2_H# Q, x0 W) t  F4 [) w- V6 m. p
  2. #define __USART2_H
    ! Z+ v, H* d/ G' ?4 B2 k4 N
  3. #include "stdio.h"  " j- e$ S& N- N! O0 J8 e: F. M
  4. #include "stm32f4xx_conf.h"1 G8 z/ V+ n4 I% `* A3 q1 W
  5. #include "sys.h" 9 c5 K5 p4 u: A; t
  6. * x: ?6 b+ p& ^# J" U( }! M4 P
  7. #define USART2_REC_LEN              200
    2 Q- X& c% R+ K" k; L% j$ k
  8. #define EN_USART2_RX                17 J" ]4 j5 Z; R6 F" ?8 y, x, T
  9. ! m, I7 U1 H0 e* _4 |
  10. extern u8  USART2_RX_BUF[USART2_REC_LEN];
    * C5 N- s9 k2 B, b- O6 o+ \
  11. extern u16 USART2_RX_STA;" ?3 w" q& \$ T, Y; U4 A' z

  12. 8 v/ @( L! |$ j
  13. void bluetooth_init(u32 bound);
    0 F# f/ q6 j! M5 O- n
  14. #endif</font>
复制代码

bluetooth.c:

  1. <font face="Tahoma" size="3">#include "sys.h"$ |' }- ^$ _! m( x
  2. #include "bluetooth.h"
    . ?3 u8 q( |8 T
  3. //这个是一个舵机控制板的驱动,感兴趣的可以看我下一篇博客
      n" T! [  {: ?; k
  4. #include "pcf8574.h"
    , |1 E' w7 m7 N8 h" Y0 d1 D

  5.   V1 K* D4 L3 j! Q; \8 U
  6. #if SYSTEM_SUPPORT_OS
    2 u$ ]; O' p% p7 f
  7. #include "includes.h"     
    : |0 r) U$ x: U) D6 j
  8. #endif
    $ J1 r+ d- t! I; K7 e1 ~" Q- D8 M( x8 }
  9.   d* s5 ]3 E! j4 B0 `7 b
  10. #if EN_USART2_RX- _/ ~6 o& z0 U
  11. ! w0 g0 @( O$ F$ w9 j; S# I
  12. u8 USART2_RX_BUF[USART2_REC_LEN];# `9 ]. p' ]: s) V2 j7 i: G$ d/ J
  13. 6 l% _2 T+ K5 ?+ H3 m
  14. u16 USART2_RX_STA=0;; s" Q2 r- E( w% B

  15. ) h8 t) O! V# e' w1 _
  16. void bluetooth_init(u32 bound){7 w' ]6 {' Y( k+ m, z$ ?
  17. $ p. `3 f0 c" y& b: u/ R/ j
  18.     GPIO_InitTypeDef GPIO_InitStructure;
    ! E! [0 R6 K+ y/ h
  19.     USART_InitTypeDef USART_InitStructure;
    5 M. n8 B7 T' K# l3 y0 s0 t; Z
  20.     NVIC_InitTypeDef NVIC_InitStructure;
    9 t8 N. G0 W( V& I0 T/ N+ P
  21. & o0 R2 A  q& K6 X, Y/ B
  22.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);& J3 {- ]' |# B. W) @
  23.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);6 b5 C3 `1 W7 a
  24.   s# E$ [" n  c- V
  25.     GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2);
    ) \9 M0 C2 }) h* T) Q. [& _" _
  26.     GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2);
    6 g1 a7 V' P# x" H

  27. 7 i; S! O7 _  n* e4 `  K' y  V
  28.     //GPIOA2,3->USART2RxTx
    9 P6 W- [3 ~% e- B$ L) K3 ?2 @
  29.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
    9 M3 y+ J' d: c9 _+ F- e
  30.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;# {; {' L: z  v& g/ Y: C* m
  31.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    ( u% u- J# J' |! `% N" D7 o6 M
  32.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    0 h& `  N4 r# Q2 H- _% _$ ^, ?
  33.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;* D& t. @# t: P" ~" [
  34.     GPIO_Init(GPIOA,&GPIO_InitStructure);5 E6 K6 q9 a5 J6 \6 J
  35. , I0 o$ i+ H! N  ^% k
  36.     //USART2 init5 \( b( x9 r" r5 |7 _5 Z
  37.     USART_InitStructure.USART_BaudRate = bound;
    / ^* _" \, [) A# \
  38.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    5 w  Y& j$ h- u& ?( S
  39.     USART_InitStructure.USART_StopBits = USART_StopBits_1;/ z' ^% _. I+ I
  40.     USART_InitStructure.USART_Parity = USART_Parity_No;+ t8 \; _- H0 H
  41.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    + W! t  p) w2 T) X, ~
  42.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;9 D) Z3 t# G1 D! T- j) |4 w3 f
  43.     USART_Init(USART2, &USART_InitStructure);
    " m) P! [$ j  L8 B7 r% Y

  44. 4 q% M, L; k" ~9 V& N9 C
  45.     USART_Cmd(USART2, ENABLE);
      A1 V6 R& G$ f! k2 `' G

  46. : A- n# p" M% q  E
  47.     //USART2_ClearFlag(USART2, USART2_FLAG_TC);
    + }- E) S% W3 Q7 C6 W

  48. ' ~$ ^7 \- m( {9 }' t- X
  49. #if EN_USART2_RX    6 E! \6 U, v2 u$ v/ {, L8 f; d" ~2 W
  50.     USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//interrupt
    & \, `: T/ h7 v; x9 U5 m7 T1 u2 `
  51. 3 r/ i' ^3 t8 o0 F" T) s, p+ M
  52.     //USART2 NVIC' P! g) {0 u* i
  53.     NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//USART2 interrupt channel
    & K" R% i5 n$ z9 C, n
  54.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;( L% O# B; b& l6 W2 S
  55.     NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;
    ; d" T8 `6 p+ B
  56.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IQR enable7 A3 `& a  Q4 H6 Z! d8 B
  57.     NVIC_Init(&NVIC_InitStructure);
    8 y2 h7 r5 Z" ^# B" e* f  u4 Q

  58. ( O! Z5 O  i5 w# w
  59. #endif1 J% K& H3 K6 U; M2 s6 H
  60. }
    & M0 G5 [# {; c

  61. " T; T1 L% ?0 N# Z

  62. 5 G- L- U8 Q2 }! \2 U* t  U
  63. void USART2_IRQHandler(void)
    ' I9 Z- w7 A  P- y5 o+ F# b
  64. {* K/ c7 @) q- _6 h5 m
  65.     u8 Res;# M4 Q9 i1 V# `/ ~- b0 t
  66. #if SYSTEM_SUPPORT_OS
    : C4 W  T3 i- O0 N5 s$ w
  67.     OSIntEnter();   
    " a* a: z! Q/ N  _
  68. #endif
    1 \9 l. n- e% n/ d$ c
  69.     if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)' d  ]- T5 }- h7 D2 G8 |2 R; M4 A
  70.     {9 h+ O* a' _7 Y) D% ]
  71.         Res =USART_ReceiveData(USART2);//(USART2->DR)& p# D: q4 o7 {" x9 i
  72. //      USART_SendData(USART2,Res);
    - L: v4 {0 y$ M  m8 \7 R- Y
  73.         if(Res == 0x00)
    # y1 F) D9 U5 H- m8 o# n- l: X
  74.             down();' ]7 I3 p% x) u$ J. @
  75.         if(Res == 0x01)
      p2 j. f( v. I" r- Q
  76.             up();
    ' O3 A% Y) n" p' X1 ~2 H& V# a
  77.   } ( b9 k5 M4 b: S: L& b
  78. #if SYSTEM_SUPPORT_OS
    % R1 d3 L% M! Z; W- c
  79.     OSIntExit();                                             2 `4 M2 S( s( Y: s2 U( g
  80. #endif* n  F# b7 U" M& b3 W# g4 _
  81. }
    8 D9 j% a! Y0 T) b/ Z- M! `* u& i1 G  V
  82. #endif  </font>
复制代码


8 g* X- D# L/ v: Q. T! k


7 m0 Y# ~" Q1 X0 {


& A$ ^7 {7 L; R- Y: ?* A+ j) \) j% @' W

5 j: n& f0 T5 O% N" p0 u8 X: b1 [0 T
20200911132212.1c266587734684e71c7bf9645795d60c.png
20200911132036.7bade6ae4897c8a7d6e98234a9521cf2.png
赞 收藏 1 评论0 发布时间:2020-9-11 13:27

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版