本文是对基于STM32的HC05蓝牙点灯实验,目的在于认识HC05蓝牙模块,学会配置HC05,知道怎么用蓝牙在手机上控制单片机并且传输数据,虽然本文只控制led,但是点灯就是基础,主要在于学习hc05蓝牙模块。
1.认识一下HC05模块
6根引脚,名称与功能如下;
VCC 接电源的正极,电压的范围为3.3v到5.0v;
VDD 为外接供电电源输入端;
GND 地线;
TXD:模块串口发送引脚(TTL电平,不能直接接RS232电平),可直接接单片机的RXD引脚;
RXD:模块串口接收引脚(TTL电平,不能直接接RS232电平),可直接接单片机的TXD引脚;
KEY:用于进入AT状态;
LED:这个引脚是用来检测蓝牙模块是否已经连接上了其他蓝牙设备;
原理啥的可以看参考手册,但是我觉得HC蓝牙本质上就是控制串口,所以学好串口就会这玩意。
2.hc05使用前的配置

1.首先你需要有转TTL口和两个蓝牙模块,连接方式就是tx和RX都反接,VCC对VCC,GND也是
2.将TTL插到电脑上打开串口助手(插得时候记得把蓝牙模块上面有个小按键按住,这是为了让蓝牙模块进入AT模式)
3.配置参数
1.HC-T串口助手
这是我买的HC05提供是上面的一个串口助手,按图片来操作,先进AT模式再配置,

这个串口助手把指令封装好了,测试AT指令会返回OK,波特率再调试到9600,因为我使用的是STM32F103C8T6,另外还可以给你的蓝牙起名字还有配对密码,设置好之后可以在手机上安装一个蓝牙调试器,先实现手机与电脑串口的数据传输。
这个蓝牙调试软件可以修改你的字符编码和换行符,根据需要修改。
2.XCOM串口软件
这个XCOM串口指令配置蓝牙指令可以参考这个 配置指令
3.STM32与HC05(重点)
我用的是USART1,所以连接的是A9和A10
话不多说直接上代码
Serial.h
#include "stm32f10x.h"
#include <stdio.h>
#include <stdarg.h>char Serial_RxPacket[100]; //定义一个接收存放
uint8_t Serial_RxFlag; //接收标志位void Serial_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启串口与GPIO时钟GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //tx发送引脚 输出模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //rx接收 出入模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOUSART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = 9600; //波特率USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //不使用硬件流USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; //发送接收模式USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位USART_InitStructure.USART_StopBits = USART_StopBits_1; //1位停止符USART_InitStructure.USART_WordLength = USART_WordLength_8b; //配置帧数据字长USART_Init(USART1, &USART_InitStructure); //usart结构体初始化USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //开启中断控制 使能串口NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //NVIC优先级NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStructure); //NVIC结构体配置USART_Cmd(USART1, ENABLE); //开启USART1
}void USART1_IRQHandler(void) //串口中断
{static uint8_t RxState = 0; static uint8_t pRxPacket = 0; //用于数据存储次数if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET) //判断是否接收到数据{uint8_t RxData = USART_ReceiveData(USART1); //暂存到RxDataif (RxState == 0){if (RxData == '@' && Serial_RxFlag == 0) //当接收到@字符而且标志位为0是{RxState = 1; pRxPacket = 0; }}else if (RxState == 1) { if (RxData == '\r') //当接收到\r时{RxState = 2;}else{Serial_RxPacket[pRxPacket] = RxData; //数据传给Serial_RxPacket[pRxPacket]pRxPacket ++; //同时pRxPacket 的位置++}}else if (RxState == 2){if (RxData == '\n') {RxState = 0;Serial_RxPacket[pRxPacket] = '\0'; //给字符数组加一个结束标志位Serial_RxFlag = 1;}}USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除}
}
mian.c
#include "stm32f10x.h"
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"
#include "LED.h"
#include "string.h"int main(void)
{OLED_Init();LED_Init();Serial_Init();OLED_ShowString(1, 1, "TxPacket");OLED_ShowString(3, 1, "RxPacket");while (1){if (Serial_RxFlag == 1){OLED_ShowString(4, 1, " ");OLED_ShowString(4, 1, Serial_RxPacket);if (strcmp(Serial_RxPacket, "ON") == 0){LED1_ON();Serial_SendString("LED_ON_OK\r\n");OLED_ShowString(2, 1, " ");OLED_ShowString(2, 1, "LED_ON_OK");}else if (strcmp(Serial_RxPacket, "OFF") == 0){LED1_OFF();Serial_SendString("LED_OFF_OK\r\n");OLED_ShowString(2, 1, " ");OLED_ShowString(2, 1, "LED_OFF_OK");}else{Serial_SendString("ERROR\r\n");OLED_ShowString(2, 1, " ");OLED_ShowString(2, 1, "ERROR");}Serial_RxFlag = 0;}}
}
这部分代码都是江科大讲串口传输数据包的代码,刚开始我自己做的是传输一个字符让LED点亮,后面发现一些传感器的数据都是多个的,就想先使用字符串来控制LED,后面因为没有设置好包头包尾容易乱码,而数据包的传输可以把多个单独数据打包起来,方便进行多字节的数据通信,建议大家可以看一下也江科大的32视频,受益匪浅 。
本代码使用@当包头,\r\n当包尾,在手机的蓝牙调试中记得加上,点灯都会了,其他关于此模块都差不多。
















