做嵌入式的朋友应该都有过这种经历:拿到一颗新的 STM32,打开 CubeMX 打算快速把外设配好,结果在某个不起眼的下拉框里卡了半小时。我最近就在 F334 上被“比较器输入选择”这个看似简单的配置项绊了一跤。网上搜出来的资料多半是讲比较器原理的,要么就是教你怎么用 HAL 库函数去改寄存器,很少有文章把 CubeMX 界面上那一堆“Input”选项讲清楚。排查了一下午,翻参考手册翻到眼睛发酸,最后才彻底搞明白标题里这个“Comparateor inputs selection”到底在选什么、怎么选才不会被掉坑里。这篇文章就把这些经验完整记录下来。
我这里的标题其实是拼写错误,正确拼写是 Comparator。不过这个错拼倒是阴差阳错地暴露了一个普遍痛点:很多人打开 CubeMX 后,根本不知道 COMP 外设的输入选择是什么意思,更不知道怎么配置才能让比较器真正工作起来。这篇内容主要针对 STM32CubeMX(无论是传统的 2.x 桌面版还是新的 CubeMX 集成环境)中比较器输入选择的相关配置做一次彻底拆解,结合我在 F334 上实际踩过的坑,覆盖输入源分析、引脚复用关系、外部基准连接,以及和 HRTIM 这类高级定时器联动时的注意事项。适合正在用 CubeMX 配置比较器但被输入选择卡住的人,也适合想彻底搞清楚 COMP 外设输入路径的开发者。
1. 比较器输入选择:这个配置项到底在选什么
如果你在 CubeMX 的左侧外设列表里点开 COMP1 或者 COMP2,看到那些复杂的下拉菜单,第一反应往往是懵的。别急,先把问题拆开。
1.1 比较器的两个输入端口:非反相输入与反相输入
STM32 内部的比较器(Comparator,简称 COMP)本质上是一个模拟电压比较器,两个输入端口分别叫“非反相输入”(Non-inverting input,用“+”表示)和“反相输入”(Inverting input,用“-”表示)。输出逻辑很简单:当“+”端电压高于“-”端电压时,输出为高电平;反之输出为低电平。
翻开 STM32 参考手册的 COMP 章节,你会看到输入选择相关的寄存器位,比如 COMP_CSR 里的 COMPx_INP 和 COMPx_INM。INP 控制非反相输入,INM 控制反相输入。这两个字段的值决定了比较器比较的是哪两个信号。CubeMX 界面上的“Input”配置项,最终就是去设置这两个寄存器字段。
这里要特别指出一个初学者最容易犯的错误:非反相输入和反相输入不是随便选的。很多人在 CubeMX 里把两个输入都选成外部引脚,接上信号之后发现输出状态完全不对,原因就是搞混了正负端。比如你想检测一个电压是否超过 2.5V,正确的做法是把被检测电压接到非反相输入,把 2.5V 基准接到反相输入。如果你接反了,输出逻辑就直接反过来了。
1.2 输入源的可选项:外部引脚、DAC、内部基准
在 CubeMX 的配置界面上,非反相输入和反相输入的可选项大致分为三类。
第一类是 GPIO 外部引脚。非反相输入可选的是 COMP_INP 对应的引脚,这些引脚通常是 PA0、PA1、PA4、PA5 这类带模拟功能的引脚。反相输入可选的外部引脚则包括 COMP_INM 对应的引脚,不同型号排列完全不同。比如在 STM32F3 系列上,某些比较器的反相输入可以连接到 PA4,但在 F0 系列上同一个比较器的反相输入可能只能连接内部 DAC 输出或者 VREFINT。
第二类是内部 DAC 输出。STM32 内部有 DAC 外设,它的输出电压可以直接作为比较器的输入源。这种情况下不需要占用外部引脚。如果你需要在运行时动态调整阈值电压,用 DAC 作为反相输入是比外部基准更灵活的方案。你可以用定时器触发 DAC 产生一个斜坡电压,然后让比较器和这个斜坡电压比较,从而实现脉宽调制或者频率转换。
第三类是内部基准电压 VREFINT。这是芯片内部一个固定的参考电压,典型值在 1.2V 左右(具体看数据手册)。注意 VREFINT 的精度有限,作为粗略阈值是可以的,如果要求高精度比较,还是建议用外部基准或者 DAC。
提示:并不是所有比较器都支持上述全部输入源。以 STM32F334 为例,COMP1 的非反相输入可以选 PA0、PA4 或 DAC1_OUT,反相输入可以选 PA1、PA5 或 VREFINT、DAC1_OUT。但同样的 COMP2,可选择的外部引脚就不同了。配置前务必对照数据手册的“Alternate function mapping”表格确认,别只信 CubeMX 的下拉框——它虽然是动态生成的,但如果你没有正确勾选某些功能,部分选项不会显示。
1.3 输出极性、滞回和消隐时间:这些参数和输入选择的关系
输入选择只是第一步。在 CubeMX 的 COMP 配置里,你还会看到“Output polarity”“Hysteresis”“Blanking source”等选项。这些参数看起来和输入选择无关,实际上密切相关。
比如滞回(Hysteresis)功能,它的作用是避免比较器在阈值附近因为噪声反复翻转。滞回电压的大小会影响你判断输入电压的精度,特别是在低速变化信号上。CubeMX 里可选“No hysteresis”“Low”“Medium”“High”等挡位,看名字就知道是滞回电压的大小不同。如果你配置比较器用来检测过压保护,建议选 Medium 或 High,不然信号稍微抖动一下,比较器输出就会疯狂跳变,后面接的中断可能被触发几百次。
输出极性(Polarity)决定比较器输出是高电平有效还是低电平有效。极性配置为“Non-inverting”时,比较结果不变;“Inverting”时输出取反。这个选项也可以用来解决上面说的“接反了输入端口”的问题,但不建议用取反来掩盖接线错误,因为会造成代码可读性下降,后面维护的人容易疯掉。
消隐时间(Blanking)是配合 PWM 应用的重要功能。当比较器用于过流检测时,PWM 开关动作瞬间会产生很大的电流尖峰,让比较器误触发。消隐功能可以在 PWM 开关动作后的短时间内屏蔽比较器输出。配置这个功能需要在 CubeMX 中额外选择定时器的某个触发输出作为消隐源,后面会具体讲。
2. CubeMX 界面上的实际配置路径全解
前面把原理说清楚了,现在进入实操环节。我以 STM32F334 的 COMP1 为例,手把手带你把 CubeMX 里的输入选择配置走一遍。
2.1 从 Pinout & Configuration 面板开始
打开 CubeMX,新建一个基于 STM32F334R8 的工程。在左侧的“Categories”列表里找到“Analog”,展开后能看到“COMP1”和“COMP2”。点击 COMP1,界面中央的芯片图会高亮显示 COMP1 可用的引脚。如果你之前没有做过任何配置,这里只会高亮显示一个输入引脚和一个输出引脚,这就是默认状态。
接下来在 COMP1 的配置界面中,点击“Mode”下拉框,选择“Enabled”。这时界面会刷新,出现“Parameters Settings”窗口,这就是配置输入选择的主战场。
在 Parameters Settings 里,你会依次看到:
- Input configuration
- Non-inverting input(+)
- Inverting input(-)
- Output configuration
- Output polarity
- Blanking source
- Hysteresis configuration
- Hysteresis
2.2 逐个击破:非反相输入选择该放什么
Non-inverting input 下拉框里,你能看到若干选项,每个选项都对应一个 GPIO 引脚号或者内部信号。以 F334 的 COMP1 为例,选项包括 PA0、PA4、DAC1_OUT。
假设我要用一个外部电压作为检测对象,这个电压连接到 PA4 引脚,那我在这里直接选 PA4。CubeMX 会自动将 PA4 配置为模拟输入模式,并且把 COMP1_IP 寄存器位设置为对应的编码值。你不用手动去芯片图上把 PA4 点成模拟模式,CubeMX 会帮你完成这个操作,前提是你在这里做了正确选择。
但是,有一个细节很多人忽略。当你选择 PA4 作为非反相输入时,CubeMX 并不会立刻把 PA4 的 GPIO 配置锁定。如果你在芯片图里手动将 PA4 配置为其他功能,比如 TIM2_CH1,两个配置就会冲突。CubeMX 会在右下角的“Problems”面板里报错,提示引脚冲突。正确的做法是不要手动干预,让 CubeMX 自动管理引脚。
2.3 反相输入:基准电压的选择需要结合实际电路
Inverting input 下拉框里的选项会多几个。还以 COMP1 为例,可选项包括 PA1、PA5、VREFINT 和 DAC1_OUT。
这里有个实用建议:如果你的参考电压不是标准值,比如你想检测 1.8V 的阈值,内部 VREFINT(约 1.2V)就不够用,那就需要把外部基准或分压网络接到 PA5 并在这里选择 PA5。如果阈值是固定的,比如 1.2V,直接用 VREFINT 就行,省一个引脚。
还有一个小技巧,用 DAC 做反相输入时,可以让程序在运行时通过修改 DAC 输出值动态改变比较阈值,而不需要改动硬件电路。我做过一个电池电压监测的小模块,用 DAC 输出动态阈值,配合比较器中断实现多级电量告警,非常方便。CubeMX 里只需要把 DAC 使能,然后在 COMP 的 Inverting input 里选 DAC1_OUT,之后在代码里控制 DAC 输出电压即可。
2.4 输出引脚和内部连接的设置
输入选择配置好后,还有一个输出相关的设置。COMP1 的输出可以连接到普通 GPIO 引脚(比如 PA6),也可以直接连接到内部外设,比如定时器的输入捕获或者 HRTIM 的触发输入。在 CubeMX 的 COMP1 配置界面中,你可以在“Output”部分选择“Output Pad”来启用 GPIO 输出,或者选择“Internal connection”来连接内部外设。
如果你选用了 GPIO 输出,注意输出引脚的推挽/开漏配置需要和后续电路匹配。如果后面接的是比较器输出导致输入引脚损坏的 CMOS 输入,建议选推挽输出;如果接的是开漏总线,建议选开漏并配置上拉。
内部连接这部分在实际配置中最容易被忽略,因为 CubeMX 不会自动帮你把比较器输出连接到定时器的某个通道上。你需要到对应的定时器配置界面里,手动选择“Trigger Source”或者“Input Capture Source”为 COMP1_OUT。这个操作和比较器本身的输入选择是独立的,但最终影响到整个信号链路。
3. 输入选择背后的 GPIO 复用关系:最容易踩坑的地方
这一节是全文的重点,也是我最想让你看完的部分。大部分人配置失败,问题都出在 GPIO 复用关系上。
3.1 比较器输入引脚与普通 GPIO 的关系
STM32 的比较器输入引脚是模拟输入引脚,它们和普通 GPIO 共用物理引脚,但功能上是完全不同的。当你把某个引脚用作比较器输入时,需要把该引脚的 GPIO 配置为模拟模式(Analog),这时数字输入输出缓冲器默认是关闭的,功耗也更低。
CubeMX 的智能之处在于:你选择了比较器输入之后,它会自动帮你把引脚模式改为 Analog。但如果你不是通过 CubeMX 下拉框选择输入源,而是手动在芯片图上把引脚点成 Analog,然后去代码里把寄存器对应位设了,CubeMX 生成的中断优先级、时钟初始化顺序可能会出问题。
我在实际项目中遇到过一种情况:我先在 IDE 里手写了比较器初始化代码,后来又把工程迁移到 CubeMX,结果发现某个引脚的 GPIO 配置被覆盖了,整个模拟比较功能失效。排查后发现是 CubeMX 生成的 GPIO_InitStruct 里把引脚配置成了输出模式,覆盖了我原先的手写配置。所以,CubeMX 里配置务必规范,别搞混合模式。
3.2 不同系列 STM32 比较器输入选择的差异
为了让大家避免在跨系列移植时踩坑,我整理了一个对比表格,列出了常见系列的比较器输入选择差异。
| STM32 系列 | 比较器数量 | 非反相输入典型可选 | 反相输入典型可选 | 特别注意 |
|---|---|---|---|---|
| F0 | 2 (COMP1/COMP2) | PA0, PA1, PA4, PA5 | 多个外部引脚 + VREFINT + DAC | F0 的 COMP 输出接 TIM1 的 BKIN 需要额外配置 |
| F3 (如 F334) | 2 (COMP1/COMP2) | PA0, PA4, DAC1_OUT | PA1, PA5, VREFINT, DAC1_OUT | 支持 HRTIM 联动,但需要 HRTIM 的输入选择配合 |
| G0 | 2 (COMP1/COMP2) | 不同封装引脚差异大 | 多种内部基准和 DAC | 输入选择受封装影响明显 |
| G4 | 2 (COMP1/COMP2) | 多路 GPIO + DAC | 多路 GPIO + VREFINT + DAC | 支持可编程滞回,功能最强 |
| L4 | 2 (COMP1/COMP2) | 多路 GPIO | 多路 GPIO + VREFINT | 低功耗模式下比较器仍可工作 |
要注意的是,这个表格是典型情况,不同型号的具体封装和引脚会有差异。配置前务必核对数据手册里的表。
3.3 引脚冲突的破解思路
如果你在 CubeMX 里同时使用了大量外设,引脚冲突是常见问题。比如 F334 的 PA0 既是 COMP1 的非反相输入,又是 ADC1 的输入通道,还可能是 TIM2_CH1。如果你想把 PA0 用作比较器输入,同时又想让 ADC1 采集另一个信号,这没问题;但如果你把 ADC1 的输入也设置成 PA0,那 CubeMX 会报冲突。
解决冲突的思路通常是:
- 优先给高实时性、不可替代的功能分配引脚。比如比较器输入如果接的是关键保护信号,那这组引脚优先专属。
- 考虑用模拟开关或者跳线把外部信号切换到不同引脚,减少引脚占用。
- 检查是否可以用内部信号替代外部信号。比如 DAC 输出或 VREFINT,省下外部引脚。
- 在 CubeMX 中通过“Pinout Conflict”面板逐项排查,找到冲突的根源配置项,然后修改其中一个外设的输入选择。
4. 实战串联:F334 比较器与 HRTIM 输入联动的案例
标题和热词里反复出现 STM32F334 和 HRTIM,这个组合确实值得单独拿出来讲。F334 的高分辨率定时器(HRTIM)是它的王牌外设,而比较器正好可以给它做各种模拟信号的前端处理。
4.1 为什么 F334 上比较器特别有用
F334 的定位是数字电源控制。高分辨率定时器可以输出极高分辨率的 PWM 波形,而数字电源需要实时监测电流、电压,一旦发生过流、过压就要立即关断 PWM。这个监测动作如果用 ADC 采样再做软件判断,延迟太大,硬件比较器几乎零延迟的输出正好用来触发 HRTIM 的紧急关断(BKIN)或者事件触发。
所以我在 F334 上做电源项目时,几乎必配一个比较器。比较器的非反相输入接电流采样电阻两端的电压,反相输入接一个基准电压,输出接到 HRTIM 的某个故障输入。当电流超限时,比较器瞬间翻转,HRTIM 直接关断输出,保护后级电路。
4.2 配置链路:COMP -> HRTIM 输入选择的完整步骤
要在 CubeMX 里实现上面的功能,你需要完成一整条配置链路。
第一步,配置比较器的输入选择。在 COMP 配置界面里选择外部输入引脚作为非反相输入,选择 VREFINT 或 DAC 输出作为反相输入。这一步和前面讲的完全一样。
第二步,把比较器输出连接到 HRTIM 的故障输入。HRTIM 有个 Fault Input(FLT),可以配置由多种内部信号触发,其中一个来源就是 COMP1_OUT。在 CubeMX 的 HRTIM 配置界面中,找到 Fault 配置,选择 Enable,并在 Fault Source 里勾选 Comparator 1 Output。
第三步,配置 HRTIM 的输入事件。如果你希望通过比较器触发定时器事件而不是直接关断 PWM,可以到 HRTIM 的“Event”标签页中配置事件源。F334 的 HRTIM 还支持定时器之间的相互触发,比较器输出可以作为触发信号去控制另一个定时器的启动或停止。
第四步,设置消隐时间。特别是过流保护场景,PWM 开关瞬间的噪声很容易让比较器误触发。前面提过 Blanking 功能,在 HRTIM 联动场景中就可以把定时器的某个输出事件作为消隐信号。在 CubeMX 中,你需要在比较器的 Blanking Source 下拉框中选择对应的 HRTIM 输出事件。这里有个容易搞错的地方:不同系列可选的消隐源不同,F334 上也许只有 HRTIM 的特定事件可以作为消隐源,而 G4 上可能是 TIM1 的某个事件。务必按参考手册确认。
4.3 PWM 占空比和频率测量:CubeMX 配置的另一种应用
热词里有一条“cubemx 测量 占空比 频率”,这个需求也可以用比较器来实现。方法是用比较器将一个模拟信号转换成数字方波,再用定时器的输入捕获功能测量方波的占空比和频率。
CubeMX 配置思路是:比较器把输入的正弦波或任意模拟信号和设置的阈值电压比较,输出翻转产生方波;方波输出连接到某个定时器的输入捕获通道,比如 TIM2_CH1;TIM2 配置为输入捕获模式,同时测量上升沿和下降沿,从而计算出占空比和频率。
如果信号本身已经是数字方波,其实不需要比较器,直接用定时器输入捕获即可。但如果你要测量的是模拟信号,比如传感器输出的电压信号,或者 PWM 经过 RC 滤波之后的模拟电压,那比较器是必备的前端环节。
4.4 常见配置错误排查清单
基于我自己的踩坑经历,这里整理了一份比较器输入选择相关问题的排查清单,供你对照参考。
- 信号完全没反应,输出始终是固定电平:检查比较器是否使能,检查输入引脚是否真的连接了信号,确认非反相输入和反相输入是否接反。如果有万用表,直接测两个输入引脚的电压,验证逻辑是否符合预期。
- 输出有翻转,但频率和预期不一致:检查消隐时间是否太长,把有效信号给屏蔽了;检查滞回是否设置得过大,导致阈值点偏移。
- 和 HRTIM 联动失效,PWM 没有被关断:确认比较器输出是否成功连接到 HRTIM 的 Fault 或触发输入。在 CubeMX 里检查 HRTIM Fault Source 配置,查代码里确认 EXTI 中断没有被错误地占用。
- 程序跑着跑着比较器配置丢失:检查时钟配置是否正确,特别是 COMP 外设的时钟是否被使能。个别系列里 COMP 的时钟比较特殊,需要在 RCC 配置中手动开启。
- CubeMX 编译不通过,报错提示某个引脚冲突:到 Pinout 面板看冲突详情,逐个调整。比较器输入引脚的优先级通常低于高速通信接口但高于普通 GPIO,根据实际需要取舍。
注意:以上排查都以 CubeMX 界面操作为主,但调试时还应该配合调试器查看实际寄存器值。CubeMX 生成代码后,在 Keil 或 STM32CubeIDE 里逐步执行,观察 COMP_CSR 寄存器是否和配置一致,输入引脚电平是否正确。这是最快定位问题的方法。
5. 验证输入选择是否生效的调试技巧
配置完成了,代码也生成了,怎么确认选择真正生效?这里分享几个我常用且有效的验证方法。
5.1 使用内部基准作为输入源的验证技巧
如果你在 Inverting input 里选择了 VREFINT,验证就很方便。只需要用万用表测量你接到非反相输入的外部电压,然后在调试器里观察比较器输出寄存器的值。外部电压高于 1.2V 时输出应该为高,低于 1.2V 时输出应该为低。由于 VREFINT 实际值可能有一点偏差,阈值判断不会在正好 1.2V 处翻转,你可以微调输入电压找到一个翻转点,记录下实际翻转电压。
这个实际翻转点可能和理论值不一致,原因通常是 VREFINT 精度有限,或者存在较小的输入失调电压。如果项目对精度要求高,建议放弃 VREFINT,改用外部基准。如果是验证性测试,VREFINT 就很够用了。
5.2 用虚拟示波器和调试器观察输出变化
如果条件允许,接上逻辑分析仪或示波器到比较器的输出引脚,持续观察输出波形。输入电压缓慢变化时,输出应该在阈值处干净翻转。如果观察到震荡或者来回翻转,说明滞回设置太小,或者电路布局引入了很大噪声。
没有外部示波器时,你可以开启比较器的中断,在中断回调函数里翻转另一个 GPIO 指示电平,把中断频率换算成输出翻转次数。不过这种验证方法不够精确,最好还是用硬件工具。
5.3 一个完整的寄存器级验证示例
用 STM32CubeIDE 打开调试会话,在表达式窗口里添加 COMP1->CSR 寄存器,配置完成后复位并运行,观察寄存器值。
比如 F334 上 COMP1_CSR 的 COMP1_INP 字段从 bit16 到 bit17,COMP1_INM 字段从 bit14 到 bit15。如果非反相输入选的是 PA4,那么 INP 字段的值应该对应 PA4 的编码值。如果你对 CubeMX 的可视化配置没信心,可以直接去读这个寄存器确认。
代码层面,可以添加这样的验证逻辑:
#include "stm32f3xx_hal.h" // 假设你已经通过 MX_COMP1_Init() 完成了初始化 void Verify_CMP1_Input_Selection(void) { uint32_t csr_val = COMP1->CSR; // 提取反相输入和非反相输入的编码值 uint32_t inverting_input = (csr_val >> 14) & 0x3; // COMP1_INM uint32_t non_inverting_input = (csr_val >> 16) & 0x3; // COMP1_INP // 根据参考手册中的编码表判断是否匹配 if (inverting_input == 0x0) printf("CMP1 Inverting Input 来源: 外部引脚 PA1\r\n"); else if (inverting_input == 0x1) printf("CMP1 Inverting Input 来源: 外部引脚 PA5\r\n"); else if (inverting_input == 0x6) printf("CMP1 Inverting Input 来源: VREFINT\r\n"); else printf("CMP1 Inverting Input 来源: 其他编码,详查手册\r\n"); if (non_inverting_input == 0x0) printf("CMP1 Non-inverting Input 来源: 外部引脚 PA0\r\n"); else if (non_inverting_input == 0x1) printf("CMP1 Non-inverting Input 来源: 外部引脚 PA4\r\n"); else printf("CMP1 Non-inverting Input 来源: 其他编码,详查手册\r\n"); }这个代码只是辅助验证,实际调试中不一定要放到固件里。你可以在调试器的表达式窗口直接观察这些位的值,效果一样。
6. 输入选择相关的进阶玩法:从固定比较到动态阈值
讲完了基础配置和验证,最后分享几个比较器输入选择的进阶应用。这些玩法用到的关键能力都是“输入源可以动态切换或动态调整”,在电源管理和信号处理场景里非常实用。
6.1 用 DAC 动态修改阈值:便携设备电量监测实战
我做过一个两节锂电池串联的便携设备,总共 4 级电量告警。如果每个告警阈值用外部电阻分压实现,需要 4 组电阻网络外加模拟开关,电路非常繁琐。后来改用比较器+DAC 的方案:比较器的反相输入接 DAC 输出,非反相输入接电池电压的分压信号。程序根据当前电量和告警等级,动态给 DAC 写不同的输出电压,实现阈值的灵活切换。
CubeMX 里的配置顺序是:
- 先使能 DAC 外设,并选择一个输出通道。
- 在 COMP 配置里,将反相输入选为 DAC1_OUT。
- 在代码中控制 DAC 输出值,根据电池电量切换阈值。
- 比较器输出接一个 GPIO 中断,触发后进入低电量处理。
这个方案的优点是硬件极简,阈值随时可以改。缺点是 DAC 的精度有限,高位数 DAC 分辨率有限,需要评估当前应用场景的精度是否够用。
6.2 多输入源比较器实现信号源切换
某些应用需要在不同信号源之间切换,比如采集模块要根据现场情况选择检测电流信号或温度信号。比较器输入如果只有一组非反相输入,无法做到多路切换。但如果你有多个 ADC 通道,配合比较器的输出选择,可以实现简单的信号源自动切换。
这里有一个思路:使用两个比较器分别处理两种信号,输出分别连接到两个不同中断或定时器输入,代码根据当前需求去使能对应的比较器。CubeMX 中每个 COMP 的输入选择都可以独立配置。比如 COMP1 非反相输入接电流传感器信号,COMP2 非反相输入接温度传感器信号,两者的反相输入可以共享同一个 VREFINT 或者 DAC 输出。这样单个芯片内部就完成了一个简单的两路模拟比较切换器。
6.3 比较器输入选择对功耗的影响
低功耗项目里,比较器也是常客。但很多人没注意到,比较器的输入选择直接关系到静态功耗。在停止模式或者待机模式下,如果比较器依旧使能,输入引脚上的漏电流和比较器本身的静态电流都会叠加到系统功耗里。
如果你用外部引脚作为比较器输入,在不使用时尽量把比较器关闭,或者把引脚配置为模拟模式并悬空。如果必须保持比较器工作,优先选择内部输入源(VREFINT 或 DAC),因为外部引脚的漏电流受 PCB 污染、湿度和温度影响很大,有时候实测功耗会远超数据手册标称值。
我见过一个典型案例:某低功耗产品在室温下待机电流正常,放到高温环境中电流飙高,排查到最后发现是比较器外部输入引脚的漏电流随温度上升急剧增大。后来改成用内部基准和内部 DAC 作为比较器输入,漏电流问题彻底解决。
7. 我自己的体会和一个小技巧
关于 CubeMX 比较器输入选择,说实话,这是一个“看懂了很简单,看不懂很痛苦”的配置项。手动点几下下拉框很容易,但真正理解非反相输入、反相输入的对应关系,理解引脚复用和内部信号互联,还是得靠参考手册和数据手册配合着看。
我个人的使用习惯是:所有涉及比较器的项目,在 CubeMX 里配置完成后,一定要去参考手册里核对一遍输入选择对应的寄存器编码,特别是跨系列移植的时候。不要以为 CubeMX 生成的都是对的——新版 CubeMX 对老型号芯片的某些外设支持力度参差不齐,偶尔会有生成代码和预期不符的情况。
最后再分享一个非常实用的小技巧:调试比较器时,可以在芯片外部准备一个可调电压源,用来模拟输入信号。从 0V 开始缓慢上调,观察比较器输出翻转的电压点。这个翻转点能一次性验证输入引脚连接、阈值电压配置、滞回设置和输出极性是否正确,排查效率极高。比你用信号发生器产生复杂波形再慢慢分析要省事得多。
希望这篇文章能帮你在 CubeMX 配置比较器输入时少走弯路。如果后面有时间,我再单独写一篇关于 F334 高分辨率定时器 PWM 输出的配置详解,把 HRTIM 和 COMP 联动的完整代码架构一并拆开讲清楚。