4. C2000外设寄存器与驱动层调试

C2000系列(如F2837x、F28004x)的外设调试,本质上是围绕“寄存器—驱动—信号”三层展开的。寄存器是硬件行为的直接映射,驱动层是寄存器操作的封装,而信号是最终要观察的物理结果。调试时如果只停留在调用库函数,一旦外设不工作,往往无从下手;反过来,如果只会翻寄存器手册,又难以快速定位是配置问题还是硬件问题。本章以GPIO、EPWM、ADC、CMPSS、DAC、SCI/CAN为主线,说明寄存器级调试的方法、常见初始化错误以及验证手段。

一、寄存器查看与修改的基本手段

在CCS中调试外设,最直接的工具是Registers视图和Memory Browser。Registers视图按外设分组显示寄存器当前值,适合观察EPWM的TBCTR、CMPA、AQCTLA,ADC的ADCRESULT、ADCINTFLG,以及GPIO的GPADAT、GPBDAT等。Memory Browser则适合按地址查看连续寄存器块,例如GPIO控制寄存器从0x7C00开始,可以一次性观察GPACTRL、GPADIR、GPAPUD等。

修改寄存器有两种方式:一是在Registers视图中直接双击写入,二是通过Expressions窗口或GEL脚本写入。直接写入适合快速验证,例如把GPADIR的某一位写1,观察对应引脚是否从输入变为输出。但要注意,很多外设寄存器受EALLOW保护,直接写入会被忽略或触发错误。此时需要先执行EALLOW,再写寄存器,最后EDIS。在调试器中,可以通过GEL函数或直接在Expressions中执行EALLOW宏来解除保护。

调试时建议先读后写:先读取寄存器当前值,确认复位默认值是否符合预期,再写入目标值,最后回读确认写入生效。对于受保护寄存器,回读时若值未变,应检查EALLOW是否已执行。

二、GPIO寄存器级调试

GPIO调试的核心是四个寄存器:GPACTRL(控制)、GPADIR(方向)、GPAPUD(上拉禁用)、GPADAT/GPASET/GPACLEAR(数据)。以F2837x为例,把GPIO32配置为输出并输出高电平,典型操作如下:

EALLOW;
GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0;   // 配置为通用GPIO
GpioCtrlRegs.GPBDIR.bit.GPIO32 = 1;    // 方向为输出
GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0;    // 使能内部上拉
EDIS;
GpioDataRegs.GPBSET.bit.GPIO32 = 1;    // 输出高电平

常见错误是忘记配置MUX寄存器,导致引脚仍处于外设功能状态,写DAT无效。验证手段是用万用表或示波器测量引脚电平,同时在Registers视图中观察GPBDAT对应位是否翻转。如果DAT翻转但引脚电平不变,应检查MUX和DIR;如果DAT不翻转,应检查是否被外设复用或寄存器写保护。

三、EPWM与ADC的联动调试

EPWM调试关注时基、比较、动作限定和死区。以F2837x的EPWM1为例,设置周期为10kHz、占空比50%,关键寄存器包括TBPRD、CMPA、AQCTLA。TBPRD = SYSCLKOUT/(2×PWM频率) - 1,若SYSCLKOUT为200MHz,则TBPRD = 200e6/(2×10e3) - 1 = 9999。CMPA = TBPRD/2 = 4999时,若AQCTLA配置为“计数到CMPA时置高、计数到0时置低”,即可得到50%占空比。

ADC调试则关注采样触发源、采样窗口和结果寄存器。常见错误是EPWM触发ADC时,SOC配置的触发源与EPWM的SOCA/SOCB信号不匹配,导致ADC不转换。验证方法是:在Registers视图中观察ADCINTFLG是否置位,ADCRESULT是否更新;若FLG不置位,检查EPWM的ETSEL寄存器是否使能SOCA,以及ADC的SOC配置是否选择正确的触发源。

C2000外设寄存器调试信号链与验证路径 EPWM1 TBPRD=9999 CMPA=4999 AQCTLA 置高/置低 ETSEL.SOCAEN=1 ADC-A SOC0 触发源=EPWM1 SOCA ACQPS 采样窗口 ADCRESULT0 ADCINTFLG.bit.ADCINT1 CMPSS1 DACHVALA 阈值 COMPCTL 比较器使能 CTRIP 输出至EPWM DACOUT 缓冲输出 SOCA触发 采样值比较 CTRIP 故障封波(TZ) 寄存器级验证路径 1. 读复位默认值 确认MUX/DIR/PUD 2. 写目标寄存器 EALLOW后写入 3. 回读确认 值是否生效 4. 测引脚/波形 示波器/万用表 若回读失败:检查EALLOW、时钟使能(PCLKCR)、外设复位状态 若引脚无输出:检查MUX复用、DIR方向、外部负载与上拉

四、CMPSS与DAC的调试要点

CMPSS内部包含比较器和参考DAC,常用于过流保护。调试时先配置DACHVALA设定阈值,再使能COMPCTL中的比较器,最后观察CTRIP输出是否随输入变化。常见错误是DAC参考电压未使能或DACVAL计算错误。例如,若DAC参考为3.3V、12位,要得到1.65V阈值,DACVAL = 1.65/3.3 × 4095 ≈ 2048。验证时可用DACOUT输出到引脚,用万用表测量实际电压,确认DAC通道工作正常。

DAC调试相对简单,但要注意DACOUT的负载能力有限,直接驱动低阻负载会导致电压跌落。建议先空载测量,再接入实际负载观察变化。

五、SCI与CAN的寄存器级调试

SCI调试关注波特率寄存器BRR、控制寄存器SCICTL1/2、状态寄存器SCIST。以F2837x为例,LSPCLK为50MHz、目标波特率9600时,BRR = 50e6/(9600×8) - 1 ≈ 650。配置后先回读BRR确认,再使能TX/RX。常见错误是SCI时钟未使能(PCLKCR)、GPIO未配置为SCI功能、或BRR计算时误用了SYSCLKOUT而非LSPCLK。

CAN调试更复杂,涉及位时序寄存器CANBTC。位时序由BRP、TSEG1、TSEG2、SJW组成,必须与总线其他节点一致。调试时先用示波器观察CANH/CANL差分波形,确认有帧活动;再检查CANES和CANERC寄存器中的错误计数。若错误计数持续增长,优先检查波特率和终端电阻。

SCI/CAN调试中,GPIO复用配置错误是最常见的问题之一。务必确认引脚MUX值对应正确的外设功能,且方向由外设控制而非GPIO。

六、外设初始化常见错误与验证清单

外设常见错误验证手段
GPIOMUX未配置、DIR错误、写保护未解除回读GPxDAT、测引脚电平
EPWMTBPRD/CMPA计算错误、AQCTLA配置不当示波器测PWM波形、看TBCTR计数
ADCSOC触发源不匹配、ACQPS过小看ADCINTFLG、ADCRESULT是否更新
CMPSSDAC阈值错误、比较器未使能测DACOUT电压、看CTRIP翻转
SCIBRR计算错误、时钟未使能回读BRR、示波器测TX波形
CAN位时序不一致、终端电阻缺失看CANES错误计数、测差分波形

寄存器级调试的价值在于:当驱动层行为异常时,能够直接观察硬件状态,判断问题出在配置、时钟、引脚还是外部电路。建议养成“先读默认值、再写目标值、后回读确认、最后测物理信号”的习惯,这比反复修改库函数参数更高效。