前言
今晚调试蓝牙的时候遇到了一个问题。。。,串口可以接收,32不能接收。
一、AT指令
要先让蓝牙进入AT模式AT指令才能使用。
二、进入AT指令
主要接线,RX-TX,TX-RX,EN口接到3.3v不然进入不了AT模式
进入AT指令会看到蓝牙上的灯慢闪。波特率默认是38400
可以看到,蓝牙可以进行相关的调试
uart.c
#include "delay.h"
#include "usart3.h"
#include "stdarg.h"
#include "stdio.h"
#include "string.h"
#include "timer.h"
//
//±¾³ÌÐòÖ»¹©Ñ§Ï°Ê¹Óã¬Î´¾×÷ÕßÐí¿É£¬²»µÃÓÃÓÚÆäËüÈκÎÓÃ;
//ALIENTEK STM32¿ª·¢°å
//´®¿Ú3Çý¶¯´úÂë
//ÕýµãÔ×Ó@ALIENTEK
//¼¼ÊõÂÛ̳:www.openedv.com
//ÐÞ¸ÄÈÕÆÚ:2015/3/29
//°æ±¾£ºV1.0
//°æÈ¨ËùÓУ¬µÁ°æ±Ø¾¿¡£
//Copyright(C) ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ 2009-2019
//All rights reserved
//
//´®¿Ú½ÓÊÕ»º´æÇø
u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //½ÓÊÕ»º³å,×î´óUSART3_MAX_RECV_LEN¸ö×Ö½Ú.
u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //·¢ËÍ»º³å,×î´óUSART3_MAX_SEND_LEN×Ö½Ú
//ͨ¹ýÅжϽÓÊÕÁ¬Ðø2¸ö×Ö·ûÖ®¼äµÄʱ¼ä²î²»´óÓÚ10msÀ´¾ö¶¨ÊDz»ÊÇÒ»´ÎÁ¬ÐøµÄÊý¾Ý.
//Èç¹û2¸ö×Ö·û½ÓÊÕ¼ä¸ô³¬¹ý10ms,ÔòÈÏΪ²»ÊÇ1´ÎÁ¬ÐøÊý¾Ý.Ò²¾ÍÊdz¬¹ý10msûÓнÓÊÕµ½
//ÈκÎÊý¾Ý,Ôò±íʾ´Ë´Î½ÓÊÕÍê±Ï.
//½ÓÊÕµ½µÄÊý¾Ý״̬
//[15]:0,ûÓнÓÊÕµ½Êý¾Ý;1,½ÓÊÕµ½ÁËÒ»ÅúÊý¾Ý.
//[14:0]:½ÓÊÕµ½µÄÊý¾Ý³¤¶È
vu16 USART3_RX_STA=0;
void USART3_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//½ÓÊÕµ½Êý¾Ý
{
res =USART_ReceiveData(USART3);
if((USART3_RX_STA&(1<<15))==0)//½ÓÊÕÍêµÄÒ»ÅúÊý¾Ý,»¹Ã»Óб»´¦Àí,Ôò²»ÔÙ½ÓÊÕÆäËûÊý¾Ý
{
if(USART3_RX_STA<USART3_MAX_RECV_LEN) //»¹¿ÉÒÔ½ÓÊÕÊý¾Ý
{
TIM_SetCounter(TIM7,0);//¼ÆÊýÆ÷Çå¿Õ //¼ÆÊýÆ÷Çå¿Õ
if(USART3_RX_STA==0) //ʹÄܶ¨Ê±Æ÷7µÄÖжÏ
{
TIM_Cmd(TIM7,ENABLE);//ʹÄܶ¨Ê±Æ÷7
}
USART3_RX_BUF[USART3_RX_STA++]=res; //¼Ç¼½ÓÊÕµ½µÄÖµ
}else
{
USART3_RX_STA|=1<<15; //Ç¿ÖÆ±ê¼Ç½ÓÊÕÍê³É
}
}
}
}
//³õʼ»¯IO ´®¿Ú3
//pclk1:PCLK1ʱÖÓÆµÂÊ(Mhz)
//bound:²¨ÌØÂÊ
void usart3_init(u32 bound)
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // GPIOBʱÖÓ
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //´®¿Ú3ʱÖÓʹÄÜ
USART_DeInit(USART3); //¸´Î»´®¿Ú3
//USART3_TX PB10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö
GPIO_Init(GPIOB, &GPIO_InitStructure); //³õʼ»¯PB10
//USART3_RX PB11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿ÕÊäÈë
GPIO_Init(GPIOB, &GPIO_InitStructure); //³õʼ»¯PB11
USART_InitStructure.USART_BaudRate = 9600;//²¨ÌØÂÊÒ»°ãÉèÖÃΪ9600;
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); //ʹÄÜ´®¿Ú
//ʹÄܽÓÊÕÖжÏ
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//¿ªÆôÖжÏ
//ÉèÖÃÖжÏÓÅÏȼ¶
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//ÇÀÕ¼ÓÅÏȼ¶3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //×ÓÓÅÏȼ¶3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀʹÄÜ
NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷
TIM7_Int_Init(99,7199); //10msÖжÏ
USART3_RX_STA=0; //ÇåÁã
TIM_Cmd(TIM7,DISABLE); //¹Ø±Õ¶¨Ê±Æ÷7
}
//´®¿Ú3,printf º¯Êý
//È·±£Ò»´Î·¢ËÍÊý¾Ý²»³¬¹ýUSART3_MAX_SEND_LEN×Ö½Ú
void u3_printf(char* fmt,...)
{
u16 i,j;
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART3_TX_BUF,fmt,ap);
va_end(ap);
i=strlen((const char*)USART3_TX_BUF); //´Ë´Î·¢ËÍÊý¾ÝµÄ³¤¶È
for(j=0;j<i;j++) //Ñ»··¢ËÍÊý¾Ý
{
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //Ñ»··¢ËÍ,Ö±µ½·¢ËÍÍê±Ï
USART_SendData(USART3,USART3_TX_BUF[j]);
}
}
uart.h
#ifndef __USART3_H
#define __USART3_H
#include "sys.h"
//
//±¾³ÌÐòÖ»¹©Ñ§Ï°Ê¹Óã¬Î´¾×÷ÕßÐí¿É£¬²»µÃÓÃÓÚÆäËüÈκÎÓÃ;
//ALIENTEK STM32¿ª·¢°å
//´®¿Ú3Çý¶¯´úÂë
//ÕýµãÔ×Ó@ALIENTEK
//¼¼ÊõÂÛ̳:www.openedv.com
//ÐÞ¸ÄÈÕÆÚ:2015/3/29
//°æ±¾£ºV1.0
//°æÈ¨ËùÓУ¬µÁ°æ±Ø¾¿¡£
//Copyright(C) ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ 2009-2019
//All rights reserved
//
#define USART3_MAX_RECV_LEN 600 //×î´ó½ÓÊÕ»º´æ×Ö½ÚÊý
#define USART3_MAX_SEND_LEN 600 //×î´ó·¢ËÍ»º´æ×Ö½ÚÊý
#define USART3_RX_EN 1 //0,²»½ÓÊÕ;1,½ÓÊÕ.
extern u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //½ÓÊÕ»º³å,×î´óUSART3_MAX_RECV_LEN×Ö½Ú
extern u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //·¢ËÍ»º³å,×î´óUSART3_MAX_SEND_LEN×Ö½Ú
extern vu16 USART3_RX_STA; //½ÓÊÕÊý¾Ý״̬
void usart3_init(u32 bound); //´®¿Ú2³õʼ»¯
void u3_printf(char* fmt,...);
#endif
hc-05.c
#include "delay.h"
#include "usart.h"
#include "usart3.h"
#include "hc05.h"
#include "led.h"
#include "string.h"
#include "math.h"
//
//±¾³ÌÐòÖ»¹©Ñ§Ï°Ê¹Óã¬Î´¾×÷ÕßÐí¿É£¬²»µÃÓÃÓÚÆäËüÈκÎÓÃ;
//ALIENTEK STM32¿ª·¢°å
//ATK-HC05À¶ÑÀÄ£¿éÇý¶¯´úÂë
//ÕýµãÔ×Ó@ALIENTEK
//¼¼ÊõÂÛ̳:www.openedv.com
//ÐÞ¸ÄÈÕÆÚ:2015/3/29
//°æ±¾£ºV1.1
//°æÈ¨ËùÓУ¬µÁ°æ±Ø¾¿¡£
//Copyright(C) ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ 2009-2019
//All rights reserved
//********************************************************************************
//V1.1 20140329
//ÐÞ¸ÄLEDµÄÁ¬½Ó£¬ÔÀ´½ÓPC5£¬¸ÄΪPA4£¬ÒÔ¼æÈÝMiniSTM32¿ª·¢°åV3.0
//
//³õʼ»¯ATK-HC05Ä£¿é
//·µ»ØÖµ:0,³É¹¦;1,ʧ°Ü.
u8 HC05_Init(void)
{
u8 retry=10,t;
u8 temp=1;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //ʹÄÜPORTA
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; // ¶Ë¿ÚÅäÖÃ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //ÉÏÀÊäÈë
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO¿ÚËÙ¶ÈΪ50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //¸ù¾ÝÉ趨²ÎÊý³õʼ»¯A15
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // ¶Ë¿ÚÅäÖÃ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //ÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO¿ÚËÙ¶ÈΪ50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //¸ù¾ÝÉ趨²ÎÊý³õʼ»¯GPIOA4
GPIO_SetBits(GPIOA,GPIO_Pin_4);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
HC05_KEY=1;
HC05_LED=1;
usart3_init(9600); //³õʼ»¯´®¿Ú2Ϊ:9600,²¨ÌØÂÊ.
while(retry--)
{
HC05_KEY=1; //KEYÖøß,½øÈëATģʽ
delay_ms(10);
u3_printf("AT\r\n"); //·¢ËÍAT²âÊÔÖ¸Áî
HC05_KEY=0; //KEYÀµÍ,Í˳öATģʽ
for(t=0;t<10;t++) //×µÈ´ý50ms,À´½ÓÊÕHC05Ä£¿éµÄ»ØÓ¦
{
if(USART3_RX_STA&0X8000)break;
delay_ms(5);
}
if(USART3_RX_STA&0X8000) //½ÓÊÕµ½Ò»´ÎÊý¾ÝÁË
{
temp=USART3_RX_STA&0X7FFF; //µÃµ½Êý¾Ý³¤¶È
USART3_RX_STA=0;
if(temp==4&&USART3_RX_BUF[0]=='O'&&USART3_RX_BUF[1]=='K')
{
temp=0;//½ÓÊÕµ½OKÏìÓ¦
break;
}
}
}
if(retry==0)temp=1; //¼ì²âʧ°Ü
return temp;
}
//»ñÈ¡ATK-HC05Ä£¿éµÄ½ÇÉ«
//·µ»ØÖµ:0,´Ó»ú;1,Ö÷»ú;0XFF,»ñȡʧ°Ü.
u8 HC05_Get_Role(void)
{
u8 retry=0X0F;
u8 temp,t;
while(retry--)
{
HC05_KEY=1; //KEYÖøß,½øÈëATģʽ
delay_ms(10);
u3_printf("AT+ROLE?\r\n"); //²éѯ½ÇÉ«
for(t=0;t<20;t++) //×µÈ´ý200ms,À´½ÓÊÕHC05Ä£¿éµÄ»ØÓ¦
{
delay_ms(10);
if(USART3_RX_STA&0X8000)break;
}
HC05_KEY=0; //KEYÀµÍ,Í˳öATģʽ
if(USART3_RX_STA&0X8000) //½ÓÊÕµ½Ò»´ÎÊý¾ÝÁË
{
temp=USART3_RX_STA&0X7FFF; //µÃµ½Êý¾Ý³¤¶È
USART3_RX_STA=0;
if(temp==13&&USART3_RX_BUF[0]=='+')//½ÓÊÕµ½ÕýÈ·µÄÓ¦´ðÁË
{
temp=USART3_RX_BUF[6]-'0';//µÃµ½Ö÷´Óģʽֵ
break;
}
}
}
if(retry==0)temp=0XFF;//²éѯʧ°Ü.
return temp;
}
//ATK-HC05ÉèÖÃÃüÁî
//´Ëº¯ÊýÓÃÓÚÉèÖÃATK-HC05,ÊÊÓÃÓÚ½ö·µ»ØOKÓ¦´ðµÄATÖ¸Áî
//atstr:ATÖ¸Áî´®.±ÈÈç:"AT+RESET"/"AT+UART=9600,0,0"/"AT+ROLE=0"µÈ×Ö·û´®
//·µ»ØÖµ:0,ÉèÖóɹ¦;ÆäËû,ÉèÖÃʧ°Ü.
u8 HC05_Set_Cmd(u8* atstr)
{
u8 retry=0X0F;
u8 temp,t;
while(retry--)
{
HC05_KEY=1; //KEYÖøß,½øÈëATģʽ
delay_ms(10);
u3_printf("%s\r\n",atstr); //·¢ËÍAT×Ö·û´®
HC05_KEY=0; //KEYÀµÍ,Í˳öATģʽ
for(t=0;t<20;t++) //×µÈ´ý100ms,À´½ÓÊÕHC05Ä£¿éµÄ»ØÓ¦
{
if(USART3_RX_STA&0X8000)break;
delay_ms(5);
}
if(USART3_RX_STA&0X8000) //½ÓÊÕµ½Ò»´ÎÊý¾ÝÁË
{
temp=USART3_RX_STA&0X7FFF; //µÃµ½Êý¾Ý³¤¶È
USART3_RX_STA=0;
if(temp==4&&USART3_RX_BUF[0]=='O')//½ÓÊÕµ½ÕýÈ·µÄÓ¦´ðÁË
{
temp=0;
break;
}
}
}
if(retry==0)temp=0XFF;//ÉèÖÃʧ°Ü.
return temp;
}
///
//ͨ¹ý¸Ãº¯Êý,¿ÉÒÔÀûÓÃUSMART,µ÷ÊÔ½ÓÔÚ´®¿Ú3ÉϵÄATK-HC05Ä£¿é
//str:ÃüÁî´®.(ÕâÀï×¢Òâ²»ÔÙÐèÒªÔÙÊäÈë»Ø³µ·û)
void HC05_CFG_CMD(u8 *str)
{
u8 temp;
u8 t;
HC05_KEY=1; //KEYÖøß,½øÈëATģʽ
delay_ms(10);
u3_printf("%s\r\n",(char*)str); //·¢ËÍÖ¸Áî
for(t=0;t<50;t++) //×µÈ´ý500ms,À´½ÓÊÕHC05Ä£¿éµÄ»ØÓ¦
{
if(USART3_RX_STA&0X8000)break;
delay_ms(10);
}
HC05_KEY=0; //KEYÀµÍ,Í˳öATģʽ
if(USART3_RX_STA&0X8000) //½ÓÊÕµ½Ò»´ÎÊý¾ÝÁË
{
temp=USART3_RX_STA&0X7FFF; //µÃµ½Êý¾Ý³¤¶È
USART3_RX_STA=0;
USART3_RX_BUF[temp]=0; //¼Ó½áÊø·û
printf("\r\n%s",USART3_RX_BUF);//·¢ËÍ»ØÓ¦Êý¾Ýµ½´®¿Ú1
}
}
hc-05.h
#ifndef __HC05_H
#define __HC05_H
#include "sys.h"
//
//±¾³ÌÐòÖ»¹©Ñ§Ï°Ê¹Óã¬Î´¾×÷ÕßÐí¿É£¬²»µÃÓÃÓÚÆäËüÈκÎÓÃ;
//ALIENTEK STM32¿ª·¢°å
//ATK-HC05À¶ÑÀÄ£¿éÇý¶¯´úÂë
//ÕýµãÔ×Ó@ALIENTEK
//¼¼ÊõÂÛ̳:www.openedv.com
//ÐÞ¸ÄÈÕÆÚ:2015/3/29
//°æ±¾£ºV1.1
//°æÈ¨ËùÓУ¬µÁ°æ±Ø¾¿¡£
//Copyright(C) ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ 2009-2019
//All rights reserved
//********************************************************************************
//V1.1 20140329
//ÐÞ¸ÄLEDµÄÁ¬½Ó£¬ÔÀ´½ÓPC5£¬¸ÄΪPA4£¬ÒÔ¼æÈÝMiniSTM32¿ª·¢°åV3.0
//
#define HC05_KEY PAout(4) //À¶ÑÀ¿ØÖÆKEYÐźÅ
#define HC05_LED PAin(15) //À¶ÑÀÁ¬½Ó״̬ÐźÅ
u8 HC05_Init(void);
void HC05_CFG_CMD(u8 *str);
u8 HC05_Get_Role(void);
u8 HC05_Set_Cmd(u8* atstr);
#endif
主函数这么写就可以了,记得每次接收后都要清0
总结
代码一点问题都没有,就是蓝牙不能用,之前还能用,估计是这个蓝牙坏了。