【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
四、实验前提
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: 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();}
//****************************************************************************** //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
4)在MDK设置中添加驱动源文件路径
#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包)
因此,实验成功。
- 【STM32】STM32之蓝牙透传模块(迅通科技PTR5518)
- 【STM32】STM32之蓝牙透传模块(昇润科技HY-254124 V8)
- 【STM32】STM32之蓝牙透传模块(昇润科技HY-254124 V8)
- STM32模块之NRF24L01
- 【STM32】STM32之霍尔传感器模块
- STM32之CC1100无线模块
- STM32控制HC-05蓝牙模块进行通信
- 【STM32】STM32之串口
- 【STM32】STM32之NVIC
- 【STM32】STM32之SWD
- 【STM32】STM32之LED
- 【STM32】STM32之flash
- STM32循迹+蓝牙小车
- stm32 蓝牙 智能小车
- 【STM32】STM32之限位开关
- 【STM32】STM32之电量采集
- 【STM32】STM32之红外接收
- 关于GSM模块的使用(STM32)
- 文章标题
- sas
- Android动画框架(三)----布局动画&Activity过渡动画
- SQL的多表查询(笛卡尔积原理)
- leetcode_169(主元素查找)
- 【STM32】STM32之蓝牙透传模块(迅通科技PTR5518)
- mysql索引详解
- POJ 3262 (贪心)
- 一个很详细的RxJava讲解,一看就懂
- UVa 11549 Calculator Conundrum (模拟+Floyd判环)
- 代码路上的自省
- PHP设计模式系列 - 装饰器
- zeromq 中的 zmq_bind
- WPF 无边框拖动