5.HC-05蓝牙模块

配置蓝牙模块

注意需要将蓝牙模块接5v,实测接3.3v好像不太好使的样子

首先需要把蓝牙模块通过TTL串口模块接到我们的电脑,然后打开我们的串口助手

注意,我们现在是配置蓝牙模块,所以需要进入AT模式,需要按着蓝牙模块上的黑色小按钮再上电,这时候模块上的LED灯以一秒慢闪一次的速度闪烁着,如果你的LED是快速闪烁的可能就像上面说的一样接到3.3V去了

连接好后测试一下,波特率默认设置为38400

发送AT,模块会返回一个OK

我们给蓝牙修改一下名字,输入指令:

AT+NAME=自己想改的名字

例如: AT+NAME =BTtest

注意中间如果有空格的话会报错

改完后拔掉蓝牙模块再重新上电,这时候不用再按黑色小按钮了,这样就能进去配对连接啦

我们用手机蓝牙调试助手测试一下

在调试助手找到我们的模块后点击右边加号连接

连接后点击下方对话模式

然后输入内容点击发送

这时候我们的串口助手也能收到

也可以使用我们的串口助手进行发送

手机也能收到我们串口发过来的信息

这就表明我们的蓝牙模块已经配置成功啦,能插到单片机上进去使用了,将跳线帽接到蓝牙这边

初始化USART3

从原理图我们可以看到,将跳线帽接到蓝牙这边后USART3就变成了蓝牙配置

所以需要找到我们的USART3并配置,可以看到USART的TX和RX分别在PB10和PB11

配置USART基本都是:
RCC开启USART和GPIO的时钟
//使用结构体输出化:

GPIO_Init();

NVIC_Init();

USART_Init();
//开启串口接收中断:

USART_ITConfig();
//上电

USART_Cmd();

cpp 复制代码
void BT_UART3_Init(u32 bound )
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);	//使能USART3
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //GPIOB时钟

	//USART3_TX   GPIOB.10
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	//USART3_RX	  GPIOB.11
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB.11
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	//Usart3 NVIC 配置
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
	
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
	
	USART_Init(USART3, &USART_InitStructure); //初始化串口3
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断
    USART_Cmd(USART3, ENABLE);
}

在main.c定义串口3标志位

cpp 复制代码
int g_USART3_FLAG1 = 0; //串口3控制标志位

然后在BT.h里面extern一下

cpp 复制代码
extern int g_USART3_FLAG1; //串口3控制标志位

中断服务函数添加处理

cpp 复制代码
void USART3_IRQHandler(void)
{
	u8 Res;
	if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
	{	
		Res =USART_ReceiveData(USART3); //读取接收到的数据
		if(Res == 'A') g_USART3_FLAG1 = 1 ; //根据接受的数据 置为标志位
		if(Res == 'B')g_USART3_FLAG1 = 2 ;
	}
}

在上一节USART开启串口接收的函数里面把USART3的判断也加一下

cpp 复制代码
//串口接收判断
void Usatr_If(void)
{
		if(g_USART1_FLAG1 ==1 | g_USART3_FLAG1 ==1 )
		{
			if(temp != 'A')
			{
				printf("Is A,LED Open\n");
			}
			temp = 'A';
			LED = RESET;
		}
		if(g_USART1_FLAG1 ==2 | g_USART3_FLAG1 ==2)
		{
			if(temp != 'B')
			{
			printf("Is B,LED Close\n");
			}
			temp = 'B';
			LED = SET;
		}
		if(g_USART1_FLAG1 ==3 | g_USART3_FLAG1 ==3)
		{
			if(temp != 'C')
			{
			printf("Is C,LED Flashing\n");
			}
			temp = 'C';
			LED =!LED;
		}
}

测试

然后在main.c里面测试一下

cpp 复制代码
//开启串口接收
Usatr_If();

//初始化并设置波特率
BT_UART3_Init(115200);

烧录进单片机,程序现象就是:

输入A,串口打印Is A,LED Open,开启LED

输入B,串口打印Is B,LED Close,关闭LED

输入B,串口打印Is C,LED Flashing,闪烁LED

蓝牙模块测试

看log也打印正常,那么就证明蓝牙已经跟单片机调通啦

相关推荐
sramdram15 分钟前
MCU微控制器OA打印机方案
单片机·嵌入式硬件·mcu·mcu微控制器
科芯创展5 小时前
3.5A,60VIN,异步降压芯片,XZ1815
单片机·嵌入式硬件
Kuakewei8886 小时前
PW2609A在2.6A负载下压差0.14V,温升较3A工况低11°C
单片机·嵌入式硬件
Zyed6 小时前
[FreeRTOS]Day7项目介绍
stm32·单片机·嵌入式硬件
xuxie998 小时前
start7 电机闭环控制
单片机·嵌入式硬件
LCG元8 小时前
嵌入式开发踩坑排查实战:从 STM32 外设初始化到 Linux SPI 驱动的 15 类硬件疑难故障深度复盘
linux·stm32·单片机
piaoyiren9 小时前
基于 STM32F103 蓝牙遥控云台超声波避障小车
stm32·单片机·嵌入式硬件·蓝牙·超声波测距·直流电机
Zyed10 小时前
[FreeRTOS]Day8-Part1队列+红外遥控器玩游戏+旋转编码器玩游戏
stm32·单片机·玩游戏
十月的皮皮10 小时前
STM32从零到量产开发:四路继电器工业控制模块开发— Modbus RTU 通讯协议设计
stm32·stm32cubemx·hal库
JSMSEMI1111 小时前
JSM4430 30V N 沟道增强型 MOSFET
单片机·嵌入式硬件