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

1.GPIO

理论说明

输入

上拉输入:拉高电平

下拉输入:拉低电平

浮空输入:不拉高也不拉低电平

输出

开漏输出:不能输出高电平(P-MOS不可用,则只能低电平)

推挽输出:可输出高低电平

输入输出电路图

输出速率

  • Low:2MHz
  • Medium:10MHz
  • High:50MHz

代码编写

几个功能例程的配置及代码

Cube IDE代码

LED灯闪烁

配置引脚功能:

GPIO配置
在main.c文件,大概94行开始

  /* USER CODE BEGIN WHILE */
while (1)
{//参数1:GPIO口名字(PB),参数2:GPIO数字(PB5中的5),参数3:高低电平(0,1)HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, 0);HAL_Delay(1000);HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, 1);//HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);	//电平反转,无需设置高低电平HAL_Delay(1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */
}/* USER CODE END 3 */

实验二

按键PE3控制蜂鸣器开关、按键PE4控制 LED2(PE5) 亮灭、光敏传感器控制 LED1(PB5) 亮灭

按键:设置成上拉输入,PE4则为高电平,当按键按下时,PE4为0,则按键按下(其它按钮同理)

按键电路图

LED灯、蜂鸣器(PB8):输出高低电平,设置推挽输出

光敏传感器(PB11):高低电平由外界光照强度来决定,设置浮空输入

按键配置:

按钮配置

LED灯配置方面已经说明,直接配置

蜂鸣器配置(PB8):

蜂鸣器配置图

光敏传感器配置(PB11):

光敏传感器配置图

光敏传感器AO DO有什么区别?

AO:输出模拟信号

DO:输出数字信号(高低电平)

在main.c文件,大概94行开始

/* USER CODE BEGIN WHILE */
while (1)
{if(0 == HAL_GPIO_ReadPin(Key1_GPIO_Port, Key1_Pin))	//检测读取按键高低电平{HAL_Delay(120);if(0 == HAL_GPIO_ReadPin(Key1_GPIO_Port, Key1_Pin))	//检测读取按键高低电平{HAL_GPIO_TogglePin(BEEP_GPIO_Port, BEEP_Pin);	//电平反转,无需设置高低电平}}if(0 == HAL_GPIO_ReadPin(Key2_GPIO_Port, Key2_Pin))	//检测读取按键输入高低电平{HAL_Delay(120);if(0 == HAL_GPIO_ReadPin(Key2_GPIO_Port, Key2_Pin))	//检测读取按键高低电平{HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);	//电平反转,无需设置高低电平}}if(0 == HAL_GPIO_ReadPin(SUN_GPIO_Port, SUN_Pin))	//检测读取光敏传感器输入高低电平{HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, 1);}else{HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, 0);}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */
}

效果展示:

代码过程

初始化时钟

  1. 初始化时钟

APB2ENR:外设时钟使能寄存器

外设时钟使能寄存器图

大概功能:将APB2ENR(外设时钟使能寄存器)初始化IO端口B时钟开启

//初始化代码,在gpio.c中48行
__HAL_RCC_GPIOE_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();//__HAL_RCC_GPIOB_CLK_ENABLE(); 如下过程
#define __HAL_RCC_GPIOB_CLK_ENABLE()   do { \__IO uint32_t tmpreg;  /*定义一个变量*/\SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPBEN);\/* Delay after an RCC peripheral clock enabling(下方两个延时作用) */\tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPBEN);\UNUSED(tmpreg); \} while(0U)//SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPBEN); 的解释//1.RCC_APB2ENR_IOPBEN
#define RCC_APB2ENR_IOPBEN_Pos		(3U)                              
#define RCC_APB2ENR_IOPBEN_Msk		(0x1UL << RCC_APB2ENR_IOPBEN_Pos)	/*RCC_APB2ENR_IOPBEN_Msk 等于0x1<< 3 结果:0x00000008 */
//0x1 = 0000 0001 << 3 = 0000 1000(对应上图,位3为1) = 0x00000008 
#define RCC_APB2ENR_IOPBEN			RCC_APB2ENR_IOPBEN_Msk		/* RCC_APB2ENR_IOPBEN 等于0x00000008 *///2.RCC寄存器,RCC_BASE强转成这个RCC_TypeDef类型的结构体
#define RCC                 ((RCC_TypeDef *)RCC_BASE)
//RCC_BASE = 由总线矩阵偏移到AHB系统总线再偏移到复位和时钟控制(RCC)(可看参考手册的系统结构)(下面三行从下往上看)
#define RCC_BASE              (AHBPERIPH_BASE + 0x00001000UL)
#define AHBPERIPH_BASE        (PERIPH_BASE + 0x00020000UL)
#define PERIPH_BASE           0x40000000UL
//RCC_TypeDef(结构体)
typedef struct
{__IO uint32_t CR;__IO uint32_t CFGR;__IO uint32_t CIR;__IO uint32_t APB2RSTR;__IO uint32_t APB1RSTR;__IO uint32_t AHBENR;__IO uint32_t APB2ENR;__IO uint32_t APB1ENR;__IO uint32_t BDCR;__IO uint32_t CSR;
} RCC_TypeDef;//3.RCC->APB2ENR
RCC指向APB2ENR,则就是结构体内的__IO uint32_t APB2ENR;//将APB2ENR的位3置1
  1. 初始化引脚

GPIOx_BSRR:端口位设置/清除寄存器

低16位中若有某一位 置1,则这个引脚为1(高电平),若都为0,则不影响

高16位中若有某一位 置1,则这个引脚位0(低电平),若都为0,则不影响

端口位设置/清除寄存器图

//gpio.c中第53行
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET);void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{/* Check the parameters */assert_param(IS_GPIO_PIN(GPIO_Pin));assert_param(IS_GPIO_PIN_ACTION(PinState));if (PinState != GPIO_PIN_RESET)	//GPIO_PIN_RESET为0{GPIOx->BSRR = GPIO_Pin;	//给BSRR寄存器 低16位赋值 置1}else{GPIOx->BSRR = (uint32_t)GPIO_Pin << 16u;	//给BSRR寄存器 高16位赋值 置0}
}//GPIO_TypeDef *GPIOx 等于 LED2_GPIO_Port
#define LED2_GPIO_Port GPIOE
#define GPIOE		((GPIO_TypeDef *)GPIOE_BASE)
//GPIO_TypeDef 强转
typedef struct
{__IO uint32_t CRL;__IO uint32_t CRH;__IO uint32_t IDR;__IO uint32_t ODR;__IO uint32_t BSRR;__IO uint32_t BRR;__IO uint32_t LCKR;
} GPIO_TypeDef;
#define GPIOE_BASE            (APB2PERIPH_BASE + 0x00001800UL)
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x00010000UL)
#define PERIPH_BASE           0x40000000UL//GPIO_Pin 等于 LED2_Pin
#define LED2_Pin GPIO_PIN_5
#define GPIO_PIN_5		((uint16_t)0x0020)  /* Pin 5 selected    */
  1. 写实际需求(输入:read 判断,输出:write 0/1)

Keil代码

修改的地方如下

main.c

//main函数中
while (1)
{if(0 == HAL_GPIO_ReadPin(Key1_GPIO_Port, Key1_Pin))	//检测读取按键高低电平{HAL_Delay(120);if(0 == HAL_GPIO_ReadPin(Key1_GPIO_Port, Key1_Pin))	//检测读取按键高低电平{HAL_GPIO_TogglePin(BEEP_GPIO_Port, BEEP_Pin);	//电平反转,无需设置高低电平}}if(0 == HAL_GPIO_ReadPin(Key2_GPIO_Port, Key2_Pin))	//检测读取按键输入高低电平{HAL_Delay(120);if(0 == HAL_GPIO_ReadPin(Key2_GPIO_Port, Key2_Pin))	//检测读取按键高低电平{HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);	//电平反转,无需设置高低电平}}if(0 == HAL_GPIO_ReadPin(SUN_GPIO_Port, SUN_Pin))	//检测读取光敏传感器输入高低电平{HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, 1);}else{HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, 0);}
}

gpio.c

void MDK_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOE_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET);/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET);/*Configure GPIO pins : PEPin PEPin */GPIO_InitStruct.Pin = Key1_Pin|Key2_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);/*Configure GPIO pin : PtPin */GPIO_InitStruct.Pin = LED2_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(LED2_GPIO_Port, &GPIO_InitStruct);/*Configure GPIO pin : PtPin */GPIO_InitStruct.Pin = SUN_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(SUN_GPIO_Port, &GPIO_InitStruct);/*Configure GPIO pin : PtPin */GPIO_InitStruct.Pin = LED1_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);/*Configure GPIO pin : PtPin */GPIO_InitStruct.Pin = BEEP_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(BEEP_GPIO_Port, &GPIO_InitStruct);
}

main.h

//60行开始
#define Key1_Pin GPIO_PIN_3
#define Key1_GPIO_Port GPIOE
#define Key2_Pin GPIO_PIN_4
#define Key2_GPIO_Port GPIOE
#define LED2_Pin GPIO_PIN_5
#define LED2_GPIO_Port GPIOE
#define SUN_Pin GPIO_PIN_11
#define SUN_GPIO_Port GPIOB
#define LED1_Pin GPIO_PIN_5
#define LED1_GPIO_Port GPIOB
#define BEEP_Pin GPIO_PIN_8
#define BEEP_GPIO_Port GPIOB

若烧录完成后,需要按复位按键才可正常,可尝试以下设置

第一步:

设置1

第二步:

设置2

相关文章:

1.GPIO

理论说明 输入 上拉输入&#xff1a;拉高电平 下拉输入&#xff1a;拉低电平 浮空输入&#xff1a;不拉高也不拉低电平 输出 开漏输出&#xff1a;不能输出高电平&#xff08;P-MOS不可用&#xff0c;则只能低电平&#xff09; 推挽输出&#xff1a;可输出高低电平 输出速率…...

C++必修:STL之vector的了解与使用

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. C/C中的数组 1.1. C语言中的数组 在 C 语言中&#xff0c;数组是一组相同类型…...

【MySQL】索引 【上】 {没有索引的查询/磁盘/mysql与磁盘IO/初识索引}

文章目录 1.没有索引存在的问题2. 认识磁盘MySQL与存储MySQL与磁盘交互基本单位建立共识图解IO认识索引 在关系数据库中&#xff0c;索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构&#xff0c;它是某个表中一列或若干列值的集合和相应的指向表中物…...

GO goroutine状态流转

Gidle -> Grunnable newproc获取新的goroutine&#xff0c;并放置到P运行队列中 这也是go关键字之后实际编译调用的方法 func newproc(fn *funcval) {// 获取当前正在运行中的goroutinegp : getg()// 获取调用者的程序计数器地址&#xff0c;用于调试和跟踪pc : getcallerp…...

DLMS/COSEM中的信息安全:DLMS/COSEM安全概念(上)

DLMS/COSEM中的信息安全描述并规定: ——DLMS/COSEM安全概念; ——选择加密算法; ——安全密钥; ——使用加密算法进行实体认证、xDLMS APDU保护和COSEM数据保护。 1.综述 DLMS/COSEM服务器的资源(COSEM对象属性和方法)可以由在应用连接内的DLMS/COSEM客户机访问。 在AA…...

C语言第九天笔记

数组的概念 什 么是数组 数组是 相同类型&#xff0c; 有序数据的集合。 数 组的特征 数组中的数据被称为数组的 元素&#xff0c;是同构的 数组中的元素存放在内存空间里 (char player_name[6]&#xff1a;申请在内存中开辟6块连续的基于char类 型的变量空间) 衍生概念&…...

智慧环卫可视化:科技赋能城市清洁管理

图扑智慧环卫可视化通过实时监控、数据分析和智能调度&#xff0c;提高环卫作业效率&#xff0c;优化资源配置&#xff0c;提升城市清洁水平&#xff0c;实现城市管理的精细化和现代化。...

【力扣】SQL题库练习5

高级查询和连接 1341.电影评分 表&#xff1a;Movies ------------------------ | Column Name | Type | ------------------------ | movie_id | int | | title | varchar | ------------------------ movie_id 是这个表的主键(具有唯一值的列)。 ti…...

永结无间Ⅸ--你不需要LLM Agent

人们将目光锁定在下一个闪亮的事物上。FOMO 是人性的一部分。这也适用于企业。就像数据科学成为每个企业分析功能的热潮一样&#xff0c;Agentic Architecture 是大多数 AI 雷达上的热门目标。 但您是否考虑过您是否真的需要它&#xff1f; 实际情况是&#xff0c;您不需要 A…...

Simulink|基于粒子群算法的永磁同步电机多参数辨识

目录 主要内容 模型研究 结果一览 下载链接 主要内容 仿真程序参考文献《改进粒子群算法的永磁同步电机多参数辨识》&#xff0c;采用粒子群算法与simulink模型结合的方式&#xff0c;对永磁同步电机进行多参数辨识。程序以定子绕组电阻、d轴电感、q轴电感和永磁…...

程序如何自动点击亚马逊商户后台的“邀请评论”按钮

要在亚马逊上自动点击“邀请评论”按钮&#xff0c;可以使用自动化脚本来实现。由于你希望自动化操作&#xff0c;我提供一个示例代码&#xff0c;使用 Selenium WebDriver 来执行这个任务。Selenium 是一个流行的浏览器自动化工具&#xff0c;能够模拟用户操作&#xff0c;例如…...

大模型算法面试题(十八)

本系列收纳各种大模型面试题及答案。 1、P-tuning v2 思路、优缺点是什么 P-tuning v2是清华大学自然语言处理实验室&#xff08;THUDM&#xff09;等研究机构提出的一种新的预训练模型优化方法&#xff0c;主要关注如何通过动态构建任务相关的提示序列来引导预训练模型进行更…...

手机在网状态接口如何对接?(二)

一、什么是手机在网状态&#xff1f; 传入手机号码&#xff0c;查询该手机号的在网状态&#xff0c;返回内容有正常使用、停机、在网但不可用、不在网&#xff08;销号/未启用/异常&#xff09;、预销户等多种状态。 二、手机在网状态使用场景&#xff1f; 1.用户验证与联系…...

力扣-3232. 判断是否可以赢得数字游戏

给你一个 正整数 数组 nums。 Alice 和 Bob 正在玩游戏。在游戏中&#xff0c;Alice 可以从 nums 中选择所有个位数 或 所有两位数&#xff0c;剩余的数字归 Bob 所有。如果 Alice 所选数字之和 严格大于 Bob 的数字之和&#xff0c;则 Alice 获胜。 如果 Alice 能赢得这场游…...

Table SQL connectors以及FileSystem、JDBC connector

目录 Flink支持的连接器 如何使用连接器 FileSystem SQL Connector 文件格式 分区文件 Source 目录监控 元数据 Streaming Sink 滚动策略 文件合并 JDBC SQL Connector 依赖 如何创建JDBC表 连接器配置 案例 pom依赖 代码 测试 Flink的Table API和SQL…...

Animate软件基础:“分散到图层”创建的新图层

FlashASer&#xff1a;AdobeAnimate2021软件零基础入门教程https://zhuanlan.zhihu.com/p/633230084 FlashASer&#xff1a;实用的各种Adobe Animate软件教程https://zhuanlan.zhihu.com/p/675680471 FlashASer&#xff1a;Animate教程及作品源文件https://zhuanlan.zhihu.co…...

ffmpeg命令-Windows下常用最全

查询命令 参数 说明 -version 显示版本。 -formats 显示可用的格式&#xff08;包括设备&#xff09;。 -demuxers 显示可用的demuxers。 -muxers 显示可用的muxers。 -devices 显示可用的设备。 -codecs 显示libavcodec已知的所有编解码器。 -decoders 显示可用…...

反序列化漏洞靶机实战-serial

一.安装靶机 下载地址为https://download.vulnhub.com/serial/serial.zip&#xff0c;安装好后开启靶机&#xff0c;这里并不需要我们去登录&#xff0c;直接扫描虚拟机nat模式下c网段的ip&#xff0c;看看哪个的80端口开放&#xff0c;然后直接去访问 二.查找cookie 访问靶…...

医疗器械产品没有互联网连接,就不适用于网络安全要求吗?

医疗器械产品是否不适用于网络安全要求&#xff0c;需要考虑产品是否具有网络连接功能以进行电子数据交换或远程控制&#xff0c;以及是否采用储存媒介进行电子数据交换。详细解析如下&#xff1a; 一、医疗器械的网络安全要求不仅限于互联网连接 数据交换接口&#xff1a;医疗…...

可视掏耳勺安全吗?独家揭示六大风险弊病!

很多人习惯在洗漱完顺手拿一根棉签掏耳朵&#xff0c;但是棉签的表面直径大且粗糙&#xff0c;不易将耳朵深处的耳垢挖出&#xff0c;耳垢堆积在耳道深处长时间不清理会导致堵塞耳道&#xff0c;引起耳鸣甚至感染。而可视掏耳勺作为一种新型的挖耳工具&#xff0c;它的安全性也…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...