尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

TMS320F28335 DSP开发资料包与学习路线:从CCS4.2搭建到CAN通讯例程

TMS320F28335 DSP开发资料包与学习路线:从CCS4.2搭建到CAN通讯例程 简介本资源是面向嵌入式开发初学者与DSP应用工程师的TMS320F28335全栈学习包聚焦C2000系列数字信号控制器的硬件理解、外设驱动开发与CCS集成环境实践。压缩包共43.38MB整合了官方核心文档含技术手册、应用手册及20余份TI经典SPRA/SLVA系列技术文献与CCS4.2兼容的基础实验工程源码覆盖LED流水灯、ADC采样、SCI串口通信、步进电机控制、EEPROM读写、LCD12864显示、PWM模拟DAC、Flash启动配置等15类典型外设实验每个工程均含可直接编译运行的完整工程文件与必要注释。资料结构清晰兼顾理论支撑与动手验证特别适合从零搭建F28335开发环境、理解ePWM/ADC/SCI等关键模块底层逻辑并为电机控制、电源管理等工业应用打下坚实基础。目前已有520人学习下载。 说实话做嵌入式开发这些年最怕的不是某个寄存器调不通而是资料散落得到处都是手册下了一堆没时间看例程找到一个却不匹配当前的编译环境。我手里这套TMS320F28335资料包就是在这种背景下整理出来的包括官方技术手册、应用手册以及一套能在CCS4.2里直接编译下载的基础实验例程工程文件。这篇文章就顺着这套资料把F28335的学习路线、关键外设、CCS4.2的搭建踩坑以及例程从点灯到CANA通讯的实操过程完整梳理一遍给刚入手C2000系列的朋友一条可以直接照做的路径。我先说结论这份资料本身解决的是信息聚合的问题。F28335不是新芯片但它的生命力在工控和数字电源领域非常强官方文档动辄几百页新手很容易迷失。而CCS4.2虽然老但配套的例程在旧版编译器下编译最省心。如果你手里的工程是从ControlSUITE或老项目里扒出来的用新版本CCS打开反而会有一堆兼容性报错。所以这份资料的核心价值就是帮你省掉找资料、配环境、改例程这三个月入门期里最消耗耐心的环节。1. 资料包里到底装了什么以及这些文件该怎么看1.1 面向的使用人群与学习路线这份资料包不是给你收藏的是给你照着做的。它面对的典型人群有两类一类是学校或研究所里刚接手DSP项目、需要快速上手F28335的在校学生另一类是从单片机转过来、之前只玩过STM32或AVR、第一次接触C2000系列的老工程师。如果你是前者建议的路线是先花两天时间把技术手册里芯片特性那一章通读一遍不需要记住所有参数但要对150MHz主频、浮点运算单元、ADC、PWM、QEP这些关键字形成印象。然后打开CCS4.2把例程工程一个个编译、下载、跑通从GPIO点灯开始一步步往定时器、ADC、PWM、CAN方向走。如果你是后者可以直接跳到手册里的寄存器部分配合例程中的初始化代码对照着看效率最高。资料包的目录结构我用了分层方式最外层是0_开始阅读里面放了一篇我后来补写的README把每个文件是干什么的、先看哪个后看哪个写清楚了然后是1_技术手册、2_应用手册和3_例程工程三个文件夹。这样的好处是你不用在几十个PDF里反复翻找拿到手就知道下一步干什么。1.2 技术手册和应用手册的正确打开方式很多人分不清技术手册Datasheet和应用手册Application Report的区别这里多说一句。技术手册指的是TMS320F28335的Data Manual即SPRS439它描述的是芯片的引脚定义、电气特性、封装信息、绝对最大额定值以及系统主频、ADC转换时间、Flash擦写寿命这些硬指标。你画原理图时查引脚、设计电源时查电压范围、做热设计时查功耗都在这一本里。而应用手册是TI工程师编写的针对具体场景的设计指南例如如何设计电源电路、如何处理ADC参考电压、如何使用CAN总线进行多机通讯等。它们通常名字里带Application Report编号是SPRAxxx或SPRACxx。这套资料里的应用手册重点收录了几篇F28335的电源设计指南、ADC精度校准相关文档以及C2000在电机控制中的参考设计。这些文档的价值在于给你一个官方验证过的方向而不是让你自己从零摸索。提示技术手册中的电气参数表格看起来枯燥但原理图设计阶段不吃透后面硬件调不通时再回来翻就晚了。尤其是3.3V工作时IO引脚绝对最大额定值、ADC输入阻抗这些直接影响外围电路取值。2. TMS320F28335核心特性速览新手上路先抓这几个关键词2.1 浮点DSP加上丰富外设为什么到今天还有人选它F28335是TI C2000系列里相当经典的一款32位浮点DSP主频最高150MHz单精度浮点运算单元让它在电机控制、数字电源等需要快速处理大量浮点运算的场景里非常顺手。和同系列的定点芯片F2812相比F28335的浮点运算不需要软件做Q格式转换代码写起来直观得多精度损失也小。从外设角度看F28335拥有16通道12位ADC最快转换时间约80ns6个ePWM模块含高分辨率PWM通道即HRPWM能输出带死区控制的互补PWM直接驱动MOSFET或IGBT两个正交编码器接口QEP配合增量式编码器做电机转速检测此外还有3个SCI即UART、1个SPI、1个I2C、1个McBSP、2个CAN控制器模块以及外部接口XINTF可以扩展SRAM或并行设备。对大部分工控项目来说一颗F28335就能把采样、控制、通讯、驱动全包了。2.2 外设全景与地址映射的底层逻辑看F28335的寄存器和单片机最大的不同在于它的外设都是内存映射的。也就是说寄存器有固定的地址你看代码里操作某个外设时本质是在向某个地址写数据。C2000的工程里普遍会用#define定义寄存器结构体比如EPwm1Regs.TBCTL.bit.CTRMODE 2这行代码最终编译出来就是往某个地址的某个位写值。F28335的内存空间分为程序空间和数据空间两者是独立编址的这个特性和哈佛架构相关。Flash起始地址是0x300000SARAM从0x008000开始外设帧0/1/2分别映射在0x6000、0x7000和0x9000附近确切地址以头文件为准。建议新手上手时用CCS的Memory窗口实际观察几个寄存器的地址变化比自己死记地址表有效得多也能理解为什么Linker CMD文件里要专门分配内存段。2.3 大家都在问的CAN通讯F28335到底支不支持直接回答这个热词支持而且F28335不是简单支持是内置了两路CAN模块。这两路模块在TI文档里叫eCAN兼容CAN2.0B协议支持标准和扩展帧格式每个模块有32个可配置的邮箱可以独立设置为发送或接收还可以做ID过滤。这意味着用F28335做多节点工业总线通讯硬件层面上完全够用不需要外挂独立的CAN控制器芯片。需要理解的一点是F28335内部集成的只是CAN控制器它对外输出的信号是CANTXA和CANRXA这样的数字电平不能直接接到CAN总线上。要想真正组成差分总线还必须外接CAN收发器常见的选型有TI的SN65HVD230/232或者带隔离的ISO1050。在例程工程里我放了一份eCAN回环测试的代码它内部把发送邮箱和接收邮箱连起来Loopback模式不需要外部收发器就能验证初始化是否正确非常适合刚接触CAN通讯时用来调试。3. CCS4.2开发环境搭建老版本IDE的正确用法3.1 为什么还在用CCS4.2新版本它不香吗很多人一上来就问为什么不用最新版的CCS原因很现实F28335的老例程特别是那些基于早期ControlSUITE版本的工程使用CCS4.2里的编译工具链C2000 Code Generation Tools 6.x编译几乎零改动就能过。而新版CCS一般会绑定更新版本的TI编译器打开老工程时容易因为编译器版本不兼容报出一堆#error或者unrecognized pragma这类莫名其妙的错误。其次CCS4.2基于Eclipse框架界面和操作逻辑对国内开发者来说非常熟悉配置工程时也直观。虽然它在Windows 10以上系统偶尔会有窗口刷新问题但通过设置兼容模式运行Windows 7模式实测下来相当稳定。如果你的电脑配置不高CCS4.2比新版CCS更轻量编译F28335这种中型工程基本不会卡。3.2 从安装到仿真器连接逐步走一遍安装CCS4.2不算复杂重点是安装时选中C2000编译器组件不需要把所有的芯片系列都装一遍。为了稳妥我建议在安装时选择Custom模式勾选C2000 Tools。仿真器和目标板的连接上最常用的搭配是XDS100v2加F28335核心板。XDS100v2是TI早期主推的低成本仿真器使用USB接口速度够用。接好线后打开CCS选择Target Configuration新建一个配置文件选择XDS100v2作为仿真器芯片型号选TMS320F28335。这一步配置好后点击CCS菜单里的Test Connection按钮系统会尝试建立JTAG链路返回连接成功就说明环境没问题。注意XDS100v2用的是14针或20针JTAG接口接线时一定要确认目标板上的JTAG插针定义和仿真器一致。最常见的连接失败原因不是仿真器坏了而是TMS、TCK、TDO、TDI这几根线的顺序没对齐。3.3 工程文件导入时的三个典型坑位第一坑是工程路径。CCS4.2对中文路径和带空格的路径支持不友好建议把整个工作区放在一个纯英文路径下比如D:\DSP\workspace。如果你是从压缩包直接解压后双击打开工程路径又带有中文编译阶段会报cannot open file之类的错误。第二坑是编译器版本不匹配。打开老工程后进入Project Properties查看编译器版本。如果CCS默认使用新版本编译器建议在Properties里修改为工程原始记录中使用的版本或者在CCS安装目录里把对应的编译器注册进来。这一步是例程能否一次性编译通过的关键。第三坑是头文件路径。F28335的例程通常会引用DSP2833x_common和DSP2833x_headers两个目录下的头文件它们分别在工程目录下的common/include和headers/include里。如果导入工程后报找不到头文件的错误重点检查Properties - C/C Build - Include Options里的路径是否已经包含了这两个目录。4. 基础实验例程逐个讲从点灯到ADC采样4.1 GPIO点灯第一个程序也是检验环境的唯一标准任何嵌入式开发都是从点灯开始的F28335也不例外。例程里LED_Blink工程做的事情很简单把某个GPIO配置为输出然后在一个死循环里交替写高写低让LED闪烁。这个工程虽然简单但它验证了工程创建、编译下载、仿真器运行、IO配置这整条链路是否通畅。F28335的GPIO是复用的复用关系在GPxMUX寄存器的对应位里配置。例如GPIO0默认功能是EPWM1A如果你要把它当普通IO用就要把GPAMUX1寄存器中GPIO0对应的两位设为0同时通过GPADIR寄存器将方向设为输出。例程代码里这几行配置就是干这个的。写这个工程时建议不要直接用GpioCtrlRegs里的整段宏定义而是手动打开寄存器头文件逐个位搞清楚再改这对后续操作ePWM、QEP等复用外设非常有帮助。4.2 定时器中断时间基准从哪里来点灯程序跑通后第二个必做的例子是定时器中断。F28335内部有3个32位CPU定时器编号为CPU-Timer0、Timer1、Timer2。其中Timer0最常用它挂在CPU时钟上可以配置预分频和周期值到时间后触发中断。关键在于周期值的计算。CPU时钟是150MHzTimer0的预分频器是固定的默认1分频所以周期值就等于定时秒数乘以150MHz再减一。例如想产生1秒中断周期值就是150000000 - 1十六进制表示即0x8F0D180 - 1。例程里一般在InitCpuTimers()里调用ConfigCpuTimer()函数这个函数接收定时器地址、定时秒数浮点数和主频三个参数内部自动计算周期值。你只要会算这一笔账后面做任何周期性控制比如PID周期、采样周期心里都有谱。4.3 ADC采样从电压到数字量要多加小心ADC例程是这套资料里含金量比较高的部分。F28335的ADC是12位逐次逼近型输入范围0到3.3V内部有2个采样保持器16个输入通道分成A组ADCINA0到ADCINA7和B组ADCINB0到ADCINB7。例程通常使用级联模式即把A组和B组串成一个16通道的排序器依次采集设定的几个通道。ADC初始化里有个容易忽略的点模拟电路上电后的稳定时间。F28335的ADC要求上电后至少等待几十微秒再开始转换否则第一次采样的结果可能不准。典型代码是先把ADCTRL3里的ADCPWDN位置1给ADC模块上电然后加个延时再设置采样窗口和触发源。触发方式也值得注意工程里常用ePWM来定时触发ADC采样好处是采样时间点和PWM周期严格同步这在电机控制和数字电源里几乎是标配做法。你要理解这个触发链ePWM时基计数器到达周期值时发出SOC信号ADC收到SOC开始转换转换完成后产生中断在中断里读取结果寄存器。果你在电压过零、电流过流等场景想用这个例子保持同步触发的方式别改成软件启动ADC否则控制时序会乱掉。4.4 PWM和HRPWM电机控制的基础输出基础实验里还有一个PWM例程用ePWM模块产生固定频率、可调占空比的方波。F28335的ePWM模块包含时基TB、比较器CC、动作AQ、死区DB、斩波PC、故障保护TZ这几个子模块。例程中最常规的操作是配置时基周期值决定PWM频率配置比较寄存器CMPA决定占空比配置AQ子模块让PWM在计数器递增到CMPA时拉高、达到周期值时拉低。频率和占空比的计算公式同样要自己盯着一遍。如果PWM时钟是75MHz150MHz经CLKDIV和HSPCLKDIV分频后时基周期值设为7500则PWM频率是75MHz/(2*7500)5kHz。占空比由CMPA和周期值共同决定CMPA周期值一半时正好50%。死区寄存器DBCTL里可以设置上升沿延迟和下降沿延迟这两个时间在驱动半桥或全桥电路时不可或缺设置值等于你需要的死区时间乘以PWM时钟周期。如果项目里要用到高分辨率PWMF28335的HRPWM功能可以将边沿精度从4ns左右提升到200ps级别它的原理是通过对时基时钟边沿做微调利用内建的MEP步进来实现。这个精度对数字电源的移相全桥、LLC等拓扑非常关键。例程里有一份HRPWM_UP_DOWN工程配合示波器看波形能直观感受到普通PWM和HRPWM的差别。5. 例程之外的实用扩展串口、CAN与项目化改动5.1 SCI串口调试永远是你最忠实的伙伴工程调试阶段点一两个LED远远不够你需要把变量值、状态标志、错误码发出来看。F28335的SCI模块通俗说就是UART串口例程里有一个简单的回环通信把接收到的数据原样发送回去用上位机串口助手就能验证收发是否正常。SCIA的波特率计算用这条公式BRR LSPCLK / (8 * 波特率) - 1其中LSPCLK一般是系统时钟150MHz的4分频即37.5MHz。如果目标波特率是9600代入算出BRR后取整写入SCHBAUD和SCLBAUD寄存器。注意边界情况当BRR计算结果小于1时SCI会自动进入16倍过采样模式这时候公式里应该用16代替8。这个细节容易被忽略导致低速波特率传输异常实际排查时却怎么都找不到原因。5.2 eCAN通讯例程跑通之后还有几个问题要处理如果你之前从没用过CAN建议先把例程里的eCAN回环测试跑通。回环模式下发送邮箱的数据会被CAN模块内部自动转发到接收邮箱你不需要外接任何CAN节点就能在CCS变量窗口里看到接收到的数据是否正确。这一步能验证邮箱配置、消息对象、中断回调函数是否正常工作。从回环模式切换到正常模式后事情就变得复杂起来。首先你得外接CAN收发器其次要保证总线波特率和目标节点一致。位时间参数的配置在eCAN例程里一般通过CANMC寄存器里的Bit Timing寄存器实现比如设置预分频、时间段1和时间段2的长度。很多人在这里会翻车明明两端都设成500kbps但总线一直报错。大概率原因是采样点的位置不对CAN协议要求采样点尽量靠后推荐设置在75%到80%左右这样的话总线传输距离和抗干扰性才平衡。F28335的eCAN邮箱分配也算个小难点。32个邮箱Mailbox 0到31每个邮箱都可以配置为发送或接收通过CANME寄存器使能、CANMD寄存器设定方向、CANTRS寄存器请求发送。项目里常见的做法是0到15号邮箱做发送缓存16到31号做接收缓存并通过CANMIL寄存器把接收中断映射到两个不同中断线上一个高优先级一个低优先级。例程里我注释了这种分配思路方便你扩展成多节点通讯。5.3 从例程到工程改代码前先做好这三件事很多时候例程跑通只是第一步真正要做的是把它改造成符合自己项目形态的工程。我的建议是不要直接在例程上东拼西凑先做好三件事。第一件是制作一个基于你板子的Board_Init模块把GPIO复用、时钟选择、外设上电这三级初始化集中管理。第二件是建立统一的数据结构比如ADC采样结果数组、PWM占空比更新变量、CAN收发消息结构体用结构体定义好后续维护起来省心得多。第三件是给每个外设初始化函数加上返回值或者状态标志方便调试时定位卡在哪一步别让初始化代码写成一长串没有反馈的调用链。这三件事做完例程代码就能从演示工程过渡到项目雏形你后面加控制算法、加通讯协议框架都会轻松不少。6. 常见问题与排查技巧实录6.1 仿真器连接不上目标板先别怀疑仿真器坏了这里把最常见的JTAG连接问题整理成一张速查表方便你照着排查现象可能原因解决方法Test Connection 提示找不到目标JTAG线序接反核对TMS、TCK、TDO、TDI插针定义重新插拔目标板供电不足仿真器无法给板子供电给目标板单独接电源示波器验证3.3V电压正常芯片进入低功耗模式时钟配置或GPIO配置异常按住复位键连接或在CCS配置里启动连接时复位芯片仿真器驱动未安装XDS100v2驱动丢失重装驱动确认设备管理器里出现XDS100类设备我自己调试时一个比较有效的习惯是先用CCS自带的Test Connection反复测试确认能连上后再加载程序。如果连接不稳定检查一下USB线是否过细过长换一根带屏蔽的短线成功率明显更高。6.2 编译错误头文件、宏定义和内存段F28335的老工程里最闹心的编译错误基本集中在两类。一类是找不到头文件解决办法在3.3里已经讲过了不再重复。另一类是Linker阶段报内存溢出或内存段不匹配典型的是程序烧进Flash后运行而例程默认是仿真模式RAM运行这就要用Flash版本的CMD文件替换RAM版本的CMD文件同时把一些需要拷贝到RAM中运行的函数标志#pragma CODE_SECTION调整一下。项目里如果发现RUNTIME报错或者执行到某个函数时程序卡死大概率是这段代码没有正确搬移到RAM。还有一个容易被忽略的坑F28335的Flash编程需要在RAM中运行闪存烧写API函数如果工程是从Flash启动你还需要把Flash API函数库链接进来并把InitFlash()函数在main开头调用。这部分在例程的Example_Flash工程里我有详细注释照着改就对了。6.3 烧录后不运行Boot模式引脚要先搞清楚F28335上电后处于哪个启动模式是由GPIO85、GPIO86、GPIO87三个引脚当时的电平状态决定的。典型配置是三个引脚全部拉高进入Flash启动模式这是最常用的方式三个引脚全部拉低则进入SCI启动模式用于串口烧写。如果你烧录后程序不跑先检查这几个引脚上的上下拉电阻是否和你的启动方式匹配。另外上电时序也很关键。如果在CCS里点了Load Program和Run之后程序不启动试着在复位后暂停CPU再全速运行许多情况下是触发条件没满足导致的。把这两个步骤分开做比一上来就全速运行更容易定位问题。6.4 另外一个经验善用CCS的寄存器窗口和Graph工具调试F28335时我最常用的是CCS的Register窗口和Graph工具。寄存器窗口可以实时看到每个外设寄存器的值配合单步执行你能清楚地看到一条C语言语句背后寄存器如何变化。Graph工具则可以把ADC采样缓冲区或DSP计算出来的波形数据用曲线形式显示出来这在调电机电流波形、电源输出电压波形时价值极高。用Graph工具的前提是你在代码里设置好要观察的内存地址和数据长度然后在菜单里新建Graph视图。这项工作花十分钟配置后续调试效率能提升一个档次。结束语这套资料整理下来我最想传递的一个观点是资料的价值不在于存储而在于把资料变成动手能力。技术手册、应用手册给了你正确的方向CCS4.2例程给了你一个已验证的起点剩下的路要靠一行一行代码去走。个人经验是当初我在F28335上卡得最久的地方既不是CAN也不是PWM而是刚拿到板子时连仿真器都连不上后来静下心把所有手工焊接的JTAG线重焊了一遍才恍然大悟。所以如果你现在也卡在某个看似奇怪的问题上先检查物理连接、电源、时钟再回头看代码。把这些基础层面的坑踩平了后面的开发路会顺畅得多。本文还有配套的精品资源点击获取
返回列表