STM32CubeMX配置蓝牙BLE(四)
·
蓝牙模块测试
蓝牙模块型号:BLE-CC41-A
本文中的测试方法有两种:第一种是直接使用USB转TTL工具来实现,接线如图,接好后直接插到电脑上即可:
| 蓝牙引脚 | 单片机引脚 |
| VCC | 5V |
| GND | GND |
| TX | RX |
| RX | TX |
下图是测试常见指令得出的结果,输入完按回车然后再点击发送

方式二:电脑 → STM32F407(USART1) → STM32F407(USART3) → BLE-CC41-A 蓝牙模块,并通过电脑发送 AT 指令测试蓝牙模块。
1. 硬件接线(关键步骤)
蓝牙模块(BLE-CC41-A)是 UART 接口,需要和 STM32 的 USART3 对应连接:
表格
| BLE-CC41-A 引脚 | STM32F407ZET6 引脚 | 说明 |
|---|---|---|
| VCC | 5V | 丝印是3.6-6V单片机常见3.3和5V |
| GND | GND | 共地 |
| TX | PB11 (USART3_RX) | 蓝牙发 → STM32 收 |
| RX | PB10 (USART3_TX) | STM32 发 → 蓝牙收 |
注意:部分模块丝印可能是
TXD/RXD,含义相同;如果通信异常,可尝试交换 TX/RX 接线。
2. STM32 代码实现(串口转发逻辑)
下面是基于标准库的核心代码框架,你可以直接放到工程里使用:
① 串口初始化
c
运行
#include "stm32f4xx.h"
// USART1:电脑 <-> STM32
void USART1_Init(u32 baudrate) {
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1); // PA9 = TX
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1); // PA10 = RX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = baudrate;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_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(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_Cmd(USART1, ENABLE);
}
// USART3:STM32 <-> 蓝牙模块
void USART3_Init(u32 baudrate) {
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3 | RCC_AHB1Periph_GPIOB, ENABLE);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART3); // PB10 = TX
GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_USART3); // PB11 = RX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = baudrate;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_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(USART3, &USART_InitStructure);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_Cmd(USART3, ENABLE);
}
// 串口发送单个字节
void USART_SendByte(USART_TypeDef* USARTx, u8 data) {
while(!(USARTx->SR & USART_SR_TC));
USART_SendData(USARTx, data);
}
② 中断服务函数(数据转发核心)
c
运行
// USART1 中断:电脑发来的数据 → 转发给蓝牙模块
void USART1_IRQHandler(void) {
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
u8 data = USART_ReceiveData(USART1);
USART_SendByte(USART3, data); // 转发到串口3(蓝牙模块)
}
}
// USART3 中断:蓝牙模块返回的数据 → 转发给电脑
void USART3_IRQHandler(void) {
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) {
u8 data = USART_ReceiveData(USART3);
USART_SendByte(USART1, data); // 转发到串口1(电脑)
}
}
③ 主函数
c
运行
int main(void) {
// 初始化串口1和串口3,波特率要和蓝牙模块默认一致(通常是9600或115200,以手册为准)
USART1_Init(115200);
USART3_Init(115200);
while(1) {
// 主循环空转,所有转发工作由中断完成
}
}
3. 电脑端操作步骤
-
打开串口助手(如 XCOM、SecureCRT 等)
- 串口号:选择 STM32 虚拟串口
- 波特率:和代码中一致(如 9600)
- 数据位:8,停止位:1,校验位:无
- 勾选「发送新行」(部分 AT 指令需要换行结尾)
-
发送 AT 指令测试常见 AT 指令(以 BLE-CC41-A 手册为准):
AT→ 模块应返回OKAT+NAME→ 查询模块名称AT+BAUD→ 查询 / 设置波特率AT+PIN→ 查询 / 设置配对密码
-
观察现象
- 电脑发送
AT,串口助手会收到模块返回的OK,说明通信正常 ✅
- 电脑发送
更多推荐
所有评论(0)