资讯详情

资讯详情

TMS320F28P55x C2000开发调试实战:从仿真器连不上到Flash烧录的避坑指南

去年年底从朋友那边拿到一片TMS32F28P550更准确说是TMS320F28P550SJC2000家族里的新面孔想在项目里做电机控制和实时采集。结果硬件焊完、仿真器插上事情远没有我想象中顺利——各种连接掉线、程序不进main、串口乱码、Flash烧完第二次连不上前前后后折腾了小两周。这几天把调试记录翻出来整理了一遍挑几个最典型的“坑”展开聊聊希望能帮正准备碰这颗片子的人少走一点弯路。这颗芯片定位挺有意思150MHz的C28x内核带FPU、TMU、VCU加速器集成PGA和比较器ADC采样率最高12.5MSPS一片解决模拟前端加数字控制。硬件上省了不少料但调试手感和F2833x、F28004x那套老流程有明显区别。再加上CCS从12版本开始慢慢往Theia架构迁移工程配置、target configuration、烧写插件都变了很多老经验直接失效。开发环境与硬件准备从CCS版本到最小系统设计1.1 别小看CCS版本和仿真器固件的匹配刚开始我图省事用了一台旧笔记本上装好的CCS 10.x结果连XDS110的时候一直报“Could not find target”或者“Error connecting to the target: (Error -241)”。一开始以为是焊接问题后来换了台装了CCS 12.8的机器同一块板子一次就连接成功。对比了下问题出在CCS 10内置的XDS110驱动固件太老而F28P55x的JTAG TAP结构比较新旧固件枚举不出来。这里建议直接用较新版本的CCS我用的CCS 12.8也可以直接上CCS Theia版并让CCS在连接时自动升级XDS110固件。如果仿真器之前被别的项目刷过固件插上板子后先在CCS里执行一次“Flash the firmware”再连接。另外F28P55x支持标准的14pin JTAG接口也支持cJTAG默认情况下我用cJTAG2线就够用了但前提是target configuration里Board Data File要选对。1.2 最小系统焊接上的三个容易出问题的地方这一颗是LQFP封装引脚密度比DIP高不少。我焊完第一块板子出现一个很隐蔽的问题VCAP引脚必须外接符合手册要求的电容。F28P55x内部有稳压器VCAP引脚如果电容容值不对或者走线过长内核电压不稳仿真器有时能连上但全速运行时程序随机跑飞。手册上推荐的是2.2μF或4.7μF我一开始图方便用了0.1μF的结果跑一个定时器中断都重启。其次是复位引脚。不要以为有内部上拉就什么都不接。虽然NRST引脚内部有弱上拉但在强干扰环境或者仿真器连接的瞬间复位脚容易受耦合噪声影响产生毛刺MCU会不定期复位。我后来在复位脚对地加了一个0.1μF电容并且用1kΩ电阻上拉到3.3V问题明显减少。最后是电源。F28P55x虽然内部把3.3V转内核电压但3.3V电源质量直接决定ADC精度和Flash稳定性。我第二版板子加了LC滤波给模拟电源引脚供电实测ADC噪声明显降低。这一点后面ADC部分还会提。仿真器连接失败与掉线的完整排查链路2.1 从Error -241到Error -1135分别说明什么调试过程中最打击人的是一连串错误码。我把遇到的几个整理成一张表方便对照报错信息大概率原因我的处理方式Error -241XDS110固件过旧或target configuration芯片型号选错升级仿真器固件重新选F28P55x对应型号Error -1135目标板供电异常或JTAG引脚被复用测量3.3V电压检查GPIO配置Error -1142目标板未上电或复位脚被拉低确认电源断开调试口外部复位电路Error -2131连接时CPU时钟异常PLL没锁住检查供电和VCAP电容恢复默认时钟配置这里最坑的是Error -1135JTAG引脚被复用。F28P55x的TMS、TCK、TDI、TDO不是专用引脚上电默认是JTAG功能但如果你在程序里把这些引脚配置成GPIO连接时通常是没问题的因为此时程序还没跑可一旦你连上仿真器、点击Run程序开始执行它立刻把JTAG引脚切成了GPIO功能仿真器也就瞬间掉线了。表现就是能连上一跑就掉或者在线调试时单步几步就“lost target connection”。更隐蔽的情况是GPIO复用发生在初始化早期你甚至没来得及在代码里设置断点芯片启动就把JTAG引脚切走了。解决办法有两个一是不要把JTAG引脚配置成GPIO至少在调试阶段不要二是用CCS的“Halt”模式在连接时将内核强制停机然后在main函数最开头设断点单步看初始化流程避免直接全速运行。2.2 连接掉线的硬件排查顺序仿真器掉线不一定是代码问题很多时候是硬件供电扛不住瞬间电流。这里给一个排查顺序我每次遇到掉线都按这个走先量3.3V电压排除电源跌落示波器看复位引脚在掉线瞬间是否有毛刺断开SCI、CAN等外部收发器排除外部器件倒灌电流把JTAG线缩短排除线缆过长导致的信号完整性问题最后才怀疑代码里的引脚复用和时钟配置。有一次我折腾了一个下午最后发现是USB延长线质量太差XDS110供电不足换了一根短线立刻解决。调试先怀疑物理层再怀疑协议层最后怀疑代码逻辑这个顺序能省很多时间。Boot模式和时钟树配置程序跑飞的两个隐形凶手3.1 Boot引脚组合比想象中更容易被忽视F28P55x启动时boot ROM会根据特定GPIO引脚电平决定从Flash启动还是从SCI启动还是从其他外设启动。我第一版程序烧进Flash后断电重新上电结果芯片没有任何反应串口也没输出用仿真器连上去看程序根本没有执行——卡在boot ROM里反复跑。检查之后发现是boot引脚的电平组合不对。因为这个芯片的boot模式由两个引脚的电平决定具体引脚号根据封装不同有差异我用的封装对应GPIO24和GPIO32而这两个引脚在板上同时被LED和按键复用了上电瞬间按键恰好把引脚拉到了错误电平MCU以为要从SCI boot自然跑不起来。这里建议上电调试阶段把boot引脚设计成可跳线选择的两脚都接10kΩ电阻并且留有跳冒位置平时默认Flash boot调试时再切SCI boot或者等待仿真器连接模式。如果板子已经定型了那就只能靠跳线飞线总比每次都要拆芯片强。3.2 PLL配置与看门狗上电后的“死亡三角”F28P55x内部有两个10MHz振荡器也可以使用外部晶振。上电复位后芯片默认运行在INTOSC1提供的10MHz时钟上这个时候如果你用仿真器连上并设断点频率低、功耗低一切正常。但一旦你在初始化里配置PLL倍频到150MHz同时打开了看门狗而喂狗代码写在了外设初始化之后——恭喜你进入“死亡三角”上电 → 看门狗超时 → 复位 → 看门狗又超时 → 复位……这个循环会在几十毫秒内不断发生仿真器根本来不及halt住内核你就看到连接成功后瞬间又断开。解决办法是在初始化最前面先把看门狗关掉或者开启后马上喂狗等所有外设配置完成后再打开看门狗。这一点对C2000全系列都适用但F28P55x因为主频更高看门狗溢出时间更短问题暴露得更快。PLL配置还有一个容易忽略的点倍频系数必须遵循手册的范围。F28P55x最高150MHz但有些封装或者环境温度下跑150MHz余量不大如果电源纹波稍微大一点就会偶发复位。我量产板最终把主频降到了120MHz跑牺牲一点性能换稳定性实测故障率明显下降。GPIO复用与ADC采样异常从寄存器反推电路问题4.1 GPIO库函数和位域寄存器混用的一个坑F28P55x的GPIO配置沿用了C2000的GPxMUX、GPxDIR、GPxPUD这些寄存器但注意新版CCS的芯片支持库把GPIO配置封装成了GPIO_setPinConfig()和GPIO_setDirection()这类函数。麻烦在于函数内部会重新写整个寄存器如果你第一次用直接操作寄存器的方式设置了某个引脚后面又用库函数改另一个引脚两者可能互相覆盖。我遇到的实际问题是用GPIO_setPinConfig(GPIO_0_SCI_RX)把GPIO0配置为SCI接收后又用直接寄存器赋值的方式把GPIO1配置为普通输出结果GPIO0的复用配置被清掉了SCI接收一直没数据。后来统一改成全部用库函数配置问题消失。建议新工程从第一行代码起就统一使用TI的驱动库driverlib不要一半寄存器一半库函数。除非你对每个寄存器的位定义倒背如流否则混合使用会浪费大量时间。4.2 ADC采样值飘忽不定先看PGA和参考电压F28P55x内部集成了PGA可以放大微小信号。我接了一个电流采样电阻信号只有几十毫伏直接进ADC的话分辨率不够于是打开了PGA增益。结果采样数据波动非常大从寄存器里读到的值和万用表实测差很离谱。排查过程先用内部基准电压比如把ADC输入接到内部VREFLO做自检发现ADC本身没问题然后把外部输入断开短接到地采样值应该是0但实际读出来还是有几十LSB的跳动最后检查PGA配置发现PGA的采样保持时间不够PGA输出建立需要时间ADC的采样窗口至少要大于PGA建立时间否则采到的还是前一个状态的残值。另外一点是ADC参考电压。F28P55x可以选择内部参考2.5V/3.3V等或者外部参考内部参考的精度和温漂对于12位采样一般够用但如果你用了外部基准芯片基准芯片的噪声会直接叠加到采样结果上。我后来在VREF引脚加了一个1μF低ESR电容采样噪声降了一个数量级。4.3 用寄存器读回验证硬件连接而不是靠感觉调试ADC时我养成了一个习惯编写裸机测试程序每读一次ADC结果就把原始寄存器值、转换结果、状态标志位一起通过串口打印出来。这样一个好处是能区分三层问题硬件没接好输入悬空、PGA配置不对放大倍数错误、ADC触发逻辑不对SOC没有正确触发。有一次我花了两个小时排查一个通道采样全为0最后发现是引脚本身就是悬空的示波器探头夹上去量到了50Hz工频干扰但MCU内部它读取的就是一个没有驱动源的浮空引脚。用万用表一量电压不对问题其实三分钟就能定位。软件调试解决不了硬件问题寄存器读回只是给排查提供线索最后还是得回到万用表和示波器上。SCI串口调试中的乱码与硬件握手坑5.1 波特率误差的积累比想象中严重F28P55x的SCI模块在150MHz主频下可以配置出很多常用波特率但前提是分频系数能整除。9600、115200这些看起来是标准值但如果用内部INTOSC110MHz而不是外部晶振总会有误差长时间通信累积错位就会乱码。我自己实测主频150MHz、使用内部10MHz振荡器、配置115200波特率实测波特率误差在0.8%左右短报文没问题但连续收发大量数据时偶尔会有一个字节错位。改成外部20MHz晶振后误差降到0.03%以内跑一整天也没再出现乱码。如果你对时钟精度要求不高可以先用内部振荡器做功能验证但量产前建议换外部晶振或者用PLL把内部振荡器倍频得到精确整数分频。要算准波特率直接用TI的波特率配置工具或者SCI_setConfig()函数会自动计算BRR分频值手动算容易算错。5.2 USB转TTL模块的电平问题调试SCI时我用了一款常见的USB转TTL模块标称支持3.3V电平但实测模块输出高电平在3.0V左右而F28P55x的GPIO输入高电平阈值是0.7×VDDIO3.3V供电时约2.31V看起来是兼容的可问题是模块的RX引脚连接MCU的TX内部有LED指示灯LED的压降会把信号拉低导致MCU的TX信号经过模块后波形畸变上位机收不到完整的帧。我之前用的模块也踩过这个坑后来换了一款不带指示灯的模块或者直接把模块上的LED拆掉通信立刻稳定了。还有一点USB转TTL模块和板卡必须共地如果两边各自用不同的USB口供电地电位不一致会导致串口数据完全乱码甚至烧坏引脚。共地是串口调试最容易忽略但又最关键的一步。5.3 SCI回环自测判断故障在哪一侧SCI不通时最快的方法就是做回环测试将MCU的SCI_TX引脚直接短接到SCI_RX引脚用上位机发送数据然后看MCU能否收到自己发出去的数据。如果回环正常而连接外部设备不正常问题肯定在外部设备或连接线上如果回环都不正常那就要查MCU的SCI配置和GPIO复用设置。我在F28P55x上做回环测试时发现一个特殊情况DMA模式下SCI的FIFO中断标志位和普通模式不同。如果用DMA搬运接收数据必须正确配置SCI_clearRxFIFOInterruptStatus()之类的操作否则中断标志不清理DMA永远只进第一次数据。这种问题在数据量小的调试阶段根本暴露不出来一旦跑大批量传输就卡死。所以建议前期先不用DMA直接用查询或中断方式跑通协议再上DMA优化。Flash烧录与代码保护连不上仿真器最让人冒汗的一课6.1 烧录后不能再次连接的CSM锁死问题C2000系列有一个Code Security ModuleCSMF28P55x也一样。CSM的作用是防止别人通过JTAG读出Flash内容。CSM有一组密码存放在Flash特定地址默认值全是0xFF也就是不锁定。但工程中如果某个链接脚本或者烧写配置不小心把0写进了密码区芯片就会被锁住突出表现是能连接仿真器但无法读取/写入Flash连接时CCS会提示“Secure device”或“Device is locked”。我被这个问题卡了整整一个晚上。排查过程一开始以为是仿真器问题换仿真器无效以为是JTAG接线问题重新焊接无效最后用UniFlash连接发现芯片状态显示“Locked”才意识到是CSM锁死了。恢复方法也不是没有如果密码本身没变比如上电复位后CSM密码寄存器读出来还是0xFF可以清空整个Flash来解锁但如果是程序运行过程中自己往密码区写了值那就真的很难救回来了只能换芯片。6.2 连接时自动执行程序导致的烧写失败F28P55x和很多C2000芯片一样仿真器连接时可以设定是否在连接后自动运行程序。如果你在工程调试配置里勾选了“Connect - Reset - Run”那么连接后芯片马上开始运行Flash里的旧程序而如果旧程序里又配置了把CPUI引脚用作GPIO之类的操作烧写Flash时仿真器控制不住内核就会报擦除失败。正确的调试烧写流程应该是连接仿真器前先把目标板断电在CCS的Debug Configuration里选择“Halt”模式让连接后内核保持停机连接成功后先擦除Flash再烧写新固件烧写完成后再全速运行。我之前有一块板子反复烧录不进去最后发现就是刚才提到的“连接后自动运行”选项开着烧录器每次连上后旧程序先跑了起来Flash保护位也被旧程序重新配置了。改成Halt模式后一次成功。6.3 掉电后连不上从UniFlash、恢复模式到最后的开源仿真器还有一种更极端的情况掉电之后仿真器完全连不上连查看芯片ID都不行。这种通常不是CSM锁死而是供电时序问题——XDS110在复位释放瞬间给目标板供的电流不够MCU没有完全复位JTAG TAP处在未知状态。这种情况我试过几种自救方法按住复位引脚不放先启动仿真器连接再松开复位利用boot ROM的等待窗口让仿真器抓时钟改用UniFlash命令行烧写UniFlash对连接时序的处理和CCS Debug略有不同有时能连上给目标板单独供电断开仿真器的供电引脚用外部稳压电源给目标板供电避免XDS110的电流限制影响连接。以上方法都无效最后我用了一个体积很小的开源调试器基于CMSIS-DAP方案通过转接方式兼容JTAG竟然连上了。原因可能是这个调试器对目标板供电的电流要求更小上电瞬间不会拉垮复位时序。这个解决办法并不常有普适性但遇到类似情况时可以试试手头其他调试器而不要固执地认定是板子坏了。另外F28P55x和大部分C2000系列一样支持通过SCI boot模式启动。在普通JTAG无法连接时可以把boot引脚配成SCI boot模式然后用串口工具往芯片里下载一个小型RAM引导程序来解锁/擦除Flash。TI的官方文档提供了SCI Flash Kernel示例虽然配置过程有点繁琐但它是除了换芯片之外少数能“自救”的路径。我不想展开太多细节只想提醒这功能存在而且关键时刻能救命。如果你愿意折腾可以在板子设计阶段就把SCI boot的引脚引出来别像我一样在锁死之后满板子飞线找引脚。调试工具链与最后的建议7.1 手边值得常备的测试小工具整个项目调下来我最常用的工具不是CCS自带的分析器反而是一些很基础的东西工具使用场景备注逻辑分析仪24MHz采样率就够抓SCI、SPI、PWM波形验证时序我用的是USB逻辑分析仪便宜且够用万用表量电源、复位、引脚电平印象最深帮我在三分钟内找到悬空引脚可调直流电源排除USB供电不稳定因素看电流变化判断芯片是否在反复复位串口调试助手打印调试信息、发送测试指令SSCOM、XCOM均可重点看波特率和换行符设置UniFlashFlash烧写、检查芯片锁定状态建议命令行版本也装一份示波器100MHz以上查看ADC输入纹波、复位毛刺有时可用逻辑分析仪替代常见问题串口调试助手打印日志卡顿、丢包多数是因为串口缓冲区太小或者上位机软件的显示刷新不及时。我一般用SSCOM的分行显示加时间戳功能能直观看到数据是否连续。打印调试信息建议统一用#ifdef DEBUG包起来发布固件直接关掉避免串口中断拖慢实时控制。7.2 调试这件事复盘比调通更重要我踩过的坑不一定你都会踩但有几个原则是通用的第一别同时修改多个变量。有一次我怀疑PLL配置有问题顺手把GPIO初始化也改了最后定位花了三倍时间因为这两个改动互相干扰根本不知道问题出在哪个。第二把寄存器配置和硬件原理图对应起来看。不要只看代码逻辑要拿芯片手册的原理框图对照着查引脚内部结构。第三测试程序要写得很“笨”就是把现象直接反映出来。比如点亮一个LED表示某个外设初始化完成收到一帧数据就翻转一次引脚用这种“笨办法”比任何高端调试器都直观。如果你也是刚开始用TMS32F28P550这颗芯片建议先把最基础的GPIO翻转跑通然后依次点亮SCI、ADC、PWM、Flash烧写一步一个脚印地来。芯片本身不复杂复杂的是我们对它的误解和急于求成的心态。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →