蓝牙模块 HC08_两个STM32开发板无线通信
一、HC08重要参数
- 蓝牙4.0,BLE,主从一体;
- 模块上电后,启动需要150ms;
- UART波特率:9600默认;
- 空中速率:1Mbps; (与HC05, HC06等不同, 不能直接与之通信);
- 通信距离:80米; (空旷);
- 工作电流:主机未连21mA,已连9mA; 从机未连8.5mA, 已连9mA; 睡眠0.4uA;
- 工作模式:未连接,为AT指令模式, 指示灯闪烁;连接后,串口透传模式,指示灯常亮;
- 连接关系:两模块必须一主一从,才能连接;连接后,数据传送时不分主从;
- 连接设置:配置一主一从后,自动秒连;
- 多方通信:只支持一对一,不支持多方同时连接;
二、AT命令解释
- 指令结尾,无需添加换行符;
- 指令修改,立即生效,掉电不丢失;
- 指令修改,成功时,统一返回OK,查看信息类指令除外;
- 指令修改,不成功,不返回任何信息;
三、STM32代码操作
1.操作重点
- 开发板用杜邦线连接HC-08,4线:VCC, GND, TX, RX;
- 使用UART与HC08通信, 波特率使用HC08默认的9600;
- 发送AT指令,无需换行符结尾;
- 只要一条AT指令,设置两HC08为主、从机模式,就能自动连接(秒连);
- 模块名称不重要,也不用密码;
- 连接前:AT模式,蓝灯闪烁;连接后:数据透传模式,不再接受AT命令,蓝灯常亮;
- 主机和从机的代码一样的,只是一个设置为主机,一个设置为从机;
2.头文件配置
/******************************************************************************* 移植配置
****************************************************************************/
#define HC08_UARTx USART3
#define HC08_ROLE 0 // 主从模式,0=slave, 1=master;与手机APP互连必须配置为从机模式/******************************************************************************* 全局变量
****************************************************************************/
typedef struct
{uint8_t flag_UARTConnect; // 标记:与开发板间的通信是否正常; 0=失败, 1=成功uint8_t flag_TargetConnect; // 标记:与目标设备通信是否正常;0=失败, 1=成功
}xHC08_TypeDef;
extern xHC08_TypeDef xHC08; // 声明为全局变量,方便记录信息、状态/******************************************************************************* 声明全局函数
****************************************************************************/
void HC08_Init(void); // 初始化串口及中断优先、AT参数配置级;
void HC08_SendData(uint8_t* data, uint16_t cnt); // 发送指定长度的数据;
void HC08_SendString(char* strTemp); // 发送字符串;
3.GPIO初始化代码
GPIO_InitTypeDef GPIO_InitStructure; // 时钟使能RCC->APB1ENR |= RCC_APB1ENR_USART3EN; // 使能USART1时钟RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; // 使能GPIOA时钟// GPIO_TX引脚配置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // TX引脚,配置为复用推挽工作模式GPIO_Init (GPIOB, &GPIO_InitStructure);// GPIO_RX引脚配置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ; // RX引脚,配置为浮空输入工作模式GPIO_Init (GPIOB, &GPIO_InitStructure);
4.UART初始化代码
NVIC_InitTypeDef NVIC_InitStructure;USART_InitTypeDef USART_InitStructure; // 中断配置NVIC_InitStructure .NVIC_IRQChannel = USART3_IRQn;NVIC_InitStructure .NVIC_IRQChannelPreemptionPriority=2 ; // 抢占优先级NVIC_InitStructure .NVIC_IRQChannelSubPriority = 2; // 子优先级NVIC_InitStructure .NVIC_IRQChannelCmd = ENABLE; // IRQ通道使能NVIC_Init(&NVIC_InitStructure); //USART 初始化设置USART_DeInit(USART3); USART_InitStructure.USART_BaudRate = baudrate; // 串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 字长为8位数据格式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(USART3, &USART_InitStructure); // 初始化串口USART_ITConfig(USART3, USART_IT_TXE , DISABLE );USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); // 使能接受中断USART_ITConfig(USART3, USART_IT_IDLE, ENABLE); // 使能空闲中断USART_Cmd(USART3, ENABLE); // 使能串口, 开始工作
5.HC08发送数据代码
// 发送AT指令,或字符串
void HC08_SendString(char* strTemp)
{HC08_SendData((uint8_t *)strTemp, strlen(strTemp));
}// 发送指定长度的数据
void HC08_SendData(uint8_t* dataBuf, uint16_t cnt)
{while(cnt--){while((HC08_UARTx->SR & 0X40)==0); // 等待上一次串口数据发送完成 HC08_UARTx->DR = *dataBuf; // 写DR,串口将的发送数据 dataBuf++;}
}
6.HC08接收数据代码
void USART3_IRQHandler(void)
{ static uint8_t cnt=0;static uint8_t RxTemp[256];// 接收中断if(USART3->SR & (1<<5)){RxTemp[cnt++] = USART3->DR ; // 读取数据寄存器值;注意:读取DR时自动清零中断位;}// 空闲中断, 用于配合接收中断,可判断一帧数据接收完成if(USART3->SR & (1<<4)) // 检查IDLE中断标志{ memcpy(xUSART.USART3RecivedBuffer , RxTemp , 256); // 临时数据转存为全局数据, 等待处理,注意:复制的是整个数组,包括0值,以方便字符串数据xUSART.USART3RecivedFlag = 1; // 标记;外部程序通过检查xUSARTFlag.USART_2_Recived是否等于1, 可判断是否有新一帧数据 xUSART.USART3RecivedCNT = cnt;cnt=0; memset(RxTemp ,0, 256); // 临时数据空零,准备下一次的接收 USART3 ->SR; USART3 ->DR; // 清零IDLE中断标志位!! 序列清零,顺序不能错!! /********************************************************************************方式1:可在这里调用外部函数,处理接收到数据(不推荐)方式2:可在外部判断USARTxRecivedFla==1,然后处理数据区xUSART.USARTxRecivedBuffer 禁 止:不可在中断里调用printf等不可重入函数!!!示 例: 下面这一行代码, 只作示例, 输出到上位机以观察所收到的最新一帧数据, 可删除*********************************************************************************/USART1_printf((char*)xUSART.USART3RecivedBuffer); // 这行代码只作示例,输出USART3收到的最新一帧数据,可删除 }
}
7.数据处理
// 本函数为main函数中的while函数while(1) // while函数死循环,不能让main函数运行结束,否则会产生硬件错误{ // Scheduler_Run(); // 任务轮询器; 如要使用, 清除while中其它函数(移到Scheduler文件中去), 以保证计时的准确System_DelayMS(100); // 上面已初始化SysTick, 可直接使用delay_ms()、delay_us()LED_RED_TOGGLE; // 红色LED 每0.5秒闪灭一次,以监察系统正常工作 if(xUSART.USART1RecivedFlag==1) // 判断上位机(USART1)是否收到新的数据{HC08_SendString((char *)xUSART.USART1RecivedBuffer); // 如果收到新数据,就从蓝牙发送出去xUSART.USART1RecivedFlag=0; // 处理完了,标记清0,不然下一个while循环又会重复操作} // 处理HC08收到的数据if(xUSART.USART3RecivedFlag==1) // 判断蓝牙HC08(USART3)是否收到新的数据{if(xUSART.USART3RecivedBuffer[0]=='0') { LED_BLUE_OFF;} // 判断收到的数据if(xUSART.USART3RecivedBuffer[0]=='1') { LED_BLUE_ON;} if(xUSART.USART3RecivedBuffer[0]=='3') { LED_BLUE_TOGGLE;} xUSART.USART3RecivedFlag=0; // 处理完了,标记清0,不然下一个while循环又会重复操作} }
四、源代码下载
需要代码的兄弟,可通过以下方式下载代码:
1:CSDN资源:两个开发板用HC08通信.zip-嵌入式文档类资源-CSDN下载
2:Q群文件夹:887199504
互相学习,欢迎指正!~
蓝牙模块 HC08_两个STM32开发板无线通信相关推荐
- 基于stm32通过HC_05(ZS-040)蓝牙模块用手机控制stm32开发板上led灯的亮灭
文章目录 前言 一.HC-05蓝牙是什么? 二.应用实例步骤 1.使用AT指令对蓝牙的初始化 2.打开手机蓝牙助手查看是否搜索到该蓝牙 3.用蓝牙模块代替TTL连接stm开发板 4.创建项目开始配置相 ...
- NBIOT 移远BC28模块+stm32开发板例程、教程(打通TCP、COAP协议)
为了开发者能够快速入门BC28的开发,加快开发者的项目进度,开发出此款针对BC28的stm32开发板和完善的发送网络数据的示例程序(TCP协议.COAP协议),程序流程逻辑清楚,注释完善,上手就可以玩 ...
- 大白NBIOT 移远BC28模块+stm32开发板例程、教程(打通TCP、COAP协议)
大白为了开发者能够快速入门BC28的开发,加快开发者的项目进度,大白开发出此款针对BC28的stm32开发板和完善的发送网络数据的示例程序(TCP协议.COAP协议),程序流程逻辑清楚,注释完善,上手 ...
- 基于STM32开发板I²C总线通信协议浅析
基于STM32开发板I²C总线通信协议浅析 一.前言 I²C(Inter-Integrated Circuit),中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构,是由飞利浦公司在1980 ...
- 野火stm32开发板给定一个脉冲程序_STM32开发板哪个好,推荐一款高性价比stm32MP157开发板...
一款能跑Linux的STM32开发板: 一款既可以玩Linux又可以玩单片机的开发板: 一款可同时学习A7和M4的双核异构开发板: 一款支持最新的Linux 5.4.31系统和u-boot 20200 ...
- 韦东山 IMX6ULL和正点原子_「正点原子NANO STM32开发板资料连载」第三章 MDK5 软件入门1...
1)实验平台:ALIENTEK NANO STM32F411 V1开发板 2)摘自<正点原子STM32F4 开发指南(HAL 库版>关注官方微信号公众号,获取更多资料:正点原子 第三章 M ...
- 判断按键值_「正点原子NANO STM32开发板资料连载」第十六章电容触摸按键实验...
1)实验平台:ALIENTEK NANO STM32F411 V1开发板2)摘自<正点原子STM32F4 开发指南(HAL 库版>关注官方微信号公众号,获取更多资料:正点原子 第十六章电容 ...
- Arduino 下初试 stm32开发板
Arduino 下初试 stm32开发板 1.实验环境 1.野火STM32指南者(STM32F103VET6) 2.Arduino IDE 1.8.13(下载链接) 3.STM32 Flash loa ...
- STM32开发板串口 ISP 方式下载程序
STM32开发板无下载电路也可以下载程序方法 自己设计的stm32开发板,手上无下载器,也没有板载的一键下载电路的情况下解决下载程序方法? 必须具备的条件:USB-TTL模块一个,板上预留有boot0 ...
最新文章
- 网站出现大量死链时该如何进行处理?
- jq实现文字个数限制_分布式系统高可用实战之限流器(Go 版本实现)
- 谋定政策经信研究扶持-万祥军:对话李玉庭跨界电商重整
- Android平台类加载流程源码分析
- 机器人学习--室内定位方法综述
- boost::graph模块演示 GGCL Edge 接口
- HID报表描述符(目前最全的解析,也是USB最复杂的描述符)
- jms面试题_最新的20多个JMS面试问答(2020)
- 是否可以限制蓝牙传输距离_技术文章—关于蓝牙传输范围的常见误解
- mysql innodb表移植_mysql Innodb引擎独立表空间下通过复制.ibd文件快速迁移数据文件...
- 学习笔记20 热传导方程
- android小米手机拍照功能,小米手机 调用相机拍照后无法返回问题
- 同济大学Openwrt路由器 ipv6教程(新手导向)
- 安卓手机如何投屏到电视上_如何将手机投屏到电视上?原来这么简单好用
- 深度学习整理:detection 学习(2)——detection细节知识入门
- [已解决]阿里云安全组开放端口,宝塔面板仍无法访问
- 计算机视觉OpenCv学习系列:第十部分、实时人脸检测
- Python基础入门之列表生成式
- A Survey of Deep Learning-based Object Detection论文翻译 + 阅读笔记
- 安装 libtorrent遇到问题