HC-05 藍牙串口通信模塊,是基于 Bluetooth Specification V2.0 帶 EDR 藍牙協(xié)議的數(shù)傳模塊。無線工作頻段為 2.4GHz ISM,調(diào)制方式是 GFSK。模塊最大發(fā)射功率為 4dBm,接收靈敏度-85dBm,板載 PCB 天線,可以實現(xiàn) 10 米距離通信。模塊采用郵票孔封裝方式,模塊大小 27mm×13mm×2mm,方便客戶嵌入應(yīng)用系統(tǒng)之內(nèi),自帶 LED 燈,可直觀判斷藍牙的連接狀態(tài)。模塊采用 CSR 的 BC417 芯片,支持 AT 指令,用戶可根據(jù)需要更改角色(主、從模式)以及串口波特率、設(shè)備名稱等參數(shù),使用靈活。
一、模塊來源
模塊實物展示:
二、規(guī)格參數(shù)
工作電壓:3.6-6V
發(fā)射功率:4dBm(最大)
參考距離:10米
控制方式:串口
以上信息見廠家資料文件
三、移植過程
我們的目標是將例程移植至CW32F030C8T6開發(fā)板上【實現(xiàn)手機通過藍牙傳輸數(shù)據(jù)的功能】。首先要獲取資料,查看數(shù)據(jù)手冊應(yīng)如何實現(xiàn)讀取數(shù)據(jù),再移植至我們的工程。
3.1查看資料
使用HC05藍牙模塊之前,需要知道藍牙模塊的波特率,這樣我們才能控制它。將藍牙模塊與USB轉(zhuǎn)TTL串口調(diào)試模塊進行連接,在插入電腦之前,按住模塊上的按鍵再通電,插入電腦通電后此時模塊上的燈是慢閃,HC-05進入AT命令模式,默認波特率是38400;此模式我們叫原始模式。原始模式下一直處于AT命令模式狀態(tài)。
進入AT命令模式之后,最主要的是設(shè)置模式為從機控制,即等待手機去連接我們藍牙模塊的藍牙,主要由手機控制。發(fā)送指令時需要注意,每一條指令都要加上rn或者勾選發(fā)送新行,不然是識別不到命令的。
USB轉(zhuǎn)TTL串口調(diào)試模塊
AT指令的發(fā)送
關(guān)鍵指令說明
連接手機成功之后,模塊上的燈進入慢閃狀態(tài),說明已經(jīng)連接成功。
在手機端打開藍牙通信軟件,測試能否與電腦互傳數(shù)據(jù)。
3.2引腳選擇
想要使用uart串口,需要確定使用的引腳是否有串口外設(shè)功能,可以通過用戶手冊進行查看。在用戶手冊的第146頁。
這里選擇使用PA2和PA3的附加串口2功能。
有串口1功能的引腳
模塊接線圖
注意
STATE引腳為連接成功指示引腳, 連接手機成功時輸出高電平,通過將PA1設(shè)置為輸入模式,讀取STATE引腳的電平狀態(tài),當(dāng)為高電平時,說明有手機連接該藍牙模塊成功;當(dāng)為低電平時,說明沒有手機連接。
3.3移植至工程
移植步驟中的導(dǎo)入.c和.h文件與【CW32模塊使用】DHT11溫濕度傳感器相同,只是將.c和.h文件更改為bsp_bluetooth.c與bsp_bluetooth.h。這里不再過多講述,移植完成后面修改相關(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; //藍牙連接狀態(tài) = 0沒有手機連接 = 1有手機連接 unsigned char BLERX_BUFF[BLERX_LEN_MAX]; unsigned char BLERX_FLAG = 0; unsigned char BLERX_LEN = 0; /************************************************************ * 函數(shù)名稱:Bluetooth_GPIO_Init * 函數(shù)說明:藍牙RXTX引腳初始化 * 型 參:bund=串口波特率 * 返 回 值:無 * 備 注:無 *************************************************************/ void Bluetooth_GPIO_Init(unsigned int bund) { GPIO_InitTypeDef GPIO_InitStruct; // GPIO初始化結(jié)構(gòu)體 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復(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的過采樣率。 USART_InitStructure.USART_Source = USART_Source_PCLK; // 設(shè)置時鐘源 USART_InitStructure.USART_UclkFreq = 64000000; //設(shè)置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; // 收發(fā)模式 USART_Init(BSP_BLUETOOTH_UART, &USART_InitStructure); // 初始化串口2 // 優(yōu)先級,無優(yōu)先級分組 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ù) 說 明:向藍牙發(fā)送單個字符 * 函 數(shù) 形 參:ch=ASCII字符 * 函 數(shù) 返 回:無 * 作 者:LC * 備 注:無 ******************************************************************/ void BLE_Send_Bit(unsigned char ch) { // 發(fā)送一個字節(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ù) 說 明:向藍牙發(fā)送字符串 * 函 數(shù) 形 參:str=發(fā)送的字符串 * 函 數(shù) 返 回:無 * 作 者:LC * 備 注:無 ******************************************************************/ void BLE_send_String(unsigned char *str) { while( str && *str ) // 地址為空或者值為空跳出 { BLE_Send_Bit(*str++); } } /****************************************************************** * 函 數(shù) 名 稱:Clear_BLERX_BUFF * 函 數(shù) 說 明:清除串口接收的數(shù)據(jù) * 函 數(shù) 形 參:無 * 函 數(shù) 返 回:無 * 作 者:LC * 備 注:無 ******************************************************************/ void Clear_BLERX_BUFF(void) { BLERX_LEN = 0; BLERX_FLAG = 0; } /****************************************************************** * 函 數(shù) 名 稱:Bluetooth_Link_Gpio_Init * 函 數(shù) 說 明:藍牙連接成功指示引腳state初始化 * 函 數(shù) 形 參:無 * 函 數(shù) 返 回:無 * 作 者: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); // 初始化 } /****************************************************************** * 函 數(shù) 名 稱:Bluetooth_Init * 函 數(shù) 說 明:藍牙初始化 * 函 數(shù) 形 參:無 * 函 數(shù) 返 回:無 * 作 者:LC * 備 注:默認波特率為9600 ******************************************************************/ void Bluetooth_Init(void) { Bluetooth_GPIO_Init(9600); Bluetooth_Link_Gpio_Init(); #if DEBUG //在調(diào)試時,通過AT命令已經(jīng)設(shè)置好模式 printf("Bluetooth_Init succeed!rn"); #endif } /****************************************************************** * 函 數(shù) 名 稱:Get_Bluetooth_ConnectFlag * 函 數(shù) 說 明:獲取手機連接狀態(tài) * 函 數(shù) 形 參:無 * 函 數(shù) 返 回:返回1=已連接 返回0=未連接 * 作 者:LC * 備 注:使用該函數(shù)前,必須先調(diào)用 Bluetooth_Mode 函數(shù) ******************************************************************/ unsigned char Get_Bluetooth_ConnectFlag(void) { return Bluetooth_ConnectFlag; } /****************************************************************** * 函 數(shù) 名 稱:Bluetooth_Mode * 函 數(shù) 說 明:判斷藍牙模塊的連接狀態(tài) * 函 數(shù) 形 參:無 * 函 數(shù) 返 回:無 * 作 者:LC * 備 注:未連接時STATE低電平 連接成功時STATE高電平 ******************************************************************/ void Bluetooth_Mode(void) { static char flag = 0; //如果沒有手機連接 if( DISCONNECT == BLUETOOTH_LINK ) { //連接狀態(tài)為未連接 Bluetooth_ConnectFlag = 0; //如果之前是連接狀態(tài) if( flag == 1 ) { flag = 0;//修改狀態(tài) } return; } //如果手機已經(jīng)連接 if( CONNECT == BLUETOOTH_LINK ) { Bluetooth_ConnectFlag = 1; //如果之前是斷開狀態(tài) if( flag == 0 ) { flag = 1;//修改狀態(tài) } } } /****************************************************************** * 函 數(shù) 名 稱:Receive_Bluetooth_Data * 函 數(shù) 說 明:接收藍牙數(shù)據(jù) * 函 數(shù) 形 參:無 * 函 數(shù) 返 回:無 * 作 者:LC * 備 注:無 ******************************************************************/ void Receive_Bluetooth_Data(void) { if( BLERX_FLAG == 1 )//接收到藍牙數(shù)據(jù) { //顯示藍牙發(fā)送過來的數(shù)據(jù) printf("data = %srn",BLERX_BUFF); Clear_BLERX_BUFF();//清除接收緩存 } } /****************************************************************** * 函 數(shù) 名 稱:Send_Bluetooth_Data * 函 數(shù) 說 明:向藍牙模塊發(fā)送數(shù)據(jù) * 函 數(shù) 形 參:dat=要發(fā)送的字符串 * 函 數(shù) 返 回:無 * 作 者:LC * 備 注:(如果手機連接了藍牙,就是向手機發(fā)送數(shù)據(jù)) ******************************************************************/ void Send_Bluetooth_Data(char *dat) { //獲取藍牙狀態(tài) Bluetooth_Mode(); //如果手機已經(jīng)連接 if( Bluetooth_ConnectFlag == 1 ) { //發(fā)送數(shù)據(jù) BLE_send_String((unsigned char*)dat); } } /****************************************************************** * 函 數(shù) 名 稱:BLE_USART_IRQHandler * 函 數(shù) 說 明:連接藍牙的串口中斷服務(wù)函數(shù) * 函 數(shù) 形 參:無 * 函 數(shù) 返 回:無 * 作 者:LC * 備 注:無 ******************************************************************/ void BSP_BLUETOOTH_IRQHandler(void) { if(USART_GetITStatus(BSP_BLUETOOTH_UART, USART_IT_RC) == SET) { // 檢查是否還有空間接收新數(shù)據(jù) if (BLERX_LEN < BLERX_LEN_MAX - 1) // 保留一個字符的空間用于'' { BLERX_BUFF[BLERX_LEN++] = USART_ReceiveData(BSP_BLUETOOTH_UART); // 接收數(shù)據(jù) } else { USART_ReceiveData(BSP_BLUETOOTH_UART); // 讀取DR寄存器以清除中斷標志位,但不保存數(shù)據(jù) } BLERX_BUFF[BLERX_LEN] = ''; // 確保字符串正確結(jié)束 BLERX_FLAG = 1; // 設(shè)置接收完成標志位 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調(diào)試 1開始 0關(guān)閉 #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中斷服務(wù)函數(shù) //連接成功指示引腳 #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主函數(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(); // 開發(fā)板初始化 uart1_init(115200); // 串口1波特率115200 Bluetooth_Init(); printf("HC05 Start--->rn"); while(1) { //如果接收到藍牙數(shù)據(jù)則通過串口2顯示 Receive_Bluetooth_Data(); //發(fā)送數(shù)據(jù)到藍牙 BLE_send_String((uint8_t *)"立創(chuàng)·地文星·CW32F030C8T6開發(fā)板"); delay_ms(1000); } }
移植現(xiàn)象:讀取手機通過藍牙模塊發(fā)送過來的數(shù)據(jù),并通過串口1發(fā)送至電腦。
模塊移植成功案例代碼:
鏈接:https://pan.baidu.com/s/1IYo5SCmLftfapmVCgjDjlA?pwd=LCKF
提取碼:LCKF
審核編輯 黃宇
-
藍牙模塊
+關(guān)注
關(guān)注
30文章
578瀏覽量
55845 -
CW32
+關(guān)注
關(guān)注
1文章
218瀏覽量
714
發(fā)布評論請先 登錄
相關(guān)推薦
評論