实验准备:
1:非正点蓝牙串口 我用的是六脚的
2:杜邦线4根
3:探索者板子或者最小核心板STM32F407
硬件连接:
PB10(TX)接蓝牙模块RX
PB11(RX)接蓝牙模块TX
VCC接单片机5V GND接32GND
软件准备:
SPP蓝牙助手
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //延时初始化
usart3_init(9600); //串口初始化波特率为115200
LED_Init(); //初始化与LED连接的硬件接口
while(1)
{
if(USART3_RX_STA&0x8000)
{
if( hc_05_test[0]==0x61)
{
LED0=0;
}
if( hc_05_test[0]==0x62)
{
LED0=1;
}
USART3_RX_STA=0;
}
LED1=!LED1;
delay_ms(100);
}
//**************************************下面是串口3初始化
#include "sys.h"
#include "usart3.h"
u8 USART3_RX_BUF[USART3_REC_LEN]; //数组用来存储接收到的数据,而USART3_REC_LEN为最多能接收的字节限度
u16 USART3_RX_STA=0; //接收状态标记 0-14位为接收字节数,15位接收完成标志位
u8 hc_05_test[2];
void usart3_init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructurea;
USART_InitTypeDef USART_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//使能串口3
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
USART_DeInit(USART3);//串口3复位 不是必要的一步
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB,&GPIO_InitStructure); //PB10设置为复用推挽输出
GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3);
NVIC_InitStructurea.NVIC_IRQChannel=USART3_IRQn;
NVIC_InitStructurea.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructurea.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructurea.NVIC_IRQChannelSubPriority=2;
NVIC_Init(&NVIC_InitStructurea); //串口3中断的设置
USART_InitStruct.USART_BaudRate=bound;//串口波特率
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;//一个停止位
USART_InitStruct.USART_WordLength=USART_WordLength_8b;//字长为8位数据格式
USART_Init(USART3,&USART_InitStruct); //串口3的一些参数设置
USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//串口3中断使能和中断类型设置
USART_Cmd(USART3,ENABLE);//串口3使能
USART3_RX_STA=0;
}
void USART3_IRQHandler()//串口3的中断
{
u8 res;//暂时缓存接收的数据
if(USART_GetITStatus(USART3,USART_IT_RXNE)!=RESET)//判断是否为串口3接收中断
{
res=USART_ReceiveData(USART3);//接收到数据放进res
if((USART3_RX_STA&0x8000)==0)//接收未完成
{
hc_05_test[0]=res;
USART3_RX_STA|=0x8000;//串口3接收完成
}
USART_ClearITPendingBit(USART3,USART_IT_RXNE);//清除接收中断标志
}
}
*********************************串口三的头文件
#ifndef USART3_H_
#define USART3_H_
#include "sys.h"
#include <stdio.h>
#define USART3_REC_LEN 200 //定义最大接收字节数 200
extern u8 USART3_RX_BUF[USART3_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节
extern u16 USART3_RX_STA;
extern u8 hc_05_test[2];//接收状态标记 0-14位为接收字节数,15位接收完成标志位
void usart3_init(u32 bound);
#endif
发送a 红灯亮 b红灯灭
总结:虽然这是一个很简单的实验,但是可以作为开发的基础,大家可以进一步拓展,例如调用其他函数之类的。希望能帮到大家
另外大家可以自己拓展,例如不识别一个字符而是用strcmp()函数识别字符串。