本篇博文最后修改时间: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
联系方式:[email protected]
香瓜BLE之CC2541群:127442605
香瓜BLE之CC2640群:557278427
香瓜BLE之Android群:541462902
四、实验前提
2、在进行本文步骤前,请先实现以下博文:
1)《STM32之NVIC》:http://blog.csdn.net/feilusia/article/details/52819709
2)《STM32之串口》:http://blog.csdn.net/feilusia/article/details/528195711、本文使用的蓝牙透传模块是什么?
答:本文使用的蓝牙透传模块是迅通科技的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: [email protected]
//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
/*********************宏定义************************/
//引脚宏定义
//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: [email protected]
//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: [email protected]
//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: [email protected]
//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: [email protected]
//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: [email protected]
//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: [email protected]
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2017.01.15
//******************************************************************************
void GUA_BLE_Uart_Init(void)
{
//初始化IO
GUA_BLE_Uart_IO_Init();
}
//******************************************************************************
//name: GUA_BLE_Uart.h
//introduce: 蓝牙串口透传驱动头文件(讯通科技)
//author: 甜甜的大香瓜
//email: [email protected]
//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
4)在MDK设置中添加驱动源文件路径
#include "GUA_BLE_Uart.h"
//******************************************************************************
//name: USART2_IRQHandler
//introduce: 串口2中断服务函数
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: [email protected]
//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"
//串口模块初始化
GUA_BLE_Uart_Init();
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包)
因此,实验成功。