为什么DAC中要将GPIO对应引脚的模式配置为“模拟输入模式”?

本文探讨了GPIO配置为模拟输入模式后引脚属性变化,包括施密特触发器禁用、高阻抗特性及功耗降低。重点解释了模拟输入配置的必要性,以及为何DAC会被设置为模拟输入。还涵盖了DAC毛刺现象的本质和解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

疑难问题

将GPIO配置为模拟输入模式后,GPIO相应引脚属性的变化

当I/O端口被配置为模拟输入配置时:

● 输出缓冲器被禁止;

● 禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置

为’0’;

● 弱上拉和下拉电阻被禁止;

● 读取输入数据寄存器时数值为’0’。

下图示出了I/O端口位的高阻抗模拟输入配置:

为什么将GPIO配置为模拟输入模式?

我们看到模拟输入模式中信号行走的路线上,没有用于“数字信号处理的施密特触发器”和“输入数据寄存器”,并且此时的上下拉电阻已经被关闭。

这个施密特触发器被关闭了,GPIO的数字输入功能被取消。如果此时读取输入数据寄存器的值,结果恒为0。由于关闭了施密特触发器,上面提到的因它而起的电平跳变噪声和相应的额外功耗就没有了。

换句话说,当GPIO状态由浮空或上下拉输入状态改为模拟输入状态时,既消除了因为施密特触发器带来的噪声,同时又因它的关闭而降低了芯片动态功耗。

另外,配置在模拟输入状态的GPIO引脚属于高阻态,这点也有利于保持模拟信号的真实性(说白了,就是信号传输通道无任何信号处理装置,可以将原汁原味的模拟信号在CPU与外设之间进行传输)。

DAC应该是输出模拟信号,但为什么要配置为“模拟输入”?

因为一但使能 DACx 通道之后,相应的 GPIO 引脚(PA4 或者 PA5)会自动与 DAC 的模拟输出相连。其实,模拟输入通道与模拟输出通道是一起的,当我们将我们所需的引脚配置为“GPIO的模拟输入模式”后,系统会根据我们所使能的DAC/ADC外设自动进行通道类型的选择。

DAC的毛刺现象是什么?

DAC转换中毛刺信号产生的本质​​​​​​​

### GPIO模式配置与使用方法 #### 配置GPIO模式的基本流程 为了正确设置和使用GPIO模式,通常需要按照以下逻辑完成初始化过程。首先定义所需的引脚编号以及对应模式参数,随后调用硬件抽象层(HAL)或其他库函数完成实际配置。 以下是基于STM32微控制器的一个典型例子: ```c // 定义GPIO初始化结构体变量 GPIO_InitTypeDef GPIO_InitStruct; // 设置具体的引脚GPIO_InitStruct.Pin = GPIO_PIN_0; // 设定工作模式为推挽输出 (Push-Pull Output Mode) GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 设置最大输出速度为高速 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 调用HAL库中的初始化函数完成配置 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` 上述代码片段展示了如何将`GPIOA`端上的第0号引脚配置为推挽输出模式,并设定其运行速度为高频[^2]。 #### 不同GPIO模式的特点及其应用场景 1. **输入模式** 输入模式允许GPIO接收外部信号并将其传递给处理器内部电路处理。此模式适用于按键检测、传感器数据采集等情况。 - 上拉输入:当未连接到其他设备时,默认状态保持高电平。这种设计有助于防止浮空输入引起误触发[^3]。 ```c GPIO_InitStruct.Pull = GPIO_PULLUP; ``` - 下拉输入:默认状态下维持低电平直到有外力作用改变它为止。 ```c GPIO_InitStruct.Pull = GPIO_PULLDOWN; ``` 2. **输出模式** 输出模式使能GPIO发送电信号至外围组件。依据应用需求可细分为两种主要形式——推挽输出与开漏输出。 - 推挽输出具备较强的高低电平切换能力,在大多数情况下推荐作为首选方案。 - 开漏输出则需额外接入上拉电阻才能正常运作,适合用于多路共享总线环境下的通信协议实施,比如I²C接操作[^5]。 3. **复用功能模式** 当某些特定用途被指定给某个GPIO引脚时(例如定时器PWM通道、USART收发端等),就需要启用复用选项。此时应根据实际情况决定采用标准还是开放集电极版本: - 复用推挽输出适配于常规情况; - 若涉及“线与”逻辑运算或者兼容性考量,则选用复用开漏方式更为合适[^4]。 4. **模拟输入/输出模式** 对于那些支持ADC/DAC转换特性的MCU来说,部分GPIO还可以充当模数转换单元的一部分参与测量活动。此类情形下无需关心数字层面的操作细节,只需简单激活对应的功能区块即可[^1]。 #### 示例程序说明 下面给出一段简单的演示代码用来验证前面提到的部分概念: ```c #include "stm32fxxx_hal.h" int main(void){ __HAL_RCC_GPIOA_CLK_ENABLE(); // 启动GPIOA时钟 /* 初始化GPIO */ GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA,&GPIO_InitStruct); while(1){ HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET); // 将PA5设为高电平 HAL_Delay(500); // 延迟半秒 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);// 将PA5设为低电平 HAL_Delay(500); // 再次延迟相同时间长度 } } ``` 这段源码实现了让开发板LED灯每隔一秒闪烁一次的效果。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥肥胖胖是太阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值