【STM32】STM32之蓝牙透传模块(迅通科技PTR5518)

来源:互联网 发布:video.js点击全屏播放 编辑:程序博客网 时间:2024/06/01 09:40

本篇博文最后修改时间:2017年01月15日,01:25。


一、简介

本文介绍如何使用STM32控制蓝牙透传模块,蓝牙透传模块使用迅通科技的PTR5518


二、实验平台

库版本:STM32F10x_StdPeriph_Lib_V3.5.0

编译软件:MDK4.53

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

仿真器:JLINK

手机型号: 小米4S

安卓版本:安卓5.1

安卓app:BLE Tool


版权声明

博主:甜甜的大香瓜

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

原文地址: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、在进行本文步骤前,请先阅读以下博文:
1)STM32之蓝牙透传模块(昇润科技)》:http://blog.csdn.net/feilusia/article/details/52838571


2、在进行本文步骤前,请先实现以下博文:

1)《STM32之NVIC》:http://blog.csdn.net/feilusia/article/details/52819709

2)《STM32之串口》:http://blog.csdn.net/feilusia/article/details/52819571
3)《STM32之系统滴答定时器》:http://blog.csdn.net/feilusia/article/details/52835711

五、基础知识

1、本文使用的蓝牙透传模块是什么?

答:本文使用的蓝牙透传模块是迅通科技的PTR5518。

该模块采用NORDIC公司的Cortex-M0内核芯片nRF51822、模块封装尺寸为15.2×15.2mm,并且通过了BQB 认证、 FCC 认证、CE 认证。


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

答:

1)硬件

使用到的引脚是1(EN:唤醒与睡眠)、2(TX:模块串口发送)、3(RX:模块串口接收)、8(NTF:连接状态查询)

9(GND:模块地)、10(VCC:模块电源正极1.8~3.6V)、11(REST:模块复位)、13(FLOW:忙闲状态查询)


2)软件

①初始化IO

②复位模块

③唤醒模块


3、PTR5518讯通科技HY-254124 V8昇润科技有什么区别?

答:

1)芯片

①PTR5518讯通科技

使用的是32bit的Cortex-M0内核芯片nRF51822。


②HY-254124 V8昇润科技

使用的是8bit的51内核芯片CC2541。


2)价格

①PTR5518讯通科技



②HY-254124 V8昇润科技



3)认证

①PTR5518讯通科技

通过了蓝牙联盟BQB 认证、美国FCC 认证、欧洲CE 认证。


②HY-254124 V8昇润科技

通过了蓝牙联盟BQB 认证


4)使用

①PTR5518讯通科技

上电并配置好IO口即能广播,使用方便。


②HY-254124 V8(昇润科技

需要AT指令进行配置,使用较繁琐。


六、实验步骤

注:以下为核心代码及步骤,报错及缺少文件的可自行修改、添加。

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

1)编写驱动GUA_BLE_Uart.c(存放在“……\HARDWARE”)

//******************************************************************************          //name:             GUA_BLE_Uart.c          //introduce:        蓝牙串口透传驱动(讯通科技)   //author:           甜甜的大香瓜                 //email:            897503845@qq.com     //QQ group          香瓜单片机之STM8/STM32(164311667)                  //changetime:       2017.01.15    //****************************************************************************** #include "stm32f10x.h"#include "GUA_BLE_Uart.h"#include "GUA_SysTick.h"#include "GUA_USART.h"#include <string.h>/*********************宏定义************************/ //引脚宏定义//INT#define GUA_BLE_UART_INT_PORTGPIOA#define GUA_BLE_UART_INT_PINGPIO_Pin_6#define GUA_BLE_UART_INT_MODEGPIO_Mode_IPU//WAKEUP#define GUA_BLE_UART_WAKEUP_PORTGPIOA#define GUA_BLE_UART_WAKEUP_PINGPIO_Pin_5#define GUA_BLE_UART_WAKEUP_MODEGPIO_Mode_Out_PP//RESET#define GUA_BLE_UART_RESET_PORTGPIOA#define GUA_BLE_UART_RESET_PINGPIO_Pin_0#define GUA_BLE_UART_RESET_MODEGPIO_Mode_Out_PP//FLOW#define GUA_BLE_UART_FLOW_PORTGPIOA#define GUA_BLE_UART_FLOW_PINGPIO_Pin_10#define GUA_BLE_UART_FLOW_MODEGPIO_Mode_IPU//低功耗控制宏  #define GUA_BLE_UART_WAKEUP_STATE_HALT0#define GUA_BLE_UART_WAKEUP_STATE_ACTIVE1/*********************内部函数声明************************/ static void GUA_BLE_Uart_IO_Init(void);static void GUA_BLE_Uart_Reset(void);static void GUA_BLE_Uart_Wakeup(GUA_U8 nGUA_BLE_Uart_Wakeup_State);//******************************************************************************            //name:             GUA_BLE_Uart_IO_Init           //introduce:        蓝牙串口模块的IO初始化         //parameter:        none                 //return:           none         //author:           甜甜的大香瓜                 //email:            897503845@qq.com     //QQ group          香瓜单片机之STM8/STM32(164311667)                  //changetime:       2017.01.15                       //******************************************************************************static void GUA_BLE_Uart_IO_Init(void){//IO结构体GPIO_InitTypeDef GPIO_InitStructure;//时钟使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //RESET配置GPIO_WriteBit(GUA_BLE_UART_RESET_PORT, GUA_BLE_UART_RESET_PIN, Bit_SET);//RESET高GPIO_InitStructure.GPIO_Pin = GUA_BLE_UART_RESET_PIN;  GPIO_InitStructure.GPIO_Mode = GUA_BLE_UART_RESET_MODE; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GUA_BLE_UART_RESET_PORT, &GPIO_InitStructure);//WAKEUP配置GPIO_WriteBit(GUA_BLE_UART_WAKEUP_PORT, GUA_BLE_UART_WAKEUP_PIN, Bit_SET);//WAKE UP高GPIO_InitStructure.GPIO_Pin = GUA_BLE_UART_WAKEUP_PIN;  GPIO_InitStructure.GPIO_Mode = GUA_BLE_UART_WAKEUP_MODE; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GUA_BLE_UART_WAKEUP_PORT, &GPIO_InitStructure);//INT配置GPIO_InitStructure.GPIO_Pin = GUA_BLE_UART_INT_PIN;  GPIO_InitStructure.GPIO_Mode = GUA_BLE_UART_INT_MODE; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GUA_BLE_UART_INT_PORT, &GPIO_InitStructure);//FLOW配置GPIO_InitStructure.GPIO_Pin = GUA_BLE_UART_FLOW_PIN;  GPIO_InitStructure.GPIO_Mode = GUA_BLE_UART_FLOW_MODE; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GUA_BLE_UART_FLOW_PORT, &GPIO_InitStructure);}//******************************************************************************            //name:             GUA_BLE_Uart_Reset           //introduce:        蓝牙串口模块复位        //parameter:        none                 //return:           none         //author:           甜甜的大香瓜                 //email:            897503845@qq.com     //QQ group          香瓜单片机之STM8/STM32(164311667)                  //changetime:       2017.01.15                      //******************************************************************************static void GUA_BLE_Uart_Reset(void){  //复位异常,暂时不作复位处理/*  GPIO_WriteBit(GUA_BLE_UART_RESET_PORT, GUA_BLE_UART_RESET_PIN, Bit_RESET);//RESET低 GUA_Delay_Us(100000);  GPIO_WriteBit(GUA_BLE_UART_RESET_PORT, GUA_BLE_UART_RESET_PIN, Bit_SET);//RESET高  */}//******************************************************************************            //name:             GUA_BLE_Uart_Wakeup           //introduce:        蓝牙串口模块复位        //parameter:        nGUA_BLE_Uart_Wakeup_State: GUA_BLE_UART_WAKEUP_STATE_HALT or GUA_BLE_UART_WAKEUP_STATE_ACTIVE                //return:           none         //author:           甜甜的大香瓜                 //email:            897503845@qq.com     //QQ group          香瓜单片机之STM8/STM32(164311667)                  //changetime:       2017.01.15                     //******************************************************************************static void GUA_BLE_Uart_Wakeup(GUA_U8 nGUA_BLE_Uart_Wakeup_State){//复位异常,暂时不作复位处理/*//开启低功耗if(nGUA_BLE_Uart_Wakeup_State == GUA_BLE_UART_WAKEUP_STATE_HALT){GPIO_WriteBit(GUA_BLE_UART_WAKEUP_PORT, GUA_BLE_UART_WAKEUP_PIN, Bit_SET);//WAKE UP高   }//关闭低功耗else{GPIO_WriteBit(GUA_BLE_UART_WAKEUP_PORT, GUA_BLE_UART_WAKEUP_PIN, Bit_RESET);//WAKE UP低  }   */}//******************************************************************************            //name:             GUA_BLE_Uart_AT_Cmd           //introduce:        蓝牙串口模块AT指令处理       //parameter:        npGUA_BLE_Uart_AT_Cmd: 指令首地址//                  nGUA_Num: 数据长度//return:           none         //author:           甜甜的大香瓜                 //email:            897503845@qq.com     //QQ group          香瓜单片机之STM8/STM32(164311667)                  //changetime:       2017.01.15                     //******************************************************************************void GUA_BLE_Uart_AT_Cmd(GUA_U8 *pGUA_BLE_Uart_AT_Cmd, GUA_U8 nGUA_Num){  GUA_U8 aAT_STRS_Buf[7] = "AT+STRS";  GUA_U8 aAT_ADST_Buf[7] = "AT+ADST";//如果是1、软件复位if(memcmp(aAT_STRS_Buf, pGUA_BLE_Uart_AT_Cmd, nGUA_Num) == 0){ }//如果是2、广播状态else if(memcmp(aAT_ADST_Buf, pGUA_BLE_Uart_AT_Cmd, nGUA_Num - 1) == 0){}//需要用到的后面自己补上}//******************************************************************************            //name:             GUA_BLE_Uart_Send           //introduce:        蓝牙串口模块阻塞式发送数据     //parameter:        nGUA_USARTx: USART1 or USART2//                  npGUA_Data: :数据发送缓冲区的首地址//                  nGUA_Len: 数据长度//return:           none         //author:           甜甜的大香瓜                 //email:            897503845@qq.com     //QQ group          香瓜单片机之STM8/STM32(164311667)                  //changetime:       2017.01.15                     //******************************************************************************void GUA_BLE_Uart_Send(USART_TypeDef* GUA_USARTx, GUA_U8 *pGUA_Data, GUA_U8 nGUA_Len){//判断忙闲状态while(GPIO_ReadInputDataBit(GUA_BLE_UART_FLOW_PORT, GUA_BLE_UART_FLOW_PIN) == Bit_SET);//发送数据GUA_USARTx_Send(GUA_USARTx, pGUA_Data, nGUA_Len);    }//******************************************************************************            //name:             GUA_BLE_Uart_Init           //introduce:        蓝牙串口模块初始化         //parameter:        none                 //return:           none         //author:           甜甜的大香瓜                 //email:            897503845@qq.com     //QQ group          香瓜单片机之STM8/STM32(164311667)                  //changetime:       2017.01.15                      //******************************************************************************void GUA_BLE_Uart_Init(void){  //初始化IO  GUA_BLE_Uart_IO_Init();}

2)编写驱动头文件GUA_BLE_Uart.h(存放在“……\HARDWARE”)
//******************************************************************************          //name:             GUA_BLE_Uart.h          //introduce:        蓝牙串口透传驱动头文件(讯通科技)      //author:           甜甜的大香瓜                 //email:            897503845@qq.com     //QQ group          香瓜单片机之STM8/STM32(164311667)                  //changetime:       2017.01.15  //****************************************************************************** #ifndef _GUA_BLE_UART_H_#define _GUA_BLE_UART_H_/*********************宏定义************************/ #ifndef GUA_U8        typedef unsigned char GUA_U8;        #endif    #ifndef GUA_8        typedef signed char GUA_8;        #endif            #ifndef GUA_U16        typedef unsigned short GUA_U16;        #endif #ifndef GUA_16        typedef signed short GUA_16;        #endif               #ifndef GUA_U32        typedef unsigned long GUA_U32;        #endif #ifndef GUA_32        typedef signed long GUA_32;       #endif#ifndef GUA_U64    typedef unsigned long long GUA_U64;  #endif#ifndef GUA_64    typedef signed long long GUA_64;  #endif /*********************外部函数声明************************/ void GUA_BLE_Uart_AT_Cmd(GUA_U8 *pGUA_BLE_Uart_AT_Cmd, GUA_U8 nGUA_Num);void GUA_BLE_Uart_Send(USART_TypeDef* nGUA_USARTx, GUA_U8 *pGUA_Data, GUA_U8 nGUA_Len);void GUA_BLE_Uart_Init(void);#endif

3)工程中添加GUA_BLE_Uart.c


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



2、写中断服务函数(stm32f10x_it.c中)
1)添加头文件
#include "GUA_BLE_Uart.h"

2)修改串口中断服务函数

//******************************************************************************            //name:             USART2_IRQHandler           //introduce:        串口2中断服务函数         //parameter:        none                 //return:           none         //author:           甜甜的大香瓜                 //email:            897503845@qq.com     //QQ group          香瓜单片机之STM8/STM32(164311667)                  //changetime:       2016.10.17                     //******************************************************************************void USART2_IRQHandler(void){  GUA_U8 nGUA_Ret = 0;  GUA_U8 nGUA_Num = 0;  GUA_U8 aGUA_AT_Buf[2] = "AT";//接收串口数据  nGUA_Num = GUA_USARTx_Reveive(USART2, gGUA_USART2_rx_buf);                    //判断数据是否有效if(nGUA_Num > 0){//如果是AT指令if(memcmp(aGUA_AT_Buf, gGUA_USART2_rx_buf, 2) == 0){GUA_BLE_Uart_AT_Cmd(gGUA_USART2_rx_buf, nGUA_Num);  }else{nGUA_Ret = GUA_USARTx_Judgment(gGUA_USART2_rx_buf);//串口数据判断if(nGUA_Ret == GUA_TRUE){GUA_USARTx_Process(gGUA_USART2_rx_buf);//串口数据处理}else{gGUA_Function = GUA_FUNC_RETRUN_ERROR_EVENT;//空闲             }    }}}

3、在应用层中调用

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

#include "GUA_BLE_Uart.h"

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

  //串口模块初始化  GUA_BLE_Uart_Init(); 

3)数据发往app举例

GUA_BLE_Uart_Send(USART2, gGUA_USART2_tx_buf, GUA_USART2_TX_SIZE);   //发送应答   

七、注意事项
暂无

八、实验结果

仿真并全速运行,手机的BLE Tool软件能搜索到蓝牙模块在广播,连接上之后可使用两个通道进行读写:

1、数据传输服务 UUID:6940-0001-b5a3-f393-e0a9-e50e-24dc-ca99
1)写数据特性 UUID:6940-0002-b5a3-f393-e0a9-e50e-24dc-ca99
2)读数据特性 UUID:6940-0003-b5a3-f393-e0a9-e50e-24dc-ca99

app往写通道写入17个字节,则stm32能在串口中断服务函数中接收到该17个字节。(最大20字节一包)

stm32往串口写入17个字节,则app能在接收通道接收到该17个字节。(最大200字节一包,模块会自动将其分为20字节一包、每个连接事件发送4包)


因此,实验成功。



0 0
原创粉丝点击