STM32F411 HC-05蓝牙模块驱动

news2024/9/28 17:26:55

硬件设计

HC-05将蓝牙协议完全封装了,我们只需要将其当作一个蓝牙转串口的模块来使用即可,配置也十分简单,只需要对串口进行配置就能使用。

蓝牙模块接线

蓝牙模块     STM32

TXD<---->RXD

RXD<---->TXD

VCC<---->3V3

GND<---->GND

软件设计

blue_hc05.c

#include "blue_hc05.h"	 

void Blue_Hc05_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB1PeriphClockCmd(BLUE_USART_RX_GPIO_CLK|BLUE_USART_TX_GPIO_CLK, ENABLE);
	RCC_APB1PeriphClockCmd(BLUE_USART_CLK, ENABLE);
	/* 连接 PXx 到 USARTx_Tx*/
	GPIO_PinAFConfig(BLUE_USART_RX_GPIO_PORT,BLUE_USART_RX_SOURCE, BLUE_USART_RX_AF);
	/*  连接 PXx 到 USARTx__Rx*/
	GPIO_PinAFConfig(BLUE_USART_TX_GPIO_PORT,BLUE_USART_TX_SOURCE, BLUE_USART_TX_AF);
	
	 /* 配置Tx引脚为复用功能  */
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_Pin = BLUE_USART_TX_PIN  ;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(BLUE_USART_TX_GPIO_PORT, &GPIO_InitStructure);

	/* 配置Rx引脚为复用功能 */
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_Pin = BLUE_USART_RX_PIN;
	GPIO_Init(BLUE_USART_RX_GPIO_PORT, &GPIO_InitStructure);
  
	//USART 初始化设置
	USART_InitStructure.USART_BaudRate = BLUE_USART_BAUDRATE;//一般设置为9600;
	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(BLUE_USART, &USART_InitStructure);
	
	/* Configure one bit for preemption priority */
	//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	/* 配置中断源 */
	NVIC_InitStructure.NVIC_IRQChannel = BLUE_USART_IRQ;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
	USART_ITConfig(BLUE_USART, USART_IT_RXNE, ENABLE);//开启中断
	USART_Cmd(BLUE_USART, ENABLE);                    //使能串口 
}

// 发送一个
void BLUE_USART_Send_Data(char data)
{
  USART_SendData(BLUE_USART,data);
  while(USART_GetFlagStatus(BLUE_USART,USART_FLAG_TC)==0);  // 除非发送完成  
}

// 发送一串
void BLUE_USART_Send_String(char *String)
{
  u16 len,j;
  len=strlen(String);
  for(j=0;j<len;j++)
  {
    BLUE_USART_Send_Data(*String++);
  }
}

blue_hc05.h

#ifndef __BLUE_HC05_H
#define __BLUE_HC05_H

#include "main.h" 


#define BLUE_USART 						USART2
#define BLUE_USART_CLK 					RCC_APB1Periph_USART2
#define BLUE_USART_BAUDRATE 			9600
#define BLUE_USART_APBxClock_FUN        RCC_APB1PeriphClockCmd


#define BLUE_USART_TX_PIN               GPIO_Pin_2                 
#define BLUE_USART_TX_GPIO_PORT         GPIOA                      
#define BLUE_USART_TX_GPIO_CLK          RCC_AHB1Periph_GPIOA
#define BLUE_USART_TX_AF                GPIO_AF_USART2
#define BLUE_USART_TX_SOURCE            GPIO_PinSource2

#define BLUE_USART_RX_PIN               GPIO_Pin_3                
#define BLUE_USART_RX_GPIO_PORT         GPIOA                      
#define BLUE_USART_RX_GPIO_CLK          RCC_AHB1Periph_GPIOA
#define BLUE_USART_RX_AF                GPIO_AF_USART2
#define BLUE_USART_RX_SOURCE            GPIO_PinSource3

#define BLUE_USART_IRQHandler			USART2_IRQHandler	
#define BLUE_USART_IRQ                 	USART2_IRQn


void Blue_Hc05_Init(void);
void USART3_IRQHandler(void);  
void BLUE_USART_Send_Data(char data);
void BLUE_USART_Send_String(char *String);
#endif


stm32f4xx_it.h 

int Bluetooth_data;
void BLUE_USART_IRQHandler(void)                	    // 串口1中断服务程序
{
	char buf[20];
	if(USART_GetITStatus(BLUE_USART,USART_IT_RXNE)!=RESET)  // 接收中断标志位拉高
	{
		Bluetooth_data=USART_ReceiveData(BLUE_USART);     // 保存接收到的指令
		memset(buf, 0, sizeof(buf));
		sprintf(buf, "blue = %d", Bluetooth_data);
		Gui_DrawFont_GBK16(20,50,BLUE,GRAY0, buf);
	}
}

main.c

int main(void)
{
	Blue_Hc05_Init();
	while (1)
    {
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2088960.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】有关vector迭代器失效问题

个人主页 文章目录 一、迭代器失效是什么二、vector中哪些操作会导致迭代器失效三、如何避免迭代器失效的问题 一、迭代器失效是什么 在进入此问题时&#xff0c;我们首先要了解迭代器的本质其实是指针&#xff0c;迭代器的失效就相当于指针失效的问题。而指针失效就说明指针…

PneumoLLM: 利用大语言模型的力量进行尘肺病诊断| 文献速递-大模型与多模态诊断阿尔茨海默症与帕金森疾病应用

Title 题目 PneumoLLM: Harnessing the power of large language model for pneumoconiosis diagnosis PneumoLLM: 利用大语言模型的力量进行尘肺病诊断 01 文献速递介绍 在计算机辅助诊断领域&#xff0c;对医学数据的处理和分析能力至关重要。它有助于潜在疾病的诊断和未…

猫咪浮毛难清理?养宠工具新升级——宠物空气净化器来帮你

相信很多人和我一样&#xff0c;在工作后就特别想拥有一只属于自己的猫咪。试想一下每天下班回到家&#xff0c;不再是空荡的房间&#xff0c;有只小猫在等你&#xff0c;该有多么幸福。虽然小猫不会说话&#xff0c;但会用陪伴的方式表达爱&#xff0c;温暖我们的心灵。可我没…

大家都在考的AI证书,我不允许你还不知道!

随着AI人工智能技术的迅猛发展&#xff0c;人工智能生成内容浪潮席卷全球&#xff0c;技术革新越是凶猛&#xff0c;人们的失业焦虑便越加强烈&#xff0c;为了应对AI带来的冲击&#xff0c;有些人决定“打不过就加入”&#xff0c;转身投向这个风口行业。 在这个关键时刻&…

pdf文件渲染到canvas

1、jQuery 2、Fabric.js Fabric.js是一个对canvas进行封装的Javascript库&#xff0c;主要的功能包括在canvas上创建和填充图形&#xff0c;比如矩形、圆形、多边形&#xff1b;生成的图像自带缩放、旋转、拖拽等功能。 3、PDF.js PDF.js 是一个使用 HTML5 构建的便携式文档格式…

STM32G474采用“多个单通道ADC转换”读取3个ADC引脚的电压

STM32G474采用“多个单通道ADC转换”读取3个ADC引脚的电压&#xff1a;PC0、PA1和PA2。本测试将ADC1_IN6映射到PC0引脚&#xff0c;ADC12_IN2映射到PA1引脚&#xff0c;ADC1_IN3映射到PA2引脚。 1、ADC输入 ADC输入电压范围&#xff1a;Vref– ≤ VIN ≤ Vref ADC支持“单端输入…

雀巢玩了个梗,把打工人快得罪光了……

给打工人做了一款零食&#xff0c;并想着抖个机灵顺便讨好下打工人&#xff0c;但万万没想到&#xff0c;这零食刚到打工人手里还没等下嘴&#xff0c;就把打工人给得罪了…… 这是让浓眉大眼的雀巢最近无比糟心的一件事&#xff01; 事情大概是这样的&#xff0c;雀巢可能是为…

图论----最小生成树讲解与相关题解

目前已更新系列 当前--图论----最小生成树讲解与相关题解 滑动窗口系列算法总结与题解一 算法系列----并查集总结于相关题解 图论---dfs系列 差分与前缀和总结与对应题解&#xff08;之前笔试真的很爱考&#xff09; 数论---质数判断、质因子分解、质数筛&#xff08;埃氏…

信息学奥赛初赛天天练-79-NOIP2015普及组-基础题4-即时通讯软件、二叉树遍历、前序遍历、中序遍历、后序遍历、算法时间复杂度

NOIP 2015 普及组 基础题4 11 下面哪种软件不属于即时通信软件( ) A QQ B MSN C 微信 D P2P 16 前序遍历序列与中序遍历序列相同的二叉树为( ) A 根结点无左子树 B 根结点无右子树 C 只有根结点的二叉树或非叶子结点只有左子树的二叉树 D 只有根结点的二叉树或非叶子结点只有…

如何使用IDEA远程访问家里或者公司中无公网IP的内网MySQL数据库

文章目录 前言1. 本地连接测试2. Windows安装Cpolar3. 配置Mysql公网地址4. IDEA远程连接Mysql5. 固定连接公网地址6. 固定地址连接测试 前言 本教程主要介绍如何使用Cpolar内网穿透工具实现在IDEA中也可以远程访问家里或者公司的数据库&#xff0c;提高开发效率&#xff01;无…

在 Debian 上安装 IntelliJ IDEA 笔记(含 JDK 的安装)

在 Debian&#x1f4a9; 上安装 IntelliJ IDEA &#x1f4a1; 笔记&#xff08;含 JDK 的安装&#xff09; 下载安装 JDKJDK17JDK8 安装 IntelliJ IDEA Community添加桌面启动项&#xff08;快捷方式&#xff09; 参考资料 下载 两个包已经下好了&#xff0c;一个JDK17&#x…

OZON新品藏品,OZON收藏品推荐

OZON新品藏品&#xff0c;OZON收藏品推荐Top1 火车模型 Наши поезда №17 - Пассажирский электровоз ЧС2 商品id&#xff1a;1643982093 月销量&#xff1a;266 OZON新品藏品地&#xff1a;m6z.cn/5H6fQR&#xff08;浏览器复制打开&a…

<数据集>车牌识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2000张 标注数量(xml文件个数)&#xff1a;2000 标注数量(txt文件个数)&#xff1a;2000 标注类别数&#xff1a;1 标注类别名称&#xff1a;[License] 序号类别名称图片数框数1License20002965 使用标注工具&am…

嵌入式单片机开发学习路线,从入门到高薪就业,保姆级学习攻略!

嵌入式就业方向及具体细分岗位如下&#xff1a; 方向 岗位 单片机开发 单片机开发工程师&#xff08;MCU开发工程师&#xff09; RTOS开发工程师 Linux应用开发 Linux应用工程师 QT开发工程师 Linux多媒体开发工程师 Linux驱动开发 Linux/Android驱动开发工程师 Linux设…

【建议收藏】100个Python精选库

Python为啥这么火&#xff0c;这么多人学&#xff0c;就是因为简单好学&#xff0c;功能强大&#xff0c;整个社区非常活跃&#xff0c;资料很多。而且这语言涉及了方方面面&#xff0c;比如自动化测试&#xff0c;运维&#xff0c;爬虫&#xff0c;数据分析&#xff0c;机器学…

鸿蒙(API 12 Beta3版)【识别图像数据】

基本概念 图像数据识码能力支持对相机预览流数据中的码图进行扫描识别&#xff0c;并获取信息。 场景介绍 图像数据识码能力支持对相机预览流数据中的条形码、二维码、MULTIFUNCTIONAL CODE进行识别&#xff0c;并获得码类型、码值、码位置信息和相机变焦比。该能力可用于一…

马斯克被告“狗狗币传销”!索赔2580亿美元,法官驳回诉讼!马斯克与狗狗币的不解之缘!

在数字货币领域&#xff0c;每一次波动都牵动着全球投资者的神经&#xff0c;而埃隆马斯克&#xff08;Elon Musk&#xff09;——这位科技界的传奇人物&#xff0c;更是以其独特的言行不断在加密货币市场上掀起波澜。近期&#xff0c;关于马斯克与狗狗币&#xff08;Dogecoin&…

【C++STL详解(十三)】unordered系列容器的介绍与使用

目录 前言 一、unordered_map 介绍 使用 构造方式 修改 容量 迭代器 元素访问 查询 桶操作 二、unordered_set 介绍 使用 构造 修改 容量 迭代器&#xff08;只有单向) 查询 桶操作 三、unordered系列的性能测试 前言 前面提到的map/set是C98提供的关联…

使用手机挖掘IDOR漏洞赚取1500美元赏金

在今天的文章中&#xff0c;笔者将分享如何在手机上发现两个不安全的直接对象引用 (IDOR) 实例&#xff0c;并因此获得 1500 美元的赏金。 信息收集&#xff1a;了解目标 首先&#xff0c;我通常使用 Google dork&#xff08;谷歌语法&#xff1a;如“site:target.com about”…