当前位置: 首页 > article >正文

stm32蓝牙模块

1. 蓝牙模块概述

STM32 通常使用 HC-05HC-06 蓝牙模块来实现串口通信。这些模块通过 USART(或 UART)与 STM32 进行数据交换。它们支持 蓝牙 2.0 串行端口协议(SPP),适用于短距离通信。

2. 硬件连接
  • VCC:连接到 STM32 的 3.3V 或 5V 电源(根据模块要求)。
  • GND:连接到 STM32 的 GND。
  • TX:连接到 STM32 的 RX 引脚,用于接收来自蓝牙模块的数据。
  • RX:连接到 STM32 的 TX 引脚,用于发送数据到蓝牙模块。
  • KEY(仅 HC-05):用于进入配置模式,通常接高电平进入蓝牙模块设置模式。
3. 正确的 GPIO 配置

蓝牙模块的 RX 引脚应配置为 输入模式,而 TX 引脚应配置为 复用推挽输出

// USART TX 引脚配置为复用推挽输出
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;  // USART1 TX 引脚(PA9)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  // 复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

// USART RX 引脚配置为浮空输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  // USART1 RX 引脚(PA10)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  // 浮空输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
4. USART 配置

配置 STM32 的 USART 端口,通常使用波特率 9600,并启用发送和接收功能。

void USART_Init(void) {
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    // 使能 GPIO 和 USART 时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);

    // 配置 USART1 TX (PA9) 和 RX (PA10) 引脚
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 配置 USART1
    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    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_Tx | USART_Mode_Rx;
    USART_Init(USART1, &USART_InitStructure);
    USART_Cmd(USART1, ENABLE);  // 启用 USART1
}
5. 发送和接收数据

发送和接收数据的函数:

// 发送数据到蓝牙模块(通过 USART)
void USART_SendData(uint8_t data) {
    while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
    USART_SendData(USART1, data);
}

// 接收数据从蓝牙模块(通过 USART)
uint8_t USART_ReceiveData(void) {
    while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
    return USART_ReceiveData(USART1);
}
6. AT 命令设置

蓝牙模块支持 AT 命令,可以用于配置设备。例如:

AT 指令集的优点是非常简单易用,你只需要通过串口发送命令来配置蓝牙模块的工作模式。

2. 不支持 AT 指令的蓝牙模块

有些较为高级的蓝牙模块(如 ESP32nRF52840)可能不直接使用 AT 指令,而是通过 SDK固件开发工具 进行配置和编程。这些模块通常具有更强大的功能,可以直接通过编程来实现更复杂的无线通信。

总结

  • 设置波特率:AT+BAUD1(9600 波特率)
  • 设置模块名称:AT+NAMESTM32_BT(将蓝牙模块命名为 STM32_BT)
  • 设置配对密码:AT+PSWD1234(将配对密码设置为 1234)
  • 蓝牙模块并不都是通过 AT 指令 来配置的。尽管许多蓝牙模块(如 HC-05HC-06)使用 AT 指令集 进行配置,但并不是所有的蓝牙模块都支持 AT 指令。

    1. AT 指令集(AT Command Set)

    常见的 AT 指令集

  • 基本通信

    • AT:测试模块是否正常响应。
    • AT+VERSION:查询蓝牙模块的固件版本。
    • AT+NAME?:查询当前模块名称。
    • AT+NAME<name>:设置模块名称为 <name>,如 AT+NAMESTM32_BT
    • AT+PSWD<password>:设置模块的配对密码,例如 AT+PSWD1234
  • 波特率设置

    • AT+BAUD<rate>:设置波特率。常见的波特率设置有:
      • AT+BAUD1(9600)
      • AT+BAUD2(19200)
      • AT+BAUD3(38400)
      • AT+BAUD4(57600)
      • AT+BAUD5(115200)
    • AT+BAUD?:查询当前的波特率。
  • 连接和配对

    • AT+ROLE<mode>:设置模块的角色,mode 为 0 或 1:
      • AT+ROLE0(从设备)
      • AT+ROLE1(主设备)
    • AT+INQ:查询附近的蓝牙设备,返回设备列表。
    • AT+CONN<address>:连接到指定蓝牙地址。
    • AT+DISC:断开当前连接。
    • AT+PAIR<address>:配对到指定蓝牙地址。
    • AT+LINK:建立连接。
  • 工作模式

    • AT+INIT:初始化蓝牙模块。
    • AT+RESET:重置蓝牙模块。
    • AT+STATE:查询蓝牙模块的当前状态。
  • 其他常用命令

    • AT+CSYNC:同步蓝牙模块的设置。
    • AT+UART<rate>:设置串口的波特率,rate 为数值(如 9600)。
    • AT+DISC?:检查是否存在连接。
    • AT+LCONN:允许连接多个设备。
  • 许多蓝牙模块,如 HC-05HC-06,都支持通过 AT 指令 来设置模块的工作参数,例如:

  • 设置波特率AT+BAUD1(9600波特率)
  • 设置模块名称AT+NAMESTM32_BT(设置模块名称)
  • 设置配对密码AT+PSWD1234(设置配对密码)
  • ESP32:它具有 Wi-Fi 和蓝牙双模功能,可以通过 Arduino IDEEspressif IDF 来编程,而不需要依赖 AT 指令。
  • nRF52840:这款芯片也通常通过 SDK 开发,而非通过 AT 指令配置。它支持 蓝牙 5.0 和低功耗蓝牙(BLE)协议,可以使用 nRF5 SDK 进行开发。
  • HC-05 和 HC-06:通过 AT 指令 进行配置。
  • ESP32 和 nRF52840 等较为复杂的模块:通常不使用 AT 指令,而是通过编程实现更灵活的功能。
7. 蓝牙模块配对

确保在串口助手中输入正确的配对密码来成功配对 STM32 和其他蓝牙设备,建立通信后可以开始数据的发送和接收。

由于之前上传的文件已经过期,我无法访问它们。如果你希望我检查或者分析之前的文件,请重新上传相关文件。否则,我可以直接给你提供蓝牙模块的详细介绍和应用场景。

蓝牙模块应用场景

蓝牙模块在嵌入式系统中有广泛的应用,特别是在需要无线通信的项目中。以下是一些常见的蓝牙模块应用场景:

1. 智能家居
  • 应用:智能灯光、智能温控、门锁、家居安防等设备都可以通过蓝牙模块与手机或其他智能设备进行无线连接,实现远程控制。
  • 优点:蓝牙模块的低功耗、低成本和易于集成,使得它成为智能家居设备中无线通信的首选。
2. 健康监测
  • 应用:可穿戴设备(如智能手表、健康监测仪)通过蓝牙与手机同步健康数据,如心率、血糖等。
  • 优点:蓝牙低功耗模式(BLE)能够提供长时间的传输,非常适合健康监测类设备的应用。
3. 无线传感器网络(WSN)
  • 应用:无线传感器网络广泛应用于环境监测、农业灌溉、工业设备监控等场合,传感器通过蓝牙模块与中心处理单元进行通信。
  • 优点:蓝牙模块可以有效地在短距离内进行数据传输,适合低功耗设备。
4. 无线数据传输
  • 应用:蓝牙可以用于无线数据传输,如通过蓝牙模块在两台设备之间传输文件或数据流。
  • 优点:无需额外的复杂通信协议,蓝牙的即插即用特性,使得无线数据传输变得简单。
5. 遥控系统
  • 应用:蓝牙遥控器或通过手机应用控制的智能设备。
  • 优点:设备控制范围可在几十米内,配置简单,适合于大多数家庭和工业自动化应用。
6. 汽车电子
  • 应用:汽车内的蓝牙模块可用于实现车载音响系统、汽车钥匙、车载诊断设备与智能手机之间的通信。
  • 优点:蓝牙实现快速配对和连接,便于实现智能车载控制。

蓝牙模块芯片

常见的蓝牙模块芯片包括 HC-05HC-06ESP32nRF52840 等,它们在功能、通信范围、功耗等方面有所不同。

1. HC-05 蓝牙模块
  • 芯片:使用 BC417 芯片。
  • 类型:支持 蓝牙 2.0,即传统的串行端口协议(SPP)。
  • 作用:用于与手机或其他设备建立蓝牙连接,支持串口通信。
  • 区别:支持主从模式切换,适用于需要连接多个设备的场景。
  • 应用:智能家居、远程控制、数据传输。
2. HC-06 蓝牙模块
  • 芯片:使用 CSR BC04 芯片。
  • 类型:支持 蓝牙 2.0,但是仅支持 从设备模式,无法作为主设备连接其他设备。
  • 作用:和 HC-05 类似,但功能较为单一,主要用于从设备连接。
  • 区别:仅支持从设备模式,不支持主从模式切换。
  • 应用:适用于简单的无线串口通信,常见于一些单一设备通信场景。
3. ESP32 蓝牙模块
  • 芯片:基于 ESP32 芯片,支持 蓝牙 4.0(经典蓝牙)和 BLE(低功耗蓝牙)
  • 类型:支持 双模蓝牙,即 经典蓝牙(BR/EDR)低功耗蓝牙(BLE)
  • 作用:可以实现更复杂的无线通信,不仅支持串口通信,还支持 Wi-Fi 和蓝牙功能。
  • 区别:集成 Wi-Fi 和蓝牙双重功能,适合需要多功能通信的应用。
  • 应用:智能家居、物联网设备、远程监控、传感器数据收集。
4. nRF52840 蓝牙模块
  • 芯片:使用 nRF52840 芯片,支持 蓝牙 5.0
  • 类型:支持 低功耗蓝牙(BLE)
  • 作用:支持高数据传输速率,功耗极低,适合在电池供电的设备中使用。
  • 区别:支持蓝牙 5.0,具有更长的通信距离和更高的传输速度,比蓝牙 4.0 有更广泛的应用。
  • 应用:可穿戴设备、健康监测、物联网设备、智能家居。
5. BT800 系列蓝牙芯片(如 CSR8670)
  • 芯片:使用 CSR8670CSR8635 等芯片,支持 蓝牙 4.0
  • 类型:适合需要高质量音频传输的应用,如蓝牙音响、耳机等。
  • 作用:支持立体声音频传输和高级音频传输协议(A2DP)。
  • 区别:高品质音频传输,适用于耳机、音响等设备。
  • 应用:无线音频设备,蓝牙耳机,车载音响。

BT04-A 蓝牙模块简介

BT04-A 是一款广泛使用的 蓝牙 4.0 低功耗蓝牙(BLE)模块。它适用于短距离无线通信,通常用于物联网(IoT)设备和各种无线控制应用中。该模块广泛应用于智能家居、健康监测、工业自动化等领域。

主要特点
  • 蓝牙版本:支持 蓝牙 4.0(BLE),低功耗设计,非常适合低电池消耗的应用。
  • 工作电压:3.3V 或 5V(根据不同版本而定)。
  • 通信接口:使用 UART(串口通信) 接口进行数据传输。
  • 工作模式
    • 支持 主设备从设备 模式,能够与其他蓝牙设备进行配对通信。
    • 可通过 AT 指令 设置和控制模块的工作模式、名称、波特率等参数。
  • 数据速率:最高 1 Mbps 的数据传输速率。
  • 低功耗:支持 低功耗工作模式(Sleep Mode),适用于电池供电的嵌入式设备。
典型应用
  1. 智能家居:可用于控制灯光、空调、门锁等智能设备,通过蓝牙进行无线控制。
  2. 可穿戴设备:通过蓝牙与智能手机或其他设备进行数据交换,常见于智能手表、健康监测设备等。
  3. 物联网设备:在工业或家用设备中,使用蓝牙模块进行短距离无线通信。
  4. 汽车电子:蓝牙模块可以集成在车载系统中,提供无线音频播放、远程控制等功能。
AT 指令集(BT04-A)

BT04-A 蓝牙模块支持 AT 指令集,可以通过 AT 命令来配置模块的工作参数。例如,设置波特率、设备名称、密码等:

  • AT:检查模块是否能正常响应。
  • AT+NAME:设置模块名称,如 AT+NAMESmartDevice
  • AT+BAUD:设置波特率,如 AT+BAUD9600
  • AT+PSWD:设置配对密码,如 AT+PSWD1234
  • AT+ROLE:设置模块的角色(0:从设备,1:主设备)。
硬件连接
  • VCC:连接到电源(通常为 3.3V 或 5V)。
  • GND:接地。
  • TX:连接到主机的 RX 引脚,用于接收数据。
  • RX:连接到主机的 TX 引脚,用于发送数据。
模块的配置和使用
  1. AT 指令配置:首先通过串口连接到模块,使用 AT 指令进行配置,例如设置蓝牙名称、配对密码等。
  2. 数据传输:配置好模块后,可以通过串口发送和接收数据,与其他蓝牙设备(如智能手机)进行通信。
  3. 远程控制:通过蓝牙模块,可以实现无线控制功能,例如控制远程设备或获取远程设备数据。


总结

  • HC-05HC-06 适用于简单的串口通信,适合低成本项目。
  • ESP32 提供了蓝牙和 Wi-Fi 双模功能,适用于复杂的物联网项目。
  • nRF52840 支持蓝牙 5.0,适合需要长距离、低功耗蓝牙通信的应用。
  • BT800 系列 用于音频传输,适合无线音频设备。


项目:

手机通过蓝牙调试助手将AT指令发送到HC05模块,然后通过USART协议控制单片机外设状态

操作:

1配置蓝牙指令,将蓝牙HC05连接转窜口驱动至电脑,电脑向蓝牙模块发送AT初始化指令,

包括:基本配置(所有AT命令都必须换行)
正常模式下是9600,AT模式波特率固定为38400,8位数据位,1位停止位,无奇偶校验的通信方式
·发送 ATrin, 回复 OK
·发送AT+UART?Irin, 回复 +UART9600, 0, 0·发送AT+UART=115200, 0, 0lrin, 回复OK。通过上述步骤波特率即配置成功。
•发送AT+NAME="XXXX",修改蓝牙模块名称为xxxX
·发送AT+ROLE=0,蓝牙模式即为从模式
·发送 AT+CMODE=1,蓝牙连接模式为任意地址连接模式,也就是说该模块可以被任意蓝牙设备连接
•发送 AT+PSWD=1234, 蓝牙配对密码为1234
·发送AT+UART=9600, 0, 0, 蓝牙通信串口波特率为9600,停止位1位,无校验位
配置完成,需要重启一次即:AT+RESET

最后检查重启是否成功:发送AT回复OK说明重启成功

2配置单片机与蓝牙模块连接的USART以及GPIO的TX和RX引脚接口,

3配置USART的中断向量以及中断服务函数

4编写终端服务函数控制外设的程序

5打开手机蓝牙调试助手进行匹配发送指令到HC05上然后通过串口到单片机进行相应的操作

#include "stm32f10x.h"                  // Device header
#include "hc05.h"
#include  "Delay.h"
void hc05_Init()
{
	//配置GPIO
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
	GPIO_InitTypeDef   usart2_GPIO_Inisturt;
	//配置usart2的TX引脚PA2
	usart2_GPIO_Inisturt.GPIO_Mode =GPIO_Mode_AF_PP;
	usart2_GPIO_Inisturt.GPIO_Pin =GPIO_Pin_2 ;
	usart2_GPIO_Inisturt.GPIO_Speed =GPIO_Speed_50MHz;
	GPIO_Init( GPIOA, &usart2_GPIO_Inisturt);
	//配置usart2的RX引脚PA3
		usart2_GPIO_Inisturt.GPIO_Mode =GPIO_Mode_IPU ;
		usart2_GPIO_Inisturt.GPIO_Pin =GPIO_Pin_3;
	GPIO_Init( GPIOA, &usart2_GPIO_Inisturt);
	
	//配置usart结构体
	USART_InitTypeDef usart2_Initsturt;
	usart2_Initsturt.USART_BaudRate =115200;
	usart2_Initsturt.USART_HardwareFlowControl = USART_HardwareFlowControl_None  ;
	usart2_Initsturt.USART_Mode = USART_Mode_Rx | USART_Mode_Tx ;
	usart2_Initsturt.USART_Parity = USART_Parity_No  ;
	usart2_Initsturt.USART_StopBits =USART_StopBits_1   ;
	usart2_Initsturt.USART_WordLength =USART_WordLength_8b    ;
	USART_Init(USART2, &usart2_Initsturt);
	USART_ITConfig(USART2, USART_IT_RXNE, ENABLE );
	USART_Cmd(USART2, ENABLE);
	
	//配置NVIC中断向量嵌套
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	NVIC_InitTypeDef  nvic_inisturt;
	nvic_inisturt.NVIC_IRQChannel =USART2_IRQn;
	nvic_inisturt.NVIC_IRQChannelCmd =ENABLE;
	nvic_inisturt.NVIC_IRQChannelPreemptionPriority =1;
	nvic_inisturt.NVIC_IRQChannelSubPriority =1;
	NVIC_Init(&nvic_inisturt);
	
	
	
}

void USART2_IRQHandler()
{
 char str='a';
	if( USART_GetITStatus( USART2,  USART_IT_RXNE)!=RESET)
	{
		str=USART_ReceiveData(USART2);
		if(str=='0')
		{
			GPIO_ResetBits(GPIOA, GPIO_Pin_1);
		}
		if(str=='1')
		{
				GPIO_SetBits(GPIOA, GPIO_Pin_1);
			
		}
		if(str=='2')
		{
			while(1){
			GPIO_ResetBits(GPIOA, GPIO_Pin_1);
			delay_ms (100);
			GPIO_SetBits(GPIOA, GPIO_Pin_1);
			delay_ms (100);
			}
		}
		if(str=='3')
		{
			while(1)
			{
				
			GPIO_ResetBits(GPIOA, GPIO_Pin_1);
			delay_ms (10000);
			GPIO_SetBits(GPIOA, GPIO_Pin_1);
			delay_ms (10000);
				
			}
			
			
		}
	}
	
	
	
	
}
#include  "hc05.h"
uint32_t srambuff[SIZEOF];
uint16_t  num;
int main(void){

	Led_init();
	
   hc05_Init();
  
		while(1)
		{
			
}

}


http://www.kler.cn/a/538124.html

相关文章:

  • 使用Docker + Ollama在Ubuntu中部署deepseek
  • AF3 drmsd函数解读
  • 手动配置IP
  • Java 魔法:精准掌控 PDF 合同模板,指定页码与关键字替换签章日期
  • 元宇宙中的隐私与数据保护:Facebook 的挑战与机遇
  • 关于32位和64位程序的传参方法及虚拟机调试工具总结
  • 【Pytorch实战教程】让数据飞轮转起来:PyTorch Dataset与Dataloader深度指南
  • Linux网卡配置方法
  • 02为什么 OD门和 OC门输出必须加上拉电阻?
  • 机器学习-关于线性回归的表示方式和矩阵的基本运算规则
  • 【STM32F1】一种使用通用定时器实现各个通道独立输出不同指定数量脉冲的方法
  • 掌握内容中台与人工智能技术的新闻和应用场景分析
  • vue的响应式原理以及Vue 3.0在响应式原理上的优化方案
  • Blocked aria-hidden on an element because its descendant retained focus.
  • CASAIM与马来西亚 Perodua汽车达成合作,共推汽车制造质量升级
  • 【C++八股】const和define的区别
  • 在亚马逊云科技上云原生部署DeepSeek-R1模型(下)
  • Spring Boot 多数据源解决方案:dynamic-datasource-spring-boot-starter 的奥秘(上)
  • 基于HTML5 Canvas 的盖楼游戏
  • 大数据治理新纪元:全面解读前沿开源技术的力量
  • DeepSeek——DeepSeek模型部署实战
  • 使用 OpenGL ES 加载图片并写入纹理单元
  • 推理大模型DeepSeek迅速觉醒
  • LeetCode:63. 不同路径 II(DP Java)
  • 腾讯云TI平台×DeepSeek:开启AI超强体验,解锁部署秘籍
  • Linux iftop 命令使用详解