本文是对基于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); //初始化GPIO
USART_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); //暂存到RxData
if (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当包尾,在手机的蓝牙调试中记得加上,点灯都会了,其他关于此模块都差不多。