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

基于STM32的驱动BT-06蓝牙模块驱动经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-18 14:01
BT-06简介
5 S; e; M! `3 b3 ?3 tBT06蓝牙模块是专为智能无线数据传输而打造,遵循V3.0 蓝牙规范。本模块支持UART接口,并支持SPP蓝牙串口协议,具有成本低、体积小、功耗低、收发灵敏性高等优点,只需配备少许的外围元件就能实现其强大功能。
1 @$ m7 N5 @, g5 nBT-06蓝牙模块驱动简单,只需要4根线就可以驱动:7 G* c8 v7 p  T1 r, `4 i
RXD0 Y* q3 K3 W5 n% R9 T
TXD
- u/ _) R2 p% n8 h4 G5 x) K; wGND; s( J8 D! R$ e$ f& d. R
VCC* ]8 ^6 G7 y6 R; d" J7 a
将电源接在5V供电口上,TXD、RXD就是其数据传输的接口,BT-06是以串口的方式驱动的,只需要将蓝牙的TXD、RXD接口对应接在串口的RXD、TXD上,就可以进行数据传输。5 I# E% @$ i0 `, Q2 _2 F1 J
, _# B- S- `& A+ v5 r
( \0 V" j2 E  `5 r' X+ P& d+ F
数据透传( V) g$ p, Q6 A/ b% z; `
当BT-06上电,手机APP与蓝牙配对成功后,BT-06即进入数据透传模式。7 z$ t$ z9 T/ l9 g
数据透传:透传是指与传输网络的介质、调制解调方式、传输方式、传输协议无关的一种数据传送方式。数据透传即透明传送,是指在数据的传输过程中,通过无线的方式这组数据不发生任何形式的改变,仿佛传输过程是透明的一样,同时保证传输的质量,原封不动地到了最终接收者手里。4 j  f# x$ e, h2 P
也就是说,连接好蓝牙后,从串口发送出的所有消息都可以原封不动的传输到手机APP中,注意!是原封不动,所以要想驱动BT-06,本质上是驱动串口来传输数据,所以接下来的主要任务就是驱动开发板上的串口进行数据传输。
, R! L* z$ A# k; J7 ~
9 B! ^" S. s9 W8 {

' |# [9 X1 e7 L1 a- Y配置串口
" M! e) T  ]- f$ D1 u# e由于我是第一次搞蓝牙,所以比较谨慎,分了几步:6 _5 d4 `' P  d4 O) X: U! b% N
USART1作为向上位机打印调试信息的串口8 @$ J3 d  w* m/ W1 J, ]
USART2用来连接蓝牙接口,进行传输数据  Y1 H) ?1 @3 A$ Z
9 \4 e6 r% |/ R& x: I
USART1初始化函数) g; _" G# F: Z2 E
  1. void USART1_Init( void )9 M* Z; [, Q* y
  2. {4 f% F' P' o1 A* J1 L
  3.        
    ' V& r$ U6 O/ q
  4.         USART_InitTypeDef USART_InitStruct;9 d, k- A8 i* _% U/ Y- P
  5.         GPIO_InitTypeDef GPIO_InitStruct;$ U8 @% e8 d0 |0 r7 c4 n
  6.         3 E2 A, H6 v3 M' m9 C8 O. |. Q
  7.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE );8 r- `$ Z, o; Q* F" i
  8.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1, ENABLE );/* 开启时钟 USART1在APB2总线 USART2在APB1总线 */
    : C! ^" b7 Q( z8 j) H
  9.         6 x, P' q$ q( T. {2 }1 j( F! L
  10.         ( E1 P( j: [* Y" }9 t- z
  11.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    8 b" O) o* ^$ g) X( v! O' a3 z
  12.         /* USART1  Tx:PA9 */  M; v. {. x6 ]7 a
  13.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用输出; L6 S$ J- @2 V2 m2 r: {
  14.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;9 G3 k# O, V- j9 g
  15.         GPIO_Init(GPIOA, &GPIO_InitStruct);) u; H8 R# ~- H. W+ _( B
  16.         /* USART1  Rx:PA10 */
    7 D7 y, g9 G4 a( `8 p# P, Y
  17.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;% R) S$ t  L+ N$ h% v2 ?
  18.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    1 M% B  r: r, P$ r
  19.         GPIO_Init(GPIOA, &GPIO_InitStruct);
    % a6 P& j, m7 q( Y6 W0 y5 X
  20.         1 v! U& l6 W0 X( p5 J/ b' z; O
  21.         /* USART1配置 */
    0 Y* _8 h% }8 }" C% g
  22.         USART_InitStruct.USART_BaudRate = 9600;
    9 ?; c; [  R# i, r0 v" B/ W
  23.         USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;4 N% y, }9 D! q( L6 B0 Q
  24.         USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;" }1 L' K  d. u  ]+ ^4 \
  25.         USART_InitStruct.USART_Parity = USART_Parity_No;
    ) h0 B0 T- z9 l: u* Z. I. j! q' E, [
  26.         USART_InitStruct.USART_StopBits = USART_StopBits_1;3 q; ~" X* U, ^6 N  F6 z6 c) C
  27.         USART_InitStruct.USART_WordLength = USART_WordLength_8b;
    9 d: L- _' X( p5 \& q
  28.         USART_Init(USART1, &USART_InitStruct);
    : Q' L6 J4 x3 Z4 Y( R2 r4 k
  29. % u' g# |5 t2 }) t+ x' u0 d+ x. N1 l" ?
  30.         4 Q1 ~) ^6 J; u$ e
  31.         /* 使能串口 */9 f+ g! E3 A2 {7 ]
  32.         /* 容易忽略 */4 B8 X$ S; a. a* s! U' x$ [
  33.         USART_Cmd( USART1, ENABLE );) w. V" {" f5 {' N' \' g
  34.        
    , t" l& g0 p# Z+ j2 X% H2 ?7 [
  35.        
    0 a  _3 v4 u* `. ?+ K
  36. }4 N0 g6 Z7 f4 y7 ^9 x( K
复制代码

% |; I$ y4 }9 r+ }+ R  \8 j% sUSART2初始化函数
( u9 H# t6 z2 ]/ v) `
  1. void USART2_Init( void )8 F5 U4 E( ~# q* F4 c
  2. {1 S7 w1 @0 |6 G/ M5 X8 `# f5 V
  3.         USART_InitTypeDef USART_InitStruct;
    2 M* H: w: h6 F, G2 s
  4.         GPIO_InitTypeDef GPIO_InitStruct;+ w  t! i% V9 {5 K. _7 ^
  5.         ! {; }7 Q+ q0 P# O: \$ _
  6.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE );
    : x4 H& m* Q" _# n# m' i) \
  7.         RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2, ENABLE );2 q, v! a+ v0 b4 U* B
  8.        
    7 p/ W$ l5 X: g2 T$ m# k  @$ F7 A9 @
  9.         USART_DeInit(USART2);( c* v. w, Z) m$ k! C
  10.         2 s& y$ A' O: p5 c8 m
  11.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;! w' ^. S! N% Z7 R5 H" Q& c( V
  12.         /* USART2  Tx:PA2 */8 A( q3 f8 h* s1 i
  13.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;2 x2 F5 G9 ?1 n  }  M( n1 y& E
  14.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
    & o7 w5 r0 r& O+ b
  15.         GPIO_Init(GPIOA, &GPIO_InitStruct);
    8 S7 A4 y; K+ ~, b  z! Q' {
  16.         /* USART2  Rx:PA3 */
    0 ]$ X  j6 R( A2 Y
  17.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
    + P: R1 g6 W/ y8 @
  18.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;1 W3 i- S2 D$ ^+ \9 ?% o6 V1 s' u" k
  19.         GPIO_Init(GPIOA, &GPIO_InitStruct);
    - d& S2 y6 a5 z$ R$ c7 {- p& d4 b, u
  20.         2 B1 s, U. m6 v1 e) d; W
  21.         /* USART2串口配置 */
    9 q& p* r( J, T9 Z- i1 f) x  h+ D
  22.         USART_InitStruct.USART_BaudRate = 9600;( R1 `2 c1 ]7 \  Z& P! }% h0 }
  23.         USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;" r$ J- [! ?2 B7 f3 V
  24.         USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;//配置为发送和接收模式,实现发送接收数据: e; f3 k; _3 s* x8 s
  25.         USART_InitStruct.USART_Parity = USART_Parity_No;
    0 W8 `8 p$ _! C  ^. C& C
  26.         USART_InitStruct.USART_StopBits = USART_StopBits_1;
    # n' |  J3 p' j1 `7 }/ ]
  27.         USART_InitStruct.USART_WordLength = USART_WordLength_8b;; Y% v0 r9 Q: g% M
  28.         USART_Init(USART2, &USART_InitStruct);
    # C, G6 `4 z4 w' C/ O
  29.        
    9 |5 i' H" g( F. U7 c" ^
  30.         /* USART2的中断优先级配置 */
      N  P* l( Y) k' O
  31.         USART2_NVIC_Config();
    6 h7 k( `0 H) w! M/ C* F: [* I& \
  32.         /* 打开USART_IT_RXNE标志中断,即接收数据寄存器不为空中断,收到数据就进入中断 */
    % M+ ^5 X$ f6 H  q) y) y. u
  33.         USART_ITConfig( USART2,  USART_IT_RXNE, ENABLE );
    4 j' G0 d- ?% b' m6 B. d. i
  34.        
    3 c3 c2 [3 d8 J. I4 L
  35.         /* 使能串口 */
    0 h! E: [9 a8 _7 x
  36.         USART_Cmd( USART2, ENABLE );
    7 F6 T3 n" |, r; O0 ^7 K6 Z
  37. }
    9 }& w* _5 m7 |( v8 g- y; C8 q7 E

  38. 4 T) M) O( J1 Q$ P! [5 M! q
复制代码

* Z1 \& b( z5 P5 [2 a" ^  l9 j$ Z: h" p- Y0 A3 t

4 N# K( q: Z$ C2 j; CUSART2的NVIC配置
0 I) Q3 M3 O2 J" F% \/ @/ ^
  1. /* USART2 的中断优先级配置,需要在中断中处理数据的接收 */
    8 M1 k. Y; R' E- I7 Q
  2. void USART2_NVIC_Config( void )
    2 R- R  z8 v/ k# d8 g
  3. {
    4 Z9 R4 E) n- [3 |& ?3 K  b
  4.         NVIC_InitTypeDef  NVIC_InitStruct;2 S- n; f5 @- C0 j/ s
  5.         ! x' w1 J- z( h$ @
  6.         NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2 );, m1 ]  u: b6 u5 L9 P4 [2 N
  7.         2 S' J( R2 o; P* p4 X8 H1 d
  8.         NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;% a3 \! v4 y. o
  9.         NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    # w) e0 e. Q- n& p9 S7 V
  10.         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;. k2 B9 G0 w9 n2 P- A" g* C
  11.         NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
    ! v& O. w8 A- z
  12.        
    1 U) p8 N7 @* A( R
  13.         NVIC_Init( &NVIC_InitStruct );
    1 T9 e0 C; f8 o) D0 Z+ o
  14. }9 ~% D4 M7 ], C4 u8 H4 E$ A9 l) \
复制代码
8 [8 m, P# k% m3 D5 a6 }
. x7 F$ x- ?9 c' D  }: O! ?
1 h' `- I% p8 z& a% ^) {, @
USART1串口重映射
$ m/ h6 K% r0 y& Y+ ^( o
  1. /* USART1 的重映射 */
    $ k1 _: d  s- ?0 @
  2. /* 1.勾选MicroLIB
    ! a% {, I' V3 \9 t- h: N
  3.    2.添加头文件:stdio.h9 [) M* Q4 E' o, B6 n& _# {/ d
  4. */
    / ~7 b3 |( z) s6 m: t
  5. int fputc( int ch, FILE *f )1 S" i: a, L0 w. X9 F" _) v
  6. {
    + l$ R3 \2 t5 l  H
  7.         USART_SendData( USART1, ( uint8_t ) ch );
    " c7 T# e& w7 }# `
  8.        
    ' x7 I+ D, V+ N, `4 ~
  9.         /* 等待发送完成 */" n% D' J+ y, f  ~4 U; S5 t4 H0 d
  10.         while(  USART_GetFlagStatus( USART1, USART_FLAG_TXE) == RESET )
    ' m& j; h4 b& e' h& ~3 I  R
  11.                 ;
    2 C& L; V) X1 ^  D6 |2 }6 x
  12.         return ch;0 Q1 x0 D3 {- R
  13. }, q) q* F7 D( w0 i1 S
复制代码

8 D# b, \* v, S  B& \3 u
2 f0 X" ?1 L0 U5 Z' o" ~. ~7 l5 Y/ Q5 Q1 h  I" N. Q; b
————————————————
4 J, j8 G2 o& A; `版权声明:Aspirant-GQ+ \- T; a4 y3 f: H: u8 g( c. K. y3 a

& Y! N$ |! d$ }# R: u  k( h6 z+ S- q% s" ~1 u
收藏 评论0 发布时间:2023-3-18 14:01

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版