STM32——HC-05蓝牙的调试

前言

今晚调试蓝牙的时候遇到了一个问题。。。,串口可以接收,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

总结

代码一点问题都没有,就是蓝牙不能用,之前还能用,估计是这个蓝牙坏了。

### STM32HC-05蓝牙模块的配置及使用教程 #### 一、硬件连接 在实现STM32HC-05蓝牙模块的通信前,需完成两者的硬件连接。通常情况下,HC-05模块具有四个主要引脚:VCC、GND、TXD 和 RXD。这些引脚分别用于供电和数据传输。 - **电源连接** 将 HC-05 的 VCC 连接到 STM32 的 3.3V 或 5V 输出端(具体取决于模块版本),并将 GND 连接至 STM32 地线[^1]。 - **信号连接** TXD 引脚负责发送数据,RXD 则接收数据。因此,应将 HC-05 的 TXD 连接到 STM32 的 USART 接收引脚 (如 PA10),同时将 HC-05 的 RXD 连接到 STM32 的 USART 发送引脚 (如 PA9)。 需要注意的是,某些 HC-05 模块可能需要通过电平转换器来适配 STM32 的电压等级。 --- #### 二、软件设置 为了使 STM32 正确解析来自 HC-05 的数据并与其交互,必须初始化 UART 外设以及编写相应的驱动程序。 ##### 初始化UART外设 以下是基于 HAL 库的一段典型代码示例: ```c #include "stm32f1xx_hal.h" void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 9600; // 设置波特率为 9600bps huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } } ``` 上述代码片段展示了如何配置 USART1 来支持与 HC-05 的串口通信。其中,`BaudRate` 参数被设定为 9600 bps,默认适用于大多数 HC-05 模块[^2]。 --- #### 三、AT指令调试 HC-05 支持 AT 命令集以调整其工作模式和其他参数。例如,可以通过向模块发送特定命令更改名称、密码或切换主/从角色。 以下是一些常用的 AT 指令及其作用: - `AT+NAME?`: 查询当前设备名。 - `AT+NAME<new_name>`: 修改设备名为 `<new_name>`。 - `AT+PSWD?`: 获取绑定密钥。 - `AT+PSWD<password>`: 设定新的绑定密钥为 `<password>`。 - `AT+ROLE?<role_value>`: 查看当前角色;`0` 表示从机,`1` 表示主机。 执行这些操作时,建议借助串口工具(如 SecureCRT 或 Putty)验证返回结果是否符合预期。 --- #### 四、实际应用案例——手机控制LED灯 假设目标是利用智能手机上的蓝牙应用程序远程操控连接到 STM32 的 LED 灯,则可按照如下逻辑设计固件框架: 当收到字符 'A' 时点亮 LED; 当收到字符 'B' 时熄灭 LED。 对应 C 实现如下所示: ```c uint8_t RxData; void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART1){ if(RxData == 'A') { // 如果接收到'A' HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // 打开PC13对应的LED } else if(RxData == 'B'){// 如果接收到'B' HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); // 关闭PC13对应的LED } HAL_UART_Receive_IT(&huart1, &RxData, 1); } } int main(void) { /* MCU Initialization */ while(1){ __asm__("nop"); } } ``` 此部分实现了简单的事件响应机制,并演示了如何处理外部输入触发本地动作。 --- #### 总结 综上所述,成功搭建 STM32HC-05 蓝牙模块间的桥梁涉及多个环节,包括但不限于物理连线确立、协议栈定制化裁剪以及最终业务场景落地实践等方面的工作内容。希望以上分享能够帮助理解整个流程的核心要点!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我与nano

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值