STM32二刷学习笔记--GPIO

文章目录

    • GPIO使用详解
      • GPIO基本结构
      • GPIO工作模式
      • 简单示例
        • 推挽输出LED闪烁
        • 按键控制LED闪烁
        • **LED控制函数**
        • **按键控制函数**

GPIO使用详解

在STM32开发中,GPIO(通用输入输出)是与外设接口的基础模块。通过GPIO,我们可以连接各种外部设备,如LED、按键、传感器等。

GPIO基本结构

在这里插入图片描述
第一次看这幅图的时候琢磨了很久,难搞的要死,极度劝退. 实际上,不要全看, 只要看一条条通道即可. 然后逐渐删除即可GPIO的基本结构包括输入输出电路、上拉/下拉电阻以及一些保护电路。

  1. 保护二极管:用于防止电压过高或过低时对GPIO引脚造成损坏。
  2. 上拉/下拉电阻:用于确保输入引脚在没有外部信号时能保持稳定电平。上拉电阻将输入引脚拉高,而下拉电阻则将输入引脚拉低。
  3. 输入缓冲器:将引脚的电压信号转化为数字信号,防止电压不稳定。
  4. 输出控制(MOSFET):控制输出引脚的电平,通过P-MOS和N-MOS来实现高电平或低电平输出。

GPIO工作模式

GPIO可以配置为多种工作模式,每种模式都有不同的应用场景。以下是常见的GPIO模式:
在这里插入图片描述
输入咱们只看上一条路,二极管限压不用管,触发器就是防止电压抖动,不用管,就剩下个写入数据寄存器控制输入,只有一条线是不是很简单.两个上下拉电阻用来控制模式,两个电阻都不连浮空输入引脚悬空,则电平不确定;内部连接上拉电阻,悬空时默认高电平;内部连接下拉电阻,悬空时默认低电平 .没了
输出也很简单,直接一路输出,两个寄存器都可以使用.

模式名称性质特征
浮空输入数字输入输入引脚没有外部连接,电平不确定,易受噪声影响。
上拉输入数字输入引脚通过上拉电阻连接至VDD,输入为高电平。
下拉输入数字输入引脚通过下拉电阻连接至VSS,输入为低电平。
模拟输入模拟输入输入信号通过内部ADC进行转换,常用于传感器数据读取。
开漏输出数字输出输出为低电平时连接VSS,高电平时为高阻态,常用于I2C等通信。
推挽输出数字输出输出高电平时连接VDD,低电平时连接VSS,适合驱动LED等。
复用开漏输出数字输出外设控制的开漏输出,通常用于多设备通信,如I2C。
复用推挽输出数字输出外设控制的推挽输出,适用于高速和大电流输出。

简单示例

库函数本质上就是不断调用函数,先开启时钟,设置GPIO各种模式,调用输入输出模式

推挽输出LED闪烁

下面是一个简单的LED闪烁程序,它将GPIO引脚配置为推挽输出模式,使得LED每隔200ms闪烁一次。

#include "stm32f10x.h"                  // 设备头文件
#include "Delay.h"    int main(void)
{/* 开启时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  // 开启GPIOA时钟/* GPIO初始化 */GPIO_InitTypeDef GPIO_InitStructure;  // 定义结构体变量GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  // 配置为推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;         // 配置为引脚0GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置为50MHz速度GPIO_Init(GPIOA, &GPIO_InitStructure);            // 初始化GPIOA/* 设置GPIO引脚的高低电平 */while (1){Delay_ms(200);GPIO_SetBits(GPIOA, GPIO_Pin_0);   // 设置为高电平Delay_ms(200);GPIO_ResetBits(GPIOA, GPIO_Pin_0); // 设置为低电平}
}
按键控制LED闪烁

以下代码演示了按键控制LED的闪烁功能。按键按下时,LED灯会开始闪烁。

#include "stm32f10x.h"                  // 设备头文件
#include "Delay.h" 
#include "led.h" 
#include "light.h" uint8_t LightNum;
int main(void)
{LED_Init();LIGHT_Init();while (1){LightNum = LIGHT_GetNum();  // 获取按键状态if (LightNum == 1){LED1_Turn();  // 按键按下,切换LED状态}}
}
LED控制函数
# include "stm32f10x.h"void LED_Init(void)
{/* 开启时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  // 开启GPIOA时钟/* GPIO初始化 */GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   // 配置为推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);  // 初始化GPIOA
}void LED1_On(void)
{GPIO_ResetBits(GPIOA, GPIO_Pin_2);  // 关闭LED
}void LED1_Off(void)
{GPIO_SetBits(GPIOA, GPIO_Pin_2);    // 打开LED
}void LED1_Turn(void)
{if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2) == 0){GPIO_SetBits(GPIOA, GPIO_Pin_2);  // 打开LED}else{GPIO_ResetBits(GPIOA, GPIO_Pin_2);  // 关闭LED}
}
按键控制函数
# include "stm32f10x.h"
# include "Delay.h"void KEY_Init(void)
{/* 开启时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  // 开启GPIOB时钟/* GPIO初始化 */GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  // 配置为上拉输入模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);  // 初始化GPIOB
}uint8_t KEY_GetNum(void)
{uint8_t KeyNum = 0;  // 默认键码为0if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0)  // 检测按键是否按下{Delay_ms(20);  // 延时消抖while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);  // 等待按键松开Delay_ms(20);  // 延时消抖KeyNum = 1;  // 设置按键码}return KeyNum;
}

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

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

相关文章

ECharts柱状图-柱图38,附视频讲解与代码下载

引言: 在数据可视化的世界里,ECharts凭借其丰富的图表类型和强大的配置能力,成为了众多开发者的首选。今天,我将带大家一起实现一个柱状图图表,通过该图表我们可以直观地展示和分析数据。此外,我还将提供…

WPF ControlTemplate 控件模板

区别于 DataTemplate 数据模板,ControlTemplate 是控件模板,是为自定义控件的 Template 属性服务的,Template 属性类型就是 ControlTemplate。 演示, 自定义一个控件 MyControl,包含一个字符串类型的依赖属性。 pub…

Pytest-Bdd vs Behave:选择最适合的 Python BDD 框架

Pytest-Bdd vs Behave:选择最适合的 Python BDD 框架 Pytest BDD vs Behave:选择最适合的 Python BDD 框架BDD 介绍Python BDD 框架列表Python BehavePytest BDDPytest BDD vs Behave:关键区别Pytest BDD vs Behave:最佳应用场景结…

FPGA-PS端编程1:

目标 在小梅哥的zynq 7015上,完成以下目标: 读取 S1 按键的电平, 当 S1 按键为按下状态时,驱动 PS LED 以 1S 的频率闪烁(注意理解 1S 的频率闪烁和 1S的时间翻转两种描述之间的差别), 当 S1 释放后,停止…

【Linux学习】十五、Linux/CentOS 7 用户和组管理

文章目录 一、组的管理1.组的创建格式:参数: 2.组的删除格式:参数: 3.组的属性修改格式:参数: 4.查看组的信息①cat /etc/group 命令②getent group 命令③仅显示系统中所有组名 二、用户的管理①超级用户&…

一个开源的自托管虚拟浏览器项目,支持在安全、私密的环境中使用浏览器

大家好,今天给大家分享一个开源的自托管虚拟浏览器项目Neko,旨在利用 WebRTC 技术在 Docker 容器中运行虚拟浏览器,为用户提供安全、私密且多功能的浏览体验。 项目介绍 Neko利用 WebRTC 技术在 Docker 容器中运行虚拟浏览器,提供…

JAVA没有搞头了吗?

前言 今年的Java程序员群体似乎承受着前所未有的焦虑。投递简历无人问津,难得的面试机会也难以把握,即便成功入职,也往往难以长久。于是,不少程序员感叹:互联网的寒冬似乎又一次卷土重来,环境如此恶劣&…

asp.net repeater嵌套

OnItemCreated方式 <%-- 一级Repeater绑定班级信息 --%><asp:Repeater ID"rptClassInfo" runat"server" OnItemCreated"rptClassInfo_ItemCreated"><ItemTemplate><div class"classInfo"><h3><%# Ev…

SpringBoot 开启热部署 项目热启动 一键调试无需 无需重启

依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope> <!-- 只在开发环境下使用 --> </dependency>Idea设置 设置完后&#xff0c;修…

小程序快速实现大模型聊天机器人

需求分析&#xff1a; 基于大模型&#xff0c;打造一个聊天机器人&#xff1b;使用开放API快速搭建&#xff0c;例如&#xff1a;讯飞星火&#xff1b;先实现UI展示&#xff0c;在接入API。 最终实现效果如下&#xff1a; 一.聊天机器人UI部分 1. 创建微信小程序&#xff0c…

MySQL笔记--多表查询

1--多表关系 多表关系基本上分为三种&#xff1a; 一对多&#xff08;多对一&#xff09;&#xff1b; 多对多&#xff1b; 一对一&#xff1b; 1-1--多对一 在多的一方建立外键&#xff0c;指向一的一方的主键&#xff1b; 1-2--多对多 建立第三张中间表&#xff0c;中间表至少…

【多模态】MiniCPM-V多模态大模型使用学习

MiniCPM-V模型使用 前言1. 模型文件下载和选择2. 环境安装配置3. 模型微调3.1 qlora微调minicpm-v-int43.2 lora微调minicpm-v3.3 merge_lora3.4 lora微调后量化int4 4. 模型推理4.1 huggingface API4.2 swift API(A) swift&#xff08;不支持batch inference&#xff09;(B) s…

C#多线程系列章节五

线程创建的几种写法 thread类 threadpool 线程池 task类 Thread t = new Thread(func); t.Start();//线程开始执行threadPool.QueueUserWorkItem(test)创建var t1 = new Task(() => test(“Task 1”));t.start();Task.Run(() => test(“Task 2”));Task.Factory.StartNew…

clickhouse-介绍、安装、数据类型、sql

1、介绍 ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库&#xff08;DBMS&#xff09;&#xff0c;使用C语言编写&#xff0c;主要用于在线分析处理查询&#xff08;OLAP&#xff09;&#xff0c;能够使用SQL查询实时生成分析数据报告。 OLAP&#xff08;On-Line A…

Audition 2025 for Mac Au音频编辑软件

Mac分享吧 文章目录 Audition 2025 for Mac Au音频编辑软件 效果图展示一、Audition 2025 Au音频编辑软件 Mac电脑版——v25.0⚠️注意事项&#xff1a;1️⃣&#xff1a;下载软件2️⃣&#xff1a;安装软件2.1 安装AntiCC_5.9_简化版&#xff0c;操作步骤如下&#xff1a;2.2…

JAVA题目笔记(二十五)网络编程综合小练qa!3EF TG6U8.L;

一、多发多收 客户端&#xff1a; import java.io.*; import java.net.Socket; import java.util.Scanner;public class Test1_2 {public static void main(String[] args) throws IOException {//TCP发送端Scanner scnew Scanner(System.in);String b;//创建Socket对象Socket…

决策树的生成与剪枝

决策树的生成与剪枝 决策树的生成生成决策树的过程决策树的生成算法 决策树的剪枝决策树的损失函数决策树的剪枝算法 代码 决策树的生成 生成决策树的过程 为了方便分析描述&#xff0c;我们对上节课中的训练样本进行编号&#xff0c;每个样本加一个ID值&#xff0c;如图所示…

基于SpringBoot的疫苗在线预约功能实现十二

一、前言介绍&#xff1a; 1.1 项目摘要 随着全球公共卫生事件的频发&#xff0c;如新冠疫情的爆发&#xff0c;疫苗成为了预防和控制传染病的重要手段。传统的疫苗预约方式&#xff0c;如人工挂号或电话预约&#xff0c;存在效率低、易出错、手续繁琐等问题&#xff0c;无法…

MySQL基础 -----MySQL数据类型

目录 INT类型 tinyint类型 类型大小范围 测试tinyint类型数据 float类型 测试&#xff1a; 测试正常数据范围的数据 测试插入范围超过临界值的数据&#xff1a; 测试float类型的四舍五入 ​编辑 decimal类型 同样测试&#xff1a; 字符串类型 char类型 测试&…

代码开发相关操作

使用Vue项目管理器创建项目&#xff1a;&#xff08;vue脚手架安装一次就可以全局使用&#xff09; windowR打开命令窗口&#xff0c;输入vue ui&#xff0c;进入GUI页面&#xff0c;点击创建-> 设置项目名称&#xff0c;在初始化git下面输入&#xff1a;init project&…