首页 / 资讯中心 / 文章详情

CCS使用教程:DSP工程导入、仿真器连接与Flash烧录全攻略

CCS使用教程:DSP工程导入、仿真器连接与Flash烧录全攻略 ★ FEATURED ARTICLE
很多人第一次接触DSP开发最煎熬的往往不是外设寄存器而是卡在CCS这个工具本身装完软件不知道工作空间选哪别人发来的工程导不进去编译刚过接上仿真器又死死卡在initializing: icepick_c_0折腾到半夜最后连程序到底烧没烧进Flash都说不清。这篇CCS使用教程只讲三件事——工程导入、连接DSP、烧录把它们背后的原理和常见报错一次性讲透。文中以C2000系列最常见型号如TMS320F28379D、TMS320F28335为例展开但思路同样适用于C6000和部分老C5000平台适合刚接手DSP项目、手里有板子但没踩平工具坑的开发者和学生。1. 选择CCS版本与工作空间很多人从第一步就埋了雷1.1 经典版和Theia版选哪个不取决于你的喜好而取决于芯片现在CCS大致分两个阵营CCS 6.x到12.x这类基于Eclipse内核的经典版以及CCS 20.x这种界面长得更像VSCode的新版Theia。很多教程只教你下载最新版可工程是从两三年前的同事电脑里拷出来的里面指定了老版本编译器路径和旧版SDK一导入就是满屏红叉。我的建议很简单先打开工程里的README或者.projectspec文件看它有没有写明可用的CCS版本范围。老工程用老版CCS打开往往最省事老库、老编译器和老配置文件配套齐全。如果你手里的芯片是28379D这类新C2000型号新版CCS当然没问题但旧CCS 6.1配合老例程调试28335我也用了很多年稳得很。机器上留两个版本并不冲突但不要为了“尝鲜”一家伙装四五个光工作空间冲突就够你烦一周。安装时还有个小细节部分杀毒软件会把CCS的USB驱动组件或xds仿真器驱动当可疑文件拦掉导致仿真器插上后设备管理器里永远不出现TI设备。我实际遇到过两回关掉实时防护重新安装或修复一下驱动组件就能解决。当然装完软件之后杀毒软件开回来日常使用没有冲突。1.2 工作空间放哪直接决定了你以后会不会“突然炸掉”CCS启动时会让你选一个workspace很多人直接回车用默认路径也就是C盘用户目录下的某个workspace_v10文件夹。问题在于Windows C盘分区一旦空间吃紧、清理工具一跑工程路径和缓存文件就可能出问题之后CCS启动就开始报workspace in use或工程做“失效”处理。我现在的习惯是在非系统盘单独建一个专门目录比如D:\ccs_ws\v12启动CCS时点Browse选到那里。以后每次要改工作空间用菜单里的File - Switch Workspace就能切换。不同大版本的CCS我绝对不让它们共用同一个workspace因为.metadata目录里的插件状态、布局文件跟CCS版本强相关两个版本混用极易出现菜单消失、Target Configuration列表异常等莫名其妙的问题。工作空间路径里不要有中文也不要包含空格。TI的老版编译器和makefile对路径空格的支持不够到位工程在一台机器上编译正常换台机器放到带空格的路径下立刻报错。这个问题很隐蔽看到gmake: No such file or directory时多数人第一反应是编译器坏了其实是路径里那个空格惹的祸。1.3 别人给的工程怎么导入复制进来还是引用原路径这一问最关键拿到一个或一整包DSP工程在经典CCS里的操作路径是Project - Import CCS Projects - Select search directory指定搜索目录后CCS会自动识别所有可导入的工程并列出勾选、Finish即可。新版Theia界面稍有不同但也在File - Import - Import CCS Projects里。这里有个隐藏选项需要想清楚导入界面里有机会选择“把工程复制进当前workspace”还是“保持原路径引用”。如果你拿到的工程就在U盘或同事电脑的某个目录里我强烈建议先整目录复制到自己的workspace下再以“复制”方式导入。否则CCS保存的是原路径引用哪天那份工程被移动、删除你的项目就会全线飘红连个可执行的.out都生成不了。反过来如果你确实需要多个工程引用同一份公共源码那再考虑“引用”方式但必须接受原始目录不能随便动的限制。导入之后满屏红叉八成逃不过这三个原因器件型号没选对、编译器版本不一致、include路径失效。先右键工程进Properties - CCS General核对当前Device到底是28379D还是28335再检查Build - Tool Chain里选的编译器版本和原工程声明是否一致。而include路径问题需要到编译器的Include Options里逐个看绝对路径是否还存在。我不建议在属性界面大改真到了这一步把工程删掉重新Import一遍往往更快因为导入动作本身会重新解析描述文件里的路径关系。2. 目标配置与仿真器连接连不上DSP的九成原因在这里2.1 .ccxml目标配置文件是连接的第一道关口CCS并不是插上仿真器就能直接识别目标芯片的中间要有一个“目标配置文件”做桥也就是.ccxml文件。在菜单View - Target Configurations打开视图右键新建配置。类型选择上XDS110或XDS100v2这类现实调试器都要选家族选C2000Device那一栏再精确到具体型号保存后这个文件就成了当前工程的连接依据。别小看这一步器件型号选错很常见。有人拿到的板子丝印是F28379DCCS列表里型号全名却是TMS320F28379D手滑选成F28379或F28377D后连接时报JTAG ID不匹配或者直接卡在扫描阶段连错误提示都看不太懂。配置好之后双击打开.ccxml文件并点击“Test Connection”CCS会对JTAG链路做一次扫描测试反馈 IR scan、IDCODE等状态。养成习惯每次换接线、换板子、重新插仿真器之后先进这个界面点一下Test再进Debug能省一晚上的冤枉时间。.ccxml本质是个XML文本里面记录了连接方式、仿真器序列号、芯片型号等字段。我一般会把常用的板子单独建一个“公共目标配置”目录放在workspace里新工程直接关联同一个文件而不是每建一个工程重新配一遍。换电脑后只要把这个文件带上导入工程时链接它即可。2.2 XDS系列仿真器驱动装没装先打开设备管理器看这一眼连接不上时先别急着进CCS打开Windows设备管理器看USB设备列表。XDS110插上去后通常会出现Texas Instruments XDS110 Debug Probe上面没有黄色感叹号就说明驱动正常。XDS100系列有些需要单独安装驱动包而不像XDS110一样随CCS一键装好。USB供电也是被低估的重灾区。前置USB接口或HUB供电不稳时仿真器指示灯亮得正常但连不上目标板Test Connection报Error -151。遇到这类错误把仿真器换到机箱后置USB口或者用带外部电源的USB HUB问题立刻消失。多套仿真器同时插在同一台电脑时CCS可能“选错”设备报一个指向不明的错误开发时就保留当前用的那一套或者到Target Configuration里显式指定仿真器序列号排除干扰。2.3 Test Connection都过了Debug还是卡死在“initializing: icepick_c_0”怎么查这是很多C2000开发者最头疼的一行日志CCS启动Debug Session时进入initializing: icepick_c_0状态。先解释一下ICEPICK是TI芯片内部调试扫描链的管理模块JTAG链路要先通过它才能最终访问到CPU。Test Connection能过说明最基础的JTAG扫描已经通了但卡在ICEPICK初始化意味着JTAG信号通到模块之后芯片CPU层面没能被正常“唤醒”。按我踩坑的经验排查顺序固定如下先量供电。C2000开发板一般有3.3V IO电源和1.2V或1.0V内核电源只量IO没量内核电就会被卡一下。板上核心电压点用万用表实测数值别只看电源指示灯。再看复位脚。如果复位信号悬空或被板上逻辑持续拉低CCS初始化时CPU一直处于复位态自然会卡住。检查JTAG四根线。TMS、TCK、TDI、TDO四条信号线尽量短杜邦线别捆成一团。我实测过线一超过15厘米且目标板比较老旧时卡在icepick的概率显著上升。尝试降低JTAG时钟频率。在.ccxml的调试模式里把默认频率从几MHz降到1MHz左右很多信号质量不理想的板子就这么救回来。核对芯片是否支持cJTAG。部分新C2000板子的调试接口使用cJTAG模式如果CCS配置里仍是标准四线JTAG扫描也有偏差需要按板卡资料切到对应模式。真实案例我曾经用杜邦线连一块28335核心板Test Connection怎么测都正常一进Debug就卡死。折腾半天后发现TDI和TDO两根线接反了。这类线序错误在扫描阶段不一定报但ICEPICK做内部链路切换时立刻露馅。所以遇到卡死先检查接线顺序这是最基础的硬件自查。3. 烧录的本质你往DSP里放的究竟是程序还是数据3.1 Debug加载不等于烧录别被“绿色小虫”骗了CCS调试界面里最显眼的是那个“绿色小虫”图标点一下就开始Debug。很多人以为这一下就把程序“烧进”DSP了实际上在绝大多数工程配置下它只是执行了Load Program把.out文件里的数据和代码段加载到RAM对应地址。CPU在RAM里跑得欢断电之后RAM清空板子回到出厂状态。问题的核心藏在链接器cmd文件里。工程里的cmd文件定义了RAM和FLASH两类段的物理地址分配。如果cmd文件把.text段指向RAM起始地址那么执行Load Program时程序就只进RAM跟Flash一点关系没有。哪怕cmd文件里同时定义了Flash和RAM加载动作也不等于把Flash固化你所看到的“加载”只是把对应地址的内容临时填了一遍。曾有人“调试正常”之后拔电再上电板子毫无反应于是怀疑芯片坏了折腾半天才发现根本就没烧过Flash。这种问题几乎每年都能碰上几次所以我建议每个DSP工程师都先把概念立住RAM调试负责验证逻辑Flash烧录负责产品掉电运行两者千万不能混为一谈。3.2 Flash烧录的完整链路链接脚本、编程工具、启动引脚一个都不能少要让程序真正固化到Flash里第一步是保证cmd文件正确。以C2000为例代码段.text、初始化数据段、.cinit等都要分配到片内Flash地址范围RAM段仍放RAM。这一步不对后面烧进去的只是零散数据上电后会直接跑飞或卡死。第二步是选对烧录工具。虽然部分CCS版本带On-Chip Flash菜单但实际项目里我更推荐用TI的独立工具UniFlash。流程很直接UniFlash中新建配置选择器件型号TMS320F28379D选择仿真器类型XDS110在Flash编程界面添加编译出来的.out或.hex文件点Program等待擦除、写入、校验跑完。第三步也是很多人最后才想起来的一步Boot方式。程序写好烧进Flash并不等于系统一定从Flash启动。C2000系列在复位时会采样一组Boot Mode引脚决定是从Flash引导、SCI引导还是别的接口引导。如果你板子的拨码还是停在“SCI启动”或“等待”上电后CPU自然不去执行Flash里的程序。28379D的LaunchPad上一般有启动方式切换开关换到Flash挡位再断电重新上电才能验证烧录结果。所以完整的流程是编译出.out → UniFlash或CCS烧录 → 烧录并校验 → 断开仿真器 → 把启动引脚切到Flash → 上电观察运行结果。少了最后两环前面的烧录都等于白做。3.3 28379D这类新平台的烧录差异安全区、双核、串口是老平台没有的坑28379D相对传统纯DSP多了许多新的注意事项。首先是安全区DCSM。芯片里某些Flash区域可以被配置为安全区一旦写入密码并锁定外部调试器就无法直接擦除或编程。如果你拿到一块带着旧配置的板子烧Flash时反复报写保护错误很可能就是DCSM造成的。处理办法是先做全片擦除若还不行就要查例程或数据手册里有没有设置过Zone密码。其次是多核问题。28379D内部有两个CPU核心调试时会看到多个core出现在列表里。烧录时要确定你正在操作的是CPU1还是CPU2每个核有自己独立的工程和.out。经常有人只烧了CPU1CPU2还是空的上电后系统整体不工作就懵了。连接时在Target Configuration里可以对多个核分别配置调试时也最好先确认当前默认进的是哪个核。如果你是从C6748这类平台转过来还可能会遇到串口烧录方式。C6748可以根据启动模式从UART引导这其实是很多成熟产品现场升级用的一种手段和JTAG烧录互为备份。它能工作的前提是Boot引脚拨到UART启动模式然后在PC端用对应串口工具把固件发送过去。比起JTAG烧录它少了仿真器依赖但传输速度和调试能力也弱得多。量产和现场升级会用到日常开发还是JTAG为主。4. 烧录失败排查链路与工程管理经验4.1 报错信息反查表从现象到环节的定位思路CCS报错信息看着又多又杂但按我经验高频错误就那么几个大部分能直接对应到具体环节报错信息常见原因处理方向Error -151 0x0仿真器未识别或驱动未装好重插USB、换后置接口、重装仿真器驱动Error -1135 0x0上一条调试会话未释放关闭所有调试会话重插仿真器必要时重启CCS卡在initializing: icepick_c_0供电、复位、JTAG线序或频率问题按2.3的顺序逐项排查C28xx: Error writing to flashDCSM安全区锁定、Flash命令错、电压不稳全片擦除、核对cmd地址分配、确认供电正常Verification failed at address 0x...写入数据和校验数据不一致降低烧录速度重试或换用UniFlash重新烧录另外有个现象容易误判某些量产工程会在Flash起始位置或用户数据区写一个标志字比如0xAA55启动代码在跑主程序之前会先校验这个标志用它判断Flash里的固件是否完整。于是调试串口里打出0xAA55 OK之类的信息。这表示引导自检已经通过不是烧录报错反而说明Flash里大概率有可执行代码。别看着是十六进制就当错误先翻代码里的引导逻辑。4.2 工程“搬家”的正确姿势路径改动不是复制粘贴那么简单工程换个电脑或换个目录最容易踩的坑是直接把整个工程文件夹拖到新位置然后双击.ccsproject打开。结果CCS的工程描述文件里可能记录的是原先的绝对路径编译器找不到头文件和链接文件报出一堆“无法打开源文件”“找不到文件”的错误。正确搬家的方式是先把工程目录整体复制到新位置再打开CCS使用Import CCS Projects重新导入。让CCS在导入过程中重建工程描述和项目关联而不是在资源管理器里“双击打开”。导入后进Properties检查一遍include路径。若原工程里用了一堆绝对路径比如C:\Users\xxx\Desktop\...跨机器之后必然失效需要改成相对于工程目录的相对路径。这是我在团队协作中反复强调的一点内部依赖永远用相对路径外部依赖统一放SDK包目录不把某台电脑的个人目录写进工程。另外建议把你的Target Configuration文件、cmd文件、SDK和编译器版本说明一起放进Git仓库。我在实际做多机协作时通常还会在仓库里放一个README.md写明“本工程用CCS 12.0、编译器TI v20.2.x、SDK版本4.03”新同事拉下来照着配不会一上来就编译爆炸。4.3 我个人常用的“保命”习惯供你直接抄做DSP调试这几年我总结了一套很朴素的固定动作基本杜绝低级翻车第一新建工程后第一件事就是建Target Configuration并保存成公共文件。新工程关联到同一个ccxml换电脑也不用重新弄。第二每次接仿真器后先Test Connection再进Debug。不要省这一步它能把一半连接问题拦在门外。第三烧Flash前备份.out文件同时记录烧录前板子的状态烧录完一定拔掉仿真器、切到Flash启动模式断电重新上电验证。第四JTAG线常备一根短而粗的排线别用两三米长的杜邦线飞线调试信号的可靠性直接影响初始化是否卡在ICEPICK。第五新板子第一次上电先量核心电压和复位状态再连调试器。很多看起来是“烧录失败”的问题最后查出来都是板子供电本身就不干净。近两年还常在CCS里配合使用VSCode风格的新界面但习惯上我还是保留老一套任何工具层面上的疑难杂症先复位、重插、再检查供电和线序。这一条主线我用了很多年能帮你绕开八成基础坑。
阅读完成 · 觉得有帮助?
咨询建站