OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4129|回复: 1

蓝牙4.0AT指令的测试指令为啥返回报错

[复制链接]

2

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2021-10-12
在线时间
7 小时
发表于 2021-11-11 19:39:38 | 显示全部楼层 |阅读模式
本帖最后由 wkkkk 于 2021-11-11 19:43 编辑

#include "stm32f4xx.h"
#include "sys.h"
#include <stdio.h>

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

void delay_us(uint32_t n)
{
        SysTick->CTRL = 0;                         // Disable SysTick,关闭系统定时器
        SysTick->LOAD = (168*n)-1; // 配置计数值(168*n)-1 ~ 0
        SysTick->VAL  = 0;                 // Clear current value as well as count flag
        SysTick->CTRL = 5;                 // Enable SysTick timer with processor clock
        while ((SysTick->CTRL & 0x10000)==0);// Wait until count flag is set
        SysTick->CTRL = 0;                 // Disable SysTick        
}

void delay_ms(uint32_t n)
{
        while(n--)
        {
                SysTick->CTRL = 0;                                 // Disable SysTick,关闭系统定时器
                SysTick->LOAD = (168000)-1;         // 配置计数值(168000)-1 ~ 0
                SysTick->VAL  = 0;                 // Clear current value as well as count flag
                SysTick->CTRL = 5;                 // Enable SysTick timer with processor clock
                while ((SysTick->CTRL & 0x10000)==0);// Wait until count flag is set
        }
        
        SysTick->CTRL = 0;                 // Disable SysTick        

}
//定义fputc函数用于printf打印输出语句
struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f)
{
        USART_SendData(USART1,ch);
        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
        return (ch);
}

void usart1_init(uint32_t baud)
{
        //打开PA口硬件时钟
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
        //打开串口1的硬件时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
        
        //初始化GPIOA引脚
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10; //第9和10根引脚
        GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF;            //复用功能模式
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        //推挽输出,增加输出电流能力。
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//高速响应
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;  //没有使能上下拉电阻
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        
        //将PA9和PA10连接到串口1
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
        
        //串口1的配置
        USART_InitStructure.USART_BaudRate = baud;                   //设置波特率  
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;  //8位数据位
        USART_InitStructure.USART_StopBits = USART_StopBits_1;       //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_ITConfig(USART1, USART_IT_RXNE, ENABLE);
        
        //优先级的配置
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        //使能串口1工作
        USART_Cmd(USART1, ENABLE);
        
        
        

}

void usart3_init(uint32_t baud)
{
        //打开PB口硬件时钟
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
        //打开串口3的硬件时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
        
        //初始化GPIOA引脚
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11; //第10和11根引脚
        GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF;            //复用功能模式
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        //推挽输出,增加输出电流能力。
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//高速响应
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;  //没有使能上下拉电阻
        GPIO_Init(GPIOB,&GPIO_InitStructure);
        
        //将PB10和PB11连接到串口3
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3);
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3);
        
        //串口3的配置
        USART_InitStructure.USART_BaudRate = baud;                   //设置波特率  
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;  //8位数据位
        USART_InitStructure.USART_StopBits = USART_StopBits_1;       //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);
        
        //优先级的配置
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        //使能串口3工作
        USART_Cmd(USART3, ENABLE);
        
        
        

}

void usart3_send_str(char *pstr)
{
        char *p=pstr;
        {
                while(*p!='\0') //字符串结尾是以/0
                {
                        //串口3发送数据  将接收的数据发送给PC
                        USART_SendData(USART3,*p);
                        //检测串口3的数据缓冲区  若没有发送完毕,继续等待;发送完毕跳出循环
                        while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);
                        USART_ClearFlag(USART3,USART_FLAG_TXE);
                        
                        //指针偏移
                        p++;
               
                }
        
        }
               

}

//蓝牙AT指令配置,此时蓝牙4.0模块不能和手机连接
void ble_config_set(void)
{
        //发送AT的测试指令
        usart3_send_str("AT\r\n");
        delay_ms(500);
        
        
        //发送更改模块名字指令(需要复位生效,如果发送AT+RESET搜索蓝牙模块名字没有变更,那么请重新对蓝牙模块上电)
        usart3_send_str("AT+NAMEwkkkkk\r\n");
        delay_ms(500);
        
        //发送复位模块的指令
        usart3_send_str("AT+RESET\r\n");
        delay_ms(2000);


}

int main(void)
{
        
        
        //使能(打开)端口F的硬件时钟,就是对端口F供电
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);


        //初始化GPIOF引脚
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;            //第9根引脚
        GPIO_InitStructure.GPIO_Mode= GPIO_Mode_OUT;            //复用功能模式
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        //推挽输出,增加输出电流能力。
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//高速响应
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;  //没有使能上下拉电阻
        GPIO_Init(GPIOF,&GPIO_InitStructure);
        
        PFout(9)=1;
        PFout(10)=1;
        
        //串口1初始化 波特率115200bps
        usart1_init(115200);
        //串口3初始化 波特率9600bps
        usart3_init(9600);
        
        printf("Bluetooth\r\n");
        
        ble_config_set();
        


        while(1)
        {
               

        }



}


void USART3_IRQHandler(void)
{
        uint8_t d;
        //检测中断标志位
        if(USART_GetITStatus(USART3,USART_IT_RXNE)==SET)
        {
                //接收数据
                d=USART_ReceiveData(USART3);
               

                //串口1发送数据  将接收的数据发送给PC
                USART_SendData(USART1,d);
                //检测串口1的数据缓冲区  若没有发送完毕,继续等待;发送完毕跳出循环
                while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
               
               
                //清空中断标志位
                USART_ClearITPendingBit(USART3,USART_IT_RXNE);
        
        
        }
        

        
}








1.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2021-10-12
在线时间
7 小时
 楼主| 发表于 2021-11-11 19:44:40 | 显示全部楼层
蓝牙倒是可以正常使用 为啥配置的时候 AT指令的回复不正确
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 15:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表