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

STM32F407用USART2与HC06蓝牙模块通信

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

想必玩过一点单片机的人都懂一点串口通信,而恐怕我们印象中的串口通信不过如此,两个芯片通过串口通信,需要共地、Tx(发送)和Rx(接收)相互连接即可:
2 g- K$ S$ {' Y( `: W1 n2 a, n* X7 d' ]& w$ }+ g
而实际上,串口通讯种类繁多,即使是通用异步收发器UART也有RS-232RS-485等不同接口,有兴趣可以深入学习。


5 M2 y+ b; s/ Z5 c, L8 \首先串口通信指的是一种设备通信的协议而不是指接口。串口通信的概念非常简单,串口按位(bit)发送和接收字节。而我们所使用的USART和UART的区别是可以同步,你在STM32的datasheet里可以看到USART2_CK,而实际上我们很少使用,我们完全可以把USART当UART来用。

: R" j( c, X% o* B3 E

HC06蓝牙模块
( K6 W( Z- Q" d( u" V

无线蓝牙透传模块。

6 Y! A% O& W9 ~- e5 F
默认名字HC06、波特率9600bps、配对密码00000。
8 e3 I4 V+ @  p$ E. C7 `% W& p% K" g! l8 J; s& f. u

20200911132052.c2fcce60a11c0132b003f6bdb980039c.jpg

* I) A) B3 w7 K' P7 D用Arduino的时候想必是很傻瓜式的,如果用STM32来做还是要了解一番的。

4 Y" d. Z  F- S8 l6 p7 d; p
1 H1 v7 p+ Q! }$ g首先好好看一下datasheet,看一下AT指令集,然后用一个USB转TTL的模块(这里用的是CH340)和电脑连接:

3 S8 ?1 v+ _6 q& ?0 C
20200911132104.c20b96f20877ed8130f4ce849250e465.jpg

1 |2 `& e5 {2 m$ h+ ~" i5 s9 ~8 h  X' s
可以看到HC06的指示灯一直在闪,说明蓝牙未连接。打开串口助手,试一试AT指令是否有效,然后你就可以设置波特率(建议就选默认的9600,据说快了会降低通信的稳定性),改名字和密码,详见datasheet。

+ {) o$ L1 l9 z
% M( o; z* ?& L: ~

- K- P) t2 q, l: I% \9 O9 D; I9 v7 P& P- @0 q
7 u# L( Y4 n* ~3 i9 `4 {

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


2 V  b! c; p3 b! K! t; P

20200911132141.f2cdb8d542190c09c605c91d8f1cc7a6.png
5 R- @# j( I4 O3 V) @
' m! L4 \! Z7 d6 P& j  t; g* f* u
那就说明蓝牙这边不会出问题了,专心调试STM32吧 - -‘

% \3 N, o: c4 d# e( B, E' k0 K. a1 Z

STM32F407的USART2配置
1 n) }$ V  V( j  {. U& P( d, n1 @/ S

首先查datasheet表,找USART2对应的是哪个GPIO:/ U0 ]  j5 x* U- d" x7 v$ @7 Z9 C; y

20200911132153.d2ad82e1743985b1db40e7c63d3916dc.png
* y! ^7 F! r! Z: i, k6 U+ m: ~
/ i% ]! ~% `+ `* W" ^) E! f

千万不要忘记查看总线!. k8 J2 L( s5 g3 F9 X

20200911132203.49bee1bf408bc0c820315fefed479010.png
4 H+ G1 y! N( i3 ?& z4 K

! I0 f# b/ U+ |9 c5 Y& U

# a0 V* B! `/ X7 {- ^/ F( I1 B- D2 E2 n- \$ A
看了系统架构就会知道,F103和407的GPIO挂在不同的总线上。103挂在APB2上,而407挂在AHB1上,所以初始化时钟的时候千万要注意~

3 e1 U2 @% p. A8 Q1 H

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

. L  x" D- L8 a+ i& P8 `( @9 _

另外在配置GPIO时的参数也有不同:
/ I0 _1 a: D7 a3 X; n$ l0 F我们查看GPIO_InitTypeDef的定义:


- l, U( j5 Z9 {

  1. //STM32F103中的定义:$ M+ f8 K8 H$ A! h# m
  2. typedef struct
    , v5 W8 X2 m2 u$ G# l
  3. {
    0 X; V' \, v; G- b. }! a
  4.   uint16_t GPIO_Pin;  % E) K1 S: h1 Z' \3 e# o
  5.   GPIOSpeed_TypeDef GPIO_Speed;( w, h* R- ?: y. ?! e& N
  6.   GPIOMode_TypeDef GPIO_Mode;
    " `/ F4 w. Y' v+ y+ C! |
  7. }GPIO_InitTypeDef;5 p4 l; j# T7 M0 S8 W# z) f' G. ?

  8. 5 i3 e7 P6 ~) x9 U: L1 @7 |& e  ], D
  9. //STM32F407中的定义:
    * b& E! [$ V- [, W' A1 i  M
  10. typedef struct
    : v; d+ v) k5 |
  11. {
    6 F( \/ m6 |; i: O
  12.   uint32_t GPIO_Pin;              
    # ~7 s" }% ?% y8 h, ~8 n* x
  13.   GPIOMode_TypeDef GPIO_Mode;     9 l0 q6 V- p5 O% o
  14.   GPIOSpeed_TypeDef GPIO_Speed;& H: C* ^  Y$ g# J1 d# C
  15.   GPIOOType_TypeDef GPIO_OType;   % M6 O  G0 U2 T9 p2 S' N8 v
  16.   GPIOPuPd_TypeDef GPIO_PuPd;     ; C! C2 i2 e5 q
  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
    $ y" {# k7 W6 G) `
  2. #define __USART2_H0 ^$ D% q+ M3 e8 s' e0 i6 a+ c
  3. #include "stdio.h"  : x5 J! B# n$ s; v+ ^8 O
  4. #include "stm32f4xx_conf.h": s; g1 O( t" }2 U* F/ o$ C
  5. #include "sys.h"
    5 J' q, i" H, ~: r3 n$ c, K
  6. / b: {0 d2 U& [
  7. #define USART2_REC_LEN              200/ |) Y" L  G; A2 X2 K3 C6 s
  8. #define EN_USART2_RX                1
    + J8 I$ D7 j7 j
  9. 4 o  ?( v/ v/ D2 N& D4 ?2 z
  10. extern u8  USART2_RX_BUF[USART2_REC_LEN];6 `4 o$ u# v& d. _/ ]
  11. extern u16 USART2_RX_STA;
    , @7 k- A4 ]! n% l6 L- s7 k. s5 Y

  12. / g  a6 Q5 O; _5 v
  13. void bluetooth_init(u32 bound);; e/ D4 c! y7 L% K
  14. #endif</font>
复制代码

bluetooth.c:

  1. <font face="Tahoma" size="3">#include "sys.h"
    4 |/ l- L+ b; S0 l! ?
  2. #include "bluetooth.h"
    8 }. x5 B" `9 d* v  M
  3. //这个是一个舵机控制板的驱动,感兴趣的可以看我下一篇博客. M9 T8 w) U0 @) A
  4. #include "pcf8574.h"
    , s5 x. B. _5 _( O& Y

  5. 7 n8 ?9 s5 c: E# T# _( u5 ]0 X
  6. #if SYSTEM_SUPPORT_OS
    0 o: q/ H$ v% ^$ |2 a6 m1 ~
  7. #include "includes.h"     
    , o# G- R2 O- M7 {+ I! f' R+ E: `
  8. #endif
    $ _- E9 W* J1 d% U9 T: V# }
  9. " w5 I! T/ o+ y7 X
  10. #if EN_USART2_RX
      g2 f& S) R3 ~, l1 K- Q; ~: I6 h- X

  11. 3 r7 d  _! \* M8 \& U3 I9 m( |
  12. u8 USART2_RX_BUF[USART2_REC_LEN];% n2 x2 I+ ?8 c, e6 l

  13. & h/ w5 L6 }4 r" E
  14. u16 USART2_RX_STA=0;5 c2 b9 }# r: j+ Q& ?
  15. ( u# `: R6 c: Z% M
  16. void bluetooth_init(u32 bound){3 P; s5 J! h+ `$ u2 a3 f

  17. $ k. ^6 M7 ?3 }0 a# R
  18.     GPIO_InitTypeDef GPIO_InitStructure;& ?' v) ~& y6 T+ L5 N
  19.     USART_InitTypeDef USART_InitStructure;, e- J* K. u5 Z1 H
  20.     NVIC_InitTypeDef NVIC_InitStructure;# [! h% r* m( K# {1 @+ B
  21. ; q# X3 n% V$ C0 O
  22.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    / f' P( J* k1 L! k5 A/ u6 U6 `2 I4 i
  23.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);8 W7 K2 }- w# \  t3 `

  24. 8 Z9 p8 J  D' i# v8 [! G
  25.     GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2);+ a2 f& V. @5 d3 m' N$ c6 a
  26.     GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2);# H  f- _' T, n1 [, e

  27. ; e. Q7 z( X% d4 a2 U" K; A; K* Q
  28.     //GPIOA2,3->USART2RxTx' N6 B4 P, \3 ^/ W/ [
  29.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;8 p1 q$ s) J  b" t0 \
  30.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    + a' x8 A. n5 H9 @! ]
  31.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;: F5 }* z7 a# v' n" K
  32.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    5 {. B2 W2 M/ |% T
  33.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    , e; x# o' }# ]" j9 t
  34.     GPIO_Init(GPIOA,&GPIO_InitStructure);. n$ \  u$ B" \3 r, [0 ^1 D( f% g% @

  35. 0 ^9 S5 ~( E2 H% \) ]
  36.     //USART2 init
    % j( Z6 Y- q. W4 R4 r7 d4 y
  37.     USART_InitStructure.USART_BaudRate = bound;
    " n( Q, t9 b3 F* O. N* E
  38.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;& b5 n5 w- w6 ^4 |; E6 c/ o9 g9 P& _# `- |
  39.     USART_InitStructure.USART_StopBits = USART_StopBits_1;' l* p; g5 u3 b& m7 V
  40.     USART_InitStructure.USART_Parity = USART_Parity_No;4 ]$ T4 J; f' r$ d
  41.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;2 i& X) N9 g: E/ `9 U( g
  42.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;9 i# z2 ?' d' y4 o) t
  43.     USART_Init(USART2, &USART_InitStructure);$ ?2 u2 z& G" F) N" C' K) V

  44. . X! A4 t5 F9 P8 N8 E# p
  45.     USART_Cmd(USART2, ENABLE); 1 E& `* V$ _4 ~5 F5 A" Q" ~8 y
  46. 9 `  T$ _9 i1 u) y+ S
  47.     //USART2_ClearFlag(USART2, USART2_FLAG_TC);" i! f9 e0 T+ L, G# z3 r* V, w
  48. 8 x4 F- f5 @& N7 ?7 J
  49. #if EN_USART2_RX    9 a3 [# I$ ^7 M4 B3 R
  50.     USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//interrupt5 e& P0 P4 y) t3 {$ o

  51. " F3 h' |/ l! i0 R
  52.     //USART2 NVIC2 O) N. Y  h4 U1 Y9 q
  53.     NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//USART2 interrupt channel
    7 ~: j' w8 h# ^: j+ l
  54.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;9 Y# `% y. f& [
  55.     NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;
    ; B$ a$ T7 c- |0 \5 ?
  56.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IQR enable
    8 z% w, O, s  W7 _  h) `! K9 |/ r
  57.     NVIC_Init(&NVIC_InitStructure);/ n' _/ v, t+ D
  58. " U( i) G/ g- ]+ ]  Q6 v' X4 z) p
  59. #endif6 G7 i! v; Q( [" _. ~5 }
  60. }4 g, ~, P# E6 @1 k
  61. " S" E: o8 S* L& E( Y/ m9 B

  62. ; e- _# x, n6 [5 I$ ?& u5 U3 n
  63. void USART2_IRQHandler(void)
    7 F: o3 U3 P! v. X
  64. {  \* h9 k4 l+ n& O0 O
  65.     u8 Res;: p' `2 q' x! ?5 N. r& q
  66. #if SYSTEM_SUPPORT_OS
    + h# e, t1 p* l* \4 [
  67.     OSIntEnter();   
    # {1 Z2 g* r4 a2 p/ E
  68. #endif& y: M& O" a1 a% a. H
  69.     if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)% m" J% L+ _9 \
  70.     {
    5 r+ ?1 w$ O1 D* g! H
  71.         Res =USART_ReceiveData(USART2);//(USART2->DR)! g- n8 s- k% Y' b, J: t7 A
  72. //      USART_SendData(USART2,Res);+ I& z( ?" _* R0 Q3 N
  73.         if(Res == 0x00). P) |6 m5 V+ c
  74.             down();3 E& T$ e3 x7 Z1 g
  75.         if(Res == 0x01)
    , o( D4 }. |$ U  o
  76.             up();* z4 M2 l6 m( Y' n* Z9 W
  77.   } . g. q( L3 D5 C9 g" W; e# `  z
  78. #if SYSTEM_SUPPORT_OS$ f! b6 e/ Q1 Y1 C( N
  79.     OSIntExit();                                             : X0 W% A: f) h3 S" Z
  80. #endif
    . V7 w; o" t- K, G9 B% d
  81. }
    , n# W7 z/ ?0 U& d
  82. #endif  </font>
复制代码

# u( L3 k" b& _2 a


8 e9 D& \6 X7 {+ [' \

  b  @. h' ?5 ]  C

. g9 S: F+ Z9 Y7 w  [( l5 s' O: Z. C2 |7 F$ L+ p! e5 X
20200911132212.1c266587734684e71c7bf9645795d60c.png
20200911132036.7bade6ae4897c8a7d6e98234a9521cf2.png
收藏 1 评论0 发布时间:2020-9-11 13:27

举报

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