4. HC05模块

您所在的位置:网站首页 蓝牙模块供电电路图解说明书 4. HC05模块

4. HC05模块

2024-04-25 22:09| 来源: 网络整理| 查看: 265

4.6.2. 例程介绍¶

在编写 HC05 模块驱动时,要考虑更改硬件环境的情况,我们可以用宏来定义连接到 HC05 模块的引脚,在更改或移植的时候只用改宏定义就可以。 以霸道开发板为例,我们把控制 HC05 模块引脚的宏定义到”bsp_hc05.h”文件中,定义PC4引脚连接到HC05 INT引脚,定义PG8引脚连接到HC05 KEY引脚。 而 IS_HC05_CONNECTED() 用于检查模块是否处于配对状态,实际上就是检查HC05 INT引脚的高低电平,若INT引脚为高电平,则表示HC05模块处于已配对连接状态。

bsp_hc05.h(霸道开发板例程)¶ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 // ... ... #define BLT_INT_GPIO_PORT GPIOC /* GPIO端口 */ #define BLT_INT_GPIO_CLK RCC_APB2Periph_GPIOC /* GPIO端口时钟 */ #define BLT_INT_GPIO_PIN GPIO_Pin_4 /* 连接到HC05 INT引脚的GPIO */ #define BLT_KEY_GPIO_PORT GPIOG /* GPIO端口 */ #define BLT_KEY_GPIO_CLK RCC_APB2Periph_GPIOG /* GPIO端口时钟 */ #define BLT_KEY_GPIO_PIN GPIO_Pin_8 /* 连接到HC05 KEY引脚的GPIO */ #define BLT_KEY_HIGHT GPIO_SetBits(BLT_KEY_GPIO_PORT, BLT_KEY_GPIO_PIN); #define BLT_KEY_LOW GPIO_ResetBits(BLT_KEY_GPIO_PORT, BLT_KEY_GPIO_PIN); //IS_HC05_CONNECTED用于检查模块是否处于配对状态 #define IS_HC05_CONNECTED() GPIO_ReadInputDataBit(BLT_INT_GPIO_PORT,BLT_INT_GPIO_PIN) // ... ...

霸道开发板的例程中是使用串口3与 HC05 通信,我们把串口3的引脚定义和相关配置定义到” bsp_usart_blt.h”头文件中,定义串口2发送引脚PB10,接收引脚为PB11,波特率为38400,等等。

bsp_usart_blt.h(霸道开发板例程)¶ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 //... ... #define BLT_USART_BAUD_RATE 38400 #define BLT_USARTx USART3 #define BLT_USART_APBxClock_FUN RCC_APB1PeriphClockCmd #define BLT_USART_CLK RCC_APB1Periph_USART3 #define BLT_USART_GPIO_APBxClock_FUN RCC_APB2PeriphClockCmd #define BLT_USART_GPIO_CLK (RCC_APB2Periph_GPIOB) #define BLT_USART_TX_PORT GPIOB #define BLT_USART_TX_PIN GPIO_Pin_10 #define BLT_USART_RX_PORT GPIOB #define BLT_USART_RX_PIN GPIO_Pin_11 #define BLT_USART_IRQ USART3_IRQn #define BLT_USART_IRQHandler USART3_IRQHandler //... ...

下面是HC05用到的串口3初始化函数 BLT_USART_Config。定义GPIO、USART结构体,使能串口2及对应的管脚时钟,配置 TX 引脚,GPIO_Mode设置为复用推挽输出, GPIO_Speed设置为50MHz,初始化 TX 引脚配置。配置 RX 引脚,GPIO_Mode设置为浮空输入,GPIO_Speed保留 TX 引脚的配置,然后初始化 RX 引脚配置。

USART_BaudRate为串口波特率,这里设置为38400,USART_WordLength为数据格式长度,设置字长为8位数据格式,设置一个停止位,无奇偶校验,无硬件数据流控制, 串口模式设置为收发模式,初始化串口3,最后就是使能串口的中断。

bsp_usart_blt.c(霸道开发板例程)¶ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 void BLT_USART_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; // 打开串口GPIO的时钟 BLT_USART_GPIO_APBxClock_FUN(BLT_USART_GPIO_CLK, ENABLE); // 打开串口外设的时钟 BLT_USART_APBxClock_FUN(BLT_USART_CLK, ENABLE); // 将USART Tx的GPIO配置为推挽复用模式 GPIO_InitStructure.GPIO_Pin = BLT_USART_TX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(BLT_USART_TX_PORT, &GPIO_InitStructure); // 将USART Rx的GPIO配置为浮空输入模式 GPIO_InitStructure.GPIO_Pin = BLT_USART_RX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(BLT_USART_RX_PORT, &GPIO_InitStructure); // 配置串口的工作参数 // 配置波特率 USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE; // 配置 针数据字长 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_Rx | USART_Mode_Tx; // 完成串口的初始化配置 USART_Init(BLT_USARTx, &USART_InitStructure); /* 配置中断优先级 */ BLT_NVIC_Configuration(); /* 使能串口2接收中断 */ USART_ITConfig(BLT_USARTx, USART_IT_RXNE, ENABLE); // 使能串口总线空闲中断 USART_ITConfig (BLT_USARTx, USART_IT_IDLE, ENABLE ); USART_Cmd(BLT_USARTx, ENABLE); USART_ClearFlag(BLT_USARTx, USART_FLAG_TC); }

在来看一下发送AT指令的函数HC05_Send_CMD实现。定义变量retry为3,表示发送AT指令的操作最多尝试3次, 在 while 循环里,首先使用宏 BLT_KEY_HIGHT 拉高KEY引脚,再用串口3发送AT命令到HC05,然后延时 10 ms等待HC05返回的数据接收完毕, 定义 len 为 HC05 反馈回来的数据长度,用于判断是否有数据,从串口3缓冲区中获取数据,判断到有数据之后就进行简单分析,即判断接收到的数据当中是否包含”OK”的字符,如果包含则表明AT命令发送成功。

bsp_hc05.c(霸道开发板例程)¶ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 /** * @brief 向HC05模块发送命令并检查OK。只适用于具有OK应答的命令,最长等待5s直到收到OK * @param cmd:命令的完整字符串,需要加\r\n。 * @param clean 命令结束后是否清除接收缓冲区,1 清除,0 不清除 * @template 复位命令: HC05_Send_CMD("AT+RESET\r\n",1); * @retval 0,设置成功;其他,设置失败. */ uint8_t HC05_Send_CMD(char* cmd,uint8_t clean) { uint8_t retry=3; uint32_t i; uint16_t len; char * redata; while(retry--) { BLT_KEY_HIGHT; Usart_SendString(HC05_USART,(uint8_t *)cmd); i=500; //初始化i,最长等待5秒 hc05_delay_ms(10); // do { redata = get_rebuff(&len); if(len>0) { if(strstr(redata,"OK")) { HC05_DEBUG("send CMD: %s",cmd); //打印发送的蓝牙指令和返回信息 HC05_DEBUG("recv back: %s",redata); if(clean==1) clean_rebuff(); //BLT_KEY_LOW; return 0; //AT指令成功 } } hc05_delay_ms(10); }while( --i ); //继续等待 HC05_DEBUG("send CMD: %s",cmd); //打印发送的蓝牙指令和返回信息 HC05_DEBUG("recv back: %s",redata); HC05_DEBUG("HC05 send CMD fail %d times", retry); //提示失败重试 } //BLT_KEY_LOW; HC05_DEBUG("HC05 send CMD fail "); if(clean==1) clean_rebuff(); return 1; //AT指令失败 }

我们来看看主函数,主函数里面主要是初始化和配置,然后进入主循环。 首先初始化开发板上的一些硬件,比如调试串口、灯、按键等,还有调用 HC05_Init 函数初始化蓝牙模块(包括了GPIO和蓝牙串口)。 接着重复调用 HC05_Send_CMD 函数、传入不同命令参数来配置蓝牙模块,比如将HC05设置为从模式、蓝牙名字为”HC05_SLAVE”等。

main.c(霸道开发板例程)¶ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 /*各种命令测试演示,默认不显示。 *在bsp_hc05.h文件把HC05_DEBUG_ON 宏设置为1, *即可通过串口调试助手接收调试信息*/ HC05_Send_CMD("AT+VERSION?\r\n",1); HC05_Send_CMD("AT+ADDR?\r\n",1); HC05_Send_CMD("AT+UART?\r\n",1); HC05_Send_CMD("AT+CMODE?\r\n",1); HC05_Send_CMD("AT+STATE?\r\n",1); HC05_Send_CMD("AT+ROLE=0\r\n",1); /*初始化SPP规范*/ HC05_Send_CMD("AT+INIT\r\n",1); HC05_Send_CMD("AT+CLASS=0\r\n",1); HC05_Send_CMD("AT+INQM=1,9,48\r\n",1); /*设置模块名字*/ sprintf(hc05_nameCMD,"AT+NAME=%s\r\n",hc05_name); HC05_Send_CMD(hc05_nameCMD,1); HC05_INFO("本模块名字为:%s ,模块已准备就绪。",hc05_name);

最后进入主循环,在主循环里调用 ATCMD_Test 测试函数,这个函数主要就是处理用户输入到串口调试助手发送给开发板的数据、并且将有效的AT命令数据转发到HC05蓝牙模块, 然后接收到HC05蓝牙模块返回的信息之后再发送该信息到串口调试助手以便用户查看。详细代码请看例程。

注意

注:1. 取消注释 bsp_hc05.h 文件里面 ENABLE_LCD_DISPLAY 宏,可以切换到带LCD液晶显示的模式。2. 将 bsp_hc05.h 文件里面 HC05_DEBUG_ON 宏定义设置为 1,可以让程序输出详细的调试信息,方便了解程序底层和调试。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3