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

【经验分享】学习STM32f1之蓝牙控制LED

[复制链接]
STMCU小助手 发布时间:2022-5-14 21:00
前言% x+ E  W1 r# U) O0 U9 s6 s
这次主要以STM32f103zet6小系统板来操作,依旧使用库函数入手,寄存器版本可能要到后续再做更新,今天我们主要是来讲一下蓝牙通信!3 X" R0 _+ G1 x

: P  ^! m  Q& g4 I 一、蓝牙模块简介7 V0 \6 P0 A( R5 G3 d+ S5 z
关于蓝牙模块的使用相信大家在浏览众多博文中已经心中有数,关于它的指令使用部分,我们有时间再详细介绍介绍,另外在博客上也有许多文章介绍,大家可以学习学习,我也只是个小小搬运工,再把自己的理解写成一篇文章,希望能对大家有所帮助。4 \, [! F0 p6 `2 w1 U! p, C
! G% y4 y: t% ^( k* X: q
先看看它的模样吧4 d: r5 U. @. T3 S
0 _9 {. m* u# F- N8 B& c
C29KX{5$M~7NFPCZM[0PSNG.png
; S  K/ }8 R, q# ]; E8 e
) s8 D- T" h0 w- w6 ]其中我们可以看到用到了四个接口,即RXD、TXD、VCC、GND
# H( Z) F+ c+ r5 B  o  e
: J7 |2 f- g2 T在这里RXD接单片机上串口的TXD,TXD接单片机上串口的RXD,VCC和GND就不用多说了吧哈哈
4 Q6 B5 k; g2 j9 O# c5 l& {* F# r/ ~% r9 b
下面代码里面我接的是串口2,即PA2(TXD)和PA3(RXD)
5 l' X. T4 J5 h( f2 b; }$ C- T( L
然后介绍一下我们要使用到的工具:* P% e. N* _2 m2 C; B. L% k
3 P7 s1 ]9 I, \+ I$ A
1、单片机STM32f1系列板子,会控制LED灯(啰里啰嗦的我哈哈)
% r$ \/ L" c& b3 U- o) ^
4 ?% _+ a3 w3 o$ @% W* `! Q# S: W2、手机蓝牙软件(到应用市场搜索蓝牙串口即SPP)
) ~; a& `6 q  X' D6 y
! t* R" c; T) A8 o+ l3、蓝牙模块HC-055 L& S# t* w: F( G

9 s# x0 y8 U6 {' P接下来就直接上代码解释了  _3 j# t7 B3 l* C* T" [

% X- f* w' W$ \. {7 A$ ~/ J' m( L! c
二、代码部分详解
/ K) c+ @2 b, m! i3 A. Q' B# C
蓝牙代码部分:* l2 v  |2 @& m: }0 S

/ B6 y' i( f+ {$ C4 L
  1. #include "lanya.h"+ h& g+ N+ S& y+ |1 A4 i5 M1 }
  2. " I6 }5 D6 n3 Z/ P* `
  3. u8 res;
    4 n3 h9 |& N/ ~5 l5 f9 i& F/ G" ?
  4. void lanya_Init(void)! c  z+ D8 r5 `- x! T# @
  5. {
    + ]* E6 l7 A1 d; d, I" a: o
  6. * Q7 {# T& T8 t9 A' w8 D$ {
  7.     GPIO_InitTypeDef GPIO_InitStrue;  
    ) |3 \& _6 |% o
  8.     USART_InitTypeDef USART_InitStrue;  
    2 h  l2 N6 v0 r% z) a# C
  9.     NVIC_InitTypeDef NVIC_InitStrue;  ( P9 K' J  {2 z4 q. J9 l

  10. 7 t( \6 [/ u( j+ o
  11.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//
    / S2 \6 R1 f; S* }% v2 s
  12.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//   
    3 ]. U! y9 j! H- h1 x3 v2 Z

  13. ' U" M. Y7 P1 |4 p4 K# \
  14.     GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;  
    # T+ ?, t: e; P3 |  c, O' c
  15.     GPIO_InitStrue.GPIO_Pin=GPIO_Pin_2;  
    8 v3 g& g; B' a! V
  16.     GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;  * K# {! h' {* \0 e" g
  17.     GPIO_Init(GPIOA,&GPIO_InitStrue); : Z+ m( K4 T, F; B6 v" n) R
  18.         
    - K7 b+ _$ X( ]+ c( D. S
  19.                 GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;  
    8 O3 E" h! S3 L  r* v5 g
  20.     GPIO_InitStrue.GPIO_Pin=GPIO_Pin_3;  2 }: M; r7 R! j
  21.     GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;  
    2 j- T+ Q5 ?* J) R/ ^# Z: p# k) }9 A- F
  22.     GPIO_Init(GPIOA,&GPIO_InitStrue);3 x+ e0 s2 G' s  z' b$ ^3 a6 o% l
  23.         
    % D& e( A1 V& {% Q' f! D
  24.     USART_InitStrue.USART_BaudRate=9600;  //波特率设置9600,串口设置
    ( e' W8 `1 w  }1 Q
  25.     USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;  ! S) q) N) ~" s3 F( N) K5 @
  26.     USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;  
    1 U( e0 N( N$ r& ]" ]* l1 G
  27.     USART_InitStrue.USART_Parity=USART_Parity_No;  6 T3 S. Q( P- V, c1 z9 x- ~. y
  28.     USART_InitStrue.USART_StopBits=USART_StopBits_1;  - ]" x. v% F6 S9 ^2 K$ S
  29.     USART_InitStrue.USART_WordLength=USART_WordLength_8b;  
    7 y9 v- q( `& s2 S

  30. 6 g8 c# A6 [, {" q7 p
  31.     USART_Init(USART2,&USART_InitStrue);( T5 a' s' n! E/ \

  32.   Z, W/ C7 f5 v! m
  33.     USART_Cmd(USART2,ENABLE);     //
    & T+ C2 n2 L5 q- l4 b7 X8 F6 X, `) \

  34. : h7 A$ J5 \7 m
  35.     USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//# L3 r; R1 F* _; J* N
  36. 2 F: j9 Z1 s" C) C9 }7 T
  37.     NVIC_InitStrue.NVIC_IRQChannel=USART2_IRQn;  ! J% ~! C7 j* @" X& ^1 e
  38.     NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;  7 v! N  T2 E2 `7 ?% `  F
  39.     NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=0;  
    . {$ v4 @5 n% s) l' Y
  40.     NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;  
    + v- L( g$ V: t& P
  41.     NVIC_Init(&NVIC_InitStrue);  
    6 d& H6 j% F- R. H
  42. ( G4 r9 C( c% H2 B, h
  43. }    e8 `7 m3 g! b6 q

  44. + s; o) D* h  c& Z6 A( U" A
  45. void USART2_IRQHandler(void)  4 ~, i- x+ x! |7 t1 a; B
  46. {  $ j! G- N" C! W& g/ S2 R
  47. * ^) `: A, J- g6 m# |% I
  48.      if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)  
    9 h6 q& f4 c+ I* @
  49. {  
    % Y5 Q' H& X, \: M6 c# w  y
  50.      res= USART_ReceiveData(USART2);   //接收数据给res: T: {7 p* Q6 h  \
  51. //     USART_SendData(USART2,res);    5 ]4 ]. Z- h6 S
  52.   }  
    2 b' L8 Y4 C3 m+ l
  53. }
    ( f) b9 s( E1 P
复制代码

( A- v* D, P  q7 q- |/ x这里主要还是初始化串口,即蓝牙初始化,后面又开启串口2中断接受数据吗,这里因为我采用了串口2,所以并没有开启发送到电脑的串口助手上,我们仅通过与手机软件的互联,这也是我们通过手机端来控制LED的亮灭,进而实现其他高阶操作。
1 o' D) A5 @# t  i: v* F1 V. J# x, C- Y# o: ]1 r& B
头文件就单纯声明了初始化函数
! j! O1 n% ]9 e; R. i1 |
  w3 P: x+ b3 w- J/ U接下来就是主函数了
( a3 k; {: S* C5 K8 }( x$ U1 m
0 a% B$ ~5 R; X/ v
  1. #include "led.h"
    ' u& F' ~' K9 ^+ t* f
  2. #include "delay.h"8 E' k0 P- E, C) i" I( `' s
  3. #include "key.h"/ l: W9 Q, q  F1 O/ C8 M1 |; X6 q
  4. #include "sys.h"
    0 s1 O$ g4 x% V- D6 E8 _
  5. #include "usart.h"8 u: g/ x$ R/ k) e8 k0 I) ^
  6. #include "lanya.h"" l6 a/ l: f9 v5 \& C

  7. 5 H' K' I8 w/ k$ _* g& \" u- }3 k' c
  8. extern u8 res;         8 Y) `, S+ t$ U* ]$ R) Q
  9. int main(void)
    6 I3 t# C- j& X# Z' E
  10. {   ( t$ \* J/ `7 i7 ?& P
  11. int i;
    8 x9 P1 [: q- {% m( g& H) o
  12. char a[]="abcdefg";8 \& E2 k* O( k

  13. 6 H$ {$ }, O0 V0 E; R
  14. delay_init();
    9 A7 L" F, D8 K5 o$ _1 j" r( J
  15. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    & l. S' n  S0 h
  16. uart_init(115200);        * F7 B: d0 f6 P4 _  A6 }8 h. O: |8 i
  17. LED_Init();            / F/ c0 C' G8 b6 n
  18. lanya_Init();& ^. O; D7 P9 T4 E
  19.   while(1)3 B7 Y- Q4 b( ?5 L8 o& K
  20. {8 I/ ^7 m0 d3 P5 U0 ]
  21.   if(res=='0')
    1 l6 R$ d6 e! }% N+ C/ X6 t3 }9 _
  22.   {3 N: j# c  }7 o3 J$ }
  23.    LED0=0;; `- o# s" a5 H# E
  24.    delay_ms(500);   
    ( P) ]  ]+ _; _9 n6 i* J2 |
  25.    for(i=0;i<7;i++)
    . H- K* Z* R% ^; a, b6 E
  26.    {0 j. i& s3 [* q
  27.     USART_SendData(USART2, a<i>); , q6 _0 P5 g% g2 z" B' U! L2 J: d
  28.   while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
    : C. t) X( N- B3 v3 D" D* O
  29.                    q# X" [9 Z0 I
  30.    }
    + v6 j* h3 `. L$ r; b% c6 d( w  v
  31.    res=0;% J, c3 n  h6 {- |! M* D' s
  32.   }. A. O2 J# p( @9 N  S
  33.   if(res=='1')
    % `# F" ]! p# A9 I' Q. Y; V6 t
  34.   {' T' X# m8 H% v' s( J
  35.    LED1=0;
    8 Q/ D' V8 }# t3 H8 O# W$ Q/ I7 s
  36.    delay_ms(50);
    # i0 O0 @0 D) V0 r1 n
  37.    res=0;) m2 Y  q. f1 r' B% a( \
  38.   }
    9 C. o6 ]. R% d! N4 n
  39.         if(res=='2')
    3 j' A" l3 f& S( Y3 U4 z; q0 E# }
  40.         {6 _( m$ `$ V& N9 c8 x3 ^
  41.                 LED0=1;
    8 o% {/ t; ?1 c4 k
  42.         delay_ms(50);$ _. L1 Z2 @- |/ V
  43.                 res=0;
      `2 h8 Q# G/ F" m! q& f
  44.         }
    : ^2 [; L$ A. q+ W8 f; T
  45.                 if(res=='3')
    5 |& P% F# D5 m; ?) h
  46.         {
    : S0 M6 Y% i( y1 J- s- S
  47.                 LED1=1;
    8 }6 m/ o& b* E& w7 }' Z& B$ ^0 u
  48.         delay_ms(50);
    . ^5 d0 u; x  H+ ^5 p4 Y
  49.                 res=0;7 i' c; ?) n0 m4 d3 @( ~
  50.         }
    % S$ w+ x* q7 u% w7 A4 u5 L8 }
  51. 0 @+ }: p- f' s3 N
  52. }  
    ' S9 U1 {5 h& w! d
  53. }</i>
复制代码
# w7 _/ L8 F9 J/ J- N9 _8 e) A
写的有点乱,见谅见谅哈哈,修改乱了懒得改,这里就是在手机蓝牙串口上输入数字0、1、2、3来控制LED的亮灭,具体见下图:
6 d' w. c: R9 [$ X! G* ~1 m5 S1 p; O# [! s  d/ ?
输入‘0’:$ [2 ]9 Q- ^/ v7 W3 w
% ]6 G0 {0 g9 P  R0 E
T3{W@]V$WX)3B`I7E39GY_L.png 9 B1 N' p# i4 c( B

' `3 W* U& x; \1 a$ ?输入‘1’ 7 ?) [2 Z3 ]! Z
6 I' d) q) [( [; S6 D: \
PL8([7NK0MBAWQJJ[KP`0ZF.png / J% @3 M) j0 H6 |' X
% W" C1 I  J6 u' @' M* @
那么学习到这你就会对蓝牙模块有了很简单的理解,就可以操作蓝牙来实现操作其他东西
, Y: s. A9 e0 W! a4 |! a7 V3 A/ K& s! C% U9 F- ?4 M# M$ D/ E: p
三、总结4 o1 Y; V( h, K/ J( B! A& e) j
这一讲其实我也没有讲的特别详细,主要理解还不太深刻哈哈,但是尽量的去把自己的东西写出来来,希望对大家有所帮助。5 ^2 f$ H7 t/ f0 I& `
6 K  l' T4 ]& ?* u. Q, K

1 n) Y" b/ E7 Z; h9 b, z8 ?3 @
赞 收藏 评论0 发布时间:2022-5-14 21:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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