ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

DSP28335环境配置与点灯实战:基于CCS 20的完整指南

DSP28335环境配置与点灯实战:基于CCS 20的完整指南 1. 为什么DSP28335的环境配置值得单独写一篇搞嵌入式的人都有一个共识环境配置是最没有技术含量、但最容易劝退人的环节。尤其是TI的C2000系列DSP28335作为经典款资料多但版本杂CCSCode Composer Studio的迭代又频繁很多教程还停留在CCS 3.3、CCS 5.x甚至CCS 6的时代。你照着老教程一步步走到了CCS 20会发现菜单栏都变了样新建工程的向导也完全不是一回事。我这次用的是CCS 20.1.1.00008_win这是目前TI官方主推的Theia架构版本和早期基于Eclipse的CCS在界面逻辑上有本质区别。网上关于CCS 20配置DSP28335的完整中文教程非常少大部分要么是CCS 12的要么是CCS 10的步骤对不上。所以我把从零开始配置环境到成功点亮第一个LED的完整过程记录下来包括踩过的坑和每个步骤背后的逻辑。这篇文章适合三类人第一类是刚拿到DSP28335开发板、完全不知道从哪下手的学生第二类是从STM32转过来、习惯了Keil或IAR那套流程、对CCS完全陌生的工程师第三类是之前用过老版本CCS、现在升级到CCS 20之后发现找不到北的老手。不管你是哪一类跟着走一遍基本能少折腾两三个晚上。核心关键词就几个DSP28335、CCS 20、环境配置、GPIO、点灯。点灯看起来简单但它验证的是整条工具链是否打通——编译器能不能用、仿真器能不能连、工程配置对不对、GPIO寄存器操作是否正确。这一套跑通了后面做PWM、ADC、SCI都是水到渠成的事。2. 环境配置的整体思路与方案选型2.1 为什么选CCS 20而不是老版本CCS的版本选择是个绕不开的问题。TI官方目前提供下载的版本包括CCS 12.x、CCS 20.x等老版本如CCS 6.1虽然网上教程多但存在几个硬伤一是对Win11的兼容性差安装过程中经常卡在驱动签名环节二是编译器版本老旧C2000的编译器已经更新到v22以上老版本CCS自带的编译器对C99标准的支持不完整三是调试器驱动对新版仿真器如XDS110的支持不好。CCS 20基于Theia框架本质上是VS Code的定制版带来了几个实际好处启动速度快相比Eclipse版快了一倍不止、界面更现代文件树、终端、调试面板的布局更合理、扩展生态兼容可以装VS Code的部分插件。当然也有代价——很多老教程里的菜单路径完全对不上了比如“Project → New CCS Project”在CCS 20里变成了“File → New → CCS Project”而且向导的交互方式也变了。注意CCS 20目前有在线安装器和离线安装包两种。强烈建议下载离线安装包大约1.5GB在线安装器在国内网络环境下经常断连而且安装过程中需要下载大量组件中途失败的概率很高。2.2 需要提前准备的东西在开始安装之前把以下东西准备好能省很多事DSP28335开发板一块我用的是普中科技的板子市面上常见的还有研旭、合众达的基本通用仿真器XDS100v2、XDS100v3或XDS110都可以。XDS100v2最便宜但速度慢XDS110速度快且支持更多芯片推荐优先选。注意仿真器接口要和板子匹配有的是14pin JTAG有的是20pin。USB线仿真器连接电脑用的注意有些廉价仿真器的USB线只供电不传数据换一根试试。CCS 20.1.1.00008离线安装包从TI官网下载需要注册一个TI账号免费。C2000Ware这是TI提供的外设驱动库和例程包后面新建工程时会用到。可以在CCS安装时勾选自动下载也可以单独从TI官网下载。开发板原理图这个非常重要点灯需要知道LED接在哪个GPIO上。不同板子的LED引脚不一样没有原理图就是盲人摸象。2.3 安装CCS 20的关键选择安装CCS 20的过程中有几个选择点需要留意安装路径默认路径是C:\ti\ccs2011建议保持默认或者改到一个没有中文、没有空格的路径。我试过装在D:\我的软件\CCS下面结果编译器调用时路径解析出错排查了半天才发现是中文路径的问题。组件选择安装向导会让你选择要安装的组件。对于DSP28335开发必须勾选的是C2000 Code Generation Tools编译器C2000Ware如果还没单独下载的话XDS Debug Probe Support仿真器驱动CCS Base核心组件默认已选其他如ARM、MSP430、SimpleLink等组件如果不需要可以取消勾选能省不少安装时间和磁盘空间。驱动安装安装过程中会提示安装仿真器驱动一定要允许。如果Windows弹出“未签名的驱动程序”警告选择“仍然安装”。这一步如果跳过了后面调试器连不上会非常麻烦。3. 从零开始CCS 20工程创建与配置细节3.1 新建工程的正确姿势打开CCS 20之后界面和VS Code非常像。左侧是文件浏览器底部是终端和问题面板中间是编辑区。第一次打开时可能显示的是欢迎页面直接关掉就行。新建工程的路径是File → New → CCS Project。这时候会弹出一个向导窗口几个关键选项需要仔细填Target在搜索框里输入“28335”选择“TMS320F28335”。注意不要选成“TMS320F28335-Q1”汽车级或者其他变体除非你用的确实是对应的芯片。Connection选择你实际使用的仿真器型号。我用的是XDS100v2就选“Texas Instruments XDS100v2 USB Debug Probe”。如果你用的是XDS110就选对应的。选错了后面调试时会报“no connection”的错误。Project name起一个有意义的名字比如“LED_Blink_28335”。避免用中文和特殊字符。Compiler versionCCS 20自带的C2000编译器版本一般是v22.x保持默认即可。如果你之前装过其他版本的编译器这里会列出多个选项建议选最新的。Project templates and examples这里可以选择一个模板作为起点。对于点灯来说选“Empty Project (with main.c)”就行。如果你想参考TI的官方例程可以选“C2000Ware”下面的GPIO例程但那些例程结构比较复杂新手容易看晕。填完之后点FinishCCS会自动生成一个空的工程结构。左侧文件树里会出现你的工程名展开后能看到main.c和一个.ccsproject文件。3.2 工程属性配置几个必须改的地方新建的工程默认配置不一定适合DSP28335有几个地方需要手动调整。右键点击工程名选择Properties然后逐项检查Include Options在“Build → C2000 Compiler → Include Options”里需要添加C2000Ware的头文件路径。假设C2000Ware装在C:\ti\c2000\C2000Ware_5_02_00_00那么需要添加的路径是C:\ti\c2000\C2000Ware_5_02_00_00\device_support\f2833x\common\includeC:\ti\c2000\C2000Ware_5_02_00_00\device_support\f2833x\headers\include这两个路径分别包含了公共头文件和寄存器定义头文件。没有它们编译时会报“cannot open source file DSP2833x_Device.h”之类的错误。Predefined Symbols在“Build → C2000 Compiler → Predefined Symbols”里需要添加两个宏定义CPU1表示使用CPU1核心_FLASH表示代码运行在Flash中如果是RAM调试则用_RAM这两个宏会影响DSP2833x_Examples.h里的条件编译不定义的话有些寄存器配置会走错分支。Linker Command File在“Build → C2000 Linker → File Search Path”里需要指定链接命令文件。DSP28335的Flash模式用F28335.cmdRAM调试用F28335_RAM_lnk.cmd。这些文件在C2000Ware的device_support\f2833x\common\cmd目录下。点灯程序一般烧到Flash里所以选F28335.cmd。Runtime Library在“Build → C2000 Linker → Basic Options”里Runtime Library选“rts2800_fpu32.lib”如果用到浮点运算或“rts2800_ml.lib”大内存模式。点灯程序用默认的就行。实操心得每次改完Properties建议先点“Apply and Close”然后手动触发一次编译Project → Build All看看有没有报错。不要等到写完代码再编译那样出了问题很难定位是配置错误还是代码错误。3.3 添加源文件和头文件一个干净的DSP28335工程通常需要以下文件源文件.cmain.c主程序DSP2833x_GlobalVariableDefs.c全局变量定义包含所有外设寄存器的映射DSP2833x_SysCtrl.c系统控制初始化DSP2833x_Gpio.cGPIO初始化DSP2833x_PieCtrl.cPIE中断控制DSP2833x_PieVect.cPIE中断向量表DSP2833x_CpuTimers.cCPU定时器点灯用延时的话需要头文件.hDSP2833x_Device.h设备总头文件DSP2833x_Examples.h例程配置头文件DSP2833x_GlobalPrototypes.h全局函数声明以及各外设对应的头文件这些文件都在C2000Ware的device_support\f2833x\common\source和headers目录下。最省事的做法是直接把整个common文件夹拷贝到工程目录下然后在CCS里右键工程 → Refresh再手动把需要的.c文件添加到编译列表里右键 → Add Files。注意不要把所有.c文件都加进去有些是互斥的比如DSP2833x_Adc.c和DSP2833x_Adc_Xintf.c不能同时加。点灯只需要上面列出的那几个就够了。4. 点灯实操GPIO配置与代码实现4.1 先搞清楚LED接在哪个引脚这一步很多人会跳过结果代码写完了发现灯不亮以为是程序问题其实是引脚搞错了。打开开发板的原理图找到LED部分。以我手头的板子为例LED的阳极通过限流电阻接到3.3V阴极接到GPIO34。也就是说GPIO34输出低电平时LED亮输出高电平时LED灭。不同板子的接法可能相反有的LED是阳极接GPIO、阴极接地那就是高电平亮。所以一定要看原理图确认。如果你手头没有原理图可以用万用表测一下板子上电后用万用表二极管档测LED两端或者直接写个程序让所有GPIO轮流输出高低电平看哪个灯会闪。DSP28335的GPIO分为A、B、C三组GPIO0-31属于A组GPIO32-63属于B组GPIO64-87属于C组。GPIO34属于B组配置时需要注意对应的寄存器。4.2 GPIO配置的寄存器逻辑DSP28335的GPIO配置涉及以下几个关键寄存器GPxMUX复用寄存器决定引脚是作为普通GPIO还是外设功能。点灯需要把对应位设为0GPIO模式。GPIO34在GPBMUX寄存器里对应bit 2因为34-322。GPxDIR方向寄存器决定是输入还是输出。设为1表示输出。GPIO34对应GPBDIR的bit 2。GPxSET/GPxCLR/GPxTOGGLE置位/清零/翻转寄存器这三个寄存器用来控制输出电平。写GPxSET对应位为1则输出高写GPxCLR对应位为1则输出低写GPxTOGGLE对应位为1则翻转当前电平。注意这三个寄存器是“写1有效”写0无效。GPxDAT数据寄存器也可以直接读写这个寄存器来控制电平但读-改-写操作可能影响其他引脚所以推荐用SET/CLR/TOGGLE。配置GPIO34为输出的代码大致如下EALLOW; GpioCtrlRegs.GPBMUX.bit.GPIO34 0; // 配置为普通GPIO GpioCtrlRegs.GPBDIR.bit.GPIO34 1; // 配置为输出 EDIS;EALLOW和EDIS是DSP28335的特殊指令用于保护关键寄存器不被意外修改。EALLOW解除保护EDIS恢复保护。GPIO配置寄存器属于受保护寄存器所以必须加这对指令。4.3 完整的主程序代码下面是我实际使用的点灯代码基于C2000Ware的例程结构改写#include DSP2833x_Device.h #include DSP2833x_Examples.h void main(void) { // 第一步初始化系统控制 InitSysCtrl(); // 第二步初始化GPIO InitGpio(); // 第三步配置GPIO34为输出 EALLOW; GpioCtrlRegs.GPBMUX.bit.GPIO34 0; GpioCtrlRegs.GPBDIR.bit.GPIO34 1; EDIS; // 第四步关闭CPU中断点灯不需要中断 DINT; InitPieCtrl(); IER 0x0000; IFR 0x0000; InitPieVectTable(); // 第五步主循环 for(;;) { GpioDataRegs.GPBCLEAR.bit.GPIO34 1; // LED亮 DELAY_US(500000); // 延时500ms GpioDataRegs.GPBSET.bit.GPIO34 1; // LED灭 DELAY_US(500000); // 延时500ms } }DELAY_US是TI提供的微秒级延时宏定义在DSP2833x_Examples.h里。它的实现基于CPU定时器需要确保InitSysCtrl()里已经配置了定时器。如果编译时报“DELAY_US未定义”检查一下DSP2833x_Examples.h里的#define DELAY_US(A)是否被条件编译屏蔽了。4.4 编译与烧录代码写完之后点击工具栏的锤子图标Build进行编译。如果一切正常底部的Console会显示“Build Finished”并生成.out文件。接下来是烧录。确保仿真器已经连接好开发板和电脑开发板已经上电。点击工具栏的虫子图标DebugCCS会进入调试模式。第一次调试时可能会提示更新仿真器固件按照提示操作即可。进入调试模式后点击绿色的播放按钮Resume让程序运行。如果一切正常你应该能看到LED以1秒的周期闪烁。常见问题如果点击Debug后报“Error connecting to the target”先检查仿真器驱动是否安装成功在设备管理器里看有没有“Texas Instruments Debug Probes”再检查开发板是否上电最后检查JTAG线是否插紧。有时候USB口供电不足也会导致连接失败换一个USB口试试。5. 常见问题与排查技巧实录5.1 编译报错速查表错误信息可能原因解决方法cannot open source file DSP2833x_Device.hInclude路径未配置在Properties里添加C2000Ware的include路径unresolved symbol _InitSysCtrl源文件未添加到工程把DSP2833x_SysCtrl.c添加到编译列表section .text will not fit链接命令文件选错Flash模式选F28335.cmdRAM模式选F28335_RAM_lnk.cmdDELAY_US undefined宏定义被屏蔽检查DSP2833x_Examples.h里的条件编译EALLOW/EDIS undefined头文件未包含确保包含了DSP2833x_Device.h5.2 调试器连接失败的处理思路调试器连不上是最常见的问题排查顺序如下第一步检查硬件连接。仿真器的JTAG接口和开发板的JTAG接口是否插紧开发板是否上电电源指示灯是否亮。有些开发板需要单独供电仅靠仿真器供电不够。第二步检查设备管理器。在Windows设备管理器里查看“通用串行总线控制器”或“端口”下面有没有仿真器设备。XDS100v2通常显示为“Texas Instruments XDS100v2 USB Debug Probe”XDS110显示为“XDS110 Class Application/User UART”。如果有黄色感叹号说明驱动没装好需要手动安装驱动驱动在CCS安装目录的ccs\ccs_base\common\uscif\xds100或xds110下面。第三步检查CCS的Target Configuration。在CCS里点击“View → Target Configurations”找到你的.ccxml文件双击打开。确认Connection选的是正确的仿真器型号Board or Device选的是TMS320F28335。可以点“Test Connection”按钮测试连接。第四步检查芯片是否被锁。如果之前烧录过程序把CSMCode Security Module锁了调试器会连不上。这种情况需要先解锁或者用“On-Chip Flash”工具擦除整个Flash。5.3 点灯不亮的排查步骤代码编译通过、程序也跑起来了但灯就是不亮按以下顺序排查确认GPIO引脚号再核对一遍原理图LED到底接在哪个GPIO上。我遇到过有人把GPIO34看成GPIO33的差一位就差很多。确认电平极性LED是低电平亮还是高电平亮把SET和CLR对调试试。用万用表测引脚电压程序运行时用万用表测对应GPIO引脚的电压。如果电压在高低之间切换说明程序没问题是LED电路的问题如果电压不变说明GPIO配置有问题。检查GPIO是否被复用有些GPIO上电默认是外设功能需要先配置为GPIO模式。确认GPxMUX寄存器对应位已经清零。检查EALLOW/EDISGPIO配置寄存器受保护没有EALLOW的话写入无效。实操心得我习惯在点灯程序里加一个“心跳”变量在调试模式下用Expressions窗口观察这个变量是否在变化。如果变量在变但灯不亮问题一定在硬件或GPIO配置上如果变量不变说明程序根本没跑起来可能是时钟配置或启动模式的问题。6. 从点灯延伸下一步可以做什么点灯跑通之后整条工具链就算打通了。接下来可以按这个顺序继续深入第一步按键输入。把另一个GPIO配置为输入接按键实现按键控制LED亮灭。这会涉及到GPIO输入配置和去抖动处理。第二步定时器中断。用CPU定时器或ePWM定时器产生精确的1秒中断在中断里翻转LED。这比DELAY_US的忙等待方式更高效也是实际项目中的标准做法。第三步SCI串口通信。配置SCI模块通过串口向电脑发送数据。这需要用到GPIO的复用功能配置把GPIO28/29配置为SCIA的TX/RX。第四步ePWM输出。配置ePWM模块产生PWM波控制LED亮度需要硬件支持PWM调光或者驱动电机。这是DSP28335最核心的应用场景之一。第五步ADC采样。配置ADC模块采集模拟信号结合PWM实现闭环控制。这一步开始涉及中断嵌套和优先级配置复杂度会明显上升。每一步都是在点灯的基础上叠加新的外设配置核心逻辑是一样的EALLOW → 配置寄存器 → EDIS → 使能外设 → 处理中断。把这套流程走熟之后DSP28335的大部分外设都能触类旁通。我个人在实际操作中的体会是环境配置阶段最值得花时间的是理解每个配置项背后的原因而不是机械地照抄步骤。比如为什么要加CPU1宏定义、为什么链接命令文件要分Flash和RAM版本、为什么GPIO配置需要EALLOW保护——搞清楚了这些后面遇到新问题的时候才有排查的方向而不是每次都要重新搜教程。
返回列表