藍牙4.0模塊,AT指令集


一,LED狀態

 

二,藍牙模塊有兩種通信模式

1,AT指令模式

 

 

 

2,數據透傳模式

 

三、AT指令程序設計

 

1、設置模塊的名字

 

void usart3_send_str(char *pbuf)
{
    while(pbuf && *pbuf)
    {
        USART_SendData(USART3,*pbuf++);
        while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);
    }
}
 
void ble_set_config(void)
{
    //配置模塊的名字
    usart3_send_str("AT+NAMETeacher.Wen\r\n");
    delay_ms(500);
}

 

 

#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_usart.h"
#include "stdio.h"

static GPIO_InitTypeDef      GPIO_InitStructure;
static USART_InitTypeDef     USART_InitStructure;
static NVIC_InitTypeDef     NVIC_InitStructure;           

void delay_us(uint32_t nus)
{        
    uint32_t temp;             
    SysTick->LOAD =SystemCoreClock/8/1000000*nus;     //時間加載               
    SysTick->VAL  =0x00;                            //清空計數器
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;         //使能滴答定時器開始倒數      
    do
    {
        temp=SysTick->CTRL;
    }while((temp&0x01)&&!(temp&(1<<16)));            //等待時間到達   
    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;         //關閉計數器
    SysTick->VAL =0X00;                               //清空計數器 
}

void delay_ms(uint16_t nms)
{                     
    uint32_t temp;           
    SysTick->LOAD=SystemCoreClock/8/1000*nms;        //時間加載(SysTick->LOAD為24bit)
    SysTick->VAL =0x00;                               //清空計數器
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;        //能滴答定時器開始倒數 
    do
    {
        temp=SysTick->CTRL;
    }while((temp&0x01)&&!(temp&(1<<16)));            //等待時間到達   
    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;        //關閉計數器
    SysTick->VAL =0X00;                               //清空計數器              
} 

void LED_Init(void)
{         
  
    //使能GPIOE,GPIOF時鍾
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF, ENABLE);            

    //GPIOF9,F10初始化設置 
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9 | GPIO_Pin_10;        //LED0和LED1對應IO口
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;                    //普通輸出模式,
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                    //推挽輸出,驅動LED需要電流驅動
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;                //100MHz
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;                    //上拉
    GPIO_Init(GPIOF, &GPIO_InitStructure);                            //初始化GPIOF,把配置的數據寫入寄存器                        


    //GPIOE13,PE14初始化設置 
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_13 | GPIO_Pin_14;        //LED2和LED3對應IO口
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;                    //普通輸出模式
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                    //推挽輸出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;                //100MHz
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;                    //上拉
    GPIO_Init(GPIOE, &GPIO_InitStructure);                            //初始化GPIOE,把配置的數據寫入寄存器

    GPIO_SetBits(GPIOF,GPIO_Pin_9  | GPIO_Pin_10);                    //GPIOF9,PF10設置高,燈滅
    GPIO_SetBits(GPIOE,GPIO_Pin_13 | GPIO_Pin_14);        
}


void USART1_Init(uint32_t baud)
{
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);                             //使能GPIOA時鍾
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);                            //使能USART1時鍾
 
    //串口1對應引腳復用映射
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);                         //GPIOA9復用為USART1
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);                         //GPIOA10復用為USART1
    
    //USART1端口配置
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;                         //GPIOA9與GPIOA10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                                    //復用功能
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                //速度50MHz
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                                     //推挽復用輸出
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                                     //上拉
    GPIO_Init(GPIOA,&GPIO_InitStructure);                                             //初始化PA9,PA10

    //USART1 初始化設置
    USART_InitStructure.USART_BaudRate = baud;                                        //波特率設置
    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(USART1, &USART_InitStructure);                                         //初始化串口1
    
    USART_Cmd(USART1, ENABLE);                                                      //使能串口1 
    
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                                    //開啟相關中斷

    //Usart1 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;                                //串口1中斷通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;                            //搶占優先級3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;                                //子優先級3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                    //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);                                                    //根據指定的參數初始化VIC寄存器
}

void USART3_Init(uint32_t baud)
{
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);                             //使能GPIOB時鍾
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);                            //使能USART3時鍾
 
    //串口3對應引腳復用映射
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3);                         //GPIOB10復用為USART3
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3);                         //GPIOB11復用為USART3
    
    //USART1端口配置
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;                         //GPIOB10與GPIOB11
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                                    //復用功能
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                //速度50MHz
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                                     //推挽復用輸出
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                                     //上拉
    GPIO_Init(GPIOB,&GPIO_InitStructure);                                             //初始化PB10,PB11

    //USART1 初始化設置
    USART_InitStructure.USART_BaudRate = baud;                                        //波特率設置
    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_Cmd(USART3, ENABLE);                                                      //使能串口3
    
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);                                    //開啟相關中斷

    //Usart3 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;                                //串口3中斷通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;                            //搶占優先級3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;                                //子優先級3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                    //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);                                                    //根據指定的參數初始化VIC寄存器
}



//重定義fputc
int fputc(int ch,FILE *f)
{
    USART_SendData(USART1,ch);
    while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);

    return ch;
}

void usart1_send_bytes(uint8_t *pbuf,uint32_t len)
{
    while(len--)
    {
        USART_SendData(USART1,*pbuf++);
        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
    }
}

void usart1_send_str(char *pbuf)
{
    while(pbuf && *pbuf)
    {
        USART_SendData(USART1,*pbuf++);
        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
    }
}

void usart3_send_bytes(uint8_t *pbuf,uint32_t len)
{
    while(len--)
    {
        USART_SendData(USART3,*pbuf++);
        while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);
    }
}

void usart3_send_str(char *pbuf)
{
    while(pbuf && *pbuf)
    {
        USART_SendData(USART3,*pbuf++);
        while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);
    }
}

void ble_set_config(void)
{
    //配置模塊的名字
    usart3_send_str("AT+NAMEHELLO\r\n");
    delay_ms(500);
}

int main(void)
{ 
 
    LED_Init();        

    //系統定時器初始化,時鍾源來自HCLK,且進行8分頻,
    //系統定時器時鍾頻率=168MHz/8=21MHz
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); 
        
    //設置中斷優先級分組2
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    
    //串口1,波特率115200bps,開啟接收中斷
    USART1_Init(115200);
    
    printf("hello ble at test\r\n");

    //串口3,波特率9600bps,開啟接收中斷,藍牙模塊出廠設置為9600bps
    USART3_Init(9600);    
    
    
    ble_set_config();
    
    while(1)
    {

    }
}


void USART1_IRQHandler(void)                                //串口1中斷服務程序
{
    uint8_t d;

    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)      //接收中斷
    {
        //接收數據
        d = USART_ReceiveData(USART1);                        
        
        //發送數據
        usart3_send_bytes(&d,1);
             
    } 

} 

void USART3_IRQHandler(void)                                //串口3中斷服務程序
{
    uint8_t d;

    if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)      //接收中斷
    {
        //接收數據
        d = USART_ReceiveData(USART3);                        
        
        //發送數據
        usart1_send_bytes(&d,1);
             
    } 

} 
main.c

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM