随着片上系统SOC的出现,在一个集成电路芯片中不但集成了处理器、存储器、I/O模块,还有应用软件。一个芯片就是一个复杂的控制系统。在本书附带的光盘中不但有数千页的关于Motorola 16位DSP的详细资料,还包括以C语言为基础的软件开发工具。面对浩瀚的英文资料,技术人员往往感到无从下手。本书作为一本入门书,扼要地介绍了Motorola的DSP的概况、内核结构、指令系统和片内诸多I/O模块的使用方法;介绍如何自己做一个DSP的最小系统,并让实时操作系统能跑起来,使读者在泛泛了解Motorola 16位DSP的基础上就能尽快上手,开始应用系统的设计与研发。\r\n 本书可作为高等学校研究生DSP相关课程的教材,也可供DSP应用开发工程师在芯片选型、应用开发过程中参考。
第1章 数字信号处理概论\r\n\r\n1.1 飞速发展的数字信号处理器\r\n1.2 数字信号处理与模拟信号处理\r\n1.3 DSP与CPU\r\n1.4 Motorola 的16位DSP\r\n1.4.1 56800系列 DSP\r\n1.4.2 56800系列DSP片内的外设模块\r\n1.4.3 568XX系列DSP的主要应用领域\r\n1.4.4 DSP56800系列的开发工具\r\n1.4.5 使用增强型内核56800E的16位DSP 5685X系列\r\n1.4.6 StarCore DSP系列\r\n1.5 Motorola 的24位、32位DSP\r\n\r\n第2章 DSP56800内核结构\r\n\r\n2.1 算数逻辑单元ALU\r\n2.1.1 算数逻辑单元ALU的内部结构\r\n2.1.2 算数逻辑单元ALU中的数据格式\r\n2.1.3 算数逻辑单元ALU中的数值计算\r\n2.2 地址产生单元AGU\r\n2.2. 1 AGU中的内部结构与寻址方式\r\n2.2.2 用M01寄存器定义循环缓冲区\r\n2.3 程序控制器PCU\r\n2.3.1 PCU的内部结构\r\n2.3.2 程序计数器PC与条件码寄存器CCR\r\n2.3.3 循环地址寄存器LA,循环次数寄存器LC和硬件堆栈HWS\r\n2.3.4 运行模式寄存器OMR\r\n2.4 DSP56800的存储空间分配\r\n2.5 并行处理的实现\r\n2.6 扩展型内核DSP56800E的结构\r\n\r\n第3章 DSP56800指令集与汇编语言\r\n\r\n3.1 DSP56800汇编语言\r\n3.1.1 汇编语言的格式\r\n3.1.2 常用汇编管理指令\r\n3.2 DSP56800的寻址方式\r\n3.2.1 立即数寻址与绝对地址寻址\r\n3.2.2 寄存器直接寻址\r\n3.2.3 寄存器间接寻址\r\n3.2.4 带有偏移量的寄存器间接寻址\r\n3.2.5 带事后加/减1的寄存器间接寻址\r\n3.2.6 带事后加/减n的寄存器间接寻址\r\n3.2.7 存储器绝对短寻址与I/O短寻址\r\n3.3 数据传输指令\r\n3.4 乘法与乘/加指令\r\n3.5 除法指令DIV\r\n3.6 移位指令\r\n3.7 算数与逻辑运算指令\r\n3.8 DSP56800中的并行处理\r\n3.8.1 单并行处理\r\n3.8.2 双重并行处理指令\r\n3.9 位操作与位测试指令\r\n3.10 跳转与返回指令\r\n3.11 其他控制指令\r\n3.12 规格化指令NORM\r\n\r\n第4章 DSP56800硬件设计与开发工具制作\r\n\r\n4.1 简介\r\n4.2 开发板各个部分的硬件设计\r\n4.2.1 时钟电路\r\n4.2.2 串口电路\r\n4.2.3 BDM调试工具\r\n4.2.4 供电电路\r\n4.2.5 复位电路\r\n4.2.6 调试用小灯\r\n\r\n第5章 嵌入式软件开发包SDK\r\n\r\n5.1 SDK的安装过程\r\n5.1.1 安装codewarrior\r\n5.1.2 在codewarrior的基础上安装SDK\r\n5.2 在SDK中创建一个简单工程的方法\r\n5.2.1 产生一个新的SDK工程\r\n5.2.2 从新工程中去掉main.c和sampleASM.asm\r\n5.2.3 添加应用程序\r\n5.2.4 调试程序\r\n5.2.5 修改appconfig.h中的错误\r\n5.2.6 再次调试程序\r\n5.2.7 在主程序中设断点\r\n5.2.8 运行程序\r\n5.2.9 停止调试\r\n5.3 SDK在线帮助和DSP功能函数库\r\n5.4 用DSP实现数据采集的程序\r\n5.4.1 配置config.h文件\r\n5.4.2 编写main.c文件\r\n5.5 定时器、中断和小灯驱动\r\n5.5.1 配置config.h文件\r\n5.5.2 编写main.c文件\r\n\r\n第6章 定时器、复位和中断控制\r\n\r\n6.1 定时器简介\r\n6.2 定时器特点\r\n6.3 定时器寄存器综述\r\n6.4 定时器功能描述\r\n6.5 定时器的相关寄存器\r\n6.5. 1 定时器控制寄存器\r\n6.5.2 状态和控制寄存器(SCR)\r\n6.5.3 比较寄存器#1(CMP1)\r\n6.5.4 比较寄存器#2(CMP2)\r\n6.5.5 捕捉寄存器(CAP)\r\n6.5.6 加载寄存器(LOAD)\r\n6.5.7 保持寄存器(HOLD)\r\n6.5.8 计数寄存器(CNTR)\r\n6.6 定时器A、B、C、D功能描述\r\n6.6.1 定时器A(只在DSP56F803、DSP56F805和DSP56F807中)\r\n6.6.2 定时器B(只在DSP56F805和DSP56F807中)\r\n6.6.3 定时器C\r\n6.6.4 定时器D\r\n6.7 复位模块\r\n6.7.1 复位相关模块中的寄存器\r\n6.7.2 上电复位和低电压中断\r\n6.7.3 外部复位\r\n6.7.4 看门狗模块\r\n6.7.5 STOP和WAIT模式的禁止功能\r\n6.8 中断控制器\r\n6.8.1 中断向量表\r\n6.8.2 中断控制器寄存器描述\r\n\r\n第7章 DSP56800的存储器\r\n\r\n7.1 Flash存储器\r\n7.1.1 Flash(闪速存储器)概述\r\n7.1.2 Flash寄存器\r\n7.1.3 Flash编程操作\r\n7.1.4 应用SDK进行Flash编程\r\n7.2 外扩存储器接口\r\n7.2.1 外扩存储器接口概述\r\n7.2.2 总线控制寄存器BCR\r\n7.2.3 外扩存储器举例\r\n7.3 存储器配置\r\n7.3.1 编译代码\r\n7.3.2 Linker Command文件\r\n7.3.3 SDK启动步骤\r\n\r\n第8章 串行通信接口SCI\r\n\r\n8.1 串行通信协议RS232标准\r\n8.1.1 接口信号\r\n8.1.2 电气特性\r\n8.1.3 RS232C连接方法\r\n8.1.4 RS232C标准接口的实现及电平转换\r\n8.2 SCI简介\r\n8.3 SCI引脚\r\n8.3.1 TXD引脚\r\n8.3.2 RXD引脚\r\n8.3.3 DSP56F805 EVM板上的SPI接口\r\n8.4 SCI功能\r\n8.4.1 标准不归零NRZ(Non Return to Zero)数据格式\r\n8.4.2 SCI发送器\r\n8.4.3 SCI接收器\r\n8.5 SCI寄存器\r\n8.5.1 SCI波特率寄存器SCIBR\r\n8.5.2 SCI控制寄存器SCICR\r\n8.5.3 SCI状态寄存器SCISR\r\n8.5.4 SCI数据寄存器SCIDR\r\n8.6 应用SDK开发SCI\r\n8.6.1 SCI的初始化\r\n8.6.2 SDK中有关SCI的数据结构和命令\r\n8.6.3 SDK提供的有关SCI的API\r\n8.7 SCI应用开发实例\r\n\r\n第9章 串行外设接口SPI\r\n\r\n9.1 SPI的工作原理\r\n9.2 SPI引脚\r\n9.2.1 主入从出引脚MISO\r\n9.2.2 主出从入引脚MOSI\r\n9.2.3 串行时钟引脚SCLK\r\n9.2.4 从机片选引脚SS\r\n9.2.5 DSP56F805 EVM板上的SPI接口\r\n9.3 SPI工作模式\r\n9.3.1 主机模式\r\n9.3.2 从机模式\r\n9.4 56F8xx系列DSP的SPI寄存器\r\n9.4.1 SPI状态控制寄存器SPSCR\r\n9.4.2 SPI数据宽度寄存器SPDSR\r\n9.4.3 SPI接收数据寄存器SPDRR\r\n9.4.4 SPI发送数据寄存器SPDTR\r\n9.5 应用SDK开发DSP的SPI\r\n9.5.1 SPI的初始化\r\n9.5.2 SDK有关SPI的数据结构\r\n9.5.3 SDK有关SPI的API\r\n9.6 SPI应用开发实例\r\n\r\n\r\n第10章 模数转换器ADC\r\n\r\n10.1 模数转换器功能简介\r\n10.2 寄存器概述\r\n10.2.1 ADC控制寄存器1--ADC Control Register 1\r\n10.2.2 ADC控制寄存器2--ADC Control Register 2\r\n10.2.3 ADC过零控制寄存器ADZCC--ADC Zero Crossing Control Register\r\n10.2.4 ADC通道列表寄存器ADLST1和ADLST2--ADC Channel List Registers\r\n10.2.5 ADC采样允许寄存器ADSDIS--ADC Sample Disable Register\r\n10.2.6 ADC状态寄存器 ADSTAT--ADC Status Register\r\n10.2.7 ADC域值状态寄存器ADLSTAT--ADC Limit Status Register\r\n10.2.8 ADC过零状态寄存器ADZCSTAT--ADC ZERO Crossing Status Register\r\n10.2.9 ADC结果寄存器 ADRSLT 0~7--ADC Result Registers\r\n10.2.10 ADC低高域值寄存器 ADHLMT 0~7和ADLLMT 0~7--ADC LOW AND HIGH LIMIT Register\r\n10.2.11 ADC偏移寄存器ADOFS 0~7--ADC Offset Registers\r\n10.3 A/D驱动\r\n10.3.1 使用ADC驱动(driver)的步骤\r\n10.3.2 详细介绍ADC的驱动\r\n\r\n第11章 相位检测器\r\n\r\n11.1 相位检测器的引脚描述\r\n11.1.1 A相输入引脚PHASEA\r\n11.1.2 B相输入引脚PHASEB\r\n11.1.3 输入引脚INDEX\r\n11.1.4 转换输入引脚HOME\r\n11.2 相位检测器的功能描述\r\n11.2.1 正向和反向\r\n11.2.2 功能框图\r\n11.2.3 用于低速或高速测量的预分频器\r\n11.2.4 工作模式\r\n11.3 锁存寄存器和初始化寄存器\r\n11.4 寄存器定义\r\n11.4.1 相位检测器控制寄存器DECCR\r\n11.4.2 滤波器采样间隔寄存器FIR\r\n11.4.3 看门狗定时溢出寄存器WTR\r\n11.4.4 位置差寄存器POSD\r\n11.4.5 位置差锁存寄存器POSDH\r\n11.4.6 转角寄存器REV\r\n11.4.7 转角锁存寄存器REVH\r\n11.4.8 高16位位置寄存器UPOS\r\n11.4.9 低16位位置寄存器LPOS\r\n11.4.10 高16位位置锁存寄存器UPOSH\r\n11.4.11 低16位位置锁存寄存器LPOSH\r\n11.4.12 高16位初始化寄存器UIR\r\n11.4.13 低16位初始化寄存器LIR\r\n11.4.14 输入监控寄存器IMR\r\n11.4.15 测试寄存器TSTREG\r\n11.5 SDK中有关相位检测器的部分\r\n11.5.1 相关数据结构\r\n11.5.2 与硬件无关的接口函数定义\r\n11.5.3 底层设备驱动接口函数定义\r\n\r\n第12章 脉宽调制模块PWM\r\n\r\n12.1 PWM脉宽调制模块的主要特性\r\n12.2 PWM脉宽调制模块的引脚\r\n12.3 PWM脉宽调制模块的寄存器\r\n12.4 PWM脉宽调制模块的主要功能描述\r\n12.4.1 预分频\r\n12.4.2 PWM发生器\r\n12.4.3 独立通道模式和互补通道模式\r\n12.4.4 死时间产生器\r\n12.4.5 软件控制输出\r\n12.4.6 PWM发生器参数重载\r\n12.4.7 出错保护功能\r\n12.4.8 中断\r\n12.5 PWM寄存器\r\n12.5.1 PWM控制寄存器PMCTL\r\n12.5.2 PWM出错控制寄存器PMFCTL\r\n12.5.3 PWM出错状态和确认寄存器PMFSA\r\n12.5.4 PWM输出控制寄存器PMOUT\r\n12.5.5 PWM计数器PMCNT\r\n12.5.6 PWM计数模寄存器PWMCM\r\n12.5.7 PWM计数值寄存器PWMVAL0~5\r\n12.5.8 PWM死时间寄存器PMDEADTM\r\n12.5.9 PWM失效映射寄存器PMDISMAP1~2\r\n12.5.10 PWM配置寄存器PMCFG\r\n12.5.11 PWM通道控制寄存器PMCCR\r\n12.5.12 PWM端口寄存器PMPORT\r\n\r\n第13章 PWM模块的SDK编程\r\n\r\n13.1 PWM模块的编程\r\n13.1.1 与PWM模块相关的几个主要的文件\r\n13.1.2 arch.h文件中定义的结构体\r\n13.1.3 在pwm.h文件中定义的结构体\r\n13.1.4 SDK提供的编程接口\r\n13.2 AC交流感应电机的控制\r\n13.2.1 流程图\r\n13.2.2 相关文件源代码分析\r\n13.2.3 程序运行结果\r\n13.3 利用PWM模块实现对直流无刷(BLDC)电机的控制\r\n13.3.1 直流无刷电机\r\n13.3.2 电机控制过程\r\n13.3.3 源文件结构和功能分析\r\n\r\n第14章 CAN控制器局域网模块\r\n\r\n14.1 CAN的性能特点\r\n14.1.1 CAN总线分层结构\r\n14.1.2 报文传送和帧结构\r\n14.1.3 位编码解码\r\n14.2 MSCAN模块\r\n14.2.1 特性\r\n14.2.2 MSCAN模块结构\r\n14.2.3 MSCAN模块操作\r\n14.3 范例程序\r\n14.3.1 MSCAN初始化\r\n14.3.2 MSCAN发送接收中断\r\n14.3.3 主程序\r\n\r\n第15章 数字滤波器的DSP实现\r\n\r\n15.1 FIR滤波器的DSP实现\r\n15.1.1 FIR滤波器原理\r\n15.1.2 FIR滤波器的典型程序\r\n15.1.3 FIR滤波器的C语言程序\r\n15.1.4 SDK的FIR滤波器算法库调用\r\n15.2 IIR滤波器的DSP实现\r\n15.2.1 IIR滤波器原理\r\n15.2.2 IIR滤波器的典型程序\r\n15.2.3 IIR滤波器的C语言程序\r\n15.2.4 SDK的IIR滤波器算法库\r\n\r\n第16章 在568xx系列DSP上运行 RTOS \r\n\r\n16.1 在嵌入式系统应用中使用实时操作系统\r\n16.2 嵌入式实时内核 μC/OS和 μC/OS-II\r\n16.3 μC/OS和μC/OS-II 的特点\r\n16.4 实时多任务系统中的一些基本概念\r\n16.4.1 不使用RTOS的系统\r\n16.4.2 任务与多任务\r\n16.4.3 任务切换与调度\r\n16.4.4 嵌入式实时多任务系统\r\n16.4.5 实时内核(the real time kernel)\r\n16.4.6 任务优先级分配\r\n16.4.7 优先级反转问题\r\n16.4.8 任务间的竞争\r\n16.4.9 死锁\r\n16.4.10 可重入性\r\n16.4.11 时钟节拍\r\n16.4.12 信号与信号量(semaphores)\r\n16.5 μC/OS的任务调度机制\r\n16.6 μC/OS-II与Motorola DSP\r\n16.7 向DSP56800上移植μC/OS-II\r\n16.8 关于μC/OS-II V2.51\r\n16.9 任务栈结构与DSP中断机制\r\n16.10 关于在DSP上运行RTOS的讨论\r\n\r\n附录 DSP56800光盘\r\n\r\n参考文献
Motorola是世界上单片机的最大供应商。在8位、16位、32位单片机方面,它占有世界市场份额在20%左右;而排在第二位的单片机厂商,占有市场份额不足10%。在单片机方面,由于8位单片机,如MC68HC05、68HC08,以及增强型8位单片机,如68HC11、68HC13不断有新型号推出,价格趋低,性能走强;而32位的单片机如683xx、ColdFire以及以PowerPC作CPU的MPC8xx、MPC555等种类繁多,价格也不贵,使得16位单片机68HC16生存空间有限。Motorola的16位DSP却因功能强大,价格低廉(7~12美元),在工业控制、汽车电子、消费类电子产品、电机变频控制、音频压缩与解码、数码相机、图像处理等方面开辟了又一片广阔天地。 说它是DSP,是因为它的内核的确是DSP;而说它是单片机是因为它具有单片机的所有优点,片内集成了相当容量的ROM(Flash)、RAM以及丰富的I/O模块,单芯片就能运行,加上应用程序就是一片片上系统(system on chip)。
DSP由于要实现高速的乘法、乘/加等运算,要实现指令的并行处理,内部结构是非常复杂的。各种不同型号的16位Motorola DSP又集成了相当丰富的I/O模块,如适于电机控制及汽车汽缸点火控制的PWM模块,用于各种时序控制的实时模块,用于同步、异步通信的SPI、SCI模块,用于现场总线控制的CAN模块,用于数据采集的A/D变换模块等。书中附带的光盘中包含了数千页的Motorola DSP相关芯片的英文资料。面对这些浩瀚的原文资料,读者会有无从下手的感觉。
好在Motorola对16位DSP提供了很好的开发资料;而DSP本身利用JTAG接口,接受后台的调试方式,即Back grand Debug Mode,可以通过PC 机的并行口与DSP的JTAG接口相连。这种连接,几乎不需要任何硬件的MDM调试工具,仅仅是因为Motorola DSP多为3V供电;而PC机的并口是TTL电平,以5V供电。虽然DSP的I/O端口也接受TTL电平;但为了PC机与DSP双方的安全,BDM硬件调试工具仅仅是完成对3V供电的DSP系统与5V供电的PC系统之间的电平保护而已。
由于Motorola提供了基于C语言的开发工具、IDE的集成环境以及SDK等先进的开发工具(见附带的光盘),使读者在不太熟悉Motorola DSP的时候就可以开始设计一个DSP的最小单片系统。利用光盘中提供的开发软件,结合本书提供的实例,边熟悉Motorola 16位DSP的开发方法,做一些相关I/O模块的实验,边开发自己的应用程序。
在Motorola提供的各种DSP评估板和开发工具的基础上,本书的作者们作了大量实验,设计了基于DSP56807的最小系统和开发工具。书中所有程序,无论是作者自己编写的还是Motorola提供的,都在计算机或评估板上验证过。 本书第1章介绍Motorola DSP的概况,目的是告知读者如何选择最适合自己应用的DSP。第2章描述16位Motorola DSP的内部结构,说明为何能实现指令的并行处理与高速运算。第3章介绍DSP56800内核的汇编指令,虽然DSP56800主要是用C语言开发的,但汇编语言仍是基础,它可以插在C语言程序中,用在那些时间要求最苛刻的地方以及同硬件直接打交道的地方。第4章向读者介绍怎样做一块DSP的最小系统,怎样做一个BDM的调试工具,搭建一个自己做的DSP开发的硬件平台。第5章讲如何用C语言开发DSP应用以及Motorola提供的开发工具的用法。从第6章开始至第11章,介绍各I/O模块的使用方法,包括中断、定时器的编程,Flash的写入与擦除技术,SCI、SPI、A/D变换、编码/解码模块的使用方法等。第12、13章着重介绍如何用PWM来控制各种电机。第14章讲解DSP中CAN通信模块的编程。第15章描述Motorola提供的各种算法库。第16章介绍如何将源码公开的实时嵌入式操作系统μC/OS-II移植到56800系列DSP上。
本书中用到的软件开发工具主要有两个,一个是DSP的C交叉编译器,另一个是Motorola的嵌入式软件开发包SDK。
DSP的C交叉编译器是Metrowerk公司的产品CodeWarrior的DSP部分。 Metrowerk是Motorola控股的软件公司, CodeWarrior是专门为Motorola的MCU与DSP产品设计的交叉C编译器。CodeWarrior还包括集成开发环境IDE、工程管理器和汇编、链接软件、全部基于软件的DSP仿真工具、源码级的调试工具Gebug等。用户可以通过互联网向Metrowerk公司申请CodeWarrior的免费光盘,免费使用期为一个月。Metrowerk的网址是:https://www.metrowerks.com/。
嵌入式软件开发包SDK是Motorola为用户提供的API(Application Program Interface),包括I/O模块的设备驱动程序库、标准的DSP算法程序库、DSP硬件支持包(board support package),提供中断管理、存储管理等服务,可以做到软硬件分离、应用与驱动程序复用。可以使用户在不太熟悉Motorola DSP时能较快地上手,开发自己的应用程序。
本书中使用的是SDK2.4版本,也可以从互联网上下载最新版本的SDK,还可以通过互联网向Motorola申请免费的SDK光盘。做法是:到Motorola半导体网站http://www.motorola.com/semiconductors,查找关键字“SDK”,然后找到“MSW3SDK000AA Product Summary Page”,再按照网页上的提示下载SDK或在网上索取免费的光盘。
本书第1、2、3和16章由邵贝贝编写,第4、5和第10章由刘永毅编写,第6章由薛涛编写,第7和第15章由蒋俊峰编写,第8、9章由马伟编写,第11章由杨世明编写,第12、13章由邵森龙编写,第14章由龚光华编写。特别感谢Motorola公司的 Victor Kwong先生在DSP开发的技术指导以及光盘制作方面做的大量工作;感谢本部设在日内瓦的Motorola 分支机构的Charles Edouard Cordonnier 先生和他领导的设在捷克的Motorola DSP 实验室的朋友们,他们不远万里从欧洲来到北京为我们做了高水平的、关于DSP开发的培训;还要感谢Motorola亚太区总部的刘显礼先生、金功九先生等长期以来对本中心工作的大力支持。
本书中用到的开发工具SDK2.4 可以从Motorola的网站上下载。