本实验利用信驰达的蓝牙模块进行串口的收发任务,stm32f103用的是串口1,手机APP用的是LighntBlue,蓝牙名字为Vence,stm32开发板为中国移动的OneNet开发板
①连线
蓝牙模块 stm32f103
VCC VCC
GND GND
EN PC10
RX TX1
TX RX1
BRTS GND
P04 PC7
P05 PC8
②蓝牙模块的工作模式
启动蓝牙模块需要将EN置0,BRTS置0,接上电源,就开始广播模式
当连接成功时,P04为高电平,P05为低电平
利用stm32启动的方式为,接上电源,按下Key1键盘,此时蓝灯,红灯,黄灯亮起;
红灯亮,绿灯灭,还没有连接成功,如果红灯灭,绿灯亮就代表已经连接成功
③stm32发送固定数据到手机APP
{0x67,0x6c,0x75,0x05,0x20}
通过按下stm32的按键1,也就是PC13口,会发送数据到手机,此时黄灯如果是灭的状态,就改为亮,如果是亮的状态就改为灭
④手机APP发送数据到stm32
如果手机发送的一个字节为0x01,通过代码判断是0x01的话,黄灯的状态就会取反
原理图:
启动状态指示灯:接通电源,按下key1,红、黄、蓝色同亮:
LightBlue搜索到Vence蓝牙名字:Vence
点击连接,连接成功后,指示灯变为蓝、黄、绿
app的0xFFE4端口开启接收数据,按下Key1,发送指令的数据{0x67,0x6c,0x75,0x05,0x20}到app,此时黄灯状态取反,APP收到数据
在APP的0XFFE9端口输入0x01,stm32判断后,黄灯的状态取反
stm32主函数代码:
//本设计利用信驰达进行蓝牙通信,stm32的PC10控制蓝牙模块的使能,蓝牙模块的工作电压范围在1.8-3.3V,具有低功耗
#include "stm32f10x.h"
#include "usart1.h"
#include "bluetooth.h"
#include "key.h"
#include "led.h"
u8 GLU[5] = {0x67,0x6c,0x75,0x05,0x20};
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断控制器分组设置
Key_Init(); //初始化按键
EXTI_Configuration();
Usart1_Init(115200); //设置串口1的波特率为115200bit
LedInit(); //初始化led
Delay_Init(); //初始化延迟函数
BlueTooth_Init(); //初始化蓝牙模块
USART_Cmd(USART1, DISABLE); //除能串口
while(1)
{
USART_ClearFlag( USART1, USART_FLAG_TC );
if(send_flag == 1)
{
USART_Cmd(USART1, ENABLE); //除能串口
GPIO_ResetBits(GPIOC,EN); //使能蓝牙模块
DelayMs(20); //启动蓝牙模块延迟20ms
while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7) != Bit_SET || GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8) != Bit_RESET);
Usart_SendString(USART1, GLU);
//GPIO_SetBits(GPIOC,EN); //发送完数据除能蓝牙模块
DelayMs(20); //启动蓝牙模块延迟20ms
send_flag = 0;
//USART_Cmd(USART1, DISABLE); //除能串口
}
}
}