stm32单片机驱动E104-BT52X蓝牙模块
一.文章概述E104-BT52X是一款高性能低功耗的蓝牙模块本教程将详细介绍stm32和手机APP对其快速配置方法帮助用户快速实现单片机与手机APP利用模块进行双向透传功能。二.电路接线如图所示进行单片机和蓝牙模块的接线TX与RX使用交叉接线法LINK引脚高电平表示蓝牙已连接低电平未连接在蓝牙收发数据时DATA引脚处于高电平。用户后续可由此对IO进行读操作来确定蓝牙模块状态。三.单片机程序编写1.串口配置void MX_USART1_UART_Init(void) { /* USER CODE BEGIN USART1_Init 0 */ /* USER CODE END USART1_Init 0 */ /* USER CODE BEGIN USART1_Init 1 */ /* USER CODE END USART1_Init 1 */ huart1.Instance USART1; huart1.Init.BaudRate 115200; huart1.Init.WordLength UART_WORDLENGTH_8B; huart1.Init.StopBits UART_STOPBITS_1; huart1.Init.Parity UART_PARITY_NONE; huart1.Init.Mode UART_MODE_TX_RX; huart1.Init.HwFlowCtl UART_HWCONTROL_NONE; huart1.Init.OverSampling UART_OVERSAMPLING_16; huart1.Init.OneBitSampling UART_ONE_BIT_SAMPLE_DISABLE; huart1.AdvancedInit.AdvFeatureInit UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init(huart1) ! HAL_OK) { Error_Handler(); } /* USER CODE BEGIN USART1_Init 2 */ /* USER CODE END USART1_Init 2 */ // 开启串口1中断接收 HAL_UARTEx_ReceiveToIdle_IT(huart1, rx_buffer, sizeof(rx_buffer)); }void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) { GPIO_InitTypeDef GPIO_InitStruct {0}; RCC_PeriphCLKInitTypeDef PeriphClkInit {0}; if(uartHandle-InstanceUSART1) { /* USER CODE BEGIN USART1_MspInit 0 */ /* USER CODE END USART1_MspInit 0 */ /** Initializes the peripherals clock */ PeriphClkInit.PeriphClockSelection RCC_PERIPHCLK_USART1; PeriphClkInit.Usart1ClockSelection RCC_USART1CLKSOURCE_PCLK2; if (HAL_RCCEx_PeriphCLKConfig(PeriphClkInit) ! HAL_OK) { Error_Handler(); } /* USART1 clock enable */ __HAL_RCC_USART1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /**USART1 GPIO Configuration PA9 ------ USART1_TX PA10 ------ USART1_RX */ GPIO_InitStruct.Pin GPIO_PIN_9|GPIO_PIN_10; GPIO_InitStruct.Mode GPIO_MODE_AF_PP; GPIO_InitStruct.Pull GPIO_NOPULL; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate GPIO_AF7_USART1; HAL_GPIO_Init(GPIOA, GPIO_InitStruct); /* USER CODE BEGIN USART1_MspInit 1 */ /* USER CODE END USART1_MspInit 1 */ HAL_NVIC_SetPriority(USART1_IRQn, 1, 0); HAL_NVIC_EnableIRQ(USART1_IRQn); } }以上就是对串口的配置程序编写注意打开串口空闲中断2.串口中断回调函数void USART1_IRQHandler(void) { HAL_UART_IRQHandler(huart1); } void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) { if (huart-Instance USART1) { // Size 是实际收到的字节数可能是任意长度 // 在这里处理 rx_buffer 中的前 Size 个字节 // 重新启动接收准备下一帧 HAL_UARTEx_ReceiveToIdle_IT(huart1, rx_buffer, sizeof(rx_buffer)); } }串口空闲中断回调函数里可添加对数据的处理3.蓝牙模块功能函数编写/* 接收缓冲区 */ #define RX_BUF_SIZE 32 uint8_t rx_buffer[RX_BUF_SIZE]; // 接收数据缓冲区 /* 串口发送字符串 */ void BlueTooth_Send_Str(char *str) { HAL_UART_Transmit(huart1 , (uint8_t*)str, strlen(str), HAL_MAX_DELAY); } /* 发送 AT 指令自动添加 \r\n */ void Send_AT_Command(char *cmd) { char buffer[64]; sprintf(buffer, %s\r\n, cmd); HAL_UART_Transmit(huart1, (uint8_t*)cmd, strlen(cmd), HAL_MAX_DELAY); } /* 进入指令模式已连接状态下 */ void Enter_AT_Mode(void) { BlueTooth_Send_Str(); // 发送 不加 \r\n HAL_Delay(100); // 等待 100ms } /* 退出指令模式返回透传模式 */ void Exit_AT_Mode(void) { Send_AT_Command(ATEXIT); HAL_Delay(100); // 等待 100ms }以上时蓝牙模块基本功能函数用户可根据自己需要自行添加4.主函数调用int main() { //USART1驱动蓝牙模块 MX_USART1_UART_Init(); HAL_UART_MspInit(huart1); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET); HAL_Delay(50); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET); HAL_Delay(500); // 等待模块上电稳定 //进入透传模式 void Exit_AT_Mode(void); while(1) { if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_13)1)//这里是读取LINK引脚电平获取连接状态 { BlueTooth_Send_Str(hello);//向手机APP发送“hello” } HAL_Delay(1000); } }上电需先给WKP引脚一个下降沿唤醒四.手机APP连接手机端 ble 调试 APP - nRF connect安卓应用商店就可以直接下载下载后需要打开手机蓝牙和GPS功能找到蓝牙模块点击CONNECT连接找到FFF0,把FFF1和FFF3的通知功能打开在FFF3处将文本格式改为TEXT,内容为ATAUTH123456(不区分大小写)点击SEND发送进行认证收到x2B4F4B0D0A代表认证通过然后发送ATTRANMD1进入透传模式。蓝牙模块默认为从机此时FFF1是APP的数据接收区VALUE是接收到的数据FFF2是APP向蓝牙的数据发送区用户可以Debug调试单片机查询是否接收到数据。至此已完成APP和单片机在蓝牙模块下的双向数据传输。