STM32学习笔记-GPIO

参考江科大32单片机学习相关知识

GPIO基本构造

在这里插入图片描述

APB2(Advanced Peripheral Bus 2)是STM32微控制器架构中的一个外设总线,用于连接一些高性能外设,如定时器、USART、ADC和GPIO等。这些外设通常对性能要求较高,需要更快的数据传输速率。相较于APB1,总线频率更高,适合用于需要快速响应的外设。
寄存器高16位用不到,只用低16位

1. 输入模式和输出模式

在这里插入图片描述

在这里插入图片描述

  • 浮动输入:不连接任何电阻,GPIO口在未施加电压时处于不确定状态。适合不需要上拉或下拉的场景。

  • 上拉输入:通过内部电阻将GPIO引脚拉高。当外部信号接地时,GPIO读取为低电平;未接地时读取为高电平。

  • 下拉输入:通过内部电阻将GPIO引脚拉低。当外部信号接到高电压时,GPIO读取为高电平;未接高电压时读取为低电平。
    FT(five tolerance)输入容忍5V

  • 模拟输入:GPIO无效,引脚直接接内部ADC

  • 推挽输出:能在高低电平之间切换,并提供较大的电流驱动能力。适合驱动LED和其他负载。又被称为强推输出模式

  • 开漏输出:只能在低电平时驱动外部设备,而高电平需要外部拉高。适合多路复用或总线系统中的信号线。如I2C

  • 复用开漏输出:在开漏输出模式下,GPIO引脚能够通过内部开关连接到地(GND),但不能主动驱动高电平。高电平状态需要外部上拉电阻来实现。当GPIO引脚被设置为低电平时,开关闭合,信号被拉低。当引脚被设置为高电平时,开关断开,信号线处于高阻抗状态,此时需要外部上拉电阻将信号拉高,注意,此时没有驱动能力。

  • 复用推挽输出:在推挽输出模式下,GPIO引脚能够同时驱动高电平和低电平。它通过两个开关(一个连接到电源,一个连接到地)实现输出。工作原理:当GPIO引脚被设置为高电平时,连接到电源的开关闭合,信号被拉高。当引脚被设置为低电平时,连接到地的开关闭合,信号被拉低。

3. 配置方法

在STM32中,配置输入输出模式通常通过设置MODER寄存器实现。每两个比特位表示一个引脚的模式。
在STM32微控制器中,GPIO口的寄存器用于配置和控制引脚的行为。每个GPIO端口都有一组特定的寄存器,主要包括以下几类:

1. MODER(模式寄存器)

  • 功能:配置每个GPIO引脚的工作模式。
  • 位域:每两个比特位对应一个引脚的模式设置。
    • 00: 输入模式
    • 01: 输出模式
    • 10: 复用模式
    • 11: 模拟模式

2. OTYPER(输出类型寄存器)

  • 功能:设置引脚的输出类型。
  • 位域
    • 0: 推挽输出
    • 1: 开漏输出

3. OSPEEDR(输出速度寄存器)

  • 功能:配置引脚的输出速度。
  • 位域:每两个比特位对应一个引脚的速度设置。
    • 00: 低速
    • 01: 中速
    • 10: 高速
    • 11: 极高速

4. PUPDR(上拉下拉寄存器)

  • 功能:配置引脚的上拉或下拉电阻。
  • 位域
    • 00: 无上拉/下拉
    • 01: 上拉
    • 10: 下拉
    • 11: 保持不变

5. IDR(输入数据寄存器)

  • 功能:读取引脚的输入状态。
  • 位域:每个位对应一个引脚的输入状态,1表示高电平,0表示低电平。

6. ODR(输出数据寄存器)

  • 功能:控制输出引脚的电平。
  • 位域:每个位对应一个引脚的输出状态,设置为1则输出高电平,0则输出低电平。

7. BSRR(位设定/重置寄存器)

  • 功能:快速设置或重置引脚的输出状态。
  • 位域:高16位用于设置引脚为高电平,低16位用于设置引脚为低电平。

8. LCKR(锁定寄存器)

  • 功能:锁定GPIO引脚的配置,防止在运行时被意外修改。
  • 操作:通过写入特定序列来锁定或解锁引脚配置。

9. AFR(替代功能寄存器)

  • 功能:配置引脚的替代功能(复用功能)。
  • 位域:每个引脚的复用功能由4位表示,可以选择多种外设功能(如UART、SPI等)。

10. 注意事项

  • 时钟使能:在配置GPIO寄存器之前,需确保对应GPIO端口的时钟已使能。
  • 寄存器操作:直接操作寄存器时,应注意位域的清除与设置,以避免影响其他引脚配置。
  • 复用设置:在复用模式下,需要仔细设置替代功能寄存器,确保外设能够正常工作。

LED

以下是GPIO输入模式的简单示例,假设连接一个按钮:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"int main(void)
{/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟,使用各个外设前必须开启时钟,否则对外设的操作无效。APB2PeriphClockCmd:这个函数用于使能或禁用 APB2 外设的时钟/*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的初始化/*主循环,循环体内的代码会一直循环执行*/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}
}

1.RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

是一行用于开启 STM32 微控制器中 GPIOA 时钟的代码。RCC:时钟控制器(Reset and Clock Control),负责管理系统中的时钟和复位。
APB2PeriphClockCmd:这个函数用于使能或禁用 APB2 外设的时钟。APB2 是高级外设总线,用于连接某些外设(如 GPIO、USART 等)

2. GPIO_InitTypeDef

GPIO_InitTypeDef GPIO_InitStructure; 是一行用于定义一个结构体变量的代码,这个结构体用于配置 GPIO 引脚的参数。这个结构体包含多个字段,用于设置 GPIO 的工作模式、引脚、速度等参数。

  • GPIO_Pin:用于指定要配置的 GPIO 引脚。例如,GPIO_Pin_0 表示第 0 号引脚(PA0)。
  • GPIO_Mode:用于设置 GPIO 的工作模式,比如输入、输出、复用或模拟模式。
  • GPIO_Speed:用于配置引脚的速度,比如 2 MHz、50 MHz 或 100 MHz。
  • GPIO_OType:设置引脚的输出类型,可以选择推挽输出或开漏输出。
  • GPIO_PuPd:配置引脚的上拉/下拉电阻,选择上拉、下拉或无上拉/下拉。

3.GPIO_Init(GPIOA, &GPIO_InitStructure);

函数:GPIO_Init 是 STM32 标准外设库中提供的函数,用于根据指定的参数配置 GPIO 引脚。这个函数会根据传入的结构体变量设置相应的寄存器。

4.GPIO设置

  • void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//功能:将指定的 GPIOx 引脚GPIO_Pin设置为高电平
  • void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//功能:将指定的 GPIOx 引脚GPIO_Pin设置为低电平
  • void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);//根据给定的值BitVal(要写入的值,使用 Bit_SET 或 Bit_RESET)设置指定的 GPIO 引脚GPIO_Pin。。
  • void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);//将一个 16 位的值写入指定的 GPIOx端口的所有引脚。值的每一位对应 GPIO 端口的每一个引脚,1 表示高电平,0 表示低电平。

LED闪烁

闪烁还是挺简单的,江科大连延时函数也不讲,直接调用,还是非常容易的思路。

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

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

相关文章

java陕西民俗网源码(springboot)

项目简介 陕西民俗网实现了以下功能: 中国陕西民俗网的主要使用者分为: 管理员增删改查商品信息和商品信息资料,审核商品信息预订订单,查看订单评价和评分,通过留言功能回复用户提问。 💕💕作…

【python】OpenCV—WaterShed Algorithm

文章目录 1、功能描述2、代码实现3、完整代码4、效果展示5、涉及到的库函数5.1、cv2.pyrMeanShiftFiltering5.2、cv2.morphologyEx5.3、cv2.distanceTransform5.4、cv2.normalize5.5、cv2.watershed 6、更多例子7、参考 1、功能描述 基于分水岭算法对图片进行分割 分水岭分割…

选择最佳SCRM系统的综合指南

内容概要 在如今竞争激烈的市场中,企业不能仅仅依靠传统的客户管理方式,需要借助现代化的SCRM系统来提升效率和服务水平。SCRM系统,就是“社交客户关系管理”系统,旨在通过社交媒体等渠道与客户进行更深层次的互动。在选择合适的…

学习threejs,导入OBJ格式的模型

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.OBJLoader OBJ模型加…

动态规划 —— 路径问题-下降路径最小和

1. 下降路径最小和 题目链接: 931. 下降路径最小和 - 力扣(LeetCode)https://leetcode.cn/problems/minimum-falling-path-sum/description/ 2. 算法原理 状态表示:以莫一个位置位置为结尾 dp[i,j]表示:到…

ubuntu20.04 加固方案-设置限制su命令用户组

一、编辑/etc/pam.d/su配置文件 打开终端。 使用文本编辑器(如vim)编辑/etc/pam.d/su文件。 vim /etc/pam.d/su 二、添加配置参数 在打开的配置文件的中,添加以下参数: auth required pam_wheel.so 创建 wheel 组 并添加用户 …

ElementUI学习笔记

一、ElementUI概述 官网:https://element.eleme.cn/#/zh-CN (一)定义 Element,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库。是基于Vue的一个UI框架,该框架基于Vue开发了很多相关组件&#xf…

JS面试八股文(四)

😊JS面试八股文(四) 31.精灵图和base64的区别是什么?32.svg格式了解多少?33.了解过JWT吗?34.npm的底层环境是什么?35.HTTP协议规定的协议头和请求头有什么?36.说一下浏览器的缓存策略…

Android平台RTSP|RTMP播放器高效率如何回调YUV或RGB数据?

技术背景 我们在做Android平台RTSP、RTMP播放器的时候,经常遇到这样的技术诉求,开发者希望拿到播放器解码后的YUV或RGB数据,投递给视觉算法,做AI分析,本文以ffmpeg和大牛直播SDK的SmartPlayer为例,介绍下相…

深度学习常见面试题及答案(41~45)

关注公众号:『AI学习星球』 算法学习、4对1辅导、论文辅导或核心期刊可以通过公众号或➕v:codebiubiubiu滴滴我 文章目录 41、解释一下神经网络中的激活函数的作用是什么?常见的激活函数有哪些?一、激活函数的作用二、常见的激活…

Ethernet 系列(5)-- 物理层测试::PMA Test::MDI

车载以太网物理层PMA (Physical Media Attachment--物理媒质接入层)主要评估车载以太网的电气特性,针对PMA测试方面,OPEN联盟于2014年6月发布“ BroadR-Reach Physical Layer Transceiver Specification For Automotive Applicati…

史上最清晰的uniap安卓ios热更新,附带每一步截图,亲测可用

uniap安卓ios热更新 插件市场导入到你的项目里1新建项目如图2关联服务空间项目3然后运行起来,将代码上传到托管中心4 新建一个应用项目5 发版测试 官方文档,我是看了几遍没看懂 自己弄一遍回头来看终于懂了,若果对你有用,点个赞就…

Vue生成名片二维码带logo并支持下载

一、需求 生成一张名片,名片上有用户信息以及二维码,名片支持下载功能(背景样式可更换,忽略本文章样图样式)。 二、参考文章 这不是我自己找官网自己摸索出来的,是借鉴各位前辈的,学以致用&am…

零基础学西班牙语,柯桥专业小语种培训泓畅学校

No te comas el coco, seguro que te ha salido bien la entrevista. Ya te llamarn. 别瞎想了!我保证你的面试很顺利。他们会给你打电话的。 这里的椰子是"头"的比喻。在西班牙的口语中,我们也可以听到其他同义表达,比如&#x…

【Python各个击破】numpy

简介 NumPy是一个开源的Python库,它提供了一个强大的N维数组对象和许多用于操作这些数组的函数。它是大多数Python科学计算的基础,包括Pandas、SciPy和scikit-learn等库都建立在NumPy之上。 安装 !pip install numpy导入 import numpy as np用法 # …

一文详细讲解进销存系统(附架构图、流程、功能介绍)

企业经营的七大要素是“人、财、物、产、供、销、存”,进销存管理就占到了其中的多项。然而,许多企业在进销存管理方面面临着诸多痛点问题,例如库存管理混乱、采购销售流程不清晰、数据不准确等。这些问题不仅影响企业的运营效率,…

Error in eval(family$initialize): y值必需满足0 <= y <= 1解决

今天在使用R语言对Weekly进行交叉验证时&#xff0c;发生如下报错&#xff1a; 错误于eval(family$initialize): y值必需满足0 < y < 1 错误代码为&#xff1a; Weekly<-read.csv("Weekly.csv") set.seed(1) attach(Weekly) glm.fit1 glm(Direction~Lag…

[论文阅读] Improved Baselines with Visual Instruction Tuning

启发&#xff1a; 1、LLaVA-1.5和LLaVA以及其他大模型相比&#xff0c;做出了哪些改进&#xff1f; &#xff08;1&#xff09;使用CLIP-ViT-L-336px作为视觉编码器&#xff0c;使模型能处理336px的高分辨率图像&#xff0c;这使得模型能从图像中提取出更多细节信息。此外&am…

微积分复习笔记 Calculus Volume 1 - 4.2 Linear Approximations and Differentials

4.2 Linear Approximations and Differentials - Calculus Volume 1 | OpenStax

万圣夜,Codigger

在这个神秘的万圣节&#xff0c;让Codigger&#xff0c;一个专业的分布式操作系统&#xff0c;带领你踏入未知的编程世界&#xff01;就像变装成各种角色一样&#xff0c;Codigger也以其独特的能力和技巧&#xff0c;在数字世界中展现无穷魅力。让我们一起在这个神秘的节日里&a…