GPIO(嵌入式学习)

GPIO 通用输入输出口:

可分为八种输入输出模式

输出模式

下端可控制端口输出高低电平,用以驱动LED,控制蜂鸣器,模拟通信协议输出时序

输入模式

读取高低电平或电压,用与读取按键输入,外界模块电平信号输入,adc电压采集,模拟通信协议接收数据等

GPIO基本结构

寄存器只负责存储数据,其中寄存器只有低16位的有端口,高16位没有端口

这是GPIO的位结构

上面是输入部分,下面是输出部分

输入部分:
两个保护二极管作用为对输入电压进行限幅

上拉电阻和下拉电阻:上面导通,下面断开,为上拉输入模式;下面导通,上面断开,下拉输入模式;两个断开,就是浮空的状态

施密特触发器输出信号:整形输入信号使其稳定,可有效避免因信号波动造成的输出抖动现象,经过施密特整形就可以直接输入数据寄存器(用程序读取输入数据寄存器对应的某一位数据,可知道端口的输入电平)

这里有两个片上外设,上面是接模拟量,接在施密特触发器前面,下面接数字量,接在施密特触发器后面。

输出部分

数字部分可由输出数据寄存器和片上外设两种控制然后通过数据选择器接到了输出控制部分。

而最左侧的位设置/清除寄存器可以单独操作输出数据寄存器的某一位,不影响其他(方式:如果要对某一位进行置1,在位设置寄存器的对应位写1,对不需要操作的位写0,要操作的写一,内部就会有电路;如果相对某一位清0,就在位清除寄存器的对应位写1)

mos管:用来控制开关的导通和关闭(引脚为输入模式,两个mos管都无效,端口电平由外部信号控制),可选择推挽、开漏或关闭;输出寄存器为1时,上管导通,下面断开,输出接到vdd就是输出高电平,反之亦然。

P-mos无效,就是开漏输出,如果P-MOS和N-MOS都有效,就是推挽输出

对应上拉输入,下拉输入和浮空输入

其他模式有效

AIN(Analog IN)是模拟输入

IN_FLOATING是浮空输入

IPD(IN PULL DOWN)下拉输入

IPU(IN PULL UP)是上拉输入

OUT_OD(OUT OPEN DRAIN)是开漏输出

OUT_PP(OUT PUSH PULL)是推挽输出

AF_OD(ALTERNATE OPEN DRAIN)是复用开漏

AF_PP(ALTERNATE PUSH PULL)是复用推挽

GPIO初始化

int main(void)
{/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟//使用各个外设前必须开启时钟,否则对外设的操作无效/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;					//定义结构体变量GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		//GPIO模式,赋值为推挽输出模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;				//GPIO引脚,赋值为第0号引脚GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//GPIO速度,赋值为50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);					//将赋值后的构体变量传递给GPIO_Init函数//函数内部会自动根据结构体的参数配置相应寄存器//实现GPIOA的初始化

这里led正极接的是电源vcc,负极gpio,所以是低电平导通,形成电流路径

reset低电平,set高电平

led闪烁的三种方式

while (1){/*设置PA0引脚的高低电平,实现LED闪烁,下面展示3种方法*//*方法1:GPIO_ResetBits设置低电平,GPIO_SetBits设置高电平*/GPIO_ResetBits(GPIOA, GPIO_Pin_0);					//将PA0引脚设置为低电平Delay_ms(500);										//延时500msGPIO_SetBits(GPIOA, GPIO_Pin_0);					//将PA0引脚设置为高电平Delay_ms(500);										//延时500ms/*方法2:GPIO_WriteBit设置低/高电平,由Bit_RESET/Bit_SET指定*/GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);		//将PA0引脚设置为低电平Delay_ms(500);										//延时500msGPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);			//将PA0引脚设置为高电平Delay_ms(500);										//延时500ms/*方法3:GPIO_WriteBit设置低/高电平,由数据0/1指定,数据需要强转为BitAction类型*/GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);		//将PA0引脚设置为低电平Delay_ms(500);										//延时500msGPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);		//将PA0引脚设置为高电平Delay_ms(500);										//延时500ms}
}

推挽输出高低电平都有驱动能力,所以如果正极接电源,就是低电平驱动;如果长脚正极接PA0口,短角插到负极,led就是高电平点亮方式

因为开漏输出高电平不能驱动,所以只能才用低电平驱动方式,也就是长脚正极接电源正极,短脚负极接PA0口

如果需要实现流水灯,可以使用按位或的方式选中多个引脚,用GPIO_Write点亮对应的灯,因为是低电平驱动,所以取反。

int main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);while (1){GPIO_Write(GPIOA, ~0x0001);	//0000 0000 0000 0001Delay_ms(100);GPIO_Write(GPIOA, ~0x0002);	//0000 0000 0000 0010Delay_ms(100);GPIO_Write(GPIOA, ~0x0004);	//0000 0000 0000 0100Delay_ms(100);GPIO_Write(GPIOA, ~0x0008);	//0000 0000 0000 1000Delay_ms(100);GPIO_Write(GPIOA, ~0x0010);	//0000 0000 0001 0000Delay_ms(100);GPIO_Write(GPIOA, ~0x0020);	//0000 0000 0010 0000Delay_ms(100);GPIO_Write(GPIOA, ~0x0040);	//0000 0000 0100 0000Delay_ms(100);GPIO_Write(GPIOA, ~0x0080);	//0000 0000 1000 0000Delay_ms(100);}
}

蜂鸣器也同理,修改对应的gpio口就可以了

int main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);while (1){GPIO_ResetBits(GPIOB, GPIO_Pin_12);Delay_ms(100);GPIO_SetBits(GPIOB, GPIO_Pin_12);Delay_ms(100);GPIO_ResetBits(GPIOB, GPIO_Pin_12);Delay_ms(100);GPIO_SetBits(GPIOB, GPIO_Pin_12);Delay_ms(700);}
}

 

 

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

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

相关文章

【构建工具】Gradle Kotlin DSL中的大小写陷阱:BuildConfigField

在Android开发当中,BuildConfig是一个非常有用的功能,它允许我们在构建过程中定义常量,并在运行时使用它们。But!!当我们从传统的Groovy DSL迁移到Kotlin DSL时或者被Android Studio坑的时候,有一些细微的差…

【Uniapp-Vue3】开发userStore用户所需的相关操作

在项目根路径下创建的stores文件夹中创建user.js文件 并将以下内容复制到user.js中 import {ref} from "vue" import { defineStore } from pinia; const uniIdCo uniCloud.importObject("uni-id-co") const db uniCloud.database(); const usersTable…

设计一个“车速计算”SWC,通过Sender-Receiver端口输出车速信号。

1. 需求分析 功能目标:根据车轮脉冲信号(轮速传感器输入)计算当前车速,并将结果通过Sender端口发送给其他SWC。 输入:轮速脉冲数(如WheelPulse,类型uint32)。 输出:车速(如VehicleSpeed,类型float32,单位km/h)。 触发方式:周期性计算(例如每10ms执行一次)。 2.…

【人工智能】数据挖掘与应用题库(1-100)

1、涉及变化快慢的问题可以考虑使用导数来分析。 答案:对 2、导数的几何意义是曲线在某点处切线的斜率。 答案:对 3、函数在某点的左导数存在,则导数就存在。 答案:错 4、关于梯度下降算法,下列说法错误的是( ) 错误:梯度下降算法能找到函数精确的最小值。 5、正…

Redis分布式锁的实现(Redission)

写在前面 本人在学习Redis过程中学习到分布式锁时太多困惑和疑难杂点 需要总结梳理思路 以下思路都是最简单最基本的思路 主要用到Redission工具类 会涉及到看门狗机制等 本文内容部分引自Javaguide,小林coding等热门八股 用于个人学习用途 分布式锁介绍 对于单机多线程来说…

OpenCV计算摄影学(5)处理一系列图像(例如视频帧)的非局部均值去噪的函数fastNlMeansDenoisingColoredMulti()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 对用于彩色图像序列的 fastNlMeansDenoisingMulti 函数的修改。 cv::fastNlMeansDenoisingColoredMulti 函数是 OpenCV 中用于处理一系列图像&am…

华为数通Datacom认证体系详解:从HCIA到HCIE的进阶路径

华为数通Datacom(Data Communication)课程是华为认证体系中的核心方向之一,聚焦企业网络通信与数据通信技术,适合从事网络规划、部署和运维的人员。 一、数通Datacom课程体系 华为数通Datacom认证分为 三个级别,逐级递…

MyBatis中是如何对占位符进行赋值的?

MyBatis 中对占位符进行赋值的过程主要由 PreparedStatement 和参数处理器 (ParameterHandler) 协同完成。 1. SQL 语句中的占位符: MyBatis 支持两种占位符: # (预编译参数): 推荐使用。 MyBatis 会使用 PreparedStatement 的占位符 ? 来处理。PreparedStatemen…

基于Apollo对配置类的热更新优化

背景 关于配置的热更新,apollo 通过com.ctrip.framework.apollo.spring.annotation.SpringValueProcessor 处理带Value的方法或字段,通过监听变更事件,采用反射去更新对应的值 但这个功能仅仅用于单个属性,当我有一组有关联关系…

Highcharts 配置语法详解

Highcharts 配置语法详解 引言 Highcharts 是一个功能强大的图表库,广泛应用于数据可视化领域。本文将详细介绍 Highcharts 的配置语法,帮助您快速上手并制作出精美、实用的图表。 高级配置结构 Highcharts 的配置对象通常包含以下几部分&#xff1a…

【AD】3-5 元件在原理图中的基本操作2

1.导线连接 选择放置->线(CtrlW),或者直接点击横条处,建议使用直角走线 注意:下图中的线不具有电气连接属性,只是单纯的线 双击导线,进行设置导线粗细及颜色 2.网络标签 放置->网络标…

vim:基础配置

Vim 配置清单 设置行号显示 set number 设置相对行号(可选) set relativenumber设置制表符为4个空格 set tabstop4 设置自动缩进 set autoindent " 启用语法高亮 syntax on" 设置背景颜色(可选,根据终端或GUI Vi…

【Springboot】解决问题 o.s.web.servlet.PageNotFound : No mapping for *

使用 cursor 进行老项目更新为 springboot 的 web 项目,发生了奇怪的问题,就是 html 文件访问正常,但是静态文件就是 404 检查了各种配置,各种比较,各种调试,最后放弃时候,清理没用的配置文件&…

day02_Java基础

文章目录 day02_Java基础一、今日课程内容二、数组(熟悉)1、定义格式2、基本使用3、了解数组的内存图介绍4、数组的两个小问题5、数组的常见操作 三、方法(熟悉)1、定义格式2、方法重载overload 四、面向对象(掌握&…

Linux服务器防火墙白名单访问策略的配置示例

最近在做Linux系统应用部署配置过程中,为了确保应用的安全,简单学习了解了一些Linux中的动态防火墙管理工具的使用方法。本文测试实验主要采用Linux服务器的动态防火墙管理工具(即firewalld),来实现服务或端口的访问控制,firewall…

【UCB CS 61B SP24】Lecture 17 - Data Structures 3: B-Trees学习笔记

本文以 2-3-4 树详细讲解了 B 树的概念,逐步分析其操作,并用 Java 实现了标准的 B 树。 1. 2-3 & 2-3-4 Trees 上一节课中讲到的二叉搜索树当数据是随机顺序插入的时候能够使得树变得比较茂密,如下图右侧所示,时间复杂度也就…

【手撕算法】支持向量机(SVM)从入门到实战:数学推导与核技巧揭秘

摘要 支持向量机(SVM)是机器学习中的经典算法!本文将深入解析最大间隔分类原理,手撕对偶问题推导过程,并实战实现非线性分类与图像识别。文中附《统计学习公式手册》及SVM调参指南,助力你掌握这一核心算法…

西门子S7-1200比较指令

西门子S7-1200 PLC比较指令学习笔记 一、比较指令的作用 核心功能:用于比较两个数值的大小或相等性,结果为布尔值(True/False)。典型应用: 触发条件控制(如温度超过阈值启动报警)数据筛选&…

SDF,占用场,辐射场简要笔记

符号距离函数(Signed Distance Function,SDF)的数学公式用于描述空间中任意点到某个几何形状边界的最短距离,并通过符号区分点在边界内外。具体定义如下: 假设 Ω \Omega Ω 是一个几何形状的边界,对于空…

solidwork智能尺寸怎么对称尺寸

以构造轴为中心线就能画智能尺寸的对称尺寸。先点击边再点击构造线