配置蓝牙模块
注意需要将蓝牙模块接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();
cpp
void BT_UART3_Init(u32 bound )
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //使能USART3
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //GPIOB时钟
//USART3_TX GPIOB.10
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);
//USART3_RX GPIOB.11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB.11
GPIO_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 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_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); //初始化串口3
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断
USART_Cmd(USART3, ENABLE);
}
在main.c定义串口3标志位
cpp
int g_USART3_FLAG1 = 0; //串口3控制标志位
然后在BT.h里面extern一下
cpp
extern int g_USART3_FLAG1; //串口3控制标志位
中断服务函数添加处理
cpp
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的判断也加一下
cpp
//串口接收判断
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里面测试一下
cpp
//开启串口接收
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也打印正常,那么就证明蓝牙已经跟单片机调通啦