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

本篇博文最后修改时间: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_PORT								GPIOA
#define GUA_BLE_UART_INT_PIN								GPIO_Pin_6
#define GUA_BLE_UART_INT_MODE								GPIO_Mode_IPU

//WAKEUP
#define GUA_BLE_UART_WAKEUP_PORT						GPIOA
#define GUA_BLE_UART_WAKEUP_PIN							GPIO_Pin_5
#define GUA_BLE_UART_WAKEUP_MODE						GPIO_Mode_Out_PP

//RESET
#define GUA_BLE_UART_RESET_PORT							GPIOA
#define GUA_BLE_UART_RESET_PIN							GPIO_Pin_0
#define GUA_BLE_UART_RESET_MODE							GPIO_Mode_Out_PP

//FLOW
#define GUA_BLE_UART_FLOW_PORT							GPIOA
#define GUA_BLE_UART_FLOW_PIN								GPIO_Pin_10
#define GUA_BLE_UART_FLOW_MODE							GPIO_Mode_IPU

//低功耗控制宏  
#define GUA_BLE_UART_WAKEUP_STATE_HALT			0	
#define GUA_BLE_UART_WAKEUP_STATE_ACTIVE		1	

/*********************内部函数声明************************/ 
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包)


因此,实验成功。



  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值