【蓝桥杯——物联网设计与开发】Part1:GPIO

目录

一、GPIO输出——LED

(1)资源介绍

        🔅原理图       

        🔅驱动原理

(2)STM32CubeMX 软件配置

(3)代码编写

🟢️main 函数

(4)实验现象

二、LED接口函数封装

🟡️LED接口函数

🔴LED接口函数调用实例

三、GPIO输入——KEY

(1)资源介绍

        🔅原理图       

        🔅驱动原理

(2)STM32CubeMX 软件配置

(3)代码编写

🟢️main 函数

(4)实验现象

四、KEY接口函数封装

🟡️KEY接口函数

🔴KEY接口函数调用实例

五、GPIO常用函数讲解

🔅GPIO写函数

🔅GPIO读函数

🔅GPIO翻转函数


一、GPIO输出——LED

(1)资源介绍

        🔅原理图       

         在新版蓝桥杯物联网竞赛实训平台中,每个节点都有3个板载 LEDD1D2D3

         🟢️LED 原理图如图1所示:

图1        LED电路原理图

        通过电路图连接可知,引脚资源配置情况为:

表1 引脚资源配置情况
LEDMCU
D1PB2
D2PB5
D3PB12

        🔅驱动原理

        D1D2D3 是发光二极管,其左侧连接芯片引脚,右侧连接 VDD,即节点电源。

  • 当引脚输出低电平时,LD 两侧压差大于二极管导通电压而导通,LD 点亮
  • 当引脚输出高电平时,LD 两侧压差小于二极管导通电压而截止,LD 熄灭

(2)STM32CubeMX 软件配置

1️⃣打开软件,在搜索栏中搜索 STM32WLE5CCU6 系列 → 在右侧下方选择 UFQFPN48 封装 → 点击 "Start Project"

图2        STM32CubeMX芯片选择



2️⃣点击 "System Core" 栏 → 点击 "RCC"  → 将 "HSE""LSE" 配置为 "Crystal/Ceramic Resonator"(水晶/陶瓷晶振);

        如图4所示,新版平台的MCU连接了两个外部晶振,分别是32.768kHz的低速晶振和32MHz的高速晶振,能够提供更稳定的时钟;

        这里的低速晶振修复了旧平台RTC时钟不准的bug

图3        外部时钟源配置
图4        外部晶振



3️⃣点击 "Trace and Debug” → 点击 "DEBUG" → 将 "JTAG and Trace" 栏配置为 "Serial Wire",从而配置 Debug 串行线,有助于 Keil 编译器的 Debug 调试与信号的追踪检测;

图5        Debug线配置



4️⃣点击 "Clock Configuration" 栏 →  在 "HCLK1(MHz)" 框中填写最大时钟 48(MHz) → 回车即可自动配置时钟树;

图6        时钟树配置

5️⃣回到 "Pinout & Configuration" 栏 → 点击 "System Core" 栏 → 点击 "NVIC" 栏 → 将 "Time base: System tick timer" "Preemption priority" 更改为0

        ⚠️这里是将时基时钟中断的抢占优先级更改为0,即最高优先级,以此保证时基时钟的准确性;

图7        时基时钟中断抢占优先级更改

6️⃣点击引脚 PB2、PB5、PB12 → 选择 GPIO_Output 模式(此处默认为推挽输出);

图8        LED引脚配置

 7️⃣点击 "Project Manager" 栏 → ⚠️注意 "Toolchain / IDE" 应当修改为 "MDK-ARM""Code Generator" 栏中配置如图10所示 → 生成代码,打开文件即可;

图9        工具链切换
图10        Code Generator配置

(3)代码编写

🟢️main 函数

/*** @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();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){// 引脚电平翻转HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_2);HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_12);// 延迟500msHAL_Delay(500);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

(4)实验现象

        D1、D2、D3间隔0.5s闪烁;


二、LED接口函数封装

🟡️LED接口函数

/* LED接口函数 */
void LED_Disp(uint8_t led_state)
{/* LD1 */if((led_state & 1) == 1)HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);	// 低电平点亮else                           HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);		// 高电平熄灭/* LD2 */if((led_state & 2) == 2)          HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);else                        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);/* LD3 */if((led_state & 4) == 4)          HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);else                            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
}

🔴LED接口函数调用实例

/*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 */uint8_t	led_state = 0;	// led状态变量定义/* 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();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){led_state ^= 1;		// D1状态取反led_state &= ~2;		// D2点亮LED_Disp(led_state);HAL_Delay(500);led_state |= 2;		// D2熄灭LED_Disp(led_state);HAL_Delay(500);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

三、GPIO输入——KEY

(1)资源介绍

        🔅原理图       

        在新版蓝桥杯物联网竞赛实训平台中,每个节点都有2个板载 KEYSW1SW2

        🟢️KEY 原理图如图11所示:

图11        KEY电路原理图


        通过电路图连接可知,引脚资源配置情况为:

表2 引脚资源配置情况
KEYMCU
SW1PA8
SW2PB8

        🔅驱动原理

        SW 上方连接着 10K 电阻(上拉电阻)、节点电源 VDD、引脚,下方接地。

  • 当按键按下时,引脚与 GND 连接导通,读取到低电平
  • 当按键抬起时,引脚与 VDD 连接,读取到高电平

(2)STM32CubeMX 软件配置

1️⃣返回软件,点击引脚 PA8、PB8 → 选择 GPIO_Input 模式(此处默认不配置上拉电阻和下拉电阻,由于按键电路已经带有上拉电阻,故不修改相关配置);

图12        按键引脚配置

2️⃣生成代码;

(3)代码编写

🟢️main 函数

/*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 */uint8_t led_state = 0xff;	// led状态变量,初始全灭/* 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();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){// SW1按键状态检测if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8) == 0){HAL_Delay(10);	// 延迟消抖if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8) == 0)	// 再次检测,确认是否是按下{led_state &= ~1;	// D1亮while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8) == 0);	// 抬手检测}}// SW2按键状态检测if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == 0){HAL_Delay(10);if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == 0){led_state |= 1;	// D1灭while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == 0);}}// LED显示LED_Disp(led_state);HAL_Delay(10);	// 延迟10ms/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

(4)实验现象

        按下按键SW1D1亮;

        按下按键SW2D1灭;


四、KEY接口函数封装

🟡️KEY接口函数

uint8_t Key_Read(void)
{uint8_t key_value = 0;	// 中间变量,存储按键状态if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8) == 0)	// 引脚状态读取key_value |= 1;	// 读取到按键SW1按下if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == 0)key_value |= 2;	// 读取到按键SW2按下elsekey_value = 0;	// 均未读到return key_value;
}

🔴KEY接口函数调用实例

uint8_t cnt_10ms;			// 10ms计时变量,放在滴答计时器中自增
uint8_t led_state = 0xff;	// led状态变量,初始全灭
/* 按键任务处理函数 */
void Task_Key(void)
{uint8_t key_temp, key_down;static uint8_t key_old = 0;/* 每10ms进入一次 */if(cnt_10ms < 10)	return;cnt_10ms = 0;/* 边沿检测 */key_temp = Key_Read();	                        // 键值读取key_down = key_temp & (key_temp ^ key_old);		// 下降沿判断key_old = key_temp;		                        // 键值存储/* 下降沿逻辑 */if(key_down){switch(key_down){// SW1 按下case 1:led_state &= ~1;	// D1亮break;// SW2 按下case 2:led_state |= 1;		// D1灭break;// SW1和SW2同时按下case 3:led_state ^= 2;		// D2状态取反break;default:	break;}}
}

五、GPIO常用函数讲解

🔅GPIO写函数

void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

  • 作用:设置或清除选定的数据端口位;
  • 参数1:GPIO端口
  • 参数2:GPIO引脚
  • 参数3:指定要写入所选位的值:GPIO_PIN_RESET(清除)、GPIO_PIN_SET(置位)
  • 返回值:

        在LED接口封装函数中,使用了该函数。可以理解为对端口引脚写入电平1或者电平0;

🔅GPIO读函数

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

  • 作用:读取指定引脚的电平;
  • 参数1:GPIO端口
  • 参数2:GPIO引脚
  • 返回值:引脚电平值

        在KEY接口封装函数中,使用了该函数。用于读取引脚的输入电平;

        ⚠️该函数不仅仅用于读取输入引脚,还可以用于读取输出引脚,从而判断是否输出正确的电平值❗️

🔅GPIO翻转函数

void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

  • 作用:翻转指定引脚的电平;
  • 参数1:GPIO端口
  • 参数2:GPIO引脚
  • 返回值:

        在做LED闪烁功能时,可以直接调用该函数;

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

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

相关文章

小程序发版后,强制更新为最新版本

为什么要强制更新为最新版本&#xff1f; 在小程序的开发和运营过程中&#xff0c;强制用户更新到最新版本是一项重要的策略&#xff0c;能够有效提升用户体验并保障系统的稳定性与安全性。以下是一些主要原因&#xff1a; 1. 功能兼容 新功能或服务通常需要最新版本的支持&…

Servlet解析

概念 Servlet是运行在服务端的小程序&#xff08;Server Applet)&#xff0c;可以处理客户端的请求并返回响应&#xff0c;主要用于构建动态的Web应用&#xff0c;是SpringMVC的基础。 生命周期 加载和初始化 默认在客户端第一次请求加载到容器中&#xff0c;通过反射实例化…

太速科技-633-4通道2Gsps 14bit AD采集PCie卡

4通道2Gsps 14bit AD采集PCie卡 一、板卡概述 二、性能指标 板卡功能 参数 内容 ADC 芯片型号 AD9689 路数 4路ADC&#xff0c; 采样率 2Gsps 数据位 14bit 数字接口 JESD204B 模拟接口 交流耦合 模拟输入 1V 连接器 6路 SMA 输入阻抗 50Ω 模拟指…

戴尔/Dell 电脑按什么快捷键可以进入 Bios 设置界面?

BIOS&#xff08;基本输入输出系统&#xff09;是计算机硬件与操作系统之间的桥梁&#xff0c;它负责初始化和测试系统硬件组件&#xff0c;并加载启动操作系统。在某些情况下&#xff0c;如调整启动顺序、更改系统时间或日期、修改硬件配置等&#xff0c;您可能需要进入BIOS进…

分类模型评估利器-混淆矩阵

相关文章 地理时空动态模拟工具介绍&#xff08;上&#xff09; 地理时空动态模拟工具介绍&#xff08;下&#xff09;地理时空动态模拟工具的使用方法 前言 混淆矩阵&#xff08;Confusion Matrix&#xff09;是机器学习领域中用于评估分类模型性能的一种工具。它通过矩阵的…

贪心算法概述

贪心算法总是作出当前看来最好的选择&#xff0c;是局部最优 可以使用贪心算法的问题一般具有两个重要的性质 贪心选择性质最优子结构性质 贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择来达到 其与动态规划的问题区别在于&#xff0c;动态规划算法通…

Unity-Mirror网络框架-从入门到精通之Basic示例

文章目录 前言Basic示例场景元素预制体元素代码逻辑BasicNetManagerPlayer逻辑SyncVars属性Server逻辑Client逻辑 PlayerUI逻辑 最后 前言 在现代游戏开发中&#xff0c;网络功能日益成为提升游戏体验的关键组成部分。Mirror是一个用于Unity的开源网络框架&#xff0c;专为多人…

wx015基于springboot+vue+uniapp的经济新闻资讯的设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

CSS 中 content换行符实现打点 loading 正在加载中的效果

我们动态加载页面内容的时候&#xff0c;经常会使用“正在加载中…”这几个字&#xff0c;基本上&#xff0c;后面的 3 个点都是静态的。静态的问题在于&#xff0c;如果网络不流畅&#xff0c;加载时间比较长&#xff0c;就会给人有假死的 感觉&#xff0c;但是&#xff0c;如…

ESLint+Prettier的配置

ESLintPrettier的配置 安装插件 ​​​​​​ 在settings.json中写下配置 {// tab自动转换标签"emmet.triggerExpansionOnTab": true,"workbench.colorTheme": "Default Dark","editor.tabSize": 2,"editor.fontSize": …

Windows系统下载、部署Node.js与npm环境的方法

本文介绍在Windows电脑中&#xff0c;下载、安装并配置Node.js环境与npm包管理工具的方法。 Node.js是一个基于Chrome V8引擎的JavaScript运行时环境&#xff0c;其允许开发者使用JavaScript编写命令行工具和服务器端脚本。而npm&#xff08;Node Package Manager&#xff09;则…

Ubuntu 24.04 LTS 解决网络连接问题

1. 问题描述 现象&#xff1a;ens33 网络接口无法获取 IPv4 地址&#xff0c;导致网络不可用。初步排查&#xff1a; 运行 ip a&#xff0c;发现 ens33 接口没有分配 IPv4 地址。运行 ping www.baidu.com&#xff0c;提示“网络不可达”。查看 NetworkManager 日志&#xff0c…

Tauri2+Leptos开发桌面应用--Sqlite数据库操作

在之前工作&#xff08;使用Tauri Leptos开发带系统托盘桌面应用-CSDN博客&#xff09;的基础上&#xff0c;继续尝试对本地Sqlite数据库进行读、写、删除操作&#xff0c;开发环境还是VS CodeRust-analyzer。 最终程序界面如下&#xff1a; 主要参考文章&#xff1a;Building…

每日一些题

题解开始之前&#xff0c;给大家安利一个上班偷偷学习的好搭档&#xff0c;idea中的插件有一个叫 LeetCode with labuladong&#xff0c;可以在idea中直接刷力扣的题目。 朋友们上班没事的时候&#xff0c;可以偷偷摸几题。看八股的话&#xff0c;可以用面试鸭&#xff0c;也是…

Docker--Docker Container(容器) 之 操作实例

容器的基本操作 容器的操作步骤其实很简单&#xff0c;根据拉取的镜像&#xff0c;进行启动&#xff0c;后可以查看容器&#xff0c;不用时停止容器&#xff0c;删除容器。 下面简单演示操作步骤 1.创建并运行容器 例如&#xff0c;创建一个名为"my-nginx"的交互…

高频 SQL 50 题(基础版)_1068. 产品销售分析 I

销售表 Sales&#xff1a; (sale_id, year) 是销售表 Sales 的主键&#xff08;具有唯一值的列的组合&#xff09;。 product_id 是关联到产品表 Product 的外键&#xff08;reference 列&#xff09;。 该表的每一行显示 product_id 在某一年的销售情况。 注意: price 表示每…

linux进阶

目录 变量 shell变量 环境变量 预定义变量 位置变量 其他 管道与重定向 管道 重定向 shell脚本 分支结构 循环结构 数组 脚本实例 变量 shell变量 shell变量&#xff1a;shell程序在内存中存储数据的容器 shell变量的设置&#xff1a;colorred 将命令的结果赋值…

“TypeScript版:数据结构与算法-初识算法“

引言 在算法与编程的广阔世界里&#xff0c;总有一些作品以其独特的魅力和卓越的设计脱颖而出&#xff0c;成为我们学习和研究的典范。今天&#xff0c;我非常荣幸地向大家分享一个令人印象深刻的算法——Hello算法。 Hello算法不仅展现了作者深厚的编程功底&#xff0c;更以…

【复盘】2024年终总结

工作 重构风控系统 今年上半年其实就是整体重构系统&#xff0c;经历了多次加班的&#xff0c;其中的辛酸苦辣只有自己知道&#xff0c;现在来看的话&#xff0c;其实对自己还有一定的成长&#xff0c;从这件事情上也明白 绩效能不能拿到A&#xff0c;在分配的任务的时候就决…

RedisDesktopManager新版本不再支持SSH连接远程redis后

背景 RedisDesktopManager(又名RDM)是一个用于Windows、Linux和MacOS的快速开源Redis数据库管理应用程序。这几天从新下载RedisDesktopManager最新版本&#xff0c;结果发现新版本开始不支持SSH连接远程redis了。 解决方案 第一种 根据网上有效的信息&#xff0c;可以回退版…