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

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

[复制链接]
攻城狮Melo 发布时间:2023-3-18 14:01
BT-06简介
' U% Y" m/ Q- N. N- \" t( XBT06蓝牙模块是专为智能无线数据传输而打造,遵循V3.0 蓝牙规范。本模块支持UART接口,并支持SPP蓝牙串口协议,具有成本低、体积小、功耗低、收发灵敏性高等优点,只需配备少许的外围元件就能实现其强大功能。
- {- b% B8 _& x1 b. _5 q" Y; [& DBT-06蓝牙模块驱动简单,只需要4根线就可以驱动:4 n0 B4 I, D$ R9 p4 X! j2 n* \0 h
RXD
. M* L% e* z6 `# HTXD
' l/ F+ E, [2 x. n( J8 ~GND. p0 e* ?. A8 u0 y+ o! R
VCC
# ^. N3 H, _5 D/ ^0 X
将电源接在5V供电口上,TXD、RXD就是其数据传输的接口,BT-06是以串口的方式驱动的,只需要将蓝牙的TXD、RXD接口对应接在串口的RXD、TXD上,就可以进行数据传输。
5 F; l" F# {' y4 k
- T" G5 `- ?, X8 N

; i1 `- g8 d7 e: m, \* Y! Y数据透传
1 }9 E( `' }! y& W  x. P当BT-06上电,手机APP与蓝牙配对成功后,BT-06即进入数据透传模式。
0 \4 Z+ H5 d5 J, H/ q/ u数据透传:透传是指与传输网络的介质、调制解调方式、传输方式、传输协议无关的一种数据传送方式。数据透传即透明传送,是指在数据的传输过程中,通过无线的方式这组数据不发生任何形式的改变,仿佛传输过程是透明的一样,同时保证传输的质量,原封不动地到了最终接收者手里。% s0 i0 Y. A8 W: [/ ?. X6 }
也就是说,连接好蓝牙后,从串口发送出的所有消息都可以原封不动的传输到手机APP中,注意!是原封不动,所以要想驱动BT-06,本质上是驱动串口来传输数据,所以接下来的主要任务就是驱动开发板上的串口进行数据传输。2 |" o( |( y; R4 h$ T& P( E

; e7 v1 y6 E* L3 E/ J2 `
  ~$ B5 h. l3 h3 }- q" E
配置串口
0 [' u6 f. B  e9 H0 S! q由于我是第一次搞蓝牙,所以比较谨慎,分了几步:
$ ?" R  e4 M  G* |% F- A2 p4 MUSART1作为向上位机打印调试信息的串口
0 q$ ~% \. d1 x' I# p# u2 S- hUSART2用来连接蓝牙接口,进行传输数据/ N8 o4 f1 |1 v; l' L! T' I

; |/ J& x5 p7 s7 H) \4 i+ I4 }
USART1初始化函数
# _# a4 Y- y- s! P' {# g
  1. void USART1_Init( void )
    & W; ?5 A3 g0 I9 G2 ~9 R
  2. {- Z: h, t6 o$ N5 P
  3.         7 O9 o, Y& t; X7 f" b3 x; H
  4.         USART_InitTypeDef USART_InitStruct;6 d  O: z% Y+ U" u  U7 n
  5.         GPIO_InitTypeDef GPIO_InitStruct;
    1 X9 n7 ^- ~- L3 C: Y5 f+ g
  6.        
    : Z* s+ ~6 A; n# z1 Z
  7.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE );
    ! M2 B& L% r5 q
  8.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1, ENABLE );/* 开启时钟 USART1在APB2总线 USART2在APB1总线 */
    2 k* X6 f$ i' ^+ B$ @  N& l; x
  9.        
    ; K1 L. S# q! V) p( \# ~
  10.        
    3 D1 O! W0 ~8 Y& S0 q, b# s
  11.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;9 j0 T# x# k( P5 v' \3 `* U" E
  12.         /* USART1  Tx:PA9 */- i  M7 |4 B: f' v; b
  13.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用输出$ d9 \3 h* h4 V2 ?, s/ f) u
  14.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;' \* i; n9 A1 t" G) g
  15.         GPIO_Init(GPIOA, &GPIO_InitStruct);6 |) o. j! `8 m: U( v0 a, h( `
  16.         /* USART1  Rx:PA10 */
    - Z$ o* j7 U, h1 t
  17.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
    2 |+ {% w7 @5 E, O5 K1 U
  18.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入. z  h' e9 P% Z& s: ~
  19.         GPIO_Init(GPIOA, &GPIO_InitStruct);
    1 ~$ A& ]4 r' L2 M
  20.        
    6 p* J5 B1 U8 l
  21.         /* USART1配置 */
    " n5 @; ]8 ~* F
  22.         USART_InitStruct.USART_BaudRate = 9600;
      J4 h6 D' q5 m) l
  23.         USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;" z  H4 X. `5 A+ G+ T* c2 s
  24.         USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;) ^, M: j  H, _- H! l! u" ^
  25.         USART_InitStruct.USART_Parity = USART_Parity_No;
    $ ^$ q' D2 a, l: A7 o$ O& P
  26.         USART_InitStruct.USART_StopBits = USART_StopBits_1;  c& J1 t3 T, k
  27.         USART_InitStruct.USART_WordLength = USART_WordLength_8b;
    & d% f8 m* K; w! d% h8 ~0 U2 {0 ^
  28.         USART_Init(USART1, &USART_InitStruct);
    / Q  I. ^2 ?1 i( z& z
  29. 6 B8 v; k( }2 J% G' E
  30.        
    3 U/ h% O! Q7 n8 E6 Y+ ^* y
  31.         /* 使能串口 *// w2 H4 V2 F9 }& C4 X6 Q; m9 s  {
  32.         /* 容易忽略 */7 I) O7 u; D+ N* @
  33.         USART_Cmd( USART1, ENABLE );
    , t, Y1 r1 |% {2 \0 U# r( q
  34.         4 P+ {! f# E) r* J$ _1 r& B, V
  35.        
    * R% T/ k8 b9 {
  36. }
    ! B" J3 B. e+ h" K% |/ `  F
复制代码
7 S# U& \5 s, \2 G
USART2初始化函数
  ^: \3 }8 s  z) @; t
  1. void USART2_Init( void )$ {! ~0 x( c% U, {9 d4 X# `+ M
  2. {
    # m$ W0 G: \: h9 v1 T+ }/ _1 b5 H
  3.         USART_InitTypeDef USART_InitStruct;$ j1 x* h8 _' B' P7 _. g' I
  4.         GPIO_InitTypeDef GPIO_InitStruct;
    ( z) ?- T0 `- O; E
  5.         ( A1 N% ~- ?$ |- ?' Y+ H4 @0 [- x, N
  6.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE );/ Z: ~% H7 i: L6 ?
  7.         RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2, ENABLE );
      v5 ~* g) }3 B5 k4 S7 E3 h
  8.        
    ; n0 c5 R& F3 W& p5 E4 c9 k+ G- X# [
  9.         USART_DeInit(USART2);
    9 T& o0 b3 K0 [: {$ J
  10.        
    3 i! M6 |; }% Y. ?
  11.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;) C, F) B- }1 E4 v
  12.         /* USART2  Tx:PA2 */
    ' L) O. q; h# ]2 C
  13.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    7 q) g+ `4 s1 [% v# k
  14.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
    ' J$ ~; A5 R1 {; `) H: h: i' A0 ]
  15.         GPIO_Init(GPIOA, &GPIO_InitStruct);6 D  Y+ ]9 a3 K8 a! ]6 D& c, e) V
  16.         /* USART2  Rx:PA3 */
    - J! ^* G+ }3 ^3 \
  17.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
    ( M0 M5 ^) ], \3 _7 S- ^/ y
  18.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    % o* j% r7 H+ ?/ ?; D: m
  19.         GPIO_Init(GPIOA, &GPIO_InitStruct);, ]& D) D# ]! G2 |! s# g  v
  20.        
      S2 l. E6 i: Y
  21.         /* USART2串口配置 */
    9 e9 y+ \' }  `" _. |8 c
  22.         USART_InitStruct.USART_BaudRate = 9600;
    % a6 [* B0 H- D! q/ a
  23.         USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    % h- X/ x$ _+ \. G; L3 i( P
  24.         USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;//配置为发送和接收模式,实现发送接收数据
    6 R# j" E  Q' Q5 f- ~( v5 R' h
  25.         USART_InitStruct.USART_Parity = USART_Parity_No;
    % }  \! i$ _, U: _# K
  26.         USART_InitStruct.USART_StopBits = USART_StopBits_1;  i7 E7 N" y" B& s
  27.         USART_InitStruct.USART_WordLength = USART_WordLength_8b;
    - }  S8 m6 _8 Z* T5 A2 v6 O5 \
  28.         USART_Init(USART2, &USART_InitStruct);5 g( i5 l/ h* t0 j
  29.         $ q8 d! L0 p) q& _: h3 b" {0 h
  30.         /* USART2的中断优先级配置 */
    1 k7 _) r+ _0 S2 W4 w: E1 ]- k2 c' t
  31.         USART2_NVIC_Config();
    ( \  I  O1 F0 g# ~: `
  32.         /* 打开USART_IT_RXNE标志中断,即接收数据寄存器不为空中断,收到数据就进入中断 */9 D1 w0 `; v8 a0 J# `
  33.         USART_ITConfig( USART2,  USART_IT_RXNE, ENABLE );
    0 q" |4 W: E, O: X6 r, _/ \
  34.         - T/ b* U0 H2 G, e# O
  35.         /* 使能串口 */6 L! r" G7 g) g' |
  36.         USART_Cmd( USART2, ENABLE );. R, S+ O4 \8 {2 M; Q
  37. }# c3 R0 i0 o% k: t$ l3 T

  38. 4 z+ s2 \+ t' ?9 L% {0 X; Y/ r
复制代码
1 U+ @3 B! m6 F

8 n. X" l) Y& Y3 ]5 L. B( s8 S: o) j0 @
USART2的NVIC配置

. O, _/ L* G* U8 b0 d
  1. /* USART2 的中断优先级配置,需要在中断中处理数据的接收 */
    3 x: h, H! u0 y( z
  2. void USART2_NVIC_Config( void )1 F8 p" l' a" ~! ~+ t  ~/ ~
  3. {
    * w; x3 X- x) J
  4.         NVIC_InitTypeDef  NVIC_InitStruct;
      I  M5 f  O+ I) I
  5.         ! w1 f6 o( a( \  V! ?) S0 F" n$ y
  6.         NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2 );7 j& L  n3 ]. h8 X' e# X* v% ?/ k' z+ P
  7.         * B3 M2 @& F' a6 f# H
  8.         NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;, g1 i( ?- x2 d! V; z# {
  9.         NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;% C8 x+ w' ?4 ]/ m1 l
  10.         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;8 h  p. r7 \3 ]( z
  11.         NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;2 J9 d. V4 h* Y  f
  12.         7 d! Q+ `. \/ p0 ~% i. h0 z) i
  13.         NVIC_Init( &NVIC_InitStruct );
    7 M6 f; B) {5 s' |3 L8 M
  14. }
    * ?' R0 F) O) [: V/ s4 N
复制代码
% _7 q, n' F; f: D& k& B6 ^) E

: e0 X" {$ u4 O. G$ f! _2 ~3 |* G) v2 c2 ]5 x
USART1串口重映射
3 w3 S8 K- n! D6 a; X- W
  1. /* USART1 的重映射 *// s& S3 T8 c6 p0 a; F* K
  2. /* 1.勾选MicroLIB1 ?* _- d9 I+ n
  3.    2.添加头文件:stdio.h$ M$ `/ Y, L- M+ P" F' L/ [7 P3 K  Q
  4. */
    & P9 d5 N6 V$ m1 G2 g
  5. int fputc( int ch, FILE *f )$ K2 @+ x! R3 m; \4 N- Q% f
  6. {% n4 @1 f% X" T) n# h0 v1 I% K* L
  7.         USART_SendData( USART1, ( uint8_t ) ch );
    % k% H% ~4 {" W4 [
  8.        
    2 d8 E' j# u9 G5 _) O0 Y
  9.         /* 等待发送完成 */
    / k) d, v* h8 x* n
  10.         while(  USART_GetFlagStatus( USART1, USART_FLAG_TXE) == RESET )# J2 j( H$ |) J( h7 U* y' m1 x% P
  11.                 ;' y0 h  l; R% A
  12.         return ch;
    5 t# `4 w; `8 a; ^; b* t
  13. }
    - v% X8 t4 h& l, a1 m/ q( W
复制代码

0 k$ ^* t$ X" @9 s0 ]( \
" x7 n  K6 G, \! m# t
* o+ s1 m. C2 G! ?
————————————————
. O* [1 f5 j7 `" b版权声明:Aspirant-GQ
0 {9 f& }6 d- e4 G' o3 i( ?. h# e. z; r
9 r: v0 T: L9 j2 N. M7 @8 B
赞 收藏 评论0 发布时间:2023-3-18 14:01

举报

0个回答

所属标签

相似技术帖

官网相关资源

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