当前位置: 代码迷 >> 综合 >> 正点原子探索者(STM32F407),非正点HC05蓝牙点灯代码
  详细解决方案

正点原子探索者(STM32F407),非正点HC05蓝牙点灯代码

热度:46   发布时间:2023-12-04 02:59:40.0

实验准备:

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()函数识别字符串。