2. DSP控制器基础:DSP芯片概述、TMS320F28335介绍、DSP开发环境搭建(CCS)、第一个LED闪烁程序

2.1 DSP芯片到底是什么?

很多刚入行的朋友问我:DSP和普通单片机有啥区别?

我一般这么解释:普通单片机像是个全能选手,啥都能干一点。DSP呢,它是个偏科生——特别擅长做数学运算。尤其是乘法和加法,它能在一个时钟周期内完成。

你想想看,在电机控制里,我们要做PID运算、坐标变换、SVPWM调制。这些全是乘加运算。用普通单片机做,算一个坐标变换可能要几十微秒。用DSP,几微秒就搞定了。

我个人习惯把DSP比作「数学加速器」。它内部有专门的硬件乘法器,还有哈佛结构——程序和数据分开存储,取指令和取数据可以同时进行。这就像两条高速公路同时跑车,效率自然高。

核心要点:DSP = 普通CPU + 硬件乘法器 + 哈佛结构 + 专用指令集

2.2 TMS320F28335——我用了十年的芯片

说到伺服驱动,TMS320F28335是绕不开的一颗芯片。我在2014年第一次用它做项目,到现在还在用。为什么?因为它太适合电机控制了。

来看看它的关键参数:

参数 数值 我的评价
主频 150MHz 够用,做双轴控制没问题
Flash 512KB 放一个伺服算法绰绰有余
SRAM 68KB 注意别把大数组放这里
PWM通道 18路 控制三个电机都够
ADC精度 12位 做电流采样刚好
eQEP 2个 接编码器用的,很关键

嗯,这里要注意一点:F28335是32位浮点DSP。这意味着你写PID的时候,直接用float算就行,不用像定点DSP那样做Q格式转换。我在第一个伺服项目里就吃了这个亏——一开始用定点DSP,Q15格式把我折腾得够呛。后来换成F28335,代码量直接砍了一半。

我的建议:新手入门伺服驱动,直接选F28335。别在定点DSP上浪费时间。浮点运算带来的便利性,远大于那点成本差异。

2.3 开发环境搭建——CCS的安装与配置

CCS全称Code Composer Studio,是TI官方的IDE。说实话,它不算好用,但没办法,F28335只能用这个。

安装步骤我快速过一遍:

  1. 去TI官网下载CCS,建议选v10或v12版本
  2. 安装时选择C2000系列支持
  3. 安装XDS100仿真器驱动
  4. 配置Workspace路径——我习惯用 D:\workspace\dsp

我曾经遇到过一个问题:装完CCS后连不上仿真器。折腾了两天,最后发现是USB驱动没装好。所以这里提醒大家:先装驱动,再开CCS。顺序反了容易出问题。

配置好之后,新建一个工程。选芯片型号时注意:F28335有好几个版本,比如PGFA、PGFQ。我一般选 TMS320F28335PGFA,这个最常用。

避坑指南:新建工程时,记得把 rts2800_fpu32.lib 加进去。这个库是浮点运算支持库,不加的话,float运算会出问题。我曾经因为这个库没加,查了整整一个下午的bug。

2.4 第一个LED闪烁程序

好了,环境搭好了,我们来写第一个程序。按照惯例,点个LED。

F28335的GPIO控制很简单。每个GPIO有3个寄存器:方向寄存器、数据寄存器、上拉寄存器。

看代码:

#include "DSP2833x_Device.h"     // 头文件
#include "DSP2833x_Examples.h"   // 例程库

void main(void)
{
    // 1. 初始化系统
    InitSysCtrl();
    
    // 2. 关闭看门狗
    EALLOW;
    SysCtrlRegs.WDCR = 0x00AF;
    EDIS;
    
    // 3. 配置GPIO34为输出(开发板上的LED通常接这个引脚)
    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO34 = 0;  // 设置为普通IO
    GpioCtrlRegs.GPADIR.bit.GPIO34 = 1;   // 设置为输出
    EDIS;
    
    // 4. 主循环
    while(1)
    {
        GpioDataRegs.GPASET.bit.GPIO34 = 1;   // 拉高,LED亮
        DELAY_US(500000);                      // 延时500ms
        
        GpioDataRegs.GPACLEAR.bit.GPIO34 = 1;  // 拉低,LED灭
        DELAY_US(500000);                      // 延时500ms
    }
}

代码很简单,但有几点我要强调:

  • EALLOW和EDIS:这是保护机制。写某些关键寄存器前,必须先EALLOW解锁。我见过有人忘了这个,寄存器写不进去,查了半天。
  • GPASET和GPACLEAR:用这两个寄存器操作IO,比直接写GPADATA更安全。因为它是原子操作,不会被中断打断。
  • DELAY_US:这是TI提供的延时函数。注意参数单位是微秒,500000就是500ms。

重要提醒:第一次下载程序时,记得把仿真器设置为「擦除Flash并下载」。否则程序可能跑不起来。具体操作:在CCS的Debug配置里,选择 Erase Flash + Download

2.5 本章知识体系

下面这张图,是我自己总结的DSP入门知识框架。你看一遍,心里就有数了。

DSP控制器基础 - 知识体系 TMS320F28335 DSP芯片概述 哈佛结构 硬件乘法器 专用指令集 F28335介绍 150MHz主频 32位浮点 ePWM/eQEP CCS开发环境 工程配置 仿真器驱动 Flash下载 LED闪烁程序

这张图把本章内容串起来了。你从DSP概述开始,了解它为什么适合做伺服控制。然后熟悉F28335的硬件资源。接着搭建CCS环境。最后跑通第一个程序。每一步都是下一章的基础。

个人经验:我教过不少新人,发现最容易卡住的地方是CCS环境搭建。如果你遇到问题,别硬扛。去TI的E2E论坛搜一下,或者直接换一个CCS版本。有时候v12不行,v10反而稳得很。

好了,这一章就到这里。LED能亮起来,说明你的开发环境没问题,芯片也正常工作。下一章我们会深入GPIO,讲怎么用它来模拟通信协议。嗯,到时候你会看到,DSP的GPIO远不止点灯这么简单。


公众号:蓝海资料掘金营,微信deep3321