硬件设计
HC-05将蓝牙协议完全封装了,我们只需要将其当作一个蓝牙转串口的模块来使用即可,配置也十分简单,只需要对串口进行配置就能使用。
蓝牙模块接线
蓝牙模块 STM32
TXD<---->RXD
RXD<---->TXD
VCC<---->3V3
GND<---->GND
软件设计
blue_hc05.c
#include "blue_hc05.h"
void Blue_Hc05_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(BLUE_USART_RX_GPIO_CLK|BLUE_USART_TX_GPIO_CLK, ENABLE);
RCC_APB1PeriphClockCmd(BLUE_USART_CLK, ENABLE);
/* 连接 PXx 到 USARTx_Tx*/
GPIO_PinAFConfig(BLUE_USART_RX_GPIO_PORT,BLUE_USART_RX_SOURCE, BLUE_USART_RX_AF);
/* 连接 PXx 到 USARTx__Rx*/
GPIO_PinAFConfig(BLUE_USART_TX_GPIO_PORT,BLUE_USART_TX_SOURCE, BLUE_USART_TX_AF);
/* 配置Tx引脚为复用功能 */
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = BLUE_USART_TX_PIN ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(BLUE_USART_TX_GPIO_PORT, &GPIO_InitStructure);
/* 配置Rx引脚为复用功能 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = BLUE_USART_RX_PIN;
GPIO_Init(BLUE_USART_RX_GPIO_PORT, &GPIO_InitStructure);
//USART 初始化设置
USART_InitStructure.USART_BaudRate = BLUE_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(BLUE_USART, &USART_InitStructure);
/* Configure one bit for preemption priority */
//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* 配置中断源 */
NVIC_InitStructure.NVIC_IRQChannel = BLUE_USART_IRQ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_ITConfig(BLUE_USART, USART_IT_RXNE, ENABLE);//开启中断
USART_Cmd(BLUE_USART, ENABLE); //使能串口
}
// 发送一个
void BLUE_USART_Send_Data(char data)
{
USART_SendData(BLUE_USART,data);
while(USART_GetFlagStatus(BLUE_USART,USART_FLAG_TC)==0); // 除非发送完成
}
// 发送一串
void BLUE_USART_Send_String(char *String)
{
u16 len,j;
len=strlen(String);
for(j=0;j<len;j++)
{
BLUE_USART_Send_Data(*String++);
}
}
blue_hc05.h
#ifndef __BLUE_HC05_H
#define __BLUE_HC05_H
#include "main.h"
#define BLUE_USART USART2
#define BLUE_USART_CLK RCC_APB1Periph_USART2
#define BLUE_USART_BAUDRATE 9600
#define BLUE_USART_APBxClock_FUN RCC_APB1PeriphClockCmd
#define BLUE_USART_TX_PIN GPIO_Pin_2
#define BLUE_USART_TX_GPIO_PORT GPIOA
#define BLUE_USART_TX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define BLUE_USART_TX_AF GPIO_AF_USART2
#define BLUE_USART_TX_SOURCE GPIO_PinSource2
#define BLUE_USART_RX_PIN GPIO_Pin_3
#define BLUE_USART_RX_GPIO_PORT GPIOA
#define BLUE_USART_RX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define BLUE_USART_RX_AF GPIO_AF_USART2
#define BLUE_USART_RX_SOURCE GPIO_PinSource3
#define BLUE_USART_IRQHandler USART2_IRQHandler
#define BLUE_USART_IRQ USART2_IRQn
void Blue_Hc05_Init(void);
void USART3_IRQHandler(void);
void BLUE_USART_Send_Data(char data);
void BLUE_USART_Send_String(char *String);
#endif
stm32f4xx_it.h
int Bluetooth_data;
void BLUE_USART_IRQHandler(void) // 串口1中断服务程序
{
char buf[20];
if(USART_GetITStatus(BLUE_USART,USART_IT_RXNE)!=RESET) // 接收中断标志位拉高
{
Bluetooth_data=USART_ReceiveData(BLUE_USART); // 保存接收到的指令
memset(buf, 0, sizeof(buf));
sprintf(buf, "blue = %d", Bluetooth_data);
Gui_DrawFont_GBK16(20,50,BLUE,GRAY0, buf);
}
}
main.c
int main(void)
{
Blue_Hc05_Init();
while (1)
{
}
}