当前位置: 首页 > news >正文

基于STM32_HAL库的HC-08蓝牙插座项目

基于STM32_HAL库的HC-08蓝牙插座

文章目录

  • 基于STM32_HAL库的HC-08蓝牙插座
    • 一、项目需求
    • 二、硬件连接
    • 三、项目实现
      • 3.1 CubeMX配置
      • 3.2 以阻塞的方式实现
      • 3.3 以中断的方式实现

一、项目需求

通过手机可以控制开发板上的LED或者继电器

在这里插入图片描述


二、硬件连接

在这里插入图片描述

首先将HC-08蓝牙模块连接到我们开发板的串口一引脚,注意要交叉连接,LED连接到STM32的PB8引脚


三、项目实现

3.1 CubeMX配置

  1. 配置Debug

    在这里插入图片描述

  2. 打开RCC配置时钟,将高速时钟配置成Crystal/Ceramic Resonator

    在这里插入图片描述

  3. 点击配置时钟选项,把时钟配置成高速外部时钟HSE,并且通过PLLCLK倍频到72MHZ按下回车之后就为芯片内部的功能分配好了对应的时钟频率。

    在这里插入图片描述

  4. 选择左侧的USART1,然后选择异步通信模式,配置波特率、数据位、奇偶校验位、停止位等

    在这里插入图片描述

  5. 配置PB8引脚为:GPIO_Output模式,并设置初始电平为高电平

    在这里插入图片描述

  6. 使能USART1中断,阻塞方式时不需要✔

    在这里插入图片描述

  7. 接着对我们的工程进行配置,配置完成之后点击右上角的 GENERATE CODE 生成工程

    在这里插入图片描述


3.2 以阻塞的方式实现

#include "main.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include <string.h>/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 */char Buffer[12] = {0};/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_UART_Receive(&huart1, (uint8_t *)Buffer, sizeof(Buffer), 100);									// 接收来自APP的串口数据if(strcmp(Buffer, "open") == 0){																	// 判断是否是open指令HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == GPIO_PIN_RESET){HAL_UART_Transmit(&huart1, (uint8_t *)"LED已经打开\r\n", strlen("LED已经打开\r\n"), 100);		// 返回结果给APP}}else if(strcmp(Buffer, "close") == 0){																// 判断是否是close指令HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == GPIO_PIN_SET){HAL_UART_Transmit(&huart1, (uint8_t *)"LED已经关闭\r\n", strlen("LED已经关闭\r\n"), 100);	   	// 返回结果给APP}}else{if(Buffer[0] != '\0'){																			// 判断是否是无效指令HAL_UART_Transmit(&huart1, (uint8_t *)"指令发送错误\r\n", strlen("指令发送错误\r\n"), 100);}}memset(Buffer, '\0', sizeof(Buffer));}/* USER CODE END 3 */
}

3.3 以中断的方式实现

#include "main.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */#include <stdio.h>
#include <string.h>/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD *///串口接收缓存(1字节)
uint8_t buf=0;//定义最大接收字节数 200,可根据需求调整
#define UART1_REC_LEN 200// 接收缓冲, 串口接收到的数据放在这个数组里,最大UART1_REC_LEN个字节
uint8_t UART1_RX_Buffer[UART1_REC_LEN];//  接收状态
//  bit15,      接收完成标志
//  bit14,      接收到0x0d
//  bit13~0,    接收到的有效字节数目
uint16_t UART1_RX_STA=0;/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* 接收完成回调函数,收到一个数据后,在这里处理 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{// 判断中断是由哪个串口触发的if(huart->Instance == USART1){// 判断接收是否完成(UART1_RX_STA bit15 位是否为1)if((UART1_RX_STA & 0x8000) == 0){// 如果已经收到了 0x0d (回车),if(UART1_RX_STA & 0x4000){// 则接着判断是否收到 0x0a (换行)if(buf == 0x0a)// 如果 0x0a 和 0x0d 都收到,则将 bit15 位置为1UART1_RX_STA |= 0x8000;else// 否则认为接收错误,重新开始UART1_RX_STA = 0;}else	// 如果没有收到了 0x0d (回车){//则先判断收到的这个字符是否是 0x0d (回车)if(buf == 0x0d){// 是的话则将 bit14 位置为1UART1_RX_STA |= 0x4000;}else{// 否则将接收到的数据保存在缓存数组里UART1_RX_Buffer[UART1_RX_STA & 0X3FFF] = buf;UART1_RX_STA++;// 如果接收数据大于UART1_REC_LEN(200字节),则重新开始接收if(UART1_RX_STA > UART1_REC_LEN - 1)UART1_RX_STA = 0;}}}// 重新开启中断HAL_UART_Receive_IT(&huart1, &buf, 1);}
}/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */// 开启接收中断HAL_UART_Receive_IT(&huart1, &buf, 1);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 *///判断串口是否接收完成if(UART1_RX_STA & 0x8000){printf("收到数据:");if(strcmp((const char *)UART1_RX_Buffer, "open") == 0){				// 判断是否是open指令HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == GPIO_PIN_RESET){HAL_UART_Transmit(&huart1, (uint8_t *)"LED已经打开\r\n", strlen("LED已经打开\r\n"), 100);	// 返回结果给APP}}else if(strcmp((const char *)UART1_RX_Buffer, "close") == 0){		// 判断是否是close指令HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == GPIO_PIN_SET){HAL_UART_Transmit(&huart1, (uint8_t *)"LED已经关闭\r\n", strlen("LED已经关闭\r\n"), 100);	// 返回结果给APP}}else{if(UART1_RX_Buffer[0] != '\0'){									// 判断是否是无效指令HAL_UART_Transmit(&huart1, (uint8_t *)"指令发送错误\r\n", strlen("指令发送错误\r\n"), 100);}}printf("\r\n");memset(UART1_RX_Buffer, '\0', sizeof(UART1_RX_Buffer));// 重新开始下一次接收UART1_RX_STA = 0;}HAL_Delay(50);}/* USER CODE END 3 */
}

然后我们把代码编译并烧录进去就实现了我们的小项目:

在这里插入图片描述

在这里插入图片描述

http://www.xdnf.cn/news/101629.html

相关文章:

  • C++:多态
  • UnoCSS原子CSS引擎-前端福音
  • 深入解析大数据的Lambda架构:设计、特点与应用场景
  • HTTP代理基础:网络新手的入门指南
  • 从 pip install lanms 失败到解决:Python开发环境配置深度解析
  • FlinkUDF用户自定义函数深度剖析
  • DC-2寻找Flag1、2、3、4、5,wpscan爆破、git提权
  • 2025知识管理趋势解析:AI、协作与用户体验引领变革
  • Ubuntu使用war包部署Jenkins并通过systemcl管理
  • 电池大脑的基准测试及AI拓展
  • 制作一款打飞机游戏18:敌人子弹
  • 量子金融工程:蒙特卡洛算法误差压缩至0.3%
  • 【刷题Day24】I/O模型(浅)
  • Rust 学习笔记:安装 Rust
  • YOLOv11架构革新:基于增强型空间-通道协同模块(ESE)解决SE注意力机制中的通道信息丢失问题
  • Linux驱动开发2 - 内核定时器驱动
  • 【android bluetooth 协议分析 06】【l2cap详解 6】【L2CA_Register函数解析】
  • Certimate本地化自动化 SSL/TLS 证书管理解决方案
  • 探索Hadoop:大数据世界的基石
  • RabbitMQ复习笔记
  • HarmonyOS-ArkUI: 组件内转场(transition)
  • create_function()漏洞利用
  • vue | 不同 vue 版本对复杂泛型的支持情况 · vue3.2 VS vue3.5
  • Linux的进程间通信
  • 鸿蒙NEXT开发网络相关工具类(ArkTs)
  • Windows:注册表配置应用
  • 从0到1掌握机器学习核心概念:用Python亲手构建你的第一个AI模型(超多代码+可视化)
  • 杂谈-有感而发
  • Oracle创建触发器实例
  • 力扣hot100_链表(3)_python版本