NXP RT10xx 系列 MCU 的 IO 引脚默认启用 Keeper(保持器)功能,该功能可在无输入信号时维持引脚电平状态,但在将 IO 用作 ADC 输入时,会导致采样曲线出现明显偏移,影响测量精度。本文详解 Keeper 功能的工作原理、对 ADC 采样的具体影响,以及通过寄存器配置禁用该功能的完整步骤,帮助开发者快速解决采样精度异常问题。
1. Keeper 功能核心原理
1.1 功能定义与作用
Keeper 功能是 RT10xx 系列 IO 引脚的内置电路逻辑,核心作用是 “维持引脚电平稳定性”:
- 当引脚无明确输入信号时,Keeper 会根据当前电平自动切换为上拉或下拉模式;
- 电平判断阈值:以 1/2 VDD_IO 为分界,输入信号>1/2 VDD_IO 时,Keeper 表现为上拉;输入信号<1/2 VDD_IO 时,表现为下拉;
- 控制位:由 IO 控制寄存器中的 PKE(Pull/Keep Enable)位控制,RT10xx 系列默认 PKE=1(Keeper 功能启用);
- 注意:RT11xx 系列无 Keeper 功能,无需考虑该影响。
1.2 硬件逻辑架构
输入信号 → hysteresis(滞回比较器)→ PKE控制位 → Keeper模块 → 引脚电平维持
当 PKE=1 时,Keeper 模块介入;PKE=0 时,Keeper 功能完全禁用,引脚电平仅由外部输入或配置的上拉 / 下拉电阻决定。
2. Keeper 功能对 ADC 采样的影响
2.1 核心问题:采样曲线不连续
当 IO 引脚用作 ADC 输入时,Keeper 功能会引入额外的电平偏移(offset),导致采样数据异常:
- 测试条件:ADC 供电(ADC supply)与参考电压(ADC Vref)均为 3.3V,输入信号从 0V 线性升至 3.3V;
- 异常现象:当输入信号接近 1.65V(1/2 VDD_IO)时,ADC 采样值出现突然跳变,从约 2254 直接升至 2291,后续曲线虽恢复线性,但整体存在固定偏移;
- 本质原因:1.65V 阈值处,Keeper 功能从下拉切换为上拉,额外引入上拉电流,导致 ADC 输入电压被 “拉高”,采样值失真。
2.2 数据对比(示例)
| 输入电压(V) | ADC 采样值(无 Keeper) | ADC 采样值(有 Keeper) | 偏差 |
|---|---|---|---|
| 1.6434 | 2241 | 2241 | 0 |
| 1.6499 | 2250 | 2250 | 0 |
| 1.6531 | 2254 | 2291 | +37 |
| 1.6590 | 2258 | 2297 | +39 |
| 1.6740 | 2275 | 2308 | +33 |
从数据可见,Keeper 功能启用时,阈值附近采样偏差达 30+LSB,严重影响高精度测量场景(如传感器信号采集)。
3. 解决方案:禁用 Keeper 功能(PKE=0)
3.1 关键寄存器配置
Keeper 功能由 IO 引脚的控制寄存器(IOMUXC_SW_PAD_CTL_PAD_XXX)中的 PKE 位控制,具体配置步骤如下:
(1)寄存器位定义
IO 控制寄存器的 bit8 为 PKE 位,相关位功能如下:
| 寄存器位 | 名称 | 功能描述 |
|---|---|---|
| bit8 | PKE | 0 = 禁用 Keeper 功能;1 = 启用 Keeper 功能(默认) |
| bit7 | PUE | 上拉 / 下拉使能(与 Keeper 功能独立) |
| bit6-5 | PUS | 上拉 / 下拉配置(弱上拉、弱下拉等) |
| 其他位 | DSE/SRE/SPEED | 驱动强度、斜率、速率配置(不影响 Keeper) |
(2)配置代码示例(以 GPIO_AD_04 为例)
#include "fsl_iomuxc.h"
void ADC_Pin_Init(void) {
// 1. 配置引脚复用为ADC功能(ALT0模式)
IOMUXC_SetPinMux(
IOMUXC_GPIO_AD_04_ADC1_CH0, // 引脚:GPIO_AD_04 → ADC1_CH0
0U // 软件输入使能:禁用
);
// 2. 配置引脚电气属性:禁用Keeper,按需配置上拉/下拉
IOMUXC_SetPinConfig(
IOMUXC_GPIO_AD_04_ADC1_CH0, // 目标引脚
0x00000000U | // SRE:慢斜率
0x00000000U | // DSE:默认驱动强度
0x00000000U | // SPEED:默认速率
0x00000000U | // PUS:禁用上拉/下拉(根据需求调整)
0x00000000U | // PUE:禁用上拉/下拉使能
0x00000000U // PKE:0=禁用Keeper功能(核心配置)
);
}
(3)直接寄存器操作(无 SDK 场景)
若不使用 SDK,可直接操作寄存器地址(以 GPIO_AD_04 为例):
// GPIO_AD_04的控制寄存器地址:0x20E006C
#define GPIO_AD_04_PAD_CTL_ADDR 0x20E006C
// 配置:禁用Keeper(PKE=0),其他位保持默认
*(volatile uint32_t *)GPIO_AD_04_PAD_CTL_ADDR &= ~(1 << 8);
3.2 配置验证
(1)软件验证
配置完成后,通过 ADC 采样测试输入信号,观察阈值附近曲线是否连续:
- 预期结果:输入信号从 0V 升至 3.3V 时,ADC 采样值线性变化,无突然跳变;
- 偏差范围:采样偏差≤5LSB(正常 ADC 噪声水平)。
(2)硬件验证
使用示波器测量 ADC 输入引脚:
- Keeper 禁用后,阈值附近引脚电平无异常跳变,与外部输入信号完全一致;
- 对比测试:启用 / 禁用 Keeper 功能,观察采样曲线差异,确认配置生效。
4. 关键注意事项
- 仅 RT10xx 系列需配置:RT11xx 系列无 Keeper 功能,无需操作 PKE 位;
- 独立于上拉 / 下拉:PKE 位仅控制 Keeper 功能,上拉 / 下拉由 PUE/PUS 位配置,可根据需求独立启用(如 ADC 输入建议禁用上拉 / 下拉,避免引入额外电流);
- 所有 ADC 引脚均需配置:若多个 IO 引脚用作 ADC 输入,需逐一禁用每个引脚的 Keeper 功能;
- 寄存器地址对应:不同引脚的控制寄存器地址不同,需参考 RT10xx 数据手册(如 IMXRT1050 参考手册)确认目标引脚的寄存器地址。
5. 适用场景与扩展建议
5.1 必须禁用 Keeper 的场景
- 高精度 ADC 测量(如传感器、模拟信号采集);
- 输入信号接近 1/2 VDD_IO 的场景;
- 低功耗测量(Keeper 功能会消耗微小电流)。
5.2 可保留 Keeper 的场景
- 普通 IO 引脚(非 ADC 输入);
- 数字信号输入(如按键、中断引脚),需维持电平稳定性;
- 对采样精度要求较低的场景。
5.3 扩展优化:ADC 采样辅助配置
为进一步提升采样精度,可配合以下配置:
- 启用 ADC 硬件滤波(如平均滤波、滑动窗口滤波);
- 配置 ADC 参考电压为高精度基准源(如外部 REF3033);
- 引脚布线时远离数字信号,避免干扰。
RT10xx 系列的 Keeper 功能虽能提升数字引脚的电平稳定性,但在 ADC 采样场景中会引入阈值偏移,导致采样精度下降。解决该问题的核心是通过寄存器配置将 PKE 位设为 0,禁用 Keeper 功能,该操作简单高效,无需修改硬件。
阅读全文
357