旅游网站设计与建设论文,介绍网络营销的短文,网站推广的看法,二次开发源代码最近在学STM32#xff0c;基本的学完了#xff0c;想学几个模块来巩固一下知识#xff0c;就想到了蓝牙模块。玩啥好难过有很多博客教怎么连的#xff0c;但自己看起来还是有点糊涂。模块的原理和知识点我就不讲解了#xff0c;这里我主要手把手记录一下我是如何对蓝牙模块…最近在学STM32基本的学完了想学几个模块来巩固一下知识就想到了蓝牙模块。玩啥好难过有很多博客教怎么连的但自己看起来还是有点糊涂。模块的原理和知识点我就不讲解了这里我主要手把手记录一下我是如何对蓝牙模块进行学习和使用的。
所使用的资料和工具我会放在最后的链接里大家有需要的可以自行下载。
模块名称HC-05蓝牙串口通信模块
其他模块USB转TTL模块、杜邦线、蓝牙串口助手app
蓝牙模块的前期调试
因为我们只是使用到蓝牙模块的透传功能只需要用到4个引脚RXT、TXD、GND、VCC
先使用杜邦线将USB转TTL模块和HC-05蓝牙模块相连
两模块共电、共地、两模块的TX和RX交换相接USB转TTL的TXRX接蓝牙的RXTX
如图所示 然后将USB转TTL模块插到电脑上通过串口助手进行调试。
蓝牙模块通讯模式有两种工作方式命令响应工作模式和自动连工作模式在自动连接工作模式下又可分为主、从和回环三种角色 ·当模块处于自动连接工作模式时将自动根据事先设定的方式连接的数据传输 ·当模块处于命令响应工作模式时能执行AT命令用户可向模块发送各种AT 指令为模块设定控制参数或发布控制命令。
如何进入命令响应
给模块上电即插USB的时候按住蓝牙HC-05模块的那个小按键此时模块进入AT模式
蓝牙模块上有一个小灯灯快闪的时候就是自动连接模式。慢闪的时候就是命令响应工作模式
命令响应模式的波特率固定为38400可以直接使用串口助手发送AT指令。
AT命令
AT指令不区分大小写但是都要以回车符结尾
下面是常用的AT指令 注意ATNAME?可能是没有返回数据的我们直接设置蓝牙名称就可以了
我们接下来主要配置的就是
蓝牙名称和串口参数波特率、停止位、校验位
如图 设置好之后把usb拔下来重新上电的时候会默认为自动连接模式此时使用手机的蓝牙助手对蓝牙模块进行连接就可以通讯了。蓝牙助手我也会放在后面的资料链接里。 将串口助手波特率设置为115200在手机蓝牙中发送信息会在串口助手中显示出来。 最后我们将在STM32开发板中连接蓝牙进行信息传输控制LED灯
源码我将会放在后面的资料里一起打包。
这里我们使用串口1因为串口1是我开发板的下载串口所以要先下载代码之后再连接蓝牙模块的TX和RX如果使用其他串口进行通讯改为其他串口即可连接方式如图所示 蓝牙模块的RX连PA9TX连PA10VCC接板载的5VGND接板子的GND即可
由于我使用的是野火的开发板所用到的LED灯是个RGB灯大家只需要初始化一下串口然后看一下main函数里面的逻辑来实现自己板子的LED灯即可。也可以在中断函数里对灯进行操作
接下来就可以举一反三使用蓝牙返回信息等操作了。
资料有需要自行提取链接https://pan.baidu.com/s/1iGrbTiivAsTwzd9wDLYFaQ 提取码3sp6
资料里面还有一个HC蓝牙助手可以自定义按钮发送信息。
串口控制LED灯的代码如下
usart.c
#include bsp_usart.h//static void NVIC_Configuration(void) //配置中断优先级这里不使用中断所以屏蔽
//{
// NVIC_InitTypeDef NVIC_InitStructure;
//
// /* 嵌套向量中断控制器组选择 */
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//
// /* 配置USART为中断源 */
// NVIC_InitStructure.NVIC_IRQChannel DEBUG_USART_IRQ;
// /* 抢断优先级*/
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 1;
// /* 子优先级 */
// NVIC_InitStructure.NVIC_IRQChannelSubPriority 1;
// /* 使能中断 */
// NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;
// /* 初始化配置NVIC */
// NVIC_Init(NVIC_InitStructure);
//}void USART_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;// 打开串口GPIO的时钟
#include stm32f10x.h // Device headerDEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);// 打开串口外设的时钟DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);// 将USART Tx的GPIO配置为推挽复用模式
#include stm32f10x.h // Device headerGPIO_InitStructure.GPIO_Pin DEBUG_USART_TX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(DEBUG_USART_TX_GPIO_PORT, GPIO_InitStructure);// 将USART Rx的GPIO配置为浮空输入模式GPIO_InitStructure.GPIO_Pin DEBUG_USART_RX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING;GPIO_Init(DEBUG_USART_RX_GPIO_PORT, GPIO_InitStructure);// 配置串口的工作参数// 配置波特率USART_InitStructure.USART_BaudRate DEBUG_USART_BAUDRATE;// 配置 针数据字长USART_InitStructure.USART_WordLength USART_WordLength_8b;// 配置停止位USART_InitStructure.USART_StopBits USART_StopBits_1;// 配置校验位USART_InitStructure.USART_Parity USART_Parity_No ;// 配置硬件流控制USART_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None;// 配置工作模式收发一起USART_InitStructure.USART_Mode USART_Mode_Rx | USART_Mode_Tx;// 完成串口的初始化配置USART_Init(DEBUG_USARTx, USART_InitStructure);// // 串口中断优先级配置
// NVIC_Configuration();
//
// // 使能串口接收中断
// USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE); // 使能串口USART_Cmd(DEBUG_USARTx, ENABLE);
}/* 发送一个字节 */
void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data)
{USART_SendData(pUSARTx, data);while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) RESET );
}/* 发送两个字节的数据 */
void Usart_SendHalfWord(USART_TypeDef* pUSARTx, uint16_t data)
{uint8_t temp_h,temp_l;temp_h (data0xff00) 8 ;temp_l data0xff;USART_SendData(pUSARTx, temp_h);while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) RESET );USART_SendData(pUSARTx, temp_l);while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) RESET );
}/* 发送8位数据的数组 */
void Usart_SendArray(USART_TypeDef* pUSARTx, uint8_t *array,uint8_t num)
{uint8_t i;for( i0; inum; i ){Usart_SendByte(pUSARTx, array[i]);}while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TC) RESET );
}/* 发送字符串 */
void Usart_SendStr(USART_TypeDef* pUSARTx, uint8_t *str)
{uint8_t i0;do{Usart_SendByte(pUSARTx, *(stri));i;}while(*(stri) ! \0);while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TC) RESET );
}///重定向c库函数printf到串口重定向后可使用printf函数
int fputc(int ch, FILE *f)
{/* 发送一个字节数据到串口 */USART_SendData(DEBUG_USARTx, (uint8_t) ch);/* 等待发送完毕 */while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) RESET); return (ch);
}///重定向c库函数scanf到串口重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{/* 等待串口输入数据 */while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) RESET);return (int)USART_ReceiveData(DEBUG_USARTx);
}main.c int main(void)
{ uint8_t ch;USART_Config();LED_GPIO_Config();printf( 这是一个串口控制RGB灯的程序\n );while (1){ch getchar();printf( ch%c\n,ch );switch(ch){case 1: LED_RED;break;case 2: LED_GREEN;break;case 3: LED_BLUE;break;default: LED_RGBOFF;break;}}
} led.c #include bsp_led.h /*** brief 初始化控制LED的IO* param 无* retval 无*/
void LED_GPIO_Config(void)
{ /*定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDef GPIO_InitStructure;/*开启LED相关的GPIO外设时钟*/RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK, ENABLE);/*选择要控制的GPIO引脚*/GPIO_InitStructure.GPIO_Pin LED1_GPIO_PIN; /*设置引脚模式为通用推挽输出*/GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; /*设置引脚速率为50MHz */ GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; /*调用库函数初始化GPIO*/GPIO_Init(LED1_GPIO_PORT, GPIO_InitStructure); /*选择要控制的GPIO引脚*/GPIO_InitStructure.GPIO_Pin LED2_GPIO_PIN;/*调用库函数初始化GPIO*/GPIO_Init(LED2_GPIO_PORT, GPIO_InitStructure);/*选择要控制的GPIO引脚*/GPIO_InitStructure.GPIO_Pin LED3_GPIO_PIN;/*调用库函数初始化GPIOF*/GPIO_Init(LED3_GPIO_PORT, GPIO_InitStructure);/* 关闭所有led灯 */GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);/* 关闭所有led灯 */GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN); /* 关闭所有led灯 */GPIO_SetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);
}/*********************************************END OF FILE**********************/