加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 相关推荐
申请入驻 产业图谱

【CW32模块使用】HC05蓝牙模块

5小时前
249
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

HC-05 蓝牙串口通信模块,是基于 Bluetooth Specification V2.0 带 EDR 蓝牙协议的数传模块。无线工作频段为 2.4GHz ISM,调制方式是 GFSK。模块最大发射功率为 4dBm,接收灵敏度-85dBm,板载 PCB 天线,可以实现 10 米距离通信。模块采用邮票孔封装方式,模块大小 27mm×13mm×2mm,方便客户嵌入应用系统之内,自带 LED 灯,可直观判断蓝牙的连接状态。模块采用 CSR 的 BC417 芯片,支持 AT 指令,用户可根据需要更改角色(主、从模式)以及串口波特率、设备名称等参数,使用灵活。

模块来源

模块实物展示:

规格参数

工作电压:3.6-6V

供电电流:40mA

发射功率:4dBm(最大)

参考距离:10米

控制方式:串口

管脚数量:6 Pin(2.54mm间距排针

以上信息见厂家资料文件

移植过程

我们的目标是将例程移植至CW32F030C8T6开发板上【实现手机通过蓝牙传输数据的功能】。首先要获取资料,查看数据手册应如何实现读取数据,再移植至我们的工程。

3.1查看资料

使用HC05蓝牙模块之前,需要知道蓝牙模块的波特率,这样我们才能控制它。将蓝牙模块与USB转TTL串口调试模块进行连接,在插入电脑之前,按住模块上的按键再通电,插入电脑通电后此时模块上的灯是慢闪,HC-05进入AT命令模式,默认波特率是38400;此模式我们叫原始模式。原始模式下一直处于AT命令模式状态。

进入AT命令模式之后,最主要的是设置模式为从机控制,即等待手机去连接我们蓝牙模块的蓝牙,主要由手机控制。发送指令时需要注意,每一条指令都要加上rn或者勾选发送新行,不然是识别不到命令的。

USB转TTL串口调试模块

AT指令的发送

 

关键指令说明

连接手机成功之后,模块上的灯进入慢闪状态,说明已经连接成功。

在手机端打开蓝牙通信软件,测试能否与电脑互传数据。

3.2引脚选择

想要使用uart串口,需要确定使用的引脚是否有串口外设功能,可以通过用户手册进行查看。在用户手册的第146页。

这里选择使用PA2和PA3的附加串口2功能。

有串口1功能的引脚

模块接线图

注意

STATE引脚为连接成功指示引脚, 连接手机成功时输出高电平,通过将PA1设置为输入模式,读取STATE引脚的电平状态,当为高电平时,说明有手机连接该蓝牙模块成功;当为低电平时,说明没有手机连接。

 

3.3移植至工程

移植步骤中的导入.c和.h文件与【CW32模块使用】DHT11温湿度传感器相同,只是将.c和.h文件更改为bsp_bluetooth.c与bsp_bluetooth.h。这里不再过多讲述,移植完成后面修改相关代码。

在文件bsp_bluetooth.c中,编写如下代码。

/* * Change Logs: * Date           Author       Notes * 2024-06-21     LCKFB-LP    first version */
#include "bsp_bluetooth.h"#include "stdio.h"
unsigned char Bluetooth_ConnectFlag = 0; //蓝牙连接状态 = 0没有手机连接   = 1有手机连接unsigned char BLERX_BUFF[BLERX_LEN_MAX];unsigned char BLERX_FLAG = 0;unsigned char BLERX_LEN = 0;
/************************************************************ * 函数名称:Bluetooth_GPIO_Init * 函数说明:蓝牙RXTX引脚初始化 * 型    参:bund=串口波特率 * 返 回 值:无 * 备    注:无*************************************************************/void Bluetooth_GPIO_Init(unsigned int bund){    GPIO_InitTypeDef GPIO_InitStruct; // GPIO初始化结构体
    BSP_BLUETOOTH_GPIO_RCC_ENABLE();        // 使能GPIO时钟    BSP_BLUETOOTH_UART_RCC_ENABLE();        // 使能UART时钟
    GPIO_InitStruct.Pins = BSP_BLUETOOTH_TX_PIN;         // GPIO引脚    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;          // 推挽输出    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;             // 输出速度高    GPIO_Init(BSP_BLUETOOTH_GPIO_PORT, &GPIO_InitStruct);// 初始化
    GPIO_InitStruct.Pins = BSP_BLUETOOTH_RX_PIN;         // GPIO引脚    GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP;       // 上拉输入    GPIO_Init(BSP_BLUETOOTH_GPIO_PORT, &GPIO_InitStruct);// 初始化
    BSP_BLUETOOTH_AF_UART_TX(); // UART_TX复用    BSP_BLUETOOTH_AF_UART_RX(); // UART_RX复用
    // 配置UART    USART_InitTypeDef USART_InitStructure;
    USART_InitStructure.USART_BaudRate = bund;                                     // 波特率    USART_InitStructure.USART_Over = USART_Over_16;                     // 配置USART的过采样率。    USART_InitStructure.USART_Source = USART_Source_PCLK;               // 设置时钟源    USART_InitStructure.USART_UclkFreq = 64000000;                      //设置USART时钟频率(和主频一致即可)    USART_InitStructure.USART_StartBit = USART_StartBit_FE;             //RXD下降沿开始    USART_InitStructure.USART_StopBits = USART_StopBits_1;              // 停止位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(BSP_BLUETOOTH_UART, &USART_InitStructure);               // 初始化串口2
    // 优先级,无优先级分组    NVIC_SetPriority(BSP_BLUETOOTH_IRQ, 0);
    // UARTx中断使能    NVIC_EnableIRQ(BSP_BLUETOOTH_IRQ);
    // 使能UARTx RC中断    USART_ITConfig(BSP_BLUETOOTH_UART, USART_IT_RC, ENABLE);

}
/****************************************************************** * 函 数 名 称:BLE_Send_Bit * 函 数 说 明:向蓝牙发送单个字符 * 函 数 形 参:ch=ASCII字符 * 函 数 返 回:无 * 作       者:LC * 备       注:无******************************************************************/void BLE_Send_Bit(unsigned char ch){    // 发送一个字节    USART_SendData(BSP_BLUETOOTH_UART, (uint8_t)ch);
    // 等待发送完成    while( RESET == USART_GetFlagStatus(BSP_BLUETOOTH_UART, USART_FLAG_TXE) ){}}
/****************************************************************** * 函 数 名 称:BLE_send_String * 函 数 说 明:向蓝牙发送字符串 * 函 数 形 参:str=发送的字符串 * 函 数 返 回:无 * 作       者:LC * 备       注:无******************************************************************/void BLE_send_String(unsigned char *str){        while( str && *str ) // 地址为空或者值为空跳出        {                BLE_Send_Bit(*str++);        }}
/****************************************************************** * 函 数 名 称:Clear_BLERX_BUFF * 函 数 说 明:清除串口接收的数据 * 函 数 形 参:无 * 函 数 返 回:无 * 作       者:LC * 备       注:无******************************************************************/void Clear_BLERX_BUFF(void){        BLERX_LEN = 0;        BLERX_FLAG = 0;}
/****************************************************************** * 函 数 名 称:Bluetooth_Link_Gpio_Init * 函 数 说 明:蓝牙连接成功指示引脚state初始化 * 函 数 形 参:无 * 函 数 返 回:无 * 作       者:LC * 备       注:无******************************************************************/void Bluetooth_Link_Gpio_Init(void){        GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.Pins = BLUETOOTH_LINK_GPIO;            // GPIO引脚    GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP;               // 上拉输入    GPIO_Init(BSP_BLUETOOTH_GPIO_PORT, &GPIO_InitStruct);  // 初始化}
/****************************************************************** * 函 数 名 称:Bluetooth_Init * 函 数 说 明:蓝牙初始化 * 函 数 形 参:无 * 函 数 返 回:无 * 作       者:LC * 备       注:默认波特率为9600******************************************************************/void Bluetooth_Init(void){    Bluetooth_GPIO_Init(9600);    Bluetooth_Link_Gpio_Init();    #if        DEBUG         //在调试时,通过AT命令已经设置好模式        printf("Bluetooth_Init succeed!rn");
    #endif}
/****************************************************************** * 函 数 名 称:Get_Bluetooth_ConnectFlag * 函 数 说 明:获取手机连接状态 * 函 数 形 参:无 * 函 数 返 回:返回1=已连接                返回0=未连接 * 作       者:LC * 备       注:使用该函数前,必须先调用 Bluetooth_Mode 函数******************************************************************/unsigned char Get_Bluetooth_ConnectFlag(void){        return Bluetooth_ConnectFlag;}
/****************************************************************** * 函 数 名 称:Bluetooth_Mode * 函 数 说 明:判断蓝牙模块的连接状态 * 函 数 形 参:无 * 函 数 返 回:无 * 作       者:LC * 备       注:未连接时STATE低电平   连接成功时STATE高电平******************************************************************/void Bluetooth_Mode(void){        static char flag = 0;        //如果没有手机连接        if( DISCONNECT == BLUETOOTH_LINK )        {        //连接状态为未连接                Bluetooth_ConnectFlag = 0;        //如果之前是连接状态                if( flag == 1 )                {                                flag = 0;//修改状态                }                return;        }        //如果手机已经连接        if( CONNECT == BLUETOOTH_LINK )        {                Bluetooth_ConnectFlag = 1;                                                //如果之前是断开状态                if( flag == 0 )                {                                flag = 1;//修改状态                }        }}
/****************************************************************** * 函 数 名 称:Receive_Bluetooth_Data * 函 数 说 明:接收蓝牙数据 * 函 数 形 参:无 * 函 数 返 回:无 * 作       者:LC * 备       注:无******************************************************************/void Receive_Bluetooth_Data(void){        if( BLERX_FLAG == 1 )//接收到蓝牙数据        {                //显示蓝牙发送过来的数据                printf("data = %srn",BLERX_BUFF);
                Clear_BLERX_BUFF();//清除接收缓存        }
}
/****************************************************************** * 函 数 名 称:Send_Bluetooth_Data * 函 数 说 明:向蓝牙模块发送数据 * 函 数 形 参:dat=要发送的字符串 * 函 数 返 回:无 * 作       者:LC * 备       注:(如果手机连接了蓝牙,就是向手机发送数据)******************************************************************/void Send_Bluetooth_Data(char *dat){    //获取蓝牙状态    Bluetooth_Mode();    //如果手机已经连接    if( Bluetooth_ConnectFlag == 1 )    {        //发送数据        BLE_send_String((unsigned char*)dat);    }}
/****************************************************************** * 函 数 名 称:BLE_USART_IRQHandler * 函 数 说 明:连接蓝牙的串口中断服务函数 * 函 数 形 参:无 * 函 数 返 回:无 * 作       者:LC * 备       注:无******************************************************************/void BSP_BLUETOOTH_IRQHandler(void){    if(USART_GetITStatus(BSP_BLUETOOTH_UART, USART_IT_RC) == SET)    {        // 检查是否还有空间接收新数据        if (BLERX_LEN < BLERX_LEN_MAX - 1) // 保留一个字符的空间用于''        {            BLERX_BUFF[BLERX_LEN++] = USART_ReceiveData(BSP_BLUETOOTH_UART); // 接收数据        }        else        {            USART_ReceiveData(BSP_BLUETOOTH_UART); // 读取DR寄存器以清除中断标志位,但不保存数据        }
        BLERX_BUFF[BLERX_LEN] = '';  // 确保字符串正确结束        BLERX_FLAG = 1;  // 设置接收完成标志位
        USART_ClearITPendingBit(BSP_BLUETOOTH_UART, USART_IT_RC); // 清除中断标志位    }}

在文件bsp_bluetooth.h中,编写如下代码。

/* * Change Logs: * Date           Author       Notes * 2024-06-21     LCKFB-LP    first version */
#ifndef _BSP_BLUETOOTH_H_#define _BSP_BLUETOOTH_H_
#include "board.h"#include "string.h"
//是否开启串口0调试     1开始  0关闭#define     DEBUG   1

#define  BLERX_LEN_MAX  200
#define BSP_BLUETOOTH_GPIO_RCC_ENABLE()  __RCC_GPIOA_CLK_ENABLE()   // 串口TX的端口时钟#define BSP_BLUETOOTH_UART_RCC_ENABLE()  __RCC_UART2_CLK_ENABLE()   // 串口2的时钟
#define BSP_BLUETOOTH_AF_UART_TX()       PA02_AFx_UART2TXD()#define BSP_BLUETOOTH_AF_UART_RX()       PA03_AFx_UART2RXD()
#define BSP_BLUETOOTH_GPIO_PORT          CW_GPIOA          // GPIO的端口
#define BSP_BLUETOOTH_TX_PIN             GPIO_PIN_2        // 串口TX的引脚#define BSP_BLUETOOTH_RX_PIN             GPIO_PIN_3        // 串口RX的引脚
#define BSP_BLUETOOTH_UART               CW_UART2          // 串口2#define BSP_BLUETOOTH_IRQ                UART2_IRQn        // 串口2中断#define BSP_BLUETOOTH_IRQHandler         UART2_IRQHandler  // 串口2中断服务函数
//连接成功指示引脚#define BLUETOOTH_LINK_GPIO              GPIO_PIN_1
#define BLUETOOTH_LINK                   GPIO_ReadPin(BSP_BLUETOOTH_GPIO_PORT, BLUETOOTH_LINK_GPIO)
#define CONNECT             1       //蓝牙连接成功#define DISCONNECT          0       //蓝牙连接断开
extern unsigned char BLERX_BUFF[BLERX_LEN_MAX];extern unsigned char BLERX_FLAG;extern unsigned char BLERX_LEN;

void Bluetooth_Init(void);unsigned char Get_Bluetooth_ConnectFlag(void);void Bluetooth_Mode(void);void Receive_Bluetooth_Data(void);void BLE_send_String(unsigned char *str);#endif

移植验证

在自己工程中的main主函数中,编写如下。

/* * Change Logs: * Date           Author       Notes * 2024-06-21     LCKFB-LP    first version */#include "board.h"#include "stdio.h"#include "bsp_uart.h"#include "bsp_bluetooth.h"
int32_t main(void){    board_init();        // 开发板初始化
    uart1_init(115200);        // 串口1波特率115200
    Bluetooth_Init();
    printf("HC05 Start--->rn");
    while(1)    {        //如果接收到蓝牙数据则通过串口2显示        Receive_Bluetooth_Data();
        //发送数据到蓝牙        BLE_send_String((uint8_t *)"立创·地文星·CW32F030C8T6开发板");
        delay_ms(1000);
    }}

移植现象:读取手机通过蓝牙模块发送过来的数据,并通过串口1发送至电脑。

模块移植成功案例代码:

链接:https://pan.baidu.com/s/1IYo5SCmLftfapmVCgjDjlA?pwd=LCKF

提取码:LCKF

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录

以开放、共享、互助为理念,致力于构建武汉芯源半导体CW32系列MCU生态社区。无论是嵌入式MCU小自还是想要攻破技术难题的工程师,亦或是需求解决方案的产品经理都可在CW32生态社区汲取营养、共同成长。

B站