请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
STMCU小助手 发布时间:2022-5-14 21:00
前言* \9 J3 Z! p( M- {
这次主要以STM32f103zet6小系统板来操作,依旧使用库函数入手,寄存器版本可能要到后续再做更新,今天我们主要是来讲一下蓝牙通信!
* n, o6 S* K  r1 ^0 H5 a7 A$ ?2 Y* t# |; q5 ~! s! y
一、蓝牙模块简介; e: D2 E% [2 X4 u% q
关于蓝牙模块的使用相信大家在浏览众多博文中已经心中有数,关于它的指令使用部分,我们有时间再详细介绍介绍,另外在博客上也有许多文章介绍,大家可以学习学习,我也只是个小小搬运工,再把自己的理解写成一篇文章,希望能对大家有所帮助。: Y/ y4 }1 m% f1 Q- o% S

8 u% v9 v6 u9 s6 H( x9 R1 t先看看它的模样吧' o2 ^  H9 b; E% q8 o& ?& o' I

2 e4 t  }$ N- o! V& l5 i5 Q0 @ C29KX{5$M~7NFPCZM[0PSNG.png , j+ p( w3 l8 j' o7 e
/ f/ X5 I8 O) \) J
其中我们可以看到用到了四个接口,即RXD、TXD、VCC、GND' `1 g- }4 A7 z$ ^3 i
- {& s# ]0 X6 e: N/ k: x; f
在这里RXD接单片机上串口的TXD,TXD接单片机上串口的RXD,VCC和GND就不用多说了吧哈哈
4 E: Q% b3 ?$ h( a
# q0 h* K* n  `3 Y下面代码里面我接的是串口2,即PA2(TXD)和PA3(RXD); g: N* |7 r9 V4 J
8 X/ v. Q4 t* b1 X
然后介绍一下我们要使用到的工具:% h1 t" S! G0 n; {
) ^, ^. P* W. `6 b/ Q+ j( }8 @5 ^
1、单片机STM32f1系列板子,会控制LED灯(啰里啰嗦的我哈哈)1 \  F1 V( U9 E8 `. v# F
- H* r9 O5 B2 y: _2 {
2、手机蓝牙软件(到应用市场搜索蓝牙串口即SPP)
  W" |* ?$ Q2 \
4 _# j' t7 C) J3、蓝牙模块HC-05" U/ W: V( S# e7 U5 n$ x

  J$ [- g' X3 ]! ~* b) E接下来就直接上代码解释了. z/ _2 f0 m+ T1 B1 r1 j
/ A. {  `: U6 d

  t3 D- ]) ?9 W9 y6 k9 C. b 二、代码部分详解

# Q- R+ h! s+ A) C蓝牙代码部分:
# s. Y6 ~1 `5 e& Y5 Y9 G% w) M( ?0 u/ n9 U' u) k. B
  1. #include "lanya.h"
    / W2 d5 n! [0 @, c" T; U
  2. : r& I# t; @& z
  3. u8 res;, ~) A- a. c! B0 M  N1 B, Y
  4. void lanya_Init(void)* `. l- k' e$ H2 h/ i4 z
  5. {
    + n. D! @# a: P  R* b$ h
  6. , @; B  ^; ]' R! t! K1 _; u7 |% j1 t
  7.     GPIO_InitTypeDef GPIO_InitStrue;  
    9 T- f1 O9 W4 ]/ z! V, @/ J
  8.     USART_InitTypeDef USART_InitStrue;  
    4 K& ^7 Z* f6 G8 `
  9.     NVIC_InitTypeDef NVIC_InitStrue;  # d5 r% ?$ u" W3 e! V

  10. % I  j+ ?  R' z
  11.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);// # B. C# ]7 e6 x9 ]- ^
  12.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//   ! R& x1 K9 A7 `$ @9 v' Y

  13. 3 u. g$ e% e$ q
  14.     GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;  
    1 U+ J7 l. B' {& I' E
  15.     GPIO_InitStrue.GPIO_Pin=GPIO_Pin_2;  ; G* e. |0 j! O
  16.     GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;  
      C* }8 G8 c' r5 L  y
  17.     GPIO_Init(GPIOA,&GPIO_InitStrue);
    9 j& I' T5 G0 r! w6 f
  18.         
    1 E8 A/ T, @. s4 s; `5 B" Y7 F+ ^
  19.                 GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;  
    9 F0 E. t6 j1 r7 k  {7 `, N8 d
  20.     GPIO_InitStrue.GPIO_Pin=GPIO_Pin_3;  
    : ~( G, ]' E" b( _7 T
  21.     GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;  ) `' S  ]' J- N5 [3 w" g' ?9 l
  22.     GPIO_Init(GPIOA,&GPIO_InitStrue);3 i" A' U) i6 j' d3 y" ~7 |% S
  23.         
    ! Z8 P8 J4 @, g* M( I% }. ^
  24.     USART_InitStrue.USART_BaudRate=9600;  //波特率设置9600,串口设置( Y1 k2 W/ d) ?# R) L
  25.     USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;  - K/ O" p6 c( j6 s# W8 M
  26.     USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;  / o& L' K6 M; i: \1 R5 I2 ?" a- C
  27.     USART_InitStrue.USART_Parity=USART_Parity_No;  
    + P& V6 v& p" c4 d2 ^7 R
  28.     USART_InitStrue.USART_StopBits=USART_StopBits_1;    Z' O( \/ @; L9 b1 J
  29.     USART_InitStrue.USART_WordLength=USART_WordLength_8b;  . K  U+ x, \3 K* Y3 T3 O

  30. " ^, A) z' ^! @6 r  A6 x7 b
  31.     USART_Init(USART2,&USART_InitStrue);5 j' ~  h$ ^0 |! ]6 ?. K1 P$ p

  32. ( Q% v: P  N: m: ^" |
  33.     USART_Cmd(USART2,ENABLE);     //
    * ]1 n0 o0 s6 H, k/ w& s* l
  34. . A2 ^+ Z$ d0 g* }' ]! Z
  35.     USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//
    & R( X, _3 K: ?0 T- M
  36. . Q( ^/ X. B1 t! P% a! ^; R
  37.     NVIC_InitStrue.NVIC_IRQChannel=USART2_IRQn;  5 F# J9 g9 o5 O1 {9 Z( E
  38.     NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;  * h$ m5 X  n7 ]. s/ k  {
  39.     NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=0;  - A1 C* }! Z3 C
  40.     NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;  
    3 S, m0 `$ m" r7 H! T
  41.     NVIC_Init(&NVIC_InitStrue);  
    + M& w7 U7 K, _/ e6 J. r7 Y* b/ ]

  42. $ J2 d1 A3 `1 t. F6 R$ O2 I
  43. }  
      L: ?3 |8 j# |: {. ?

  44. ( X$ k1 |1 j  c, y  I9 D
  45. void USART2_IRQHandler(void)  + \: `7 {" L7 Q6 a- S* G
  46. {  
    % ?' U2 X8 G! ?! Y  I! Y

  47. 4 t6 m8 |+ f; {1 M
  48.      if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)  . J7 o7 `) s) i. _. o
  49. {  - Y3 E, w, z. {6 S& _. ]" Q
  50.      res= USART_ReceiveData(USART2);   //接收数据给res' S, p6 b; ?/ o5 B6 Y) ]/ ]" O- m3 u, Q
  51. //     USART_SendData(USART2,res);   
    - w6 t; e* ~& I0 Q3 c
  52.   }  
    % I/ J3 j7 k* K0 D- Y9 e5 V9 L! r
  53. }
    0 @$ ~- J% B! d* f" B, J
复制代码

/ a5 f: w, n+ j+ j$ h( r* y这里主要还是初始化串口,即蓝牙初始化,后面又开启串口2中断接受数据吗,这里因为我采用了串口2,所以并没有开启发送到电脑的串口助手上,我们仅通过与手机软件的互联,这也是我们通过手机端来控制LED的亮灭,进而实现其他高阶操作。
! Q& x( w0 \! V6 k; V* k
) O* i) z! q! Z* |8 _+ P9 L头文件就单纯声明了初始化函数
7 a$ r1 z# o0 H9 R, O
$ z. i3 C: E5 G+ u接下来就是主函数了8 \* C! f( N* A9 D/ r7 w  t
$ ^+ D9 ]. l' b* n, i+ L
  1. #include "led.h"
    / S+ R1 @; S& Y: U( M
  2. #include "delay.h"9 X5 _0 v, S3 Y; R8 M. }" S! p$ N' M
  3. #include "key.h"
    4 `1 q5 r) g/ V/ A7 x. s5 \
  4. #include "sys.h") V3 T6 n! J. c& Z3 B- Q% f% O
  5. #include "usart.h"
    $ m8 n* u" p& b" z# s6 _+ u
  6. #include "lanya.h"! J; J6 B3 f+ y9 v$ E
  7. 2 U$ t" ~: [0 n9 e0 J
  8. extern u8 res;         
    # K9 ?7 C8 y9 W# v9 ^. U' J
  9. int main(void)3 w" x0 J1 {8 X2 y' C" \2 _
  10. {   3 F3 }( b2 S: {, N6 p% d
  11. int i;
    3 d* T# l- Q4 s; z$ i! i8 t
  12. char a[]="abcdefg";! ?. P4 L' [% r4 ~6 U/ I/ T

  13. ' z3 D% Y# F* W1 F% @
  14. delay_init();
    ) x. e! Q* \* O# [
  15. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); ) U' d+ |& c- w, }
  16. uart_init(115200);        
    8 E4 ?  u0 m' ]6 c, r+ b2 M5 ]
  17. LED_Init();            & _7 B. W+ k' w+ K# O% C2 p
  18. lanya_Init();
    4 }1 D7 a" }2 f. ~
  19.   while(1)
    ; [- l0 t9 q% O: T4 f0 _' p
  20. {
    3 l% I5 c# X# V$ P
  21.   if(res=='0')" X& Q* \3 ?4 e' i( G  {5 S, V
  22.   {
    , J  s% C- \- O5 m! q
  23.    LED0=0;9 y! ^6 b& b$ x0 N* \7 C
  24.    delay_ms(500);   
    7 |# Y' M. m! h  c  [
  25.    for(i=0;i<7;i++)
    ) \. v4 _' [' f5 Z& D2 X/ e. |
  26.    {
    0 K  d& X3 @% E5 I
  27.     USART_SendData(USART2, a<i>);
    8 O0 a# |) ?/ d6 |: D
  28.   while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
    ; I" {8 @% y% [+ U2 z
  29.                  
    8 P7 {7 }" k. d, y
  30.    }
    " v, q- J7 a1 A; T2 `  A. @
  31.    res=0;9 C- _8 b9 O* L
  32.   }
    8 q9 E4 ]0 ^4 L! D3 K& l' D1 E
  33.   if(res=='1')
    2 }! M# P7 ^3 h: v
  34.   {
    1 z4 P' u% ^/ M! u
  35.    LED1=0;
    # M% @6 E6 Z# w1 [' I+ t$ l% f; _
  36.    delay_ms(50);# f8 C: i! Z& `5 m% {. f
  37.    res=0;
    5 a7 l4 v# C9 ]2 X8 z4 S# v) b
  38.   }/ [* ^4 h" A( Z& ^, [  H
  39.         if(res=='2')
    6 V6 v: u( |* r! I
  40.         {
    ; [) h" k) Y6 J7 s( i7 T
  41.                 LED0=1;6 o6 E1 G# [6 r' M+ ^9 s: U
  42.         delay_ms(50);# _- Q; |9 Q8 T# ?1 X
  43.                 res=0;
    0 L! a/ L, x. Z
  44.         }$ K4 f3 n& q* Q9 d  G  n
  45.                 if(res=='3'), c; _5 @. m. X5 P2 y' R
  46.         {+ i, V# Z) D5 {0 [0 O; z
  47.                 LED1=1;8 d3 @7 @9 H. ~' g5 i$ v0 ~$ m
  48.         delay_ms(50);
    - ^6 p/ H; B- l' p" X: {; I
  49.                 res=0;& s( X) O* L9 S0 C
  50.         }
      [3 ^  F, w, e* q

  51. * E- H2 w& ?+ F$ u9 a* s, Z
  52. }  " j$ w5 m% m  S7 o
  53. }</i>
复制代码

9 R/ {  |7 N! d- J) J+ ^5 q写的有点乱,见谅见谅哈哈,修改乱了懒得改,这里就是在手机蓝牙串口上输入数字0、1、2、3来控制LED的亮灭,具体见下图: / H" L$ t0 v  a: _. C! f  [

8 T' y; r( ^! \, ?/ a; t$ j4 i7 ^输入‘0’:- D  C9 u6 ~8 x& n6 H8 k

  T' ~. e3 ?: e T3{W@]V$WX)3B`I7E39GY_L.png 8 H8 E( ^4 A+ s# |* _" W

7 o) Z, m  e" h# G. E: R输入‘1’
& D& P- [; _5 [6 p6 C0 t
' j( H3 A% T4 f$ ?0 g* N! H: c  d  M& D  V PL8([7NK0MBAWQJJ[KP`0ZF.png
$ q$ r7 ~' D* O9 J* F( w( k" Z
: j# _: F+ {! G 那么学习到这你就会对蓝牙模块有了很简单的理解,就可以操作蓝牙来实现操作其他东西( K* |4 c, C1 r$ {! _
9 k" F3 P- _# L1 E6 N% }2 v
三、总结1 e' O1 l5 e% K4 B: g5 N+ ?
这一讲其实我也没有讲的特别详细,主要理解还不太深刻哈哈,但是尽量的去把自己的东西写出来来,希望对大家有所帮助。
- l) |" G, h6 s/ G5 T* g4 p) i( [6 }! X

8 o$ _# V, x, J
收藏 评论0 发布时间:2022-5-14 21:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版