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

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

[复制链接]
攻城狮Melo 发布时间:2023-3-18 14:01
BT-06简介' ?$ F2 z' H3 t4 Q( w' U' u
BT06蓝牙模块是专为智能无线数据传输而打造,遵循V3.0 蓝牙规范。本模块支持UART接口,并支持SPP蓝牙串口协议,具有成本低、体积小、功耗低、收发灵敏性高等优点,只需配备少许的外围元件就能实现其强大功能。
  h" L( \# k" ^3 U5 ZBT-06蓝牙模块驱动简单,只需要4根线就可以驱动:9 I+ d. m$ S0 Y2 S8 G6 z8 s' D
RXD
; H3 T4 A1 h4 Y5 y% p! V* [TXD
0 j$ x* O; g( o( DGND
; E, ?. i/ C5 J, V5 q0 F$ hVCC& N! B: g3 m- `& J
将电源接在5V供电口上,TXD、RXD就是其数据传输的接口,BT-06是以串口的方式驱动的,只需要将蓝牙的TXD、RXD接口对应接在串口的RXD、TXD上,就可以进行数据传输。% W1 ]$ l+ C8 y
4 @: `% U- ~/ Y4 D5 }- G1 o! S) }

) X0 I$ F, l9 a8 \9 ^% B数据透传
2 B+ d& j1 ?) A3 P当BT-06上电,手机APP与蓝牙配对成功后,BT-06即进入数据透传模式。
9 @$ z8 r* }( w数据透传:透传是指与传输网络的介质、调制解调方式、传输方式、传输协议无关的一种数据传送方式。数据透传即透明传送,是指在数据的传输过程中,通过无线的方式这组数据不发生任何形式的改变,仿佛传输过程是透明的一样,同时保证传输的质量,原封不动地到了最终接收者手里。
2 G) E4 b4 y, r7 m% E' Q也就是说,连接好蓝牙后,从串口发送出的所有消息都可以原封不动的传输到手机APP中,注意!是原封不动,所以要想驱动BT-06,本质上是驱动串口来传输数据,所以接下来的主要任务就是驱动开发板上的串口进行数据传输。
3 v1 g' e6 N1 C! c' S: a7 _2 |
# Y/ s# i5 E" T. `3 X; W

( L3 V$ X5 I6 W配置串口
& Q+ J: Q1 N6 }7 C+ W! \( M由于我是第一次搞蓝牙,所以比较谨慎,分了几步:
! e( K! p) p4 T2 i- w# v# W* iUSART1作为向上位机打印调试信息的串口
$ k. l  ]6 @4 d' oUSART2用来连接蓝牙接口,进行传输数据! p; x, L+ Q7 s: B0 i1 r& ?  j
. L1 K% j8 K1 }' O1 j
USART1初始化函数
  d: P% c/ v8 d7 D
  1. void USART1_Init( void )! Y5 N/ v1 @6 K' r8 l  J: N7 [
  2. {
    2 ^0 @: Z( X+ X% B& E+ N" J
  3.         : Q0 A+ F/ b3 z  n" V- b& {
  4.         USART_InitTypeDef USART_InitStruct;
    4 ?( b+ l, i' B' N5 a$ W$ `( u" l
  5.         GPIO_InitTypeDef GPIO_InitStruct;
    # m  ]# ^2 h) q- l) f5 U
  6.         6 v5 r2 J/ J7 D3 ?0 a, X
  7.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE );2 d% Y/ f* r2 ]& E3 v
  8.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1, ENABLE );/* 开启时钟 USART1在APB2总线 USART2在APB1总线 */! }- C+ }7 P6 w# [% ]  R0 w
  9.         . ^, ?1 k: z9 B; r) S. X# ^
  10.        
    2 R: r8 |! h# d, Q; m
  11.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;. q* n4 J9 f  p( Z, O5 I) X
  12.         /* USART1  Tx:PA9 */
    . z2 e9 _3 X+ a9 p" f
  13.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用输出
    . K9 H4 [2 j9 b3 ]% t1 d$ p: i
  14.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
    1 V5 p' ^+ Z/ L
  15.         GPIO_Init(GPIOA, &GPIO_InitStruct);
    . X( }. k1 E7 u  E$ O6 E3 N( q
  16.         /* USART1  Rx:PA10 */% p1 I- [( t+ p2 [3 b; Z
  17.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;, x% \) Z: O* S& _. l
  18.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入! a" m5 j) d$ d+ j
  19.         GPIO_Init(GPIOA, &GPIO_InitStruct);% z% S$ H6 y  _6 `" f5 m0 O
  20.        
    ) |+ t6 m$ x7 B2 d3 q
  21.         /* USART1配置 */: ^7 ?3 {7 {5 y* F9 Y
  22.         USART_InitStruct.USART_BaudRate = 9600;! }; p4 j, D/ \% H9 e: o
  23.         USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
      n3 v: U9 m6 ~; o4 c
  24.         USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;' b3 A9 H" j8 U0 r# i+ f/ Y
  25.         USART_InitStruct.USART_Parity = USART_Parity_No;
    ) r( W2 U  S8 t* P6 W" P
  26.         USART_InitStruct.USART_StopBits = USART_StopBits_1;
    6 S5 k8 b6 Z" U8 z
  27.         USART_InitStruct.USART_WordLength = USART_WordLength_8b;, {1 `! o, ?0 [$ @% g
  28.         USART_Init(USART1, &USART_InitStruct);
    9 k' u' L) A  @: h2 n* q

  29. / T# a' R& {/ ]6 K& Z
  30.        
    * M' k7 p+ `9 f! c! b
  31.         /* 使能串口 */
    & T3 p( R* {/ h1 g, V& R
  32.         /* 容易忽略 */; O9 C/ ?4 v* D4 T! Y' m
  33.         USART_Cmd( USART1, ENABLE );
    5 o" X$ z/ r+ l7 N4 H
  34.         % ~( k: n  p3 i( b7 U
  35.         * F; d( A( ]7 y% b8 d, U7 `" E
  36. }
    ' C( S6 G' r3 Y# ?0 p. s# v1 ]
复制代码
, Z% U7 k8 {5 ]: v
USART2初始化函数
$ m: n7 k. t: Q
  1. void USART2_Init( void )4 n( S% l7 x. I3 V8 y
  2. {3 X" n" e% {$ W; Y7 s& c  x3 s
  3.         USART_InitTypeDef USART_InitStruct;/ H4 K+ F; O" k7 n: ?
  4.         GPIO_InitTypeDef GPIO_InitStruct;
    8 K" [/ \- g7 g
  5.        
    : @8 X/ w$ B0 q2 [9 @- ^8 f% x2 H0 ^
  6.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE );  L7 l. q* `9 b$ p4 K
  7.         RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2, ENABLE );  `" v" e" t; `! {
  8.         # H( W' Y0 u8 N# W- n8 J
  9.         USART_DeInit(USART2);
      v+ j( ]# X$ T$ y
  10.        
    & W  r: h$ `- l  W2 e' X" B/ s
  11.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    2 w4 T4 j  T- }8 H5 e
  12.         /* USART2  Tx:PA2 */2 x; G, p, F) x
  13.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;- X4 }: ^7 @( w
  14.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;/ G; y! m( v, m0 m9 M
  15.         GPIO_Init(GPIOA, &GPIO_InitStruct);
    ) q. I6 Y/ D* g' `
  16.         /* USART2  Rx:PA3 */7 C" v+ J) a* {- j+ b  U
  17.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
    3 l1 d- C" U3 Z2 y- C
  18.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    4 q3 D3 ?! Y& n6 m4 Y, h4 T2 D8 u
  19.         GPIO_Init(GPIOA, &GPIO_InitStruct);
    ' l4 R3 B- L6 Z+ u. N. g
  20.        
    % j7 y2 l; W+ T2 Z. G. L
  21.         /* USART2串口配置 */
    , Z+ q+ J9 I' O% \
  22.         USART_InitStruct.USART_BaudRate = 9600;# P6 `" O$ a( ^7 }$ B; f% z; J- D
  23.         USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;1 m2 y5 e' ~5 W* D
  24.         USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;//配置为发送和接收模式,实现发送接收数据$ {" d6 b2 o7 ^2 k3 E. u
  25.         USART_InitStruct.USART_Parity = USART_Parity_No;5 m) N) t7 u  z' C) p# r) A1 G% O
  26.         USART_InitStruct.USART_StopBits = USART_StopBits_1;) f1 O* f4 L, |% I
  27.         USART_InitStruct.USART_WordLength = USART_WordLength_8b;6 U, H1 Q9 L! ^+ X
  28.         USART_Init(USART2, &USART_InitStruct);
    - L! `& H9 o- Z. F
  29.        
    % l% T  ?) \; a$ s% t9 a
  30.         /* USART2的中断优先级配置 */. B  @4 G' n) U4 E3 K3 a. G2 L
  31.         USART2_NVIC_Config();  h3 N( E: n/ p; k! V" H; l; }: u
  32.         /* 打开USART_IT_RXNE标志中断,即接收数据寄存器不为空中断,收到数据就进入中断 */
    1 P! [. X, A- x1 H% S7 B& e
  33.         USART_ITConfig( USART2,  USART_IT_RXNE, ENABLE );
    ) [& w' Q- y$ ~' j* ^
  34.        
    4 Z  ^& s4 p: _+ S* ?! h5 y0 n  q. T
  35.         /* 使能串口 */
    , K: L; k/ ?7 h% X4 `/ |' J- b# v4 q  ~
  36.         USART_Cmd( USART2, ENABLE );
    : P1 e, w8 ~8 B" ~" ]$ G4 \. g! L7 W
  37. }
    - h" Y/ I3 F5 T
  38. / Q' a# F6 }8 `" r8 `- F/ ^
复制代码

1 L( g' ?8 ?& a6 M2 u  L1 e, J+ U( y" Z" v0 l5 n

( W- F+ O8 ~$ P, b* f0 X7 l, L& HUSART2的NVIC配置
- C* [7 V) p- O
  1. /* USART2 的中断优先级配置,需要在中断中处理数据的接收 */
    " f- u) [7 `! i* x6 n
  2. void USART2_NVIC_Config( void )
    ' H- a9 z" t. S+ e+ T- b
  3. {
    , j4 k3 b6 R! _  j! M- [2 l
  4.         NVIC_InitTypeDef  NVIC_InitStruct;
    7 _: S# \2 n0 i; D) F, f
  5.        
    3 S% h. A/ F& w/ V, {' c
  6.         NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2 );
    7 S" A) `: P; j8 Z3 e- v, ^; Q  n  p
  7.         - }' u) o( ~) H" f" i3 g4 V) F1 ~% l
  8.         NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;8 n: X; g: w( F  D8 \! p9 j
  9.         NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    ' a) V2 k. L, t( |8 K! D( r
  10.         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
    1 c. r8 f8 i/ w+ }  p0 V! T
  11.         NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
    & p1 [9 S, G" o4 Y6 ]1 S% j: s
  12.        
    & v1 ^6 _  I; u( h' f; z
  13.         NVIC_Init( &NVIC_InitStruct );
    8 Z; z8 H9 K) ?+ H& Y7 Z) u
  14. }
    " F. E: w& @7 X$ H' ^" H
复制代码

* |' W$ n; ]0 m1 O4 ~4 t) e( n; r! `3 j& R: I- _
! z( T7 L& O7 N- N  E6 a' o! w
USART1串口重映射
) x/ e, G/ v$ [# q8 r0 c7 y8 t
  1. /* USART1 的重映射 */+ J- k5 ^  F# Z9 r8 l) C
  2. /* 1.勾选MicroLIB* s6 ^4 x4 K: I
  3.    2.添加头文件:stdio.h
    1 ?/ H# `% T  K' U- I
  4. */
    4 b9 h) t' B+ `1 O
  5. int fputc( int ch, FILE *f )/ h% D+ P3 {  F+ s7 X, j$ D
  6. {
    3 U: u2 ?6 o  B( K( ^9 c, s; q
  7.         USART_SendData( USART1, ( uint8_t ) ch );  `- Z: O, u7 E; k# m) g7 W
  8.        
      x: G/ Q) E( ]+ ~3 R
  9.         /* 等待发送完成 */9 }3 e! ?. k: }" }! r2 F1 j# Q
  10.         while(  USART_GetFlagStatus( USART1, USART_FLAG_TXE) == RESET )3 o7 _! G. h; b7 r" L+ O
  11.                 ;8 ]. p1 u7 J3 w% u& A1 l
  12.         return ch;
    ! q- \6 i6 E: Y2 _
  13. }
      n. @5 N6 `6 u9 n/ C
复制代码

. _  Q" b' T: u' k" q  Z* a
% A, l' \  B8 x" ~- B
& g/ [/ w4 g- @+ ^
————————————————/ y8 z  M+ |& L; ?: i7 b$ N
版权声明:Aspirant-GQ
5 q. R! q. w( H' V! g& v
2 _, s" z3 t" X/ W
6 N+ l5 M' K/ Z# |* x! A* }
收藏 评论0 发布时间:2023-3-18 14:01

举报

0个回答

所属标签

相似分享

官网相关资源

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