STM32——GPIO(点亮LEDLED闪烁)

一、什么是GPIO?

GPIO(通用输入输出接口):

1.GPIO 功能概述
 

 GPIO 是通用输入/输出(General Purpose I/O)的简称,既能当输入口使用,又能当输出口使用。端口,就是元器件上的一个引脚,可以通过软件去控制。

在大多数的时候,我们将IO口可以看为一个电子开关,通过向IO寄存器中写入相应的值,其输出的电平就随着寄存器的变化而变化,这是IO口的输出,在大多数的单片机中,需要去配置单片机的IO模式,是输入还是输出。

即需要预先初始化,配置GPIO的参数,再去使用GPIO。在51单片机中不支持这样的操作,即不能配置GPIO的参数,但在32我们就必须去配置GPIO从而完成某种功能。

输出功能 :继电器、 LED、蜂鸣器等的控制
输入功能 :传感器状态、高低电平等信息的读取
复用功能 :片内外设的对外接口
时序模拟 :模拟 SPI、I2C 和 UART 等常用接口的时序

2.端口和引脚


(1)端口(PORT): 独立的外设子模块,包括多个引脚,通过多个硬件寄存器控制引脚。
GPIO 模块由端口 GPIOA、GPIOB、GPIOC 等多个独立的子模块构成。

例如:端口 GPIOA 包括 PA0 ~ PA15 这 16 个引脚,通过 10 个硬件寄存器控制引脚工作。

(2)引脚(PIN): 对应微控制器的一个管脚,归属于端口,由端口寄存器的对应位控制。
PA0,属于端口 GPIOA,输出电平由端口 GPIOA 的输出数据寄存器 GPIOA_ODR 的第 0 位决定。

3.GPIO电路

  1. 注: VDD_FT 5V容忍I/O脚是特殊的,它与VDD不同

4.GPIO的8种工作模式

  1. 输入浮空:输入用,完全浮空,IO状态不定,由外部环境决定
  2. 输入上拉:输入用 ,内部下拉,IO默认是高电平
  3. 输入下拉:空闲时,IO默认是低电平
  4. 模拟功能:专门用于模拟信号的输入输出,如ADC/DAC
  5. 开漏输出:不能输出高电平,必须由外部或内部上拉电阻才能输出高电平,如软件IIC的SDL、SCL等
  6. 推挽输出:高低电平的驱动能力强,25ma 通用输出
  7. 开漏式复用功能: 可输出高低电平,片上外设功能(硬件IIC的SDL、SCL等)
  8. 推挽式复用功能:可输出高低电平,驱动力强,由其他外设控制输出

二、GPIO配置步骤

1、点亮LED代码演示

#include "stm32f10x.h"                  // Device headerint main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能时钟GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init (GPIOA ,&GPIO_InitStruct);GPIO_ResetBits(GPIOA ,GPIO_Pin_0);while(1){}
}

可以看到,实物图中LED灯一端接的+极,另一端接的A0,因此想要LED点亮,就需要给A0低电平,用GPIO_ResetBits(GPIOA ,GPIO_Pin_0)函数就能实现,相反如果LED灯一端接的负极,那么此时A0就应该给予高电平才会亮,也就是使用GPIO_SetBits(GPIOA ,GPIO_Pin_0)函数;同样,如果使用GPIO_WriteBit(GPIOA ,GPIO_Pin_0,Bit_RESET)函数也可以将LED点亮,与前面两个函数区别的是这个函数多了一个参数,而就是这个参数决定了赋予高电平函数低电平。

但要注意:以上均是在GPIO推挽输出的模式下进行的,如果模式不同,高电平与低电平的驱动力不同,此时如果把GPIO换成开漏输出模式,此时只有低电平才具有驱动能力,那就意味着如果想要点灯,那么LED一端只能接+极,A0口给低电平才能够点亮LED,反正如果一段给低电平,A0口给高电平是不会点亮的,因为高电平是没有驱动能力的,无法驱动LED点亮

以上就是这三个函数的用法。

2、GPIO配置步骤

(1)使能时钟(使用RCC开启GPIO的时钟)

以上三个是最为常用的外设时钟控制

RCC AHB外设时钟控制
RCC APB2外设时钟控制
RCC APB1外设时钟控制

在点灯代码中我们使用的是 :RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE)

右键点击就可以跳转到rcc.c文件里面的函数定义

第一个参数就是选择哪个外设(蓝笔),第二个参数就是使能或失能(红笔)

(2)使用GPIO_Init函数初始化GPIO

GPIO_Init (GPIOA ,&GPIO_InitStruct)

这个函数的作用是通过结构体的参数(GPIO_InitStruct)来定义GPIO口(GPIOA);

所以接下来我们需要定义一个结构体变量,然后给结构体赋值,最后调用这个函数,也就是代码里面的:GPIO_InitTypeDef GPIO_InitStruct;其中GPIO_InsStruct为结构体的名字。

上图中这四个为GPIO的读取函数,紧接着的下面的四个为GPIO的写入函数;通过这8个函数就可以实现对GPIO口的读写。GPIO_ResetBits(GPIOA ,GPIO_Pin_0);这里就是对IO口进行赋予低电平,前面实物图下方也有介绍过。

然后我们要复制结构体的名字通过点(.)把它的子成员引出,也就是

GPIO_InitStruct.GPIO_Mode 

 GPIO_InitStruct.GPIO_Pin 
 GPIO_InitStruct.GPIO_Speed 

然后进行赋值:GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

怎么样进行赋值呢?还是老样子先跳转到函数定义处:

然后

进行模式选择;其他的速度以及引脚也是同理进行操作选择复制即可。 

三、LED闪烁

有了前面的基础,学习过51的都知道,只需要加上一个延时函数即可完成LED闪烁:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"int main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init (GPIOA ,&GPIO_InitStruct);while(1){GPIO_WriteBit(GPIOA ,GPIO_Pin_0,Bit_RESET);Delay_ms(500);GPIO_WriteBit(GPIOA ,GPIO_Pin_0,Bit_SET);Delay_ms(500);}
}

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

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

相关文章

【C++高阶】哈希之美:探索位图与布隆过滤器的应用之旅

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C “ 登神长阶 ” 🤡往期回顾🤡:模拟实现unordered 的奥秘 🌹🌹期待您的关注 🌹🌹 ❀哈希应用 &#x1f4…

使用flutter做仪表盘(桌面端)

前言 最近收到一个需求,需要使用flutter 来做一个仪表盘,这可难倒我了,毕竟我是做前端的,flutter 之前接触的也少,但没办法,既然需求有了,也得硬着头皮上了,先来看看做的效果。 一…

Java语言程序设计基础篇_编程练习题*15.32(控制时钟)

*15.32(控制时钟) 修改程序淸单14-21,在类中加入动画。添加两个方法 start() 和 stop() 以启动和停止时钟。编写一个程序,让用户使用 Start 和 Stop 按钮来控制时钟,如图15-36a所示 代码示例:编程练习题15_32ClockPane.java pack…

CVE-2024-39700 (CVSS 9.9):JupyterLab 模板中存在严重漏洞

在广泛使用的 JupyterLab 扩展模板中发现了一个严重漏洞,编号为CVE-2024-39700 。此漏洞可能使攻击者能够在受影响的系统上远程执行代码,从而可能导致大范围入侵和数据泄露。 该漏洞源于在扩展创建过程中选择“测试”选项时自动生成“update-integratio…

blender顶点乱飞的问题解决

初学blender,编辑模式下移动某些顶点,不管是移动还是滑动都会出现定点乱飞的问题,后来才发现是开了吸附工具的原因!!!! 像下面这样,其实我只是在Z轴上移动,但是就跑的很…

AvaloniaUI的学习

相关网站 github:https://github.com/AvaloniaUI/Avalonia 官方中文文档:https://docs.avaloniaui.net/zh-Hans/docs/welcome IDE选择 VS2022VSCodeRider 以上三种我都尝试过,体验Rider最好。VS2022的提示功能不好,VSCode太慢&#xff0c…

调度器——DolphinScheduler讲解及安装教程

调度器——DolphinScheduler讲解及安装教程 一:基本讲解 Dolphin Scheduler 1、开源的分布式任务调度系统 2、支持多种任务类型,包括Shell、Spark、Hive等 3、灵活的任务调度功能和友好的Web界面,方便管理和监控任务的执行情况 架构 操作系…

必备神器!三款优秀远程控制电脑软件推荐

嘿,各位职场小伙伴们,今儿个咱们来聊聊个挺实用又带点“科技范儿”的话题——电脑远程控制那点事儿。作为刚踏入职场不久的新人,我深刻体会到,在这信息爆炸的时代,掌握几招远程操作的技能,简直就是给自个儿…

一文详解 JuiceFS 读性能:预读、预取、缓存、FUSE 和对象存储

在高性能计算场景中,往往采用全闪存架构和内核态并行文件系统,以满足性能要求。随着数据规模的增加和分布式系统集群规模的增加,全闪存的高成本和内核客户端的运维复杂性成为主要挑战。 JuiceFS,是一款全用户态的云原生分布式文件…

GPU虚拟化和池化技术解读

GPU虚拟化到池化技术深度分析 在大型模型的推动下,GPU算力的需求日益增长。然而,企业常常受限于有限的GPU卡资源,即使采用虚拟化技术,也难以充分利用或持续使用这些资源。为解决GPU算力资源的不均衡问题,同时推动国产…

Spring源码学习笔记之@Async源码

文章目录 一、简介二、异步任务Async的使用方法2.1、第一步、配置类上加EnableAsync注解2.2、第二步、自定义线程池2.2.1、方法一、不配置自定义线程池使用默认线程池2.2.2、方法二、使用AsyncConfigurer指定线程池2.2.3、方法三、使用自定义的线程池Excutor2.2.4、方法四、使用…

《500 Lines or Less》(5)异步爬虫

https://aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html ——A. Jesse Jiryu Davis and Guido van Rossum 介绍 网络程序消耗的不是计算资源,而是打开许多缓慢的连接,解决此问题的现代方法是异步IO。 本章介绍一个简单的网络爬虫&a…

【Linux】玩转操作系统,深入刨析进程状态与调度机制

目录 1. 进程排队2. 进程状态的表述2.1. 进程状态2.2 运行状态2.3. 阻塞状态2.4. 挂起状态 3. Linux下具体的进程状态3.1. 运行状态R3.2. 可中断睡眠状态S3.3. 不可中断睡眠状态D3.4. 停止状态T3.5. 死亡状态X3.6. 僵尸状态Z 4. 孤儿进程5. 优先级6. Linux的调度与切换6.1. 四个…

单链表的实现和操作

目录 一.前言 二.单链表的定义和结构 三. 单链表的操作 一.前言 线性表的链式表示又称为非顺序映像或链式映像。简而言之,链表可以理解为由指针链连接的n个结点组成的。其中每一个结点包括数据域和指针域。值得注意的是,与顺序表不同,链表中…

手写spring简易版本,让你更好理解spring源码

首先我们要模拟spring,先搞配置文件,并配置bean 创建我们需要的类,beandefito,这个类是用来装解析后的bean,主要三个字段,id,class,scop,对应xml配置的属性 package org…

安科瑞邀您走进2024北京电气设计第44届年会

2024年7月11日,2024建筑电气高峰论坛暨北京电气设计第44届年会在京如期而至,各路精英齐聚一堂,围绕智慧建筑、数据中心、工业厂房配电、储能技术等热点问题展开讨论。安科瑞携企业微电网智慧能源的一站式服务解决方案亮相盛会,尽享…

ssh出现Permission denied(publickey,gssapi-keyex,gssapi-with-mic).

目录 1.报错如下 ​编辑2.编辑sshd配置文件 ​编辑3.解决报错 🌐 无论你是初学者还是经验丰富的专家,都能在这里找到志同道合的朋友,一起进步,共同探索运维领域的各种挑战和机遇。 1.报错如下 2.编辑sshd配置文件 vim /etc/ss…

【安全规范】软件开发安全设计指南(Word文档)

2.1.应用系统架构安全设计要求 2.2.应用系统软件功能安全设计要求 2.3.应用系统存储安全设计要求 2.4.应用系统通讯安全设计要求 2.5.应用系统数据库安全设计要求 2.6.应用系统数据安全设计要求 软件全套精华资料包清单部分文件列表: 工作安排任务书,可行…

PEFT LoRA 介绍(LoRA微调使用的参数及方法)

一 PEFT LoRA 介绍 官网简介如下图: 翻译过来是:低秩自适应(LoRA)是一种PEFT方法,它将一个大矩阵在注意层分解成两个较小的低秩矩阵。这大大减少了需要微调的参数数量。 说的只是针对注意力层,其实我自己平时微调操作注意力层多…