您现在的位置是:首页 >学无止境 >STM32学习记录——使用蓝牙点亮LED网站首页学无止境
STM32学习记录——使用蓝牙点亮LED
简介STM32学习记录——使用蓝牙点亮LED
文章目录
前言
今天记录一个蓝牙模块的简单应用,有关蓝牙的AT指令模式的设置在前面的记录中已经详细记录过,如果忘记了可以看看下面的文章。
一、学习目的
本次学习的目的是通过手机连接蓝牙模块,并实现用手机控制LED的亮灭。我使用的是STM32F103C8T6核心板,LED的引脚是PC13。如果有兴趣可以自己通过蓝牙实现其他功能,例如控制舵机转动和控制OLED屏的显示。
二、模块介绍
我使用的依旧是HC-05蓝牙模块,并将蓝牙设置为从机。由于我使用的是最小系统板,而最小系统板的PA9和PA10引脚需要连接USB转TTL模块来为单片机烧录代码。 所以在接线方面有如下调整:RXD--PA2,TXD--PA3,VCC--5V,GND--GND。
其中PA2和PA3是我自己定义的,将RXD对应端口设置为复用推挽输出模式(GPIO_Mode_AF_PP),TXD对应端口设置为浮空输入模式(GPIO_Mode_IN_FLOATING)即可。端口可以根据需求更改。
三、代码记录
hc05.h
#ifndef __HCSR_H
#define __HCSR_H
#include "sys.h"
void My_USART2_Init(void);
void USART2_IRQHandler(void);
#endif
hc05.c
该文件中主要是初始化了两个GPIO口(PA2,PA3)供蓝牙模块连接使用。初始化了串口2作为蓝牙模块接受和发送信号的通道(手机通过串口发送信息给蓝牙模块,蓝牙模块接受信息并发送给单片机),并且定义了一个变量res作为信号传递大使。
#include "hc05.h"
u8 res;
void My_USART2_Init(void)
{
GPIO_InitTypeDef GPIO_InitStrue;
USART_InitTypeDef USART_InitStrue;
NVIC_InitTypeDef NVIC_InitStrue;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
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);
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);
}
void USART2_IRQHandler(void)
{
if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)
{
res= USART_ReceiveData(USART2);
// USART_SendData(USART2,res);
}
}
led.h
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
#define LED0 PCout(13)
#endif
led.c
使能核心板上自带的LED,引脚是PC13,如果需要使用其他引脚,直接更改即可。
#include "LED.h"
#include "stm32f10x.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_13);
}
main.c
通过用手机发送信号传递大使(res),控制LED亮灭。
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "hc05.h"
#include "led.h"
extern u8 res;
int main(void)
{
int i;
char a[]="abcdefg";
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
My_USART2_Init();
NVIC_Configuration();
LED_Init();
while(1)
{
if(res==01)
{
LED0=0;
for(i=0;i<7;i++)
{
USART_SendData(USART2, a[i]);
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
}
res=0;
}
if(res==02)
{
LED0=1;
res=0;
}
}
}
四、实际操作
打开手机上的串口调试助手,我使用的是下面这款,其他的也是可以的。
选择之前更改过名字的蓝牙,并输入密码
发送res设置的值,就可以看见单片机上LED的变化了。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。