STM32蓝牙模块配置与代码

        蓝牙可以当作无线串口使用。使用USB-TTL连接,上电前按住小按键进入AT模式(慢闪,小红灯每2秒闪烁一次),打开串口助手,选择波特率为38400即可发送AT指令到蓝牙。

常用配置:

AT+NAME=名字      AT+ROLE=1(主机模式)     AT+ROLE=0(从机模式) 

AT+PSWD=1234   AT+ORGL(恢复出场设置) AT+ADDR?(查询B蓝牙的地址)

AT+UART=9600,0,0(设置波特率)

        连接单片机串口2,正常上电(没有按小按键,快闪,每1秒闪一次),使用手机蓝牙助手连接该蓝牙,若蓝牙每2秒闪一次,一次连续闪亮下则表示配对成功。

usart2.c配置,波特率默认为9600

#include "sys.h"
#include "usart.h"	  
// 	 
//Èç¹ûʹÓÃucos,Ôò°üÀ¨ÏÂÃæµÄÍ·Îļþ¼´¿É.
#if SYSTEM_SUPPORT_OS
#include "includes.h"					//ucos ʹÓÃ	  
#endif
u8 res;  				  //ÉèÖÃÈ«¾Ö±äÁ¿
  //#define tbuf 50
void My_USART2_Init(void)  
{  
    GPIO_InitTypeDef GPIO_InitStrue;  
    USART_InitTypeDef USART_InitStrue;  
    NVIC_InitTypeDef NVIC_InitStrue;  
      
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIO¶Ë¿ÚʹÄÜ  
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//´®¿Ú¶Ë¿ÚʹÄÜ  
      
    GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;  
    GPIO_InitStrue.GPIO_Pin=GPIO_Pin_2;  
    GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;  
    GPIO_Init(GPIOA,&GPIO_InitStrue);  
      
    GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;  
    GPIO_InitStrue.GPIO_Pin=GPIO_Pin_3;  
    GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;  
    GPIO_Init(GPIOA,&GPIO_InitStrue);  
      
    USART_InitStrue.USART_BaudRate=9600;  
    USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;  
    USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;  
    USART_InitStrue.USART_Parity=USART_Parity_No;  
    USART_InitStrue.USART_StopBits=USART_StopBits_1;  
    USART_InitStrue.USART_WordLength=USART_WordLength_8b;  
      
    USART_Init(USART2,&USART_InitStrue);
      
    USART_Cmd(USART2,ENABLE);					//ʹÄÜ´®¿Ú2  
      
    USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//¿ªÆô½ÓÊÕÖÐ¶Ï  
      
    NVIC_InitStrue.NVIC_IRQChannel=USART2_IRQn;  
    NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;  
    NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=0;  
    NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;  
    NVIC_Init(&NVIC_InitStrue);  
      
}  

//u8  RX_buffer[tbuf];
//u8 RX_num=0;

void USART2_IRQHandler(void)  
{  

     if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)  
  {  
     res= USART_ReceiveData(USART2); 	 
     //USART_SendData(USART2,res);     //´®¿Ú2·¢ËÍÊý¾Ý¸øÀ¶ÑÀÄ£¿é½ÓÊÕ£¬Ò²¾ÍÊÇÊÖ»úapp½ÓÊÕµ½µÄÊý¾Ý
  }  
}  

主函数,通过手机端发送“1”(ascii格式)拉低PB5电平,并且单片机向蓝牙模块(也可以理解为手机)发送“abcdefg”,发送“2”拉低PB5电平

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "usart2.h"
extern u8 res;										//ÉèÖÃÍⲿȫ¾Ö±äÁ¿
int main(void)
{
	int i;
	char a[]="abcdefg";
  delay_init();	    	 //ÑÓʱº¯Êý³õʼ»¯	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	 //ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶
	uart_init(115200);	 //´®¿Ú³õʼ»¯Îª115200
 	LED_Init();			     //LED¶Ë¿Ú³õʼ»¯
	 KEY_Init();
	 My_USART2_Init();
	while(1)
	{
		if(res=='1')
		{
			GPIO_ResetBits(GPIOB,GPIO_Pin_5);		//PA.1ָʾµÆÁÁ
			delay_ms(500);							//¼ÙÈçÒªÓÃÑÓʱº¯Êý£¬×îºÃ¾ÍÔÚÉÏÃæ³õʼ»¯ÑÓʱº¯Êý£¬²»È»³ÌÐòºÜÈÝÒ×¾ÍÅÜ·É
			for(i=0;i<7;i++)
			{
				USART_SendData(USART2, a[i]);			//Ïò´®¿Ú2·¢ËÍÊý¾Ý¸øÀ¶ÑÀÄ£¿é
		while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);//µÈ´ý·¢ËͽáÊø
			}
			res=0;
		}
		if(res=='2')
		{
			GPIO_SetBits(GPIOB,GPIO_Pin_5);			//PA.1ָʾµÆÃð
			res=0;
		}
		
	}	 
}

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于STM32蓝牙模块代码示例,使用USART通信: ```c #include "stm32f10x.h" #define TXBUFFERSIZE 100 #define RXBUFFERSIZE 100 void USART1_Init(void); void GPIO_Configuration(void); void NVIC_Configuration(void); uint8_t TxBuffer[TXBUFFERSIZE]; uint8_t RxBuffer[RXBUFFERSIZE]; __IO uint16_t TxCount = 0; __IO uint16_t RxCount = 0; int main(void) { GPIO_Configuration(); USART1_Init(); NVIC_Configuration(); while(1) { if (RxCount != 0) { // 处理接收到的数据 // ... // 清空接收缓冲区 memset(RxBuffer, 0, RXBUFFERSIZE); RxCount = 0; } } } void USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); // 配置USART1的TX引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置USART1的RX引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置USART1 USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; 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); // 使能USART1 USART_Cmd(USART1, ENABLE); } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 配置PA0作为按键输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); } void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; // 使能USART1的接收中断 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); // 使能EXTI0中断 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // 配置PA0为中断源 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); // 配置PA0的中断方式为下降沿触发 EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } // USART1中断处理函数 void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { // 读取接收到的数据 RxBuffer[RxCount++] = USART_ReceiveData(USART1); } if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) { // 发送缓冲区中的数据 USART_SendData(USART1, TxBuffer[TxCount++]); // 发送完毕后禁用TXE中断 if(TxCount == TXBUFFERSIZE) { USART_ITConfig(USART1, USART_IT_TXE, DISABLE); } } } // EXTI0中断处理函数 void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) { // 按键按下,向蓝牙模块发送数据 sprintf((char*)TxBuffer, "Hello, Bluetooth!\r\n"); TxCount = 0; USART_ITConfig(USART1, USART_IT_TXE, ENABLE); EXTI_ClearITPendingBit(EXTI_Line0); } } ``` 此代码仅供参考,具体实现可能根据不同的蓝牙模块和应用场景有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值