STM32 F103C8T6学习笔记18:(串口通信)__HC-05蓝牙模块

今日学习配置HC-05蓝牙模块 与 STM32 F103C8T6 单片机的通信:

文章提供测试代码讲解、完整工程下载、测试效果图

主要需要用到的知识:  串口通信

目标是配置单片机串口1 与 HC-05蓝牙模块的通信,并借此传送数据打印数据给手机APP

目录

HC-05蓝牙模块:

基本特性:

引脚功能介绍:

模块STA指示灯:

HC-05 AT指令集:

HC-05蓝牙模块AT预设:

1、连线提示:

2、上位机发送AT指令对模块进行预设:

发送版本查询指令:

查询模块目前的串口配置:

AT指令对蓝牙模块进行串口波特率、停止位、校验的配置:

AT配置蓝牙模块名称:

​编辑

AT配置蓝牙PSWD配对密码:

HC-05蓝牙模块与单片机的连接:

测试程序设计:

单片机与蓝牙测试代码:

测试效果图:

整体测试工程下载:


HC-05蓝牙模块:

基本特性:

 默认波特率 9600

引脚功能介绍:

模块STA指示灯:

模块自带了一个状态指示灯:STA。该灯有3种状态:


①在模块上电的同时(也可以是之前),将KEY设置为高电平(接
VCC),此时STA慢闪(1秒亮1次),模块进入AT状态,且此时
特率固定为38400


②在模块上电的时候,将KEY悬空或接GND,此时STA快闪(1秒2
次),表示模块进入可配对状态。如果此时将KEY再拉高,模块也
会进入AT状态,但是STA依旧保持快闪。


③模块配对成功,此时STA双闪(一次闪2下,2秒闪一次)。
有了STA指示灯,我们就可以很方便的判断模块的当前状态,方便
大家使用。

HC-05 AT指令集:

模块是通过一个串口TTL接口,既实现AT指令来设置和查询相关参数,同时实现串口数据透传。所以,模块必定有两种模式:
1)AT指令模式
2)串口透传通信模块
两种模式通信波特率可能不一样

HC-05蓝牙模块AT预设:

我们首先要使用USB 转TTL模块与HC-05蓝牙模块 进行连接,通过PC上位机的串口助手来对它的一些参数进行预设:

有 2 种方法使模块进入 AT 指令状态:
1 ,上电同时 / 上电之前将 KEY 设置为 VCC 上电后,模块即进入 AT 指令状态。
2 ,模块上电后,通过将 KEY VCC ,使模块进 AT 状态。
方法 1 推荐 )进入 AT 状态后, 模块的波特率为:38400 8 位数据位, 1 位停止 位)。
方法 2 进入 AT 状态后,模块波特率和通信波特率一致。

1、连线提示:

HC-05蓝牙模块 USB 转TTL模块
RXDTXD
TXDRXD
GNDGND
VCCVCC
KEY(进入AT模式用)VCC

2、上位机发送AT指令对模块进行预设:

发送版本查询指令:
AT+VERSION?\r\n

正确反馈如下图所示:

查询模块目前的串口配置:
AT+UART?\r\n

AT指令对蓝牙模块进行串口波特率、停止位、校验的配置:
AT+UART=115200,0,0\r\n

这段指令表示设置波特率为115200,1位停止位,无校验:

AT配置蓝牙模块名称:
AT+NAME=Violet\r\n

 配置蓝牙名称为Violet:

AT配置蓝牙PSWD配对密码:
AT+PSWD=1234\r\n

这个配对密码只能4位字节长度

HC-05蓝牙模块与单片机的连接:

 经过上文的上位机串口AT指令配置后,我们就不需要让单片机对蓝牙模块进行额外配置了:

因此KEY就不需要连接高电平,可以悬空了:

HC-05蓝牙模块 STM32F103 C8T6
RXDPA9
TXDPA10
GNDGND
VCC5V / VCC

这里蓝牙模块是与STM32的串口1的TXD RXD引脚通信连接的......

测试程序设计:

根据之前的AT指令配置:

蓝牙模块的通信波特率被改为了   115200,1停止位,0校验

并且蓝牙的名称被改为了Violet     蓝牙PSWD配对密码 为1234

这里就尝试设计一个程序:STM32初始化串口1,和一个1s周期定时器,每隔1s发送一次数据给蓝牙模块,然后使用手机连接蓝牙进行测试效果检验:

单片机与蓝牙测试代码:

串口1初始化:

void Usart1_Init(unsigned int baud)
{
 
	GPIO_InitTypeDef gpio_initstruct;
	USART_InitTypeDef usart_initstruct;
	NVIC_InitTypeDef nvic_initstruct;
	
  // 打开串口GPIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	// 打开串口外设的时钟	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	
	
	//PA9	TXD	// 将USART Tx的GPIO配置为推挽复用模式
	gpio_initstruct.GPIO_Mode = GPIO_Mode_AF_PP;
	gpio_initstruct.GPIO_Pin = GPIO_Pin_9;
	gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &gpio_initstruct);
	
	//PA10	RXD  // 将USART Rx的GPIO配置为浮空输入模式
	gpio_initstruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	gpio_initstruct.GPIO_Pin = GPIO_Pin_10;
	gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &gpio_initstruct);
	
	usart_initstruct.USART_BaudRate = baud;                                 	      //配置波特率
	usart_initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;		//无硬件流控	
	usart_initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;						        //接收和发送	
	usart_initstruct.USART_Parity = USART_Parity_No;									              //无校验
	usart_initstruct.USART_StopBits = USART_StopBits_1;								              //配置停止位 1位停止位
	usart_initstruct.USART_WordLength = USART_WordLength_8b;							          //配置 针数据字长 8位数据位
	// 完成串口的初始化配置
	USART_Init(USART1, &usart_initstruct);

	USART_Cmd(USART1, ENABLE);														                           //使能串口
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);									                 //使能接收中断
	
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                                  /* 嵌套向量中断控制器组选择 */
	nvic_initstruct.NVIC_IRQChannel = USART1_IRQn;                                   /* 配置USART为中断源 */
	nvic_initstruct.NVIC_IRQChannelCmd = ENABLE;                                     /* 使能中断 */
	nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 0;                           /* 抢断优先级*/
	nvic_initstruct.NVIC_IRQChannelSubPriority = 2;                                  /* 子优先级 */
	
	NVIC_Init(&nvic_initstruct);                                                     /* 初始化配置NVIC */
 
}

定时器2初始化:

//初始化定时器2用作计时中断定时器:
void Timer2_Init(void)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;	
	NVIC_InitTypeDef NVIC_InitStructure;
	
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	TIM_InternalClockConfig(TIM2);//选择哪个中断就写哪个
	
	
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //修改分频,对实际情况影响不大,可以不修改,这里是不分频(可选1~72)
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上对齐模式,同时还有向下对齐,中央对齐模式
	TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;							  //计数器周期。该参数决定了计数器计数溢出前的最大值。
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;							  //分频器预分频系数。该参数决定了计数器时钟频率的变化程度。
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;            //高级计数器需要,不需要用到的直接给0就好
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);                           //用于解决一复位时就先进一次中断的情况
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;       //抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;              //响应优先级
	NVIC_Init(&NVIC_InitStructure);
	
	TIM_Cmd(TIM2, ENABLE);
	
}

定时器中断服务函数:

//定时器2中断服务函数
void TIM2_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
	{		
		if(++TimeDisplay_cnt==100)  //定时器刷新时间
		{
			TimeDisplay_cnt=0;T++;printf("%d seconds passed.....",T);
		}
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清出中断寄存器标志位,用于退出中断
	}
}

主函数情况:

测试效果图:

 发现串口成功发送了蓝牙的数据到手机APP上(蓝牙调试宝):

整体测试工程下载:

https://download.csdn.net/download/qq_64257614/89324005

基于STM32F103C8T6HC-05蓝牙通信可以通过以下步骤实现。首先,我们需要使用AT指令对HC-05蓝牙模块进行配置。这可以通过连接一个CH340模块到电脑的串口调试助手,然后发送AT指令到HC-05蓝牙模块来完成。初始波特率为38400,无奇偶校验,一位停止位。\[2\] 在STM32F103C8T6上,我们需要使用两个USART串口来实现蓝牙通信。一个串口用于与电脑进行通信,另一个串口用于与蓝牙模块进行通信。电脑发送调试命令给单片机,单片机再发送给蓝牙蓝牙再返还命令处理结果给单片机,单片机再上传给电脑。\[3\] 通过配置STM32F103C8T6串口参数,我们可以实现与蓝牙模块的通信。可以使用STM32串口库函数来发送和接收数据。通过串口蓝牙模块进行通信,我们可以实现一些功能,比如远程控制LED亮灭、蓝牙小车、远程监控等等。这为我们提供了更多的发挥空间和创造力。\[1\] 总结起来,基于STM32F103C8T6HC-05蓝牙通信需要使用AT指令对蓝牙模块进行配置,并通过两个USART串口实现与蓝牙模块的通信。这样我们就可以实现各种有趣的功能了。 #### 引用[.reference_title] - *1* *3* [基于STM32F103C8T6的HC-06蓝牙通信](https://blog.csdn.net/qq_46015224/article/details/127714326)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [stm32f103c8t6+HC-05蓝牙模块+L298N电机驱动+直流电机组成的蓝牙遥控小车](https://blog.csdn.net/NJWZS/article/details/120680567)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

NULL指向我

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

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

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

打赏作者

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

抵扣说明:

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

余额充值