配置蓝牙模块
注意需要将蓝牙模块接5v,实测接3.3v好像不太好使的样子
首先需要把蓝牙模块通过TTL串口模块接到我们的电脑,然后打开我们的串口助手
注意,我们现在是配置蓝牙模块,所以需要进入AT模式,需要按着蓝牙模块上的黑色小按钮再上电,这时候模块上的LED灯以一秒慢闪一次的速度闪烁着,如果你的LED是快速闪烁的可能就像上面说的一样接到3.3V去了
连接好后测试一下,波特率默认设置为38400
发送AT,模块会返回一个OK
我们给蓝牙修改一下名字,输入指令:
AT+NAME=自己想改的名字
例如: AT+NAME =BTtest
注意中间如果有空格的话会报错
改完后拔掉蓝牙模块再重新上电,这时候不用再按黑色小按钮了,这样就能进去配对连接啦
我们用手机蓝牙调试助手测试一下
在调试助手找到我们的模块后点击右边加号连接
连接后点击下方对话模式
然后输入内容点击发送
这时候我们的串口助手也能收到
也可以使用我们的串口助手进行发送
手机也能收到我们串口发过来的信息
这就表明我们的蓝牙模块已经配置成功啦,能插到单片机上进去使用了,将跳线帽接到蓝牙这边
初始化USART3
从原理图我们可以看到,将跳线帽接到蓝牙这边后USART3就变成了蓝牙配置
所以需要找到我们的USART3并配置,可以看到USART的TX和RX分别在PB10和PB11
配置USART基本都是:
RCC开启USART和GPIO的时钟
//使用结构体输出化:
GPIO_Init();
NVIC_Init();
USART_Init();
//开启串口接收中断:
USART_ITConfig();
//上电
USART_Cmd();
void BT_UART3_Init(u32 bound )
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //使能USART3RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //GPIOB时钟//USART3_TX GPIOB.10GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_Init(GPIOB, &GPIO_InitStructure);//USART3_RX GPIOB.11GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB.11GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOB, &GPIO_InitStructure);//Usart3 NVIC 配置NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式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); //初始化串口3USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断USART_Cmd(USART3, ENABLE);
}
在main.c定义串口3标志位
int g_USART3_FLAG1 = 0; //串口3控制标志位
然后在BT.h里面extern一下
extern int g_USART3_FLAG1; //串口3控制标志位
中断服务函数添加处理
void USART3_IRQHandler(void)
{u8 Res;if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET){ Res =USART_ReceiveData(USART3); //读取接收到的数据if(Res == 'A') g_USART3_FLAG1 = 1 ; //根据接受的数据 置为标志位if(Res == 'B')g_USART3_FLAG1 = 2 ;}
}
在上一节USART开启串口接收的函数里面把USART3的判断也加一下
//串口接收判断
void Usatr_If(void)
{if(g_USART1_FLAG1 ==1 | g_USART3_FLAG1 ==1 ){if(temp != 'A'){printf("Is A,LED Open\n");}temp = 'A';LED = RESET;}if(g_USART1_FLAG1 ==2 | g_USART3_FLAG1 ==2){if(temp != 'B'){printf("Is B,LED Close\n");}temp = 'B';LED = SET;}if(g_USART1_FLAG1 ==3 | g_USART3_FLAG1 ==3){if(temp != 'C'){printf("Is C,LED Flashing\n");}temp = 'C';LED =!LED;}
}
测试
然后在main.c里面测试一下
//开启串口接收
Usatr_If();//初始化并设置波特率
BT_UART3_Init(115200);
烧录进单片机,程序现象就是:
输入A,串口打印Is A,LED Open,开启LED
输入B,串口打印Is B,LED Close,关闭LED
输入B,串口打印Is C,LED Flashing,闪烁LED
蓝牙模块测试
看log也打印正常,那么就证明蓝牙已经跟单片机调通啦