【STM32】STM32之蓝牙透传模块(昇润科技HY-254124 V8)

  • Post author:
  • Post category:其他



一、简介




本文介绍如何使用STM32控制蓝牙透传模块,蓝牙透传模块使用昇润科技的HY-254124 V8




二、实验平台

库版本:STM32F10x_StdPeriph_Lib_V3.5.0

编译软件:MDK4.53

硬件平台:STM32开发板(主芯片stm32f103c8t6)

仿真器:JLINK








版权声明

博主:甜甜的大香瓜

声明:喝水不忘挖井人,转载请注明出处。

原文地址:http://blog.csdn

.NET

/feilusia

联系方式:897503845@qq.com

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427



香瓜BLE之Android群:541462902


香瓜单片机之STM8/STM32群:164311667


甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i





四、

实验前提


在进行本文步骤前,请先

阅读并实现

以下博文:


1、《STM32之NVIC》:http://blog.csdn

.NET

/feilusia/article/details/52819709


2、《STM32之串口》:http://blog.csdn.net/feilusia/article/details/52819571






五、



基础知识







1、蓝牙透传模块是什么?


答:蓝牙透传模块上有两个接口:UART/IIC/SPI、蓝牙,可对连接这两个接口的设备进行数据透传







例如STM32与蓝牙透传模块通过串口连接、蓝牙透传模块与手机app通过蓝牙连接,则当手机app发送一串数据给蓝牙透传模块后,这串数据会被STM32收到。以此达到手机app控制STM32的作用。



2、为什么要用蓝牙透传模块,而不直接使用蓝牙芯片?


答:


1)蓝牙透传模块


①优点:快速开发、不用做蓝牙认证。


②缺点:模块成本高。





2)直接使用蓝牙芯片


①优点:成本低、板子尺寸能做更小。


②缺点:有一定开发难度、需要蓝牙认证。



3、蓝牙透传模块如何使用?


答:


1)硬件接口


本次使用的模块上有SPI、IIC、UART三种接口,香瓜选择其中的UART。


硬件接口上需要控制以下几个引脚:





其中REST是复位脚、串口接口使用RX和TX、WAKEUP是唤醒脚、INT是模块响应脚,以及电源GND和VCC。


REST不是必须进行控制的,但进行控制REST可方便仿真调试,否则仿真时需要手动拔插模块进行复位。


2)初始化流程

①通过控制REST对模块进行复位。
②通过控制WAKEUP对模块进行唤醒。
③等待INT中断应答。
④通过测试指令进行测试收发指令。
⑤设置蓝牙透传模块为主模式或从模式。
⑥设置蓝牙透传模块为透传模式。
⑦此时即可进行数据透传。



3)使用注意事项

①昇润的文档有误,只有在唤醒后才会INT中断应答。

②蓝牙透传数据包一包仅有17字节的应用数据可使用。






五、实验步骤



1、编写并添加串口透传模块驱动


1)

编写驱动

BLE_Uart.c(存放在“

……


\HARDWARE

”)



  1. //******************************************************************************





  2. //name:             BLE_Uart.c





  3. //introduce:        蓝牙串口透传驱动





  4. //author:           甜甜的大香瓜





  5. //email:            897503845@qq.com





  6. //QQ group          香瓜单片机之STM8/STM32(164311667)





  7. //changetime:       2016.10.17





  8. //******************************************************************************





  9. #include “stm32f10x.h”





  10. #include “BLE_Uart.h”





  11. #include “GUA_USART.h”





  12. #include <string.h>





  13. #include “main.h”




  14. /*********************宏定义************************/


  15. #ifndef U8





  16. typedef


    unsigned


    char


    U8;



  17. #endif






  18. #ifndef U16





  19. typedef


    unsigned


    short


    U16;



  20. #endif






  21. #ifndef U32





  22. typedef


    unsigned


    long


    U32;



  23. #endif






  24. #ifndef int32





  25. typedef




    signed




    long


    int32;



  26. #endif






  27. //引脚宏定义





  28. #define BLE_UART_INT                    GPIOA





  29. #define BLE_UART_INT_PIN                GPIO_Pin_6






  30. #define BLE_UART_WAKEUP                 GPIOA





  31. #define BLE_UART_WAKEUP_PIN             GPIO_Pin_5






  32. #define BLE_UART_RESET                  GPIOA





  33. #define BLE_UART_RESET_PIN              GPIO_Pin_0





  34. /*********************全局变量************************/




  35. U8 gBLE_Uart_IntPulse = BLE_UART_INTPULSE_IDLE;

    //无脉冲






  36. /*********************内部函数声明************************/





  37. static




    void


    BLE_Uart_IO_Init(


    void


    );



  38. static




    void


    BLE_Uart_Exti_Init(


    void


    );



  39. //******************************************************************************





  40. //name:             BLE_Uart_IO_Init





  41. //introduce:        蓝牙串口模块的IO初始化





  42. //parameter:        none





  43. //return:           none





  44. //author:           甜甜的大香瓜





  45. //email:            897503845@qq.com





  46. //QQ group          香瓜单片机之STM8/STM32(164311667)





  47. //changetime:       2016.10.17





  48. //******************************************************************************





  49. static




    void


    BLE_Uart_IO_Init(


    void


    )


  50. {


  51. //IO结构体




  52. GPIO_InitTypeDef GPIO_InitStructure;



  53. //时钟使能




  54. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  55. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);



  56. //RESET配置




  57. GPIO_InitStructure.GPIO_Pin = BLE_UART_RESET_PIN;

  58. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  59. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  60. GPIO_Init(BLE_UART_RESET, &GPIO_InitStructure);




  61. //WAKEUP配置




  62. GPIO_InitStructure.GPIO_Pin = BLE_UART_WAKEUP_PIN;

  63. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  64. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  65. GPIO_Init(BLE_UART_WAKEUP, &GPIO_InitStructure);




  66. //INT配置




  67. GPIO_InitStructure.GPIO_Pin = BLE_UART_INT_PIN;

  68. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

  69. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  70. GPIO_Init(BLE_UART_INT, &GPIO_InitStructure);

  71. }



  72. //******************************************************************************





  73. //name:             BLE_Uart_Exti_Init





  74. //introduce:        蓝牙串口模块的IO中断初始化





  75. //parameter:        none





  76. //return:           none





  77. //author:           甜甜的大香瓜





  78. //email:            897503845@qq.com





  79. //QQ group          香瓜单片机之STM8/STM32(164311667)





  80. //changetime:       2016.10.17





  81. //******************************************************************************





  82. static




    void


    BLE_Uart_Exti_Init(


    void


    )


  83. {

  84. EXTI_InitTypeDef EXTI_InitStructure;



  85. //配置中断线




  86. GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);



  87. //配置中断参数




  88. EXTI_InitStructure.EXTI_Line = EXTI_Line6;

  89. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

  90. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

  91. EXTI_InitStructure.EXTI_LineCmd = ENABLE;

  92. EXTI_Init(&EXTI_InitStructure);

  93. }


  94. //******************************************************************************





  95. //name:             BLE_Uart_Init





  96. //introduce:        蓝牙串口模块初始化





  97. //parameter:        none





  98. //return:           none





  99. //author:           甜甜的大香瓜





  100. //email:            897503845@qq.com





  101. //QQ group          香瓜单片机之STM8/STM32(164311667)





  102. //changetime:       2016.10.17





  103. //******************************************************************************





  104. void


    BLE_Uart_Init(


    void


    )


  105. {

  106. u32 i;


  107. /**********初始化***************/


  108. //初始化IO




  109. BLE_Uart_IO_Init();



  110. //初始化IO的中断配置




  111. BLE_Uart_Exti_Init();



  112. //复位




  113. GPIO_ResetBits(BLE_UART_RESET, BLE_UART_RESET_PIN);

    //RESET低





  114. for


    (i = 0; i < 1000000; i++);


  115. GPIO_SetBits(BLE_UART_RESET, BLE_UART_RESET_PIN);

    //RESET高





  116. for


    (i = 0; i < 1000000; i++);




  117. //唤醒




  118. GPIO_SetBits(BLE_UART_WAKEUP, BLE_UART_WAKEUP_PIN);

    //WAKE UP 高





  119. for


    (i = 0; i < 1000000; i++);


  120. GPIO_ResetBits(BLE_UART_WAKEUP, BLE_UART_WAKEUP_PIN);

    //WAKE UP 低





  121. for


    (i = 0; i < 1000000; i++);




  122. //等待INT的低脉冲





  123. while


    (gBLE_Uart_IntPulse == BLE_UART_INTPULSE_IDLE);


    //低脉冲




  124. gBLE_Uart_IntPulse = BLE_UART_INTPULSE_IDLE;

    //清空脉冲计数





  125. while


    (!GPIO_ReadInputDataBit(BLE_UART_INT, BLE_UART_INT_PIN));


    //等待INT被拉高







  126. /**********串口测试***************/





  127. //发现串口测试指令




  128. memset(gGUA_USART2_rx_buf, 0xff, GUA_USART2_RX_SIZE);


  129. gGUA_USART2_tx_buf[0] = 0x41;

  130. gGUA_USART2_tx_buf[1] = 0x54;

  131. gGUA_USART2_tx_buf[2] = 0x0d;

  132. gGUA_USART2_tx_buf[3] = 0x0a;


  133. GUA_USARTx_Send(USART2, gGUA_USART2_tx_buf, 4);



  134. //接收完毕





  135. while


    (!GPIO_ReadInputDataBit(BLE_UART_INT, BLE_UART_INT_PIN));


    //等待INT被拉高




  136. gBLE_Uart_IntPulse = BLE_UART_INTPULSE_IDLE;

    //清空脉冲计数






  137. while


    (function != FUNC_AT_OK);


    //等待串口数据接收完毕




  138. function = FUNC_IDLE_EVENT;

    //置位







  139. /*********设置从模式***************/





  140. //发送设置从模式指令




  141. memset(gGUA_USART2_rx_buf, 0xff, GUA_USART2_RX_SIZE);


  142. gGUA_USART2_tx_buf[0] = 0x41;

  143. gGUA_USART2_tx_buf[1] = 0x54;

  144. gGUA_USART2_tx_buf[2] = 0x2b;

  145. gGUA_USART2_tx_buf[3] = 0x53;

  146. gGUA_USART2_tx_buf[4] = 0x45;

  147. gGUA_USART2_tx_buf[5] = 0x54;

  148. gGUA_USART2_tx_buf[6] = 0x3d;

  149. gGUA_USART2_tx_buf[7] = 0x31;

  150. gGUA_USART2_tx_buf[8] = 0x0d;

  151. gGUA_USART2_tx_buf[9] = 0x0a;


  152. GUA_USARTx_Send(USART2, gGUA_USART2_tx_buf, 10);



  153. //接收完毕(两个OK应答)





  154. while


    (!GPIO_ReadInputDataBit(BLE_UART_INT, BLE_UART_INT_PIN));


    //等待INT被拉高




  155. gBLE_Uart_IntPulse = BLE_UART_INTPULSE_IDLE;

    //清空脉冲计数






  156. while


    (function != FUNC_AT_OK);


    //等待串口数据接收完毕




  157. function = FUNC_IDLE_EVENT;

    //置位






  158. while


    (!GPIO_ReadInputDataBit(BLE_UART_INT, BLE_UART_INT_PIN));


    //等待INT被拉高




  159. gBLE_Uart_IntPulse = BLE_UART_INTPULSE_IDLE;

    //清空脉冲计数






  160. while


    (function != FUNC_AT_OK);


    //等待串口数据接收完毕




  161. function = FUNC_IDLE_EVENT;

    //置位






  162. /*********进入透传模式***************/





  163. //发送透传模式指令




  164. memset(gGUA_USART2_rx_buf, 0xff, GUA_USART2_RX_SIZE);


  165. gGUA_USART2_tx_buf[0] = 0x41;

  166. gGUA_USART2_tx_buf[1] = 0x54;

  167. gGUA_USART2_tx_buf[2] = 0x2b;

  168. gGUA_USART2_tx_buf[3] = 0x4d;

  169. gGUA_USART2_tx_buf[4] = 0x4f;

  170. gGUA_USART2_tx_buf[5] = 0x44;

  171. gGUA_USART2_tx_buf[6] = 0x45;

  172. gGUA_USART2_tx_buf[7] = 0x3d;

  173. gGUA_USART2_tx_buf[8] = 0x44;

  174. gGUA_USART2_tx_buf[9] = 0x41;

  175. gGUA_USART2_tx_buf[10] = 0x54;

  176. gGUA_USART2_tx_buf[11] = 0x41;

  177. gGUA_USART2_tx_buf[12] = 0x0d;

  178. gGUA_USART2_tx_buf[13] = 0x0a;


  179. GUA_USARTx_Send(USART2, gGUA_USART2_tx_buf, 14);



  180. //接收完毕





  181. while


    (!GPIO_ReadInputDataBit(BLE_UART_INT, BLE_UART_INT_PIN));


    //等待INT被拉高




  182. gBLE_Uart_IntPulse = BLE_UART_INTPULSE_IDLE;

    //清空脉冲计数






  183. while


    (function != FUNC_AT_OK);


    //等待串口数据接收完毕




  184. function = FUNC_IDLE_EVENT;

    //置位




  185. }



2)




编写驱动头文件




BLE_Uart.h(存放在“




……




\HARDWARE




”)



  1. //******************************************************************************





  2. //name:             BLE_Uart.h





  3. //introduce:        蓝牙串口透传驱动头文件





  4. //author:           甜甜的大香瓜





  5. //email:            897503845@qq.com





  6. //QQ group          香瓜单片机之STM8/STM32(164311667)





  7. //changetime:       2016.10.17





  8. //******************************************************************************





  9. #ifndef _BLE_UART_H_





  10. #define _BLE_UART_H_





  11. /*********************宏定义************************/


  12. #define BLE_UART_INTPULSE_IDLE  0x00        //没有脉冲





  13. #define BLE_UART_INTPULSE_ON        0x01        //一个INT脉冲






  14. /*********************全局变量声明************************/





  15. extern


    unsigned


    char


    gBLE_Uart_IntPulse;




  16. /*********************外部函数声明************************/





  17. void


    BLE_Uart_Init(


    void


    );




  18. #endif





3)




工程中添加


BLE_Uart


.c




4)

在MDK设置中添加驱动源文件路径






2、添加库的GPIO、外部中断驱动



1)


添加库的驱动头文件(stm32f10x_conf.h 中)





  1. #include “stm32f10x_exti.h”





  2. #include “stm32f10x_gpio.h”





2)




添加库的




GPIO、外部中断




驱动文件




3、设置NVIC中断优先级(

GUA_NVIC.c的GUA_NVIC_Init中







  1. //串口透传模块




  2. GUA_NVIC_Config(NVIC_PriorityGroup_2, EXTI9_5_IRQn, 0, 2, ENABLE);

INT引脚的中断优先级配置。


4、写中断服务函数


(stm32f10x_it.c中)



1)

添加头文件



  1. #include “BLE_Uart.h”





2)编写INT使用的中断服务函数、修改串口中断服务函数



  1. //******************************************************************************





  2. //name:             EXTI9_5_IRQn





  3. //introduce:        中断服务函数





  4. //parameter:        none





  5. //return:           none





  6. //author:           甜甜的大香瓜





  7. //email:            897503845@qq.com





  8. //QQ group          香瓜单片机之STM8/STM32(164311667)





  9. //changetime:       2016.10.17





  10. //******************************************************************************





  11. void


    EXTI9_5_IRQHandler(


    void


    )


  12. {


  13. if


    (EXTI_GetITStatus(EXTI_Line6) != RESET)


  14. {


  15. //有低脉冲




  16. gBLE_Uart_IntPulse = BLE_UART_INTPULSE_ON;



  17. //清除标志位




  18. EXTI_ClearITPendingBit(EXTI_Line6);

  19. }

  20. }



  21. //******************************************************************************





  22. //name:             USART2_IRQHandler





  23. //introduce:        串口2中断服务函数





  24. //parameter:        none





  25. //return:           none





  26. //author:           甜甜的大香瓜





  27. //email:            897503845@qq.com





  28. //QQ group          香瓜单片机之STM8/STM32(164311667)





  29. //changetime:       2016.10.17





  30. //******************************************************************************





  31. void


    USART2_IRQHandler(


    void


    )


  32. {

  33. u8 nRet = 0;

  34. u8 nNum = 0;

  35. u8 nbAT_OK_Buf[7] =

    “AT+OK\r\n”


    ;




  36. //接收串口数据




  37. nNum = GUA_USARTx_Reveive(USART2, gGUA_USART2_rx_buf);



  38. //如果是AT指令





  39. if


    (memcmp(nbAT_OK_Buf, gGUA_USART2_rx_buf, nNum) == 0)


  40. {


  41. //function = FUNC_AT_OK;




  42. }


  43. else




  44. {

  45. /*

  46. nRet = USARTx_Judgment(gGUA_USART2_rx_buf);

    //串口数据判断





  47. if


    (nRet ==


    true


    )


  48. {

  49. USARTx_Process(gGUA_USART2_rx_buf);

    //串口数据处理




  50. }


  51. else




  52. {

  53. function = FUNC_RETRUN_ERROR_EVENT;

    //空闲




  54. }

  55. */

  56. }

  57. }


5、在应用层中调用


1)添加头文件(main.c中)



  1. #include “BLE_Uart.h”





2)




添加驱动初始化代码(main.c的main函数中)




  1. //串口模块初始化




  2. BLE_Uart_Init();


六、实验结果

仿真并全速运行,用手机的BLE读写器可查看到此时蓝牙透传模块已广播出来


说明蓝牙透传模块已经被正确初始化并广播数据出来,此时就可以连接上进行数据透传了。