STM32
直播中

李星童

7年用户 974经验值
私信 关注
[问答]

STM32f407两个蓝牙模块通信配置过程是怎样的?

STM32f407两个蓝牙模块通信配置过程是怎样的?

回帖(1)

张强

2021-12-10 11:03:19
  蓝牙模块使用的是XY_MBD07,XY-MBD07A 模块有两种工作模式: AT 指令工作模式,串口数据透传模式。模组未建立连接时模块处于 AT指令工作模式,当模块建立连接后模块处于串口数据透传模式。当模块建立连接后, CMD_DATA_SWITCH 引脚接低电平,模块会进入 AT 指令工作模式。
  配置过程
  

  • 串口配置

  这里使用的是串口4
  
void uart4_init(u32 bound)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE);
       
        GPIO_PinAFConfig(GPIOC,GPIO_PinSource10,GPIO_AF_UART4);
        GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_UART4);
       
        //UART4端口配置
        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(GPIOC,&GPIO_InitStructure);


   //UART4 初始化设置
        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(UART4, &USART_InitStructure); //初始化串口4
                               
        USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);//开启相关中断
       
        //Uart4 NVIC 配置
        NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级2
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;           //子优先级1
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);       
       
        USART_Cmd(UART4, ENABLE);  
}

  • 串口中断配置
uint8_t Fcount;
uint8_t Scount;
uint8_t tempData[20][50];
volatile uint8_t okFlag;
volatile uint8_t completeFlag;
uint8_t buff[20];
volatile uint8_t conectFlag;
uint8_t i,len,j;
void UART4_IRQHandler(void)
{
        if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)
        {
               
                USART_ClearITPendingBit(UART4, USART_IT_RXNE);
                tempData[Fcount][Scount++] = USART_ReceiveData(UART4);


                //判断结束标志
                if( (tempData[Fcount][Scount-2]=='r') && (tempData[Fcount][Scount-1]=='n') )
                {
                        Scount = 0;
                        if(strcmp(tempData[Fcount],"OKrn")==0)   //返回OK
                        {
                                okFlag=1;
                                Fcount=0;
                                memset(tempData[Fcount],0,sizeof(tempData[Fcount]));
                        }else if(strcmp(tempData[Fcount],"SCAN Completedrn")==0)  //扫描完成返回  SCAN Completed
                        {
                                completeFlag =1;


                                for(i=0;i                                 {
                                        len = strlen(tempData);
                                        if(tempData[len-7]=='F'&&tempData[len-6]=='S')  //扫描到名字带有FS的 蓝牙名字设置的是FS101/2/3...
                                        {
                                               
                                                conectFlag=1;
                                                for(j=0;j<12;j++)
                                                {
                                                        buff[j]=tempData[j];   //把扫描到的12位蓝牙地址存到buff
                                                }
                                                memset(tempData,0,sizeof(tempData));
                                                break;
                                        }
                                        memset(buff,0,sizeof(buff));
                                }
                                count1 = 0;
                                memset(tempData,0,sizeof(tempData));
                                       
                        }
                        else
                        {
                                Fcount += 1;
                        }               
                }
        }
}

  • 串口发送配置
void UART4_SendData(uint8_t *sen_buf,uint8_t sen_len)
{


        while(sen_len--)
        {
                USART_SendData(UART4, *(sen_buf++));
                while(USART_GetFlagStatus(UART4, USART_FLAG_TXE) == RESET); // Wait for Empty       
        }
}

  • 主函数
#include "sys.h"
#include "delay.h"
#include "usart.h"


extern uint8_t okFlag;          //返回OK标志
extern uint8_t completeFlag;    //扫描完成标志
extern uint8_t conectFlag;      //获取地址成功标志
extern uint8_t Fcount;
extern uint8_t buff[20];
uint8_t connectbuff[50];
//设置波特率
uint8_t buletooth_set(uint8_t *data1,uint8_t *data2)
{


        UART4_SendData(data1,strlen((char *)data1)); //设置波特率
        delay_ms(100);
         if(okFlag)
         {
                 okFlag=0;
                 UART4_SendData(data2,strlen((char *)data2));//开启串口流
                 delay_ms(100);
                 if(okFlag)
                 {
                        okFlag=0;
                        return 1;
                 }
         }
         return 0;
}




//蓝牙连接
uint8_t buletooth_connect(uint8_t *data)
{


        UART4_SendData(data,strlen((char *)data));//扫描
        delay_ms(1000);
        delay_ms(1000);
        delay_ms(1000);
        //printf("扫描中...rn");
        if(completeFlag)
        {
                completeFlag=0;
                delay_ms(1000);
                if(conectFlag)
                {
                        conectFlag=0;
                        Fcount=0;
                        sprintf(connectbuff,"AT+SCAN=%srn",buff);
                        while(okFlag==0)UART4_SendData(connectbuff,strlen((char *)connectbuff));//发送连接指令
                        memset(buff,0,sizeof(buff));
                        okFlag=0;
                        return 1;       
                }
        }
        memset(buff,0,sizeof(buff));
        return 0;
}


int main()
{
        uint8_t uartbuff[50]="AT+URATE=115200rn";
        uint8_t strbuff[20]= "AT+FC=1rn";
        uint8_t i=0;
        uint8_t scanbuff[20]="AT+SCAN?rn";


        delay_init(168);                                                                  //时钟初始化
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组配置
        //uart1_init(115200);          //串口初始化
        uart4_init(115200);
    MAX262_Init();




        while(buletooth_set(uartbuff,strbuff)== 0) delay_ms(500);   //蓝牙设置
        //printf("设置成功rn");
        while(buletooth_connect(scanbuff)==0)delay_ms(1000);        //蓝牙配对
        //printf("配对成功rn");


        while(1);
}
以上就是XY-MBD07A 蓝牙模块配对过程配置,配对完成之后连个蓝牙就可以进行通信了
举报

更多回帖

×
20
完善资料,
赚取积分