0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CW32模块使用 HC05蓝牙模块

CW32生态社区 来源:CW32生态社区 作者:CW32生态社区 2025-01-23 12:57 次阅读

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

一、模块来源

模块实物展示:

wKgZPGeRzE6ALCgjAAAlKCxocWM37.webp

二、规格参数

工作电压:3.6-6V

供电电流:40mA

发射功率:4dBm(最大)

参考距离:10米

控制方式:串口

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

以上信息见厂家资料文件

三、移植过程

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

3.1查看资料

wKgZO2eRzE-AGgzpAAA9TLq_pT459.webp

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

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

wKgZPGeRzE-AMLV6AABO1N1pUao17.webp

USB转TTL串口调试模块

wKgZO2eRzE-ARITAAACInszoX5k31.webp

AT指令的发送

关键指令说明

wKgZPGeRzE-AIba7AACm5HwTFos06.webp

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

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

wKgZO2eRzFCAH6SaAAAQWJ9ewrg74.webp

3.2引脚选择

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

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

wKgZPGeRzFCAKKXtAAChJs2IQ-k03.webp

有串口1功能的引脚

wKgZPGeRzFaABbw7AACQgFEFsuY74.webp

模块接线图

注意

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

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 蓝牙模块
    +关注

    关注

    30

    文章

    586

    浏览量

    55944
  • CW32
    +关注

    关注

    1

    文章

    218

    浏览量

    767
收藏 人收藏

    相关推荐

    CW32模块使用 红外接收模块

    一、模块来源 模块实物展示:   资料链接:https://pan.baidu.com/s/1dEWVMIFDWb7k1NcsRy5hHA 资料提取码:uucv 二、规格参数 1.CR2025环保
    的头像 发表于 01-23 13:16 130次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>模块</b>使用 红外接收<b class='flag-5'>模块</b>

    CW32模块使用 EC-01G NBIOT+GPS模块

    一、模块来源 模块实物展示: 资料链接:https://docs.ai-thinker.com/nb-iot 二、规格参数 工作电压:3.0V-3.6V 工作电流:IMAX = 170mA 模块尺寸
    的头像 发表于 01-23 13:12 128次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>模块</b>使用 EC-01G NBIOT+GPS<b class='flag-5'>模块</b>

    CW32模块使用 ESP01S WIFI模块

    ESP8266系列无线模块是安信可科技自主研发设计的一系列高性价比WiFisOC模组。该系列模块支持标准的IEEE802.11 b/g/n 协议,内置完整的TCP/IP协议栈。用户可以使用该系列模块
    的头像 发表于 01-23 13:08 149次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>模块</b>使用 ESP01S WIFI<b class='flag-5'>模块</b>

    CW32模块使用 NEO-6M GPS模块

    NEO—6M/7M GPS模块,具有高灵敏度、低功耗、小型化、高追踪灵敏度,大大扩大了其定位的覆盖面,在普通GPS接收模块不能定位的地方,如狭窄都市天空下、密集的丛林环境,NEO-6M都能高精度定位
    的头像 发表于 01-23 13:06 163次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>模块</b>使用 NEO-6M GPS<b class='flag-5'>模块</b>

    CW32模块使用 红外解码编码模块

    红外解码编码模块采用MCU+红外发射头+红外接收头,引出MCU的串口连接其他需要红外控制的设备,可作为红外无线数据通信、数据传输等功能。具备NEC格式红外编码发射功能,可控制99%的NEC红外
    的头像 发表于 01-23 12:56 145次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>模块</b>使用 红外解码编码<b class='flag-5'>模块</b>

    CW32模块使用 BMP180气压传感器

    一、模块来源 模块实物展示:   资料下载链接: https://pan.baidu.com/s/1miTIphm 二、规格参数 工作电压:1.8~3.6V 工作电流:0.1~1000uA 温度精度
    的头像 发表于 12-05 12:06 269次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>模块</b>使用 BMP180气压传感器

    stm32蓝牙模块连接方法

    选择蓝牙模块 首先,需要选择一个适合的蓝牙模块。市面上常见的蓝牙模块
    的头像 发表于 11-19 15:49 950次阅读

    CW32模块使用 TTP224触摸传感器

    模块是一个基于触摸检测IC(TTP223B)的电容式点动型触摸开关模块。常态下,模块输出低电平,模式为低功耗模式;当用手指触摸相应位置时,模块会输出高电平,模式切换为快速模式;当持续
    的头像 发表于 09-18 15:35 2082次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>模块</b>使用 TTP224触摸传感器

    【项目展示】基于CW32的遥控循迹小车

    蓝牙模块、OLED屏幕、TB6612和红外循迹模块组成,电源采用可充电锂电池供电,建议不要使用 1.5V 干电池供电。 图1 CW32小车 二、硬件部分 2.1主控板 小车主控板由小
    的头像 发表于 05-31 17:33 1452次阅读
    【项目展示】基于<b class='flag-5'>CW32</b>的遥控循迹小车

    基于CW32的有刷直流电机控制实验三:直流电机闭环位置和速度控制实验

    硬件接线说明 实验使用的模块主要有6个:小车主控板(黑色)、CW32F030小蓝板、OLED屏幕、TB6612电机驱动模块、直流减速电机、DAP-Link下载器。 安装好后的图片如下: 如果
    的头像 发表于 05-31 17:01 682次阅读
    基于<b class='flag-5'>CW32</b>的有刷直流电机控制实验三:直流电机闭环位置和速度控制实验

    蓝牙模块选型之蓝牙功能

    蓝牙模块,是一种集成蓝牙功能的PCBA板,用于短距离无线通讯,蓝牙模块将芯片和外围硬件电路集成到一个PCB上,开发出所需的内置程序实现
    的头像 发表于 05-28 17:48 929次阅读
    <b class='flag-5'>蓝牙</b><b class='flag-5'>模块</b>选型之<b class='flag-5'>蓝牙</b>功能

    什么是经典蓝牙模块

      什么是经典蓝牙模块? 前面我们已经就蓝牙模块的概念做了了解,随着时间的推移,产品越来越智能,需要的蓝牙
    的头像 发表于 05-24 14:52 684次阅读
    什么是经典<b class='flag-5'>蓝牙</b><b class='flag-5'>模块</b>?

    CW32量产烧录工具

    本节主要介绍CW32微控制器的烧录器CW-Writer,以及与之配合的软件CW-Programmer的使用方法。烧录器CW-Writer通过ISP协议,可实现对
    的头像 发表于 04-25 15:22 1564次阅读
    <b class='flag-5'>CW32</b>量产烧录工具

    CW32快速开发入门

    CW32快速开发入门
    的头像 发表于 04-24 18:56 2184次阅读
    <b class='flag-5'>CW32</b>快速开发入门

    HC05蓝牙模块主从通讯,蓝牙透传串口发出后数据字节有延时是怎么回事?

    HC05蓝牙做主从通讯,主机发出从机接收。主从模块通过两个CH430和PC相连。用逻辑分析仪抓取数据,发现从机接收后串口发出的数据有字节延时。
    发表于 04-02 07:52