当前位置: 首页 > 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;它的安全性也…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...

背包问题双雄:01 背包与完全背包详解(Java 实现)

一、背包问题概述 背包问题是动态规划领域的经典问题&#xff0c;其核心在于如何在有限容量的背包中选择物品&#xff0c;使得总价值最大化。根据物品选择规则的不同&#xff0c;主要分为两类&#xff1a; 01 背包&#xff1a;每件物品最多选 1 次&#xff08;选或不选&#…...

GitHub 常见高频问题与解决方案(实用手册)

1.Push 提示权限错误&#xff08;Permission denied&#xff09; 问题&#xff1a; Bash Permission denied (publickey) fatal: Could not read from remote repository. 原因&#xff1a; 没有配置 SSH key 或使用了 HTTPS 而没有权限…...

Go爬虫开发学习记录

Go爬虫开发学习记录 基础篇&#xff1a;使用net/http库 Go的标准库net/http提供了完善的HTTP客户端功能&#xff0c;是构建爬虫的基石&#xff1a; package mainimport ("fmt""io""net/http" )func fetchPage(url string) string {// 创建自定…...