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宏来解除保护。
二、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配置是否选择正确的触发源。
四、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寄存器中的错误计数。若错误计数持续增长,优先检查波特率和终端电阻。
六、外设初始化常见错误与验证清单
| 外设 | 常见错误 | 验证手段 |
|---|---|---|
| GPIO | MUX未配置、DIR错误、写保护未解除 | 回读GPxDAT、测引脚电平 |
| EPWM | TBPRD/CMPA计算错误、AQCTLA配置不当 | 示波器测PWM波形、看TBCTR计数 |
| ADC | SOC触发源不匹配、ACQPS过小 | 看ADCINTFLG、ADCRESULT是否更新 |
| CMPSS | DAC阈值错误、比较器未使能 | 测DACOUT电压、看CTRIP翻转 |
| SCI | BRR计算错误、时钟未使能 | 回读BRR、示波器测TX波形 |
| CAN | 位时序不一致、终端电阻缺失 | 看CANES错误计数、测差分波形 |
寄存器级调试的价值在于:当驱动层行为异常时,能够直接观察硬件状态,判断问题出在配置、时钟、引脚还是外部电路。建议养成“先读默认值、再写目标值、后回读确认、最后测物理信号”的习惯,这比反复修改库函数参数更高效。