GPIO

news/2025/3/1 4:38:20/文章来源:https://www.cnblogs.com/yangyang13/p/18670797

GPIO

1. 基本定义和概念

IO复用:同一个IO引脚具备多个不同的功能;

IO重映射:当出现功能引脚冲突时,讲功能移动到到备用引脚上;

通用和复用的区别:通用表示直接控制,复用表示其他功能模块托管(片上外设)使用;

通用输入输出(GPIO,General Purpose Input/Output): 具有八种各种模式。分别是:

(1)输入浮空(Input floating)

(2)输入上拉(Input pull-up)

(3)输入下拉(Input-pull-down)

(4)模拟输入(Analog)

(5)通用开漏输出(Output open-drain)

(6)通用推挽式输出(Output push-pull)

(7)推挽式复用功能(Alternate function push-pull)

(8)开漏复用功能(Alternate function open-drain)

输出模式下:控制端口输出高低电平,用于驱动LED,蜂鸣器等,大功率器件借助驱动芯片间接控制。

输入模式下:读取端口的高低电平,用于读取按键,外接模拟信号的输入,ADC电压采集,模拟通信协议接收数据等。

IO输出最大速度:电压上升和下降的时间限制了IO的输出速度(极限状态下电平稳定时间太短)。考虑到低功耗,实际使用通常取满足要求最小通信速度。限制电压在VSS~VDD范围内。

Snipaste_2025-01-11_15-21-01

GPIO每位的具体电路结构:

图片1

2.开漏输出和推挽输出

2.1 推挽输出和开漏输出的区别

一句话概括:推挽支持高低电平输出,开漏仅有低电平外加高阻态。同时开漏模式的上方的P-MOS始终关闭

Snipaste_2025-01-11_15-14-38

补充:https://www.cnblogs.com/yangyang13/p/18060487

如何控制P-MOS与N-MOS见随笔:

2.2 推挽输出和开漏输出的选择

使用推挽输出:

  1. 驱动能力要求较高;
  2. 高信号传输;
  3. 不需要共用信号线(如果有设备输出0,有设备输出1就会形成短路);

使用开漏输出:

  1. 多个设备共用信号线,线与;
  2. 不同电压系统之间的接口(通过上拉电阻改变电平);
  3. 需要外部上拉电阻来确定逻辑高电平;

2.3 输入上拉、输入下拉和输入浮空的区别

一句话概括:当引脚浮空时,上拉电阻提供默认高电压,下拉电阻提供默认低电压。浮空则处于不确定状态。

image-20250111162349375

3 输入模式

3.1保护二极管的作用

当I/O引脚电压大于VDD时,如上图位于I/O引脚与VDD之间形成导通,同理,当电压低于VSS时,下二极管导通,形成钳位。

image-20250113145507530

3.2 输入是如何判断高低电平的

通过施密特触发器(图中的肖特基是翻译错误)对信号进行波形整形,然后输入数据寄存器中。

image-20250113150222873

补充:模拟输入时关闭施密特触发器,信号直接输入到片上外设。

4. GPIO寄存器

每个GPIO端口有7个相关的寄存器:

  1. 2个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),可读可写,Port Configuration Register Low/High,端口配置低/高寄存器, 用于控制IO端口输入输出模式,CRL控制低八位引脚,CRH控制高八位引脚,每位引脚由MODE和CNF控制,共4bit位。其中MODE控制是输出还是输入以及工作速度,CNF控制是否上下拉或浮空及模拟输入。

  2. 2个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),输入只能读,输出可读可写,Port Input/Output Data Register,端口输入/输出寄存器, 控制IO端口具体输入和输出的值(0/1)。均只有低16位使用,高16位保留。

  3. 1个32位置位/复位寄存器(GPIOx_BSRR),只能写,Port bit set/reset register, 端口位设置/清除寄存器,可以设置ODR具体某位的值,低16位从0~15,置1时设置0~15端口输出1,高16位从16~32,置1时设置0~15端口输出0。

  4. 1个16位复位寄存器(GPIOx_BRR),只能写,端口位清除寄存器,可以将ODR具体某位的值复位为0,只有低16位使用,高16位保留。

  5. 1个32位锁定寄存器(GPIOx_LCKR),可读可写,端口配置锁定寄存器,可以锁定寄存器的工作模式让其不被修改。使用方法比较特殊如下图
    image-20250114145552901

I/O端口位的基本结构(辅助理解寄存器功能):
image-20250114142136684

5. 实践验证

5.1 寄存器形式

实现逻辑:

​ 查找对应寄存器地址,改变其值到对应模式。以GPIOA_Pin_0为例,

  1. 配置时钟

    在存储映像的寄存器组起始地址进行查询
    image-20250114094647517

    查询可以看到,IO外设是位于APB2总线上,APB2ENR地址偏移量是0x18

    image-20250114095337512

    image-20250114100457471

    所以 APB2ENR地址为:0x4002 1000 + 0x18 ,因为GPIOA位于第二位,所以启动GPIOA时钟代码为: *(uint32_t *)(0x40021000 + 0x18) = 4;

  2. 配置IO输出模式寄存器

    查询对应寄存器组基地址

    image-20250114100029610

    查看对应偏移地址和寄存器参数功能

    image-20250114101430411

    image-20250114101030300

    参考上图,配置PA0为通用推挽输出代码为:*(uint32_t *)(0x4001 0800 + 0x00) = 3;

  3. 配置输出寄存器
    image-20250114103113878
    参考上图,配置PA0为输出0代码为:*(uint32_t *)(0x4001 0800 + 0xch) = 0xfffe;

  4. 优化,在"stm32f10x.h"头文件中已经定义了相关寄存器和结构体,可以直接调用。
    如下:

    #define PERIPH_BASE           ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */
    #define AHBPERIPH_BASE        (PERIPH_BASE + 0x20000)
    #define RCC_BASE              (AHBPERIPH_BASE + 0x1000)
    #define RCC                 ((RCC_TypeDef *) RCC_BASE)
    typedef struct
    {__IO uint32_t CR;__IO uint32_t CFGR;__IO uint32_t CIR;__IO uint32_t APB2RSTR;__IO uint32_t APB1RSTR;__IO uint32_t AHBENR;__IO uint32_t APB2ENR;__IO uint32_t APB1ENR;__IO uint32_t BDCR;__IO uint32_t CSR;#ifdef STM32F10X_CL  __IO uint32_t AHBRSTR;__IO uint32_t CFGR2;
    #endif /* STM32F10X_CL */ #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)   uint32_t RESERVED0;__IO uint32_t CFGR2;
    #endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */ 
    } RCC_TypeDef;	// 结构体内排序与芯片手册寄存器位置偏移量相对应,利用了结构体内地址连续的特点// 代码可优化为
        RCC->APB2ENR = 4;
        GPIOA->CRL = 3;
        GPIOA->ODR = 0xfffe;
    // 位操作优化RCC->APB2ENR |= 0x1 << 2;GPIOA->CRL &= ~(0x1 << 3);
        GPIOA->CRL &= ~(0x1 << 2);
        GPIOA->CRL |= 0x1 << 1;
        GPIOA->CRL |= 0x1 << 0;
        GPIOA->ODR &= ~(0x1 << 0);
    // "stm32f10x.h"头文件中也定义了对应寄存器的控制,再次优化
    #define  RCC_APB2ENR_IOPAEN                  ((uint32_t)0x00000004)         /*!< I/O port A clock enable */
    #define  GPIO_CRL_CNF0_0                     ((uint32_t)0x00000004)        /*!< Bit 0 */
    #define  GPIO_CRL_CNF0_1                     ((uint32_t)0x00000008)        /*!< Bit 1 */
    #define  GPIO_CRL_MODE0_0                    ((uint32_t)0x00000001)        /*!< Bit 0 */
    #define  GPIO_CRL_MODE0_1                    ((uint32_t)0x00000002)        /*!< Bit 1 */// 最终代码
        RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;    GPIOA->CRL &= ~GPIO_CRL_CNF0_1;
        GPIOA->CRL &= ~GPIO_CRL_CNF0_0;
        GPIOA->CRL |= GPIO_CRL_MODE0_1;
        GPIOA->CRL |= GPIO_CRL_MODE0_0;    GPIOA->ODR &= ~GPIO_ODR_ODR0;
    

5.2 库函数形式

实现逻辑:

​ 使用cubeMX配置引脚状态,然后再通过keil在工程中调用Hal库函数实现想要的现象

  1. cubeMX配置关键界面
    image-20250114135517434
  2. 配置完后生成工程,我们可以发现,工程中会自动初始时钟配置和GPIO配置
    image-20250114140835655
  3. 在初始化函数中会配置时钟和GPIO
    image-20250114141017489
  4. 主函数中利用HAL_GPIO_WritePin函数进行IO端口的控制,请对应传入参数入如下值
    image-20250114141155085

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

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

相关文章

“数据飞轮” 理念焕新,助力 2025 企业数智化发展

2024 年,全球科技领域在人工智能浪潮的席卷下加速前行,数字化转型进程也随之踏入全新阶段。在这一背景下,数据飞轮理念延续“以数据消费促资产建设,以数据消费助业务发展”的核心内涵,实现焕新升级。在2025年,升级后的数据飞轮 2.0,将 AI 视作数智化的核心竞争力,借助 …

电桥测量模块24位采样、 带有激励源动态补偿 高精度 适用比例电桥、 固定电桥 可选恒压驱动、 恒流驱动

电桥测量模块24位采样、 带有激励源动态补偿 高精度 适用比例电桥、 固定电桥 可选恒压驱动、 恒流驱动BRGxxx系列模块是一款专为惠斯通电桥测量而设计的高分辨率产品。采用24位ADC同步测量激励源与电桥输出,可提供1~128倍放大增益。该模块支持恒压和恒流两种驱动方案,适用于…

【每日一题】20250114

人经常推翻自己,经常不同意昨天的自己,这也是常态。【每日一题】 1.(18分) \(\hspace{0.7cm}\)I. 为了测量某一弹簧的劲度系数,将该弹簧竖直悬挂起来,在自由端挂上不同质量的砝码.实验测出了砝码质量 \(m\) 与弹簧长度 \(l\) 的相应数据,其对应点已在图上标出.(\(g=9…

新合新公有云环境下载客户端和BOS

公有云下载BOS直接是云IDEBOS和客户端的组件都进行了更新,但是版本号没有变化,应该是修复了bug,融合了临时补丁。 客户端

用于决策的世界模型 -- 论文 World Models (2018) PlaNet (2019) 讲解

介绍了两篇世界模型的文章 World Models (2018) 和 Learning Latent Dynamics for Planning from Pixels (2019),主要侧重点是世界模型在决策和规划中的应用。参考资料:[2411.14499] Understanding World or Predicting Future? A Comprehensive Survey of World Models [18…

AI驱动的CMS:从内容创作到推荐,智能化的变革

一、AI与CMS的结合:为什么是未来内容管理的趋势?CMS的传统局限性传统CMS为网站和企业提供了一个结构化的平台,帮助组织发布和管理内容。然而,传统的CMS系统依赖于人工的内容创作、发布、更新和优化,往往存在以下问题: 内容过度依赖人工:内容创作需要大量人工输入,难以实…

使用Nexus搭建Docker仓库

一、背景 Nexus之前已支持了nuget,由于docker仓库和前面几个存在比较大的差异,所以我特此记录下走过的坑。希望能对后来者有所帮助~~(当然,docker私有仓库,大多数是推荐使用harbor,因为我这里的某些历史原因,就沿用nexus) 二、建立仓库依次建立代理仓库、私有仓库、组合…

KuboardSpray v1.2.4 在 Rocky Linux 9.5 上部署 K8s 失败报错“当前资源包不支持此操作系统: Rocky 9.5”的解决办法

KuboardSpray报错日志截图进入 KuboardSpray 的docker容器实例里的当前用户目录下,再用 find . -name "*.yaml"|xargs -i grep -iHn "distribution: Rocky" {} 查找声明 RockyLinux 系统版本的地方,如下图解决办法: 只需对上图中红框处的3个配置文件进…

产品经理如何通过AI管理引领智能未来的浪潮?

在人工智能(AI)技术飞速发展的今天,产品经理的角色正经历着深刻的变革。AI不仅改变了产品开发的方式,还为产品经理提供了前所未有的工具和方法来优化产品管理流程、提升用户体验并推动业务增长。本文将探讨产品经理如何通过AI管理引领智能未来的浪潮,分享实用的策略和案例…

CANFD总线协议

1.帧起始与经典CAN类似,CAN FD数据帧的第1位也是“SOF(Start Of Frame,帧起始)”,显性电平(逻辑0) 2.仲裁域与经典CAN类似,不过将“RTR”位替换为“RRS”位。RRS是英文“Remote Request Substitution(远程请求替换)”的缩写,该位替代了远程帧请求位,并且在CAN FD中…

Chrome浏览器Selenium编程常见异常与解决方案

Selenium程序正常运行的前提是,代码能够找到浏览器,并且能够找到对应版本的驱动文件。 第一种异常表现:代码找不到ChromeDriver.exe 提示ChromeDriver.exe does not exists 第二种异常表现:浏览器与驱动文件版本不兼容 提示session not created 解决方法1: 首先下载与浏…

IDA pro 定位关键代码技巧

第一种方法:搜索特征字符串 首先按下快捷键CTRLS+S打开段选择对话框,双击STRINGS段跳转到字符串段,然后点击菜单项“Search→text”,或者按下快捷键ALT+T,打开文本搜索对话框,在String旁边的文本框中输入要搜索的字符串后点击OK按钮,稍等片刻就会定位到搜索结果。第二种…