• STM32:GPIO功能描述和工作方式


    一、STM32控制原理概要

    IO端口位的基本结构

    在STM32有特定功能的内存单元,即"寄存器"。寄存器是程序与硬件电路通信的桥梁。寄存器按照每32位二进制0/1数据为一组。存储着芯片特定电路的相关信息。我们就是通过程序对寄存器中的数据进行修改,可以改变某个电路的开关或者读写。控制单片机就是在控制寄存器

    例如把PA7设置为高电平时,调用

    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SEt)

    函数实际上就是对BSRR寄存器的第七个bit位设置成1.

    1. void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
    2. {
    3. /* Check the parameters */
    4. assert_param(IS_GPIO_PIN(GPIO_Pin));
    5. assert_param(IS_GPIO_PIN_ACTION(PinState));
    6. if (PinState != GPIO_PIN_RESET)
    7. {
    8. GPIOx->BSRR = GPIO_Pin;
    9. }
    10. else
    11. {
    12. GPIOx->BSRR = (uint32_t)GPIO_Pin << 16u;
    13. }
    14. }
    stm32f1xx_hal_gpio.c 中的HAL_GPIO_WritePin的定义
    每个 GPI/O 端口有两个 32 位配置寄存器 (GPIOx_CRL GPIOx_CRH) ,两个 32 位数据寄存器
    (GPIOx_IDR GPIOx_ODR) ,一个 32 位置位 / 复位寄存器 (GPIOx_BSRR) ,一个 16 位复位寄存
    (GPIOx_BRR) 和一个 32 位锁定寄存器 (GPIOx_LCKR)

    二、输出驱动器模块

    在输出驱动器中,有两个被输出控制模块控制的两个MOS(金氧半场效晶体管),分别时P_MOS和N-MOS。这两个可以简化为两个建议开关。 VDD提供3.3V的高电平,VSS提供0V的低电平。

    (1).推挽输出

            假设I/O外连接一个工作电压为3.3V的小灯,小灯另一端接地。那么在推挽输出模式下,P_MOS和N-MOS协同工作.。

    • 当我们写程序控制此IO口输出高电平时,函数内部会对寄存器进行修改,使 P_MOS被激活,N-MOS被关闭,小灯两端形成3.3V电势差,小灯亮起。
    • 当我们写程序控制此IO口输出低电平时,函数内部会对寄存器进行修改,使 P_MOS被关闭,N-MOS被激活,产生的电势差不足,小灯熄灭。

    (2),开漏输出

            假设I/O外连接一个工作电压为5V的小灯,那么推挽输出怎样都无法使小灯亮起。在开楼模式下只有N-MOS工作,P-MOS一直处于断开状态。假设工作电压为5V的小灯在另外一端接入外部的5V的电势,VSS与5V形成电势差,那么小灯变可以亮起。开漏输出可以根据需求自行接入电压,更加灵活。

    • 当我们写程序控制此IO口输出高电平时,函数内部会对寄存器进行修改,P_MOS被关闭,使 N-MOS被关闭,电路形成断路,小灯无法亮起。
    • 当我们写程序控制此IO口输出低电平时,函数内部会对寄存器进行修改,P_MOS被关闭,使 N-MOS被激活,相当于IO口向内部一端有0V电势,另一端电势根据外部电路决定。

    (3).复用推挽输出和开漏输出

    根据电路上显示,输出控制模块实际上有两个控制指令的来源。一个是我们使用HAL_GPIO_WritePin函数控制的输出寄存器。另一个来自于片上外设。比如串口模块,I²C模块等。由于同时控制将会使输出控制模块指令混乱。因此STM32将这两种输出模式由细分为

    • 普通推挽输出
    • 普通开漏输出
    • 复用推挽输出
    • 复用开漏输出

    三、输入驱动器模块

    (1).普通输入模式

    当电流从IO引脚接入时会经过一对上拉加拉电阻

    • 当设置为上拉输入时,上拉电阻启用,VDD与IO引脚相连
    • 当设置为下拉输入时,下拉电阻启用,VSS与IO引脚相连
    • 当设置为浮空输入时,两个电阻都不启用

    (2) TTL肖特基(施密特)触发器

    电流继续往前走就会到达TTL肖特基(施密特)触发器。其作用是稳定电平。因为电流在实际应用中是会有波动的。如果在高低电平阈值附近上下波动,信号就会不断地变化造成不稳定。因此施密特触发器为了解决这个问题,分别设置了高电平阈值和低电平阈值。当处于低电平状态超过高电平阈值时就会变成高电平,当处于高电平时要低于低电平阈值时才会变成低电平。

    最后电流通过施密特触发器便会进入到输入数据寄存器。等待我们用HAL_GPIO_ReadPin函数进行读取。

    (3).模拟输入

    在读出数据这条"主线"电路中有两个分支,分别是模拟输入复用功能输入。模拟输入分支在到施密特触发器前就叉出去了,没有经过高低电平的调整。因此模拟输入接入的是电压的具体数值复用功能输入在片上外设上使用,其他功能和普通输入模式一样,拿到的都是调整后的高低电平。

  • 相关阅读:
    媲美有线操作,支持4KHz响应和无线充电的游戏鼠标,雷柏VT3S上手
    Pytorch中获取模型摘要的3种方法
    Unity SRP 管线【第二讲:Draw Call】
    Jmeter测试计划
    科研宝典·工具篇 | CiteSpace: 科学文献分析
    Redis 学习笔记
    微服务框架
    confluent-kafka-go依赖库编译体验优化
    Docker常见命令学习
    阿里云有奖体验:用PolarDB-X搭建一个高可用系统
  • 原文地址:https://blog.csdn.net/superSmart_Dong/article/details/133958978