科星F107开发板学习笔记应用篇之蓝牙控制LED灯的学习 硬件准备: 1、科星F107开发板 2、CORX-HC05蓝牙串口模块 3、串口转USB线(可选) 4、装有安卓2.2系统以上的智能手机一台(支持蓝牙) 软件准备: 1、BluetoothDemo.apk(自主开发,可提供安卓源码) 2、串口调试助手 3、开发板程序:“科星F107开发板应用篇之蓝牙控制LED灯”(IAR5.4)
科星F107开发板学习笔记应用篇之蓝牙控制LED灯的学习.pdf
(423.89 KB)
这里我们用到了开发板的两路串口,USART1和USART2,USART负责与电脑连接,USART2负责通过蓝牙模块与安卓手机连接。下面我们看一下开发板的原理图:
下面我们开分析下程序,程序内容相对简单,主要就是两路串口的配置,程序如下: SystemInit(); TIM2_Configuration(); /* NVIC configuration */ NVIC_Configuration(); /*Configure the GPIO ports */ GPIO_Configuration(); /* Configure the USART ports*/ USART_Configuration();
这里讲一下串口2所用到的GPIO口的配置, void GPIO_Configuration(void) { GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_USART2,ENABLE);//重映像USART2的引脚
/* Configure USARTx_Tx asalternate function push-pull */ GPIO_InitStructure.GPIO_Pin= GPIO_Pin_5; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOD,&GPIO_InitStructure);
/* Configure USARTx_Rx asinput floating */ GPIO_InitStructure.GPIO_Pin= GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA,&GPIO_InitStructure);
/* Configure USARTx_Tx asalternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA,&GPIO_InitStructure);
/* Configure USARTx_Rx asinput floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA,&GPIO_InitStructure); } 我们看一下寄存器手册的内容就清楚了,科星F107开发板上USART2使用的是PD5和PD6引脚作为TX和RX引脚,所以这里我们需要把复用重映射和调试I/O配置寄存器的响应值设置为USART2是重映像的,如下图所示:
下面我们来看主函数的操作: while (1) { if(r_flag==1) { if(RxBuffer1[1]==0x31) GPIO_SetBits(GPIOA, GPIO_Pin_4); elseif(RxBuffer1[1]==0x30) GPIO_ResetBits(GPIOA, GPIO_Pin_4); if(RxBuffer1[2]==0x31) GPIO_SetBits(GPIOA, GPIO_Pin_5); elseif(RxBuffer1[2]==0x30) GPIO_ResetBits(GPIOA,GPIO_Pin_5); if(RxBuffer1[3]==0x31) GPIO_SetBits(GPIOA, GPIO_Pin_7); elseif(RxBuffer1[3]==0x30) GPIO_ResetBits(GPIOA, GPIO_Pin_7); if(RxBuffer1[4]==0x31) GPIO_SetBits(GPIOA, GPIO_Pin_6); elseif(RxBuffer1[4]==0x30) GPIO_ResetBits(GPIOA, GPIO_Pin_6);
USART_SendData(USART1, RxBuffer1[0]);//发送接收到的字符 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)//等得发送完成 { }
USART_SendData(USART1, RxBuffer1[1]);//发送接收到的字符 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)//等得发送完成 { }
USART_SendData(USART1, RxBuffer1[2]);//发送接收到的字符 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)//等得发送完成 { } USART_SendData(USART1, RxBuffer1[3]);//发送接收到的字符 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)//等得发送完成 { } USART_SendData(USART1, RxBuffer1[4]);//发送接收到的字符 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)//等得发送完成 { }
r_flag=0; } }
前面是根据串口接收到的数据进行对LED灯的亮灭操作,一共5个16进制数,第一位是没用的,一个前置字节,2~5位分别为0x31(1)或者0x30(0),0x31表示灯亮,0x30表示灯灭。 这里两路串口的数据接收缓冲区均为RxBuffer1[],所以手机发送数据可以使开发板灯亮灭,电脑通过USB转串口线发送正确数据也可以控制开发板的亮灭的,程序还把外部发送给开发板的数据通过串口1打印到电脑上。 说明,这里外部可以发送16进制数据,“0x80 0x31 0x31 0x31 0x31”,也可以发送字符“21111”,第一个字符不做解析,可为任意值。 下面我们来看演示,如下图:
是通过串口调试助手(HEX)发送的,串口调试助手HEX显示
是通过手机蓝牙演示程序发送的,串口调试助手HEX显示
是通过手机蓝牙演示程序发送的,串口调试助手字符显示
手机蓝牙演示程序的使用说明,请见文档“CORX-HC05模块控制LED灯使用说明.pdf”
|