zoukankan      html  css  js  c++  java
  • 蓝牙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
    ");
        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
    ");
        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
    ");
    
        //串口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
  • 相关阅读:
    HDU 5818 Joint Stacks
    HDU 5816 Hearthstone
    HDU 5812 Distance
    HDU 5807 Keep In Touch
    HDU 5798 Stabilization
    HDU 5543 Pick The Sticks
    Light OJ 1393 Crazy Calendar (尼姆博弈)
    NEFU 2016省赛演练一 I题 (模拟题)
    NEFU 2016省赛演练一 F题 (高精度加法)
    NEFU 2016省赛演练一 B题(递推)
  • 原文地址:https://www.cnblogs.com/xiangtingshen/p/10963072.html
Copyright © 2011-2022 走看看