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

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

[复制链接]
STMCU小助手 发布时间:2022-10-16 18:39
stm32f103c8t6控制蓝牙模块实现led灯亮灭7 M9 u/ U! G6 F  b
之前利用蓝牙模块是用arduino控制板的,现在已经渐渐接触stm32,所以,这次想着用stm32来控制蓝牙模块。3 P7 t+ _  w1 P
首先的话,需要配置蓝牙模块的一些参数,用到的模块有:# \- n9 w4 a0 g4 Z! F
USB转TTL模块、HC-05蓝牙模块, m  a& o5 u4 n9 V5 e/ Y$ U
两模块共地,两模块共VCC(VCC取5V);蓝牙模块的RX接转换模块的TX,蓝牙模块的TX接转换模块的RX。然后直接把USB转TTL模块插入电脑的USB接口,利用串口调试助手来设置模块的参数,关于这个串口调试助手,相信接触过单片机的人都会有的,这里就不发出来了。- z; m, \: v& P( O

$ l  L" Z7 i% `0 L- |3 H蓝牙模块的调试& \' W. A! j2 q4 X% u9 I1 P/ B
. R5 r, W) U  c3 C! Z) b5 U
**HC-05蓝牙串口通讯模块具有两种工作模式:命令响应工作模式和自动连接工作模式。**在自动连接工作模式下模块又可分为主(Master)、从(Slave)和回环(Loopback)三种工作角色。( M& U" n) e! E+ L6 {0 d2 e$ {! Q
" \+ \8 f! q3 Y) r
当模块处于自动连接工作模式时,将自动根据事先设定的方式连接的数据传输;/ f3 y4 n# g: ]$ l: c. M, K, s
当模块处于命令响应工作模式时能执行AT命令,用户可向模块发送各种AT 指令,为模块设定控制参数或发布控制命令。" c$ L2 G" N" P' i! g$ f. {
怎么进入命令响应工作模式?8 l0 E. {( O3 m& l5 o
' W: i  U$ _8 q+ x/ A
进入命令响应工作模式有两种方法:
1 T/ ~7 y6 ?! X5 Q, p* K7 Q+ b1 C
- W; c! X3 z1 E# f  J' a' h. i/ z模块上电,未配对情况下就是AT模式,波特率为模块本身的波特率,默认:9600,发送一次AT指令时需要置高一次PIO11;
3 c% _' O: ^0 G# ?" O3 iPIO11 置高电平后,再给模块上电,此时模块进入AT 模式,波特率固定为:38400,可以直接发送AT指令。+ g+ r* e4 |9 h* i2 K& E1 Y# M
什么叫做置高一次PIO11?
, N# }1 D% M8 [# ?( w& Y0 ~' p  y4 q
**在蓝牙模块中有一个小按键,按一下就置高一次PIO11。**也就是说,第一种方法需要每发送一次AT指令按一次;而第二种方式是长按的过程中上电,之后就无需再管了,直接发送AT命令即可。# O" v) y8 N) i( n4 I

( w% f: d* O$ s" L7 H9 u9 t' z( J* v需要注意一下,两种进入命令响应工作模式的方式使用的波特率是不一样的,建议使用第二种方式。
3 G6 y4 W5 }/ T3 @" |
. l5 Z$ F" R2 e! s+ _/ t4 J; w怎么区分进了命令响应工作模式呢?  M8 D* t8 e9 j( `! h
' Z) _8 q6 `7 c/ |; W  i% d
在蓝牙模块上有灯,当灯快闪的时候,就是自动连接工作模式;当灯慢闪的时候,就是命令响应工作模式。5 F4 @4 Q3 R* S/ i. s$ V
本人在测试过程中,是先按住小按键后,然后把USB转TTL模块插入到电脑的USB中去,这样蓝牙模块上面的灯就慢闪,进入了AT模式。
# f) H: l& K: _9 b5 S; R接着就是要设置蓝牙的参数了:) N. s  B4 u2 ?  c# M+ [
1)需要设置蓝牙模块的名字,在和手机app连接的时候方便查找,在串口调试助手中发送指令AT+NAME=HC-05,发送指令后,会返回OK,之后你手机app在搜索蓝牙模块的时候就会出现一个名字为HC-05的蓝牙,这个HC-05你也可以改成别的名字。发送指令AT+NAME?:获得设备名称,这个AT指令有很大可能性是没有返回的,因为我也看到了很多的例子……,但是其他的指令都是没有问题的,直接设置设备名称就行了;你还需要发送指令AT+ADDR?,这个指令会返回一个蓝牙地址,因为有时候手机第一次连接蓝牙模块的时候,是没有蓝牙名字的,只有蓝牙地址,所以这个地址可以让你找到你这个蓝牙模块。
2 X6 d' K" {0 F- X9 |5 V0 F2)需要设置连接蓝牙的密码,在串口调试助手中发送指令AT+PSWD=2019,发送指令后,会返回OK,这样手机在连接蓝牙时,就需要输入密码2019才能连接成功,当然这样密码你也可以改成别的。发送指令AT+PSWD?,会返回这个模块当前的密码。
. z9 c; ?2 O, k2 E" m3)需要设置蓝牙模块是主模式还是从模式,手机上面的蓝牙一般都是主模式,所以蓝牙模块需要设置成从模式,在串口调试助手中发送指令AT+ROLE=0,0表示从模式,1表示主模式。发送指令后,会返回OK。发送指令AT+ROLE?,会返回这个模块当前的模式是主还是从。1 i' R" a, L8 a- L7 Y4 A  H
4)需要设置串口的波特率,在串口调试助手中发送指令AT+UART=9600,0,0,发送指令后,会返回OK。发送指令AT+UART?,会返回这个模块串口参数,串口的参数一共有三个,波特率、停止位、检验位。其取值如下:! v. |* X% q; m. m' o

' E5 i5 v' m5 L- e/ z* R0 j
4596S[9Y`L]XADZ`@{L(@YQ.png + a5 [9 D( v  s4 q2 Z7 S

  V4 t& w2 U, _' q3 F$ D  `其默认值为:9600,0,0。% ~0 _: o/ I4 ]0 I
$ c/ W4 C! {" W% U. @& f% T. N8 n
手机与蓝牙模块之间的传输' D3 S; [4 ]( i: j' t6 B+ ~) t
8 y) c9 G- n. }" X' P% B
直接将蓝牙模块与转换模块连接,再将其连接到电脑上,蓝牙模块直接进入自动连接工作模式。# U7 ^0 c$ p, |! e1 u; v
打开手机蓝牙串口app,连接上面1)中的蓝牙地址,下面给出stm32f103c8t6控制蓝牙模块点亮stm32控制板上面PA.1灯的程序,其主要功能是在手机app上面发送字符1给蓝牙模块,蓝牙模块接收到字符1后就点亮led灯(即PA.1),在接收到字符2后就关闭led灯。
9 c" h8 F- p' ?, I主程序:
5 p! R/ k; A8 Q+ K# j6 {, l7 o8 [0 ]" x
  1. <font face="Tahoma"><font size="3">#include "led.h"
    ! ~# ]4 {0 b7 W7 ^
  2. #include "delay.h"
    5 i0 \& U* i2 n. F
  3. #include "key.h"
    , L9 {/ v6 M3 ~9 q# y
  4. #include "sys.h"
    2 e; i. L- j* n; B- Q8 E( b3 t
  5. #include "usart.h"
    5 O* g+ N& l4 n9 ~, d: Y5 K

  6. " x( ~3 ?" _, Y3 C) W/ k3 H( B
  7. extern u8 res;                                                                                //设置外部全局变量8 }$ k, V* q, U) f$ R5 p
  8. int main(void)7 `: N( n0 @  X8 b- t4 C8 A
  9. {                 
    , _2 Z3 n2 w  }  u
  10.         int i;/ W5 N3 I' Z% y) D* W- {" F
  11.         char a[]="abcdefg";0 E. R2 ~1 Z7 q# s) I8 y
  12.         char b[7]={'1','2','3','4','5','6','7'};/ V% F9 `4 Y9 a7 H3 K1 j
  13.         delay_init();
    % ^/ o% L# m+ h3 }" C& @
  14.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    % E6 r& }2 ]; _2 {
  15.         uart_init(115200);                                                                 //串口初始化为1152007 f' U! L* w% t6 [( ^- d, v) S
  16.         My_USART2_Init();
    ) J! S" _, @2 c" z; l
  17.          LED_Init();                                                                             //LED端口初始化
    0 |$ i! i; E4 v9 p% w$ J$ K8 _
  18.          while(1)+ U* ^7 X6 l3 `
  19.         {4 N1 c4 a2 D  G" j4 f5 s
  20.                 if(res=='1')$ e% Z7 ]/ m6 q- ^6 h$ D
  21.                 {  P* Y9 v6 x0 I0 [& `1 f
  22.                         GPIO_ResetBits(GPIOA,GPIO_Pin_1);                //PA.1指示灯亮
    " @( A2 E7 S3 t, I* [' ]
  23.                         delay_ms(500);                                                        //假如要用延时函数,最好就在上面初始化延时函数,不然程序很容易就跑飞: P0 r  z* R2 L. f2 i) ~" D* |
  24.                         for(i=0;i<7;i++)$ c$ a: t- w) k$ Z3 ~' T# b
  25.                         {" k0 D8 J; F8 K1 b3 q
  26.                                 USART_SendData(USART2, a</font></font><font face="Tahoma"><font size="3">);                        //向串口2发送数据给蓝牙模块
    . K, I6 Y+ A* @9 _
  27.                 while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);//等待发送结束
    * @* }; i$ \2 }/ x# l
  28.                         }
    $ w# N) |3 N/ k, c& D0 m
  29.                         res=0;* U7 P  t: O7 S5 c2 ^  e3 P
  30.                 }9 g5 T/ \2 ]' U2 j4 x
  31.                 if(res=='2'). Y7 X( Y3 Y+ }
  32.                 {: x+ X, U8 \) s! B  M2 d
  33.                         GPIO_SetBits(GPIOA,GPIO_Pin_1);                        //PA.1指示灯灭6 x& K0 h; c2 c3 y5 R& w% C. |' u
  34.                         res=0;) z& h) T9 D6 v% M4 `
  35.                 }- i0 g; ~9 |- S6 R( I% |
  36.         }         
    5 f, _4 T+ S6 q& G2 J' K+ y) B
  37. }</font></font>
复制代码
; U) V# H- ]& j; |. u/ h# J5 @
手机蓝牙跟蓝牙模块通信时,手机发送的指令经过蓝牙模块发送串口2,让串口2接收,如果利用发送函数让串口2发送数据出来的话,可以在手机app上面接收到数据;利用延时函数时,最好在最开始初始化延时函数delay_init(),不要问为什么,我也不清楚,试过才知道。
$ R- I% A5 I3 O3 A, y9 \6 o子程序:) u1 i' B  h' n3 {
* h0 o; t, D% R( E+ Q: T1 R4 e
  1. u8 res;                                    //设置全局变量
    : O; e2 L& _/ \
  2. void My_USART2_Init(void)  
      I- l4 Q3 j. ~5 y& `. a- [4 i
  3. {  ( i6 Z; [4 E. c$ ?3 W* z
  4.     GPIO_InitTypeDef GPIO_InitStrue;  - c6 G1 A$ u9 e0 |" j- Q& G) D
  5.     USART_InitTypeDef USART_InitStrue;  , J+ T4 c1 H  T* h3 e
  6.     NVIC_InitTypeDef NVIC_InitStrue;  
    - j# Q/ c2 c; l* x2 Z
  7. ! M/ [3 @2 E, u9 @% j
  8.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIO端口使能  
    - S3 l3 b' j6 X/ p
  9.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//串口端口使能  6 y$ t2 ~) J/ O4 |4 F) J" \6 b

  10. . Q" s# ^) k, c) H% v( w) e$ e
  11.     GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;  
    $ @; `+ E* q6 n6 w. @3 o2 ^# X
  12.     GPIO_InitStrue.GPIO_Pin=GPIO_Pin_2;  1 |' z4 H& B5 ^) g
  13.     GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;  ( H) w2 O5 h) [# Q; E! E, N
  14.     GPIO_Init(GPIOA,&GPIO_InitStrue);  ' {) `) w+ p5 d  |
  15. 3 E) x8 V+ A4 ~5 m
  16.     GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;  
    , c* J* v( o# H4 L7 t, z, e. _; Y
  17.     GPIO_InitStrue.GPIO_Pin=GPIO_Pin_3;  # A5 c  f- N* _
  18.     GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;  6 C- `9 x* R, x1 ^# T$ K
  19.     GPIO_Init(GPIOA,&GPIO_InitStrue);  ; g' e9 k7 W9 a) b. @5 d

  20. 7 g# c7 l, `, U/ x4 [$ W6 s6 W
  21.     USART_InitStrue.USART_BaudRate=9600;  
    6 B7 u5 K4 Y  l6 P2 G4 ?
  22.     USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;  
    6 c! M: I* B! m% F. y
  23.     USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;  / Q. X- J  q% {9 ?+ [
  24.     USART_InitStrue.USART_Parity=USART_Parity_No;  5 |& r3 K  `9 D6 ]7 g
  25.     USART_InitStrue.USART_StopBits=USART_StopBits_1;  
    ' X$ I, x/ {, ^" @: N
  26.     USART_InitStrue.USART_WordLength=USART_WordLength_8b;  * T* M! q$ L8 ~2 Z- W3 d3 o+ m1 G9 L, T% E

  27. 3 k' ~7 p) [: Q, r. s: C8 c
  28.     USART_Init(USART2,&USART_InitStrue);7 P1 `* y, |6 X5 q9 c8 f$ U
  29. & y& Q8 ?. v& p
  30.     USART_Cmd(USART2,ENABLE);                                        //使能串口2  
    ; u- Z$ E, m) V, t1 g4 I0 t
  31. ; X& ^7 z* _2 @1 f: J6 x
  32.     USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//开启接收中断  
    + L( n( w& H7 {( W
  33. % W* M6 y; ]2 C  Y/ Y; W
  34.     NVIC_InitStrue.NVIC_IRQChannel=USART2_IRQn;  
    % @* @$ b9 v5 p; B/ A& m
  35.     NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;  
    - Q/ ?& \. ^! m9 j) K2 \' s
  36.     NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=0;  
    % N) |1 i3 a2 p) l; G. H9 ?. z
  37.     NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;  / u2 S4 |: q2 M% {" a+ |. F7 L
  38.     NVIC_Init(&NVIC_InitStrue);  7 P& d+ Z+ _" c* H7 ]: n
  39. 9 o9 {! d; F8 b4 C, Q
  40. }  0 v2 ^" m1 k3 m( ^3 w3 B

  41. 4 k- l/ p9 I4 ^& L7 ]
  42. void USART2_IRQHandler(void)  
    , W' ]$ X" W% o
  43. {  9 o5 j9 }. r$ n) W5 [' s
  44. * V7 |( t: Y& q8 c6 v8 b8 Q
  45.      if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)  # {& k3 C' C7 X. F& I/ w/ v
  46. {  
    - }- b, g+ ^4 I0 A7 r) a
  47.      res= USART_ReceiveData(USART2);         
    1 A8 {% V& H7 ]  h# R* s2 c
  48. //     USART_SendData(USART2,res);     //串口2发送数据给蓝牙模块接收,也就是手机app接收到的数据
    : F4 A$ ~# H# }% t$ _+ y
  49.   }  + B9 P2 m- [; h# f8 c) ^8 I: U
  50. }  ! O& F- L  L( v
复制代码
" S% w$ S& P' j/ w2 S  u6 A
  1. void LED_Init(void)
    7 h$ x$ U: A$ l: Y' W( S4 y* _
  2. {& a" ^  T+ @& ^

  3. 8 m+ o: \( X* E9 Q5 S
  4. GPIO_InitTypeDef  GPIO_InitStructure;
    + w) f% v( k$ i# i% L7 e# w
  5.          ; G# J# J9 S! t- d5 S( R
  6. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);         //使能PA端口时钟* k1 ?' Z% w! _! I0 l) h
  7.         " y; C4 s( {; d8 X; v( ^. x; _
  8. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                                 //LED-->PA.1 端口配置
    ) _4 l& b9 ?, M( i3 E+ c
  9. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
    # u0 j$ \$ A4 c! {
  10. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
    & c% z. m. \/ M3 \
  11. GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOA.1
    ) @; ]: _0 b- D! Q7 `
  12. }
复制代码

' l3 c8 r1 O) K+ u0 p————————————————( S2 b4 D! M$ Z. _& L9 V
版权声明:i土豆  O, Z0 u7 e$ `8 x8 {* e9 o: X
+ M: P( b. `- Y: b( J
收藏 评论0 发布时间:2022-10-16 18:39

举报

0个回答

所属标签

相似分享

官网相关资源

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