
目录一、硬件平台二、HC-05蓝牙模块简介三、硬件连接四、HC-05蓝牙模块仿真电路连接五、HC-05蓝牙模块的串口配置六、HC-05蓝牙模块AT指令一、硬件平台STM32F103C8主控芯片、STM32F407主控芯片、HC-05蓝牙模块二、HC-05蓝牙模块简介HC-05蓝牙模块: 功能经典蓝牙2.0串口透传模块支持主从一体。 AT命令模式上电前或将AT引脚拉高3.3V此时LED慢闪约1Hz。 通信参数默认波特率38400部分版本为 9600、8数据位、1停止位、无校验。 工作电压3.3V逻辑电平3.3V可直接与STM32串口连接。三、硬件连接USART1连接HC-05蓝牙模块 PA9TX→ HC-05_RX PA10RX→ HC-05_TX 共地。四、HC-05蓝牙模块仿真电路连接五、HC-05蓝牙模块的串口配置/** * brief 初始化 USART1PA9-TX, PA10-RX * param bound 波特率如 115200 * details * - 配置 GPIO 为复用推挽TX和浮空输入RX * - 使能接收中断RXNE * - NVIC 配置抢占优先级 3子优先级 3 * - 支持 printf 重定向通过 fputc。 * note * - 接收中断服务函数需用户完善数据处理逻辑 * - 当前 ISR 仅清除中断标志防止死循环。 */ void uart_init(u32 bound) { //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //使能USART1GPIOA时钟 //USART1_TX GPIOA.9 GPIO_InitStructure.GPIO_Pin GPIO_Pin_9; //PA.9 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOA, GPIO_InitStructure); //初始化GPIOA.9 //USART1_RX GPIOA.10初始化 GPIO_InitStructure.GPIO_Pin GPIO_Pin_10; //PA10 GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_Init(GPIOA, GPIO_InitStructure); //初始化GPIOA.10 //Usart1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel USART1_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 初始化设置 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(USART1, USART_InitStructure); //初始化串口1 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //开启串口接受中断 USART_Cmd(USART1, ENABLE); //使能串口1 } /** * brief USART1 全局中断服务函数 * details * - 仅处理 RXNE接收非空中断 * - **当前仅清除中断标志未读取 DR 或更新缓冲区** * - 用户应在此处添加接收逻辑如存入 USART_RX_BUF。 * warning * - 必须读取 DR 或清除标志否则会重复进入中断 * - 建议在 ISR 中读取 USART_ReceiveData(USART1) 避免数据丢失。 */ void USART1_IRQHandler(void) //串口1中断服务程序 { if (USART_GetITStatus(USART1, USART_IT_RXNE) ! RESET) //接收中断 { USART_ClearITPendingBit(USART1, USART_IT_RXNE); } }/** * brief 重定向 fputc 到 USART1支持 printf * param ch 要发送的字符 * param f 文件指针忽略 * return 发送的字符 * note 此函数被 printf 自动调用阻塞直到发送完成。 */ int fputc(int ch, FILE *f) { while((USART1-SR 0x40)0);//循环发送,直到发送完毕 USART1-DR (u8)ch; return ch; }六、HC-05蓝牙模块AT指令HC-05蓝牙模块测试AT指令必须确保HC-05处于AT命令模式。 方法1上电前将AT引脚接高电平3.3V。 方法2使用默认波特率38400部分版本支持 9600。 发送的指令列表 AT— 测试通信应返回OK ATRESET— 复位模块 ATVERSION— 查询固件版本 ATORGL— 恢复出厂设置 ATADDR— 查询 MAC 地址 ATNAMEMaster-BLE— 设置设备名称 ATNAME— 查询名称 ATROLE— 查询角色0从机1主机 ATCLASS— 查询设备类 ATIAC— 查询访问码 ATINQM— 查询查询模式 ATPSWD4321— 设置配对密码 ATPSWD— 查询密码 ATUART— 查询串口参数 ATCMODE— 查询连接模式/** * brief HC-05蓝牙模块AT指令测试 * retval 无 */ void HC05_AT_Test() { // 初始化 USART波特率 38400HC-05 AT 模式常用波特率 uart_init(38400); // 1. 测试指令验证通信是否正常应返回 OK printf(AT\r\n); delay_ms(200); // 等待模块响应HC-05 响应较快 // 2. 模块复位重启蓝牙模块 printf(ATRESET\r\n); delay_ms(200); // 3. 获取固件版本信息 printf(ATVERSION\r\n); delay_ms(200); // 4. 恢复出厂设置清除所有自定义配置 printf(ATORGL\r\n); delay_ms(200); // 5. 查询模块 MAC 地址唯一标识 printf(ATADDR\r\n); delay_ms(200); // 6. 设置蓝牙设备名称为 “Master-BLE” //注意HC-05是经典蓝牙Bluetooth 2.0非BLE低功耗蓝牙 printf(ATNAMEMaster-BLE\r\n); delay_ms(200); // 7. 查询当前设备名称验证是否设置成功 printf(ATNAME\r\n); delay_ms(200); // 8. 查询模块角色0从机, 1主机, 2回环 printf(ATROLE\r\n); delay_ms(200); // 9. 查询设备类CoD, Class of Device printf(ATCLASS\r\n); delay_ms(200); // 10. 查询访问码Inquiry Access Code printf(ATIAC\r\n); delay_ms(200); // 11. 查询查询模式Inquiry Mode printf(ATINQM\r\n); delay_ms(200); // 12. 设置配对密码PIN 码为 4321 printf(ATPSWD4321\r\n); // 13. 查询当前配对密码 printf(ATPSWD\r\n); delay_ms(200); // 14. 查询串口参数波特率、停止位、校验位 printf(ATUART\r\n); delay_ms(200); // 15. 查询连接模式0指定地址连接, 1任意地址连接 printf(ATCMODE\r\n); delay_ms(200); }