一、蓝牙概要
蓝牙是一种常见的无线通信协议,通常用于短距离通信。蓝牙分为经典蓝牙和低功耗蓝牙(BLE)。经典蓝牙通常用于需要持续传输数据的设备,比如蓝牙耳机等。低功耗蓝牙通常用于只需要间歇性传输数据的设备,比如运动手环。
蓝牙通信通常分为主机和从机,通常我们的单片机设备被当作从机,手机等终端设备作为主机。在建立蓝牙通信前,从机要向外广播自己的信息。
蓝牙通信协议比较复杂,比如在低功耗蓝牙中就包含GAP广播协议,GATT协议等知识点。在学习单片机的过程中,可以使用BT24蓝牙串口透传模块,该模块的作用可以讲复杂的蓝牙协议简化为”串口透传“。所谓串口透传,就是将STM32发送给其的数据原封不动地转发给与其连接的设备。并且可以将主机发送的数据通过串口转发给STM32.。
注意:连接模块时,地线接地线(GND),5V接5V,TX与RX交叉连接
二、准备工作
在终端输入命令控制红绿小灯亮灭
1.首先我们在CubeIDE将蓝牙模块连接的USART3设置为异步模式。蓝牙模块的默认波特率为9600,在参数设置界面中找到波特率参数修改成9600
2.为USART3开启中断
3.并且为USART3开启DMA通道
4.设置红绿蓝小灯为GPIO_OUTPUT。
5.保存并生成代码。.
6.参考如下连接的代码,将huart2的相关变量改成huart3的相关变量。具体实现见最后
STM32:串口轮询模式、中断模式、DMA模式和接收不定长数据-CSDN博客
三.使用BLE调试功能调试代码
通常使用蓝牙调试助手来调试代码。或者用 nRF Connect 也行。但是在学习环境上可以在波特律动 串口助手 进行调试。
四、主要代码。
/* USER CODE BEGIN PV */
uint8_t recvDate[20];
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_USART3_UART_Init(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
if(huart == &huart3){
//把接收到的数据,发给终端进行打印
HAL_UART_Transmit_DMA(&huart3,recvDate,Size);
GPIO_PinState pinstate= GPIO_PIN_RESET;
if(recvDate[1] == '1'){
pinstate = GPIO_PIN_SET;
}
if(recvDate[0] == 'R'){
HAL_GPIO_WritePin(redLED_GPIO_Port, redLED_Pin, pinstate);
}else if(recvDate[0] == 'B'){
HAL_GPIO_WritePin(blueLED_GPIO_Port,blueLED_Pin, pinstate);
}else if(recvDate[0] == 'G'){
HAL_GPIO_WritePin(greenLED_GPIO_Port,greenLED_Pin, pinstate);
}
//继续接收即将要接收的数据
HAL_UARTEx_ReceiveToIdle_DMA(&huart3, recvDate, sizeof(recvDate));
//关闭DMA传输过半中断
__HAL_DMA_DISABLE_IT(&hdma_usart3_rx,DMA_IT_HT);
}
}