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

stm32f103c8t6控制蓝牙模块实现led灯亮灭

[复制链接]
STMCU小助手 发布时间:2022-10-16 18:39
stm32f103c8t6控制蓝牙模块实现led灯亮灭. K3 R) B' Z9 ^
之前利用蓝牙模块是用arduino控制板的,现在已经渐渐接触stm32,所以,这次想着用stm32来控制蓝牙模块。
8 `: U+ p: Z! ^5 {' ?: S( ^首先的话,需要配置蓝牙模块的一些参数,用到的模块有:- r6 s2 h& J1 I4 m  ^
USB转TTL模块、HC-05蓝牙模块8 \0 ^( S8 j+ ~
两模块共地,两模块共VCC(VCC取5V);蓝牙模块的RX接转换模块的TX,蓝牙模块的TX接转换模块的RX。然后直接把USB转TTL模块插入电脑的USB接口,利用串口调试助手来设置模块的参数,关于这个串口调试助手,相信接触过单片机的人都会有的,这里就不发出来了。
( h8 T0 j7 G/ L1 ~. h) s: d2 E0 D0 O1 Y6 ~2 {
蓝牙模块的调试( F, O- P0 d& J" ?( \

: m/ i+ K4 i/ _- f**HC-05蓝牙串口通讯模块具有两种工作模式:命令响应工作模式和自动连接工作模式。**在自动连接工作模式下模块又可分为主(Master)、从(Slave)和回环(Loopback)三种工作角色。
" O9 P7 J7 E2 f9 n2 |/ D: v! H( G4 j( ^( {1 s
当模块处于自动连接工作模式时,将自动根据事先设定的方式连接的数据传输;+ Y5 c) p& ~/ t3 h5 A% m2 Z% w6 \
当模块处于命令响应工作模式时能执行AT命令,用户可向模块发送各种AT 指令,为模块设定控制参数或发布控制命令。, c5 t( g: R; V" o  M
怎么进入命令响应工作模式?
  V& Z3 a4 |6 T/ B
$ ^( Z7 D: w, W8 q( `进入命令响应工作模式有两种方法:
! T- {) w1 K/ `% S( @3 p& U
# b6 }9 c' l  h8 K8 Q- E6 m模块上电,未配对情况下就是AT模式,波特率为模块本身的波特率,默认:9600,发送一次AT指令时需要置高一次PIO11;) }6 a1 e  V) q* _3 j( `
PIO11 置高电平后,再给模块上电,此时模块进入AT 模式,波特率固定为:38400,可以直接发送AT指令。0 X# h3 D8 P5 L  p( k
什么叫做置高一次PIO11?
2 J5 C) f7 P* A& i, `0 _  F9 I
, q+ }0 x" ]( Q" @2 j6 C**在蓝牙模块中有一个小按键,按一下就置高一次PIO11。**也就是说,第一种方法需要每发送一次AT指令按一次;而第二种方式是长按的过程中上电,之后就无需再管了,直接发送AT命令即可。& |( \& @( |0 `

1 I2 T) m% x2 t- U, v9 I需要注意一下,两种进入命令响应工作模式的方式使用的波特率是不一样的,建议使用第二种方式。, j$ ?, {; t  h6 k* Z* K4 S% H1 Y
& h& M$ N% V; e2 Z' s* P' a) p7 \' {7 E
怎么区分进了命令响应工作模式呢?
3 p+ Z' Q- O3 p/ X" `0 ?: j
/ k: b3 a! f0 i2 z1 R& w$ @在蓝牙模块上有灯,当灯快闪的时候,就是自动连接工作模式;当灯慢闪的时候,就是命令响应工作模式。5 v( H5 o! ^9 ?! j% l5 T
本人在测试过程中,是先按住小按键后,然后把USB转TTL模块插入到电脑的USB中去,这样蓝牙模块上面的灯就慢闪,进入了AT模式。
. c; G4 U3 C; h# l& a接着就是要设置蓝牙的参数了:
- k" {) ^2 f& Y: Z8 x' }1)需要设置蓝牙模块的名字,在和手机app连接的时候方便查找,在串口调试助手中发送指令AT+NAME=HC-05,发送指令后,会返回OK,之后你手机app在搜索蓝牙模块的时候就会出现一个名字为HC-05的蓝牙,这个HC-05你也可以改成别的名字。发送指令AT+NAME?:获得设备名称,这个AT指令有很大可能性是没有返回的,因为我也看到了很多的例子……,但是其他的指令都是没有问题的,直接设置设备名称就行了;你还需要发送指令AT+ADDR?,这个指令会返回一个蓝牙地址,因为有时候手机第一次连接蓝牙模块的时候,是没有蓝牙名字的,只有蓝牙地址,所以这个地址可以让你找到你这个蓝牙模块。4 d: W5 T- m2 V0 @3 p8 N
2)需要设置连接蓝牙的密码,在串口调试助手中发送指令AT+PSWD=2019,发送指令后,会返回OK,这样手机在连接蓝牙时,就需要输入密码2019才能连接成功,当然这样密码你也可以改成别的。发送指令AT+PSWD?,会返回这个模块当前的密码。
0 d0 `6 T& k. A6 ~5 w# w2 A2 x& a3)需要设置蓝牙模块是主模式还是从模式,手机上面的蓝牙一般都是主模式,所以蓝牙模块需要设置成从模式,在串口调试助手中发送指令AT+ROLE=0,0表示从模式,1表示主模式。发送指令后,会返回OK。发送指令AT+ROLE?,会返回这个模块当前的模式是主还是从。
, d* \( f/ y5 i0 H$ g4)需要设置串口的波特率,在串口调试助手中发送指令AT+UART=9600,0,0,发送指令后,会返回OK。发送指令AT+UART?,会返回这个模块串口参数,串口的参数一共有三个,波特率、停止位、检验位。其取值如下:
* r% h7 @0 A4 Z0 m, f5 T' K+ Z8 q; r) o4 `' j% H
4596S[9Y`L]XADZ`@{L(@YQ.png
7 M+ }4 o4 M( Y$ Y5 e# L. I0 f) ^6 P% \1 N5 P9 i7 B9 ~
其默认值为:9600,0,0。: L9 G$ B: C! x6 K6 X. ]" g
/ _+ U" A- b! p6 k# H
手机与蓝牙模块之间的传输
1 F( T: L9 ^6 [7 V! ?! y
, Y8 x, M; O: b1 S. R9 H' G直接将蓝牙模块与转换模块连接,再将其连接到电脑上,蓝牙模块直接进入自动连接工作模式。5 D, [; j: h- D& }6 @+ _1 X- y
打开手机蓝牙串口app,连接上面1)中的蓝牙地址,下面给出stm32f103c8t6控制蓝牙模块点亮stm32控制板上面PA.1灯的程序,其主要功能是在手机app上面发送字符1给蓝牙模块,蓝牙模块接收到字符1后就点亮led灯(即PA.1),在接收到字符2后就关闭led灯。8 u- K+ g$ K* j7 w( U+ e
主程序:
3 j3 E4 z2 Z0 k# U. \; ~8 M0 k: W9 M9 _8 N9 S$ x/ x7 G9 s, u
  1. <font face="Tahoma"><font size="3">#include "led.h"; {# ^6 x  k/ ~. ?6 q8 ^2 H) T
  2. #include "delay.h"
    , l2 U  b5 ~: m- }9 M
  3. #include "key.h"0 I* U$ O' _* b7 H4 E, G% Q9 Q- L
  4. #include "sys.h"! R# J) z& J. a; i/ Y7 b5 W; ]
  5. #include "usart.h"2 h# V$ i$ Y5 \, [( }/ y1 z0 H7 ]
  6. , K0 f  l' Z0 G1 s8 k6 |4 I/ ~
  7. extern u8 res;                                                                                //设置外部全局变量
    " t9 ^+ F$ E; f3 W0 O3 s
  8. int main(void)
    ) t: l5 }# y- J* P, L
  9. {                 
    2 W5 c- S6 @" _9 m9 L( K/ z( W
  10.         int i;
    1 h$ u  {: F$ b' V  G2 p" k
  11.         char a[]="abcdefg";( `2 L+ ^' g3 ]8 c  F7 a, O
  12.         char b[7]={'1','2','3','4','5','6','7'};' a6 C+ k% ^+ ^
  13.         delay_init();
    ; L* [% `- i0 I! W% e# v
  14.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级& t, j% J* X) W9 A  Z) i
  15.         uart_init(115200);                                                                 //串口初始化为115200% H) c/ ~, }& J6 k( E
  16.         My_USART2_Init();; W  T- D; X5 X
  17.          LED_Init();                                                                             //LED端口初始化
    5 C+ t! i$ p; }3 I' g7 C. v
  18.          while(1)
    - @: p2 e( m8 a3 {2 n
  19.         {5 b9 e; ~0 l% x; b  |
  20.                 if(res=='1')
    7 N' y8 D2 M% o) v/ y/ u1 w
  21.                 {9 I( Z% ~3 A; {" }
  22.                         GPIO_ResetBits(GPIOA,GPIO_Pin_1);                //PA.1指示灯亮
    8 x9 |( u! |. u; b9 t! [2 C$ d
  23.                         delay_ms(500);                                                        //假如要用延时函数,最好就在上面初始化延时函数,不然程序很容易就跑飞" a) P' ?) X- u# i
  24.                         for(i=0;i<7;i++)
    " Q8 B- [* D" S  j: {) p; }
  25.                         {
    1 ^) ^( k- U$ ?5 h) S: ?8 s
  26.                                 USART_SendData(USART2, a</font></font><font face="Tahoma"><font size="3">);                        //向串口2发送数据给蓝牙模块  v. m5 ^2 z0 G" T( Y
  27.                 while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);//等待发送结束
    2 x% r+ s3 H# n0 d& P6 C
  28.                         }
    ; F8 r/ T* h# r( v6 v( @) Z
  29.                         res=0;
    3 a+ c" q4 q: n, Z
  30.                 }% H! V5 e9 u! F& p3 \
  31.                 if(res=='2')
    9 c* M, S6 z  }; g
  32.                 {
    ! s' |8 G2 Q' I8 D7 F; p1 _
  33.                         GPIO_SetBits(GPIOA,GPIO_Pin_1);                        //PA.1指示灯灭
      p6 Q0 E8 x; f8 J0 J( _. d
  34.                         res=0;
    : W2 n% f3 x& r! _* g4 S% e9 B
  35.                 }$ s9 ~# L% _+ o6 [" d
  36.         }         % w0 r) W4 {2 Q) o8 z% w2 @% [% {) I
  37. }</font></font>
复制代码

! D- F! X+ i% V7 Z2 z手机蓝牙跟蓝牙模块通信时,手机发送的指令经过蓝牙模块发送串口2,让串口2接收,如果利用发送函数让串口2发送数据出来的话,可以在手机app上面接收到数据;利用延时函数时,最好在最开始初始化延时函数delay_init(),不要问为什么,我也不清楚,试过才知道。
$ e- p- Y$ ]. l$ g子程序:
: o9 k( {% F; B. e0 c4 j" z
7 t" Z* d% Z4 j0 m, R
  1. u8 res;                                    //设置全局变量. o, ?& J8 q' ~* p) v
  2. void My_USART2_Init(void)    n4 u0 n  K, a+ e
  3. {  
    ( j" L* i! M5 D1 l: c6 `; J
  4.     GPIO_InitTypeDef GPIO_InitStrue;    A* h0 j* C9 I; ^" J( m) F
  5.     USART_InitTypeDef USART_InitStrue;  
    0 I, Q  c' ]2 z8 n
  6.     NVIC_InitTypeDef NVIC_InitStrue;  * D/ N$ r. g0 M4 ]
  7. + s. p  S$ t# {; b
  8.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIO端口使能  / x' a6 L6 `% J( D4 Q6 D+ ~5 L! W
  9.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//串口端口使能  
    1 y  x3 v* y. K# ~
  10. 8 ^( F- V$ |" F# D. y, w
  11.     GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;  & l: y' P( v. |( i
  12.     GPIO_InitStrue.GPIO_Pin=GPIO_Pin_2;  # N+ K* D8 c0 s8 u- Q, z( S
  13.     GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;  4 y" ]% K& Z7 z2 Z$ ?4 ~
  14.     GPIO_Init(GPIOA,&GPIO_InitStrue);  2 b* P  b; h: S

  15. ! {; P4 C' i8 Z  k0 I, v
  16.     GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;  9 ~6 B, d4 I. @$ m# D% H( {
  17.     GPIO_InitStrue.GPIO_Pin=GPIO_Pin_3;  
    9 l* |& O1 m- g) O, X  C' `
  18.     GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;  
    . W/ C& z. M% G% S' M3 {1 j
  19.     GPIO_Init(GPIOA,&GPIO_InitStrue);  * U, j5 V9 A* t% Y# H2 g) y
  20. ; |/ i0 v  q, a: H
  21.     USART_InitStrue.USART_BaudRate=9600;  
    8 s! _" |( p% \. t; S8 Y
  22.     USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;  9 U/ e; y" A( Z. ?; E# S6 T! s
  23.     USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;  9 |, t2 _) R' x+ }4 z# o2 Y( {* V! _
  24.     USART_InitStrue.USART_Parity=USART_Parity_No;  
    3 Y! P* M% G4 D) X; }: |
  25.     USART_InitStrue.USART_StopBits=USART_StopBits_1;  
    ! R. K! ~+ ^9 [( p( r
  26.     USART_InitStrue.USART_WordLength=USART_WordLength_8b;  . Y8 @4 ?  M, r1 l

  27. 6 j; y4 q1 X+ N$ \. w
  28.     USART_Init(USART2,&USART_InitStrue);
    ; G; b$ u+ \& O" x% F
  29. # |2 X# V0 M) }' O, B$ W
  30.     USART_Cmd(USART2,ENABLE);                                        //使能串口2  + o% X* a+ G: Y. |: q& J& t
  31. # }) V+ F2 k6 T+ H4 O6 E
  32.     USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//开启接收中断  
    7 m4 B- b: Z) f, O. D- O
  33. 3 o$ E* `6 }, T$ s3 i& M
  34.     NVIC_InitStrue.NVIC_IRQChannel=USART2_IRQn;  6 \; ?  V6 d( X, @* b
  35.     NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;  
    / S3 y% X9 `0 u8 o8 b
  36.     NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=0;  
    ) b" L% h. L$ N6 |! ?, b
  37.     NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;  $ S% y1 g8 w. Z! }5 A1 m* `6 p6 }! }
  38.     NVIC_Init(&NVIC_InitStrue);  
    & }1 j2 Y+ h4 i2 {

  39. 0 R; i8 A( v, M5 M4 I- p
  40. }  0 V, {+ Q" t2 l1 B6 d& q

  41. " p6 g" i3 u0 i
  42. void USART2_IRQHandler(void)  & S1 u0 P* V$ |: ?
  43. {  4 c7 M" E& \% y; z( \0 Z. B% \* P7 x
  44. + G* l8 d2 l2 s. z# S! M/ [4 {
  45.      if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)  : h# B3 z, X* t! z# Z0 u) P
  46. {  7 n4 p& X$ l* T/ ?+ c# s
  47.      res= USART_ReceiveData(USART2);          0 V8 U+ q5 s4 J' `; `
  48. //     USART_SendData(USART2,res);     //串口2发送数据给蓝牙模块接收,也就是手机app接收到的数据! V2 L% Q6 }1 A  |( H
  49.   }  + d1 \* K& v0 G. _8 H3 f0 v7 d% y3 a
  50. }  
    3 E7 h1 J% p0 Z1 t0 e1 ^7 g5 Z
复制代码
, V6 ], h3 Z2 {0 c: D0 N
  1. void LED_Init(void)" f1 n/ u4 ^" a
  2. {  v& M1 D- M9 T+ q
  3. + @' ~7 q# Y  Y
  4. GPIO_InitTypeDef  GPIO_InitStructure;. W7 K0 R6 @& ~5 l9 v3 L- B
  5.          # K. w+ C6 B- ?- x
  6. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);         //使能PA端口时钟
    8 {' k# n5 R9 K
  7.         
    1 B9 W9 v+ ?9 j  w" S
  8. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                                 //LED-->PA.1 端口配置
    $ o* K4 m' ]2 t( A& s
  9. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出  b$ n5 `4 j' Q( z: A
  10. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz  t) z( G  `, P
  11. GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOA.18 a' J9 T' M3 ]( u( R) q1 R
  12. }
复制代码

% v4 ]8 _! P# Q9 w  F————————————————
1 \9 B, ^+ v& U& E版权声明:i土豆
& [' L/ D0 I/ G  K/ T# |' ^
. i! I# Y- J5 W1 Y; ^6 N5 Y
赞 收藏 评论0 发布时间:2022-10-16 18:39

举报

0个回答

所属标签

相似技术帖

官网相关资源

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