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- void USART1_Init( void )
& W; ?5 A3 g0 I9 G2 ~9 R - {- Z: h, t6 o$ N5 P
- 7 O9 o, Y& t; X7 f" b3 x; H
- USART_InitTypeDef USART_InitStruct;6 d O: z% Y+ U" u U7 n
- GPIO_InitTypeDef GPIO_InitStruct;
1 X9 n7 ^- ~- L3 C: Y5 f+ g -
: Z* s+ ~6 A; n# z1 Z - RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE );
! M2 B& L% r5 q - RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1, ENABLE );/* 开启时钟 USART1在APB2总线 USART2在APB1总线 */
2 k* X6 f$ i' ^+ B$ @ N& l; x -
; K1 L. S# q! V) p( \# ~ -
3 D1 O! W0 ~8 Y& S0 q, b# s - GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;9 j0 T# x# k( P5 v' \3 `* U" E
- /* USART1 Tx:PA9 */- i M7 |4 B: f' v; b
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用输出$ d9 \3 h* h4 V2 ?, s/ f) u
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;' \* i; n9 A1 t" G) g
- GPIO_Init(GPIOA, &GPIO_InitStruct);6 |) o. j! `8 m: U( v0 a, h( `
- /* USART1 Rx:PA10 */
- Z$ o* j7 U, h1 t - GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
2 |+ {% w7 @5 E, O5 K1 U - GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入. z h' e9 P% Z& s: ~
- GPIO_Init(GPIOA, &GPIO_InitStruct);
1 ~$ A& ]4 r' L2 M -
6 p* J5 B1 U8 l - /* USART1配置 */
" n5 @; ]8 ~* F - USART_InitStruct.USART_BaudRate = 9600;
J4 h6 D' q5 m) l - USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;" z H4 X. `5 A+ G+ T* c2 s
- USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;) ^, M: j H, _- H! l! u" ^
- USART_InitStruct.USART_Parity = USART_Parity_No;
$ ^$ q' D2 a, l: A7 o$ O& P - USART_InitStruct.USART_StopBits = USART_StopBits_1; c& J1 t3 T, k
- USART_InitStruct.USART_WordLength = USART_WordLength_8b;
& d% f8 m* K; w! d% h8 ~0 U2 {0 ^ - USART_Init(USART1, &USART_InitStruct);
/ Q I. ^2 ?1 i( z& z - 6 B8 v; k( }2 J% G' E
-
3 U/ h% O! Q7 n8 E6 Y+ ^* y - /* 使能串口 *// w2 H4 V2 F9 }& C4 X6 Q; m9 s {
- /* 容易忽略 */7 I) O7 u; D+ N* @
- USART_Cmd( USART1, ENABLE );
, t, Y1 r1 |% {2 \0 U# r( q - 4 P+ {! f# E) r* J$ _1 r& B, V
-
* R% T/ k8 b9 { - }
! B" J3 B. e+ h" K% |/ ` F
复制代码 7 S# U& \5 s, \2 G
USART2初始化函数
^: \3 }8 s z) @; t- void USART2_Init( void )$ {! ~0 x( c% U, {9 d4 X# `+ M
- {
# m$ W0 G: \: h9 v1 T+ }/ _1 b5 H - USART_InitTypeDef USART_InitStruct;$ j1 x* h8 _' B' P7 _. g' I
- GPIO_InitTypeDef GPIO_InitStruct;
( z) ?- T0 `- O; E - ( A1 N% ~- ?$ |- ?' Y+ H4 @0 [- x, N
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE );/ Z: ~% H7 i: L6 ?
- RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2, ENABLE );
v5 ~* g) }3 B5 k4 S7 E3 h -
; n0 c5 R& F3 W& p5 E4 c9 k+ G- X# [ - USART_DeInit(USART2);
9 T& o0 b3 K0 [: {$ J -
3 i! M6 |; }% Y. ? - GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;) C, F) B- }1 E4 v
- /* USART2 Tx:PA2 */
' L) O. q; h# ]2 C - GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
7 q) g+ `4 s1 [% v# k - GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
' J$ ~; A5 R1 {; `) H: h: i' A0 ] - GPIO_Init(GPIOA, &GPIO_InitStruct);6 D Y+ ]9 a3 K8 a! ]6 D& c, e) V
- /* USART2 Rx:PA3 */
- J! ^* G+ }3 ^3 \ - GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
( M0 M5 ^) ], \3 _7 S- ^/ y - GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
% o* j% r7 H+ ?/ ?; D: m - GPIO_Init(GPIOA, &GPIO_InitStruct);, ]& D) D# ]! G2 |! s# g v
-
S2 l. E6 i: Y - /* USART2串口配置 */
9 e9 y+ \' } `" _. |8 c - USART_InitStruct.USART_BaudRate = 9600;
% a6 [* B0 H- D! q/ a - USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
% h- X/ x$ _+ \. G; L3 i( P - USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;//配置为发送和接收模式,实现发送接收数据
6 R# j" E Q' Q5 f- ~( v5 R' h - USART_InitStruct.USART_Parity = USART_Parity_No;
% } \! i$ _, U: _# K - USART_InitStruct.USART_StopBits = USART_StopBits_1; i7 E7 N" y" B& s
- USART_InitStruct.USART_WordLength = USART_WordLength_8b;
- } S8 m6 _8 Z* T5 A2 v6 O5 \ - USART_Init(USART2, &USART_InitStruct);5 g( i5 l/ h* t0 j
- $ q8 d! L0 p) q& _: h3 b" {0 h
- /* USART2的中断优先级配置 */
1 k7 _) r+ _0 S2 W4 w: E1 ]- k2 c' t - USART2_NVIC_Config();
( \ I O1 F0 g# ~: ` - /* 打开USART_IT_RXNE标志中断,即接收数据寄存器不为空中断,收到数据就进入中断 */9 D1 w0 `; v8 a0 J# `
- USART_ITConfig( USART2, USART_IT_RXNE, ENABLE );
0 q" |4 W: E, O: X6 r, _/ \ - - T/ b* U0 H2 G, e# O
- /* 使能串口 */6 L! r" G7 g) g' |
- USART_Cmd( USART2, ENABLE );. R, S+ O4 \8 {2 M; Q
- }# c3 R0 i0 o% k: t$ l3 T
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- /* USART2 的中断优先级配置,需要在中断中处理数据的接收 */
3 x: h, H! u0 y( z - void USART2_NVIC_Config( void )1 F8 p" l' a" ~! ~+ t ~/ ~
- {
* w; x3 X- x) J - NVIC_InitTypeDef NVIC_InitStruct;
I M5 f O+ I) I - ! w1 f6 o( a( \ V! ?) S0 F" n$ y
- NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2 );7 j& L n3 ]. h8 X' e# X* v% ?/ k' z+ P
- * B3 M2 @& F' a6 f# H
- NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;, g1 i( ?- x2 d! V; z# {
- NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;% C8 x+ w' ?4 ]/ m1 l
- NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;8 h p. r7 \3 ]( z
- NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;2 J9 d. V4 h* Y f
- 7 d! Q+ `. \/ p0 ~% i. h0 z) i
- NVIC_Init( &NVIC_InitStruct );
7 M6 f; B) {5 s' |3 L8 M - }
* ?' 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- /* USART1 的重映射 *// s& S3 T8 c6 p0 a; F* K
- /* 1.勾选MicroLIB1 ?* _- d9 I+ n
- 2.添加头文件:stdio.h$ M$ `/ Y, L- M+ P" F' L/ [7 P3 K Q
- */
& P9 d5 N6 V$ m1 G2 g - int fputc( int ch, FILE *f )$ K2 @+ x! R3 m; \4 N- Q% f
- {% n4 @1 f% X" T) n# h0 v1 I% K* L
- USART_SendData( USART1, ( uint8_t ) ch );
% k% H% ~4 {" W4 [ -
2 d8 E' j# u9 G5 _) O0 Y - /* 等待发送完成 */
/ k) d, v* h8 x* n - while( USART_GetFlagStatus( USART1, USART_FLAG_TXE) == RESET )# J2 j( H$ |) J( h7 U* y' m1 x% P
- ;' y0 h l; R% A
- return ch;
5 t# `4 w; `8 a; ^; b* t - }
- 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
|