1.GPIO
理论说明
输入
上拉输入:拉高电平
下拉输入:拉低电平
浮空输入:不拉高也不拉低电平
输出
开漏输出:不能输出高电平(P-MOS不可用,则只能低电平)
推挽输出:可输出高低电平

输出速率
- Low:2MHz
- Medium:10MHz
- High:50MHz
代码编写
几个功能例程的配置及代码
Cube IDE代码
LED灯闪烁
配置引脚功能:

在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 */
}
效果展示:
代码过程
初始化时钟
- 初始化时钟
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
- 初始化引脚
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 */
- 写实际需求(输入: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.GPIO
理论说明 输入 上拉输入:拉高电平 下拉输入:拉低电平 浮空输入:不拉高也不拉低电平 输出 开漏输出:不能输出高电平(P-MOS不可用,则只能低电平) 推挽输出:可输出高低电平 输出速率…...
C++必修:STL之vector的了解与使用
✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C学习 贝蒂的主页:Betty’s blog 1. C/C中的数组 1.1. C语言中的数组 在 C 语言中,数组是一组相同类型…...
【MySQL】索引 【上】 {没有索引的查询/磁盘/mysql与磁盘IO/初识索引}
文章目录 1.没有索引存在的问题2. 认识磁盘MySQL与存储MySQL与磁盘交互基本单位建立共识图解IO认识索引 在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物…...
GO goroutine状态流转
Gidle -> Grunnable newproc获取新的goroutine,并放置到P运行队列中 这也是go关键字之后实际编译调用的方法 func newproc(fn *funcval) {// 获取当前正在运行中的goroutinegp : getg()// 获取调用者的程序计数器地址,用于调试和跟踪pc : getcallerp…...
DLMS/COSEM中的信息安全:DLMS/COSEM安全概念(上)
DLMS/COSEM中的信息安全描述并规定: ——DLMS/COSEM安全概念; ——选择加密算法; ——安全密钥; ——使用加密算法进行实体认证、xDLMS APDU保护和COSEM数据保护。 1.综述 DLMS/COSEM服务器的资源(COSEM对象属性和方法)可以由在应用连接内的DLMS/COSEM客户机访问。 在AA…...
C语言第九天笔记
数组的概念 什 么是数组 数组是 相同类型, 有序数据的集合。 数 组的特征 数组中的数据被称为数组的 元素,是同构的 数组中的元素存放在内存空间里 (char player_name[6]:申请在内存中开辟6块连续的基于char类 型的变量空间) 衍生概念&…...
智慧环卫可视化:科技赋能城市清洁管理
图扑智慧环卫可视化通过实时监控、数据分析和智能调度,提高环卫作业效率,优化资源配置,提升城市清洁水平,实现城市管理的精细化和现代化。...
【力扣】SQL题库练习5
高级查询和连接 1341.电影评分 表:Movies ------------------------ | Column Name | Type | ------------------------ | movie_id | int | | title | varchar | ------------------------ movie_id 是这个表的主键(具有唯一值的列)。 ti…...
永结无间Ⅸ--你不需要LLM Agent
人们将目光锁定在下一个闪亮的事物上。FOMO 是人性的一部分。这也适用于企业。就像数据科学成为每个企业分析功能的热潮一样,Agentic Architecture 是大多数 AI 雷达上的热门目标。 但您是否考虑过您是否真的需要它? 实际情况是,您不需要 A…...
Simulink|基于粒子群算法的永磁同步电机多参数辨识
目录 主要内容 模型研究 结果一览 下载链接 主要内容 仿真程序参考文献《改进粒子群算法的永磁同步电机多参数辨识》,采用粒子群算法与simulink模型结合的方式,对永磁同步电机进行多参数辨识。程序以定子绕组电阻、d轴电感、q轴电感和永磁…...
程序如何自动点击亚马逊商户后台的“邀请评论”按钮
要在亚马逊上自动点击“邀请评论”按钮,可以使用自动化脚本来实现。由于你希望自动化操作,我提供一个示例代码,使用 Selenium WebDriver 来执行这个任务。Selenium 是一个流行的浏览器自动化工具,能够模拟用户操作,例如…...
大模型算法面试题(十八)
本系列收纳各种大模型面试题及答案。 1、P-tuning v2 思路、优缺点是什么 P-tuning v2是清华大学自然语言处理实验室(THUDM)等研究机构提出的一种新的预训练模型优化方法,主要关注如何通过动态构建任务相关的提示序列来引导预训练模型进行更…...
手机在网状态接口如何对接?(二)
一、什么是手机在网状态? 传入手机号码,查询该手机号的在网状态,返回内容有正常使用、停机、在网但不可用、不在网(销号/未启用/异常)、预销户等多种状态。 二、手机在网状态使用场景? 1.用户验证与联系…...
力扣-3232. 判断是否可以赢得数字游戏
给你一个 正整数 数组 nums。 Alice 和 Bob 正在玩游戏。在游戏中,Alice 可以从 nums 中选择所有个位数 或 所有两位数,剩余的数字归 Bob 所有。如果 Alice 所选数字之和 严格大于 Bob 的数字之和,则 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:AdobeAnimate2021软件零基础入门教程https://zhuanlan.zhihu.com/p/633230084 FlashASer:实用的各种Adobe Animate软件教程https://zhuanlan.zhihu.com/p/675680471 FlashASer:Animate教程及作品源文件https://zhuanlan.zhihu.co…...
ffmpeg命令-Windows下常用最全
查询命令 参数 说明 -version 显示版本。 -formats 显示可用的格式(包括设备)。 -demuxers 显示可用的demuxers。 -muxers 显示可用的muxers。 -devices 显示可用的设备。 -codecs 显示libavcodec已知的所有编解码器。 -decoders 显示可用…...
反序列化漏洞靶机实战-serial
一.安装靶机 下载地址为https://download.vulnhub.com/serial/serial.zip,安装好后开启靶机,这里并不需要我们去登录,直接扫描虚拟机nat模式下c网段的ip,看看哪个的80端口开放,然后直接去访问 二.查找cookie 访问靶…...
医疗器械产品没有互联网连接,就不适用于网络安全要求吗?
医疗器械产品是否不适用于网络安全要求,需要考虑产品是否具有网络连接功能以进行电子数据交换或远程控制,以及是否采用储存媒介进行电子数据交换。详细解析如下: 一、医疗器械的网络安全要求不仅限于互联网连接 数据交换接口:医疗…...
可视掏耳勺安全吗?独家揭示六大风险弊病!
很多人习惯在洗漱完顺手拿一根棉签掏耳朵,但是棉签的表面直径大且粗糙,不易将耳朵深处的耳垢挖出,耳垢堆积在耳道深处长时间不清理会导致堵塞耳道,引起耳鸣甚至感染。而可视掏耳勺作为一种新型的挖耳工具,它的安全性也…...
对比了8款测试管理平台,最适合中小团队的居然是它
在软件研发的生命周期中,测试用例管理早已不是简单的“记录-执行-通过”的线性流程。随着敏捷开发、DevOps乃至AI辅助测试的全面渗透,测试管理平台承载的职责已扩展至需求追溯、缺陷闭环、自动化集成和质量度量等多个维度。然而,对于中小型测…...
CMOS闩锁效应原理与防护设计实践
1. 闩锁效应基础原理剖析闩锁效应(Latch-up)是CMOS集成电路设计中最为棘手的可靠性问题之一。这种现象本质上是由芯片内部寄生形成的PNP-NPN晶体管对构成的晶闸管结构(SCR)被意外触发导致的。当特定条件满足时,这些寄生元件会形成正反馈回路,导致电源与地…...
多重细胞因子检测及其技术综述
一、细胞因子概述细胞因子是一类由免疫细胞(如单核细胞、巨噬细胞、T细胞、B细胞及自然杀伤细胞等)及部分非免疫细胞(如内皮细胞、表皮细胞、成纤维细胞等)在相应刺激诱导下合成并分泌的小分子蛋白质,具有广泛的生物学…...
Arm DDT:高性能计算并行程序调试利器
1. Arm DDT调试工具概述Arm DDT(Distributed Debugging Tool)是Arm公司开发的一款专业级并行程序调试工具,专为高性能计算(HPC)领域设计。作为Arm Forge工具套件的重要组成部分,DDT提供了强大的MPI程序调试…...
Nihonga风格AI生成稀缺资源包泄露:含17世纪狩野派笔触扫描集、200+古籍《本朝画史》描述性Prompt语料库、及唯一通过日本文化厅AI伦理审查的商用授权协议范本
更多请点击: https://intelliparadigm.com 第一章:Nihonga风格AI生成资源包的伦理边界与文化权重 文化符号的不可压缩性 Nihonga(日本画)并非仅由矿物颜料、金箔或桑皮纸构成的技术集合,其内嵌着神道自然观、物哀美学…...
【仅开放72小时】:Gemini Workspace与Microsoft Entra ID双向同步的密钥轮换脚本(含自动审计日志生成器)
更多请点击: https://intelliparadigm.com 第一章:Gemini Workspace整合方案概述 Gemini Workspace 是 Google 推出的面向企业级 AI 协作的统一平台,其核心价值在于将 Gemini 模型能力深度嵌入办公套件(如 Gmail、Drive、Docs、M…...
Dell G15终极散热管理:开源热控中心完全指南 [特殊字符]
Dell G15终极散热管理:开源热控中心完全指南 🚀 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 还在为Dell G15游戏本的过热问题而烦恼…...
新手避坑指南:ICC LAB2 Design Planning 从加载设计到写出DEF的完整流程复盘
ICC LAB2 Design Planning全流程深度解析:从数据加载到DEF输出的实战避坑指南 当你第一次打开ICC工具面对LAB2的Design Planning任务时,是否感觉像被扔进了一个满是按钮的控制室?每个命令似乎都重要,但又不清楚它们如何串联成完整…...
SeetaFace6实战:5分钟搞定实时视频流人脸检测(支持戴口罩识别,附完整C++/OpenCV代码)
SeetaFace6实战:5分钟构建高精度实时视频人脸检测系统(含口罩识别) 在智能安防、无接触门禁和远程医疗等场景中,实时人脸检测技术正发挥着越来越重要的作用。SeetaFace6作为中科视拓开源的最新版本人脸识别引擎,不仅将…...
3分钟掌握Windows安装APK:告别复杂模拟器的终极方案
3分钟掌握Windows安装APK:告别复杂模拟器的终极方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经遇到过这样的场景?同事发来一个实…...
