GPIO和PIN

news2024/11/24 10:03:32

文章目录

  • 1 GPIO和Pin
    • 1.1 GPIO和Pin基础概念
    • 1.2 GPIO输入模式
    • 1.3 GPIO输出模式
    • 1.4 GPIO的HAL库
      • 1.4.1 一些HAL库表示
      • 1.4.2 HAL库常用GPIO函数
      • 1.4.3 GPIO点亮led灯程序例子

1 GPIO和Pin

1.1 GPIO和Pin基础概念

​ 单片机有很多的引脚,为了操控每一个引脚,我们对引脚进行分组,例如GPIOA,GPIOB,…,GPIOG等等(Group),这一个组就称为一个GPIO端口,一般一个端口包含十六个PIN引脚[0~15]。(一个引脚占2bits,而stm32是32位的,所以一组是16个)。GPIO引脚具有可复用和重映射的特点。

  • GPIO复用功能:即一个管脚可以有不同的功能,但是同一时间的同一管脚只能占有一个功能。
  • GPIO重映射功能:将复用引脚功能重定义到其他引脚,例如USART可能默认使用GPIOA2引脚,但是你可以重映射到GPIOD5使用。

GPIO硬件示意图:

在这里插入图片描述

1.2 GPIO输入模式

输入模式有四种,分别是浮空输入,上拉输入,下拉输入,模拟输入:

  1. 浮空输入:不接入上拉电阻或者下拉电阻,直接由触发器输入,该模式内部电路呈现高阻态,该模式必须有明确的电平输入。该模式利用施密特触发器的滞回特性,可以用于进行波形整形,用于抗干扰。如果该引脚悬空,读出的值不确定。同时也可以用来输入微弱的信号。
    在这里插入图片描述

  2. 上拉输入:即用上拉电阻将输入拉到高电平。 在这里插入图片描述

  3. 下拉输入:即用下拉电阻将输入拉到低电平。 在这里插入图片描述

  4. 模拟输入:把电压信号直接传送到片上外设模块,如ADC,他和浮空输入的区别是它不经过TTL施密特触发器,是直接将模拟信号传输到外设模块上。 在这里插入图片描述

1.3 GPIO输出模式

  1. 推挽输出:即两个电平,0和1。推挽电路工作时,两只对称功率管轮流导通。所以导通损耗小,效率高。输出既可向负载灌电流,也可向负载抽取电流,提高了电路的负载能力和开关速度。
  2. 开漏输出:开漏输出没有高电平,他的两个电平分别是0电平和(1)高阻态(输出1高电平时,即是高阻态)。常常用于电平匹配或者形成“线与”逻辑关系。(电平匹配:例如单片机最高只能输出5v电压,但是输出的外设需要15v电压,这时候就需要使用开漏输出来提高输出电平)。
  3. 复用推挽输出:I/O端口被用做复用功能,即第二功能时的I/O引脚配置,设置为推挽模式。USART,PWM就是典型的复用推挽输出模式。
  4. 复用开漏输出:I/O端口被用做复用功能,即第二功能时的I/O引脚配置,设置为开漏模式。I2C可以使用复用开漏输出模式。

1.4 GPIO的HAL库

1.4.1 一些HAL库表示

//在HAL库之中,端口的类型,和pin的类型分别是
GPIO_TypeDef				*group;			 //用GPIO_TypeDef的指针定义端口
uint16_t						pin;				//引脚用无符号整形uint16_t定义

//未使用宏定义的时候,例如表示GPIOA Pin12引脚。使用:
GPIOA 和 GPIO_PIN_12  //表示
  
//若在CubeMX中起了名字,即有宏定义,例如重命名为GreenLED,那么表示为:
GreenLED_GPIO_Port 和 GreenLED_Pin //表示
  
//电平状态用GPIO_PinState定义
GPIO_PinState 有两个,分别是GPIO_PIN_RESET和GPIO_PIN_SET

1.4.2 HAL库常用GPIO函数

//根据GPIO_InitTypeDef结构体的参数初始化GPIO端口
void HAL_GPIO_Init (GPIO_TypeDef * GPIOx, GPIO_InitTypeDef * GPIO_Init);
//将GPIO端口的功能恢复到初始状态
void HAL_GPIO_DeInit (GPIO_TypeDef * GPIOx, uint32_t GPIO_Pin);

//读出GPIOx中输入寄存器的值
GPIO_PinState HAL_GPIO_ReadPin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin);
//将数据写入GPIOx中输出寄存器
void HAL_GPIO_WritePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
//翻转某个引脚的电平状态
void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin);

//锁定GPIOx寄存器,锁定后将无法修改直到复位
HAL_StatusTypeDef HAL_GPIO_LockPin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin);

1.4.3 GPIO点亮led灯程序例子

在CubeMX中使能相应的LED灯的引脚。
之后我们开始写程序

//led.h文件
#ifndef __LED_H__
#define __LED_H__

#include "gpio.h"

#define ON 1
#define OFF 0

enum{
	red_led,
	blue_led,
	green_led,
	max_led,
};

extern int turn_led(int which, int status);
extern int blink_led(int which, int interval, int num);
#endif

//led.c文件
#include "led.h"

typedef struct gpio_s{
	GPIO_TypeDef				*group;
	uint16_t						pin;
}gpio_t;

gpio_t leds[max_led]={
	{ RedLED_GPIO_Port, RedLED_Pin },
	{	BlueLED_GPIO_Port, BlueLED_Pin},
	{	GreenLED_GPIO_Port, GreenLED_Pin},
};

int turn_led(int which, int status)
{
	if (which >= max_led)
	{
		return -1;
	}
	
	GPIO_PinState				level;
	
	level = (status==OFF) ? GPIO_PIN_SET : GPIO_PIN_RESET;
	
	HAL_GPIO_WritePin(leds[which].group, leds[which].pin, level);
	
	return 0;
}

int blink_led(int which, int interval, int num)
{
  while(num--)
  {
		turn_led (which, ON);
		HAL_Delay(interval);
	
		turn_led (which, OFF);
		HAL_Delay(interval);
	}
	return 0;
}

之后在main函数中引入led.h头文件,之后调用led的函数就可以实现跑马灯,改变灯的状态等功能了。

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

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

相关文章

ChatGPT之母:AI自动化将取代人类,创意性工作或将消失

目录 01 AI取代创意性工作的担忧 1.1 CTO说了啥 02 AI已开始大范围取代人类 01 AI取代创意性工作的担忧 几天前的采访中,OpenAI的CTO直言,AI可能会扼杀一些本来不应该存在的创意性工作。 近来一篇报道更是印证了这一观点。国外科技媒体的老板Miller用…

EC-R3588SPC 资料介绍

EC-R3588SPC 资料介绍 1 介绍1.1 简介1.2 资料链接1.3 硬件资源1.4 资源下载 2 升级固件2.1 启动模式说明2.1.1 前言2.1.2 如何获取固件2.1.3 升级方法2.1.4 启动媒体2.1.5 引导模式2.1.5.1 正常模式2.1.5.2 装载机模式2.1.5.3 MaskRom模式 2.2 通过USB线升级固件2.2.1 介绍2.2…

树 | 第6章 | Java版大话数据结构 | 1.7w字长文 | 二叉树 | 哈夫曼树 | 二叉树遍历 | 构造二叉树 | LeetCode练习

📌本篇分享的大话数据结构中🎄树🎄这一章的知识点,在此基础上,增加了练习题帮助大家理解一些重要的概念✅;同时,由于原文使用的C语言代码,不利于学习Java语言的同学实践,…

endswith()方法——是否以指定子字符串结尾

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 endswith()方法用于检索字符串是否以指定子字符串结尾。如果是则返回True,否则返回False。endswith()方法的语法格式如下&…

GenAI 用于客户支持 — 第 1 部分:构建我们的概念验证

作者:来自 Elastic Chris Blaisure 欢迎来到 Inside Elastic 博客系列,我们将展示 Elastic 的内部运营如何解决实际业务挑战。本系列将揭示我们将生成式 AI(gererative AI - GenAI)集成到客户成功和支持运营中的历程,让…

【C++】类、静态、枚举、重载、多态、继承、重写、虚函数

五、类 面向对象编程是一个巨大的编程范式。C中的类class就是基于对象的程序设计。 我们可以用类来定义一个新的类型,这些新类型就可以像内置类型一样使用。 内置类型颗粒度太太小,现实需求又非常复杂,这就需要我们把内置类型适度的进行拼搭…

在Redis中使用Lua脚本实现多条命令的原子性操作

Redis作为一个高性能的键值对数据库,被广泛应用于各种场景。然而,在某些情况下,我们需要执行一系列Redis命令,并确保这些命令的原子性。这时,Lua脚本就成为了一个非常实用的解决方案。 问题的提出 假设我们有一个计数…

Redis为什么设计多个数据库

​关于Redis的知识前面已经介绍过很多了,但有个点没有讲,那就是一个Redis的实例并不是只有一个数据库,一般情况下,默认是Databases 0。 一 内部结构 设计如下: Redis 的源码中定义了 redisDb 结构体来表示单个数据库。这个结构有若干重要字段,比如: dict:该字段存储了…

Redis-实战篇-缓存更新策略(内存淘汰、超时剔除、主动更新)

文章目录 1、缓存更新策略1.1、内存淘汰1.2、超时剔除1.3、主动更新 2、业务场景:3、主动更新在企业中业务实现有三种方式3.1、Cache Aside Pattern3.1.1、操作缓存和数据库时有三个问题需要考虑:3.1.1.1、删除缓存还是更新缓存?3.1.1.2、如何…

信息学奥赛初赛天天练-39-CSP-J2021基础题-哈夫曼树、哈夫曼编码、贪心算法、满二叉树、完全二叉树、前中后缀表达式转换

PDF文档公众号回复关键字:20240629 2022 CSP-J 选择题 单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项) 5.对于入栈顺序为a,b,c,d,e的序列,下列( )不合法的出栈序列 A. a,b&a…

架构师必知的绝活-JVM调优

前言 为什么要学JVM? 首先:面试需要 了解JVM能帮助回答面试中的复杂问题。面试中涉及到的JVM相关问题层出不穷,难道每次面试都靠背几百上千条面试八股? 其次:基础知识决定上层建筑 自己写的代码都不知道是怎么回事&a…

show-overflow-tooltip 解决elementui el-table标签自动换行的问题

elementui中 el-table中某一行的高度不想因为宽度不够而撑开换行展示的解决方法。可通过show-overflow-tooltip属性解决&#xff0c;如下 代码是这样的 <el-table-column width"80" prop"id" label"ID"></el-table-column> <el…

java基于ssm+jsp 二手车交易网站

1用户功能模块 定金支付管理&#xff0c;在定金支付管理页面可以填写订单编号、车型、品牌、分类、车身颜色、售价、订金金额、付款日期、备注、用户名、姓名、联系方式、是否支付等信息&#xff0c;进行详情、修改&#xff0c;如图1所示。 图1定金支付管理界面图 预约到店管…

亨廷顿(Huntington)方法-名额分配

前言 20世纪初&#xff0c;美国人口普查局局长约瑟夫A亨廷顿&#xff08;Joseph A. Hill&#xff09;和数学家爱德华V亨廷顿&#xff08;Edward V. Huntington&#xff09;在研究议会议席分配问题时&#xff0c;提出了一种基于数学原理的算法。该算法通过计算每个州的人口比例&…

有趣的仿神经猫html5圈小猫游戏源码

有趣的仿神经猫html5圈小猫游戏源码,点击小圆点&#xff0c;围住小猫游戏。猫已经跑到地图边缘&#xff0c;你输了。内含json数据&#xff0c;部署到服务器方可运行 微信扫码免费获取源码

【自然语言处理系列】掌握jieba分词器:从基础到实战,深入文本分析与词云图展示

本文旨在全面介绍jieba分词器的功能与应用&#xff0c;从分词器的基本情况入手&#xff0c;逐步解析全模式与精确模式的不同应用场景。文章进一步指导读者如何通过添加自定义词典优化分词效果&#xff0c;以及如何利用jieba分词器进行关键词抽取和词性标注&#xff0c;为后续的…

基于docker安装redis服务

Redis是我们在项目中经常需要使用的缓存数据库&#xff0c;安装redis的方式也有很多&#xff0c;本文主要是给大家讲解如何基于docker进行redis服务的安装&#xff0c;主要介绍&#xff0c;如何拉取redis镜像、如何挂载redis的数据以及使用redis的配置文件和开启认证等功能&…

【MySQL】InnoDB架构

本文MySQL版本是8.X版本 这是官方文档给出来的架构图&#xff1a;MySQL :: MySQL 8.0 Reference Manual :: 17.4 InnoDB Architecture 可以看出&#xff0c;整体上是分成两部分的&#xff1a;内存结构(提高效率)和磁盘结构(数据持久化)&#xff0c;下面将把每个区域都大致做一个…

RFID固定资产管理系统在企业中的应用与优势

随着企业资产规模的不断扩大和管理复杂性的增加&#xff0c;传统的资产管理方式已无法满足企业高效管理的需求。RFID固定资产管理系统凭借其高效、准确、实时的特点&#xff0c;成为企业固定资产管理的新宠。 一、什么是RFID固定资产管理系统 RFID&#xff08;无线射频识别&…

代理IP如何进行品牌保护?

品牌是企业无形的价值&#xff0c;代表了企业的文化、形象和软实力。随着网络攻击、侵权行为的频发&#xff0c;企业如何有效保护自己的品牌资产&#xff0c;维护品牌形象&#xff0c;成为了亟待解决的问题。代理IP作为一种网络工具&#xff0c;在品牌保护中发挥着不可或缺的作…