实验准备:
1:非正点蓝牙串口 我用的是六脚的
2:杜邦线4根
3:探索者板子或者最小核心板STM32F407
硬件连接:
PB10(TX)接蓝牙模块RX
PB11(RX)接蓝牙模块TX
VCC接单片机5V GND接32GND
软件准备:
SPP蓝牙助手
int main(void)
{ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(168); //延时初始化 usart3_init(9600); //串口初始化波特率为115200LED_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);//使能串口3RCC_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_Rx;//收发模式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);//接收到数据放进resif((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()函数识别字符串。