• 正文
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

【CW32模塊使用】HC05藍(lán)牙模塊

01/10 08:56
2381
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

HC-05 藍(lán)牙串口通信模塊,是基于 Bluetooth Specification V2.0 帶 EDR 藍(lán)牙協(xié)議的數(shù)傳模塊。無(wú)線工作頻段為 2.4GHz ISM,調(diào)制方式是 GFSK。模塊最大發(fā)射功率為 4dBm,接收靈敏度-85dBm,板載 PCB 天線,可以實(shí)現(xiàn) 10 米距離通信。模塊采用郵票孔封裝方式,模塊大小 27mm×13mm×2mm,方便客戶嵌入應(yīng)用系統(tǒng)之內(nèi),自帶 LED 燈,可直觀判斷藍(lán)牙的連接狀態(tài)。模塊采用 CSR 的 BC417 芯片,支持 AT 指令,用戶可根據(jù)需要更改角色(主、從模式)以及串口波特率、設(shè)備名稱等參數(shù),使用靈活。

模塊來(lái)源

模塊實(shí)物展示:

規(guī)格參數(shù)

工作電壓:3.6-6V

供電電流:40mA

發(fā)射功率:4dBm(最大)

參考距離:10米

控制方式:串口

管腳數(shù)量:6 Pin(2.54mm間距排針

以上信息見(jiàn)廠家資料文件

移植過(guò)程

我們的目標(biāo)是將例程移植至CW32F030C8T6開(kāi)發(fā)板上【實(shí)現(xiàn)手機(jī)通過(guò)藍(lán)牙傳輸數(shù)據(jù)的功能】。首先要獲取資料,查看數(shù)據(jù)手冊(cè)應(yīng)如何實(shí)現(xiàn)讀取數(shù)據(jù),再移植至我們的工程。

3.1查看資料

使用HC05藍(lán)牙模塊之前,需要知道藍(lán)牙模塊的波特率,這樣我們才能控制它。將藍(lán)牙模塊與USB轉(zhuǎn)TTL串口調(diào)試模塊進(jìn)行連接,在插入電腦之前,按住模塊上的按鍵再通電,插入電腦通電后此時(shí)模塊上的燈是慢閃,HC-05進(jìn)入AT命令模式,默認(rèn)波特率是38400;此模式我們叫原始模式。原始模式下一直處于AT命令模式狀態(tài)。

進(jìn)入AT命令模式之后,最主要的是設(shè)置模式為從機(jī)控制,即等待手機(jī)去連接我們藍(lán)牙模塊的藍(lán)牙,主要由手機(jī)控制。發(fā)送指令時(shí)需要注意,每一條指令都要加上rn或者勾選發(fā)送新行,不然是識(shí)別不到命令的。

USB轉(zhuǎn)TTL串口調(diào)試模塊

AT指令的發(fā)送

 

關(guān)鍵指令說(shuō)明

連接手機(jī)成功之后,模塊上的燈進(jìn)入慢閃狀態(tài),說(shuō)明已經(jīng)連接成功。

在手機(jī)端打開(kāi)藍(lán)牙通信軟件,測(cè)試能否與電腦互傳數(shù)據(jù)。

3.2引腳選擇

想要使用uart串口,需要確定使用的引腳是否有串口外設(shè)功能,可以通過(guò)用戶手冊(cè)進(jìn)行查看。在用戶手冊(cè)的第146頁(yè)。

這里選擇使用PA2和PA3的附加串口2功能。

有串口1功能的引腳

模塊接線圖

注意

STATE引腳為連接成功指示引腳,?連接手機(jī)成功時(shí)輸出高電平,通過(guò)將PA1設(shè)置為輸入模式,讀取STATE引腳的電平狀態(tài),當(dāng)為高電平時(shí),說(shuō)明有手機(jī)連接該藍(lán)牙模塊成功;當(dāng)為低電平時(shí),說(shuō)明沒(méi)有手機(jī)連接。

 

3.3移植至工程

移植步驟中的導(dǎo)入.c和.h文件與【CW32模塊使用】DHT11溫濕度傳感器相同,只是將.c和.h文件更改為bsp_bluetooth.c與bsp_bluetooth.h。這里不再過(guò)多講述,移植完成后面修改相關(guān)代碼。

在文件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; //藍(lán)牙連接狀態(tài) = 0沒(méi)有手機(jī)連接   = 1有手機(jī)連接unsigned char BLERX_BUFF[BLERX_LEN_MAX];unsigned char BLERX_FLAG = 0;unsigned char BLERX_LEN = 0;
/************************************************************ * 函數(shù)名稱:Bluetooth_GPIO_Init * 函數(shù)說(shuō)明:藍(lán)牙RXTX引腳初始化 * 型    參:bund=串口波特率 * 返 回 值:無(wú) * 備    注:無(wú)*************************************************************/void Bluetooth_GPIO_Init(unsigned int bund){    GPIO_InitTypeDef GPIO_InitStruct; // GPIO初始化結(jié)構(gòu)體
    BSP_BLUETOOTH_GPIO_RCC_ENABLE();        // 使能GPIO時(shí)鐘    BSP_BLUETOOTH_UART_RCC_ENABLE();        // 使能UART時(shí)鐘
    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復(fù)用    BSP_BLUETOOTH_AF_UART_RX(); // UART_RX復(fù)用
    // 配置UART    USART_InitTypeDef USART_InitStructure;
    USART_InitStructure.USART_BaudRate = bund;                                     // 波特率    USART_InitStructure.USART_Over = USART_Over_16;                     // 配置USART的過(guò)采樣率。    USART_InitStructure.USART_Source = USART_Source_PCLK;               // 設(shè)置時(shí)鐘源    USART_InitStructure.USART_UclkFreq = 64000000;                      //設(shè)置USART時(shí)鐘頻率(和主頻一致即可)    USART_InitStructure.USART_StartBit = USART_StartBit_FE;             //RXD下降沿開(kāi)始    USART_InitStructure.USART_StopBits = USART_StopBits_1;              // 停止位1    USART_InitStructure.USART_Parity = USART_Parity_No ;                // 不使用校驗(yàn)    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 不使用流控    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;     // 收發(fā)模式    USART_Init(BSP_BLUETOOTH_UART, &USART_InitStructure);               // 初始化串口2
    // 優(yōu)先級(jí),無(wú)優(yōu)先級(jí)分組    NVIC_SetPriority(BSP_BLUETOOTH_IRQ, 0);
    // UARTx中斷使能    NVIC_EnableIRQ(BSP_BLUETOOTH_IRQ);
    // 使能UARTx RC中斷    USART_ITConfig(BSP_BLUETOOTH_UART, USART_IT_RC, ENABLE);

}
/****************************************************************** * 函 數(shù) 名 稱:BLE_Send_Bit * 函 數(shù) 說(shuō) 明:向藍(lán)牙發(fā)送單個(gè)字符 * 函 數(shù) 形 參:ch=ASCII字符 * 函 數(shù) 返 回:無(wú) * 作       者:LC * 備       注:無(wú)******************************************************************/void BLE_Send_Bit(unsigned char ch){    // 發(fā)送一個(gè)字節(jié)    USART_SendData(BSP_BLUETOOTH_UART, (uint8_t)ch);
    // 等待發(fā)送完成    while( RESET == USART_GetFlagStatus(BSP_BLUETOOTH_UART, USART_FLAG_TXE) ){}}
/****************************************************************** * 函 數(shù) 名 稱:BLE_send_String * 函 數(shù) 說(shuō) 明:向藍(lán)牙發(fā)送字符串 * 函 數(shù) 形 參:str=發(fā)送的字符串 * 函 數(shù) 返 回:無(wú) * 作       者:LC * 備       注:無(wú)******************************************************************/void BLE_send_String(unsigned char *str){        while( str && *str ) // 地址為空或者值為空跳出        {                BLE_Send_Bit(*str++);        }}
/****************************************************************** * 函 數(shù) 名 稱:Clear_BLERX_BUFF * 函 數(shù) 說(shuō) 明:清除串口接收的數(shù)據(jù) * 函 數(shù) 形 參:無(wú) * 函 數(shù) 返 回:無(wú) * 作       者:LC * 備       注:無(wú)******************************************************************/void Clear_BLERX_BUFF(void){        BLERX_LEN = 0;        BLERX_FLAG = 0;}
/****************************************************************** * 函 數(shù) 名 稱:Bluetooth_Link_Gpio_Init * 函 數(shù) 說(shuō) 明:藍(lán)牙連接成功指示引腳state初始化 * 函 數(shù) 形 參:無(wú) * 函 數(shù) 返 回:無(wú) * 作       者:LC * 備       注:無(wú)******************************************************************/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);  // 初始化}
/****************************************************************** * 函 數(shù) 名 稱:Bluetooth_Init * 函 數(shù) 說(shuō) 明:藍(lán)牙初始化 * 函 數(shù) 形 參:無(wú) * 函 數(shù) 返 回:無(wú) * 作       者:LC * 備       注:默認(rèn)波特率為9600******************************************************************/void Bluetooth_Init(void){    Bluetooth_GPIO_Init(9600);    Bluetooth_Link_Gpio_Init();    #if        DEBUG         //在調(diào)試時(shí),通過(guò)AT命令已經(jīng)設(shè)置好模式        printf("Bluetooth_Init succeed!rn");
    #endif}
/****************************************************************** * 函 數(shù) 名 稱:Get_Bluetooth_ConnectFlag * 函 數(shù) 說(shuō) 明:獲取手機(jī)連接狀態(tài) * 函 數(shù) 形 參:無(wú) * 函 數(shù) 返 回:返回1=已連接                返回0=未連接 * 作       者:LC * 備       注:使用該函數(shù)前,必須先調(diào)用 Bluetooth_Mode 函數(shù)******************************************************************/unsigned char Get_Bluetooth_ConnectFlag(void){        return Bluetooth_ConnectFlag;}
/****************************************************************** * 函 數(shù) 名 稱:Bluetooth_Mode * 函 數(shù) 說(shuō) 明:判斷藍(lán)牙模塊的連接狀態(tài) * 函 數(shù) 形 參:無(wú) * 函 數(shù) 返 回:無(wú) * 作       者:LC * 備       注:未連接時(shí)STATE低電平   連接成功時(shí)STATE高電平******************************************************************/void Bluetooth_Mode(void){        static char flag = 0;        //如果沒(méi)有手機(jī)連接        if( DISCONNECT == BLUETOOTH_LINK )        {        //連接狀態(tài)為未連接                Bluetooth_ConnectFlag = 0;        //如果之前是連接狀態(tài)                if( flag == 1 )                {                                flag = 0;//修改狀態(tài)                }                return;        }        //如果手機(jī)已經(jīng)連接        if( CONNECT == BLUETOOTH_LINK )        {                Bluetooth_ConnectFlag = 1;                                                //如果之前是斷開(kāi)狀態(tài)                if( flag == 0 )                {                                flag = 1;//修改狀態(tài)                }        }}
/****************************************************************** * 函 數(shù) 名 稱:Receive_Bluetooth_Data * 函 數(shù) 說(shuō) 明:接收藍(lán)牙數(shù)據(jù) * 函 數(shù) 形 參:無(wú) * 函 數(shù) 返 回:無(wú) * 作       者:LC * 備       注:無(wú)******************************************************************/void Receive_Bluetooth_Data(void){        if( BLERX_FLAG == 1 )//接收到藍(lán)牙數(shù)據(jù)        {                //顯示藍(lán)牙發(fā)送過(guò)來(lái)的數(shù)據(jù)                printf("data = %srn",BLERX_BUFF);
                Clear_BLERX_BUFF();//清除接收緩存        }
}
/****************************************************************** * 函 數(shù) 名 稱:Send_Bluetooth_Data * 函 數(shù) 說(shuō) 明:向藍(lán)牙模塊發(fā)送數(shù)據(jù) * 函 數(shù) 形 參:dat=要發(fā)送的字符串 * 函 數(shù) 返 回:無(wú) * 作       者:LC * 備       注:(如果手機(jī)連接了藍(lán)牙,就是向手機(jī)發(fā)送數(shù)據(jù))******************************************************************/void Send_Bluetooth_Data(char *dat){    //獲取藍(lán)牙狀態(tài)    Bluetooth_Mode();    //如果手機(jī)已經(jīng)連接    if( Bluetooth_ConnectFlag == 1 )    {        //發(fā)送數(shù)據(jù)        BLE_send_String((unsigned char*)dat);    }}
/****************************************************************** * 函 數(shù) 名 稱:BLE_USART_IRQHandler * 函 數(shù) 說(shuō) 明:連接藍(lán)牙的串口中斷服務(wù)函數(shù) * 函 數(shù) 形 參:無(wú) * 函 數(shù) 返 回:無(wú) * 作       者:LC * 備       注:無(wú)******************************************************************/void BSP_BLUETOOTH_IRQHandler(void){    if(USART_GetITStatus(BSP_BLUETOOTH_UART, USART_IT_RC) == SET)    {        // 檢查是否還有空間接收新數(shù)據(jù)        if (BLERX_LEN < BLERX_LEN_MAX - 1) // 保留一個(gè)字符的空間用于''        {            BLERX_BUFF[BLERX_LEN++] = USART_ReceiveData(BSP_BLUETOOTH_UART); // 接收數(shù)據(jù)        }        else        {            USART_ReceiveData(BSP_BLUETOOTH_UART); // 讀取DR寄存器以清除中斷標(biāo)志位,但不保存數(shù)據(jù)        }
        BLERX_BUFF[BLERX_LEN] = '';  // 確保字符串正確結(jié)束        BLERX_FLAG = 1;  // 設(shè)置接收完成標(biāo)志位
        USART_ClearITPendingBit(BSP_BLUETOOTH_UART, USART_IT_RC); // 清除中斷標(biāo)志位    }}

在文件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"
//是否開(kāi)啟串口0調(diào)試     1開(kāi)始  0關(guān)閉#define     DEBUG   1

#define  BLERX_LEN_MAX  200
#define BSP_BLUETOOTH_GPIO_RCC_ENABLE()  __RCC_GPIOA_CLK_ENABLE()   // 串口TX的端口時(shí)鐘#define BSP_BLUETOOTH_UART_RCC_ENABLE()  __RCC_UART2_CLK_ENABLE()   // 串口2的時(shí)鐘
#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中斷服務(wù)函數(shù)
//連接成功指示引腳#define BLUETOOTH_LINK_GPIO              GPIO_PIN_1
#define BLUETOOTH_LINK                   GPIO_ReadPin(BSP_BLUETOOTH_GPIO_PORT, BLUETOOTH_LINK_GPIO)
#define CONNECT             1       //藍(lán)牙連接成功#define DISCONNECT          0       //藍(lán)牙連接斷開(kāi)
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

?移植驗(yàn)證

在自己工程中的main主函數(shù)中,編寫如下。

/* * 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();        // 開(kāi)發(fā)板初始化
    uart1_init(115200);        // 串口1波特率115200
    Bluetooth_Init();
    printf("HC05 Start--->rn");
    while(1)    {        //如果接收到藍(lán)牙數(shù)據(jù)則通過(guò)串口2顯示        Receive_Bluetooth_Data();
        //發(fā)送數(shù)據(jù)到藍(lán)牙        BLE_send_String((uint8_t *)"立創(chuàng)·地文星·CW32F030C8T6開(kāi)發(fā)板");
        delay_ms(1000);
    }}

移植現(xiàn)象:讀取手機(jī)通過(guò)藍(lán)牙模塊發(fā)送過(guò)來(lái)的數(shù)據(jù),并通過(guò)串口1發(fā)送至電腦。

模塊移植成功案例代碼:

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

提取碼:LCKF

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計(jì)資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

以開(kāi)放、共享、互助為理念,致力于構(gòu)建武漢芯源半導(dǎo)體CW32系列MCU生態(tài)社區(qū)。無(wú)論是嵌入式MCU小自還是想要攻破技術(shù)難題的工程師,亦或是需求解決方案的產(chǎn)品經(jīng)理都可在CW32生態(tài)社區(qū)汲取營(yíng)養(yǎng)、共同成長(zhǎng)。

B站