date
May 26, 2025
icon
password
Pin
Pin
Hide-in-Web
Hide-in-Web
网址
type
Post
slug
dsp-note
tags
笔记
专业课程
category
学习分享
bottom
bottom
Hide-in-Config
Hide-in-Config
comment
Show
status
Published
summary
南理工,DSP 应用技术复习笔记,适用于南理工应试校友
本篇笔记是 DSP 应用技术这门课的复习笔记,适用于南理工的考试复习。
⭐ 【2025 年 DSP 期末考试题型回顾】
考试于 2025.5.28 结束,现对本次考试题型进行回顾,帮助大家未来复习准备。
考试的题型主要有选择题(5 道,共 10 分)、填空题(9 道共 20 分)、简答题(6 道共 45 分)、综合题(1 道共 25 分)。
接下来将我记得的题目写下:
填空题:
- MIPS 的含义是 (百万指令每秒),MFLOPS 的含义是 (百万浮点操作每秒)。
- 为了实现 DSP 实时性的要求,必须综合考虑 DSP 的运算量和(芯片速度),其中运算量包括 (数据率)和算法复杂度。
- COFF 最基本的单位是 (块),….
- 16 位定点数 Q3 表示法所能表示的数的最小值为 (-4096),对于运算 C=A+B,其中 A 的范围为 [-3.xx, 4.xx],B 的范围为 [-2.xx, 5.xx],请问要在不出错的情况下完成该运算,应使用 Q(10) 表示法。【A 和 B 的具体范围记不清了,可使用 A 的范围 → [-3.2, 10.4] 与 B 的范围 → [-2.3, 10.5] 来进行练习】
- 信号完整性问题主要包括 (反射),振铃,地弹和 (串扰) 。
- TMS320C2000 系列 DSP 芯片有 3 个主要组成部分 (中央处理单元)、存储器和 (片内外设)。
- DSP 开发的最终目标,是通过验证系统,满足 (功能) 和 (技术) 的指标要求。
其他两题记不得了
简答题:
- 简述 DSP 芯片特点;
- ① 两个十进制数要求转换为浮点数的计算;② 两个浮点数转换为十进制数的运算;③ 负数转换为 Q4 定点数的运算;④ 最后简述定点与浮点 DSP 芯片的特点;
- 双端口 RAM 的特点,简述双端口乒乓存储器的工作原理;
- 简述 DSP 管理中断的三个阶段。若仅触发定时器中断,中断号为 IFR3.5,中断服务程序为 ISR3_5,请依据下面的表格写出寄存器 PIEIER5 的值以及 IFR 的值(给了寄存器的表格),使用十六进制表示;并写出中断服务程序的地址。
- 根据存储结构图:
- 可用作用户数据段存储的区域有哪些(地址及大小)(还有几个小问题不记得了);
- 可用作程序段存储的区域有哪些(地址及大小);
- (给了一个 RAM 芯片,并告知 DSP 芯片的引脚,按要求画出连线示意图,并指出存储器的地址,最终画出的示意图大概如下面所示)
- 如果要分配
.ebss
段,长度为 0x1547,则分配后的地址为多少;

回答以下问题:

- 简述高速电路的定义,传输线效应有哪些,通常采用哪些措施予以避免。
综合题:
最后一道综合体考察的是 “FIR 滤波器” 实验有关的内容,只要有认真做一点 FIR 滤波器的实验倒还可以。
- FIR 滤波器采用哪一种数据处理方式(数据流处理、块处理、矢量处理);
- 请依据实验过程,详细阐述 DSP 系统设计方案;
- 简述 FIR 滤波器的硬件架构及软件实现流程图;
- 如何测试是否满足系统的实时性要求,如何实际系统以实现实时性。
提纲
这个估计是 2006 年左右的史前大纲,2025 年将它与课件对应,已经有很多部分对不上了😶🌫️🛏️


数字信号处理概述
DSP 两个概念
DSP 既可以指 Digital Signal Processing,也可以指 Digital Signal Processor。
前者表示数字信号处理理论和方法,后者表示数字信号处理器件。
微处理器种类
主要有三种 —— CPU, MCU 和 DSP。
CPU 是中央处理器,具有通用计算单元,适合处理复杂逻辑、多任务和操作系统,主要用于设计计算机、服务器;
MCU 是微处理器,包括 CPU 的核心、存储器和多种外设接口,成本和功耗低,能够实现简单的实时系统控制,可用于物联网设备的控制;
DSP 是数字信号处理器,是专门为数字信号处理设计的芯片,高度集成,能够实现高速复杂的数学运算,用于实现实时信号处理,可用于音频和图像处理。
数字信号处理的优势
- 可控性强;
能够通过改变程序使微处理器实现不同的功能,如改变一些系数实现低通、带通和高通滤波器。
- 稳定性好;
DSP 接收和处理的信号都是数字信号,数字信号相对于模拟信号受到时间和环境的影响小。
数字制造采用大规模集成电路,比起分立器件组成的模拟系统的故障率低。
- 精度高;
DSP 器件的电阻和电容精度高,AD 采样位数高,量化精度也高。
- 抗干扰性能强;
DSP 具有比较高的噪声容限,能够容忍较高的噪声干扰。
- 实现自适应算法;
能够实现系统的自我学习能力,实现神经网络训练和遗传算法的运算。
- 数据压缩;
DSP 处理的是数字信号,数字信号在经过压缩后几乎无失真,可以很好的减小传输带宽。【模拟信号则可能会造成波形失真】
- 大规模集成;
随着 DSP 器件的不断发展,其体积和功耗日益减小,性能日益增强,能够很好的集成到需要高速处理数据的场景中。
实时数字信号处理概念
实时指的是系统必须要在有限的时间内完成外部输入信号的指定处理,即信号的处理速度必须要大于等于外部输入信号的更新速度,同时,经处理后的输出信号与输入信号之间的延迟要特别低。
为了实现 DSP 实时性的要求,必须综合考虑 DSP 的运算量和芯片速度。

实时 DSP 系统的组成
实时 DSP 系统实现框图

由于 DSP 芯片处理的是数字信号,因此肯定会有 AD 采样系统,数字信号送入 DSP 器件的目的是进行信号处理,因此 DSP 子系统是整个系统的核心,最后还需要将处理后的数据重新转换为模拟信号输出,有 AD 子系统就会有 DA 子系统,二者是对称的。
DSP 子系统的实现方式
- CPU;
能够编写软件来实现不同的功能,但由于 CPU 是通用计算单元,面对复杂度比较高的数学运算,处理速度慢,甚至于会无法处理,而 DSP 有实时性的要求,因此通常用作理论仿真。
- 加速处理模块;
在 CPU 或其他通用微机中加入加速处理模块能够显著提高信号处理速度,但结果是系统体积增大,不适用于嵌入式系统。
- 单片机(MCS51,STM32);
单片机采用的是冯·诺伊曼式的结构,即数据与指令采用相同的总线进行传输,具有功耗低,体积小的特点;但由于单片机的运算速度比较慢,只适用于简单的控制应用场景中,不适合于运算量较大的场合。
- 专用的 DSP 芯片;
专用的 DSP 芯片是专为复杂的数学运算,如 FIR、卷积、FFT 等设计的,功能固化,不可编程,它直接通过硬件电路实现算法,能够实现极致的运算速度和能效比;但缺点灵活性较差,只支持预设的算法,比如图像处理芯片就只能针对特定的图像处理操作进行运算。
- 可编程 FPGA 器件;
FPGA 能够在硬件层面实现重构,通过硬件描述语言动态配置逻辑电路,实现并行硬件加速。
FPGA 不仅能够灵活地实现不同的运算,并行处理大量数据,且具有很高的运算速度,接近于专用的 DSP 芯片,但其功耗也显著增加。
- 通用可编程 DSP 芯片;
顾名思义,可编程 DSP 芯片是支持软件编程的,相比于专用的 DSP 芯片,其灵活性更高,也能够处理复杂的数学运算,适合于动态处理数据的场景。
由于是软件编程,其运算速度肯定没有专用的 DSP 芯片高,毕竟人家是硬件层面的优化。
通用 DSPs 构成的子系统


输入信号通过前向通道的各种处理转换为可供 DSP 芯片使用的数字信号,DSP 将输入数据或中间数据、算法程序存储在存储器中;
操作人员通过编写程序、选择算法等操作与 DSP 进行交互;
DSP 接收到数据后进行相应地数据处理,处理过程中可以通过数字 I/O 口输出中间数据或传入相关运算参数,通过数字 I/O 口也能够通过数字信号控制外部设备。
DSP 系统的数据处理方式
- 数据流处理;
数据流处理是一个一个排着队处理,DSP 器件会先接收到一个输入样本,然后立即对齐进行处理,在下一个输入样本到来前将该样本处理完,有点类似于工厂流水线。
- 块处理;
块处理通常用于批量处理数据,将输入的信号划分为多组进行处理,每组 L 个样本。在 L 个输入样本全部到达并存储到存储器中时,DSP 器件才会开始对数据进行处理。块处理通常应用于降采样的情形下。
所谓的降采样,就是输出采样率小于输入采样率;而升采样,指的是输出采样率高于输入采样率。降采样通常采用抽取的方法来实现,而升采样通常采用插值的方式来实现。比如说,输入信号的采样率为 48k,即每秒要采样 48k 个点,而输出采样率为 24k,即每秒要采样 24k 个点,这就意味着我们要在输入样本中每隔一个点采一个数据。
降采样通常出现在需要降低传输带宽或 DSP 输出的子系统中数据率受限的情况下。在通信原理中我们学习过数字基带信号的信息速率,, 就表示采样率, 表示每个样本点的位数,因此信息速率就与采样率成正比。降低输出采样率意味着降低信息速率,这样 DSP 输出后,其连接的子系统能够应付输入的数据(不同的系统对采样率要求不同),同时,,因此,信息速率的降低也能够降低传输带宽。
块处理方式的好处在于可以减少读写存储器带来的额外开销,提高处理效率,但要求更大的存储空间。
- 矢量处理;
能够处理多路输入/输出信号,矢量处理通常用于计算两个信号之间的相关关系。如下图所示:

定点与浮点格式转换
【定点数】定点数定标:整数和小数

当小数点的位置设置为第 0 位时,定点数用于表示整数;当定点数的位置位于其他位(如图中所示),则用于表示小数。
当小数位数增多时,数据精度增大,但相应地,表示的数的范围就降低。
【定点数】十进制数与二进制定点数的转换
由于二进制的定点数仍然是用二进制整数表示小数(但不会标出小数点,小数点的位置由 Q 后面的数字决定),比如,定点数 2 在 Q0 表示法下是 0000 0010【实际上为 0000 0010.0】,但在 Q4 表示法下就变为了 0010 0000【实际上为 0010.0000】。单看 Q4 表示法下的二进制数 0010 0000,它其实就是 Q0 表示法下 。从十进制的角度来看,原先的 2 经过 Q4 表示后成为了 。
因此,将小数转换为定点数可以参照下图所示的公式,反过来也是一样的:

几个例子:

注意图中的负数转换为十六进制时需要写成补码,比如
0xF809
就是 0x87F7
。【定点数】取值范围
表示法下 位定点数的取值范围:
(q 表示定点位数)表示法下 位定点数需要在两个边界乘上 ,得到新的取值范围为:
特别地,当 , 时,取值范围为 。
【浮点数】浮点数表示方法

DSPs 芯片特点
- 算数单元;
DSP 内部具有硬件乘法器和多功能单元,硬件乘法器是 DSP 区别于早期微处理器件的重要标志,大大较少了乘法运算消耗的时间;多功能单元(ALU,乘法器,地址生成器)允许 DSP 能够在单位时间内完成更多操作。
- 采用哈佛总线;
微处理器采用的总线形式是冯·诺伊曼总线结构,数据与程序共用一个存储器,数据和指令都采用同一条总线进行传输。若每条指令的时间是 3 个周期,在这种结构下,第一个周期会取指令,第二个周期会执行译码操作,第三个周期会执行指令。

冯·诺伊曼结构的优点是设备复杂度低,存储器利用率高;但缺点是指令执行周期受限,限制了吞吐量(吞吐量指的是单位时间能够处理的数据量)。
DSP 采用的总线形式是哈佛结构,数据和程序的存储器和传输总线是分开的,即地址总线中有专门用于传输指令地址和数据地址的总线,在数据总线中有专门用于传输指令程序和数据的总线。在这种结构下,指令的执行顺序如下:

如上图所示,从第三个周期开始,每个周期都有执行指令的操作,大大提高了指令的运行效率。
哈佛结构的优点是指令的执行效率高,吞吐量高,同时系统安全性也得到了提高(指令和数据隔离);缺点是硬件复杂度高,程序和数据的存储器空间需要预先分配,灵活性受到了限制(无法动态分配)。
改进的哈佛结构是将冯·诺伊曼结构与哈佛结构相结合,在主存层面仍然采用哈佛结构,程序和数据分隔;但在缓存层面采用的是统一管理,允许指令和数据共享访问空间或动态分配。现代 CPU 和高性能的嵌入式系统中会采用这种结构。
- 流水技术;
流水技术是将各指令的各个步骤重叠起来执行,即使得若干条指令的不同执行阶段可以处于同一时刻并行处理,这样每一个阶段称作一个流水
DSP 内部采用的是哈佛结构,因此其指令的各个步骤是可以重叠起来并行执行的,这是提高 DSP 执行速度的又一个重要手段。
- 专用寻址单元;
DSP 内部有专门用于计算地址的单元,与 ALU 并行工作,因此地址的计算不再额外占用 CPU 的时间。
- 片内存储器;

- 丰富的外设;
DSP 器件在 DSP 芯片外围分布了很多外设结构,如 CAN 总线、定时器、看门狗、时钟发生器等等。
DSP 实现高速运算的途径
- 硬件乘法器及乘加单元;
DSP 内部的硬件乘法器能够高效地完成单周期的乘法指令与乘加指令,提高运算速度。
- 数据格式;
DSP 中有专用于定点数的定点芯片和专用于浮点数的浮点芯片。
- 多个执行单元;
片内多个独立单元并行执行,如 TMS320C62x/67x 片内 8 个功能单元,指令执行速度最高可 8 倍于主频。
- 高效的存储器访问;

- 零开销循环;
DSP 器件能够在无需花费任何时钟周期的情况下高效地完成 FOR-NEXT 循环操作,这种特性称为是“零开销循环”。
- 数据流的线性I/O;
为了达到高性能低成本的输入和输出,大多数 DSP 处理器都有一个或多个专门的串口或并口,并采用线性的处理机制,例如低开销的中断和 DMA,使得数据的传输不影响或尽可能少地影响处理器计算单元的工作。
- 专用的指令集;
DSP 器件有官方提供的指令集,能够以最小的程序存储空间最大限度的使用处理器内部的硬件,实现高效的运算;
DSP 芯片的评价方法
传统性能评价

图中的四种指标从表面上看,似乎能够很好的评价一个 DSP 器件的好坏,既然我使用 DSP 器件是因为它的运算速度高,那么我就该选择上述四个指标更高的器件。
但从实际的应用角度上来说,上述四个指标并不能很好的反映 DSP 器件的性能。
DSP 器件是一个高度集成的器件,也提供了专用的指令集,因此一个指令通常可以完成很多复杂的操作。不同指令完成的工作不同,所需要的时间也不同;为了完成同一个算法,不同处理器的指令数目也是不同的。每秒能够执行的指令数量越多并不意味着处理效率越快,也许一个 DSP 器件执行十条指令实现的功能还不如另一个 DSP 器件执行一条指令实现的功能多。
完整应用评价
可以完整评估不同 DSP 芯片完成同一个应用任务的详细性能指标,包括存储器、功耗等;
但完整应用评价仍然难以做到非常公平,一方面是真实的环境难以模拟,另一方面是难以确保不同的 DSP 应用软件的最优。
该评价更加依赖于系统而非 DSP 器件本身。
核心算法评价
核心算法评价是由 BDTI 提出的使用核心算法和应用测试的方法。由于每个 DSP 器件都会有核心算法模块以实现 FFT 运算、滤波器等,因此核心模块的性能很大程度上决定了 DSP 器件的性能。
这种评价介于传统性能评价和完整应用评价之间,包括了软件仿真周期测量(simulate)和基于硬件的应用开发工具测量(emulate)。
评价指标主要有:

控制指标的优化则在于存储器的使用。控制代码的大小,基本上决定了片内存储器的大小,从而在很大程度上决定 DSP 处理器的成本。
作业
第一题:

关于定点数和浮点数的运算最好使用卡西欧计算器进行计算,打开计算器的“基数”功能(以卡西欧 fx-991CN 为例,按下设置选择“基数”),可以快捷地将十六进制转换为十进制。如果十六进制是一个负数,卡西欧计算器里面还有一个 功能(按下计算器上的 ,第一个就是 ,取反功能 ),输入 ( 也在 功能中,在前面取反功能的下一页)后会自动进行取反加 1 的操作。
第二题:

上题中类似
0.049
和 -126.843
这样带有小数位的数,要将整数部分和小数部分分别转换为二进制数,由于小数部分通过“乘 2 取 1 法”转换出的二进制数并非是有限项,因此共需转换至多 23 位才能够使用单精度浮点数表示,考试中并不会考这么复杂的。在上面转换
0x3ff8 0000
项时,最终会得到小数 1.1111
,由于计算器无法直接转换小数为十进制,可以先将二进制数 1 1111
用计算器转换为十进制数 31
,再回到计算器“计算”页面将 得到最终结果 1.9375
。第三题:

TMS320C2000 DSP 处理器
TMS320C2000 内部结构
TMS320C2000 系列芯片采用的是改进的哈佛结构,其程序总线存储器和数据存储器分别独立,有各自的总线结构,并允许互访。
TMS320C2000 系列 DSP 芯片有 3 个主要组成部分: 中央处理单元、存储器和片内外设。
同一系列 DSP 都采用相同的中央处理单元、总线结构 和 指令集,但片内存储器以及外设有所区别。
F28335 内核
- CPU;
CPU 中采用的是 32 位定点和 32 位浮点数芯片;同时内含原子指令,速度更快:

- 总线结构;
- 程序读总线:22 位地址,32 位数据;
- 数据读总线:32 位地址,32 位数据;
- 数据写总线:32 位地址,32 位数据。
【‼️注意,没有程序写总线】
- 流水线机制;

指令的执行大致分为取指、译码、取数和执行这四个阶段。
学习方法

系统时钟
内核时钟
TMS320C2000 芯片中系统时钟的框图如下:

从图中可以看到,芯片的系统时钟既可以由片上振荡器提供,也可以由外部晶振和外部时钟源提供。图中被黄色框覆盖的部分都是芯片内部的结构,没有被黄框覆盖的 XCLKIN 和 External Crystal or Resonator 指的分别就是外部时钟源和外部晶振。
芯片系统时钟的产生与两个寄存器密切相关,一个是
PLLSTS
(PLL status register,PLL → phase locked loop) 寄存器,另一个是 PLLCR
(PLL control register)寄存器。从图中我们也能够看到,外部时钟或片内振荡器通过或门输送到后续电路中,我们可以通过
PLLSTS
寄存器中名为 OSCOFF
的位来控制开关的关断,即控制芯片是否开始工作。若该位置 0(芯片中使能位一般是置 0 表示启用,置 1 表示关闭),则振荡器时钟 OSCCLK 有两条路可选,若 PLLSTS
寄存器中名为 PLLOFF
的位 置 0,则说明 PLL 启用(PLL 就是锁相环),此时 OSCCLK 能够既能够通过上面一条通路,也能通过下面一条含有 PLL 的通路,具体是从哪条通路输送到后续电路是通过 4-bit Multiplier PLLCR[DIV]
控制的,即 PLLCR
寄存器的 DIV
位确定的。含有 PLL 锁相环的同路能够对 OSCCLK 时钟信号进行倍频,不含的支路时钟频率保持不变。最后 OSCCLK 或 VCOCLK 时钟信号就会到达最后一道关卡——分频器,通过 PLLSTS
寄存器的 DIVSEL
位即可判断具体选择何种分频方式,分频完后时钟信号就会成为供 dsp 芯片使用的系统时钟 CLKIN 了。从上面的描述过程中,可以看到,系统时钟的产生过程与
PLLSTS
和 PLLCR
两个寄存器密不可分,接下来我们就对这两个寄存器进行详细的分析。PLLCR 和 PLLSTS 寄存器各位的含义如下:

首先介绍一下手册中寄存器位的描述符号。
R/W
表示该部分可读或写,R
表示该部分仅可读,-n
表示复位后该部分的值为 n
(这些内容在图中亦有标明),Reserved
表示保留位,不发挥作用。因此,我们容易知道,
PLLCR
寄存器只有低 4 位是发挥作用的,这四位的名称为 DIV
,且这四位均是可读写的,复位后的值为 0。
PLLSTS
寄存器的后 8 位是有作用的(第 1 位是保留位),前面 7 位是保留位。从
PLLSTS
寄存器中,我们可以看到刚刚框图中说到的一些位,第 5 位 OSCOFF
用于控制开关的关断, 第 7 位和第 8 位共同构成 DIVSEL,用于控制最后时钟的倍频。PLLCR
寄存器和 PLLSTS
寄存器共同作用的结果如下图所示:
从表格下方的注释可以看到,
PLLSTS[DIVSEL]
在 PLLCR
寄存器被写入前必须被设置为 0,并且只有在 PLLSTS[PLLLOCKS]=1
时才能够进行修改。当
PLLCR[DIV]
的值设置为 0000
时,PLL 会处于旁路状态(bypass),旁路状态意味着信号不会从 PLL 所在通路通过,相当于 PLL 被短路了。此时,若 PLLSTS[DIVSEL]
为 00 或 01 ,则输出的时钟频率为输入振荡频率的四分之一;若寄存器的值为 10,则为二分之一;值为 11,则为振荡器频率本身。表格中的其他值也是如此分析。
有了前面的基础,下面 PLL 的工作模式理解起来就会比较容易了:

最后可以理解一下PLL 的配置流程:

【范例程序】内核时钟
外设时钟
外设时钟,即提供给芯片外设(如 GPIO CAN ADC 等)的时钟。外设时钟配置的流程图如下:

图中出现外设寄存器、
LOSPCP
寄存器、HISPCP
寄存器以及 ADC
寄存器。其中,
LOSPCP
寄存器和 HISPCP
寄存器用于控制输送给 SPI
总线、McBSP-A/B
和 ADC
的时钟倍频,这两个寄存器的倍频设置关系如下:
其余的外设寄存器各位的含义如下:

课件中没有对具体的配置过程及 ADC 寄存器进行介绍,如果要进一步了解可能需要通过芯片手册。
后面介绍的各种外设阅读方法其实与系统时钟是一样的。
存储区域

上图是 DSP 器件的存储器结构图,由于 TMS320C2000 采用的是改进的哈佛结构,因此数据存储器和程序存储器是分开的。
但在上图中,为了方便起见,将数据存储器和程序存储器合并在一起进行讨论。
从框图左侧的地址可以看出,左右两侧的存储器是连续的,每侧的存储器又要分为左半部分和右半部分来看,左半部分为数据存储器,右半部分为程序存储器。
图中高亮为同一色块的存储器区域的功能是相近的,
reserved
表示保留位(图中所有橙色的色块都是保留位)。存储器各个区域的名称及描述如下:
名称/功能 | 大小 | 说明 |
M0 SARAM | 1 Kw( w 表示字) | 数据 RAM,Bank0 |
M1 SARAM | 1 Kw | 数据 RAM,Bank1 |
PIE Vectors | 256 w | 中断向量表 |
PF0 | 6 Kw | Flash/OTP 等受 CSM(Code Security Module)保护的寄存器 |
XINTF Zone 0 | 4 Kw | 外部扩展存储区(Zone 0)——通过 XINTF 总线访问外部 SRAM/Flash。 |
PF3, PF1, PF2 | 各 4 Kw | Flash/OTP 等受 CSM 保护的寄存器区 |
L0–L3 SARAM | 4×4 Kw | 四个本地 RAM Bank,可由 CPU 访问;双映射于 Program Space。 |
L4–L7 SARAM | 4×4 Kw | 另四个本地 RAM Bank,仅 Data Space 可见;DMA 可直接访问。 |
名称/功能 | 大小 | 说明 |
reserved | — | 保留区 |
XINTF Zone 6 | 1 MW | 外部扩展存储区(Zone 6/CE6),映射外部 Flash/SRAM |
XINTF Zone 7 | 1 MW | 外部扩展存储区(Zone 7/CE7) |
FLASH (on-chip) | 256 kW | 主程序存储 Flash |
PASSWORDS | 8 w | CSM 密码区 |
reserved/校准数据区 | — | ADC 校准数据、用户 OTP 等 |
L0–L3 SARAM (映射) | 4×4 kW | 与 Data Space L0–L3 同物理存储,可在程序执行时用作极快的常量表。 |
reserved | — | 保留 |
Boot ROM + BROM Vectors | 8 kW + 64 w | 上电自检/Bootloader ROM |
中断(PIE)
简单介绍

DSP 的中断分为可屏蔽中断和不可屏蔽中断,其中不可屏蔽中断的优先级高于可屏蔽中断的优先级。
可屏蔽中断由 INTM 寄存器管理,当 INTM 为 1 时可屏蔽中断关闭,即系统不响应可屏蔽中断,当 INTM 为 0 时可屏蔽中断打开,系统响应可屏蔽中断。
TMS320C2000 对中断的管理大致分为三个阶段:

每个中断都有一个对应的中断服务程序(ISR),在中断响应时会被执行。中断服务子程序与中断通过中断向量表来进行管理,后面会具体介绍中断向量表。
PIE 的介绍
PIE 是 DSP 芯片的外设扩展模块,专门用于管理 DSP 外设的中断。
通常来说,通过 PIE 进行管理的中断都是可屏蔽中断,即这些中断可以通过 INTM 标志位来开启或关闭;而绕过 PIE 直接与 CPU 相连的中断为非可屏蔽中断(NMI)。

接下来主要介绍下通过 PIE 进行管理的可屏蔽中断。

PIE 最多能够管理 96 个中断,它会将 96 个中断分为 12 组,每组负责 8 个外设或引脚中断。每组都会有一个
PIEIERx
寄存器、PIEIFRx
寄存器和PIEACKx
寄存器,其中的 x 表示的是中断的分组,因此 x 的范围为 1~12。具体来说,PIEIER
和 PIEIFR
寄存器的数量各为 12 个,每个寄存器对应一个分组,寄存器中的每一位表示一个分组下的一个特定中断;而 PIEACK
寄存器仅有一个,寄存器中的每一位控制一个分组。CPU 通过 IFR 和 IER 两个寄存器控制中断,PIE 将中断请求发送到 CPU 后,CPU 中断标志寄存器 IFR 中的对应位 INTx 会被置位。
PIE 处理中断信号的流程如下:
上图中,
PIEIERx
对应位 置 1 表示开启,对应位 置 0 表示关闭,PIEIFRx
与 IFR
、IER
使能方式一样;但 PIEACKx
对应位 置 0 表示开启,对应位 置 1 表示关断,INTM
与 PIEACKx
使能方式一样。具体的流程如下,可将下图的每个步骤与上图的一一对应,还是比较好理解的:

图中
PIEIFRx.y = 1
表示的含义为,第 x
分组下的 PIEIFR
寄存器的第 y
位为 1
。中断向量表
中断向量表又称为是中断地址,即向量表中的每个值都对应一个中断的中断函数所在的地址,根据该地址,指令指针能够迅速切换到中断函数并执行。
中断向量表的映射地址如下:

其中,M1 向量是从 M1 SRAM Block(M1 存储器区块) 获取的,PIE 向量是由 PIE 区块获取的。
PIE 中断向量表的映射关系如下:


芯片手册中关于中断向量的部分描述如上。
从上图中可以看到,INT1 ~ INT12 的功能是重定向,意思是重定向到对应的中断分组,如 INT1 跳转到 INT1.1,INT2 跳转到 INT2.1。然后根据中断在中断分组中的位置,进一步找到属于自己的中断向量,如 INT1.8 表示第一个分组下的第八个中断向量。
PIE 中断设置寄存器(PIEACK、PIEIER、PIEIFR、PIECTRL)
PIE 寄存器在前面曾简单介绍过,这里再进一步归纳和整理。PIE 中的寄存器主要有以下四个:

PIE 控制寄存器:

该寄存器的最低位是用于设置是否启用 PIE 向量表的,寄存器的 1~15 位存储了 PIE 向量表的首地址,即中断向量存放在何处,具体的描述可以看上面表格中的 Description 部分。图中还举了一个例子,当 PIECTRL = 0x0D27 时,最低位为 1,表示启用中断向量表,且向量表的首地址为 0x0D 。
关于 ENPIE 位,图中描述中说如果该位为 0,则会 PIE 向量表会被禁用,中断向量会从 CPU 的中断向量表(位于 boot ROM)中获取地址并执行程序,且 PIEACK、PIEIFR、PIEIER 这三个寄存器仍然可以被正常访问(因此可以在 PIE 被禁用的情况下设置三个寄存器的值);如果该位为 1,则除复位外的所有中断向量都能从 PIE 向量表中获取,复位向量只能从 boot ROM 中获取。
PIEACK 确认寄存器:

寄存器的 0~11 位分别对应 INT1 ~ INT12 的中断分组。PIEACK 对应位置 0 表示启用,PIE 可以向 CPU 发送对应组的中断请求,置 1 表示关闭。
PIEIERn 使能寄存器:

共有 12 个,每个寄存器的功能都与上述描述的一样,只有第 0~7 位发挥作用,每一位对应一个特定的中断。
需要特别注意的是,对应位置 0 表示关闭,置 1 表示启用。
PIEIFRn 标志寄存器:

与
PIEIERn
寄存器的用法基本相同。为什么有了
PIEIERn
,却仍然要有 PIEIFRn
呢?这两个寄存器看似相同,似乎有既生瑜何生亮的既视感,但其实从名字中也能看出各自的用途。
PIEIERn
为使能寄存器,即将对应的中断使能,这样,当 PIEIFRn
有中断响应,PIE 才能将其发送;当 PIEIERn
设为 0 后,对应位被禁用,此时无论外部是否有 PIEIFRn
传来,都只会被屏蔽,不会被响应。代码示例:
CPU 中断设置寄存器(IFR、IER、INTM)
CPU 中设置中断的寄存器主要有以下三个:

IFR 中断标志寄存器:

寄存器对应位置 1 表示对应位有中断请求,否则没有。
IFR 手动置位与清除的代码示例如下:

或运算通常用于置 1 操作,因为它具有的特性为“置 1 为 1,置 0 保持不变”,想将哪一位置 1,只需要将其对应位或上 1,其余位或上 0 即可。
与运算通常用于置 0 操作,因为它具有的特性为“置 0 为 0,置 1 保持不变”,想将哪一位清 0,只需要将其对应位与上 0,其余位与上 1 即可。
IER 中断使能寄存器:

INTM 全局中断使能:

中断服务子程序(ISR)
中断服务程序是用户编写的,是对中断事件做出响应的子程序。
CPU 接收到中断请求并响应之后,就根据中断向量表中的地址转移到相应的中断服务程序 ISR 中。
在跳转到 ISR 前,需要进行保护现场的工作(即保存和恢复寄存器的值),并且还要管理中断嵌套。
中断代码设置的示例如下:


函数名既可以用来调用函数,其本身其实也存储着函数的入口地址,通过
&epwm1_timer_adc_isr
即可将中断函数的地址存入中断向量表中。【PIE】作业
题目
根据“Example_ADC”中实验内容,打开程序 LAB11_main.c,DSP2833x_PieCtrl.c 以及相关头文件,阅读程序段落。
- 摘录与中断设置相关的程序语句。
- 函数 InitPieCtrl() 实现的功能。
- 函数 InitPieVectTable() 实现的功能。
- 语句 PieVectTable.EPWM1_INT =&epwm1_timer_adc_isr; 实现的功能。
答案
- 摘录与中断设置相关的程序语句;
- 函数
InitPieCtrl()
实现的功能;
- 函数
InitPieVectTable()
实现的功能;
- 语句
PieVectTable.EPWM1_INT =&epwm1_timer_adc_isr;
实现的功能;
功能:
将用户自定义的中断函数首地址赋值给中断向量。
外部接口模块(XINTF)
简单介绍
XINTF
是一种异步接口,主要用于存储器和外部设备的扩展。XINTF 的相关引脚结构如下:

读写时序分析
XINTF 的读写时序中最重要的参量为 —— 建立时间(LEAD)、保持时间(ACTIVE)、跟踪时间(TRAIL)。

如上图所示,读写时序均有各自的建立时间、保持时间和跟踪时间。

建立时间:从 存储器 被 XINTF 选通到读引脚使能(读操作开始),即 CS(或 CE) 有效(变为低电平)到 OE【读时序】 或 WE【写时序】 有效(变为低电平),所需要的最小时间;
保持时间:从读引脚使能到读引脚失能,即 OE 从高电平变为低电平后再次变为高电平,所需要的最小时间;
跟踪时间:从 存储器 被 XINTF 取消选通到读引脚禁用,即 CS(或 CE) 变为高电平后,OE 也变为高电平,所需要的最小时间。
上面三个概念在后面计算参量时会有更好的认识。
为了优化 DSP 的 XINTF 配置,有时需要对建立时间、保持时间和跟踪时间进行手动配置,若要进行配置,就必须先计算出三个参量的值。
读写时序的参量计算都需要根据时序图进行,读时序的三个参量计算过程如下:

根据前面的定义,我们可以得到:
读时序建立时间:
读时序保持时间:
读时序跟踪时间:
接下来只需要代入具体的值即可进行计算了,在芯片手册中,我们可以查询到读时序的相关参数:

表格最上方的
-8
、-10
、-12
分别表示的是该器件的不同速度等级,课程中采用 -12
这一列的参数进行计算。将上面的参数值代入后,得出的计算结果如下:

在代码中进行设置时,是以时钟周期为单位设置的,因此需要将上述的时间转换为时钟周期,假设 TMS320C2000 的时钟频率为 150MHz,则时钟周期为 6.67ns, 向上取整为 2, 本来也应该向上取整为 2,但由于本器件是 C28× 系列芯片,对该系列来说,通常需要写作 “周期数– 1”,跟踪时间需要向上取整为 1,具体如下:

写时序三个参量的计算过程如下:

与读时序的分析方法相同,最终得到:

XINTF 相关寄存器
作业中会用到。寄存器各位是什么含义不需要掌握,考试时候也会给出下面的图,关键是要能够读懂,给出代码知道设置的是哪一位。

XTIMING 寄存器:

XINTCNF2 寄存器:

【XINTF】作业
题目
如下图示存储芯片,对TMS320F28335进行存储器扩展。

1)指出存储器地址范围;
2)在程序Example_2833xDMA_xintf_to_ram.c指出相关的配置代码。指出XTIMING6、XINTCNF2寄存器各字段的数值及含义。
3)根据存储器的读写时序(具体数值选取红色方框内的标注值),能否优化DSP(工作主频150MHz)的XINTF配置?给出具体配置方案。


答案


ePWM 模块
简单介绍
对于 ePWM 模块,可以简单理解为是一个产生占空比可变的脉冲信号的模块。
ePWM 即 ehanced PWM(PWM → pulse width manipulation),是增强型的脉冲宽度调制器。
ePWM 模块通过控制 PWM 的占空比产生不同宽度的脉冲波,进而控制电机转速及开关电源的开关频率等,还能够利用方波信号占空比的连续变化模拟正弦波,是应用非常广泛的一个模块。
ePWM 模块由许多子模块组成,具体如下图所示:

所有子模块组成的 ePWM 模块框图如下图所示:

最左侧是时基子模块和比较功能子模块,往右依次是动作限定模块、死区生成模块、斩波控制模块、故障捕获模块,右上方是事件触发模块。
时间基准模块

时间基准子模块的结构框图如上图所示,从上图中可以看到,时基模块的核心单元就是一个模式可控的计数器。
该计数器可以通过 Zero 设置初值,Dir 设置计数方向(增计数、减计数),Max 设置计数器阈值,clk 控制计数频率,Reset 将当前计数值清零,Mode 设置计数模式(向上计数 或 向下计数 或 增减计数),Load 在计数值达到阈值时输出。

计数器的配置是由许多寄存器来完成的,图中最主要的寄存器为
TBCTL
寄存器,可以看到它的各个位在时基模块中的作用。时基基准模块的寄存器

其中
TBCTL
的寄存器各位含义如下(不用背,能看懂就行):

在图中,时钟的分频系数有两个,一个是 CLKDIV,另一个是 HSPCLKDIV,这两个的区别是前者为低速分频,后者为高速分频。从上面的分频系数中也能看出,CLKDIV 的分频系数是以 2 的指数分之一增长的,可以理解为是细调;HSPCLKDIV 的分频系数是以 2 为步长增大的,可以理解为是粗调。
这里最容易陷入的误区是为什么不将二者合并起来,不合并起来的原因是因为合并后会不容易阅读,分成两部分,我们只需看 16 个分频系数,若合并起来,就需要看 64 个分频系数,比较不方便。
时基状态寄存器
TBSTS
各位的含义如下:
时基单元设置 PWM 波频率示例

如果采用增计数模式,要周期性生成 150kHz 的 PWM 波,对 TBCTL 寄存器的配置如下:
首先 150MHz 分频为 25MHz,分频系数为 6,因此可以选择将 CLKDIV 设置为 000,HSPCLKDIV 设置为 011;
FREE_SOFT
设置为 11(禁用仿针模式), PHSDIR
设置为 0(这一位无所谓,因为后面会将同步关闭),SWFSYNC
设置为 0,SYNCOSEL
设置为 11,PRDLD
设置为 0,PHSEN
设置为 0,由于是增计数,CTRMODE
设置为 11.【寄存器配置老师没有给答案,因此可能有错误】其实上述的配置过程和微机原理课程类似,还比微机原理简单,看着图来配置就行。
在上面的过程中,进行的是寄存器时基单元的配置,只能设置计数器的最大值,如果仅是如此还是无法产生 PWM 波。
如果要进一步产生 PWM 波,还需要设置比较功能(CC)子模块,在这里设置占空比。
事件触发模块
事件触发子模块用来处理时间基准子模块、比较功能子模块所产生的事件,从而向 CPU 发出中断或产生 ADC 启动信号 。
中断控制功能

电路图需要从右往左分析,下面从最左侧的框图开始:
图中的电路用于在时基单元的计数值符合某个要求时产生
EPWMxINT
中断,具体是符合什么要求需要根据 ETSEL[INTSEL]
寄存器的值来判断,如果为 001,就表明触发条件为 CTR=Zero
,如果为 010 就表明触发条件为 CTR=PRD
。当然,如果你等不及时基单元满足条件而触发中断了,可以直接将
ETFRC[INT]
置为 1 来强制触发中断,因为这两者是或的关系,只要有一者符合条件都可以触发中断。中间的方框部分是一个计数器,用于记录当前已经触发的事件个数,可以通过
ETPS[INTPRD]
来设置计数器的阈值,比如,设置为 2 就表明每 2 次事件触发一次 EPWMxINT
中断。ETPS[INTCNT]
用于存储计数器的计数值,每当有事件传入计数器,INTCNT
的值都会加 1,当 INTCNT
的值与预设的 INTPRD
相同时,就会产生一个输出。ETSEL[INT]
用于控制是否将中断脉冲输送给后续电路,若置 1 则表示闭合开关。计数器产生的输出会通过中断脉冲形成电路转换为一个中断脉冲信号触发中断,这个中断信号有三个去路:
- 以
EPWMxINT
的形式传出;
- 会进入到最上方的
Latch
中,将ETFLG[INT]
置 1;
一旦
ETFLG[INT]
置 1,下方的数据选择器就会固定将 0 输送到脉冲形成电路中,这样脉冲形成电路就不会响应后续的中断了。- 返回计数器将计数值清零。
我们可以手动为
ETCLR[INT]
位赋值来将 ETFLG[INT]
清零。产生 ADC 启动信号

上述电路图与中断控制功能的电路图非常相似,只不过少了一个数据选择器的部分。
也就是说,只要有事件被触发且达到了计数器阈值,那么就会产生一个脉冲信号
SOCA
,用于启动 ADC。事件触发模块的寄存器

ETSEL 寄存器的各位含义如下:

ETPS 寄存器的各位含义如下:

【ePWM】作业
题目
根据“Example_ADC”中实验内容,打开程序LAB11_main.c及相关头文件,阅读程序段落。
- 摘录与 ePWM 模块设置相关的程序语句;
- 指出寄存器 TBCTL 与 TBPRD 各字段的数值及其含义;
- 计算时间基准模块 TB 产生事件的频率;
- 指出寄存器 ETSEL 和 ETPS 各字段的数值及其含义;
- 计算 ADCSOC 信号的产生频率;
- 概括此程序运行后所产生的效果。
答案
第一题:
第二题:

第三题:

第四题:

第五题:

第六题(老师未给题解):
单看 ePWM 初始化这个部分的代码,代码中将 ePWM 设置为增减计数模式,并在 TBCTR 的计数值达到 TBPRD 时就触发一次 ePWM 中断,以 20.032 kHz 的频率产生 SOC 脉冲触发 ADC 采样,同时也以 20.032kHz 的频率向 PIE 发起中断请求。
在代码中,还对比较功能子模块进行了配置,应该是会产生 PWM 脉冲,但由于课件中没有介绍有关比较功能子模块的内容,因此这里不加赘述。
模数转换模块
简单介绍

ADC 模数转换模块的结构图如上图所示。可以看到,主要分为几个版块:
- ADC 时钟版块;
- ADC 采样版块(SOC 、序列发生器、MUX 以及 S/H 电容);
- 12 位ADC 转换模块(ADC 转换器及结果寄存器)。
TMS320C2000 器件模数转换的主要特点如下:

【ADC 时钟版块】

图中的时钟框图其实就是将输入的系统时钟进行一系列的分频操作,最终得到
ADCCLK
。图中
SOC pulse generator
是 SOC 脉冲生成电路,用于将时钟信号整形同步到 ADCCLK 域,并产生一系列短脉冲作为各个 SOCx 控制单元的“激活”信号。【ADC 采样版块】SOC 单元
ADC 采样板块的基本单元是 SOC(Start-of-Conversion),TMS320C2000 能够支持 16 通道输入,这就意味着有 16 个 SOC 单元(从图中
ADCINA0~ADCINA7
和 ADCINB0~ADCINB7
共 16 个输入信号也能看出这一点)。每个 SOC 都有一个编号,从 SOC0 到 SOC15。每个 SOC 单元与一个输入通道对应,为了提高 ADC 处理效率,TMS320C2000 将 16 个通道分为了两组,每组 8 个通道。这样设计的目的是让 ADC 在高速多通道采样时,可以在一个 S/H 做保持的同时,另一路 S/H 进行转换,提高采样吞吐。每当一个 SOC 触发时,硬件会根据该 SOC 的编号自动选用 A 或 B 路 MUX,一般偶数编号的 SOC 对应 A 路的 MUX,奇数编号的 SOC 对应 B 路的 MUX。
综上,SOC 的主要功能是选择模拟信号输入通道并设置采样保持时间,即控制 MUX 从
ADCINA0~ADCINA7
与 ADCINB0~ADCINB7
通道中选择一个通道导通,并为 S/H-A 与 S/H-B 电容设置采样保持时间。【ADC 采样版块】序列发生器
序列发生器可以理解为是一个 SOC 的集合,它负责在一次外部触发(比如 ePWM SOCA、软件强制触发等)到来时,按 SOC 编号的顺序“依次”启动这些 SOC。序列发生器自己不存“数据”,它只会发出多个 SOC 启动请求。当我们需要采样多路信号的时候,可以使用序列发生器顺序选通通道。
序列发生器的工作流程:
- 序列配置;
配置序列发生器时,需要事先通过软件设置好序列发生器中 SOC 的数量、哪个 SOC 发出中断以及每个 SOC 的通道号和采样时间,该中断的作用在于通知 CPU,告诉主程序“我这批指定的 SOC 全部转换完毕了,数据已经写入
ADCRESULTx
,你可以去读并处理了”。除此之外,在电机控制、数字电源等系统里,通常在同一个 PWM 周期末触发 ADC,将转换结果作为下一次控制算法(PI、FOC)或闭环调节的输入。- 触发启动;
在序列发生器启动后,如果接收到了一次有效的触发(如 ePWM 中 CTR = Zero 事件),硬件会先启动 SOC0,然后自动按编号依次启动 SOC1、SOC2 … 直至 SOC(N–1)。
- 并行采样保持;
每个 SOC 启动后,采样电容对通道电压进行充电并保持,随后进入 A/D 转换核心;由于各 SOC 之间有固定的硬件间隔,无需软件干预。
- 结果写入;
每个 SOC 经过 A/D 转换完成后,会将转换的采样结果存入
ADCRESULTx
寄存器(结果寄存器)中。- 中断/DMA;
当指定的最后一个 SOC 转换结束,会触发
ADCINTx
中断或 DMA
请求;ISR/DMA
完成后可读取所有结果寄存器中的值。序列发生器的两种工作模式

级联序列的工作模式指的是将所有的 SOC 通道级联起来,构成一个 16 通道的序列发生器。在对外部输入采样时,序列发生器会指导 SOC 从编号 0 一直采样到编号 15,只有完成全部 16 通道的采样后才会产生中断。

双序列工作模式是将 16 通道的 SOC 分为两组,每组 8 通道,两组 SOC 相互独立完成工作,可以因为同一个中断而触发,也可以由不同的中断触发。

ADC 的两种工作模式

顺序采样模式指的是 ADC 每次只走一组 SOC,每次只采一个通道的数据,也就是说,SOC 按照编号顺序依次启动采样,适合于有多通道需求但并不要求瞬时同时采样的情形;
同步采样模式是并行采样,ADC 每次同时启动多组 SOC 进行采样,可以实现在同一时刻同时采样多个通道的数据,适合于差分或多相电流采样;
顺序采样模式能够节省更多资源,而同步采样模式则会消耗更多资源。
ADC 采样结果的转换

ADC 的采样位数为 12 位,因此量化间隔为 ,寄存器的值为 0~4095,由 【y 为采样后寄存器的值】,得到 。
由于 ADC 的输入电压范围必须要在 0~3 V 以内,如果输入电压的范围在 0~3 V 外,但最大值与最小值之间的差值仍然满足 ,则可以在 ADC 芯片外接入下图所示的电路:

图中外接的电路由两级运放组成,第一级运放是加法器,将输入电压抬高了 1.5 V 输出,第二级运放是反相器,由于输入电压在经过第一级运放后反相了,实际范围变为 ,仍然不满足 ADC 输入条件,因此需要再经过一级反相器将输入电压范围转换为 。
在 ADC 采样处理完数据后,需要记得将输出的电压再减去偏置(如果输入加入了负的偏置,那么输出就加上偏置)。
ADC 基准电压

ADC 上电后的配置顺序如下:
- 如果需要外部基准,请使用
ADCREFSEL
寄存器中的第 15-14 位启用该模式。必须在带隙通电前启用该模式;
- 通过设置
ADCTRL3
寄存器中的第 7-5 位(ADCBGRFDN[1:0], ADCP WDN
),同时为基准电路、带隙电路和模拟电路供电;
- 在执行第一次转换之前,需要 5 毫秒的延迟。
ADC 寄存器相关

ADC 控制寄存器 1(ADCTRL1
)


ADC 控制寄存器 2(ADCTRL2
)


ADC 控制寄存器 3(ADCTRL3
)

最大转换通道配置寄存器(ADCMAXCONV)

输入通道选择寄存器

ADC 结果寄存器

程序引导模块
DSP上电复位到执行用户程序的过程如下:

上图中,GPIO 四个引脚电平组合与控制模式之间的关系如下图所示:

上述过程的具体描述:
- 复位地址始终为
0x3FFFC0
,这是德州仪器内部 ROM 的一部分。该地址位于 ROM 存储区末尾,是 中断向量表 的直接映射视图。地址0x3FFFC0
中保存的是复位向量的起始地址(即0x3FF9CE
);紧随其后的地址中,依次保存的是各个中断的向量地址,如 INT1(0x000042
)、INT2(0x000044
)等;

- F2833x 系列 DSP 从向量表中读取复位向量,并将该 32 位地址值加载到程序计数器(PC)中。当 DSP 执行复位时,它会跳转到地址
0x3FF9CE
,并从那里开始执行,这是启动代码(Boot ROM)的第一条指令。在这里,DSP 会执行一些基本初始化操作,并确定启动方式(Boot Mode);

- 接下来(仍然属于启动代码的一部分),DSP 会根据四个 GPIO 引脚(GPIO 87 到 GPIO 84)的状态来确定实际执行入口地址。如果这四个引脚 全部为高电平
1
,则系统选择从 Flash 中启动(即跳转到 Flash 区域的程序入口地址执行);

- 如果 GPIO 引脚的配置对应的是某种串行或并行的引导方式(例如 SPI、SCI、CAN 等),那么 Boot ROM 中的另一部分代码将被执行,以建立所选通道的标准通信协议,并准备从该通道加载用户程序。

TMS320C2000 软件环境
DSP 开发的最终目标,通过测试来验证系统实现满足功能性和实时性的指标要求。
两种调试工具
一个是软件仿真,另一个是硬件仿真:

CCS 开发环境框架

编辑器用于在集成开发环境编写程序,通常是用高级语言(C 语言)进行编写;
编译器是将源代码进行编译,将高级语言转换为汇编语言,生成汇编文件(
.s
);汇编器是将汇编文件中的汇编语言进一步转换为计算机能够识别的机器语言,生成目标文件(
.o
);每个源代码都会对应一个目标文件,这些目标文件虽然都包含了实现项目所需要的代码,但还不能够直接执行,需要通过链接器将所有的目标文件合并为一个可执行文件(类似于
.exe
文件);同时,链接器还能够实现一个操作,将头文件中的符号链接与库文件中的函数代码对应,即将源程序中 #include <xxx.h>
语句所引用的头文件的所有内容插入到可执行文件中,一般这些头文件会放置在静态库或动态库里(.lib
)。【如果对编译、汇编、链接操作感兴趣,可以查看我的 GCC 笔记: 】CSS 开发的基本流程

- 新建工程
一个项目就是一个工程文件夹,项目中用到的程序文件都在此文件夹目录下。
- 添加文件
项目中必须添加的文件:
.c
—— 程序文件;.cmd
—— 链接命令文件;.lib
—— 库文件(头文件的集合,调用头文件时系统会自动检索库文件);.h
—— 头文件,必须以 include
方式添加。- 编译、链接
编译——将源程序文件编译成机器语言的目标文件(COFF);
链接——指定目标文件的段所使用的存储空间;
- 项目调试
利用 CCS,结合外部仪器,验证程序功能及实时性。
- 程序烧录
项目程序固化到非易失存储器上,程序能够脱离计算机运行。
COFF 公共目标文件格式
简单介绍
COFF 文件格式的程序关键运用代码块(代码段)和数据块(数据段),在这里,代码块和数据块与微机原理中学习的代码段和数据段是一样的。
在 编译、汇编 阶段,编译器、汇编器 会把同一种用途的指令或数据放到同一个块里,生成目标文件时并不将块固定在在某个特定地址。这样,不同功能的代码分别放在不同的段(甚至自定义段名)中,它们互相独立,彼此之间只通过符号(函数名、全局变量名)来引用。
在链接阶段,链接器根据链接脚本(Linker Script)来决定内存地址的分配,将前面的符号引用用具体的地址来替换。由于源代码中不使用固定的地址,将代码迁移到其他的平台上运行时,只需要更换链接脚本就可以实现指令地址的切换,灵活性更高。
因此,COFF 格式的文件更有利于模块化编程,并为管理代码段和目标系统存储器提供了更强有力和更加灵活的方法;在基于 COFF 格式编写汇编程序或高级语言程序时,不必为程序代码或变量指定目标地址,这为程序编写和程序移植提供了极大的方便。
块(section)
在后面的部分中,块与段二者是等价的。
目标文件中最小的单位称作块,一个块就是最终在 TMS320 存储器映像中占据连续空间的一块代码或数据。所谓的“存储器映像”可以理解为是存储器的镜像,块的地址与存储器的物理地址是一一对应的。
汇编语言中产生的块:

汇编代码中段定义的示例



C 语言中由 C 编译器产生的块:

C 语言中段定义的示例

链接器将段映射到实际的物理地址(目标存储器)中【示例】:

汇编器(未初始化块和已初始化块)
汇编器的主要任务是确定汇编语言程序的各部分分别属于哪个特定的段。
未初始化块:
未初始化块主要用来在 DSP 器件的存储器中保留空间,他们通常被分配到 RAM 中。
格式:
.bss 符号, 字数
符号 .usect "块名", 字数
上面指令中的“字数” 指的是字的个数,一个字是两个字节。
汇编器遇到 bss 和 usect 命令时不会结束当前块,只是暂时离开当前块,该命令可以出现在一个已初始化块中的任何地方。
已初始化块:
已初始化块包含可执行代码或已初始化的数据。
格式:
.text .data
.sect "块名"
.asect "块名", 地址
当汇编器遇到上述命令时,不会将后面的代码或数据汇编到当前块中,而是将它们汇集至相应的块中,块是通过迭代过程建立的。
链接器对块的处理
链接器对块的处理主要有以下两点:
- 将 COFF 目标文件中的段组合起来,建立可执行的 COFF 输出模块【即 将分散的目标文件(
.o
文件)合并为可执行文件】;
- 为输出段选择存储器地址【即 将符号链接与物理地址对应】;
下图展示了链接器的工作流程:

目标文件(
.obj
文件)输入到链接器中,链接器根据 link.cmd
文件确定目标文件中各段与 DSP 器件物理地址的映射关系,如下图所示:
在链接完成后,链接器会输出一个实际的 “段↔地址” 排布文件(
.map
文件),我们可以通过该文件查看各个段与物理地址之间是如何对应的,每个段实际使用了多大空间,还剩下多大空间.cmd
文件示例
- MEMORY:用于定义目标系统的存储器,可以定义每一段存储器指定的起始地址和长度;
- SECTIONS:告诉链接器如何组合输入段以及将输出段放至存储器何处。
.map
文件示例
【链接器】例题
例题一


从上面左侧的图中可以看到,
SECTIONS
块里,程序段 .text
和变量初始化段 .cinit
映射到了 FLASH 存储器,放入 MEMORY
段的 PAGE0 中;.ebss
段映射到了 M0SARAM 存储器,.stack
段映射到了 M1SARAM 存储器,放入 MEMORY
段的 PAGE1 中。虽然课件中没有明确说明,不过可以推测 PAGE0 应该是专门用于存放程序的存储器,PAGE1 是专门用于存放数据的。
映射关系可以参考下图:

【注:映射关系并非一定要取上面的形式,如
.text
不一定要映射到 FLASH,但由于题目中 .map
文件已经给定,因此 .text
是要映射到 FLASH 存储区】明白了上面的映射关系,想要完成上面
.map
文件的内容其实就比较简单了,完成后如下:
例题二


如上面右侧的图所示,程序段
.text
和 .cinit
的长度为 0x38A8
,而右侧的 M0 和 M1 存储器都不够分配,因此考虑使用 L0, L1, L2, L3 四个存储器一起存储程序段代码;.ebss
可放入 L4 存储器,.stack
可放入 M1
存储器。
.cmd
文件完善后如下:
CCS 的基本使用与外设寄存器没什么好写的,感兴趣可以自己去 DSP 课件中看看。
DSP 系统设计
DSP 总体设计框图

老师说,在实际的生产实践中,第一步“根据需求写出任务说明书”往往是最关键也是最难的。
DSP 目标板的设计要素

- 算法分析与优化;
根据需求,完成算法的仿真验证。
- DSP 的选择;
根据核心算法、数据吞吐率,以及系统要求进行选择。
- DSP 配置;
DSP 基本电路包括本身的基本引脚连接、总线驱动、时钟控制、引导程序方式控制、存储器配置、通信口配置、 IO 口控制、时序设计等,保证 DSP 的基本工作模式。
- 模拟数字混合电路设计;
实现 DSP 与模拟混合产品的无缝连接,以及保证数据的吞吐量,实现模拟与数字部分隔离。
- 系统电路设计;
重点是合理进行系统技术指标的分配,在时序设计上保证系统速度(包括处理速度、接口速度、元器件速度等)和实时控制。
- 系统对软件的编写与调试;
对信号处理的算法进行编程,并提供系统监控程序。
- 系统测试与验证
- 硬件部件的原理验证:电路的调试
- 通过DSP的原理验证:在线仿真电路调试
- 软件的仿真与算法验证:算法的实际硬件实现
- 系统硬件功能验证与指标测试:验证系统技术指标
- 系统软件完善:确保系统的智能化与可程控性
- 其他测试与验证:软硬件可靠性,自检,环境实验
硬件设计步骤

- 第一步,确定硬件设计方案;
根据性能指标、工期、成本等,确定最优硬件实现方案,并画出硬件原理框图 。
- 第二步,器件选型;
一般系统中常用 AD、 DA、存储器、电源、逻辑控制、人机接口、通信、总线等基本部件。
- 第三步,原理设计;
原理设计是 DSP 系统集成中关键的一步,其成功与否是 DSP 系统能否正常工作的最重要的一个因素。

- 第四步,PCB 版图设计;
PCB 布线不是简单的端口互连。PCB 布线需要考虑的因素有很多,比如 PCB 信号线中传递的信号频率,PCB 布线长度所造成的延时与信号上升时间之间的关系等等。
- 第五步,硬件调试;
检查PCB板上各硬件是否能正常工作。
软件设计步骤

系统集成
系统集成指的是将软硬件结合起来,组装成一台样机,在实际系统中运行,进行系统测试。
如果出现了问题,一般会采用修改软件的方式来解决,但如果软件修改无法解决问题,那么就必须要调整硬件了,此时问题较为严重。
常用外围芯片
实时数据采集概述

【高精度 ADC 转换器】逐次逼近方式

逐次逼近方式在数电中其实也接触过,是从最高位开始,依次确定每一位的值(1 还是 0),一直到最低位。
拿上面的表格中的例子来说,假设参考电压 。
输入电压 3.4V 时,首先将最高位 置 1,由于 ,因此维持 为 1 不变;
再将次高位 置 1,由于 ,因此需要将次高位置 0;
将第三位 置 1,由于 ,因此维持 不变;
最后将最低位 置 1,由于 ,因此将最低位置 0。
经过上面的过程,最终得出 CP 输出为 1010 ,即为 DA 转换的结果。
【高精度 ADC 转换器】 调制方式

这种方式的流程图如上图所示,左侧虚线框部分是 SIGMA-DELTA 调制器,可以将输入信号的包络用比特流模拟出来,但由于左侧的采样频率为 ,是信号采样频率的 K 倍(过采样),因此需要通过右侧的数字滤波器降采样为频率为 的 N 位比特流。
在 SIGMA-DELTA 调制器中,上半部分为相加器、积分器和过零比较器,下半部分为二选一的开关,当过零比较器的输出为 1 时,开关接入 端,当输出为 0 时,开关接入 端。
假设输入信号为 ,则与下方参考信号相减后,输出会有 和 两种,经过积分器后,A 处的输出为:
其中 k 的取值为 或 , 即为 。
开始时,,B 端的信号为 ,因此 k 的值就为 , A 处的输出为 大于 0,过零比较器的输出为 1,因此开关接入 ;
积分器的输入变为 ,积分器的输出为 ,此时过零比较器的输出仍然为 1,积分器的输出在下一次 到来时再次减 。直到积分器的输出减为 0,过零比较器的输出才再次为 0,然后又会开始一轮新的循环。
最终输出结果如下:

图中 A 为积分器的输出,B 为过零比较器控制二选一开关后的输出。
Σ-Δ 调制方式是根据前一采样值与后一采样值之差进行量化编码,从某种意义上说它是根据信号的包络形状进行量化编码的。
它采用了过采样技术,以很低的分辨率(1位)和很高的采样速率将模拟信号数字化(虚线框部分的 SIGMA-DELTA 调制器),通过使用过采样技术、噪声整形技术和数字滤波技术增加有效分辨率(右侧的数字滤波器),然后根据 ADC 的有效采样速率,去除多余信息(即通过数字滤波器将频率大于 的部分滤除, 为信号最高频率),减轻数据处理负担
【高精度 ADC 转换器】积分方式
积分方式是通过积分电路把线性模拟电压转换成时间信号,在这段时间内通过计数器对标准时钟脉冲计数,计数值反映了模拟电压的大小

图中的积分器电路主要由下方的积分器、过零比较器与上方的脉冲产生器、计数器构成。
下方的积分器与过零比较器用于生成方波信号,方波信号通过和脉冲发生器产生的高频脉冲进行“与操作”,可以触发计数器进行计数(当方波信号为高电平且脉冲信号也为高电平时,与门输出高电平,计数器计一个数),这样就能够依据计数器的计数值计算出方波信号的高电平持续时间。
下面来说明具体是如何实现的:
假设电阻 R 左侧的电压输入为 ,则积分器输出 的计算公式如下:
由于积分器的输出电压 是输入到过零比较器的反相输入端,因此当 时,过零比较器输出高电平信号。
当 开关闭合时,(输入电压 始终大于 0)过零比较器的输出即为高电平,此时上方的与门输出即为脉冲产生器的输出,通过计数器可计算出 的值。
时间达到 时,开关 断开,开关 闭合,此时对 积分,积分器的输出需要考虑初值:
当 大于 0 时,计数器会一直处于计数状态,当 时,与门关闭,计数器停止计数,此时:
即:
这里需要注意的是,计数器最终的计数值实际上是 的。
通过上面的过程,即可利用积分器完成 AD 转换。该方法具有以下特点:

虽然课件中没有明确说明,不过还是能够判断出输入电压是有条件的, 的值必须大于 0,如果 有小于 0 的部分,应该对其进行正偏置。
【高速 ADC 转换器】并行比较型
并行比较型模数转换器是目前可以见到的速度最快的 ADC,分辨率一般为 8 位,最高可达 12 位,采样速率可以达到 500MSPS,全功率带宽大于 300MHz。并行比较型数模转换器结构比较简单,它由分压电阻网络、比较器阵列和优先编码器组成

图中应该是 的下标值越小,其位数越高,优先级越高。
优先编码器优先译出优先级最高的编码,比如 和 都为 0(输入 0 有效),则 会被译出, 则会被忽略。
上面的电路在数电中有学过,图中标出的参考电压值如 是运放的反相输入端参考电压。当输入电压 时, 都输出 1 , 都输出 0,此时优先级译码器会译出 100。
【高速 ADC 转换器】串-并比较型
解决高速、高分辨ADC的另一种设计思路是将两个或多个低分辨率的并行比较型ADC级联起来,合并成一个高分辨的ADC。为了减少比较器的数量,或为了达到更高的分辨率,在实际产品中,有三级甚至三级以上的分级型数模转换器。
由于各级之间是串行工作的,因此,对于一个M级的分级型ADC来说,需要M个转换周期才能完成一次采样编码。为了不降低采样速率,通常可采用流水线结构,因此又被称为流水线型或子区型(subranging) 。

上图中应该是先计算出高 4 位的值存放在 位中,然后将模拟输入减去转换后的值得到残余信号,由于残余信号比较小,因此需要先将残余信号放大 16 倍,将其当作新的输入让 ADC 转换,这样得到的残余信号的编码更加精确。
高速 ADC 转换器的注意点
- 导线无法看作是零电阻、零电抗的理想联线;
在数百兆赫兹的频率下,信号连线的延迟无法忽略,有信号延迟、信号反射、信号走线间的串扰和电路噪声等因素干扰。
- 高速 ADC 器件的选择是对速度和精度的折衷;
- 高速 ADC 器件要求时钟边沿干净,满足占空比的要求;
- 模拟电路的抗干扰方法有光耦隔离和差分;
- 性能测试采用的是动态有效位(ENOB)这个指标;
ENOB 用于衡量数据采集系统实际工作时的有效位数,是使用分辨率来衡量实际 ADC 工作时的噪声均方值与理想分辨率下的量化噪声。
实时数据存储概述
在高速实时数据存储中,有 ECL 存储和同步存储两种常用的存储方式。
ECL 具有存储速度快,容量小,功耗低的特点;同步存储具有速度快的特点。
高速实时数据存储有双端口 RAM 和先进先出存储器 FIFO 两种常用的存储结构,可与 ECL 存储、同步存储方式搭配使用。
双端口 RAM 存储器
双端口存储器是一种专用存储芯片,设有两组物理地址、数据和读写控制信号。两个 CPU 可以通过这些控制信号同时访问双端口存储器,实现数据共享。
双端口存储器的结构框图如下:

可以将上述双端口内部的结构简化为下图所示:

当双端口存储器有 四个数据需要存储与运算时:

通过双端口处理器,读写操作能够分时工作,即同一时刻内存储器的两部分处于不同的读写状态,有效地增加了 DSP 运算处理时间,提高了系统的实时性。
双端口存储器的核心就在于使用控制逻辑控制两侧开关的分时切换,一般采用 CPLD 或 FPGA 来实现。
FIFO 存储器
FIFO 是一种先进先出的存储器,即先读入的数据先读出。 FIFO器件常用作数据缓冲器,充当两个不同速率的系统之间的数据接口。
FIFO 的特点如下:
- 没有地址线,只有读写时钟,内部地址依赖于对读写时钟的计数;
- 采用满、空、半满标志来标识存储状态。
FIFO 沿敏感,使用时要特别注意匹配,并经常进行复位,避免错误积累。
FIFO 的宽度扩展:

FIFO 在系统中的常用位置如下:

高速实时电路集成
高速实时电路集成主要是通过电路的二次集成,减小系统体积和功耗,提高系统的性价比、可靠性、保密性。
高速实时电路集成一般采用以下器件来完成:

在样机阶段,推荐采用 EPLD/FPGA 技术,以减小开发风险,待技术成熟后,用 ASIC 技术进行最优的系统实现
高速实时信号的产生(数字信号→模拟信号)
主要有两种方式:① 数据存储型; ② 相位累加型。
数据存储型:

相位累加型(DDS):

使用 DDS 前,需要先将各种信号(如正弦波、方波等)的相位及相位对应的幅值存储起来,相位与幅值一一对应,形成 “相位-幅值 查找表”(如下图所示)。

假设我们以 1° 为步长存储查找表,当我们想要读出数据时,若将频率控制字设置为 1,则能够以步长为 1° 取出 0°~360° 的幅值;若将频率控制字设置为 2,则能够以 2° 为步长取出 0°~360° 的幅值(0°,3°,5°…),以此类推。也就是说,我们可以通过频率控制字来更改相位累加器中相位累加的规则取出不同的相位,再依据相位取出不同的幅值,再将这些不同的幅值通过 DAC 转换为模拟信号。【上述频率控制字对应的步长只是个例子,频率控制字为 1 不一定就是以步长为 1° 取出幅值,有更加具体的公式】
频率控制字改变的是相位间隔,更进一步说,改变的其实是输出信号的频率。比方说,我是每隔 1° 取相位,那么需要 360 次才能取完一个正弦波周期;如果是每隔 2° 取相位,那么就需要 180 次取完一个正弦波的周期,360 次就能够取完两个正弦波的周期,花费了相同的时间,前者取出一个周期,后者取出两个周期,那么后者的频率就是前者的 2 倍。
上面就是 DDS 的原理,具体的相关公式大家可以上网搜寻。
高速 PCB 设计
高速电路定义
如果线传播延时大于数字信号驱动端上升时间的 1/2,则可认为此类信号是高速信号并产生传输线效应(不能简单地将信号线看作是一个点),信号在传播过程中会有反射、驻波等现象出现。

国外有很多资料,将 1/6 作为门限,更严格的甚至为 1/10,当延时超过此门限时,可定义为高速电路, PCB 上的走线将不能用简单的集总参数来描述,而应用分布参数的传输线来描述。
信号完整性
从本质上讲,高速数字系统设计的核心问题是如何确保系统时序的正确。信号完整性(Signal Integrity)指的是信号线上信号的质量。
信号完整性问题主要包括反射、振铃、 地弹和串扰。
传输线模型及传输线效应

传输线效应如下:

延时和时序错误:
- 通常在有多个接收端时会出现,多个接收端之间可能由于延时不同,本该一起抵达的信号交错抵达造成输出错误。主要表现为逻辑电平的高低门限之间变化时,保持一段时间信号不跳变。过多的信号延时可能导致时序错误和器件功能的混乱。信号延时产生原因包括驱动过载、走线过长。
多次跨越逻辑电平门限:
- 信号在跳变过程中可能多次跨越逻辑电平门限,从而导致这一类错误的发生。多次跨越逻辑电平门限错误是信号振荡的一种特殊形式,即信号振荡发生在逻辑电平门限附近,多次跨越逻辑电平门限将导致逻辑功能紊乱。
过冲与下冲:
- 走线过长或者信号变化太快会导致过冲与下冲的发生。尽管大多数元器件的接收端有输入二极管保护,但有时过冲与下冲电平会远远超过元器件的电源电压范围,导致元器件的损坏。
串扰:
- 在一根信号线上有信号通过时,在 PCB 板上与之相邻的信号线就会感应出相关信号,这种现象叫做串扰。


电磁辐射:
- 电磁干扰(EMI)包含产生过量的电磁辐射及对电磁辐射的敏感性两个方面。 EMI 表现为数字系统加电运行时,会向周围环境辐射电磁波,从而使周围环境正常工作的电子设备收到干扰。其原因是电路的工作频率太高以及 PCB 布局布线的不合理。
避免传输线效应的方法
- 严格控制走线长度;
PCB 走线越短越好。
- 合理规划总线拓扑结构;
高速数字系统中的传输线上的阻抗不匹配会引起信号的反射。
减小和消除反射的方法是根据传输线的特征阻抗在其发送端或接收端进行阻抗匹配,从而使源反射系数或负载反射系数为 0。
- 抑制电磁干扰;
- 保持PCB板有良好的接地;
- 降低电路板的最外层信号的密度;
- 减小PCB面积。
- 电源去耦技术;
- 添加去耦电容可以以去除电源上的毛刺影响;
- 高速和高功耗的器件应尽量放置在一起;
- 走线应尽量避免线天线或环天线;
- 电源走线尽量粗而短。
高速 PCB 布线
PCB 信号线的布线:


地线以及电源的设计:

如果本篇内容对你有用,能否『请我吃根棒棒糖🍭 』🤠…