DSP-原理及应用整套教学课件

DSP-原理及应用整套教学课件

ID:81929114

大小:40.30 MB

页数:1118页

时间:2023-10-26

上传者:可爱的嘎嘎
DSP-原理及应用整套教学课件_第1页
DSP-原理及应用整套教学课件_第2页
DSP-原理及应用整套教学课件_第3页
DSP-原理及应用整套教学课件_第4页
DSP-原理及应用整套教学课件_第5页
DSP-原理及应用整套教学课件_第6页
DSP-原理及应用整套教学课件_第7页
DSP-原理及应用整套教学课件_第8页
DSP-原理及应用整套教学课件_第9页
DSP-原理及应用整套教学课件_第10页
资源描述:

《DSP-原理及应用整套教学课件》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

DSP原理及应用

1课程介绍一、基本内容1.了解DSP芯片的现状、发展与相关知识,合理选择适当的芯片。2.理解DSP芯片的基本原理与特点,硬件结构包括CPU结构、总线结构、时钟模块等。3.掌握DSP芯片的系统配置和中断模块、存储器分配等。对DSP芯片的硬件结构和组成有所了解。

2课程介绍4.掌握程序设计语言,流水线概念。理解常用算法的基本实现方法。5.掌握DSP芯片数字输入/输出I/O,事件管理器等基本原理与使用方法。6.熟悉DSP集成开发环境CCS。实现工程建立、程序编辑、编译连接和调试等环节。

3CCStudio3.3软件CodeComposerStudio3.3完成系统的软件开发和调试。提供一整套的程序编制、编译、调试环境,能将汇编语言和C语言程序编译连接生成COFF(公共目标文件)格式的可执行文件;并能将程序下载到目标DSP上运行调试。集成调试环境CCS

4仿真模式:Emulator和Simulator模式应用区别:当需要把编译、链接生成的可执行代码下载到带有DSP实时硬件上运行调试时用Emulator;如果只调试一些基本信号处理或控制算法用Simulator,但代码执行的效率的评估和优化很难实现。集成调试环境CCS

5集成调试环境CCSCCS调试界面当前程序执行点工程文件菜单条断点输出窗口命令窗口存储器窗口

6集成调试环境CCSC源代码级调试

7集成调试环境CCSCodeComposerStudio™功能强大、开放型实时开发工具DSP领域第一个:完整的、开放型集成开发环境(IDE)直观、易用在无需停止DSP运行,即可观察DSP的信息具有实时分析功能可加入第三方插件(Plug-Ins)

8最新DSP相关网站//www.ti.com.cnTMS320F283xControllersPressRelease:10/04/07-NEWTIFLOATING-POINTF28335EZDSP™STARTERKITSPEEDSDEVELOPMENTFORGREENERINDUSTRIALAPPLICATIONS

9主要内容1DSP技术概述2TMS320F2812内部资源3中断系统与应用4GPIO功能与CPU定时器5存储器与外部接口XINTF6事件管理器7串行通信接口SCI8A/D转换模块与数据采集9DSP软件开发与C语言编程10串行外设接口SPI

10主要内容11基于DSP的无刷直流电机控制12基于DSP的数字信号处理算法13异步感应电机DSP的矢量控制

111.1什么是DSP1.2DSP技术的发展与现状1.3DSP分类及主要技术指标1.4DSP的应用1.5DSP的基本结构及主要特征第一章DSP技术概述

121.1什么是DSPDSP有两种意思:数字信号处理技术(DigitalSignalProcessing)数字信号处理器(DigitalSignalProcessor)根据上下文应能明白其具体含义。大多数情况下,DSP代表数字信号处理器。本课程主要讲解TI公司TMS320家族的通用DSP芯片及其应用。第一章DSP技术概述

13数字信号处理是数字信号进行分析、处理,侧重于理论分析、算法确定及软件实现。快速傅里叶变换(FFT)、有限冲击响应滤波器(FIR)、无限冲击响应滤波器(IIR)、卷积等。第一章DSP技术概述

14要实时地完成某种算法,需要有特殊的硬件支持,硬件支持的最佳方案之一是数字信号处理器。在数字信号处理中需要频繁地进行大量数据的乘法和加法运算,以前是利用大型计算机进行卷积、滤波等算法的研究,实现系统的模拟和仿真。第一章DSP技术概述

15后来使用微型计算机,体积仍然比较大,成本也比较高,特别是不易嵌入到产品中。在20世纪80年代初,科技人员开发出了基于超大规模集成电路技术和计算机技术的数字信号处理器——DSP芯片第一章DSP技术概述

16DSP芯片是集成高速乘法器,具有多组内部总线,能够进行快速乘法和加法运算,适用于高速数字信号处理。体积小、功耗小、使用方便、实时处理迅速、处理数据量大、处理精度高、性能价格比高等优点。第一章DSP技术概述

171.2DSP技术的发展与现状第一代的DSP芯片包括:1982年日立公司开发的61810,TexasInstruments(TI)公司开发的TMS32010等。

181982年,TI推出第一代DSP芯片TMS320C105MIPS4KRAM3微米工艺55000个晶体管1.2DSP技术的发展与现状

191.2DSP技术的发展与现状第二代的DSP芯片有:1985年TI公司开发的TMS320C20;1986年NEC公司开发的µpd77230,AD公司开发的ADSP2100,MOTOROLA公司开发的DSP5600等。与第一代相比,在功能、速度及内存容量方面都有了很大的突破,强化和完善了指令功能及寻址方式。

201.2DSP技术的发展与现状第三代的DSP芯片是:1987年TI公司开发的TMS320C30和1991年开发的TMS320C40,以及MOTOROLA公司开发的DSP96002,AD公司开发的ADSP21000系列等。这些芯片都是在第一、二代的基础上,为满足高速实时信号处理技术需求而开发的32位浮点数信号处理器。

211.2DSP技术的发展与现状第四代开发的DSP芯片:TI公司开发的TMS320C2XX/C5X/C54X,TMS320C62XX/C67XX/C8X等;AD公司开发的ADSP210XX/211XX等;第四代DSP芯片在第一、二、三代芯片的基础上增加了多处理器并行工作,单独的DMA总线等多种功能。

221.2DSP技术的发展与现状第五代产品。第五代DSP芯片TMS32C62x/C67x/C64x;以及DSP芯片TMS32C55x+ARM核=OmapDSP主要厂商:美国TI、AD、Motorola等公司。TI公司位居榜首,占全球DSP市场约60%左右。美国德州仪器公司(TexasInstruments,简称TI)美国模拟器件公司(AnalogDevices,简称AD)

23定点与浮点241.3.1DSP的分类定点DSP芯片浮点DSP芯片1.3DSP分类及主要技术指标1.按数据格式分按数据格式分可分为定点芯片和浮点芯片。

241.3DSP分类及主要技术指标定点DSP芯片TMS320C2000系列TMS320LF2407ATMS320F2812定点DSP芯片按照定点的数据格式进行工作;其数据长度通常为16位、24位、32位。定点DSP特点:体积小、成本低、功耗小、对存储器的要求不高;但数值表示范围较窄,要防止结果的溢出。

251.3DSP分类及主要技术指标定点DSP芯片TMS320C5000系列5402,C5404,C5409,C5502,C5509,C5510TMS320C6000系列C6204,C6205,C6414,C6415,C6416

261.3DSP分类及主要技术指标浮点DSP芯片按照浮点的数据格式进行工作,其数据长度通常为32位、40位。浮点数的数据表示动态范围宽,运算中顾及小数点的位置。硬件结构相对复杂、功耗较大,且比定点DSP芯片的价格高。浮点DSP芯片使用在对数据动态范围和精度要求较高的系统中。不同的DSP的浮点格式不一定完全一样。如IEEE的标准浮点格式(如摩托罗拉的MC96002)、自定义的浮点格式(如TI公司的TMS320C3X)。

271.3DSP分类及主要技术指标浮点DSP芯片TMS320F28335TMS320C3X(C30,C31,C32)TMS320C67XX(C6701,C6711,C6712)

281.3DSP分类及主要技术指标2.按照用途分类DSP按照用途分类可分为:通用型和专用型。通用型:适用于普通的数字信号处理应用。如TI公司的一系列DSP芯片属于通用型DSP芯片。专用型:为特定的DSP运算而设计的,更适合特殊的运算。例如,卷积、数字滤波、FFT等。如MOTOROLA公司的DSP56200等。本课程主要讨论通用DSP芯片。如TI公司TMS320系列

291.3DSP分类及主要技术指标1.3.2DSP的主要技术指标1.时钟频率。(1)DSP内部工作主频,真正的工作频率。内部主频越高,DSP的数据处理速度越快。(2)DSP的外部时钟频率,是DSP片外所加的实际时钟频率,这个时钟频率一般要经过DSP内部的锁相环倍频至DSP的内部工作主频。

301.3DSP分类及主要技术指标2.指令周期指令周期是执行一条指令所需的时间。指令周期以ns(纳秒)为单位。大多数DSP的指令是单周期指令;DSP的指令周期实际上也是时钟周期。主频为40MHz的TMS320C2000芯片的指令周期为1/40MHz=25ns。

311.3DSP分类及主要技术指标3.MIPSMIPS(MillionsofInstructionPerSecond);即每秒执行的百万条指令。TMS320LF2407A的MIPS为40MIPSTMS320F2812的MIPS为150MIPS使用超长指令字的TMS320C6XXX(如C6202),处理能力为2000MIPS(每秒执行20亿条指令),300MHz时钟的TMS320C6203可达2400MIPS。

321.3DSP分类及主要技术指标4.MOPSMOPS(MillionsofOperationPerSecond)每秒执行的百万条操作。但是操作次数并不等于指令条数。一般完成一条指令需要若干次操作。不同的DSP对于操作的定义不同,不同指令所需要完成的操作次数也不相同。MOPS指标只是相对于同一种DSP系列使用才有意义。

331.3DSP分类及主要技术指标操作除了包括CPU的操作外,还包括地址计算、数据传输、I/O操作等。如200MHz时钟的TMS320C6201可达2400MOPS。

341.3DSP分类及主要技术指标5.MFLOPSMFLOPS(MillionsofFloatOperationPerSecond),每秒执行的百万次浮点运算;MFLOPS是描述浮点DSP芯片处理性能重要指标。指浮点DSP内部浮点处理单元每秒钟执行浮点运算的次数。如TMS320C67XX可以达到1GMFLOPS。

351.3DSP分类及主要技术指标6.MACSMACS是指DSP在1秒内完成乘/累加运算的次数。乘/累加运算是数字信号处理算法中的基本运算。DSP的应用涉及到许多乘/累加运算以外的运算。MACS并不是全面评价DSP性能的指标。

36C2000系列DSPC2xx子系列:16位定点DSP、20MIPS代表器件:TMS320F206PZC24x子系列:16位定点DSP、20MIPS代表器件:TMS320F240LF240x子系列:16位定点DSP、40MIPS代表器件:TMS320LF2407F28x子系列:32位定点DSP、150MIPS代表器件:TMS320F2812、TMS320F2810

37C2000系列DSPC,LF,LC,F含义C—CMOS;LC—3.3V,低功耗,CMOS;F—片内带Flash;LF—3.3V,低功耗,片内带Flash;A——芯片带加密位。

38UpTo40MIPSControlPerformanceHigh-PrecisionControlC242F241LC2404ALF2401ALC2402AMulti-Function,Appliance&ConsumerControlF240F243LC2406ALF2402ALF2403ALF2406ALF2407AF2810128-LQFPF2812176-LQFPF2812179-u*BGA150MIPS!SoftwareCompatibleHigh-endDerivativesApplicationspecificversionsScaledDownversionsC2000系列DSP

39C2000™HighPerformance32-bitandLegacyControllers (UpdatedAugust25,2008)

401.4DSP的应用主要应用:(1)数字信号处理运算:快速傅立叶变换(FFT),卷积,数字滤波,自适应滤波,相关,加密等。(2)通信:调制解调器,数据加密,数据压缩,纠错编码,可视电话等。(3)语音处理:语音编码,语音合成,语音识别,语音存储等。FM

411.4DSP的应用(4)电机和机器人控制:可采用先进的神经网络和模糊逻辑控制等人工智能算法。(5)自动测试诊断设备及智能仪器仪表、虚拟仪器:自动测试设备集高速数据采集、传输、存储、实时处理于一体,是DSP又一广阔应用领域。

421.4DSP的应用(6)图像处理:二维、三维图形处理,图像压缩、传输与增强,模式识别等。(7)军事:保密通信,雷达处理,声纳处理,导航,制导等。

431.4DSP的应用(8)自动控制:机器人控制,自动驾驶,声控,发动机控制等。(9)汽车:防滑刹车,引擎控制,伺服控制,振动分析,安全气囊的控制器等。一辆现代的高级轿车上,有多处电子控制设备上用到了DSP技术。

441.5DSP的基本结构及主要特征DSP是一种具有特殊结构的微处理器;DSP总线结构大都采用了程序和数据分开的形式;并具有流水线操作的功能。单周期完成乘法的硬件乘法器以及一套适合数字信号处理运算的指令集。

451.5DSP的基本结构及主要特征DSP的基本结构及主要特征1.程序和数据分开的哈佛结构将程序和数据存储在两个不同的存储空间中。程序存储器空间和数据存储器空间分别独立编址。

461.5DSP的基本结构及主要特征传统的冯.诺依曼结构:程序存储器和数据存储器共用一个公共的存储空间和单一的地址和数据总线;依靠指令计数器中提供的地址来区分是指令、数据还是地址。取指令和取数据都访问同一存储器空间,数据的吞吐率低。

471.5DSP的基本结构及主要特征采用哈佛(Harvard)结构体系DSP芯片采用程序总线、数据总线分别独立并具有多条总线。程序存储器和数据存储器是两个相互独立的存储器;每个存储器独立编址,用独立的程序总线、数据总线或多条总线分别进行访问。

48多总线结构ROM/ FlashSARAMB0 DARAMB1,B2 DARAMMemory- Mapped Registers外部地址总线外部数据总线ControlBusPABDRABDWABPRDBDRDBDWEBExternal SignalsCPUOn-Chip Peripherals/ Registers

49TMS320C2000器件内部有6条总线。(1)PAB(程序地址总线):提供读、写程序存储器的地址。(2)DRAB(数据读地址总线):提供读数据存储器的地址。(3)DWAB(数据写地址总线):提供写数据存储器的地址。1.5DSP的基本结构及主要特征

50(4)PRDB(程序读总线):将指令代码、立即操作数和表信息从程序存储器传送到CPU。(5)DRDB(数据读总线):将数据存储器中的数据送到中央算术逻辑单元(CALU)等。(6)DWEB(数据写总线):发送数据到数据存储器。1.5DSP的基本结构及主要特征

511.5DSP的基本结构及主要特征2.流水线操作由于DSP芯片采用多组总线结构,允许CPU同时进行指令和数据的访问。因此,可执行流水线操作。执行一条指令,要经过取指、译码、取数、执行运算,需要若干个指令周期才能完成。流水线技术是将各个步骤重叠起来进行。

52流水线操作100AddSubMpyStore指令周期F1101D1F2102R1D2103E1R2D3F3F4104E2R3D4105E3R4106E4F-取指D-译码R-取数E-执行完整的流水线

531.5DSP的基本结构及主要特征DSP的流水线结构是指它的这几个阶段在执行过程中是重叠的:第一条指令取指后进行译码时,第二条指令取指;第一条指令取数据时,第二条指令译码,第三条指令取指;……即在任意给定的周期内,有1~4条不同的指令是激活的,每一条指令都处于不同的阶段。

541.5DSP的基本结构及主要特征在执行本条指令时,下面的3条指令已依次完成了取指、译码、取数的操作。尽管每一条指令的执行时间仍然是几个时钟周期,但由于指令的流水作业,使得每条指令基本上都是单周期指令。

551.5DSP的基本结构及主要特征3.专门的硬件乘法器和乘加指令MAC在数字信号处理的算法中,大量的运算是乘法和累加,乘法和累加要占用绝大部分的处理时间。在DSP中有乘法器和累加器,取两个操作数到乘法器中进行乘法运算,并将乘积加到累加器中。

561.5DSP的基本结构及主要特征在数字信号处理算法中,乘法和累加是基本的大量的运算。例如,数字滤波、卷积、向量和矩阵运算中,有大量的乘法和累加运算。A(K)×B(K)再累加求和。

571.5DSP的基本结构及主要特征DSP设置了硬件乘法器以及乘加指令MAC,在单周期内取两个操作数一次完成乘加运算。DSP中设置的硬件乘法器和MAC(乘法并累加)一类的指令,可以使这些运算的速度大大提高,而硬件乘法器则是DSP实现快速运算的重要保障。

581.5DSP的基本结构及主要特征4.特殊的DSP指令许多指令是多功能指令,即一条指令可以完成几种不同的操作,或者说一条指令具有几条指令的功能。如TMS320C2000中的MACD指令,在一个指令周期内完成乘法、累加和数据移动3项功能,相当于执行多条指令。

591.5DSP的基本结构及主要特征5.丰富的片内存储器件和灵活的寻址方式片内集成Flash和双口RAM,通过片内总线访问这些存储空间,大大提高了数据的读/写速度。6.独立的直接存储器访问(DMA)总线及其控制器DSP为DMA单独设置完全独立的总线和控制器。

601.5DSP的基本结构及主要特征7.高速的指令运行周期。采用上述措施,DSP指令周期可为几十ns至几ns,甚至1ns以下。

61DSP特色:强大数据处理能力和高运行速度;是最值得称道的两大特色。是数字化电子世界中日益重要的电脑芯片。总结

62TMS320™系列DSP芯片高性能的数字控制低功耗的手持设备高性能的DSP应用

63DSP控制系统

64电机控制器

65POS机

66

67作业1.流水线的含义是什么?2.叙述MIPS的含义?

68CPU的主要寄存器累加器(ACC,AH、AL)辅助寄存器(XAR0-XAR7,AR0-AR7)状态寄存器(ST0)状态寄存器(ST1)2.1CPU内部结构

69

702.1CPU内部结构

71

72

73累加器可以单独存取的结构累加器(ACC、AH、AL)2.1CPU内部结构

74累加器(ACC)是CPU的主要工作寄存器。除了对存储器和寄存器的直接操作外,所有的算术逻辑单元(ALU)操作结果最终都要送入ACC。对ACC可以单独进行16位/8位的访问,即把ACC分为两个独立的16位寄存器AH(高16位)和AL(低16位),而AH和AL的高/低字节也可进行独立访问。2.1CPU内部结构1.累加器(ACC,AH、AL)

75乘数寄存器XT的分半单独存取结构乘数寄存器(XT、T、TL)和乘积寄存器(P、PH、PL)2.1CPU内部结构

762.被乘数寄存器(XT)被乘数寄存器XT的主要作用是:在32位乘法操作之前,存放一个32位有符号整数值。可以将XT分为两个独立的16位寄存器。XT寄存器的低16位部分是TL寄存器,该寄存器能装载一个16位有符号数,自动对它进行符号扩展,然后将其送入32位的XT寄存器中。XT寄存器的高16位部分是T寄存器,该寄存器主要用来存储16位乘法操作开始前的16位整数值。2.1CPU内部结构

77P寄存器的分半单独存取结构2.1CPU内部结构

783.乘积寄存器(P、PH、PL)乘积寄存器P主要用来存放乘法运算的结果。它可以直接存入一个16位常数,也可以从一个16位/32位的数据存储器空间、16位/32位的可寻址CPU寄存器以及32位累加器中读取数据。P寄存器可以作为一个32位寄存器或两个独立的16位寄存器PH(高16位)和PL(低16位)来使用。2.1CPU内部结构

79辅助寄存器(XAR0~XAR7、AR0~AR7)XAR0~XAR7寄存器2.1CPU内部结构

804.辅助寄存器(XAR0~XAR7,AR0~AR7)CPU提供8个32位的辅助寄存器:XAR0、XAR1、XAR2、XAR3、XAR4、XAR5、XAR6和XAR7,它们可以作为地址指针指向存储器,或者作为通用目的寄存器来使用。2.1CPU内部结构

81状态寄存器(ST0,ST1)C28xCPU有两个重要的状态寄存器:ST0和ST1,其中包含着不同的标志位和控制位。ST0包含指令操作所使用或影响的控制或标志位,如溢出、进位、符号扩展等。ST1则主要包含一些特殊的控制位,如处理器的兼容模式选择、寻址模式配置等。2.1CPU内部结构

82状态寄存器ST0OVC/OVCU:溢出计数器。PM:乘积移位模式位。V:溢出标志。N:负标志位。Z:零标志。C:进位位。TC:测试/控制标志。OVM:溢出模式位。SXM:符号扩展模式位。·2.1CPU内部结构

83状态寄存器ST1ARP:辅助寄存器指针。XF:XF状态位。该位反映了输出引脚XF的状态。该位可以用指令”SETCXF”置1,用指令”CLRCXF”清零。复位时该位为0。M0M1MAP:存储器M0和M1映射模式位。在C28x目标模式下,M0M1MAP一直保持为1,这是复位时的默认值。OBJMODE:目标匹配模式位。用来在C27x目标模式(OBJMODE=0)和C28x目标模式(OBJMODE=1)之间进行选择。复位时为0。可以用指令”SETCOBJMODE”使该位置1选择C28x目标模式。AMODE:地址模式位。复位时为0。2.1CPU内部结构

84IDLESTAT:空闲状态位。EALLOW:仿真允许访问使能位。为1时,可以访问受保护的外设寄存器。用EALLOW指令置1此位,用EDIS指令清除此位。LOOP:循环指令状态位。SPA:堆栈指针定位(StackPointerAlignment)位。VMAP:向量映射(VectorMap)位。2.1CPU内部结构VMAP决定CPU中断向量(包括复位向量)被映射到程序存储器的最低地址还是最高地址。0:CPU中断向量映射到程序存储器低地址,地址为0x000000~0x00003F1:CPU中断向量映射到程序存储器高地址,地址为0x3FFFC0~0x3FFFFF对于C28xCPU,VMAP内部被置1。复位时,强制使VMAP被置1。

85DBGM:DBGM,Debug使能屏蔽位。当DBGM置1时,仿真器不能实时访问存储器和寄存器,调试者不能更新它的窗口。0:Debug事件使能,1:Debug事件禁止。可以用指令”CLRCDBGM”使DBGM清零。INTM:全局中断屏蔽位。该位可以全局使能或禁止所有的CPU可屏蔽中断。2.1CPU内部结构0:可屏蔽中断被全局使能。1:可屏蔽中断被全局禁止。可以用指令”CLRCINTM”使INTM清零。

862.1CPU内部结构图2-516×16位乘法框图

872.1CPU内部结构图2-632×32位乘法框图

882.1CPU内部结构

89可屏蔽中断1.CPU中断标志寄存器IFR(InterruptFlagRegister)如果有一个可屏蔽中断被悬挂,等待CPU响应,IFR中相应位为1,否则IFR中相应位为0。图2-7中断标志寄存器IFR

90可屏蔽中断2.CPU中断使能寄存器IER(InterruptEnableRegister)使能中断,设置相应位为1,禁止中断,清零相应位。图2-8中断使能寄存器IER

91流水线技术对F2812每条指令都要经过8个独立的执行过程,这8个过程形成了指令流水线(instructionpipeline)。在每一个给定的时间内,有8条指令被激活,每一指令处在执行过程中的不同阶段。并不是所有的指令都会同时发生读写操作,但是流水线的保护机制能够按照需要去延迟指令,以确保根据程序控制顺序对同一位置进行读写操作。2.4流水线

92流水线技术C28x系列DSP流水线有自动保护流水线冲突的机制。对于C28x有两种类型的流水线冲突可能会发生。即在读写同一个数据空间时发生冲突和寄存器冲突。流水线通过在可能导致冲突的指令之间加入不活动周期(inactivecycles)防止这种冲突。2.4流水线

93F1F2D1D2R1R2E2.4流水线流水线自动保护机制8-stagepipelineF1F2D1D2R1R2EF1F2D1D2R1R2EF1F2D1D2R1R2EF1F2D1D2R1R2EF1F2D1D2R1R2EF1F2D1D2R1R2XF1F2D1D2R1R2XABCDEFGWWWWWWWWE&GAccesssameaddressR1R2EWD2R1R2EWF1:取指令地址F2:取指令内容D1:32/16判断边界D2:取指译码R1:操作数地址R2:取操作数E:指令执行W:写内容回存储单元H

94End

9596第2章TMS320F2812CPU和时钟

96TMS320F281x的引脚176引脚PGFLQFP封装Low-profileQuadFlatpack低剖面四边扁平TMS320F28xx

9798第2章TMS320F2812CPU和时钟

9899XA[18]~XA[0]:19根外部地址线。XD[15]~XD[0]:16根外部数据线。:微处理器/微计算机模式选择。:外部保持请求。:外部保持应答。:XINTF的Zone0和Zone1选择。:XINTF的Zone2选择。:XINTF的Zone6和Zone7选择。:写使能。:读使能。:读/写选通。XREADY:准备好信号。:复位引脚2.5引脚说明

991002.5引脚说明JTAG仿真测试振荡器、复位引脚。A/D转换器引脚。电源引脚。通用数字I/OGPIOA、GPIOB、GPIOD;通信模块(SPI/SCI/CAN/McBSP)或GPIOF、GPIOG引脚。外部中断或GPIOE引脚。XF输出引脚。

1001012.5引脚说明

1011022.5引脚说明

1021032.5引脚说明

103104

1041052.5引脚说明

1051062.5引脚说明

1061072.5引脚说明

1071082.5引脚说明

1081092.5引脚说明

1091102.5引脚说明

110时钟及系统控制介绍F2812的时钟、锁相环、低功耗模式和看门狗等。第2章TMS320F2812CPU和时钟

111112系统时钟SYSCLKOUT输入时钟CLKIN

112113

113时钟及系统控制HISPCP高速外设时钟设置寄存器PLLCRPLL控制寄存器LOSPCP低速外设时钟设置寄存器SCSR系统控制和状态寄存器PCLKCR外设时钟控制寄存器WDCNTR看门狗计数寄存器LPMCR0低功耗模式控制寄存器0WDKEY看门狗复位密钥寄存器LPMCR1低功耗模式控制寄存器1WDCR看门狗控制寄存器2.6时钟系统

114时钟基础知识晶体Crystal晶体谐振器的简称,是一种压电石英晶体器件,具有一个固有的谐振频率,在恰当的激励作用下,以其固有频率振荡。振荡电路Oscillator为晶体提供激励和检测的电路。晶振CrystalOscillator将晶体、振荡器和负载电容集成在一起,其输出直接为一方波时钟信号。锁相环电路PLL(Phase-LockedLoops)用于对输入时钟信号进行分频或倍频的电路。晶体振荡电路晶振

115116TMS320F281×片上有基于PLL的时钟模块,为处理器和外设提供时钟信号。时钟源(OSCCLK)有两种配置模式:a)内部振荡器:在X1/XCLKIN和X2间接一个石英晶体;b)外部时钟源:将时钟信号直接接到X1/XCLKIN引脚,X2悬空,此时不使用片内振荡器。2.6时钟系统

116系统时钟选择117系统时钟(CLKIN)的选择:1)系统复位时,如果XF_XPLLDIS=0时,CPU直接采用外部时钟或片内振荡器输出作为系统时钟;2)系统复位时,如果XF_XPLLDIS=1时,外部时钟经过PLL分频或倍频后为CPU提供时钟。

117118系统时钟选择晶体振荡器及锁相环模块

118119系统时钟选择振荡器输出时钟OSCCLK可以经过三种方式产生CPU时钟CLKIN。(1)振荡器输出时钟OSCCLK直接提供给CPU,产生CPU时钟CLKIN。(2)振荡器输出时钟OSCCLK通过锁相环PLL旁路,经过2分频,产生CPU时钟CLKIN。(3)振荡器输出时钟OSCCLK经过锁相环PLL倍频后,再经过2分频,产生CPU时钟CLKIN。

119120时钟系统

120121时钟系统

121系统时钟选择122提示:通常需要使能PLL模式,OSCCLK=30MHz,时钟5倍频。模式功能概述CLKIN禁止PLL复位时如果引脚XF_XPLLDIS是低电平,则屏蔽PLL模块。直接使用引脚X1/XCLKIN输入的时钟信号作为CPU时钟。XCLKIN旁路PLL上电时的默认值。如果PLL没有被禁止,则PLL将配置为旁路模式,此时引脚X1/XCLKIN输入的时钟信号经过2分频后作为CPU时钟。XCLKIN/2使能PLL通过向PLLCR寄存器写入一个非零值n可以使能PLL。/2模块将PLL的输出二分频后送至CPU时钟。(OSCCLK·n)/2锁相环控制寄存器(PLLCR--0x00007021)30MHz15MHz

122总结123SysCtrlRegs.PLLCR=0xA;1010150MHzSYSCLKOUTXF_XPLLDISXPLLDIS

123124

124125voidInitSysCtrl(void)//系统初始化子程序{EALLOW;//#defineEALLOWasm(“EALLOW”)宏定义SysCtrlRegs.PLLCR=0x000A;//初始化锁相环,OSCCLK=30MHz//DIV=0x0A,CLKIN=30MHz*10/2=150MHzasm(“NOP”);asm(“NOP”);for(i=0;i<3000;i++){;}//延时,等待锁相环稳定SysCtrlRegs.HISPCP.all=0x0001;//HSPCLK=SYSCLKOUT/2=75MHzSysCtrlRegs.LOSPCP.all=0x0002;//LSPCLK=SYSCLKOUT/4=37.5MHzSysCtrlRegs.PCLKCR.bit.EVAENCLK=1;//使能EVASysCtrlRegs.PCLKCR.bit.EVBENCLK=1;//使能EVBSysCtrlRegs.PCLKCR.bit.SCIENCLKA=1;//使能SCI-A//SysCtrlRegs.PCLKCR.bit.SCIENCLKB=1;//不用的外设不使能,//以降低功耗SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;//使能ADCEDIS;//#defineEDISasm(“EDIS”)宏定义}例2.1时钟模块和锁相环初始化C语言编程。

125设置系统时钟126//ThisfunctioninitializesthePLLCRregister.voidInitPll(unsignedintval){volatileunsignedinti;EALLOW;SysCtrlRegs.PLLCR.bit.DIV=val;EDIS;DisableDog();//WaitPLLlockcycles.for(i=0;i<((131072/2)/12);i++){;}}}循环前需要屏蔽看门狗模块可选:等待PLL时钟输出锁定.Val=0~10寄存器PLLCR是写保护的。InitPll(0xA);在DSP28_SysCtrl.c中有例2.2

126外设时钟控制寄存器ModuleEnableClockBit0=禁止1=使能0reservedreserved1234567EVAENCLKEVBENCLKreservedADCENCLKreservedreservedECANENCLKSPIENCLKSCIBENCLK89101112131415reservedSCIAENCLKMCBSPENCLKreservedreservedHSPCLKLSPCLKPCLKCR

127128D15,D13,D9,D7-4,D2Reserved位。D14ECANENCLK,若设为1,则使能CAN外设中的系统时钟SYSCLKOUT。否则禁止。D12MCBSPENCLK,若设为1,则使能McBSP外设中的低速时钟LSPCLK。D11SCIBENCLK,若设为1,则使能SCI-B外设中的低速时钟LSPCLK。D10SCIAENCLK,若设为1,则使能SCI-A外设中的低速时钟LSPCLK。D8SPIBENCLK,若设为1,则使能SPI外设中的低速时钟LSPCLK。D3ADCENCLK,若设为1,则使能ADC外设中的高速时钟HSPCLK。D1EVBENCLK,若设为1,则使能EVB外设中的高速时钟HSPCLK。D0EVAENCLK,若设为1,则使能EVA外设中的高速时钟HSPCLK。2.7时钟控制寄存器外设时钟控制寄存器如果外设模块没有使用,关闭外设时钟,降低系统功耗。复位时外设时钟被禁止。PCLKCR

128▲高速外设时钟预定标器HISPCPReservedD15D3D2D0HSPCLKR-0R/W-0012.7时钟控制寄存器若HSPCP不为0,则HSPCLK=SYSCLKOUT/(2×HISPCP)。复位时,默认值001,HSPCLK=SYSCLKOUT/2若HSPCP=0,则HSPCLK=SYSCLKOUT

129130

130▲低速外设时钟预定标器LOSPCPReservedD15D3D2D0LSPCKR-0R/W-0102.7时钟控制寄存器若LOSPCP不为0,则LSPCLK=SYSCLKOUT/(2×LOSPCP)。复位时,默认值010,LSPCLK=SYSCLKOUT/4若LOSPCP=0,则LSPCLK=SYSCLKOUT

131132

132133voidInitSysCtrl(void)//系统初始化子程序{EALLOW;//#defineEALLOWasm(“EALLOW”)宏定义SysCtrlRegs.PLLCR=0x000A;//初始化锁相环,OSCCLK=30MHz//DIV=0x0A,CLKIN=30MHz*10/2=150MHzasm(“NOP”);asm(“NOP”);for(i=0;i<3000;i++){;}//延时,等待锁相环稳定SysCtrlRegs.HISPCP.all=0x0001;//HSPCLK=SYSCLKOUT/2=75MHzSysCtrlRegs.LOSPCP.all=0x0002;//LSPCLK=SYSCLKOUT/4=37.5MHzSysCtrlRegs.PCLKCR.bit.EVAENCLK=1;//使能EVASysCtrlRegs.PCLKCR.bit.EVBENCLK=1;//使能EVBSysCtrlRegs.PCLKCR.bit.SCIAENCLK=1;//使能SCI-A//SysCtrlRegs.PCLKCR.bit.SCIBENCLK=1;//不用的外设不使能,//以降低功耗SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;//使能ADCEDIS;//#defineEDISasm(“EDIS”)宏定义}例2.1时钟模块和锁相环初始化C语言编程。

133外设模块时钟的初始化voidInitPeripheralClocks(void){EALLOW;//HISPCP/LOSPCPwillbesettodefaultvaluesSysCtrlRegs.HISPCP.all=0x0001;//HSPCLK=SYSCLKOUT/2SysCtrlRegs.LOSPCP.all=0x0002;//LSPCLK=SYSCLKOUT/4//Peripheralclockenablessetfortheselectedperipherals.SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1;SysCtrlRegs.PCLKCR.bit.SCIBENCLK=1;SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=1;SysCtrlRegs.PCLKCR.bit.SPIENCLK=1;SysCtrlRegs.PCLKCR.bit.ECANENCLK=1;SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;EDIS;}1、为了降低功耗,建议关闭不使用的外设时钟。2、如果外设时钟未使能,则无法读写相应的外设寄存器。//Thisfunctioninitializestheclockstotheperipheralmodules.例2.3

134135F281x低功耗模式2.8低功耗模式

1351362.8低功耗模式

1362.9低功耗模式控制寄存器137除正常工作模式外,F281x有3种低功耗模式:IDLE(空闲)模式STANDBY(备用)模式HALT(暂停)模式低功耗模式控制寄存器0:LPMCR0低功耗模式控制寄存器1:LPMCR1

137低功耗模式控制寄存器0:LPMCR0138位名称描述15~8Reserved保留7~2QUALSTDBY当从备用(STANDBY)模式唤醒时,设定的唤醒信号持续的OSCCLK时钟周期数。000000=2OSCCLKs000001=3OSCCLKs…111111=65OSCCLKs1~0LPM设置器件的低功耗模式。00空闲(IDLE)01备用(STANDBY)1x暂停(HALT)

1382.9低功耗模式控制寄存器139

139140

140141281xDSP内置了一个看门狗定时器(WDT),用来监视DSP的运行状况。当系统进入不可预知的状态而造成“死机”时,看门狗(WatchDog)将产生一个复位操作,从而使DSP进入一个已知的起始位置重新运转。看门狗计数寄存器:WDCNTR看门狗复位密钥寄存器:WDKEY看门狗控制寄存器:WDCR系统控制和状态寄存器:SCSR为了实现看门狗的各项功能,相关寄存器如下所示。2.10看门狗

1411422.10看门狗0

142系统控制和状态寄存器SCSRWDENINT:1--看门狗复位信号(WDRST)被屏蔽,看门狗中断信号使能(WDINT)0--看门狗复位信号(WDRST)被使能,看门狗中断信号屏蔽(WDINT)WDINTS:看门狗中断状态位,反映WDINT的状态。WDOVERRIDE:1--允许改变看门狗控制寄存器WDCR中的看门狗屏蔽位WDDIS;0--不能改变WDDIS;清零后只有系统复位才允许改变该位的状态,用户可读取该位状态。

143看门狗计数寄存器WDCNTRWDCNTR包含看门狗计数器的当前计数值(0-0xFF);如果计数器溢出,看门狗产生中断或复位DSP;如果向WDKEY写有效的组合(0x55+0xAA),将使计数器清零。

144看门狗复位密钥寄存器WDKEY依次写0x55+0xAA到WDKEY将使WDCNTR清零;写其它任何值都会使看门狗复位;读该寄存器将返回WDCR寄存器的值。//Thisfunctionresetsthewatchdogtimer.voidKickDog(void){EALLOW;SysCtrlRegs.WDKEY=0x0055;SysCtrlRegs.WDKEY=0x00AA;EDIS;}如果系统使能看门狗模块,需要在用户程序中定时执行KickDog函数,且定时器周期要小于看门狗计数器溢出周期。

145看门狗控制寄存器WDCR写1到WDDIS,屏蔽看门狗模块;写0使能看门狗模块。WDCHK(2~0)必须写101,其它值会引起DSP复位。WDPS(2~0)配置看门狗计数时钟:WDCLK=OSCCLK/512/(1~64)。看门狗复位状态标志位WDFLAG:读:1--看门狗复位(WDRST);0--器件复位写:1--将WDFLAG清零;0--WDFLAG状态不变

146147位2~0WDPS:这些位用来配置看门狗时钟WDCLK。000WDCLK=OSCCLK/512/1001WDCLK=OSCCLK/512/1010WDCLK=OSCCLK/512/2011WDCLK=OSCCLK/512/4100WDCLK=OSCCLK/512/8101WDCLK=OSCCLK/512/16110WDCLK=OSCCLK/512/32111WDCLK=OSCCLK/512/64,OSCCLK为振荡器频率。看门狗控制寄存器WDCR

147使能/屏蔽看门狗模块//Thisfunctiondisablesthewatchdogtimer.voidDisableDog(void){EALLOW;//#defineEALLOWasm(“EALLOW”)宏定义SysCtrlRegs.WDCR=0x0068;//WDDIS=1,WDCHK=101,EDIS;//WDPS=000(WDCLK=OSCCLK/512)}//#defineEDISasm(“EDIS”)宏定义//Thisfunctionenablesthewatchdogtimer.voidEnableDog(void){EALLOW;//#defineEALLOWasm(“EALLOW”)宏定义SysCtrlRegs.WDCR=0x0028;//WDDIS=0,WDCHK=101,EDIS;//WDPS=000(WDCLK=OSCCLK/512)}例2.5

148初始化系统控制程序//-ThisfunctioninitializestheSystemControlregisterstoaknownstate.程序功能:1、屏蔽看门狗模块2、配置PLLCR寄存器,设定SYSCLKOUT的频率3、配置高速/低速外设时钟的预定标因子4、使能相应外设时钟voidInitSysCtrl(void){//DisablethewatchdogDisableDog();//InitializethePLLCRto0xAInitPll(0xA);//InitializetheperipheralclocksInitPeripheralClocks();}注意使能所使用的外设模块时钟,否则无法读写相应的外设寄存器。PLLCR通常设为10,即CPU的时钟频率为30MHz×5=150MHz。例2.6

149150

1503.1PIE中断控制概述3.2中断向量表映射3.3PIE中断向量表3.4寄存器3.5中断应用举例第3章中断系统与应用

15128x器件有许多外设,每个外设都可以产生一个或多个中断请求,从而去响应多个外设级上的事件。在CPU级上,CPU没有足够的能力去处理所有外设的中断请求;需要一个集中的外设中断扩展模块(PIE)PeripheralInterruptExpansion(PIE)Block;第3章中断系统与应用

152外设中断扩展模块把许多中断源多路复用成一个较小的中断输入集。PIE模块支持96个不同的中断,这些中断分成12个组,每个组有8个中断;每个组都被反馈到CPU内核的12条中断线(INT1~INT12)的其中一条上。第3章中断系统与应用

1533.1PIE中断控制概述F281×共支持17个CPU级中断,包括一个NMI和16个可屏蔽中断(INT1~INT14,RTOSINT和DLOGINT)外设中断扩展模块(PIE)中多个中断源复用1个中断信号。PIE支持多达96个中断源,其中8个中断源为一组,复用一个中断信号,总共有12个中断信号(INT1~INT12)。PIE的中断优先级由高到低分别是INT1~INT12,组内8个优先级由高到低的次序依次是INTx.1~INTx.8。

154PIE中断控制框图110011

1551.外设级一个中断产生事件出现在某个外设中和该事件相关的中断标志位,会在这个相应的外设寄存器中被置为1。如果使能该中断,且中断标志仍然置位,那么就会向PIE发出一个中断请求。外设寄存器中的中断标志手工清除。3.1PIE中断控制概述

1562.PIE级PIE模块将8个外设或外部中断分为1组,每组复用1个CPU中断。这些中断被分为12个组:PIE组1~PIE组12,每个组中的中断被多路汇集进入1个CPU中断。例如,PIE组1被多路汇集进入CPU中断INT1,而PIE组12被多路汇集进入CPU中断INT12。3.1PIE中断控制概述

157对于多路复用的中断源,PIE块中的每个中断组都有一个相关标志位PIEIFRx.y和使能位PIEIERx.y。每个中断组(INT1~INT12)都有一个应答位PIEACKx。3.1PIE中断控制概述

1583.CPU级一旦某个中断请求被送往CPU,CPU级中与INTx相关的中断标志(IFR)位就被置位;标志位被锁存在IFR后,CPU不会马上去执行相应的中断,而是等待CPU使能IER寄存器,并对全局中断屏蔽位INTM进行使能。3.1PIE中断控制概述

159PIEIFRx.yPIEIERx.yIERxINTM

160在C28x系列DSP中,中断向量表可以映射到5个不同区间;M1SARAM,M0SARAM,BROM,XINTFZone7,PIE中断向量表。在F2812中,只有PIE中断向量表可以使用。使能PIE中断向量表,令ENPIE=1;即寄存器PIECTRL的D0为1。复位时,ENPIE=0,PIE被禁止。PIE中断向量表用来存储系统的各个中断服务程序ISR的入口地址。3.2中断向量表的映射

1613.2中断向量表的映射PIEVECT(15:1)指明中断向量表中的中断向量地址ENPIE=1时所有中断向量取自PIE中断向量表ENPIE=0时取自BootROM中的CPU向量表或外部接口Zone7

162PIE中断向量表映射地址3.2中断向量表映射

1633.3中断源有16个CPU中断,一个NMI中断和3个外部中断源。CPU定时器0中断连接到PIE模块。外设SPI、SCI、McBSP、CAN、事件管理器EV和ADC的中断源接到PIE模块。CPU定时器1中断分配给;CPU定时器2中断分配给,都是直接连接到CPU。XNMI_XINT13也是直接连接到CPU。

164中断源中断源:45个PIE中断源16个CPU中断一个NMI中断3个外部中断源

165从外设到CPU的多通道中断请求流程0

1663.4PIE中断向量表每个中断源都有相应的中断向量存放在RAM中,构成整个系统的中断向量表存放中断服务程序的地址。中断向量表由256×16位的SRAM构成,每个中断向量占用2个16位的地址空间。

1673.4PIE中断向量表

168

169

170

171

172

173

174F2812PIE外设中断INTx.8INTx.7INTx.6INTx.5INTx.4INTx.3INTx.2INTx.1INT1WAKEINTTINT0ADCINTXINT2XINT1PDPINTBPDPINTAINT2T1OFINTT1UFINTT1CINTT1PINTCMP3INTCMP2INTCMP1INTINT3CAP3INTCAP2INTCAP1INTT2OFINTT2UFINTT2CINTT2PINTINT4T3OFINTT3UFINTT3CINTT3PINTCMP6INTCMP5INTCMP4INTINT5CAP6INTCAP5INTCAP4INTT4OFINTT4UFINTT4CINTT4PINTINT6MXINTMRINTSPITXINTASPIRXINTAINT7INT8INT9SCITXINTBSCIRXINTBSCITXINTASCIRXINTAINT10INT11INT12ECAN0INTECAN1INT共45个中断源

175

176

177PIECTRLPIE控制寄存器(PIEControlRegister)PIEACKPIE中断应答寄存器(PIEInterruptAcknowledgeRegister)PIEIERx(x=1~12)PIE中断使能寄存器(PIEInterruptEnableRegister)PIEIFRx(x=1~12)PIE中断标志寄存器(PIEInterruptFlagRegister)3.5PIE中断寄存器

178PIE控制寄存器PIECTRLD15~D1,PIEVECT,指明中断向量表中的中断向量地址。D0,ENPIE,使能PIE中断向量表。为1时,使能PIE中断向量表。从这个地址读取中断服务程序的入口地址

179D11~D0,PIEACK,写入1到对应的中断位可以清除该位,清除后当该组的中断申请到来时,允许PIE向CPU申请中断。PIE中断应答寄存器PIEACK

180PIE中断标志寄存器PIEIFRx,x=1~12D7~D0,INTx.8~INTx.1,表示中断是否激活。当一个中断激活时,相应位置1。当有中断产生,相应位置1;写0清除该位。一般不要软件写0。当DSP响应该中断后,硬件将标志位清零。读寄存器可判断是否有待响应的中断。

181D7~D0,INTx.8~INTx.1,表示中断使能。PIE中断使能寄存器PIEIERx,x=1~12置1使能相应的外设中断;置0屏蔽该中断源。

182D15:RTOSINT,实时操作系统中断标志位。D14:DLOGINTflag,数据记录中断标志位。D14=1有中断申请。向该位写0,可清除中断请求。D13~D0:为INT14~INT1中断申请标志。CPU中断标志寄存器IFR(InterruptFlagRegister)当有中断产生,相应位置1

183CPU中断使能寄存器IER(InterruptEnableRegister)D15:RTOSINT。D14:DLOGINT,D14=1,使能中断。D14=0,屏蔽中断请求。D13~D0:为INT14~INT1中断使能位。置1使能相应的外设中断

184总结PIE寄存器INTx.2INTx.3INTx.4INTx.5INTx.6INTx.7INTx.8INTx.10123456715-8reservedPIEIFRxregister(x=1to12)INTx.2INTx.3INTx.4INTx.5INTx.6INTx.7INTx.8INTx.10123456715-8reservedPIEIERxregister(x=1to12)reservedPIEACKxPIEInterruptAcknowledgeRegister(PIEACKx)1243567890101115-12ENPIEPIEVECTPIECTRLregister015-1#include“DSP28_Device.h”PieCtrlRegs.PIEIER3.bit.INTx5=1;//enableCAP1INTinPIEgroup3PieCtrlRegs.PIEACK.all=0x0004;//acknowledgethePIEgroup3PieCtrlRegs.PIECTRL.bit.ENPIE=1;//enablethePIE例3.1

185外部中断1控制寄存器XINT1CR外部中断2控制寄存器XINT2CR外部不可屏蔽中断控制寄存器XNMICR外部中断1计数寄存器XINT1CTR外部中断2计数寄存器XINT2CTR3.7外部中断控制寄存器

186中断源

1873.7外部中断控制寄存器F2812支持三个外部中断,XINT1、XINT2和XINT13;XINT13与不可屏蔽中断XNMI公用一个引脚;每个外部中断可以使能/屏蔽、设定为上升/下降沿触发;Polarity:0--下降沿产生中断;1--上升沿产生中断Enable:0--屏蔽中断;1--使能中断外部中断1控制寄存器XINT1CR(ExternalInterrupt1ControlRegister)

1883.7外部中断控制寄存器Polarity:0--下降沿产生中断;1--上升沿产生中断Enable:0--屏蔽中断;1--使能中断外部中断2控制寄存器XINT2CR(ExternalInterrupt2ControlRegister)

189Polarity:0--下降沿产生中断;1--上升沿产生中断Select:0--Timer1连接到至INT13;1--XNMI_XINT13连接到INT13;Enable:0--屏蔽XNMI中断;即选择XINT131--使能XNMI中断,即选择XNMI非屏蔽中断控制寄存器外部NMI中断控制寄存器XNMICR(ExternalNMIInterruptControlRegister)

190外部中断1计数寄存器XINT1CTRD15~D0,INTCTR,16位自由计数的增计数器,时钟频率为SYSCLKOUT。对于每一个外部中断,有一个16位计数器,每当检测到中断沿时,就复位到0,可以用于精确记录中断发生的时刻。

191外部中断1计数寄存器XINT1CTR当检测到中断边沿时,计数值复位为0,然后开始连续计数直到检测到下一个中断边沿。当禁止中断时,计数器停止。计数器是一个自由运行的计数器,当达到最大值时将返回到0。计数器是只读寄存器,只能通过一个有效的中断边沿或者复位使计数器为0。外部中断1计数寄存器XINT1CTR(ExternalInterrupt1Counter)

192外部中断2计数寄存器XINT2CTRD15~D0:INTCTR,16位自由计数的增计数器,时钟频率为SYSCLKOUT。当检测到中断边沿时,计数值复位为0,然后开始连续计数直到检测到下一个中断边沿。当禁止中断时,计数器停止。计数器是一个自由运行的计数器,当达到最大值时将返回到0。计数器是只读寄存器,只能通过一个有效的中断边沿或者复位使计数器为0。外部中断2计数寄存器XINT2CTR(ExternalInterrupt2Counter)

1933.8中断应用举例配置CPU定时器0产生定时中断;每次中断LED的状态切换一次(0/1)

194中断矢量表conststructPIE_VECT_TABLEPieVectTableInit={……PDPINTA_ISR,//EV-APDPINTB_ISR,//EV-Brsvd_ISR,XINT1_ISR,XINT2_ISR,ADCINT_ISR,//ADCTINT0_ISR,//Timer0WAKEINT_ISR,//WD……};方法1:采用位域结构方式,在中断矢量表中定义所有的中断矢量,如外设中断组1(INT1)。方法2:定义存放中断矢量的地址变量,如CPU定时器0为:volatileunsignedlong*TINT0=(volatileunsignedlong*)0x000D4C;

195中断控制寄存器初始化voidInitPieCtrl(void){DINT;//DisableInterruptsattheCPUlevelPieCtrlRegs.PIECRTL.bit.ENPIE=0;//DisablethePIEPieCtrlRegs.PIEIER1.all=0;//ClearallPIEIERregistersPieCtrlRegs.PIEIER2.all=0;……PieCtrlRegs.PIEIER12.all=0;PieCtrlRegs.PIEIFR1.all=0;//ClearallPIEIFRregisters.PieCtrlRegs.PIEIFR2.all=0;……PieCtrlRegs.PIEIFR12.all=0;PieCtrlRegs.PIECRTL.bit.ENPIE=1;//EnablethePIEPieCtrlRegs.PIEACK.all=0xFFFF;//EnablesPIEtodriveapulseintotheCPU}

196main()函数voidmain(void){InitSysCtrl();//初始化系统控制DINT;//关中断IER=0x0000;IFR=0x0000;InitPieCtrl();//初始化PIEInitPieVectTable();//初始化PIE中断向量表,仅用于方法1InitPeripherals();//初始化外设,可以根据需要配置EALLOW;PieVectTable.TINT0=&ISRTimer0;//方法1*TINT0=(unsignedlong)ISRTimer0;//方法2EDIS;ConfigCpuTimer(&CpuTimer0,150,1000000);//配置CPU定时器0CpuTimer0Regs.TCR.bit.TSS=0;//启动CPU定时器0PieCtrl.PIEIER1.all=0x40;//使能CPU定时器0中断IER|=0x0001;EINT;//使能全局中断INTMfor(;;){……}}

197定时器中断服务程序#defineLED1_ONGpioDataRegs.GPFDAT.bit.GPIOF11=0#defineLED1_OFFGpioDataRegs.GPFDAT.bit.GPIOF11=1unsignedintLed_Flag=1;interruptvoidISRTimer0(void){PieCtrl.PIEACK.all|=0x0001;if(Led_Flag==1){LED1_ON;Led_Flag=0;}else{LED1_OFF;Led_Flag=1;}}每次中断LED的状态切换一次(0/1)

198初始化PIE中断向量表voidInitPieVectTable(void)//InitializesthePIEvectortabletoaknownstate.{int16i;Uint32*Source=(void*)&PieVectTableInit;Uint32*Dest=(void*)&PieVectTable;EALLOW;for(i=0;i<128;i++)*Dest++=*Source++;EDIS;PieCtrl.PIECRTL.bit.ENPIE=1;//EnablethePIEVectorTable}

199外设中断的使能,需要将与该中断相关的外设寄存中的中断使能位置1;外设级以XINT2外部中断2为例在main()函数中XIntruptRegs.XINT2CR.all=0x0001;//使能,下降沿触发exp4_06_int例3.3:按一次键,LED灯变化一次

200以XINT2外部中断2为例PieCtrlRegs.PIEIER1.all=M_INT5;PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;2.中断服务程序中在DSP281x_Device.h中#defineM_INT50x00101.在main()函数中在DSP281x_PieCtrl.h中#definePIEACK_GROUP10x0001PIE级PIE中断的使能。需要使能某个外设中断,将其相应组的使能寄存器PIEIERx的相应位进行置位;PIE应答寄存器PIEACK相关位的清除,使得CPU能够响应同组的其他中断。

201CPU级IER|=M_INT1;EINT;//使能全局中断INTMERTM;//使能实时中断DBGM以XINT2外部中断2为例在main()函数中在DSP281x_Device.h中#defineM_INT10x0001在DSP281x_Device.h中#defineEINTasm("clrcINTM")#defineERTMasm("clrcDBGM")

202以XINT2外部中断2为例在main()函数中EALLOW;//ThisisneededtowritetoEALLOWprotectedregistersPieVectTable.XINT2=&xint2_isr;//中断函数入口地址EDIS;在DSP281x_Device.h中#defineEALLOWasm("EALLOW")#defineEDISasm("EDIS")

203#include"DSP281x_Device.h"//DSP281xHeaderfileIncludeFile#include"DSP281x_Examples.h"//DSP281xExamplesIncludeFileUint16show=0x00aa;//定义欲显示值Uint32Xint2InterruptCount;/**************************主程序*****************************/voidinit_xint2(void);interruptvoidxint2_isr();voidmain(void){InitSysCtrl();DINT;InitPieCtrl();IER=0x0000;IFR=0x0000;InitPieVectTable();EALLOW;//ThisisneededtowritetoEALLOWprotectedregistersPieVectTable.XINT2=&xint2_isr;EDIS;init_xint2();Xint2InterruptCount=0;PieCtrlRegs.PIEIER1.all=M_INT5;IER|=M_INT1;EINT;//EnableGlobalinterruptINTMERTM;//EnableGlobalrealtimeinterruptDBGM

204for(;;){if(Xint2InterruptCount<1){asm("nop");*(int*)0x88001=show;}elseif(Xint2InterruptCount<2){asm("nop");*(int*)0x88001=~show;}else{Xint2InterruptCount=0;}}}以XINT2外部中断2为例

205voidinit_xint2(void){XIntruptRegs.XINT2CR.all=0x0001;//使能}interruptvoidxint2_isr(void){Xint2InterruptCount++;//AcknowledgeinterrupttoreceivemoreinterruptsfromPIEgroup2PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;}以XINT2外部中断2为例

206总结3级中断机制

207

208中断源

209F2812PIE中断INTx.8INTx.7INTx.6INTx.5INTx.4INTx.3INTx.2INTx.1INT1WAKEINTTINT0ADCINTXINT2XINT1PDPINTBPDPINTAINT2T1OFINTT1UFINTT1CINTT1PINTCMP3INTCMP2INTCMP1INTINT3CAP3INTCAP2INTCAP1INTT2OFINTT2UFINTT2CINTT2PINTINT4T3OFINTT3UFINTT3CINTT3PINTCMP6INTCMP5INTCMP4INTINT5CAP6INTCAP5INTCAP4INTT4OFINTT4UFINTT4CINTT4PINTINT6MXINTMRINTSPITXINTASPIRXINTAINT7INT8INT9SCITXINTBSCIRXINTBSCITXINTASCIRXINTAINT10INT11INT12ECAN0INTECAN1INT共45个中断源

210IFR中断标志寄存器CPU级111(IFR)“Latch”INT1INT2INT14CoreInterruptCPU(INTM)“GlobalSwitch”(IER)“Switch”IER中断使能寄存器

211中断标志寄存器(IFR)RTOSINTDLOGINTINT14INT13INT12INT11INT10INT989101112131415INT8INT7INT6INT5INT4INT3INT2INT101234567中断确定:IFRBit=1中断未确定:IFRBit=0CPU识别中断之后IFR由CPU复位复位状态为0

212中断使能寄存器(IER)RTOSINTDLOGINTINT14INT13INT12INT11INT10INT989101112131415INT8INT7INT6INT5INT4INT3INT2INT101234567使能:SetIERBit=1禁止:ClearIERBit=0DINT/EINT,禁止中断复位清零/***InterruptEnableRegister***/externcregistervolatileunsignedintIER;IER|=0x0008;//enableINT4inIERIER&=0xFFF7;//disableINT4inIER

213中断全局使能INTM用来做全局的使能/禁止中断:使能:INTM=0禁止:INTM=1(resetvalue)INTM只能被汇编语言修改:INTMST1Bit0/***GlobalInterrupts***/asm(“CLRCINTM”);//enableglobalinterruptsasm(“SETCINTM”);//disableglobalinterrupts

214

215第4章GPIO功能GPIO是通用型输入输出(GeneralPurposeI/O)的简称。TMS320F281x的GPIO多路复用器将有关引脚用作数字I/O口时,可以组成数字I/O口GPIOA、GPIOB、GPIOD、GPIOE、GPIOF和GPIOG。216

216217

217218(2)当GPxMUX寄存器=0,选择数字I/O输出。当GPxMUX寄存器=1,选择外设I/O输出(3)当GPxMUX寄存器=0,选择数字I/O输出,同时当GPxDIR寄存器=0时,右面多路开关MUX的B点输出为0,C点输出为1,高阻使能。输出信号不能到达引脚。此时GPIO引脚工作在输入模式。当GPxDIR寄存器=1时,C点输出为0,左面多路开关MUX的A点输出的信号可以输出到GPIO引脚上。此时数字I/O工作在输出模式。

218GPIOMUX/DIR寄存器AddressRegisterName70C0hGPAMUXGPIOAMuxControlRegister70C1hGPADIRGPIOADirectionControlRegister70C2hGPAQUALGPIOAInputQualificationControlRegister70C4hGPBMUXGPIOBMuxControlRegister70C5hGPBDIRGPIOBDirectionControlRegister70C6hGPBQUALGPIOBInputQualificationControlRegister70CChGPDMUXGPIODMuxControlRegister70CDhGPDDIRGPIODDirectionControlRegister70CEhGPDQUALGPIODInputQualificationControlRegister70D0hGPEMUXGPIOEMuxControlRegister70D1hGPEDIRGPIOEDirectionControlRegister70D2hGPEQUALGPIOEInputQualificationControlRegister70D4hGPFMUXGPIOFMuxControlRegister70D5hGPFDIRGPIOFDirectionControlRegister70D8hGPGMUXGPIOGMuxControlRegister70D9hGPGDIRGPIOGDirectionControlRegister

219AddressRegisterName70E0hGPADATGPIOADataRegister70E1hGPASETGPIOASetRegister70E2hGPACLEARGPIOAClearRegister70E3hGPATOGGLEGPIOAToggleRegister70E4hGPBDATGPIOBDataRegister70E5hGPBSETGPIOBSetRegister70E6hGPBCLEARGPIOBClearRegister70E7hGPBTOGGLEGPIOBToggleRegister70EChGPDDATGPIODDataRegister70EDhGPDSETGPIODSetRegister70EEhGPDCLEARGPIODClearRegister70EFhGPDTOGGLEGPIODToggleRegister70F0hGPEDATGPIOEDataRegister70F1hGPESETGPIOESetRegister70F2hGPECLEARGPIOEClearRegister70F3hGPETOGGLEGPIOEToggleRegister70F4hGPFDATGPIOFDataRegister70F5hGPFSETGPIOFSetRegister70F6hGPFCLEARGPIOFClearRegister70F7hGPFTOGGLEGPIOFToggleRegister70F8hGPGDATGPIOGDataRegister70F9hGPGSETGPIOGSetRegister70FAhGPGCLEARGPIOGClearRegister70FBhGPGTOGGLEGPIOGToggleRegister

220GPIO寄存器GPIO口通过功能控制、方向、数据、置位、清除和取反寄存器来控制▲GPxMUX——功能选择寄存器,配置I/O工作在外设操作模式或数字量I/O模式。复位时所有GPIO配置成I/O功能。√如果GPxMUX.bit=0,配置为I/O功能;√如果GPxMUX.bit=1,配置为外设功能。I/O的输入功能和外设的输入通道总是被使能的,输出通道是GPIO和外设公用的。引脚如果配置成为I/O功能,就必须屏蔽相应的外设功能,否则,将会产生随机的中断信号。4.2GPIO寄存器▲GPxDIR——方向控制寄存器,用来配置I/O的方向(输入/输出)。复位时,所有GPIO为输入。√如果GPxDIR.bit=0,引脚配置为数字量输入;√如果GPxDIR.bit=1,引脚配置成数字量输出。221

221GPIO寄存器GPxDAT——数据寄存器,如果I/O配置为输入,反映当前经过量化后I/O输入信号的状态。如果I/O配置为输出,向寄存器写值设定I/O的输出。√如果GPxDAT.bit=0,且设置为输出功能,置相应的引脚为低电平;√如果GPxDAT.bit=1,且设置为输出功能,置相应的引脚为高电平。GPxSET——置位寄存器,是只写寄存器,任何读操作都返回0。如果相应的引脚配置成数字量输出,写1后相应的引脚为高电平,写0时没有影响。√如果GPxSET.bit=0,没有影响;√如果GPxSET.bit=1,且引脚设置为输出,将相应的引脚置成高电平。2224.2GPIO寄存器

222GPIO寄存器GPxCLEAR——清除寄存器,是只写寄存器,任何读操作都返回0。如果相应的引脚配置成数字量输出,写1后相应的引脚置成低电平,写0时没有影响。√如果GPxCLEAR.bit=0,没有影响;√如果GPxCLEAR.bit=1,且引脚设置为输出,将相应的引脚置成低电平。GPxTOGGLE——取反寄存器,是只写寄存器,任何读操作都返回0。如果相应的引脚配置成数字量输出,写1后相应的引脚信号将被取反。写0时没有影响。√如果GPxTOGGLE.bit=0,没有影响;√如果GPxTOGGLE.bit=1,且引脚设置为输出,将相应的引脚取反。2234.2GPIO寄存器

223GPIOAGPIOA0/PWM1GPIOA1/PWM2GPIOA2/PWM3GPIOA3/PWM4GPIOA4/PWM5GPIOA5/PWM6GPIOA6/T1PWM_T1CMPGPIOA7/T2PWM_T2CMPGPIOA8/CAP1_QEP1GPIOA9/CAP2_QEP2GPIOA10/CAP3_QEPI1GPIOA11/TDIRAGPIOA12/TCLKINAGPIOA13/C1TRIPGPIOA14/C2TRIPGPIOA15/C3TRIPGPIOBGPIOB0/PWM7GPIOB1/PWM8GPIOB2/PWM9GPIOB3/PWM10GPIOB4/PWM11GPIOB5/PWM12GPIOB6/T3PWM_T3CMPGPIOB7/T4PWM_T4CMPGPIOB8/CAP4_QEP3GPIOB9/CAP5_QEP4GPIOB10/CAP6_QEPI2GPIOB11/TDIRBGPIOB12/TCLKINBGPIOB13/C4TRIPGPIOB14/C5TRIPGPIOB15/C6TRIPGPIODGPIOD0/T1CTRIP_PDPINTAGPIOD1/T2CTRIP/EVASOCGPIOD5/T3CTRIP_PDPINTBGPIOD6/T4CTRIP/EVBSOCGPIOEGPIOE0/XINT1_XBIOGPIOE1/XINT2_ADCSOCGPIOE2/XNMI_XINT13GPIOFGPIOF0/SPISIMOAGPIOF1/SPISOMIAGPIOF2/SPICLKAGPIOF3/SPISTEAGPIOF4/SCITXDAGPIOF5/SCIRXDAGPIOF6/CANTXAGPIOF7/CANRXAGPIOF8/MCLKXAGPIOF9/MCLKRAGPIOF10/MFSXAGPIOF11/MFSRAGPIOF12/MDXAGPIOF13/MDRAGPIOF14/XF_XPLLDSGPIOGGPIOG4/SCITXDBGPIOG5/SCIRXDBGPIO引脚分配GPIOA,B,D,E包含输入量化功能共计56个GPIO

224225

225

226227

227复用外部中断4.3I/O映射1

228

229

230231F281×器件上有56个多功能复用引脚,通过GPxMUX寄存器可配置为外设信号或数字I/O引脚;如果配置为数字I/O引脚,可以通过方向寄存器(GPxDIR)控制引脚为输入或输出;通过量化寄存器(GPxQUAL)设定量化采样周期(QUALPRD),消除输入信号中的毛刺干扰。QUALPRD=(1~0xFF)×2SYSCLKOUT连续6次采样QUALPRD=0,noqualification连续6次采样4.4输入量化控制

2312324.4输入量化控制连续6次采样连续6次采样相邻两次采样之间间隔

232233位名称描述15~8Reserved保留7~0QUALPRD指定量化采样周期。0x00没有量化(只是和SYSCLKOUT同步)0x01量化采样周期=2SYSCLKOUT周期0x02量化采样周期=4SYSCLKOUT周期…0xFF量化采样周期=510SYSCLKOU周期表4-9GPAQUAL寄存器各位描述GPIOA输入量化控制寄存器GPAQUAL(GPIOAInputQualificationControlRegister)4.4.1输入量化控制寄存器

2332344.4.1输入量化控制寄存器

2342354.4.1输入量化控制寄存器

2352364.4.1输入量化控制寄存器

236GPIO寄存器总结237GPxMUX寄存器GPxMUX.bit:0-配置为I/O方式;1-配置为外设方式GPxDIR寄存器GPxDIR.bit:0-配置为数字输入;1-配置为数字输出GPxDAT寄存器GPxDAT.bit:输入方式读引脚状态;输出方式设定引脚状态;0-输出0;1-输出1GPxSET寄存器GPxSET.bit:1-输出方式下引脚置高电平GPxCLEAR寄存器GPxCLEAR.bit:1-输出方式下引脚置低电平GPxTOGGLE寄存器GPxTOGGLE.bit:1-输出方式下将引脚电平置反例如:GpioDataRegs.GPFDAT.bit.GPIOF10=0X=A、B、D、E、F、G

237通用I/O的初始化238voidInitGpio(void)//初始化GPIO引脚.{EALLOW;//解除寄存器保护GpioMuxRegs.GPAMUX.all=0x0000;//设置GPIOA为数字I/OGpioMuxRegs.GPADIR.all=0xFF00;//高字节输出,低字节输入GpioMuxRegs.GPAQUAL.all=0x0000;//不使用输入量化功能GpioDataRegs.GPADAT.all=0xAA00;//高字节输出0xAAGpioDataRegs.GPASET.all=0xAA00;//置位对应输出引脚GpioDataRegs.GPACLEAR.all=0x5500;//清零对应输出引脚GpioDataRegs.GPATOGGLE.all=0xFF00;//取反输出引脚GpioMuxRegs.GPBMUX.all=0xFFFF;//设置GPIOB为外设引脚,用作EVB信号。GpioMuxRegs.GPBQUAL.all=0x0000;//不使用输入量化功能EDIS;//使能寄存器保护}例4.1:

238GPIO应用实例239voidmain(void){InitSysCtrl();//系统初始化子程序,在DSP28_sysctrl.c中EALLOW;//解除寄存器保护GpioMuxRegs.GPBDIR.bit.GPIOB0=1;//设置D1对应的DSP引脚为输出EDIS;//使能寄存器保护GpioDataRegs.GPBDAT.bit.GPIOB0=0;//输出低电平,发光二极管点亮GpioDataRegs.GPBDAT.bit.GPIOB0=1;//输出高电平,发光二极管不亮GpioDataRegs.GPBCLEAR.bit.GPIOB0=1;//写1清零GPIOB0GpioDataRegs.GPBSET.bit.GPIOB0=1;//写1置位GPIOB0GpioDataRegs.GPBTOGGLE.bit.GPIOB0=1;//写1取反GPIOB0输出while(1);}例4.2:

239240

240GPIO应用实例241voidmain(void){unsignedinti,j,temp;InitSysCtrl();//系统控制初始化,在DSP28_sysctrl.c中Init_LED();temp=0x0001;while(1){GpioDataRegs.GPBCLEAR.all|=temp;for(i=0;i<10;i++)for(j=0;j<6;j++);GpioDataRegs.GPBSET.all|=temp;temp<<=1;if(temp==0x0100)temp=0x0001;GpioDataRegs.GPBCLEAR.all=0x0000;GpioDataRegs.GPBSET.all=0x0000;}}例4.3:小灯循环点亮

241GPIO应用实例242voidInit_LED(void){EALLOW;GpioMuxRegs.GPBDIR.all=0x00FF;EDIS;}

242243#include"DSP281x_Device.h"//定义指示灯寄存器地址和寄存器类型voidDelay(unsignedintnDelay);//延时子程序,函数声明main(){InitSysCtrl();//初始化PLL,SYSCLKOUT=150MHz,使能外设时钟,禁止看门狗EALLOW;GpioMuxRegs.GPBMUX.all=0x0000;//ConfigureGPIOBasdigitalI/OGpioMuxRegs.GPBDIR.all=0x00FF;//SelectGPIOB5asoutputEDIS;例4.4:1个LED指示灯接到DSP的通用输入输出接口GPIOB5。用C语言编程使之闪烁。GPIO应用实例

243244voidDelay(unsignedintnDelay)//延时程序,自定义函数{inti,j,k=0;for(i=0;i

244245例4.5KeyGPIO应用实例

245

246247应用举例DEC2812工程gpioGPIO应用实例

247GPIO应用实例作业4-2:欲使GPIOB0口输出高电平,GPIOB1口输出低电平;首先做如下配置,初始化这两个口:voidInitGpio(void){EALLOW;GpioMuxRegs.GPBMUX.bit.PWM7_GPIOB0=0;//引脚配置为I/O模式GpioMuxRegs.GPBMUX.bit.PWM8_GPIOB1=0;//引脚配置为I/O模式GpioMuxRegs.GPBDIR.bit.GPIOB0=1;//引脚配置为输出GpioMuxRegs.GPBDIR.bit.GPIOB1=1;//引脚配置为输出EDIS;}

248GPIO应用实例在主程序中加入InitGpio();主程序中加入以下代码即将GPIOB0口置高电平,GPIOB1口为低电平:GpioDataRegs.GPBDAT.bit.GPIOB0=1;GpioDataRegs.GPBDAT.bit.GPIOB1=0;

249有3个32位CPU定时器(TIMER0/1/2):定时器0用户可以在应用程序中使用。定时器1和定时器2预留给实时操作系统使用(例如DSPBIOS)。如果不需要实时操作系统支持,3个定时器均可以供用户程序使用。4.6CPU定时器结构与工作原理

250251CPU定时器结构4.6CPU定时器结构与工作原理

251定时器工作过程:周期寄存器(PRDH:PRD)内部的值装载到32位计数寄存器(TIMH:TIM)。计数寄存器根据设定的速率递减计数。当计数寄存器等于0时,定时器中断输出产生一个中断脉冲。4.6CPU定时器结构与工作原理

2524.6CPU定时器结构与工作原理CPU定时器中断信号和输出信号CPU定时器0中断信号TINT0通过外设中断扩展模块PIE送到CPU;CPU定时器1中断信号TINT1与外部中断XINT13复用CPU中断CPU定时器2中断信号TINT2连接到CPU中断

2534.7CPU定时器寄存器

254255TIF-TimerInterruptFlag中断标志位,写1清除此位。TIE-TimerInterruptEnable中断使能位。TRB-TimerReloadBit定时器重装位。1:重装TSS-TimerStopStatusBit定时器启动/停止位。1:停止4.7CPU定时器寄存器定时器控制寄存器TIMERxTCR

255256CPU定时器计数器寄存器TIMERxTIMCPU定时器计数器寄存器高位TIMERxTIMH4.7CPU定时器寄存器

256257位名称描述15~0TIMCPU定时器计数器寄存器(TIMH:TIM)。TIM寄存器保持当前32位定时器的低16位,TIMH寄存器保持当前32位定时器的高16位。每一个(TDDRH:TDDR+1)时钟周期TIMH:TIM减1,其中,TDDRH:TDDR是定时器分频寄存器。当TIMH:TIM减到零时,TIMH:TIM寄存器值由PRDH:PRD寄存器内所包含的周期值重新装载。定时器中断信号产生。表4-12定时器计数器寄存器TIMERxTIM(x=0,1或2)各位描述4.7CPU定时器寄存器

257258CPU定时器周期寄存器TIMERxPRD图4-14CPU定时器周期寄存器TIMERxPRD4.7CPU定时器寄存器

258259位名称描述15~0PRDCPU定时器周期寄存器(PRDH:PRD)。PRD寄存器保持32位周期的低16位,PRDH寄存器保持32位周期的高16位。当CPU定时器计数器寄存器TIMH:TIM减到零时,在下一个定时器输入时钟周期开始时(即预定标器的输出),TIMH:TIM寄存器由定时器周期寄存器PRDH:PRD内所包含的周期值重新装载。当用户在定时器控制寄存器TCR中对重新装载位(TRB)置1时,PRDH:PRD的内容也会装载到TIMH:TIM中。CPU定时器周期寄存器高位TIMERxPRDH图4-15CPU定时器周期寄存器高位TIMERxPRDH

259260CPU定时器预定标寄存器TIMERxTPRCPU定时器预定标寄存器高位TIMERxTPRH4.7CPU定时器寄存器

260261位名称描述15~8PSCCPU定时器预定标计数器。这些位保持了定时器的当前预定标计数值。当PSCH:PSC的值大于0时,对每一次定时器时钟源周期PSCH:PSC减1。PSCH:PSC减到0以后的下一个定时器时钟(定时器预定标器的输出)周期,TDDRH:TDDR的值装入PSCH:PSC中,且定时器计数器寄存器(TIMH:TIM)减1。当定时器重新装载位TRB用软件置1时,可以重新装载PSCH:PSC值。通过读寄存器可以检查PSCH:PSC中的值,但不能直接设置PSCH:PSC中的值,PSCH:PSC中的值只能从定时器分频寄存器(TDDRH:TDDR)中得到。复位时,PSCH:PSC被设置为0。7~0TDDRCPU定时器分频。每经过一个(TDDRH:TDDR+1)定时器时钟源周期,定时器计数器寄存器(TIMH:TIM)减1。复位时,TDDRH:TDDR被清0。为了将整个定时器计数值增加n倍,写n-1到TDDRH:TDDR中。当预定标计数器(PSCH:PSC)值减到0以后的下一个定时器时钟(定时器预定标器的输出)周期,TDDRH:TDDR的内容重新装载到PSCH:PSC中,并使TIMH:TIM减1。当用软件置定时器重新装载位TRB为1时,TDDRH:TDDR内容重新装载到PSCH:PSC中。

261TIMER0TIMCPU-Timer0,CounterRegisterTIMER0TIMHCPU-Timer0,CounterRegisterHighTIMER0PRDCPU-Timer0,PeriodRegisterTIMER0PRDHCPU-Timer0,PeriodRegisterHighTIMER0TPRCPU-Timer0,PrescaleRegisterTIMER0TPRHCPU-Timer0,PrescaleRegisterHighTIMER0TCRCPU-Timer0,ControlRegisterCPUTIMER的相关寄存器4.8CPU定时器中断应用举例

262voidConfigCpuTimer(structCPUTIMER_VARS*Timer,floatFreq,floatPeriod){unsignedlongtemp;Timer->CPUFreqInMHz=Freq;//InitializetimerperiodTimer->PeriodInUSec=Period;temp=(long)(Freq*Period);//150MHz×1000000usTimer->RegsAddr->PRD.all=temp;Timer->RegsAddr->TPR.all=0;//Setpre-scalecountertodivideby1Timer->RegsAddr->TPRH.all=0;//Initializetimercontrolregister:Timer->RegsAddr->TCR.bit.TSS=1;//1=Stoptimer,0=StartTimerTimer->RegsAddr->TCR.bit.TRB=1;//1=reloadtimerTimer->RegsAddr->TCR.bit.SOFT=1;Timer->RegsAddr->TCR.bit.FREE=1;//TimerFreeRunTimer->RegsAddr->TCR.bit.TIE=1;//1=EnableTimerInterrupt}配置CPU定时器下面的函数中周期寄存器由给定的DSP时钟频率Freq(MHz)和定时器周期Period(µs)两个参数确定。初始化后定时器处于停止状态。

263ConfigCpuTimer(&CpuTimer0,150,1000000);CpuTimer0Regs.TCR.bit.TSS=0;//0=StartTimer配置CPU定时器在main()中调用定时器配置函数。

264配置CPU定时器在使用CPU定时器时,通常会调用定时器的配置函数voidConfigCpuTimer(structCPUTIMER_VARS*Timer,floatFreq,floatPeriod)。这个函数共有3个参数。第1个参数表明使用哪一个定时器。第2个参数Freq是CPU系统时钟频率,单位为MHz。如果DSP的CPU系统时钟频率SYSCLKOUT为150MHz,则使用时第2个参数时Freq为150MHz。第3个参数Period是CPU定时器的定时周期,单位为us。如果定时时间为1s,则使用时第3个参数Period为1000000us。

265配置CPU定时器在配置函数中,由于预定标寄存器TPR和预定标寄存器高位TPRH为0,说明16位CPU定时器分频TDDRH:TDDR=0,16位预定标计数器PSCH:PSC=0。CPU定时器的工作计数是对系统时钟SYSCLKOUT进行计数。CPU定时器32位周期寄存器PRDH:PRD由下面两个语句赋值。temp=(long)(Freq*Period);Timer->RegsAddr->PRD.all=temp;//定时器周期寄存器值如果CPU系统时钟频率SYSCLKOUT为150MHz,当使用配置函数ConfigCpuTimer(&CpuTimer0,150,1000000)以后,CPU定时器周期为,即定时时间为1秒。

2664.8CPU定时器中断应用举例主程序中首先进行系统初始化。包括对存储器、看门狗、锁相环以及系统外设时钟的初始化;关闭中断,将中断标志位与使能位清零;初始化PIE;初始化PIE中断向量表;初始化外设;将中断地址映射到PIE中断向量表中。

2674.8CPU定时器中断应用举例配置CPU定时器,启动定时器。开中断,程序进入死循环中等待中断。每次进入中断子程序中使CpuTimer2.InterruptCount加1。

268#include"DSP28_Device.h"voidmain(void){InitSysCtrl();//初始化系统控制寄存器、PLL、看门狗、时钟位默认配置DINT;//禁止全局中断IER=0x0000;//禁止CPU中断IFR=0X0000;//清除所有中断标志InitPieCtrl();//初始化PIE控制寄存器为默认状态(PIE中断被禁止并且标志被清除)InitPieVectTable();//初始化PIE控制寄存器InitCpuTimers();//初始化CPU定时器EALLOW;//解除寄存器保护PieVectTable.TINT2=&ISRTimer2;//将使用的中断向量重新映射,使其指向相应的中断服务程序EDIS;//使能寄存器保护ConfigCpuTimer(&CpuTimer2,150,1000000);//配置定时时间StartCpuTimer2();//使定义中的CpuTimer2Regs.TCR.bit.TSS位为0IER|=M_INT14;//中断使能EINT;//使能全局中断INTMERTM;//使能全局实时中断DBGMfor(;;);//程序死循环,定时时间到,跳转至中断服务子程序}例4.7

2694.8CPU定时器中断应用举例interruptvoidISRTimer2(void)//定时中断程序,//定时时间到,使CpuTimer2.InterruptCount加1{CpuTimer2.InterruptCount++;}

2704.8CPU定时器中断应用举例271structCPUTIMER_VARS{volatilestructCPUTIMER_REGS*RegsAddr;Uint32InterruptCount;floatCPUFreqInMHz;floatPeriodInUSec;};externstructCPUTIMER_VARSCpuTimer2;在DSP28_CPUTimers.h中

271272//CPUTimerSupportVariables:structCPUTIMER_VARS{volatilestructCPUTIMER_REGS*RegsAddr;Uint32InterruptCount;floatCPUFreqInMHz;floatPeriodInUSec;};voidInitCpuTimers(void);voidConfigCpuTimer(structCPUTIMER_VARS*Timer,floatFreq,floatPeriod);externvolatilestructCPUTIMER_REGSCpuTimer0Regs;externvolatilestructCPUTIMER_REGSCpuTimer1Regs;externvolatilestructCPUTIMER_REGSCpuTimer2Regs;externstructCPUTIMER_VARSCpuTimer0;externstructCPUTIMER_VARSCpuTimer1;externstructCPUTIMER_VARSCpuTimer2;在DSP28_CPUTimers.h中DSK2812cputimer工程

272End273

273DSP原理及应用2745.1概述5.2TMS320F2812存储器映射5.3Flash存储器5.4外部接口XINTF5.5与外部存储器的接口第5章存储器与外部接口XINTF

274F281x的存储器275F2812提供了外部并行总线扩展接口,可提供多于1M字(三个外部扩展空间:两个512K,一个16K)的寻址空间,有利于开发较复杂的系统,如扩展FLASH、RAM、ADC、DAC、RTC、LCD、USB等。F281x采用增强的哈佛总线结构,能够并行访问程序和数据存储空间,可以并行实现程序读、数据读、数据写这三个操作。片内集成了大量的SRAM、ROM、FLASH等存储器,采用统一编址方式,方便程序开发。

2755.1总线276

276277数据读程序读数据写CPUCPU及内部总线从程序空间读(PAB、PRDB)从数据空间读(DRAB、DRDB)向数据空间写(DWAB、DWDB)这3个操作可以同时进行。程序/数据空间的写操作共用数据总线DWDB,向程序存储器写和向数据存储器写两个操作不能同时进行。

2775.1总线278不能同时对程序空间进行读写,因为程序地址总线PAB是复用的,读写操作会同时使用到PAB。不能同时对程序空间和数据空间进行写操作,因为数据/程序写数据总线DWDB也是复用的,对程序空间进行写操作或者对数据空间进行写操作,都要用到DWDB。

278地址总线279PAB(ProgramAddressBus)程序地址总线;是一个22位的总线,用于传送程序空间的读写地址。程序在运行的时候,假如执行到了某一个指令,需要去找到这段代码的地址,用PAB来传送。2.DRAB(Data-ReadAddressBus)数据读地址总线;是32位的总线,用于传送数据空间的读地址。要读取数据空间某一个单元的内容,单元的地址通过DRAB来传送。3.DWAB(Data-WriteAddressBus)数据写地址总线;是32位的总线,用于传送数据空间的写地址。对数据空间的某一个单元进行写操作,单元的地址是通过DWAB来传送。

279PRDB(Program-ReadDataBus)程序读数据总线;是一个32位总线,用于传送读取程序空间时的指令或者数据。在执行代码的时候,首先通过PAB传送并找到了存放该指令的存储单元,存储单元中的具体内容由PRDB来传送。2.DRDB(Data-ReadDataBus)数据读数据总线;是一个32位总线,在读取数据空间时用来传送数据。在进行读操作时,首先通过DRAB总线确定需要进行读操作的数据单元地址,传送数据单元中的具体内容时需要DRDB。3.DWDB(Data/Program-WriteDataBus)数据/程序写数据总线;是一个32位总线,在进行写操作时向数据空间/程序空间传送相应的数据。对数据空间的某一个单元进行写操作,通过DWAB传送这个单元的地址,同时需要DWDB来传送写入的内容。数据总线280

280281存储器映射图

2815.2TMS320F2812存储器映射MOSARAM(1K)M1SARAM(1K)LOSARAM(4K)L1SARAM(4K)HOSARAM(8K)BootROM(4K)MP/MC=0BROMvector(32)MP/MC=0ENPIE=0OTP(1K)FLASH(128K)reservedreservedreservedPF0(2K)reservedreservedPF1(4K)reservedPF2(4K)reservedPIEvector(256)ENPIE=1XINTFZone0(8K)XINTFZone1(8K)XINTFZone2(0.5M)XINTFZone6(0.5M)XINTFZone7(16K)MP/MC=1XINTFVector-RAM(32)MP/MC=1ENPIE=0reservedreservedreservedData|Program0x0000000x0004000x0008000x000D000x0010000x0060000x0070000x0080000x0090000x00A0000x3D78000x3F80000x3FA0000x3FF0000x3FFFC00x3FC0000x1800000x1000000x0800000x0040000x002000Data|Program128-BitPasswordreserved0x3D7C00片内存储器外部扩展接口

2822835.2TMS320F2812存储器映射通过数据线XD0~XD15、地址线XA0~XA18及控制信号线扩展。存储器块M0(1K)、M1(1K)、L0(4K)、L1(4K)、H0(8K)均可以映射到程序和数据空间。外部扩展接口XINTF包括Zone0(8K),Zone1(8K),Zone2(512K),Zone6(512K),Zone7(16K)共计1M+32K。

2832845.2TMS320F2812存储器映射1.片内SARAM(Single–AccessRAM)片内SARAM为单口随机读/写存储器,在单个机器周期内只能被访问一次。C28x片内共有18K×16位的SARAM,分别是:M0和M1每块的大小为1K×16位,其中M0映射至地址0x000000~0x0003FF,M1映射至地址0x000400~0x0007FF。L0和L1每块的大小为4K×16位,其中L0映射至地址0x008000~0x008FFF,L1映射至地址0x009000~0x009FFF。H0大小为8K×16位,映射至地址0x3F8000~0x3F9FFF。

2842855.2TMS320F2812存储器映射2.片内FlashTMS320F2812片内含有128K×16位的Flash存储器,地址为0x3D8000~0x3F7FFF。片内Flash存储器既可映射到程序空间,也可映射到数据空间,用以执行代码或存储数据变量。Flash存储器的操作是分区段进行的,用户可单独擦除每个区段,并通过专用的存储器流水线进行操作。Flash存储器受到代码安全模块CSM的保护。

2852865.2TMS320F2812存储器映射3.片内OTP(One-TimeProgrammable)C28x内含2K×16位的一次性编程的ROMOTP,地址为0x3D7800~0x3D7FFF,其中由厂家保留了1K×16位作为系统测试使用,剩余1K×16位提供给用户使用。OTP可映射到数据空间或程序空间,可以存储数据变量或执行代码。OTP受到代码安全模块CSM的保护。

2862875.2TMS320F2812存储器映射4.片内BootROMC28x内含4K×16位的BootROM(引导ROM),地址为0x3FF000~0x3FFFFF。在该存储器内由TI公司装载了产品版本号、发布的数据、检验求和信息、复位矢量、CPU向量表及数学表等。BootROM的主要作用是实现DSP的Bootloader功能,芯片一出厂时在BootROM的存储器内装有厂家的引导装载程序。当芯片被设置为微计算机模式时,CPU在复位后将执行这段程序,完成Bootloader功能。

2872885.2TMS320F2812存储器映射0x3FF000~0x3FFBFF:数学表和函数0x3FFC00~0x3FFFBF:引导装载功能0x3FFFC0~0x3FFFFF:CPU向量表。其中0x3FFFC0~0x3FFFC1是复位向量。

2882895.2TMS320F2812存储器映射唯一能从内部BootROM操作的向量是位于0x3FFFC0的复位向量,复位向量是厂家编程的,指向初始化引导函数InitBoot,该函数用于启动引导操作。一系列的检验操作在GPIO引脚上进行,从而决定使用哪一种引导模式。对于F2812,正常操作时其余的向量不被使用。在引导完成后,应该初始化外设中断扩展模块PIE中断向量表,使能PIE中断向量表。除了复位向量,所有的向量都将从外设中断扩展模块PIE获得而不是从表2-4所示的CPU向量表中获得。

2892905.2TMS320F2812存储器映射5.代码安全模块CSM(CodeSecurityModule)CSM是128位的密码,由用户编程写入片内Flash的8个存储单元0x3F7FF8~0x3F7FFF中,共计16位×8=128位。代码安全模块CSM(CodeSecurityModule)可以防止未被授权的人通过JTAG接口检查片内存储器的内容,防止对受保护的代码进行复制工程。CSM用以保护Flash、OTP、L0及L1SARAM块。为了能够进入安全模块,用户必须正确写入128位密码,与存储在FLASH区域密码位置中的值相匹配。

290CodeSecurityModule保护知识产权用户自定义密码128bit寄存器受到EALLOW保护291LOSARAM(4K)L1SARAM(4K)OTP(1K)FLASH(128K)reserved0x0080000x0090000x00A0000x3D78000x3D8000128-BitPasswordreserved0x3D7C000x3F7FF8-0x3F7FFFCSMPasswordLocations

2912925.2.4受CSM影响的片内资源地址块0x008000~0x008FFFL0SARAM(4KW)0x009000~0x009FFFL1SARAM(4KW)0x3D7800~0x3D7BFFOTP(1KW)0x3D8000~0x3F7FFFFlash(128KW)

2922935.2TMS320F2812存储器映射6.中断向量第三章表3-1中指出了PIE向量、BROM向量及XINTF向量使能时的条件及分布情况。第二章图2-4中指出了当ST1的位VMAP=0时,CPU中断向量映射到程序存储器的地址为0x000000~0x00003F,共计64个字。当VMAP=1时,CPU的中断向量映射到程序存储器的地址为0x3FFFC0~0x3FFFFF。当VMAP=1和ENPIE=1时,使能PIE向量,RAM空间地址为0x000D00~0x000DFF,空间大小为256×16位。

2932945.2TMS320F2812存储器映射向量映射向量取自的地方地址范围VMAPM0M1MAPMP/ENPIEM1向量M1SARAM块0x000000~0x00003F00xxM0向量M0SARAM块0x000000~0x00003F01xxBROM向量ROM块0x3FFFC0~0x3FFFFF1x00XINTF向量XINTF区域70x3FFFC0~0x3FFFFF1xl0PIE向量PIE块0x000D00~0x000DFF1xx1表3-1中断向量表映射

2942955.2TMS320F2812存储器映射7.外设帧PF(PeripheralFrame)C28x在片内数据存储器空间映射了3个外设帧PF0、PF1及PF2,专门用作外设寄存器的映射空间。即除了CPU寄存器之外,其它寄存器均为存储器映射寄存器。它们被分别映射在PF0、PF1及PF2空间内。PF0为2K×16位的范围,地址为0x000800~0x000FFF,它们直接映射至CPU的存储器总线,可提供16/32位的访问操作。

2952965.2TMS320F2812存储器映射7.外设帧PF(PeripheralFrame)PF1为4K×16位的范围,地址为0x006000~0x006FFF,它们直接映射至32位外设总线。PF2为4K×16位的范围,地址为0x007000h~0x007FFF,它们直接映射至16位外设总线。

296外设帧0,1,2297

2972985.2TMS320F2812存储器映射8.存储器接口可以在CPU之外通过存储器接口进行直接存取。该接口将CPU与存储器、外围设备或其它接口相连接,并为程序空间和数据空间准备了独立的总线;这意味着在访问数据存储器的同时也可以从程序存储器读取指令代码。接口中还包含CPU要求读写的选通信号,这些信号能选择特殊的存储器块或者外设进行数据交换。

298299表5-4外设帧0寄存器

299300表5-5外设帧1寄存器

300301表5-6外设帧2寄存器

301外设寄存器说明302C28×系列DSP中有些寄存器的内容是受保护的,其目的是为了避免用户程序错误地改变这些寄存器的值。当受保护后,允许CPU对该寄存器进行读操作,但任何写操作均被忽略。如果寄存器是EALLOW保护的,在对该寄存器进行写操作前必须首先执行EALLOW指令使能;而完成后执行EDIS指令则可以禁止写操作。

302303受EALLOW保护的寄存器281x中有许多外设控制寄存器受EALLOW保护,即CPU不能写。CPU状态寄存器ST1的EALLOW位(ST1.6)指明了寄存器的保护状态。受EALLOW保护的寄存器有:DSP仿真寄存器、Flash寄存器、CSM寄存器、PIE中断向量表、系统控制寄存器、GPIOMUX寄存器、某些eCAN寄存器。CPU及内部总线

303状态寄存器ST1ARP:辅助寄存器指针。XF:XF状态位。该位反映了输出引脚XF的状态。该位可以用指令”SETCXF”置1,用指令”CLRCXF”清零。复位时该位为0。M0M1MAP:存储器M0和M1映射模式位。在C28x目标模式下,M0M1MAP一直保持为1,这是复位时的默认值。OBJMODE:目标匹配模式位。用来在C27x目标模式(OBJMODE=0)和C28x目标模式(OBJMODE=1)之间进行选择。复位时为0。可以用指令”SETCOBJMODE”使该位置1选择C28x目标模式。AMODE:地址模式位。复位时为0。

304IDLESTAT:空闲状态位。EALLOW:仿真允许访问使能位。为1时,可以访问受保护的外设寄存器。用EALLOW指令置1此位,用EDIS指令清除此位。LOOP:循环指令状态位。SPA:堆栈指针定位(StackPointerAlignment)位。VMAP:向量映射(VectorMap)位。VMAP决定CPU中断向量(包括复位向量)被映射到程序存储器的最低地址还是最高地址。0:CPU中断向量映射到程序存储器低地址,地址为0x000000~0x00003F1:CPU中断向量映射到程序存储器高地址,地址为0x3FFFC0~0x3FFFFF对于C28xCPU,VMAP内部被置1。复位时,强制使VMAP被置1。状态寄存器ST1

305DBGM:DBGM,Debug使能屏蔽位。当DBGM置1时,仿真器不能实时访问存储器和寄存器,调试者不能更新它的窗口。0:Debug事件使能,1:Debug事件禁止。可以用指令”CLRCDBGM”使DBGM清零。INTM:全局中断屏蔽位。该位可以全局使能或禁止所有的CPU可屏蔽中断。0:可屏蔽中断被全局使能。1:可屏蔽中断被全局禁止。可以用指令”CLRCINTM”使INTM清零。状态寄存器ST1

306外设帧0寄存器30716/32/*PeripheralFrame0:*/DEV_EMU:origin=0x000880,length=0x000180XINTF:origin=0x000B20,length=0x000020PIE_CTRL:origin=0x000CE0,length=0x000020PIE_VECT:origin=0x000D00,length=0x000100FLASH_REGS:origin=0x000A80,length=0x000060CSM:origin=0x000AE0,length=0x000010CPU_TIMER0:origin=0x000C00,length=0x000008CPU_TIMER1:origin=0x000C08,length=0x000008CPU_TIMER2:origin=0x000C10,length=0x000008F2812.cmd

307外设帧1寄存器30832/*PeripheralFrame1:*/ECAN_A:origin=0x006000,length=0x000100ECAN_AMBOX:origin=0x006100,length=0x000100F2812.cmd

308外设帧2寄存器30916/*PeripheralFrame2:*/SYSTEM:origin=0x007010,length=0x000020XINTRUPT:origin=0x007070,length=0x000010GPIOMUX:origin=0x0070C0,length=0x000020GPIODAT:origin=0x0070E0,length=0x000020EV_A:origin=0x007400,length=0x000040EV_B:origin=0x007500,length=0x000040MCBSP_A:origin=0x007800,length=0x000040SCI_A:origin=0x007050,length=0x000010SCI_B:origin=0x007750,length=0x000010SPI_A:origin=0x007040,length=0x000010ADC:origin=0x007100,length=0x000020F2812.cmd

3095.3存储器和寄存器的等待状态310名称等待状态说明RAM块M0和M10无需设置等待状态外设帧PF00无需设置等待状态外设帧PF10(写操作)2(读操作)固定数目的等待周期外设帧PF20(写操作)2(读操作)固定数目的等待周期RAM块L0和L10无需设置等待状态Flash0-15(可编程)可通过Flash的等待状态寄存器编程SARAM块H00无需设置等待状态引导ROM1固定数目的等待周期XINTF(可编程)可通过XINTF寄存器编程提示:Flash和XINTF的等待状态与DSP时钟频率有关。

310Flash具有如下特点:Flash分成10个扇区,每个扇区可以单独擦除与编程;代码可安全保护(128位密码);可根据CPU频率调整等待状态;具有低功耗模式;流水线模式能够提高代码执行效率。5.4Flash存储器311

311寻址空间程序和数据空间寻址空间程序和数据空间0x3D80000x3D9FFFSectorJ,8KXl60x3F00000x3F3FFFSectorC,16KX160x3DA0000x3DBFFFSectorI,8KX160x3F40000x3F5FFFSectorB,8KX160x3DC0000x3DFFFFSectorH,16KX160x3F60000x3F7F7FSectorA,8KX160x3E00000x3E3FFFSectorG,16KX160x3F7F800x3F7FF5当使用代码安全模块时,编程时写入0x00000x3E40000x3E7FFFSectorF,16KX160x3F7FF60x3F7FF7Boot-to-Flash(或ROM)入口(这里存放程序分支指令)0x3E80000x3EBFFFSectorE,16KX160x3F7FF80x3F7FFF安全密码(128位),不要全部编程为00x3EC0000x3EFFFFSectorD,16KX16F281x的Flash地址表312

312F2812的Flash写入界面313

313F2812的Flash314名称地址范围大小(×16)描述FOPT0x000A801Flash选择寄存器FlashOptionRegister保留0x000A811保留FPWR0x000A821Flash电源模式寄存器FlashPowerModesRegisterFSTATUS0x000A831Flash状态寄存器FlashStatusRegisterFSTDBYWAIT0x000A841Flash休眠到备用等待寄存器FlashSleepToStandbyWaitRegisterFACTIVEWAIT0x000A851Flash备用到激活等待寄存器FlashStandbyToActiveWaitRegisterFBANKWAIT0x000A861Flash读访问等待状态寄存器FlashReadAccessWaitStateRegisterFOTPWAIT0x000A871OTP读访问等待状态寄存器OTPReadAccessWaitStateRegister表5-9Flash/OTP配置寄存器表5-9中这些寄存器受EALLOW保护,同时也受代码安全模块CSM保护。

314F2812的Flash315Flash选择寄存器FOPT(FlashOptionsRegister)D0:ENPIPE。1-使能Flash流水线模式;0-关闭Flash流水线模式。FOPT寄存器中的ENPIPE位控制Flash流水线模式,当该位为1时,流水线模式激活。使用了预取机制,通过预取指令,流水线模式改善了取指的性能。

315F2812的Flash316Flash等待状态寄存器FBANKWAIT(FlashWaitstateRegister)D11~D8:PAGEWAIT,Flash按页读取等待状态。规定了一页读操作的CPU时钟周期的等待状态数(0~15个SYSCLKOUT周期)D3~D0:RANDWAIT,Flash随机读操作等待状态。规定随机读操作的CPU时钟周期的等待状态数(0~15个SYSCLKOUT周期)

316Flash初始化317//下面的函数初始化Flash控制寄存器,DSP时钟频率150MHzvoidInitFlash(void){EALLOW;FlashRegs.FOPT.bit.ENPIPE=1;//使能Flash流水线模式以提高代码执行效率FlashRegs.FBANKWAIT.bit.RANDWAIT=5;//设置随机访问的等待状态数目FlashRegs.FBANKWAIT.bit.PAGEWAIT=5;//设置按页访问的等待状态数目EDIS;asm(“RPT#7||NOP”);//软件延迟,等待流水线刷新}提示:初始化Flash寄存器的代码必须从RAM中运行,从Flash中执行将导致不可预测的结果。例5.1

317318片内存储器:000000-0003FFHSARAM:M0,1KW000400-0007FFHSARAM:M1,1KW000800-000CFFH片内外设寄存器0:PF0,2KW000D00-000DFFHPIE中断向量,256W006000-007FFFH片内外设寄存器1/2:PF1/PF2,8KW008000-008FFFHSARAM:L0,4KW,安全009000-009FFFHSARAM:L1,4KW,安全3D7800-3D7BFFHOTP:1KW,安全3D8000-3F7FFFHFlash:128KW,安全3F8000-3F9FFFHSARAM:H0,8KW3FF000-3FFFFFHBootROM,4KWTMS320F2812存储器映射总结

3185.5外部接口XINTF(ExternalInterface)319典型的DSP应用系统多采用最小系统,即系统由一个F2812DSP芯片加上相应的电源、时钟、复位、JTAG电路及应用电路构成。在程序调试过程中,可以先将程序放入到H0SARAM、L0SRAM和L1SARAM中运行仿真调试,对于程序长度小于16K时比较方便。调试完成后,再将程序放入Flash存储器中运行。

3195.5外部接口XINTF320对于较复杂的DSP应用系统,程序可能较长或需要扩展一些外部存储器或外部接口如D/A转换芯片、LCD驱动等,这时需要采用外部接口(XINTF)。外部存储器或接口访问速度等可能差别较大,XINTF提供了时序延长或加等待机制确保通过软件配置实现对这些存储器或外设的正确匹配。

3205.5外部接口XINTF321F2812的外部接口(XINTF)采用非复用的扩展总线;F2812的XINTF映射到5个独立的存储空间。当访问相应的存储空间时,就会产生一个片选信号。每个空间都可以独立地设置访问建立、有效和保持时间,同时还可以通过XREADY信号与外设的访问速度和时序匹配。单片机的外部总线?

321322XINTFF2812外部接口16位19位

3225.5外部接口XINTF323数据线XD为16位,地址线XA为19位。图5-8中有5个区域分别是区域0(Zone0)、区域1(Zone1)、区域2(Zone2)、区域6(Zone6)和区域7(Zone7)。

3235.5外部接口XINTF324区域0(Zone0)和区域1(Zone1)公用片选信号XZCS0AND1;区域6(Zone6)和区域7(Zone7)公用片选信号XZCS6AND7。所有区域共享19位的外部地址总线,处理器根据所访问的空间产生相应的地址。Zone2使用片选信号XZCS2。

3245.5外部接口XINTF325区域0(Zone0)和区域1(Zone1)两者共享同样片选信号。但是使用不同的外部地址。区域0(Zone0)的地址范围是0x002000~0x003FFF;区域1(Zone1)的地址范围是0x004000~0x005FFF。区域0(Zone0)和区域1(Zone1)片选使能逻辑如图5-9和5-10所示。

3255.5外部接口XINTF326

3265.5外部接口XINTF327▲Zone7:Zone7是特殊的区域,复位时,XMP/MC引脚为高电平,区域7(Zone7)映射到0x3FC000~0x3FFFFF。复位后,通过改变XINTF配置寄存器XINTCNF2中的MP/MC模式位,使能或屏蔽区域7(Zone7)。▲如果XMP/MC引脚为低电平,则区域7(Zone7)不能映射到0x3FC000~0x3FFFFF存储空间,而片上的BootROM将映射到该存储空间。

3275.5外部接口XINTF328▲如果引脚XMP/MC=1,选择微处理器操作模式。▲如果引脚XMP/MC=0,选择微计算机操作模式。

3285.5外部接口XINTF329微处理器模式——Zone7映射到高位地址空间,中断向量表可以定位在外部存储器空间。该模式下,BootROM将被屏蔽,Zone7被使能。此时从外部存储器引导复位向量。在这种情况下,用户必须将复位向量指向一个有效的可执行代码的存储器位置。

3295.5外部接口XINTF330微计算机模式——Zone7被屏蔽,Zone7不能映射到0x3FC000~0x3FFFFF存储空间,而BootROM将映射到该存储空间,且中断向量表从BootROM中获取。即BootROM被使能,XINTFZone7不被使能。在这种情况下,DSP从内部BootROM来引导复位向量,而Zone7不能被访问。

3305.5外部接口XINTF331▲上电复位时,XMP/MC的状态存放在XINTF配置寄存器XINTCNF2的MP/MC模式位。用户可以通过软件改变该位控制BootROM和XINTFZone7的映射。▲其它存储器区域并不受XMP/MC模式位的影响。

3315.5外部接口XINTF332对访问时序进行配置依赖于F2812的工作频率SYSCLKOUT和XINTF的定时时钟XTIMCLK。XINTF对外访问时序被分成三个阶段,即前导(Lead)阶段、有效(Active)阶段和保持(Trail)阶段。XINTF对不同的地址区域进行访问时,可以通过对应各区域的XTIMING寄存器对访问时序加等待状态进行延时,等待状态可配置为若干个XTIMCLK的周期数。

3325.5外部接口XINTF333一.外部接口XINTF时钟XINTF模块有两个时钟信号,即XINTF内部时钟XTIMCLK和外部时钟输出XCLKOUT。图5-10给出了这两个时钟与CPU系统时钟SYSCLKOUT之间的关系。所有外部接口的前导、有效和保持时间均以XINTF模块的内部时钟XTIMCLK为基准。

3335.5外部接口XINTF3341.XINTF内部时钟XTIMCLK对XINTF区域的所有访问都是以XTIMCLK这个时钟频率为基础。在配置XINTF时,需要确定XINTF的时钟即XTIMCLK相对于CPU系统时钟SYSCLKOUT的分频系数。通过写XINTF配置寄存器XINTCNF2的XTIMCLK位,可以将XTIMCLK配置成与SYCLKOUT相等或等于SYSCLKOUT的1/2。复位时,XTIMCLK的默认值为SYSCLKOUT的1/2。

3345.5外部接口XINTF3352.外部时钟输出XCLKOUTXINTF的所有访问从外部时钟输出XCLKOUT的上升沿开始,而外部逻辑可以关闭XCLKOUT时钟的输出。通过写XINTF配置寄存器XINTCNF2的CLKMODE位,可设定时钟XCLKOUT相对于XINTF内部时钟XTIMCLK的分频系数,将外部时钟输出XCLKOUT设置为与XTIMCLK相等或者是XTIMCLK的1/2。XCLKOUT的默认值是XTIMCLK的1/2,即CPU系统时钟SYSCLKOUT的1/4。

3355.5外部接口XINTF336XTIMCLK和SYSCLKOUT之间的关系

3365.5外部接口XINTF337(1)通过设置XINTF配置寄存器XINTCNF2的D18~D16即XTIMCLK,可以使CPU系统时钟SYSCLKOUT二分频或者不分频得到外部接口XINTF的基准时钟XTIMCLK。当XINTF配置寄存器XINTCNF2的D18~D16即XTIMCLK=1时,基准时钟XTIMCLK=SYSCLKOUT/2;当XINTF配置寄存器XINTCNF2的D18~D16即XTIMCLK=0时,基准时钟XTIMCLK=SYSCLKOUT。

3375.5外部接口XINTF338(2)通过设置XINTF配置寄存器XINTCNF2的D2即CLKMODE位,可以对基准时钟XTIMCLK进行二分频或者不分频。当XINTCNF2的D2即CLKMODE=1时,对基准时钟XTIMCLK进行二分频,当XINTCNF2的D2即CLKMODE=0时,对基准时钟XTIMCLK不分频。

3385.5外部接口XINTF339(3)通过设置XINTF配置寄存器XINTCNF2D3即CLKOFF位,CLKOFF=1,禁止时钟输出XCLKOUT。禁止XCLKOUT时钟输出是为了节电和减少噪声。(4)通过设置XINTF时序寄存器XTIMING0/1/2/6/7,可以配置产生新的时钟如前导/有效/保持的等待状态。

3395.6XINTF寄存器340XINTF寄存器只有通过运行XINTF之外的代码,才能修改这些寄存器,而对这些寄存器的修改将会影响访问XINTF的时序。

3405.6XINTF寄存器341名称地址大小(×16)描述XTIMING00x000B202XINTF时序寄存器,用于区域0XTIMING10x000B222XINTF时序寄存器,用于区域1XTIMING20x000B242XINTF时序寄存器,用于区域2XTIMING60x000B2C2XINTF时序寄存器,用于区域6XTIMING70x000B2E2XINTF时序寄存器,用于区域7XINTCNF20x000B342XINTF配置寄存器XBANK0x000B381XINTFBANK控制寄存器XREVISION0x000B3A1XINTF版本寄存器XINTF配置和控制寄存器映射

3415.6XINTF寄存器342XINTF时序寄存器

3425.6XINTF寄存器343每个XINTF区域都有一个时序寄存器。改变这个寄存器的值将影响该特定区域的时序。只有通过运行这个区域之外的代码,才能修改区域的时序寄存器。每个时序参数均可在XTIMING寄存器中进行编程。表5-11显示了XTIMING0/1/2/6/7寄存器各位定义情况。

3435.6XINTF寄存器344XINTF配置寄存器XINTCNF2

344345

345346引脚

3465.8DSP与外部存储器连接347CY7C1021芯片是Cypress公司生产的64K×16静态RAM存储器。CY7C1021逻辑块功能和引脚如图5-17所示,具有44个管脚。

3475.8DSP与外部存储器连接348当片选为低,写使能为低,完成写操作。如果低字节使能为低,来自I/O引脚I/O1~I/O8的数据通过地址总线A0~A15写入规定位置。如果高字节使能为低,来自I/O引脚I/O9~I/O16的数据通过地址总线A0~A15写入规定位置。

3485.8DSP与外部存储器连接349当片选为低,输出使能为低,写使能为高时,从CY7C1021芯片中读取数据。如果低字节使能为低,由地址线规定的存储器空间的数据出现在引脚I/O1~I/O8上。如果高字节使能为低,来自存储器空间的数据出现在引脚I/O9~I/O16上。当芯片片选为高,输出使能为高即输出禁止,和为高电平时,输入/输出引脚I/O1~I/O16被设置为高阻态。

349350

3505.8DSP与外部存储器连接351IS61LV51216是512K×16高速异步CMOS静态RAM,3.3V电源供电。

351352

3525.10存储器程序设计举例353例5.2SRAM存储单元的读写操作与测试。测试SRAM存储单元时,可以首先对每个地址对应的存储单元写入一个预先设定的数值,然后读取该地址单元的值,并与写入值进行比较以校验SRAM芯片是否工作正常。通常可选取有代表性的数据进行测试,如0x0000、0xFFFF、0x5555、0xAAAA等。测试代码举例如下。unsignedint*SRAM=(unsignedint*)0x100000;for(i=0;i<0xFFFF;i++)//SRAM的地址范围0x100000~0x10FFFF{*(SRAM+i)=0x5555;if(*(SRAM+i)!=0x5555){while(1);}//如果某一SRAM单元未通过测试,则程序停止在该行}

353例5.3外扩SRAM举例354#include"DSP281x_Device.h"#include"System.h"/***************全局变量定义****************/unsignedintRead_data[5]={0};unsignedintWrite_data[5]={6,2,3,4,5};/****************函数声明*******************/voidInit_XINTF(void);voidWrite_RAM(unsignedintAdr,unsignedintData);unsignedintRead_RAM(unsignedintAdr);voidTest_RAM(void);5.10存储器程序设计举例

3545.10存储器程序设计举例355voidmain(void){unsignedchartemp;InitSysCtrl();//系统控制初始,在DSP28_sysctrl.c中Init_XINTF();Test_RAM();Write_RAM(0x10,0x50);temp=Read_RAM(0x10);while(1);}

3555.10存储器程序设计举例356voidInit_XINTF(void){EALLOW;XintfRegs.XTIMING6.bit.XWRLEAD=2;//写操作建立时间XintfRegs.XTIMING6.bit.XRDLEAD=2;//读操作建立时间XintfRegs.XTIMING6.bit.XWRACTIVE=3;//写操作有效时间XintfRegs.XTIMING6.bit.XRDACTIVE=2;//读操作有效时间XintfRegs.XTIMING6.bit.XRDTRAIL=2;//读操作保护时间XintfRegs.XTIMING6.bit.XWRTRAIL=2;//写操作保护时间XintfRegs.XINTCNF2.bit.WRBUFF=3;//设置写缓冲深度EDIS;}

3565.10存储器程序设计举例357/*------------------------------------------*//*形式参数:Adr--地址Data--数据*//*返回值:void*//*函数描述:向指定地址写入一个整型数据*//*------------------------------------------*/voidWrite_RAM(unsignedintAdr,unsignedintData){unsignedint*pointer;pointer=(unsignedint*)(0x100000|Adr);*pointer=Data;}

3575.10存储器程序设计举例358/*------------------------------------------*//*形式参数:Adr--地址*//*返回值:Data--数据*//*函数描述:从指定地址读出一个整型数据*//*------------------------------------------*/unsignedintRead_RAM(unsignedintAdr){unsignedint*pointer;pointer=(unsignedint*)(0x100000|Adr);return(*pointer);}

3585.10存储器程序设计举例359/*------------------------------------------*//*形式参数:void*//*返回值:void*//*函数描述:通过读写测试RAM*//*------------------------------------------*/voidTest_RAM(void){unsignedinti,temp=0x1000,w_data=0,err=0,r_data;//数据地址for(i=0;i<100;i++){Write_RAM(temp++,w_data++);}temp=0x1000;w_data=0;for(i=0;i<100;i++){r_data=Read_RAM(temp++);if(r_data!=w_data)err=err+1;w_data++;}}

359360

360361第6章事件管理器及其应用6.1事件管理器功能概述6.2通用定时器6.8比较单元6.11捕获单元6.14正交编码脉冲电路6.15事件管理器中断光电编码器霍尔传感器功率放大器电流传感器

3616.1事件管理器功能概述362C2000系列DSP与其它系列DSP的主要区别体现在功能强大的事件管理器模块;事件管理器模块提供了强大的控制功能(PWM),适于运动控制和电机控制等领域;F2812具有两个外设相同的事件管理器模块EVA、EVB,可实现多轴运动控制;每个事件管理器包括通用定时器、比较器和PWM单元、捕获单元(CAP)与正交编码脉冲(QEP)电路;在电机控制应用中,每个事件管理器可以实现永磁同步电机、直流无刷电机及异步电机的控制。

3626.1事件管理器功能概述363事件管理器模块是DSP的外设模块。在运动及电机控制系统中采用该模块实现相应的功能。是F2812中最重要、最复杂的模块。事件管理器模块中有通用定时器,比较单元,脉宽调制PWM(PulseWidthModulator)电路,包括空间向量PWM电路,死区产生单元和输出逻辑。捕获单元,正交编码脉冲(QEP)电路,中断逻辑等。

3636.1事件管理器功能概述364捕获单元可以记录输入引脚上信号跳变的时刻。正交编码脉冲(QEP)电路具有直接连接光电编码器脉冲的能力,可获得旋转机械的速度和方向等信息。

364

365366

366367

3676.1事件管理器功能概述3681.通用定时器每个事件管理器中有两个通用定时器。通用定时器x(对于EVA:x=1或2,对于EVB:x=3或4)包括(1)1个16位定时器增/减计数器TxCNT,可以读/写。(2)1个16位定时器比较寄存器TxCMPR(具有影子寄存器),可以读/写。(3)1个16位定时器周期寄存器TxPR(具有影子寄存器),可以读/写。(4)1个16位定时器控制寄存器TxCON,可以读/写。(5)可选择的内部时钟或外部输入时钟。(6)一个对于内部时钟或外部输入时钟可编程的预定标因子。

3686.1事件管理器功能概述369(7)控制和中断逻辑,用于4种可屏蔽中断。定时器周期中断、定时器比较中断、上溢中断和下溢中断。(8)当选择增/减计数模式时,可用TDIRA/B引脚控制计数方向。TDIRA是事件管理器EVA的引脚,TDIRB是事件管理器EVB的引脚。16位定时器比较寄存器TxCMPR设定占空比;16位定时器周期寄存器TxPR设定PWM周期,可以得到期望的PWM脉冲占空比。

3696.1事件管理器功能概述3702.全比较单元每个事件管理器有3个全比较单元,EVA的全比较单元使用通用定时器1作为时钟基准,通过使用可编程的死区电路产生6个比较输出或PWM波形输出,而6个输出中的任何一个输出状态都可以单独设置。比较单元中的比较寄存器是双缓冲的,可以根据需要编程改变PWM脉冲的宽度。

3706.1事件管理器功能概述3713.可编程的死区发生器死区发生器电路包括3个4位计数器和1个16位死区控制寄存器DBTCONx(x=A,B)。可以将需要的死区值通过编程写入比较寄存器,以便3个比较单元的输出。每个比较单元的输出可以单独使能或禁止死区的产生。死区发生器电路可以为每个比较寄存器的输出信号产生两个输出(带有或不带有死区)。可以根据需要通过双缓冲比较方式控制寄存器配置或修改死区发生器的输出状态。

3716.1事件管理器功能概述3724.PWM波形的产生每个事件管理器在同一时刻最多可以产生8个PWM波形输出。通过带有可编程死区的3个全比较单元可单独产生3对(6路)输出。通过通用定时器的比较器可产生两个单独的PWM输出。

3726.1事件管理器功能概述3735.捕获单元捕获单元为用户提供了对不同事件和变化进行记录的功能。当捕获输入引脚CAPx(对于EVA:x=1、2或3,对于EVB:x=4、5或6)检测到变化时,将所选择的通用定时器的当前计数值捕获并存储在两级深度的FIFO堆栈中。

3736.1事件管理器功能概述3746.正交编码脉冲(QEP)电路两个捕获输入(EVA的CAP1和CAP2,EVB的CAP4和CAP5)可以作为片上正交编码脉冲(QEP)电路的接口。7.外部模/数转换器ADC的启动转换EVA/EVB的启动转换信号SOC(Start-of-Conversion),可以送至启动外部ADC接口的外部引脚。

3746.1事件管理器功能概述3758.功率驱动保护中断为系统(例如功率转换器和电机驱动)的安全操作提供了安全保障。可以通知监控程序告知电机驱动异常。向监测电机驱动异常的监视程序报告信息。例如:过压、过流和温度的急剧上升。如果的中断未被屏蔽,引脚变为低电平时,所有的PWM输出引脚都将被置为高阻态,同时也会产生中断。

3756.1.2事件管理器寄存器376事件管理器EVA的寄存器如表6-2所示,事件管理器EVB的寄存器如表6-3所示。EVA寄存器的地址范围为0x7400~0x7431;EVB寄存器的地址范围是0x7500~0x7531。

3762022/6/10377

3772022/6/10378

3782022/6/10379

3792022/6/10380

3802022/6/10381

3812022/6/103826.1.2事件管理器寄存器

3826.2通用定时器概述383每个事件管理器有两个16位的通用定时器其中EVA--GPT1&GPT2,EVB--GPT3&GPT4定时器可以根据具体任务独立使用1)在控制系统中产生采样周期(同CPU定时器)2)为捕获单元、正交脉冲计数提供基准时钟(GPT2、GPT4)3)为比较单元和PWM电路提供基准时钟(GPT1、GPT3)通用定时器功能概述事件管理器的通用定时器与CPU通用定时器相比有何区别?

383384

384通用定时器框图385全局控制寄存器GPTCONA/B确定通用定时器实现具体任务时需要采取的比较方式和引脚极性,并给出定时器的计数方向。定时器2/4可以使用定时器1/3的周期寄存器,反过来不可以。TxCON确定每个通用定时器的计数模式、时钟源、分频系数、使能/禁止计数、比较操作。

3856.2通用定时器概述386每个通用定时器模块由几个子模块组成,主要包括:可读写的16位递增/减计数器寄存器TxCNT可读写的16位定时器比较寄存器TxCMPR(设定占空比)可读写的16位定时器周期寄存器TxPR(设定PWM周期)可读写的16位定时器控制寄存器TxCON可以选择内部或外部时钟TCLKINA/B,可对时钟输入预定标4个可屏蔽中断(下溢、上溢、比较匹配、周期匹配)当选择增/减计数模式时,可用TDIRA/B引脚控制计数方向定时器比较输出引脚TxPWM_TxCMP。x=1,2(EVA);x=3,4(EVB)

3866.3通用定时器寄存器3876.3.1通用定时器控制寄存器TxCONTxCON(x=1,2,3或4)决定一个定时器的操作模式,每个定时器都可独立配置。用户可使用软件指令访问定时器控制寄存器TxCON,以便确定:

3876.3通用定时器寄存器388(1)计数模式:通用定时器处于4种计数模式中的哪一种;(2)时钟选择:通用定时器使用外部时钟还是内部时钟(HSPCLK);(3)分频系数:输入时钟使用8种预定标因子(范围从1/128~1)中的哪一种;

3886.3通用定时器寄存器389(4)定时器比较寄存器重装载条件:何种条件下重装载定时器的比较寄存器;(5)通用定时器是否使能;(6)通用定时器的比较操作是否使能;

3896.3通用定时器寄存器390(7)通用定时器的周期寄存器选择;即通用定时器2使用自身的还是使用通用定时器1的周期寄存器(EVA模块);通用定时器4使用它自身的还是使用通用定时器3的周期寄存器(EVB模块)。

3906.3通用定时器寄存器391TxCON(x=1,2,3或4)的映射地址为:7404h(T1CON)、7408h(T2CON)、7504h(T3CON)、7508h(T4CON)。

391位15-14仿真控制位00仿真挂起时立即停止01仿真挂起时当前定时周期结束后停止10操作不受仿真挂起的影响11操作不受仿真挂起的影响位13保留。位12-114种计数模式选择00停止/保持01连续增/减计数模式10连续递增计数模式11定向增/减计数模式

392位10-8输入时钟定标器000x/1100x/16001x/2101x/32010x/4110x/64011x/8111x/128x=输入时钟频率位7使能位的来源0:使用自身的使能位(TENABLE)1:不用自身的使能位,使用T1CON(EVA)或T3CON(EVB)的使能位来使能或禁止操作。

393位6TENABLE定时器使能与禁止0禁止定时器操作。即使定时器保持并且使预定标计数器复位1允许定时器操作位5-4时钟源选择00内部时钟(HSPCLK)01外部时钟10保留11正交编码脉冲电路,只适用于定时器2/4,即T2CON和T4CON

394位3-2TLCD1、TLCD0定时器比较寄存器重载条件00计数器的值为0时重载01计数器的值为0或等于周期寄存器的值时重载10立即重载11保留位1TECMPR定时器比较操作使能与禁止。0禁止定时器比较操作1使能定时器比较操作

395位0周期寄存器选择0使用自己的周期寄存器1使用T1PR(EVA)或T3PR(EVB)做周期寄存器而忽略自己的周期寄存器。

3966.3通用定时器寄存器3976.3.216位全局通用定时器控制寄存器GPTCONA/B,可读写规定了通用定时器针对不同定时器事件所应采取的操作,并指明了定时器的计数方向;是否在发生定时器匹配事件时启动ADC模块的转换,同时还对定时器比较输出的极性进行了规定。

3972022/6/10398

3986.3通用定时器寄存器399全局通用定时器控制寄存器A(GPTCONA)——映射地址为7400h。各位的意义如下。

399位15保留位位14通用定时器2的状态,只读。0递减计数1递增计数位13通用定时器1的状态,只读。0递减计数1递增计数位12T2CTRIPE位11T1CTRIPE位10-9使用通用定时器2启动ADC事件。

40000无事件启动ADC(模数转换)01设置下溢中断标志启动ADC(模数转换)10设置周期中断标志启动ADC(模数转换)11设置比较中断标志启动ADC(模数转换)位8-7使用通用定时器1启动ADC事件。00无事件启动ADC(模数转换)01设置下溢中断标志启动ADC(模数转换)10设置周期中断标志启动ADC(模数转换)11设置比较中断标志启动ADC(模数转换)

401位6定时器比较输出使能0禁止通用定时器比较输出(定时器比较输出T1PWM_T1CMP和T2PWM_T2CMP为高阻态)1使能通用定时器比较输出位51定时器2比较输出T2PWM_T2CMP使能,0高阻态位41定时器1比较输出T1PWM_T1CMP使能,0高阻态位3-2T2PIN,通用定时器2比较输出极性00强制低01低有效10高有效11强制高

402位1-0T1PIN,通用定时器1比较输出极性00强制低01低有效10高有效11强制高全局通用定时器控制寄存器GPTCONB的映射地址为7500h,各位的意义与GPTCONA类似。

4036.3通用定时器寄存器4046.3.3事件管理器扩展控制寄存器EXTCONA和EXTCONB

4046.3通用定时器寄存器4056.3.4TxCNT(x=1,2,3,4):16位计数寄存器,可读写计数寄存器TxCNT是通用定时器的核心,记录输入脉冲数。计数脉冲可由内部时钟提供也可由外部时钟提供;时钟的选择及分频系数由定时控制寄存器TxCON相应位决定。

4056.3通用定时器寄存器406当计数寄存器值达到0xFFFF时将产生上溢事件当计数寄存器值达到0x0000时将产生下溢事件若此时相应的中断使能,将分别在中断标志寄存器EVAIFRA、EVAIFRB、EVBIFRA和EVBIFRB等中的TxOFINT和TxUFINT上产生置位。(x=1,2,3,4)

4062022/6/10407

407位15-11保留位。读返回0,写无效。位10T1OFINTFLAG。通用定时器1的上溢中断标志读0:通用定时器1无上溢中断发生读1:通用定时器1有上溢中断发生写0:无效1:复位标志位位9T1UFINTFLAG。通用定时器1的下溢中断标志读0:通用定时器1无下溢中断发生读1:通用定时器1有下溢中断发生写0:无效1:复位标志位

408位8T1CINTFLAG。通用定时器1的比较中断标志读0:通用定时器1无比较中断发生读1:通用定时器1有比较中断发生写0:无效1:复位标志位位7T1PINTFLAG。通用定时器1的周期中断标志读0:通用定时器1无周期中断发生读1:通用定时器1有周期中断发生写0:无效1:复位标志位位6-4保留位。读返回0,写无效。位3CMP3INTFLAG。比较单元3中断标志读0:比较单元3无中断发生读1:比较单元3有中断发生写0:无效1:复位标志位

409位2CMP2INTFLAG。比较单元2中断标志读0:比较单元2无中断发生读1:比较单元2有中断发生写0:无效1:复位标志位位1CMP1INTFLAG。比较单元1中断标志读0:比较单元1无中断发生读1:比较单元1有中断发生写0:无效1:复位标志位位0PDPINTAFLAG。功率驱动保护中断标志读0:无功率驱动保护中断发生读1:有功率驱动保护中断发生写0:无效1:复位标志位

4106.3通用定时器寄存器4116.3.5TxCMPR(x=1,2,3,4):16位定时器比较寄存器——地址:7402h(T1CMPR),7406h(T2CMPR),7502h(T3CMPR),7506h(T4CMPR)通用定时器比较寄存器TxCMPR存放的值,不断与计数寄存器的值进行比较。当比较匹配时,将发生以下事件:

4116.3通用定时器寄存器4121.根据全局通用定时器控制寄存器GPTCONA/B位的设置不同,相关的比较输出发生跳变(高、低电平),或启动ADC;2.相应的中断标志将被置位(EVAIFRA);3.如中断未屏蔽将产生外设中断请求。4.通过设置TxCON寄存器的D1(TxCON.1),可以使能或禁止定时器的比较操作。

412位3-2TLCD1、TLCD0定时器比较寄存器重载条件00计数器的值为0时重载01计数器的值为0或等于周期寄存器的值时重载10立即重载11保留位1TECMPR,定时器比较使能与禁止。0禁止定时器比较操作1使能定时器比较操作T1CON

4136.3通用定时器寄存器414定时器比较寄存器TxCMPR存放待比较的值,它是双缓冲结构。分为缓冲寄存器和工作寄存器。缓冲寄存器可在任何时候进行读写;缓冲寄存器的内容什么时候装到它的工作寄存器,取决于定时控制寄存器TxCON的D3~D2TCLD1~TCLD0的设置。

4146.3通用定时器寄存器415计数寄存器TxCNT的值不断与定时器比较寄存器TxCMPR中工作寄存器的值进行比较,一旦相等就产生比较匹配事件。若中断使能,将在事件管理器中断标志寄存器EVAIFRA、EVAIFRB、EVBIFRA和EVBIFRB中的定时器比较中断标志位TxCINTFLAG上产生置位。(x=1,2,3,4)

415位8T1CINTFLAG。通用定时器1的比较中断标志读0:通用定时器1无比较中断发生读1:通用定时器1有比较中断发生写0:无效1:复位标志位位7T1PINTFLAG。通用定时器1的周期中断标志读0:通用定时器1无周期中断发生读1:通用定时器1有周期中断发生写0:无效1:复位标志位位6-4保留位。读返回0,写无效。位3CMP3INTFLAG。比较单元3中断标志读0:比较单元3无中断发生读1:比较单元3有中断发生写0:无效1:复位标志位

4166.3通用定时器寄存器4176.3.6TxPR(x=1,2,3,4):16位定时器周期寄存器——地址:7403h(T1PR),7407h(T2PR),7503h(T3PR),7507h(T4PR)通用定时器周期寄存器的值决定了定时器周期的大小。当周期寄存器的值和计数寄存器TxCNT的值匹配时,根据定时器所处的计数模式,计数寄存器的值将复位为零或开始递减计数。

4176.3通用定时器寄存器418定时器周期寄存器TxPR存放周期值。与定时器比较寄存器TxCMPR相类似,也是双缓冲结构。分为缓冲寄存器和工作寄存器,可在任何时候对它的缓冲寄存器进行读写。定时器周期缓冲寄存器的内容装载到它的工作寄存器,只能在计数寄存器TxCNT的值为0时进行。

4186.3通用定时器寄存器419计数寄存器TxCNT的值不断与定时器周期寄存器的工作寄存器的值进行比较,一旦相等就产生周期匹配事件。在中断标志寄存器EVAIFRA、EVAIFRB、EVBIFRA和EVBIFRB中的TxPINTFLAG上产生置位。(x=1,2,3,4)

4192022/6/10420

4206.3通用定时器寄存器421在连续计数模式下,有了定时器周期寄存器就可以产生连续的周期信号。通过定时器比较寄存器控制脉冲宽度,就可以产生任意调制的PWM波形。

4216.3通用定时器寄存器4226.3.7比较寄存器和周期寄存器的两级缓存通用定时器的比较寄存器TxCMPR和周期寄存器TxPR是双缓冲结构;分为缓冲寄存器(或影子寄存器)和工作寄存器;

4226.3通用定时器寄存器423缓冲寄存器可在任何时候进行读写。缓冲寄存器的内容什么时候装载到它的工作寄存器,对TxCMPR和TxPR是不同的。

4236.3通用定时器寄存器424对于比较寄存器来说,仅仅当由通用定时器控制寄存器TxCON所指定的某一个特定事件发生时,缓冲寄存器的内容才载入工作寄存器中。对于周期寄存器来说,仅仅当计数寄存器TxCNT的值为0时,缓冲寄存器的内容才载入工作寄存器。

4246.3通用定时器寄存器425根据TxCON中位TCLD1~TCLD0设置情况;比较寄存器的工作寄存器重装载的情况有如下三种:(1)缓冲寄存器写入数据后立即加载;(2)下溢时,即通用定时器计数寄存器的值为0时;(3)下溢或周期匹配时,即定时器计数寄存器的值为0或与周期寄存器的值相等时。

4256.3通用定时器寄存器426周期寄存器和比较寄存器的双缓冲特点:允许用户在一个周期中的任何时候,通过修改程序代码更新周期寄存器和比较寄存器的值,以便在下一个周期中改变定时器的周期和PWM的脉冲宽度。对于PWM发生器来说,定时器周期值的快速变化就意味着PWM载波频率的快速变化。

4266.4.1通用定时器时钟427在定向增/减计数器模式下,通用定时器2(EVA模块)和通用定时器4(EVB模块)可用于正交编码脉冲(QEP)电路。正交编码脉冲(QEP)电路为定时器提供时钟和方向输入。通用定时器时钟源可以是内部时钟即高速外设时钟HSPCLK,也可以是外部时钟输入TCLKINA/B。外部时钟的频率必须小于或等于CPU时钟频率的1/4。每一个通用定时器都可以为时钟输入选择灵活的预定标因子,预定标因子的确定由TxCON寄存器决定。对于每一个通用定时器,提供了时钟的预定标因子。

4276.4.2通用定时器输入/输出4281.通用定时器的输入:通用定时器工作在定向递增/递减计数模式时,方向输入引脚TDIRA/B控制通用定时器的计数方向。2.通用定时器的输出包括:通用定时器比较输出TxPWM/TxCMP为ADC模块提供ADC转换启动信号为比较单元提供下溢、上溢、比较匹配和周期匹配等中断信号下溢:计数器值=0x0000上溢:TxCNT=0xFFFF比较匹配:TxCNT=TxCMPR周期匹配:TxCNT=TxPR反映计数方向标识位(状态)

4286.5.1通用定时器中断429通用定时器在事件管理器中断标志寄存器EVAIFRA、EVAIFRB、EVBIFRA和EVBIFRB中有中断标志。每个通用定时器可以根据如下事件产生四个中断(1)上溢中断:TxOFINT(x=1,2,3或4):(2)下溢中断:TxUFINT(x=1,2,3或4):(3)比较匹配:TxCINT(x=1,2,3或4);(4)周期匹配:TxPINT(x=1,2,3或4)。

4296.5.1通用定时器中断430当通用定时器计数器内容与比较寄存器内容相同时,就产生定时器比较匹配事件。如果比较操作被使能,则相应比较中断标志在匹配之后的1个时钟周期后相应的比较中断标志被置位。

4306.5.1通用定时器中断431当定时器计数器的值达到0xFFFF时,就产生上溢事件;当定时器计数器的值达到0x0000时,就发生下溢事件。

4316.5.1通用定时器中断432当定时器计数器的值与周期寄存器的值相同时,就产生一个周期匹配事件。在每个事件发生后的1个时钟周期后,定时器的上溢、下溢和周期中断标志将被置位。

4326.5.3通用定时器同步433通用定时器T2可以使用通用定时器T1的周期寄存器,通用定时器T4可以使用通用定时器T3的周期寄存器,反过来不可以。使用T1的使能位启动T2计数。这样就可以保证定时器T1和T2实现同步计数。同样EVB的T3和T4也能实现同步计数。T1和T2实现同步计数的具体步骤如下所示。

4336.5.3通用定时器同步434(1)将通用定时器控制寄存器T2CON的D7即T2SWT1位置1,实现用T1CON的使能位启动通用定时器T2计数。(2)对定时器计数寄存器T1CNT和T2CNT赋不同的初值。(3)将通用定时器控制寄存器T2CON的D0即SELT1PR位置1,选择T2使用T1的周期寄存器作为自己的周期寄存器,而忽略自身T2的周期寄存器。

4346.5.4通用定时器复位435当任何复位事件发生时,将发生以下情况:(1)GPTCONA/B寄存器中除计数方向指示状态位外,所有与通用定时器相关的位都被复位为0。因此所有通用定时器的操作都被禁止,计数方向指示状态位都置成1。

4356.5.4通用定时器复位436(2)所有的定时器中断标志位均被复位为0。(3)除了功率驱动保护中断所有的定时器中断屏蔽位都被复位为0,因此除了,所有通用定时器的中断都被屏蔽。(4)所有通用定时器的比较输出引脚都被置为高阻态。

436437每个通用定时器有四种可选的操作模式:(1)停止/保持模式(2)连续递增计数模式(3)定向增/减计数模式(4)连续增/减计数模式定时器控制寄存器TxCON中的计数模式选择位12~位11决定了通用定时器的操作模式。6.6通用定时器计数操作

437位15-14仿真控制位00仿真挂起时立即停止01仿真挂起时当前定时周期结束后停止10操作不受仿真挂起的影响11操作不受仿真挂起的影响位13保留。位12-114种计数模式选择00停止/保持01连续增/减计数模式10连续递增计数模式11定向增/减计数模式

438439通用定时器中计数寄存器将按照已定标的输入时钟计数,直到计数寄存器的值和周期寄存器的值匹配为止。产生周期匹配之后在下一个输入时钟的上升沿,定时器复位为0;开始另一个计数周期。6.6通用定时器计数操作

4394406.6通用定时器计数操作6.6.2通用定时器连续递增计数模式

440例:连续递增计数模式波形

441442连续递增计数模式小结:在连续递增计数模式下,定时器连续加计数,直到计数值等于周期寄存器的周期值为止。然后,定时器计数器复位为0,并开始新一轮的加计数。6.6通用定时器计数操作

442443按照以上变化,当定时器初值为0时,定时器的变化周期应该等于周期寄存器(TxPR)的周期值加上一个计数周期,表示为(TxPR+1)。连续递增计数模式经常用于电动机控制波形的产生或控制系统的采样周期;所以计数器的初值一般选为0。6.6通用定时器计数操作

443444在连续递增计数模式时,计数方向总是增计数,因此通用定时器控制寄存器GPTCONA的计数方向指示位总是1。(对于定时器2计数方向指示状态位是GPTCONA[14],对于定时器1计数方向指示状态位是GPTCONA[13])TDIRA计数方向引脚不会对计数器产生任何影响。6.6通用定时器计数操作

444连续递增计数模式445在计数器与周期寄存器匹配一个时钟周期后,周期中断标志置位。该周期中断可通过GPTCONA/B相应位来启动ADC。在计数器复位为0后的一个时钟周期,下溢中断标志被置位。同样,该周期中断可通过GPTCONA/B相应位来启动ADC。提示:连续递增计数模式特别适于边沿触发或非对称PWM波形产生等应用,也适于电机和运动控制系统中采样周期的产生。

445定向增/减计数模式446定向增/减计数模式--TMODE1~TMODE0=11该模式下,计数方向受TDIRA/B引脚的输入信号控制a)TDIRA/B=1:从TxCNT=0递增计数直到TxCNT=TxPR或0xFFFF时,TxCNT=0,然后重新递增计数到周期寄存器的值;b)TDIRA/B=0:从TxCNT=TxPR递减计数直到TxCNT=0,然后重新载入周期寄存器的值,并继续计数。周期、下溢、上溢中断标志及其操作与连续计数方式相同同样,由GPTCONA/B中的计数方向标识位可知增或减计数1代表递增计数,0代表递减计数。

446定向增/减计数模式447通常,通用定时器2/4的定向增/减计数模式与QEP电路结合使用,由QEP电路为定时器提供计数时钟和计数方向。该模式主要用于QEP中对光电编码器的脉冲计数。

447448在定向增/减计数模式中,定时器的计数器可根据TDIRA引脚的电平决定增计数或减计数。当TDIRA引脚高电平时,计数器进行增计数操作,这种情况下与连续递增计数模式一样。6.6.3通用定时器定向增/减计数模式

448449当TDIRA引脚低电平时,计数器进行减计数操作,当减计数到0时,计数器自动以周期寄存器的值为初值重新装入,并开始新的一轮减计数。T1CON的位6:定时器使能1—允许定时器操作0—禁止定时器操作6.6.3通用定时器定向增/减计数模式

4494506.6.3通用定时器定向增/减计数模式

450通用定时器定向增/减计数模式示意图

451连续增/减计数模式452连续增/减计数模式--TMODE1~TMODE0=01该模式下,计数方向不受TDIRA/B引脚的输入信号控制。首先递增计数直到TxCNT=TxPR或0xFFFF时,开始递减计数直到TxCNT=0,然后重新从递减变为递增计数;除第一个周期外,计数周期都是2×TxPR个时钟定标后的周期;周期、下溢、上溢中断标志及其操作与连续计数方式相同;同样,由GPTCONA/B中的计数方向标识位可知增或减计数。提示:连续递增/减计数模式特别适于电机控制与功率电子等应用产生中心对称的PWM波形。

452453定时器的计数方向仅在定时器的值达到周期寄存器的值时(或0xFFFF,如果初始定时器的值大于周期寄存器的值),才从递增计数变为减计数。定时器的计数方向仅当计数器的值为0时才从减计数变为增计数。引脚TDIRA/B的状态对计数的方向没有影响。6.6.4通用定时器连续增/减计数模式

453通用定时器连续增/减计数模式示意图

454455连续增/减计数模式小结:在连续增/减计数模式下,TDIRA引脚不再控制计数器的计数方向。只有在计数器的计数值等于周期寄存器的值时(增计数),或计数器的计数值为0时(减计数),计数方向才会自动改变。6.6.4通用定时器连续增/减计数模式

455456以上变化中,总是增计数与减计数交替进行;因此定时器的变化周期为2倍的周期值,即2×TxPR。与连续递增计数模式一样,当中断条件满足后也会引起周期、上溢和下溢中断标志位置1。连续增/减计数模式非常适用于产生PWM对称波形。6.6.4通用定时器连续增/减计数模式

456连续增/减计数模式

4574586.6通用定时器比较操作每个定时器都有一个定时器比较寄存器TxCMPR(请注意与比较单元有区别)。比较操作时,计数器总是与定时器比较寄存器的比较值进行比较。当两者相等时,延时一个时钟周期后可能引发以下3种事件:

458459(1)TxPWM_TxCMP引脚输出信号会发生跳变;(2)比较中断标志位被置1;(3)启动A/D转换。(如果在GPTCONA中设置比较中断标志启动A/D)定时器比较寄存器与定时器周期寄存器一样,都是产生PWM波形所不可缺少的重要寄存器。6.6通用定时器比较操作

4594606.7利用定时器比较寄存器产生PWM波形PWM波是一种脉宽可调的脉冲波,用于交、直流电动机的电压控制。定频调宽是一种最常见的脉宽调制方式,它使脉冲波的频率(或者周期)保持不变,只调整脉冲宽度。

4604611.设计了使用定时器周期寄存器的周期值和定时器比较寄存器的比较值来实现产生PWM波的方法。周期值用于产生PWM波的频率(或周期),比较值用于产生PWM波的脉宽。因此,比较值要小于周期值。6.7利用定时器比较寄存器产生PWM波形

461462根据使用比较器的不同,有两种产生PWM波的方法:一种是使用定时器比较寄存器;另一种是使用比较单元。后者产生的PWM波可以加死区。6.7利用定时器比较寄存器产生PWM波形

462463利用定时器比较寄存器产生PWM每个定时器都有一个定时器比较寄存器TxCMPR和一个PWM输出引脚TxPWM_TxCMP。EVA:2个定时器;2个比较寄存器T1CMPR、T2CMPR。引脚:T1PWM_T1CMPT2PWM_T2CMPEVB:2个定时器;2个比较寄存器T3CMPR、T4CMPR。引脚:T3PWM_T3CMPT4PWM_T4CMP6.7利用定时器比较寄存器产生PWM波形

463464利用定时器、定时器周期寄存器和比较寄存器,就可以在这个引脚上得到一个对称的或非对称的PWM波。6.7利用定时器比较寄存器产生PWM波形

464465TxPWM引脚的输出极性可以通过全局通用定时器控制寄存器GPTCONx(x=A,B)的TxPIN(x=1,2,3,4)位设置。其中包括强制高(输出总是1)、强制低(输出总是0)、高有效、低有效。6.7利用定时器比较寄存器产生PWM波形

465位1-0T1PIN,通用定时器1比较输出极性00强制低01低有效10高有效11强制高GPTCONA

466467(1)非对称PWM波形的产生将定时器设置在连续递增计数模式时产生非对称波形,如图所示。图中给出TxPWM引脚高有效和低有效两种输出波形。由图可见,两者波形相反。以高有效输出波形为例,介绍非对称PWM波形产生的特点。6.7利用定时器比较寄存器产生PWM波形

4674686.7利用定时器比较寄存器产生PWM波形通用定时器在递增计数模式下的非对称PWM输出

468

469470(1)非对称PWM波形的产生在计数初值设置为0且比较值小于周期值的条件下;如果计数器的计数值计到等于比较值;在TxPWM引脚上出现正跳变;此时计数器继续计数。6.7利用定时器比较寄存器产生PWM波形

470471当计数值等于周期值时,在TxPWM引脚上出现负跳变;同时计数器复位为0,完成一个PWM周期;比较值的改变只影响PWM脉冲的单边波形;这是非对称PWM波形的特点。6.7利用定时器比较寄存器产生PWM波形

471472在非对称PWM波形中,PWM波的周期就是周期寄存器的周期值+1。这种高有效PWM波形的占空比α计算公式为:α=正脉宽=周期值+1-比较值PWM周期周期值+16.7利用定时器比较寄存器产生PWM波形

472473低有效PWM波形的占空比α计算公式为:6.7利用定时器比较寄存器产生PWM波形

473474如果比较值等于0,则在整个PWM周期中引脚TxPWM输出总是1。只要比较值不变,这种情况就会持续下去。它的占空比等于1。如果在一个计数周期的开始时,比较值为0,那么在整个PWM周期输出均为1。如果下一个周期新的比较值为0,那么输出并不复位到0。这一点非常重要。允许产生占空比为0%~100%的无波形干扰的PWM脉冲。6.7利用定时器比较寄存器产生PWM波形

474475如果比较值大于周期值,在整个周期内输出为0。如果比较值等于周期值,引脚上只会出现1个计数周期的高电平,PWM周期的其它时间都是低电平,其占空比近似为0。6.7利用定时器比较寄存器产生PWM波形

475非对称PWM波形6.7利用定时器比较寄存器产生PWM波形

476477(2)对称PWM波形的产生将定时器的计数模式改为连续增/减计数模式就会得到对称的PWM波形。在计数器初值为0且比较值小于周期值的条件下开始增计数。6.7利用定时器比较寄存器产生PWM波形

477478当计数到与比较值相等时,TxPWM引脚发生跳变;继续计数到与周期值相等时,计数器开始减计数;再次计数到与比较值相等时,TxPWM引脚发生第二次跳变;当计数器减计数到0时,产生下溢事件,完成一个周期。6.7利用定时器比较寄存器产生PWM波形

4784796.7利用定时器比较寄存器产生PWM波形通用定时器在增/减计数模式下产生对称PWM波形

479对称PWM波形6.7利用定时器比较寄存器产生PWM波形

480481(2)对称PWM波形的产生比较值的改变影响了PWM脉冲的两边波形,这就是对称PWM波形的特点。在对称PWM波形中,如果增计数时的周期值和比较值等于减计数时的周期值和比较值,PWM波形的周期是周期寄存器的周期值的2倍。这种高有效的PWM波形占空比计算公式为:6.7利用定时器比较寄存器产生PWM波形

4814826.7利用定时器比较寄存器产生PWM波形在对称PWM波形中,PWM波形的周期是周期寄存器周期值TxPR的2倍。这种高有效的PWM波形占空比计算公式为:

4824836.7利用定时器比较寄存器产生PWM波形低有效对称PWM波形的占空比计算公式为:

483484如果比较值等于0,则引脚输出保持1,其占空比为1。如果在增计数和减计数时的比较值都大于等于周期值,则引脚输出保持为0,即占空比为0。6.7利用定时器比较寄存器产生PWM波形

484

485486(3)输出逻辑进一步调节波形发生器的输出,以生成最终的PWM波形输出,控制各种不同类型的功率设备。可通过配置GPTCONA/B寄存器的相应位设置高有效、低有效、强制高或强制低的PWM输出。6.7.3输出逻辑

486通用定时器的比较操作4871)非对称波形的产生当定时器工作于连续递增计数模式时,产生非对称波形有效的输出脉冲宽度=(TxPR+1)-TxCMPRPWM的占空比可以从0~100%变化对于非对称PWM波形,改变比较寄存器值仅改变PWM脉冲的一侧(1)(2)(4)(3)(6)(7)TxCMPR=0TxCMPR>TxPRTxCMPRTxPR,则整个计数周期内输出为0(占空比为0)4)跳变后保持不变直到周期结束100%0%

487对称波形的产生4882)对称波形的产生当定时器工作于连续递增/递减计数模式时,产生对称波形有效的输出脉冲宽度=2×TxPR-TxCMPRup-TxCMPRdownPWM的占空比可以从0~100%变化(1)(2)(3)(4)(5)(6)(7)TxCMPR=0TxCMPR>TxPRTxCMPRTxPR,则整个计数周期内输出为0(占空比为0)4)第二次匹配前保持不变(8)

488使用通用定时器产生PWM信号489每个通用定时器可以独立提供一个PWM输出通道,因此通用定时器最多可以提供四个通道的PWM输出。设定PWM信号的步骤:1)根据所需的PWM(载波)周期设置TxPR;2)配置GPTCONA/B寄存器,设定PWM输出的极性3)设置TxCON,确定计数模式和时钟源,启动PWM输出;4)将所需的PWM脉冲宽度(占空比)装载到TxCMPR.对于连续递增计数方式,将所需PWM周期除以定时器输入时钟的周期,然后减1即得到TxPR;对于连续递增/递减计数方式,将所需PWM周期除以2倍的定时器输入时钟周期即得到TxPR。例如:若HSPCLK=75MHz,定时器时钟不分频,要产生20kHz的PWM波形,则连续递增计数方式下TxPR=75M/20k-1=3749,连续增/减计数方式下TxPR=75M/20k/2=1875。

489490对称PWM波形CounterComparePeriodTPWMT1PWM_T1CMP(activehigh)InterruptsPeriodCompareCounterGeneralPurposeTimerT1PWM_T1CMPCompareCompareCompareFullCompareUnitsPWM1PWM2PWM3PWM4PWM5PWM6

490应用举例491DEC2812PWM工程voidmain(void){InitSysCtrl();/*初始化系统*/DINT;/*关中断*/IER=0x0000;IFR=0x0000;InitPieCtrl();/*初始化PIE控制寄存器*/InitPieVectTable();/*初始化PIE中断向量表*/InitEv();/*初始化EV*/EINT;ERTM;for(;;){KickDog();}}例6.6

491应用举例492voidInitEv(void){EALLOW;GpioMuxRegs.GPAMUX.all=0x00ff;EDIS;EvaRegs.GPTCONA.all=0x0859;/*GPtimercontrolregister*/EvaRegs.T1CNT=0;/*timer1countiszero*/EvaRegs.T1CON.all=0x0f42;EvaRegs.T1PR=0x7fff;EvaRegs.T1CMPR=0x3fff;}DEC2812PWM工程

492应用举例493EvaRegs.GPTCONA.all=0x0859比较输出使能,定时器1比较输出使能,定时器2比较输出高有效,定时器1比较输出低有效。EvaRegs.T1CON.all=0x1f42定向增减,x/128,使能定时器操作,使能定时器比较操作。内部时钟即HSPCLK。

493T1CON—7404h0001011101001110TMODE1~TMODE0TPS2~TPS1TCLKS1~TCLKS0书P184连续增计数128分频内部时钟使能定时器比较操作使能定时器操作

494495例:利用通用定时器1在GPIOB5引脚上产生周期为1s的方波,//令一个LED闪烁//XCLKIN=30MHz,SYSCLKOUT=150MHz#include"DSP281x_Device.h"interruptvoideva_timer1_isr(void);intcounter;//全局变量软件计数器,扩大定时时间voidEVA_Timer1(){EvaRegs.GPTCONA.all=0;//初始化EVATimer1EvaRegs.T1PR=0x249;//定时周期1.707us*(T1PR+1)=1msEvaRegs.EVAIMRA.bit.T1PINT=1;//使能定时器1的周期中断EvaRegs.EVAIFRA.bit.T1PINT=1;//写1清除定时器1的周期中断标志EvaRegs.T1CNT=0x0000;EvaRegs.T1CON.all=0x1740;//连续递增计数,128分频,使能定时器}例6.7

4952022/6/1049630MHz×10/2=150MHzSysCtrlRegs.PLLCR=0xA;HSPCLK=SYSCLKOUT/(2*HISPCP2~0)。SysCtrlRegs.HISPCP.all=0x0001;75MHz/128;事件管理器EVA通用定时器1128分频(128/75)us=1.707us为定时器1计数时钟周期;周期值为0x249+1=585+1=586定时时间为1.707us×586=1ms▲高速外设时钟预定标器HISPCPReservedD15D3D2D0HSPCLK

496497

497498voidmain(void){InitSysCtrl();//系统控制初始化,SYSCLKOUT=150MHz//高速外设时钟HSPCLK=75MHzEALLOW;GpioMuxRegs.GPBMUX.all=0;//把GPIOB设置为一般I/O口GpioMuxRegs.GPBDIR.all=0x00FF;//GPIOB7~0为输出EDIS;DINT;//禁止全局中断IER=0x0000;//禁止CPU中断IFR=0x0000;//清除中断标志寄存器InitPieCtrl();//初始化PIE控制寄存器InitPieVectTable();EVA_Timer1();EALLOW;

498499PieVectTable.T1PINT=&eva_timer1_isr;//中断服务程序入口地址放入中断向量表EDIS;//依次使能各级中断:外设中相应中断位->PIE控制器->CPUPieCtrlRegs.PIEIER2.all=M_INT4;//通用定时器1使能位于PIE第2组第4个,将其使能IER|=M_INT2;//PIE第2组对应于CPU的可屏蔽中断2(INT2),将其使能EINT;//开总中断counter=0;//软件计数器初值GpioDataRegs.GPBDAT.bit.GPIOB5=1;//指示灯灭for(;;){;}}

499500interruptvoideva_timer1_isr(void){counter++;if(counter==500)//500*1ms=500ms{counter=0;GpioDataRegs.GPBDAT.bit.GPIOB5^=1;//GPIOB5取反产生方波,指示灯亮灭切换}EvaRegs.EVAIMRA.bit.T1PINT=1;//使能定时器1的周期中断EvaRegs.EVAIFRA.bit.T1PINT=1;//写1清除定时器1的周期中断标志PieCtrlRegs.PIEACK.all=PIEACK_GROUP2;//清零PIEACK中的第2组中断对应位}

500501

501502end

502503第6章事件管理器及其应用6.1事件管理器功能概述6.2通用定时器6.8比较单元6.11捕获单元6.14正交脉冲编码电路6.15事件管理器中断光电编码器霍尔传感器功率放大器电流传感器

5032022/6/10504

5042022/6/10505

5052022/6/10506

5062022/6/10507

5072022/6/10508

5082022/6/10509

509510

510511

511采用事件管理器产生PWM512每个EV模块中,有3对死区和极性可编程的PWM输出引脚PWM1~PWM6或PWM7~PWM12,这6个特定的PWM输出可用于控制三相交流感应电机、永磁同步电机和直流无刷电机等;与通用定时器产生的PWM输出相比,PWM电路除了可以产生对称、非对称PWM波形外,三个比较单元结合使用还可以产生三相对称的空间矢量PWM输出。MPWM3VDCPWM4PWM1PWM2PWM5PWM6

5126.8比较单元及PWM电路513PWM电路具有如下特点:每个事件管理器可产生8路PWM信号,其中3对PWM信号由比较单元产生(死区可编程),2路由通用定时器产生;可快速改变PWM的载波频率和脉宽(双缓冲结构);功率驱动保护中断PDPINTx可以直接屏蔽PWM输出;能够产生可编程的对称、非对称和空间矢量PWM波形;比较寄存器和周期寄存器可自动加载,减少CPU开销。

513比较单元框图514死区控制寄存器DBTCONA比较控制寄存器COMCONAT1PR&T1CON比较方式控制寄存器ACTRACMPRxT1CNT需要配置的寄存器包括(对于EVA):COMCONA、CMPRx、T1PR、T1CON、ACTRA、DBTCONA。程序执行过程不断刷新CMPRx可以改变6路PWM输出的占空比。

514515事件管理器EVA模块和EVB模块中分别有3个全比较单元,每个比较单元都有两个PWM输出。比较单元的时间基准由通用定时器1(EVA模块)和通用定时器3(EVB模块)提供

515516全比较单元与前面讲述的通用定时器中简单比较单元的区别:每个全比较单元输出一对PWM信号,并具有死区控制和空间向量PWM模式输出的功能;而前面讲述的通用定时器中的每个比较寄存器对应功能只能输出一路PWM信号,且不具备死区控制和空间向量PWM模式输出的功能。6.8.1比较单元概述

516517每个事件管理器包括:(1)3个16位的比较寄存器CMPRx(对于EVA模块比较寄存器是CMPR1、CMPR2和CMPR3,即x=1,2,3)6.8.1比较单元概述(对于EVB模块比较寄存器是CMPR4、CMPR5和CMPR6即x=4,5,6)它们各带一个相应的影子寄存器(可读/写),双缓冲结构。注意区别于定时器比较寄存器TxCMPR。

517518(2)1个16位的比较控制寄存器对于EVA模块为COMCONA;对于EVB模块为COMCONB;该寄存器为可读写的。6.8.1比较单元概述

518519(3)1个16位的比较方式控制寄存器对于EVA模块为ACTRA,对于EVB模块为ACTRB,它们各带一个相应的映像寄存器(可读/写)。(4)6个三态输出引脚PWMy对于EVA模块,PWMy,y=1,2,3,4,5,6;对于EVB模块,PWMz,z=7,8,9,10,11,12,注意区别于TxPWM。6.8.1比较单元概述

519520(5)内嵌一个PWM电路,包含非对称/对称波形发生器和空间向量状态机。(6)控制和中断逻辑。6.8.1比较单元概述

520521比较控制寄存器COMCONA/COMCONB和比较方式控制寄存器ACTRA/ACTRB是全比较单元控制类寄存器。在全比较单元使用前需要对它们进行初始化设置。6.8.1比较单元概述

521522比较寄存器是存储待比较的值,属于数据类寄存器。除了这个数据类寄存器外,要进行比较操作还需要一个计数寄存器和一个周期寄存器。6.8.1比较单元概述

522523全比较单元不能单独工作,需要通用定时器的配合。EVA模块中全比较单元的时间基准由通用定时器1提供;EVB模块中全比较单元的时间基准由通用定时器3提供。6.8.1比较单元概述

523524全比较单元的6个输出引脚是成对工作的,它们的输出极性正好是反向,即引脚PWMy(y=1,3,5)为高电平时,引脚PWMy+1一定是低电平(不考虑死区)。为桥式电路所设计,当上桥臂开通时,下桥臂一定要关闭,否则将发生短路直通。6.8.1比较单元概述

524525三相桥式电路6.8.1比较单元概述

525526PWM模式的输出极性与通用定时器的比较输出一样,分为强制低、低有效、高有效和强制高,是由比较方式控制寄存器设置。PWM模式的波形发生是经过一个内嵌PWM电路产生,在其中有一个死区产生电路和一个空间向量状态机。6.8.1比较单元概述

526527死区产生电路用于上、下桥臂状态转换时(即输出发生跳变)增加一个无信号的死区时间,确保不发生短路直通现象。6.8.1比较单元概述

527528全比较单元的具体工作过程如下:(1)首先选择通用定时器1/3作为全比较单元的时间基准,并设置它的计数模式,如果要产生连续PWM波形,计数模式设置为连续递增或连续增/减计数模式。(2)根据频率设置相应的定时器周期寄存器T1PR/T3PR的值,初始化定时器计数寄存器T1CNT/T3CNT的值,然后使能定时器。6.8.2比较单元工作过程

528529(3)按照脉宽的变化规律,设置当前的比较寄存器CMPRx(x=1,2,3或4,5,6)值。计数寄存器T1CNT/T3CNT按照计数模式进行计数,并与比较寄存器CMPRx的值进行比较;若相等将发生比较匹配事件,并在中断标志寄存器EVAIFRA/EVBIFRA的CMPxINT位上置1,同时使输出引脚PWMy和PWMy+1(y=1,3,5(EVA)或7,9,11(EVB))按设定的极性发生变化。6.8.2比较单元工作过程

5292022/6/10530

530531位15-11保留位。读返回0,写无效。位10T1OFINTFLAG。通用定时器1的上溢中断标志读0:通用定时器1无上溢中断发生读1:通用定时器1有上溢中断发生写0:无效1:复位标志位位9T1UFINTFLAG。通用定时器1的下溢中断标志读0:通用定时器1无下溢中断发生读1:通用定时器1有下溢中断发生写0:无效1:复位标志位EVAIFRA

531532位8T1CINTFLAG。通用定时器1的比较中断标志读0:通用定时器1无比较中断发生读1:通用定时器1有比较中断发生写0:无效1:复位标志位位7T1PINTFLAG。通用定时器1的周期中断标志读0:通用定时器1无周期中断发生读1:通用定时器1有周期中断发生写0:无效1:复位标志位位6-4保留位。读返回0,写无效。位3CMP3INTFLAG。比较单元3中断标志读0:比较单元3无中断发生读1:比较单元3有中断发生写0:无效1:复位标志位

532533位2CMP2INTFLAG。比较单元2中断标志读0:比较单元2无中断发生读1:比较单元2有中断发生写0:无效1:复位标志位位1CMP1INTFLAG。比较单元1中断标志读0:比较单元1无中断发生读1:比较单元1有中断发生写0:无效1:复位标志位位0PDPINTAFLAG。功率驱动保护中断标志读0:无功率驱动保护中断发生读1:有功率驱动保护中断发生写0:无效1:复位标志位

533534计数寄存器T1CNT/T3CNT也同时与定时器周期寄存器T1PR/T3PR值进行比较,若相等将发生定时器周期匹配事件,从而引发与通用定时器完全一致的相关操作。按照在比较控制寄存器COMCONA/COMCONB的D14~D13,设置比较寄存器重载条件;为下一周期准备一个新的脉冲宽度。如此循环,得到需要的PWM波形。即此时PWM脉冲的周期仍由TxPR来控制。6.8.2比较单元工作过程

534535位14-13比较寄存器CMPRx重载条件。00当T1CNT下溢时重载01当T1CNT下溢或T1CNT周期匹配重载10立即重载11保留位12空间向量PWM模式使能。0禁止空间向量PWM模式1使能空间向量PWM模式位11-10比较方式控制寄存器重载条件COMCONA

535536为了实现全比较操作,可按照以下步骤分别设置相关的寄存器。6.8.2比较单元工作过程

536537EVA模块EVB模块设置T1PR(周期寄存器)设置T3PR设置ACTRA(比较方式控制寄存器)设置ACTRB初始化CMPRx(比较寄存器)初始化CMPRx设置COMCONA(比较控制寄存器)设置COMCONB设置T1CON(通用定时器1控制寄存器)设置T3CON6.8.3比较单元工作过程

5375386.8.4比较单元的中断和复位对于每个比较单元,都有一个可屏蔽的中断标志使能位。如果比较操作被使能,比较匹配后的1个时钟周期,比较单元的中断标志将被置位。(EVAIFRA比较单元1,2,3。或EVBIFRA比较单元4,5,6)如果中断没有被屏蔽,则会产生一个外设中断请求。

538539当任何复位事件发生时,所有与比较单元相关的寄存器都复位为0,且所有比较输出引脚被置为高阻态。6.8.4比较单元的中断和复位

5395406.9比较单元寄存器1.比较控制寄存器(COMCONA和COMCONB)比较单元的操作由比较控制寄存器(COMCONA和COMCONB)控制,均是可读写。比较控制寄存器COMCONA的映射地址为7411h。比较单元的操作模式由COMCONA/B的各位决定。包括:比较操作是否被使能;比较输出是否被使能;比较寄存器值的重载条件;空间向量PWM模式是否被使能。

5402022/6/10541

541542位15比较单元使能0禁止比较单元操作。1使能比较单元操作6.9比较单元寄存器

542543位14-13比较寄存器CMPRx重载条件。00当T1CNT下溢时重载01当T1CNT下溢或T1CNT周期匹配重载10立即重载11保留位12空间向量PWM模式使能。0禁止空间向量PWM模式1使能空间向量PWM模式位11-10比较方式控制寄存器重载条件6.9比较单元寄存器

54354400当T1CNT下溢时重载01当T1CNT下溢或当T1CNT周期匹配重载10立即重载11保留位9比较单元输出使能位。0比较单元输出PWM1/2/3/4/5/6处于高阻态1比较单元输出PWM1/2/3/4/5/6由相应的比较逻辑驱动。6.9比较单元寄存器

544545位8/PDPINTA的状态位,该位反映/PDPINTA引脚的当前状态。位7-0见书P188比较控制寄存器COMCONB映射地址为7511h,各位定义与COMCONA类似。6.9比较单元寄存器

5455462.比较方式控制寄存器(ACTRA和ACTRB)ACTRA和ACTRB控制6个比较输出引脚的动作。ACTRA的映射地址为7413h,各位描述如下:6.9比较单元寄存器

546547当比较事件使能时,比较方式控制寄存器(ACTRA和ACTRB)控制6个比较输出引脚PWMx,(x=1~6对于ACTRA;x=7~12对于ACTRB)的输出方式。ACTRA和ACTRB是双缓冲结构,它们的重载条件由COMCONA/B寄存器中相应的D11~D10来确定。6.9比较单元寄存器

5472022/6/10548

548549位15SVRDIR,空间矢量PWM旋转方向位,仅用于产生空间向量PWM输出。0正向1负向位14-12D2-D0,基本的空间矢量位,仅用于产生空间矢量PWM输出。ACTRA

549550位11-10CMP6ACT1-0,比较输出引脚PWM6上的比较输出方式选择。00强制低01低有效10高有效11强制高位9-8CMP5ACT1-0,比较输出引脚PWM5上的比较输出方式选择。00强制低01低有效10高有效11强制高6.9比较单元寄存器

550551位7-6CMP4ACT1-0,比较输出引脚PWM4上的比较输出方式选择。00强制低01低有效10高有效11强制高位5-4CMP3ACT1-0,比较输出引脚PWM3上的比较输出方式选择。00强制低01低有效10高有效11强制高

551552位3-2CMP2ACT1-0,比较输出引脚PWM2上的比较输出方式选择。00强制低01低有效10高有效11强制高位1-0CMP1ACT1-0,比较输出引脚PWM1上的比较输出方式选择。00强制低01低有效10高有效11强制高6.9比较单元寄存器

5525536.10比较单元PWM电路由于全比较单元是为桥式电路而设计,它的PWM波形在实际应用时有其特点。针对这些特点,在全比较单元中内嵌了一个PWM电路。

553554EVA模块PWM电路功能图

554555比较单元的PWM电路包括以下功能单元:(1)非对称/对称波形发生器;(2)可编程的死区产生电路;(3)空间矢量PWM状态机;(4)输出逻辑。6.10比较单元PWM电路

555556PWM信号及桥式电路PWM信号是一串宽度变化的脉冲序列。这些脉冲平均分布在一些定长时间段中,每个定长时间段内有一个脉冲。该定长时间段称作PWM(载波)周期,它的倒数称为PWM(载波)频率。在一个电动机控制系统中,PWM信号用于控制功率器件的开启和关闭时间,这些功率器件用来将所需的电流和能量传送到电动机线圈中。6.10比较单元PWM电路

556557三相桥式电路6.10比较单元PWM电路

557558传送到电动机线圈绕组中的相电压、相电流的频率以及能量的大小控制着电动机运转的速度和输出转矩的大小。这种桥式电路广泛应用于电机控制、逆变器等大部分电力电子的控制系统中。6.10比较单元PWM电路

558559桥式电路在应用时最关键的是要保证每组桥臂不能发生短路直通现象。从输出逻辑上要保证当上桥臂开通时,下桥臂必须要关断。反之亦然。6.10比较单元PWM电路

559560由于桥式电路由开关器件构成,它们的开通或关断需要一定的时间。在上、下桥臂状态转换时,开关器件会有一个共处放大状态的交叉区间,从而导致电路直通现象的发生。6.10比较单元PWM电路

560561为了避免这一点,就需要在上、下桥臂状态转换时插入一个无信号的死区时间,即确保先完全关断再开通。短路直通与死区如下图所示。6.10比较单元PWM电路

561562

562可编程死区单元563每个事件管理器模块都有一个死区控制单元,死区单元的输入为来自比较单元的信号PHx(x=1,2,3),对于每个输入产生两个输出信号DTPHx和DTPHx_;当死区控制使能时,这两个输出信号的跳变沿被一段称作死区的时间间隔分开,这个时间段由DBTCONx来设定。提示:设置死区的目的在于防止每个比较单元对应的两路PWM信号同时打开被控功率桥的上下臂形成直通状态导致短路。M

5635646.10.2比较单元死区产生电路桥式电路避免发生短路直通是至关重要的。为了自动地在每对全比较输出单元加入无信号的死区,PWM电路中有一个死区产生电路。以EVA模块为例,死区单元的结构如图所示。死区单元是内部可编程的,主要是对死区控制寄存器DBTCONA进行写操作。

564565

565566对EVA模块来说,是对死区控制寄存器DBTCONA进行写操作。两个死区控制寄存器的各位定义进行说明。6.10.2比较单元死区产生电路

5662022/6/10567

567568位15-12保留。位11-8DBT3一DBT0。规定了3个4位死区定时器的周期值。位7EDBT3。死区定时器3使能位(对应PWM5和PWM6)0禁止1使能位6EDBT2。死区定时器2使能位(对应PWM3和PWM4)0禁止1使能DBTCONA6.10.3死区定时器控制寄存器

568569位5EDBT1。死区定时器1使能位(对应PWM1和PWM2)0禁止1使能位4-2DBTPS2~DBTPS0。死区定时器的预定标因子。000x/1001x/2010x/4011x/8100x/166.10.3死区定时器控制寄存器

569570101x/32110x/32111x/32x:高速外设时钟HSPCLK位1-0保留。DBTCONB映射地址为7515h,各位的意义和DBTCONA的相应位意义一致。6.10.3死区定时器控制寄存器

570571死区单元的输入信号是PH1、PH2和PH3,分别来自于全比较单元1、2和3的非对称/对称波形发生器。对应于每个死区输入信号PHx(x=1,2,3),产生两个输出信号DTPHx和DTPHx一。死区单元的输出是DTPH1、DTPH1_、DTPH2、DTPH2_、DTPH3、DTPH3_,它们与PH1、PH2、PH3各自对应。6.10.4死区单元输入和输出

571572当死区单元被允许用于比较单元时,即设置死区控制寄存器DBTCONA的位EDBTx为1(x=1,2,3),即死区定时器使能。这两个信号的跳变沿不再相同,而是具有一段时间间隔,该间隔称为“死区”。6.10.4死区单元输入和输出

572573为了确定死区时间,需要设置分频系数(DBTCONA的D4~D2即DBTPS2~DBTPS0)设置死区定时器的周期值(DBTCONA的D11~D8即DBT3~DBT0)。6.10.4死区单元输入和输出

573死区定时器控制寄存器574DBT3~0--死区定时器周期(m=0~15),减计数EDBT3~1--死区定时器使能,分别对应PWM5&6、PWM3&4、PWM2&10-屏蔽,1-使能DBTPS2~0--死区定时器预定标(101~111相同)x/p:如:p=1~32死区时间=(1/HSPCLK)×m×p即p×m个HSPCLK时钟周期

574死区定时器控制器(EVA)DBTCONA@0x007415EDBT3765420EDBT2EDBT1DBTPS2DBTPS1reservedreserved1315141312108DBT3DBT0DBT1DBT2911DBTimerEnable0=disable1=enableDBTimerPrescaler000=1100=16001=2101=32010=4110=32011=8111=32DBTimerPerioddeadtime=DBperiod*DBprescaler*CPUCLKperiodreservedreservedreservedreservedDBTPS0

575▲高速外设时钟预定标器HISPCPReservedD15D3D2D0HSPCLKR-0R/W-001时钟系统若HSPCP不为0,则HSPCLK=SYSCLKOUT/(2×HISPCP2~0)。复位时,默认值001,HSPCLK=SYSCLKOUT/2若HSPCP=0,则HSPCLK=SYSCLKOUT

576577

577578假定HSPCLK的时钟周期为25nsm×p×时钟周期=1×32×25=800ns=0.8us单位为us

5785796.10.5比较单元输出逻辑输出逻辑电路确定了当比较匹配发生时,输出引脚PWMx(x=1~12)上的电平极性和动作。

5795806.10.5比较单元输出逻辑EVA输出逻辑电路结构

580581输出逻辑电路决定了当全比较单元处于PWM模式时,与每一个全比较单元相关的输出信号可规定为低有效、高有效、强制低或强制高;比较单元的输出极性和动作可通过对比较方式控制寄存器ACTRA/ACTRB的编程来配置。6.10.5比较单元输出逻辑

5815826.10.5比较单元输出逻辑当以下任一事件发生时,PWM输出引脚将变为高阻态。(1)软件将比较控制寄存器COMCONA的D9即比较单元输出使能位COMCONA[9]清0。(2)当功率驱动保护中断没有被屏蔽时,硬件将引脚拉为低电平。(3)产生任何复位事件。

5825836.10.5比较单元输出逻辑比较单元输出逻辑的输入包括(1)来自死区单元的DTPH1、DTPH1_、DTPH2、DTPH2_、DTPH3、DTPH3_和比较匹配信号。(2)比较方式控制寄存器ACTRA的控制位。(3)功率驱动保护中断。(4)复位。比较单元输出逻辑的输出是PWMy(对于EVA:y=1~6,对于EVB:y=7~12)。

5835846.10.6比较单元PWM波形发生器为了产生PWM信号,需要一个合适的定时器不断产生与PWM周期相同的计数周期。比较寄存器的值不断地与计数寄存器的值进行比较,当两个值匹配时,相关的输出引脚上就发生电平跳变(从低到高的跳变,或从高到低的跳变)。

584585当发生第二次匹配,或者到达定时器周期的末尾时,相关的输出引脚上就发生另一次电平跳变(从高到低,或从低到高),这样就产生了输出脉冲。对于每一个定时器周期,根据其比较寄存器中不同的值,该过程重复进行,从而在每个相关的输出引脚上产生了PWM信号。6.10.6比较单元PWM波形发生器

585586事件管理器的每个比较单元和通用定时器的比较寄存器都可以产生对称和不对称的PWM波形。6.10.6比较单元PWM波形发生器

5865871.利用比较单元产生PWM信号三个比较单元中的每一个都可以与事件管理器的EVA模块中的通用定时器1或EVB模块中的通用定时器3、死区单元和输出逻辑一起,用于产生一对有可编程死区和输出极性的PWM输出。6.10.6比较单元PWM波形发生器

587588对应于每个EV模块中的三个比较单元,共有六个给定的PWM输出引脚。这六个输出引脚可以用来控制三相交流感应电动机或无刷直流电动机。6.10.6比较单元PWM波形发生器

5885892.产生PWM信号的寄存器设置需要对事件管理器模块中的一些寄存器进行设置。(1)设置和装载比较方式控制寄存器ACTRx(x=A,B);引脚PWM的输出极性的选择(高有效、低有效)。6.10.6比较单元PWM波形发生器

589590(2)如果使用死区,则设置和装载死区定时器控制寄存器DBTCONx(x=A,B);(3)初始化比较寄存器CMPRx(x=1,2,3或4,5,6),区别于定时器比较寄存器TxCMPR;6.10.6比较单元PWM波形发生器

590591(4)设置和装载比较控制寄存器COMCONx;(x=A,B)使能比较单元操作;比较寄存器CMPRx重载条件;比较方式控制寄存器重载条件;比较单元的输出使能。6.10.6比较单元PWM波形发生器

591592(5)设置和装载通用定时器控制寄存器T1CON(EVA)或T3CON(EVB),使能定时器;(6)设置通用定时器周期寄存器T1PR或T3PR值。6.10.6比较单元PWM波形发生器

5925933.非对称PWM波形的产生边沿触发或非对称的PWM信号的特点是调制脉冲并不关于PWM周期对称,如书P230图6-41所示。每个脉冲的宽度仅能从其脉冲的一侧来改变。6.10.6比较单元PWM波形发生器

593594具有比较单元和PWM电路的非对称PWM波形6.10.6比较单元PWM波形发生器

594595

595596用比较单元产生非对称的PWM信号,通用定时器1或3必须设置为连续递增计数模式;周期寄存器必须载入所需的PWM载波周期相对应的值。设置选定的输出引脚为PWM输出。6.10.6比较单元PWM波形发生器

596597如果死区已被使能,则通过软件将所需的死区值写入到死区控制寄存器DBTCONx(x=A,B)中的位11~位8即DBT3~DBT0位,并将它作为4位死区定时器的周期。6.10.6比较单元PWM波形发生器

597598通用定时器1(或定时器3)启动以后,在每个PWM周期,比较寄存器的值可重新写入,以调整PWM输出的脉冲宽度(占空比)来控制功率器件的开关时间。6.10.6比较单元PWM波形发生器

598599比较寄存器是双缓存的,所以新的值可以在一个周期内的任意时刻写入。在周期的任何时候可以将新值写入到周期寄存器(T1PR/T3PR)和比较方式控制寄存器(ACTRA/ACTRB)中,以改变PWM周期或强制改变PWM的输出方式。6.10.6比较单元PWM波形发生器

5996004.对称PWM波形的产生对称PWM信号的特性由PWM周期中心对称的调制脉冲决定。对称的PWM信号与非对称的PWM信号相比,其优点在于它有两个相同长度的无效区(每个PWM周期的开始和结束处)。书P231图6-42表示对称PWM波形的例子。6.10.6比较单元PWM波形发生器

6006016.10.6比较单元PWM波形发生器比较单元产生的对称PWM波形

601602用比较单元产生对称的PWM波形与产生非对称的PWM波形是相似的;差异在于产生对称的PWM波形时,通用定时器1(或通用定时器3)必须工作于连续增/减计数模式。6.10.6比较单元PWM波形发生器

602603在对称PWM波形发生的一个周期内,通常有两次比较匹配,一次在周期匹配前的递增计数期间,另外一次在周期匹配之后的递减计数期间。周期匹配之后,一个新的比较值(周期匹配时重载)可以变为有效,使PWM脉冲的第二个边沿提前或延迟。6.10.6比较单元PWM波形发生器

603604比较寄存器是双缓存的,所以新的值可以在一个周期内的任意时刻写入。在周期的任何时候可以将新值写入到周期寄存器(T1PR/T3PR)以改变PWM周期。将新值写入比较方式控制寄存器(ACTRA/ACTRB)中,强制改变PWM的输出方式。6.10.6比较单元PWM波形发生器

6046051.比较单元(1)每个事件管理器都有3个比较单元、1个比较控制寄存器COMCONx和1个比较方式控制寄存器ACTRx。(x=A,B)(2)每个比较单元都有1个比较寄存器CMPRx(x=1,2,3),注意区别于定时器比较寄存器TxCMPR(x=1,2),以及2个PWM输出引脚。比较单元总结

605606这一套组合可以使事件管理器的全比较单元产生6个带死区的PWM输出,用于控制三相逆变桥。它还可以产生空间矢量PWM波形。比较单元总结

606607比较单元的操作功能与定时器比较寄存器的操作功能相似。(3)当定时器的计数寄存器的计数值与比较单元的比较寄存器的比较值相等时,就会在该比较单元的两个PWM引脚上产生跳变(两个引脚上的跳变与比较方式控制寄存器ACTRx的设置有关),并经过1个时钟周期后发出比较中断申请。比较单元总结

607608(4)比较单元受比较控制寄存器和比较方式控制寄存器控制。通过这些寄存器可以设置比较输出是否允许、比较寄存器和比较方式控制寄存器的重载条件、空间矢量PWM的使用、PWM引脚输出方式。比较单元总结

6086092.死区单元(1)死区是用来防止同一桥臂的上、下两个开关管直通。在桥式驱动电路中,同一桥臂的上、下两个开关管工作在互为反相状态,即在一个开关管处于“开”状态时,另一个开关管处于“关”状态;(2)由于开关管的“开”和“关”时刻所用的时间不同,就有可能使两个开关管都处于开的状态,这会造成短路事故。比较单元总结

609610在两个开关管开关交替时刻,插入一段全部关的时间,即死区,确保一个开关管彻底关闭后,另一个再打开。比较单元总结

6106113.事件管理器的PWM发生器的特征每个事件管理器(EVA和EVB)的PWM波形发生器的特征可概括如下:(1)8路PWM波形输出,其中6个由比较单元产生,另外2个由通用定时器产生。(2)与比较单元相对应的PWM输出带有可编程死区。比较单元总结

611612(3)PWM载波频率的快速改变。(具有双缓冲的周期寄存器)(4)PWM脉宽的快速改变。(具有双缓冲的比较寄存器)(5)可产生可编程的非对称、对称PWM波形。比较单元总结

6126134.利用比较单元产生PWM波形利用比较单元产生PWM波形与利用定时器比较寄存器产生PWM波形的方法几乎相同。只不过前者使用比较单元和死区单元,而后者使用定时器比较寄存器且没有死区功能。比较单元总结

613614以EVA为例,利用比较单元产生PWM波时,要使用:定时器1计数寄存器T1CNT、定时器1控制寄存器T1CON、定时器1周期寄存器T1PR、比较寄存器CMPRx、比较控制寄存器COMCONA、比较方式控制寄存器ACTRA、死区控制寄存器DBTCONA。对这些寄存器正确的初始化就可以产生对称和非对称PWM波形。比较单元总结

614615(1)非对称PWM波的产生将定时器1设置为连续递增计数模式时,产生非对称PWM波形,如图6-43所示。由于加入了死区,PWM高电平脉冲的宽度减少了一个死区时间,但周期没有变化;因此,高有效PWM波形的占空比α应为:比较单元总结

615616比较单元产生的非对称PWM波形

616617改变比较值可以改变PWM波的占空比;改变周期值可以改变PWM波的频率。比较单元总结

617618对EVA,上桥臂波形可以是PWM1、PWM3、PWM5引脚输出波形;下桥臂波形可以是PWM2、PWM4、PWM6引脚输出波形。死区的增加会影响占空比,因此在计算占空比时要考虑死区的影响。比较单元总结

618619(2)对称PWM波的产生将定时器的计数方式改为连续增/减计数模式就会得到对称的PWM波形,如图6-42所示。比较单元总结高有效PWM波形的占空比α计算公式为:

619620

620621例6.8F2812DSP的CPU系统时钟频率为150MHz,高速外设时钟为25MHz,利用通用定时器T1的比较器产生一路PWM信号T1PWM_T1CMP,同时用全比较单元产生3对(6路)PWM信号PWM1~PWM6,通用定时器1作为全比较单元的时钟基准。T1PWM_T1CMP输出一路不带死区控制的PWM输出。而PWM1~PWM6输出带死区,且两两成对,呈互补关系。#include"DSP281x_Device.h"voidEVA_PWM(){EvaRegs.ACTRA.all=0x0666;//空间矢量不动作EvaRegs.DBTCONA.all=0x08EC;//死区定时器启动,死区定时器周期为8,死区定时器8分频EvaRegs.CMPR1=0x0006;EvaRegs.CMPR2=0x0005;EvaRegs.CMPR3=0x0004;EvaRegs.COMCONA.all=0xA6E0;//空间矢量禁止,全比较单元使能,使能全比较单元输出}

621622voidEVA_Timer1(){EvaRegs.GPTCONA.all=0x0052;//通用定时器1比较输出高有效EvaRegs.T1PR=0x0013;//定时周期为5.12us*(T1PR+1)//128/25=5.12usEvaRegs.T1CMPR=0x0003;//通用定时器1的比较寄存器EvaRegs.T1CNT=0x0000;//通用定时器1计数寄存器初值EvaRegs.T1CON.all=0x1742;//连续递增计数模式,128分频,使能定时器1比较操作,使能定时器1}voidIOinit(){EALLOW;GpioMuxRegs.GPAMUX.all=0x007f;//将GPIOA6~GPIOA0配置为外设功能EDIS;}

622623voidmain(void){InitSysCtrl();//系统控制初始化,系统时钟150MHz//SysCtrlRegs.HISPCP.all=0x0003;//高速外设时钟=25MHz//150/(2×3)=25MHzDINT;//禁止全局中断IER=0x0000;//禁止CPU中断IFR=0x0000;//清除CPU中断标志IOinit();EVA_PWM();EVA_Timer1();for(;;){;}}

623voidInitEv(void){//设置GPIOEALLOW;GpioMuxRegs.GPAMUX.all=0x00ff;EDIS;//初始化定时器控制寄存器(EVA)EvaRegs.GPTCONA.all=0;//设置定时器1//设置定时器1的周期寄存器和比较寄存器值;EvaRegs.T1PR=0x0fff;//周期寄存器值EvaRegs.T1CMPR=0x03C0;//比较寄存器值EvaRegs.EVAIMRA.bit.T1PINT=1;EvaRegs.EVAIFRA.bit.T1PINT=1;EvaRegs.T1CNT=0x0000;//清除定时器1计数寄存器EvaRegs.T1CON.all=0x1042;//设置定时器1控制寄存器//连续递增计数模式,使能定时器,使能定时器比较操作624例6.9

624625//设置定时器2//设置定时器2的周期寄存器和比较寄存器值;EvaRegs.T2PR=0x0fff;//周期寄存器值EvaRegs.T2CMPR=0x03C0;//比较寄存器值//清除定时器2计数寄存器EvaRegs.T2CNT=0x0000;//设置定时器2控制寄存器EvaRegs.T2CON.all=0x1042;//设置T1PWM和T2PWM//比较逻辑驱动T1/T2PWMEvaRegs.GPTCONA.bit.TCMPOE=1;//定时器1比较输出极性设置为低电平有效EvaRegs.GPTCONA.bit.T1PIN=1;//定时器2比较输出极性设置为高电平有效EvaRegs.GPTCONA.bit.T2PIN=2;

625626EvaRegs.CMPR1=0x00C0;EvaRegs.CMPR2=0x03C0;EvaRegs.CMPR3=0x0fC0;//比较方式控制//输出引脚PWM1高有效,输出引脚PWM2低有效//输出引脚PWM3高有效,输出引脚PWM4低有效//输出引脚PWM5高有效,输出引脚PWM6低有效EvaRegs.ACTRA.all=0x0666;EvaRegs.DBTCONA.all=0x0AF8;EvaRegs.COMCONA.all=0xA600;}

626627end

627628第6章事件管理器及其应用6.1事件管理器功能概述6.2通用定时器6.8比较单元6.11捕获单元6.14正交编码脉冲电路6.15事件管理器中断光电编码器霍尔传感器功率放大器电流传感器

628629捕获单元是一种输入设备,用于捕获引脚上电平的变化并记录它发生的时刻。普通的微处理器能做到这一点,但需要由CPU完成判断和记录工作,占用了CPU的资源。6.11捕获单元结构

629630对于两次间隔很短的跳变(微秒级)的捕获,普通的微处理器就显得力不从心。DSP控制器的捕获单元不需要占用CPU的资源,与CPU并行工作。它有二级深度FIFO堆栈对于两次间隔很短跳变的捕获得心应手。6.11捕获单元结构

630631事件管理器总共有6个捕获单元,每个事件管理器有3个捕获单元。事件管理器A(EVA模块)的捕获单元为CAP1、CAP2和CAP3,事件管理器B(EVB模块)的捕获单元为CAP4、CAP5和CAP6,每一个捕获单元都有一个相应的捕获输入引脚。捕获单元的结构示意图如书P204所示。6.11捕获单元结构

6316326.11捕获单元结构当捕获引脚输入脉冲波形时,捕获单元能够捕获指定的电平变化。例如捕获脉冲的上升沿。当捕获到脉冲指定的电平变化时,捕获单元记录此时定时器的时间。假设捕获到第1个脉冲时定时器的时间为t1,捕获到第2个脉冲时定时器的时间为t2,那么这个脉冲的宽度是t2-t1。捕获单元可以用于测量脉冲的宽度。

632捕获单元功能模块(EVA)PWM电路PWM电路PWM电路输出逻辑输出逻辑输出逻辑通用定时器1比较器通用定时器1通用定时器2比较器通用定时器2全比较单元1全比较单元2全比较单元3捕获单元MUXQEP电路OutputLogic输出逻辑EV控制寄存器/逻辑ResetPIETCLKINA/TDIRA/2ADC启动DataBus•CLKDIR••T1PWM_T1CMPT2PWM_T2CMPPWM1PWM2PWM3PWM4PWM5PWM6CAP1_QEP1CAP2_QEP2CAP3_QEPI1•

633634

634捕获单元框图6350-选择定时器21-选择定时器100-禁止CAP1&201-使能CAP1&20-禁止CAP31-使能CAP3D12D14:13D10-CAP3D9-CAP1&200-不检测01-检测上升沿10-检测下降沿11-检测两个边沿0-寄存器清零1-无操作D8D7:6-CAP1D5:4-CAP2D3:2-CAP3CaptureControlRegister-CAPCONAD150-无操作1-CAP3中断置位时启动ADCT2CNTT1CNT

635636

636637捕获单元包含:(1)一个16位的捕获控制寄存器(CAPCONA对EVA模块,CAPCONB对EVB模块)(2)一个16位捕获FIFO状态寄存器CAPFIFOA/B。6.11捕获单元结构

637638(3)可选择通用定时器1/2(对EVA模块)或者定时器3/4(对EVB模块)作为时间基准。注意:CAP1和CAP2一定要选择相同的定时器作为它们的时基;CAP3可独立使用一个时基(对EVA模块);6.11捕获单元结构

638639CAP4和CAP5一定要选择相同的定时器作为它们的时基。CAP6可选择独立的时基。(对EVB模块)。6.11捕获单元结构

639640(4)3个16位2级FIFO堆栈(CAPxFIFO),每个对应一个捕获单元。(x=1~3或=4~6)(5)3个施密特触发式的捕获输入引脚(对于EVA模块,CAP1/2/3;对于EVB模块,CAP4/5/6),6.11捕获单元结构

640641引脚CAP1、CAP2和CAP4、CAP5是功能复用的,也是正交编码脉冲电路(QEP)的输入引脚。所有的输入和内部时钟同步,为了使跳变被捕获,输入必须在当前电平保持当前状态两个时钟周期。6.11捕获单元结构

641642(6)用户可指定所检测的电平跳变信号(上升沿检测、下降沿检测或两者都检测)。(7)3个可屏蔽的中断标志位。每个标志位对应于一个捕获单元。(EVA和EVB共6个)6.11捕获单元结构

642643捕获单元使能后,捕获单元不停地检测捕获输入引脚的跳变。当检测到一个设定的转换时,通用定时器计数寄存器的值被捕获并存储在相应的2级深度FIFO堆栈中。6.11捕获单元结构

6436446.12.1捕获控制寄存器捕获单元的操作由四个16位用户可读写控制寄存器即捕获控制寄存器CAPCONA/B和捕获FIFO状态寄存器CAPFIFOA/B控制。因为捕获电路的时间基准是由通用定时器1/2或3/4提供的,所以定时器是捕获单元的基础。

6446451.捕获控制寄存器CAPCONx(x=A,B)(1)捕获控制寄存器A(CAPCONA)——地址:7420hCAPCONA各位的定义如下:6.12.1捕获控制寄存器

6456466.12.1捕获控制寄存器

646647位15CAPRES。捕获单元复位,只能写,读为0。向位15写0将清除所有的捕获和QEP寄存器。但是,使能捕获功能时不需要向位15写1。0所有捕获单元和正交编码脉冲电路的寄存器清01无动作位14-13CAP12EN。捕获单元1和2的控制位。00禁止捕获单元1和2,FIF0堆栈保持原内容01使能捕获单元1和210保留11保留6.12.1捕获控制寄存器

647648位12CAP3EN。捕获单元3使能位。0禁止捕获单元3,其FlFO堆栈保持原内容1使能捕获单元3位11保留位。位10CAP3TSEL。捕获单元3的通用定时器选择位。0选择通用定时器21选择通用定时器1位9CAP2TSEL。捕获单元1和2的通用定时器选择位。0选择通用定时器21选择通用定时器1位8CAP3TOADC。捕获单元3事件启动ADC转换位:

6486490无操作1当CAP3INT标志位被置位时,启动ADC位7-6CAP1EDGE。捕获单元1的边沿检测控制位。00无检测01检测上升沿I0检测下降沿11上升沿、下降沿均检测位5-4CAP2EDGE。捕获单元2的边沿检测控制位。00无检测01检测上升沿10检测下降沿

64965011上升沿、下降沿均检测位3-2CAP3EDGE。捕获单元3的边沿检测控制位。00无检测01检测上升沿10检测下降沿11上升沿、下降沿均检测位1-0保留位(2)捕获控制寄存器B(CAPCONB),映射地址:7520h。CAPCONB与CAPCONA各位的意义相同。

650651

651652捕获FIFO状态寄存器CAPFIFOx中包括捕获单元的3个FIFO堆栈的状态位。1.捕获FIFO状态寄存器A(CAPFIFOA)——地址7422h,CaptureFIFOStatusRegisterA(CAPFIFOA)各位的定义如图6-49所示。6.12.2捕获状态寄存器

652653位15-14保留位。位13-12CAP3FlFO。捕获单元3的FlFO状态位00空01有一个输入10有两个输入11有两个输入并又捕获到一个,第一个输入已丢失。位11-10CAP2FlFO。捕获单元2的FlFO状态位00空01有一个输入

65365410有两个输入11有两个输入并又捕获到一个,第一个输入已丢失。位9-8CAP1FlFO。捕获单元1的FlFO状态位00空01有一个输入10有两个输入11有两个输入并又捕获到一个,第一个输入已丢失。位7-0保留位6.12.2捕获状态寄存器

6546552.捕获FIFO状态寄存器B(CAPFIFOB)——地址7522h。CaptureFIFOStatusRegisterB(CAPFIFOB)各位的定义如图6-50所示。6.12.2捕获状态寄存器

6556566.12.3捕获单元FIFO堆栈FIFO是英文FirstInFirstOut的缩写,是一种先进先出的数据缓存器,与普通存储器的区别是没有外部读写地址线,特点是顺序写入数据,顺序读出数据。数据地址由内部读写指针自动加1完成。不像普通存储器那样由地址线决定读取或写入某个指定的地址。当捕获单元捕获到输入引脚指定的电平变化时,就会将定时器计数器的值保存到FIFO堆栈中。

6566576.12.3捕获单元FIFO堆栈FIFO的宽度是FIFO一次读写操作的数据位。FIFO的深度是FIFO可以存储多少个N位的数据(如果宽度为N)。例如一个8位的FIFO,若深度为8,它可以存储8个8位的数据。在没有使用FIFO堆栈时,如果有数据需要CPU处理,有一个数据CPU就要读取一次。如果有8个数据,CPU就要读取8次。当使用8级深度的FIFO堆栈时,有一个数据就将数据放入堆栈中。新的数据到来时,之前的数据都往栈顶移动一个位置。新的数据始终放在栈底。当堆栈放满8个数据时,再通知CPU来读取。

6576586.12.3捕获单元FIFO堆栈F2812的事件管理器EVA和EVB的每个捕获单元都有一个2级深度FIFO堆栈。如图6-51所示。EVA的捕获单元1的顶层堆栈由CAP1FIFO组成,底层堆栈由CAP1FBOT组成。捕获单元2的顶层堆栈由CAP2FIFO组成,底层堆栈由CAP2FBOT组成。捕获单元3的顶层堆栈由CAP3FIFO组成,底层堆栈由CAP3FBOT组成。

6586596.12.3捕获单元FIFO堆栈EVB的捕获单元4的顶层堆栈由CAP4FIFO组成,底层堆栈由CAP4FBOT组成。EVB的捕获单元5的顶层堆栈由CAP5FIFO组成,底层堆栈由CAP5FBOT组成。EVB的捕获单元6的顶层堆栈由CAP6FIFO组成,底层堆栈由CAP6FBOT组成。

6596606.12.3捕获单元FIFO堆栈每个捕获单元有一个2级深度FIFO堆栈。如图所示。顶部寄存器(存旧值)CAPxFIFO底部寄存器(存新值)CAPxFBOT2级深度FIFO堆栈示意图出进

6606616.13.1捕获单元操作当捕获输入引脚发生跳变时,捕获单元将该时刻时基的通用定时器计数寄存器TxCNT(x=1,2,3,4)的值装入相应的FIFO堆栈中,可以装入两个值。第三个值装入时,会将第一个值挤出堆栈。FIFO堆栈的状态可以从捕获FIFO状态寄存器CAPFIFOA/B中得知。

661662捕获单元的FIFO堆栈是2级深度FIFO先进先出的堆栈,顶层堆栈包括CAP1FIFO、CAP2FIFO和CAP3FIFO(对于EVA模块),CAP4FIFO、CAP5FIFO和CAP6FIFO(对于EVB模块);底层堆栈包括CAP1FBOT、CAP2FBOT和CAP3FBOT(对于EVA模块),CAP4FBOT、CAP5FBOT和CAP6FBOT(对于EVB模块)。6.13.1捕获单元操作

662663FIFO栈的顶层寄存器是只读寄存器,它总是存放相应捕获单元捕获到的旧计数值。对捕获单元FIFO栈的读访问总是读取栈中旧的计数值。当FIFO栈的顶层寄存器中的旧计数值被读取时,栈底层寄存器中的新计数值(如果有)将被压入顶层寄存器中。6.13.1捕获单元操作

663664(1)第一次捕获:此时堆栈应该为空。当捕获单元的输入引脚出现指定的跳变时,选定的通用定时器计数寄存器的值就会被捕获。捕获单元将捕获到的计数寄存器的值写入空栈的顶层寄存器CAPxFIFO中。对EVA模块:x=1,2,3;对EVB模块:x=4,5,6。6.13.1捕获单元操作

664665与此同时,FIFO状态寄存器CAPFIFOA/B相应的状态位CAPxFIFO被置成(01),表明已有一个值压入栈。如果在下一次捕获前对FIFO堆栈顶层寄存器进行了读访问,则状态位CAPxFIFO被复位为(00),FIFO堆栈又成为空栈。6.13.1捕获单元操作

665666(2)第二次捕获:如果在FIFO堆栈顶层寄存器被读取之前产生了第二次捕获,即在CAPxFIFO中还有数据时发生第二次捕获,则新捕获的计数寄存器的值送至栈底层寄存器CAPxFBOT。(对EVA:x=1,2,3;对EVB:x=4,5,6)。与此同时,相应的状态位CAPxFIFO被置成(10),表明现在堆栈中有2个数据。6.13.1捕获单元操作

666667若在再一次捕获发生前,对FIFO堆栈顶层寄存器CAPxFIFO进行读访问,则顶层寄存器中的旧值被读出,底层寄存器中的新值被压入顶层寄存器,并且相应的状态位CAPxFIFO将被置成(01),又变成只有一个值压入栈。若此时再发生捕获,FIFO堆栈不会溢出。6.13.1捕获单元操作

667668第二次捕获会将寄存器相应的捕获中断标志位置1。如果中断没有被屏蔽,则会产生一个中断请求。6.13.1捕获单元操作

668669(3)第三次捕获:如果发生了二次捕获已经存储了2个数据而又未进行顶层寄存器CAPxFIFO的读访问,此时若再发生一次捕获,则位于堆栈顶层寄存器中的旧值将被挤出丢弃,而堆栈底层寄存器中的值将被压入顶层寄存器中。新捕获的通用定时器时基计数寄存器的值将被保存到底层寄存器中,并且状态位CAPxFIFO被置成(11),以表明已经丢弃了一个或多个捕获计数器值。6.13.1捕获单元操作

669670第三次捕获会将寄存器相应的捕获中断标志位置1。如果中断没有被屏蔽,则会产生一个中断请求。6.13.1捕获单元操作如果在第三次捕获之前已经读取了第1次捕获的旧值,那么底层寄存器的值被送入顶层寄存器,新的值被写入底层寄存器,状态位为10。与第二次捕获的情况相同。之后的捕获是不断重复上述过程。

670671当捕获单元捕获到输入引脚的跳变时,除了将时基计数寄存器TxCNT的值装入相应的FIFO堆栈外,还将产生捕获中断事件。对于EVA模块,在EVA中断标志寄存器C(EVAIFRC)中的CAPxINTFLAG(x=1,2,3)上置1。对于EVB模块,在EVB中断标志寄存器C(EVBIFRC)中的CAPxINTFLAG(x=4,5,6)上置1。6.13.1捕获单元操作

671672若是捕获单元3或捕获单元6产生了捕获事件,还可以启动A/D转换。6.13.1捕获单元操作

672673每当将捕获到的新计数值存入到FIFO堆栈时,CAPxFIFO的相应状态位将被调整以反映FIFO堆栈的新状态。从捕获单元输入引脚处发生变化到所选通用定时器的计数值被锁存之间的延时需要两个时钟周期。所有捕获单元寄存器在复位时被清0。6.13.1捕获单元操作

6736741.捕获单元的时基选择对于EVA,捕获单元3有不同于捕获单元1和2的时基选择位。这允许在同一时刻,一个通用定时器给捕获单元1和2用,另一个通用定时器给捕获单元3用。对于EVB,捕获单元6有自己的时基选择位。捕获操作不会影响任何通用定时器的操作以及与通用定时器相关的比较操作产生PWM输出。6.13.1捕获单元操作

6746752.捕获单元的设置为使捕获单元能正常工作,应完成以下寄存器配置:(1)初始化捕获状态寄存器CAPFIFOA/B,并将相应的状态位清0;(2)设置通用定时器的控制寄存器TxCON,确定计数模式和分频系数,使能定时器。6.13.1捕获单元操作

675676(3)设置相应的捕获控制寄存器CAPCONx(x=A,B),确定上升沿、下降沿还是两个边沿都检测。选择通用定时器以及使能捕获单元。(4)如有必要,设置相关的通用定时器比较寄存器或者通用定时器周期寄存器。6.13.1捕获单元操作

6766776.13.2捕获中断与捕获单元相关的中断只有捕获中断。事件管理器的每一个捕获单元都对应于一个捕获中断。EVA的捕获单元1有捕获中断CAP1INT,捕获单元2有捕获中断CAP2INT,捕获单元3有捕获中断CAP3INT。EVB的捕获单元4有捕获中断CAP4INT。捕获单元5有捕获中断CAP5INT。捕获单元6有捕获中断CAP6INT。

6776786.13.2捕获中断当一个捕获单元执行了一次捕获,且捕获单元FIFO中至少有一个捕获到的计数值时(CAPxFIFO状态位不为0),则相应的中断标志位置1。如果该中断没有被屏蔽,则会产生一个外设中断请求信号。

678679如下述指令如果写01到CAPxFIFO中,则事件管理器认为捕获单元FIFO堆栈中已经有一个捕获事件,随后每当捕获单元FIFO堆栈中获得一个新的捕获值时,均会产生一个捕获中断。EvaRegs.CAPFIFO.bit.CAP1FIFO=1;EvaRegs.CAPFIFO.bit.CAP2FIFO=1;EvaRegs.CAPFIFO.bit.CAP3FIFO=1;如果使能了对应的捕获中断,则会产生一个外设中断请求信号。如果使用了捕获中断,则可在中断服务程序中读取捕获到的计数值。6.13.2捕获中断

679680如果没有使用中断,也可以通过查询中断标志位和FIFO堆栈的状态位来确定是否发生捕获事件。如果已发生捕获事件则可以从相应的捕获单元的FIFO堆栈中读取捕获到的计数值。6.13.2捕获中断

6806811.捕获单元可用于测量捕获引脚上输入信号的两个相邻跳变间的时间间隔,因此可以测量输入信号的频率或周期。捕获单元总结

6816822.每个事件管理器都有三个捕获单元,每个捕获单元都有相应的引脚CAPx。(对于EVA,x=1,2,3;对于EVB,x=4,5,6)每个捕获单元可以选择定时器作为计数时钟。例如对事件管理器A的捕获单元,CAP1、CAP2、CAP3可以选择通用定时器1或2作为计数时钟,但CAP1、CAP2必须使用相同的计数时钟。捕获单元总结

6826833.捕获单元有两种寄存器一个是捕获控制寄存器(CAPCONA/B),另一个是捕获FIFO状态寄存器(CAPFIFOA/B)。捕获单元总结

6836844.每个捕获单元都有一个2级先入先出(FIFO)堆栈,分为顶层堆栈(CAPxFIFO)和底层堆栈(CAPxFBOT)。5.当输入引脚上的信号发生指定跳变时,捕获单元自动地将定时器计数寄存器值(TxCNT)保存到捕获单元FIFO堆栈中。(对于EVA,x=1,2;对于EVB,x=3,4)捕获单元总结

684685顶层堆栈保存旧的计数值,底层堆栈保存新的计数值。当对堆栈进行读操作时,总是读取顶层堆栈的旧值,而同时底层堆栈值自动地压入顶层堆栈。所以读操作可以清空堆栈。捕获单元总结

685686例6.10用捕获单元的CAP2对脉冲的上升沿进行捕获,计算引脚CAP2波形的周期T。6.13.3捕获单元应用举例引脚CAP2波形

686687#include"DSP281x_Device.h"unsignedinttemp;voidCAP2init(){//EvaRegs.GPTCONA.all=0x0000;EvaRegs.CAP2FBOT=0x0000;EvaRegs.CAP2FIFO=0x0000;EvaRegs.CAPFIFO.all=0x0000;EvaRegs.T1PR=0xffff;EvaRegs.T1CNT=0x0000;EvaRegs.CAPCON.all=0x2210;//使能捕获单元1和2,捕获单元2检测上升沿,选择定时器1为时基EvaRegs.T1CON.all=0x174c;//通用定时器1为连续递增,128分频,使能定时器,禁止定时器比较操作}6.13.3捕获单元应用举例

687688voidIOinit(){EALLOW;GpioMuxRegs.GPAMUX.bit.CAP2Q2_GPIOA9=1;//使能CAP2引脚,选择外设功能EDIS;}6.13.3捕获单元应用举例

688689main(void){InitSysCtrl();//系统控制初始化DINT;//禁止全局中断IER=0x0000;IFR=0x0000;IOinit();CAP2init();EvaRegs.T1CNT=0x0000;EvaRegs.CAPCON.bit.CAP12EN=1;//捕获单元1和2使能while(1){if((EvaRegs.CAPFIFO.bit.CAP2FIFO)==2)temp=EvaRegs.CAP2FBOT-EvaRegs.CAP2FIFO;//得到两个上升沿之间定时器1计数器的计数值,可以求得引脚CAP2波形的周期T。}}6.13.3捕获单元应用举例

689690设高速外设时钟HSPCLK=75MHz,通用定时器1计数时钟为128/75=1.7us。则temp×1.7us=周期T。6.13.3捕获单元应用举例

6902022/6/10691

691692缝隙光传感器光源(LED)旋转轴传感器A传感器BTT/4光电编码器是一种通过光电转换将输出轴上的角位移量转换成脉冲或数字量的传感器,是目前应用较多的传感器。一般的光电编码器主要由光栅盘和光电检测装置组成。光栅盘是在一定直径的圆盘上等分地开通若干个长方形孔。在伺服系统中,由于光电码盘与电动机同轴,电动机旋转时,光栅盘与电动机同轴旋转,经发光二极管等电子元件组成的检测装置检测输出若干脉冲信号,其原理如图6-53所示。传感器A传感器B光电码盘6.14正交编码脉冲电路(QEP)

692693缝隙光传感器光源(LED)旋转轴传感器A传感器BTT/4在电机的转子上安装一个光电编码器。光电编码器主要有光栅盘和光电检测装置组成。光栅盘是在一定直径的圆盘上等分地开通若干个长方形孔。当电动机旋转时,光栅盘与电动机同轴旋转,当LED光被遮挡时,传感器A就输出逻辑0,即低电平;当LED光透过光栅的孔被传感器接收时,传感器A就输出逻辑1,即高电平。传感器A传感器B光电码盘6.14正交编码脉冲电路(QEP)

693694缝隙光传感器光源(LED)旋转轴传感器A传感器BTT/4光电编码器的光电检测部分就能够输出连续的脉冲信号,通过计算传感器A每秒输出的脉冲数就知道当前电机的转速。传感器A传感器B光电码盘6.14正交编码脉冲电路(QEP)

6946956.14正交编码脉冲电路(QEP)正交编码脉冲(QEP:QuadratureEncoderPulse)是两个频率相同且正交(相位差90度即1/4个周期)的脉冲。在许多运动控制系统中,需要正反两个方向的运动,为了对位置、速度进行控制,必须检测出当前运动的方向、位置、速度等。EVA、EVB各有一个QEP电路。内部有4倍频电路。

6956966.14.1增量式光电编码盘的结构与工作原理不像绝对式光电编码盘那样测量转动体的绝对位置,是专门测量转动角位移的累计量。6.14正交编码脉冲电路(QEP)光电编码器

696697十字滑块联轴器连接电机与编码器6.14正交编码脉冲电路(QEP)

697698光电编码器6.14正交编码脉冲电路(QEP)

6986996.14.1增量式光电编码盘的结构与工作原理增量式编码器轴旋转时,有相应脉冲输出,需要判向电路和计数器来判别旋转方向和脉冲数量,具体原理如下图所示。在一个码盘上开出三条码道,由内向外分别为A、B、C,如图中(a)所示。6.14正交编码脉冲电路(QEP)

6997006.14正交编码脉冲电路(QEP)增量式光电编码器原理图

700701

701702增量式光电编码盘的结构与工作原理在A、B码道的码盘上,等距离地开有透光缝隙,两条码道上相邻的缝隙互相错开半个缝宽,其展开图如图中(b)所示。第三条码道C开出一个缝隙,用来表示码盘的零位。在码盘的两侧分别安装光源和光敏元件,当码盘转动时,光源经过透光和不透光区域,相应地每条码道将有一系列脉冲从光敏元件输出。

702703码道上有多少缝隙,就会有多少个脉冲输出。输出的脉冲信号如图中(c)所示。这样通过两组脉冲的相位(上升沿的前后顺序)可以判断出运动的方向,通过记录脉冲的个数可以确定具体的位置,通过记录确定周期的脉冲个数可以计算出运动的速度。增量式光电编码盘的结构与工作原理

703704DSP控制器内置正交编码脉冲电路,可自动识别由外部引脚上输入的正交编码脉冲的方向,记录脉冲的个数。为运动控制、伺服控制的实现提供了方便。书P215图6-57是正交编码脉冲电路结构图。6.14正交编码脉冲电路(QEP)

704705

705706

7067076.14.2DSP中正交编码脉冲电路实现1.正交编码脉冲电路引脚正交编码脉冲电路的输入引脚CAP1_QEP1和CAP2_QEP2(对于EVA模块)或CAP4_QEP3和CAP5_QEP4(对于EVB模块)与捕获单元1,2和捕获单元4,5的输入引脚复用。

7077086.14.2DSP中正交编码脉冲电路实现正交编码脉冲电路引脚对于EVA由捕获控制寄存器CAPCONA/B的D14~D13即捕获单元1和2的使能位CAP12PN位设置。对于EVB由捕获控制寄存器CAPCONB的D14~D13即捕获单元4和5的使能位CAP45EN位设置。可以使能QEP电路,禁止捕获单元。这样就把相应的输入引脚分配给正交编码器脉冲QEP电路。

708709正交编码脉冲电路中的检测逻辑模块将自动分辨出正交编码脉冲的方向;两个正交编码输入脉冲的两个边沿均被QEP电路计数,因此由QEP电路产生的时钟频率是每个输入序列的4倍。将这个时钟送至通用定时器2或通用定时器4的输入时钟。6.14.2DSP中正交编码脉冲电路实现

7097102.正交编码脉冲电路时间基准通用定时器必须设置成定向增/减计数模式。对于EVA设置通用定时器控制寄存器T2COM的D5~D4为11,对于EVB设置通用定时器控制寄存器T4COM的D5~D4为11。选择时钟由QEP电路产生。6.14.2DSP中正交编码脉冲电路实现

7107113.正交编码脉冲电路的计数通用定时器2或4总是从计数寄存器中的当前值开始计数;可以在使能QEP工作模式前将所需的值装载到所选通用定时器的计数寄存器中。6.14.2DSP中正交编码脉冲电路实现

7117123.正交编码脉冲电路的计数当正交编码脉冲电路的时钟作为通用定时器的时钟源时,选定的通用定时器将忽略定时器方向输入引脚TDIRA/B和定时器时钟输入引脚TCLKINA/B。时钟信号和计数方向的信号均来自于QEP解码逻辑电路。QEP解码逻辑电路可以通过输入的正交编码脉冲产生定时器计数的时钟脉冲和计数方向。6.14.2DSP中正交编码脉冲电路实现

7127131.正交编码脉冲包括两个脉冲序列,是频率变化相差四分之一周期,即90的脉冲序列。当电动机轴上的光电编码器产生正交编码脉冲时,通过检测两个序列中哪个序列领先,就可测出电动机的转向。角位置和速度可以通过脉冲计数和脉冲的频率测出。6.14.3正交编码脉冲解码

7137146.14.3正交编码脉冲解码正交编码脉冲和解码的定时器时钟与计数方向

7147156.14.3正交编码脉冲解码正交编码脉冲是两个频率可变,相位相差90°的脉冲序列。QEP电路工作时,引脚CAP1_QEP1和引脚CAP2_QEP2输入两路正交编码脉冲。QEP电路对这两路正交编码脉冲的上升沿和下降沿都进行计数如图6-59的QEPCLK信号所示。当检测到引脚CAP1_QEP1和引脚CAP2_QEP2的上升沿或下降沿时,都会产生一个时钟脉冲,这个时钟脉冲将提供给定时器2进行计数。

7157166.14.3正交编码脉冲解码QEP解码逻辑电路为定时器2提供的时钟频率是每个输入脉冲序列的4倍。该时钟连接到定时器2的时钟输入端。由于QEP电路对输入脉冲的上升沿和下降沿均进行计数,因此QEP电路对输入脉冲进行了4倍频。

7167176.14.3正交编码脉冲解码2.将正交光电码盘的两路脉冲信号接至输入引脚CAP1_QEP1和CAP2_QEP2(对于EVA模块)或CAP4_QEP3和CAP5_QEP4(对于EVB模块)上。正交编码脉冲电路的方向检测逻辑通过确定哪个引脚的脉冲序列领先,可以产生方向信号DIR作为通用定时器2或定时器4的计数方向输入。

7177186.14.3正交编码脉冲解码如果引脚CAP1_QEP1输入的脉冲序列在相位上比引脚CAP2_QEP2输入的脉冲序列超前90度,QEP电路输出的DIR信号为高电平,定时器2进行增计数。如果引脚CAP2_QEP2输入的脉冲序列在相位上比引脚CAP1_QEP1输入的脉冲序列超前90度,此时QEP电路输出的DIR信号为低电平,定时器2进行减计数。

7187196.14.3正交编码脉冲解码如果CAP1_QEP1输入是先导序列(EVA模块),通用定时器2进行增计数。如果CAP2_QEP2输入是先导序列(EVA模块),通用定时器2进行减计数。如果CAP4_QEP3输入是先导序列(EVB模块),通用定时器2进行增计数。如果CAP5_QEP4输入是先导序列(EVB模块),通用定时器2进行减计数。

7197206.14.3正交编码脉冲解码3.全局通用定时器控制寄存器GPTCONA/B的TxSTAT(x=2,4)位反映了定时器2/定时器4的计数方向。定时器2/定时器4是递增还是递减可以判断光电编码器是正转还是反转。通用定时器计数寄存器TxCNT(x=2,4)的值反映了光电编码器对应的位置与速度。

7207216.14.3正交编码脉冲解码4.当选择QEP电路为时钟源时,通用定时器忽略计数方向引脚TDIRA/B和外部时钟引脚TCLKINA/B的信号。

7217226.14.4正交编码脉冲电路寄存器设置EVA/EVB中启动正交编码脉冲电路需作以下设置。1.如果需要,为通用定时器2/定时器4的计数寄存器、周期寄存器和比较寄存器载入设定值。2.配置T2CON/T4CON寄存器,将通用定时器2/定时器4设置成定向增/减计数模式,并以正交编码脉冲电路作为时钟源并使能选用的通用定时器2/4。

7227236.14.4正交编码脉冲电路寄存器设置3.设置捕获控制寄存器CAPCONA/B以使能QEP电路。用正交编码器脉冲(QEP)电路的时钟作为定时器2/定时器4的时钟。4.通用定时器的周期、下溢、上溢和比较中断标志是根据相应的匹配产生的。如果中断没有被屏蔽,则将产生外设中断请求信号。

7237246.14.5正交信号决定光电编码器旋转方向如果A相脉冲比B相脉冲超前,通用定时器增计数,则光电编码器正转。如果B相脉冲比A相脉冲超前,通用定时器减计数,则光电编码器反转。通过两组脉冲的相位即上升沿的前后顺序可以判断出电动机运动的方向。

724如何通过正交信号来决定位置?Ch.ACh.B(00)(11)(10)(01)(A,B)=00011110QEP解码状态机增计数减计数Positionresolutionis/4degrees.

7257266.14.4光电编码器与正交编码脉冲电路连接光电编码器包含被称为零信号或者参考信号的第三个输出通道。这个通道每旋转一圈输出一个单脉冲。可以使用这个单脉冲精确计算某个参考位置。在绝大多数光电编码器中,这个信号称为Z轴或者索引。光电编码器与正交编码(QEP)电路连接如图6-61所示。Ch.A和Ch.B表示通过传感器A和传感器B产生的脉冲信号。

726正向编码连接(EVA)Ch.ACh.BCAP1_QEP1CAP2_QEP2QEP解码逻辑通用定时器2QEPCLKQEPDIR..IndexCAP3_QEPI1QEPIEQEPIQUAL限定器

7277286.14.7正交编码脉冲(QEP)电路应用举例例6.11:设光电编码器的光电码盘的光栅共有1024格。当电机旋转一周时,通过传感器A和传感器B将输出2路相位相差90°的1024个正交脉冲。

7287296.14.7正交编码脉冲(QEP)电路应用举例假设传感器A和传感器B的信号分别接到2个引脚CAP1_QEP1和CAP2_QEP2,采用事件管理器EVA。由于正交编码(QEP)电路检测每一路信号的上升沿和下降沿,对引脚CAP1_QEP1和CAP2_QEP2的信号进行了4倍频。因此电机旋转一周,QEP将提供给定时器2一共有4096个时钟脉冲。

7297306.14.7正交编码脉冲(QEP)电路应用举例假设传感器A的信号超前传感器B信号90°相位,定时器2增计数,定时器2计数器初值为0,定时器2周期寄存器值为4095。当定时器2从0开始计数,计数到4095时,电机刚好转一周。通过采用通用定时器1的周期中断,每隔一定时间读取定时器2的计数值T2CNT。

7307316.14.7正交编码脉冲(QEP)电路应用举例(1)计算电机转过角度假设在时刻读取定时器2计数值为,在时刻读取定时器2计数值为,经过时间,电机转过角度

7317326.14.7正交编码脉冲(QEP)电路应用举例(2)计算电机转速n,单位为转/分钟t单位为秒如果通过采用通用定时器1的周期中断,每隔20ms读取一次定时器2计数值T2CNT,相邻两次的读数差为2048。则电机转速为:

7327336.14.7正交编码脉冲(QEP)电路应用举例根据电机转过角度计算公式以及转速计算公式,以及转速计算公式可以得到每隔20ms读取定时器2计数值与电机转过角度和转速关系如表6-16所示。

7337346.14.7正交编码脉冲(QEP)电路应用举例电机转过角度转速(rpm)00°051245°375102490°7501536135°11252048180°15002560225°18753072270°22503584315°2625

734735要采样QEP中的计数值,只需读相应寄存器即可。例如,可在定时中断子程序中读出QEP计数值。interruptvoidtime_isr(void)//定时中断{…Theta1=Theta;Theta=EvaRegs.T2CNT;//电机位置的正交编码器输入脉冲采样到Theta中…}如果在前一个周期(T)读取的计数值为Theta1,则可以求出电机的速度6.14.7正交编码脉冲(QEP)电路应用举例

735736增量式光电编码器是电动机控制中的常用传感器,用于测量电动机输出的角位移和转速等信息。作为闭环控制的反馈量,TMS320F2812DSP提供了与这种编码器的接口电路。正交编码脉冲QEP电路总结

736737(1)以事件管理器A为例,它的编码器接口电路使用了定时器2作为可逆计数器,来计编码脉冲的个数。编码脉冲通过2个引脚CAP1_QEP1和CAP2_QEP2输入到芯片内部。正交编码脉冲QEP电路总结

737738(2)这两个引脚是与捕获单元1、2复用的引脚,因此在使用正交编码脉冲电路时,要禁用捕获功能。正交编码脉冲电路利用输入编码脉冲的边沿加工成4倍频的计数脉冲信号和计数方向信号。4倍频的计数脉冲信号有利于提高电动机角位置和角位移信号的分辨率。正交编码脉冲QEP电路总结

738739(3)正交编码脉冲电路的计数方向信号自动地控制定时器2的计数方向,而计数方向引脚TDIRA这时不起作用。正交编码脉冲QEP电路总结

739740(4)当引脚CAP1_QEP1输入的编码脉冲超前CAP2_QEP2引脚输入的编码脉冲90°相位时,定时器2增计数;当引脚CAP2_QEP2输入的编码脉冲超前CAP1_QEP1引脚输入的编码脉冲90°相位时,定时器2减计数。正交编码脉冲QEP电路总结

740741(5)当定时器2计数到与周期寄存器2的值相等时,或计数到与定时器2比较寄存器的比较值相等时,或定时器2发生上溢、下溢时,都有可能会引发中断。正交编码脉冲QEP电路总结

741742END

7426.15事件管理器中断743每个事件管理器的中断事件均分为三组A,B,C,每组都有相应的中断标志寄存器和中断使能寄存器,见下表;当EV模块中有中断产生时,中断标志寄存器中的中断标志置位为1,如果该中断未被屏蔽(EVAIMRx中相应位被置1),PIE将产生一个外设中断;外设中断寄存器中的中断标志必须在中断服务程序ISR中通过软件清除,否则将导致随后产生相同中断时无法发出中断请求。

743事件管理器A的中断744

744事件管理器B的中断745

745中断产生的条件746中断产生的条件下溢上溢比较周期当计数器的值为0000h当计数器的值为FFFFh当计数器的值与比较寄存器值匹配当计数器的值与周期寄存器值匹配

746事件管理器的中断747功率驱动保护中断主要用来向系统监控程序报告系统运行中出现的异常现象;如电动机驱动系统中的过压、过流和过热等。

747事件管理器的中断流程7481.中断源当事件管理器相关的外设中断事件产生时,事件管理器中断标志寄存器(EVAIFRx/EVBIFRx)(x=A,B,C)中相应的中断标志位被置1。一旦置位,这些标志位将会保持直到用软件清除这些标志。

748事件管理器的中断7492.中断使能事件管理器的各中断可通过中断屏蔽寄存器EVAIMRx/EVBIMRx(x=A,B,C)分别使能或屏蔽。寄存器中相应的位被置1时使能中断,清0时屏蔽中断。

749事件管理器的中断7503.外设中断PIE请求如果事件管理器中断标志位和中断屏蔽位都被置位使能,外设就会发出一个外设中断请求信号给外设中断扩展模块PIE。当有多个中断发生时,外设中断扩展模块PIE会接收到多个中断请求信号。

750事件管理器的中断7513.外设中断请求外设中断扩展模块PIE逻辑记录所有的中断请求,并根据预先指定的优先级产生各自的CPU中断(INT1,INT2,INT3,INT4或INT5)。

751事件管理器的中断7524.CPU中断响应接收到INT1、INT2、INT3、INT4或INT5中断请求后,CPU中断标志寄存器IFR相应的位被置1。如果中断屏蔽寄存器IER的相应位也被置1,并且INTM位被清零,CPU就可响应中断并发出确认信号给外设中断扩展模块PIE。

752事件管理器的中断753随后,CPU结束执行当前指令并转到对应于INT1.y、INT2.y、INT3.y、INT4.y或者INT5.y的PIE向量表中的中断向量地址。同时,IFR中各自的中断标志位被硬件自动清除,并且INTM位被置位,禁止其他的中断响应。中断向量中包含中断服务程序的地址。

753事件管理器的中断7545.PIE响应PIE逻辑利用来自CPU的确认信号清除PIEIFRx中的相应位。

754事件管理器的中断7556.中断服务程序软件设计执行具体的中断服务程序程序时,编写程序将产生中断的中断标志寄存器EVxIFRA、EVxIFRB或EVxIFRC(x=A,B)中的中断标志位写1清0。中断返回前,中断服务程序中用软件写1清除PIE中断应答寄存器PIEACK的PIEACKx位。

755756地址寄存器名称742ChEVAIMRAEVA的中断屏蔽寄存器A742DhEVAIMRBEVA的中断屏蔽寄存器B742EhEVAIMRCEVA的中断屏蔽寄存器C742FhEVAIFRAEVA的中断标志寄存器A7430hEVAIFRBEVA的中断标志寄存器B7431hEVAIFRCEVA的中断标志寄存器C表EVA中断寄存器地址

756757地址寄存器名称752ChEVBIMRAEVB的中断屏蔽寄存器A752DhEVBIMRBEVB的中断屏蔽寄存器B752EhEVBIMRCEVB的中断屏蔽寄存器C752FhEVBIFRAEVB的中断标志寄存器A7530hEVBIFRBEVB的中断标志寄存器B7531hEVBIFRCEVB的中断标志寄存器C表EVB中断寄存器地址

7572022/6/10758

758事件管理器中断寄存器759位15-11保留位。读返回0,写无效。位10T1OFINTFLAG。通用定时器1的上溢中断标志读0:通用定时器1的无上溢中断发生读1:通用定时器1的有上溢中断发生写0:无效1:复位标志位位9T1UFINTFLAG。通用定时器1的下溢中断标志读0:通用定时器1的无下溢中断发生读1:通用定时器1的有下溢中断发生写0:无效1:复位标志位

759事件管理器中断寄存器760位8T1CINTFLAG。通用定时器1的比较中断标志读0:通用定时器1的无比较中断发生读1:通用定时器1的有比较中断发生写0:无效1:复位标志位位7T1PINTFLAG。通用定时器1的周期中断标志读0:通用定时器1的无周期中断发生读1:通用定时器1的有周期中断发生写0:无效1:复位标志位位6-4保留位。读返回0,写无效。位3CMP3INTFLAG。比较单元3中断标志读0:比较单元3无中断发生读1:比较单元3有中断发生写0:无效1:复位标志位

760事件管理器中断寄存器761位2CMP2INTFLAG。比较单元2中断标志读0:比较单元2无中断发生读1:比较单元2有中断发生写0:无效1:复位标志位位1CMP1INTFLAG。比较单元1中断标志读0:比较单元1无中断发生读1:比较单元1有中断发生写0:无效1:复位标志位位0PDPINTAFLAG。功率驱动保护中断标志读0:无功率驱动保护中断发生读1:有功率驱动保护中断发生写0:无效1:复位标志位

7612022/6/10762

762事件管理器中断寄存器763位15-位4保留位。读返回0,写无效。位3T2OFINTFLAG。通用定时器2的上溢中断标志读0:通用定时器2的无上溢中断发生读1:通用定时器2的有上溢中断发生写0:无效1:复位标志位位2T2UFINTFLAG。通用定时器2的下溢中断标志读0:通用定时器2的无下溢中断发生读1:通用定时器2的有下溢中断发生写0:无效1:复位标志位

763事件管理器中断寄存器764位1T2CINTFLAG。通用定时器2的比较中断标志读0:通用定时器2的无比较中断发生读1:通用定时器2的有比较中断发生写0:无效1:复位标志位位0T2PINTFLAG。通用定时器2的周期中断标志读0:通用定时器2的无周期中断发生读1:通用定时器2的有周期中断发生写0:无效1:复位标志位

7642022/6/10765

765事件管理器中断寄存器766位15-位3保留位。读返回0,写无效。位2CAP3INTFLAG。捕捉单元3中断标志读0:捕捉单元3无中断发生读1:捕捉单元3有中断发生写0:无效1:复位标志位位1CAP2INTFLAG。捕捉单元3中断标志读0:捕捉单元2无中断发生读1:捕捉单元2有中断发生写0:无效1:复位标志位

766事件管理器中断寄存器767位0CAP1INTFLAG。捕捉单元1中断标志读0:捕捉单元1无中断发生读1:捕捉单元1有中断发生写0:无效1:复位标志位

7672022/6/10768

768事件管理器中断寄存器769位15-11保留位。读返回0,写无效。位10T1OFINTENABLE。通用定时器1的上溢中断使能0:禁止1:使能位9T1UFINTENABLE。通用定时器1的下溢中断使能0:禁止1:使能

769事件管理器中断寄存器770位8T1CINTENABLE。通用定时器1的比较中断使能0:禁止1:使能位7T1PINTENABLE。通用定时器1的周期中断使能0:禁止1:使能位6-4保留位。读返回0,写无效。位3CMP3INTENABLE。比较单元3中断使能0:禁止1:使能

770事件管理器中断寄存器771位2CMP2INTENABLE。比较单元2中断使能0:禁止1:使能位1CMP1INTENABLE。比较单元1中断使能0:禁止1:使能位0PDPINTAENABLE。功率驱动保护中断使能0:禁止1:使能

7712022/6/10772

772事件管理器中断寄存器773位15-位4保留位。读返回0,写无效。位3T2OFINTENABLE。通用定时器2的上溢中断使能0:禁止1:使能位2T2UFINTENABLE。通用定时器2的下溢中断使能0:禁止1:使能

773事件管理器中断寄存器774位1T2CINTENABLE。通用定时器2的比较中断使能0:禁止1:使能位0T2PINTENABLE。通用定时器2的周期中断使能0:禁止1:使能

7742022/6/10775

775事件管理器中断寄存器776位15-位3保留位。读返回0,写无效。位2CAP3INTENABLE。捕捉单元3中断使能位0:禁止1:使能位1CAP2INTENABLE。捕捉单元2中断使能位0:禁止1:使能

776事件管理器中断寄存器777位0CAP1INTENABLE。捕捉单元1中断使能位0:禁止1:使能事件管理器EVB的中断标志寄存器和中断屏蔽寄存器与EVA类似。

777第六章内容总结事件管理器功能概述:1)两个定时器:为PWM、CAP、QEP电路提供事件基准;2)PWM电路:提供八路(六路死区可编程)PWM信号;3)捕获单元:实现BLDC电机的电子换向和速度测量;4)QEP电路:实现和正交脉冲编码器的接口。778光电编码器霍尔传感器功率放大器电流传感器

778BLDC控制系统组成框图779TMS320F28×目标板

779780例6.12当定时器T1的计数器寄存器T1CNT计数到和T1周期寄存器T1PR的值匹配时,就产生了一个T1PINT事件,即T1的周期中断。事件管理器EVA的中断标志寄存器A(EVAIFRA)中的D7即T1PINTFLAG被置为1。如果EVA的中断屏蔽寄存器A(EVAIMRA)中的D7即T1PINT的使能位是1,则EVA就会向外设中断扩展模块PIE发出中断请求,而且EVAIFRA中T1PINTFLAG位将一直保持为1,除非通过软件写1清零。即外设寄存器中的中断标志位需要手工清除。

780781以T1周期中断T1PINT为例,清除定时器1周期中断T1PINT标志的语句是EvaRegs.EVAIFRA.bit.T1PINT=1;

781782PIE级(1)在main()函数中有以下语句PieCtrlRegs.PIEIER2.bit.INTx4=1;//使能PIE组2的通用定时器1周期中断(2)在文件DSP28_DefaultIsr.c中,T1PINT中断函数如下所示。interruptvoidT1PINT_ISR(void){EvaRegs.EVAIFRA.bit.T1PINT=1;//写1清除T1PINT中断标志位PieCtrlRegs.PIEACK.all=PIEACK_GROUP2;//中断应答寄存器写1清零,可以响应同组中断}

782783CPU级(1)在main()函数中,开CPU中断IER|=M_INT2;//开CPU级中断INT2,T1PINT中断是INT2.4。EINT;//使能全局中断INTM=0(2)在DSP281x_Device.h中有语句#defineM_INT20x0002

783784例6.13:事件管理器产生PWM控制直流电机。脉冲宽度调制(PWM)是英文“PulseWidthModulation”的缩写,简称脉宽调制,是利用微处理器的数字输出对模拟电路进行控制的一种非常有效的技术。用PWM调制的方法,把恒定的直流电压调制成频率一定、宽度可变的脉冲电压序列,改变平均输出电压的大小,以调节电机转速。DSP驱动直流电机时,通过控制PWM波形的占空比实现电机转速的调节。占空比越大,速度越快。

784785直流电机PWM调速控制

785事件管理器产生PWM控制直流电机786

786事件管理器产生PWM控制直流电机787当DIR=1,A=0,C=0,NMOS管T3、T2截止。NMOS管T4导通。引脚PWM11输出=1时,NMOS管T1导通。引脚PWM11输出=0时,NMOS管T1截止。电流由US→经T1→电机→T4构成回路,电机正转。当DIR=0,NMOS管T4、T1截止。A=1,T2导通。引脚PWM11输出=1时,C=1,T3导通。引脚PWM11输出=0时,C=0,NMOS管T3截止。电流由US→经T3→电机→T2构成回路,电机反转。

7877883.直流电机控制源程序采用通用定时器3周期中断和比较单元6产生固定频率的PWM波形,用来控制电机转速。程序首先进行初始化,如设定时钟频率、禁止看门狗,选择复用引脚作为PWM输出引脚,对通用定时器3进行初始化,并使能定时器3周期中断(1ms,即PWM频率为1kHz)。当通用定时器3产生周期中断时进入中断服务程序gptimer3_isr()。在gpttimer3_isr()中,判断中断次数,如中断次数达到10000次,表示时间经过10s,则改变比较寄存器的值,使得PWM脉宽改变,电机转速发生变化。电机正传。电机先以较快的转速转动,经过10s后,电机转速变慢,再经过10s电机转速又变快,依次循环下去。

788789#include"DSP281x_Device.h"//DSP281x头文件voidgptimer3_init(void);//T3初始化程序voidinterruptgptimer3_isr(void);//T3中断服务程序voidDelay(unsignedintnTime);#defineCTRGR*(int*)0x108000#defineCTRLR*(int*)0x108007unsignedintnCount;unsignedintdatacnt,data[2]={0x4E,0x9B};/*data[]中的值为PWM波形中保持低电平的时间,通过改变data中的值来改变PWM波形的占空比。由于T3PR=0xC2=194,data[]=0x4E=78和0x9B=155时,PWM占空比=(195-78)/195=0.6和(195-155)/195=0.2*/

789790voidmain(void){InitSysCtrl();//系统初始化,PLL,时钟频率150MHz,使能外设时钟,禁止WDEALLOW;EDIS;

790791EALLOW;GpioMuxRegs.GPAMUX.all=0x0000;//GPIOA4—PWM5设置成通用输入输出功能GPIOA4GpioMuxRegs.GPADIR.all=0x00FF;//GPIOA4工作在输出GpioMuxRegs.GPBMUX.all=0x00FF;//将GPIOB4_PWM11设置为PWM11功能EDIS;EvbRegs.ACTRB.all=0x0666;//空间矢量不动作,PWM11高电平有效EvbRegs.DBTCONB.all=0x0000;//禁止死区EvbRegs.COMCONB.all=0xA600;//使能比较单元操作和使能比较单元输出EvbRegs.CMPR6=0x4E;//比较值gptimer3_init();//T3初始化程序

791792gptimer3_init();DINT;//禁止全局中断,asm("setcINTM")IER=0x0000;//禁止CPU中断IFR=0x0000;//清中断标志寄存器InitPieCtrl();//初始化PIE控制寄存器InitPieVectTable();//初始化PIE中断向量表,DSP281x_PieVect.c.EALLOW;PieVectTable.T3PINT=&gptimer3_isr;//中断服务程序入口地址放入中断向量表EDIS;

792793//依次使能各级中断:外设中相应中断位->PIE控制器->CPUPieCtrlRegs.PIEIER4.all=M_INT4;//通用定时器3使能位于PIE第4组第4个,即INT4.4,将其使能IER|=M_INT4;//PIE第4组对应于CPU的可屏蔽中断4(INT4),将其使能EINT;//使能全局中断GpioDataRegs.GPADAT.bit.GPIOA4=1;//电机正转nCount=0;//软件计数器初值datacnt=0;for(;;){;}//循环等待定时器3周期中断的产生}

793794voidinterruptgptimer3_isr(void)//T3中断服务程序{nCount++;if(nCount==10000)//10s时间到{nCount=0;datacnt++;if(datacnt==2)datacnt=0;EvbRegs.CMPR6=data[datacnt];//改变占空比}EvbRegs.EVBIMRA.bit.T3PINT=1;//使能定时器3的周期中断EvbRegs.EVBIFRA.bit.T3PINT=1;//写1清除定时器3周期中断标志PieCtrlRegs.PIEACK.all=PIEACK_GROUP4;//写1清零PIEACK中的第4组中断对应位}

794795voidInitSysCtrl(void){Uint16i;EALLOW;//解除寄存器保护SysCtrlRegs.WDCR=0x0068;//禁止看门狗模块SysCtrlRegs.PLLCR=0xA;//初始化锁相环PLLfor(i=0;i<5000;i++){}//等待锁相环PLL锁定SysCtrlRegs.HISPCP.all=0x0003;//高速外设时钟HSPCLK=SYSCLKOUT/6=25MHzSysCtrlRegs.LOSPCP.all=0x0004;//低速外设时钟LSPCLK=SYSCLKOUT/8=18.75MHz//SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;//EVA时钟使能SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;//EVB时钟使能EDIS;//使能寄存器保护}

795796voidgptimer3_init(void)//定时器T3中初始化程序{EvbRegs.T3CON.all=0x1742;//连续递增计数模式,128分频,使能定时器比较操作,使能定时器EvbRegs.T3PR=0xc2;/*定时器3周期=(T3PR+1)×128/25MHz=(194+1)×128/25MHz=998.4us=1ms,即产生PWM波形的频率为1kHz*/EvbRegs.T3CNT=0;//定时器计数器初值,从0开始计数EvbRegs.EVBIMRA.bit.T3PINT=1;//使能定时器3周期中断EvbRegs.EVBIFRA.bit.T3PINT=1;//写1清除定时器3周期中断标志}

796797例6.14:采用DSP控制直流电机时,可以采用脉冲宽度调制即PWM(PulseWidthModulation)。通过控制PWM波形的占空比实现转速的调节。占空比越大,速度越快。产生PWM可以采用软件延时、定时器或PWM控制器实现。图6-78中采用L298N芯片可以驱动直流电机。程序设计用两个按键实现对电机的快速和慢速控制。

797798

798799

799800L298N驱动芯片是一个集成的单块集成电路。是一种二相和四相电机的专用驱动器,内含二个H桥的高电压大电流双全桥式驱动器,接收标准TTL逻辑电平信号,可驱动继电器、直流电机或步进电机。L298N可以驱动2个电机,OUT1、OUT2和OUT3、OUT4之间可以分别接2个电机。5、7、10、12脚接输入控制电平,控制电机的正反转,ENA、ENB接控制使能端,控制电机的停转。1脚和15脚可单独引出连接电流采样电阻器,形成电流传感信号。

800801

801802(1)当ENB为高电平,IN3为低电平时,C点输出为低电平,三极管Q1截止。D点输出为高电平,三极管Q2导通。OUT3为低电平。(2)当ENB为高电平,IN4为高电平时,E点输出为高电平,三极管Q3导通。F点输出为低电平,三极管Q4截止,OUT4为高电平。由(1)和(2)决定了电流流向是电源+VS→Q3→OUT4→电机→OUT3→Q2→地。(3)当ENB为高电平,IN4为低电平时,E点输出为低电平,三极管Q3截止。F点输出为高电平,三极管Q4导通,OUT4为低电平。

802803方法一:采用CPU定时器0产生PWM输出控制直流电机,通过按键实现电机转速的控制。分析:(1)程序设计中晶振是30MHz,CPU系统时钟SYSCLKOUT是30MHz×8/2=120MHz,由于设置CPU定时器0周期寄存器值是60000,CPU定时器0预定标寄存器为0,则CPU定时器0定时时间为:程序中CPU定时器0的定时时间0.5ms采用查询方式实现。

803804(2)程序中常量Period=40,PWM周期值=Period×0.5ms=40×0.5ms=20ms。PWM的高电平时间由全局变量temp决定。通过按下加速键,使全局变量temp加1,按下减速键,使全局变量temp减1。PWM高电平时间是temp×0.5ms。temp最大值=period。(3)程序设计使IN3为低电平,IN4输出PWM控制电机。IN4为高电平时,PWM输出的高电平时间是temp×0.5ms。IN4为低电平时,PWM输出的低电平时间是(Period-temp)×0.5ms。

804805(4)DSP的引脚GPIOA4接L298N的IN3,DSP的引脚GPIOA6接L298N的IN4。(5)DSP复位时,功能选择寄存器GPAMUX、GPBMUX和GPEMUX为0,选择对应引脚工作在通用输入输出GPIO。(6)加速键与DSP的引脚GPIOE2相连,减速键与DSP的引脚GPIOB8相连。

805806方法二:采用事件管理器在引脚T1PWM_T1CMP产生PWM输出控制电机方法二中文件DSP281_SysCtrl.c与方法一中的文件DSP281_SysCtrl.c一样。因此方法二中系统控制初始化程序voidInitSysCtrl(void)和初始化外设时钟程序voidInitPeripheralClocks(void)与方法一中的相同。程序设计使IN3输出为低电平,IN4输出PWM控制电机。(3)对应电机驱动模块的引脚IN4,配置DSP的引脚GPIOA6为外设功能,作为引脚T1PWM_T1CMP输出,并与L298N的引脚IN4相连。采用通用定时器1在引脚T1PWM_T1CMP上输出PWM控制电机。

806807(4)PWM频率晶振是30MHz,CPU系统时钟是30MHz×8/2=120MHz,程序设计中使用SysCtrlRegs.HISPCP.all=0x0001;对CPU系统时钟SYSCLKOUT进行了2分频,所以高速外设时钟HSPCLK=60MHz。使用语句EvaRegs.T1CON.bit.TPS=1;事件管理器EVA对高速外设时钟HSPCLK进行2分频,因此通用定时器1计数器时钟频率是30MHz。语句EvaRegs.T1PR=Period;设置通用定时器1周期寄存器值。由于常量Period=3000,通用定时器1工作在连续递增计数模式。所以PWM周期为。因此输出PWM频率为10KHz。

807808(5)由于EvaRegs.GPTCONA.bit.T1PIN=1;设置通用定时器1比较输出低有效。PWM的高电平时间由通用定时器1比较寄存器值决定。程序设计中将temp送入比较寄存器T1CMPR中。高电平时间=

808809(6)通过按下加速键,使全局变量temp加50,按下减速键,使全局变量temp减50,temp最大值等于Period。temp值的改变使定时器1比较寄存器值改变,因此使引脚T1PWM_T1CMP输出的PWM脉冲宽度改变,可以改变电机转速。

809810思考:本题中如果设置EvaRegs.GPTCONA.bit.T1PIN=2;设置通用定时器1比较输出高有效,那么在通用定时器1工作在连续递增计数模式时,PWM输出的高电平时间为

8102022/6/10811end

811串行通信接口SCI8127.2SCI模块功能7.3SCI工作原理7.4SCI寄存器7.1SCI模块特点7.5SCI波特率计算7.6SCI发送数据和接收数据机制7.7SCI多处理器通信7.8SCI发送与接收数据应用实例

8127.1SCI模块特点813串行通信接口(SCI-SerialCommunicationInterface)F2812包含两个SCI接口,记做SCIA和SCIBSCI是一种异步串行通信接口,即通常所说的UARTSCI可工作于半双工或全双工模式(RS-485/RS-422)

8137.1SCI模块特点814SCI通信接口的主要特征:(1)包含两个外部引脚SCITXD为SCI发送输出引脚,SCIRXD为SCI接收输入引脚。两个引脚为多功能复用引脚,如果不使用SCI,这两个引脚可以用作通用数字输入输出GPIO。(2)波特率可以编程达到不同速率。通过使用16位的波特率选择寄存器能够设置不同的波特率。

8147.1SCI模块特点815(3)数据格式是1个起始位。可编程1~8位的数据字长度,可选择的奇/偶校验位模式或无校验位,1个或2个停止位。(4)为保证数据的完整性,SCI模块对接收到的数据可以进行间断、奇偶、超时和帧错误检测。有四个错误检测标志位:即奇偶错误、超时错误、帧错误或间断检测。(5)多处理器通信具有两种模式:空闲线模式和地址位模式。

8157.1SCI模块特点816(6)具有全双工和半双工通信。(7)具有双缓冲接收和发送功能。接收数据缓冲寄存器为SCIRXBUF,发送数据缓冲寄存器为SCITXBUF。(8)发送和接收可以采用中断和查询两种方式实现。(9)有独立的发送和中断使能控制位。

8167.1SCI模块特点817(10)使用标准非归0NRZ(standardnon-return-to-zero)数据格式进行通信。由于RS232是负逻辑,没有0电平。所以是非归0NRZ。(11)SCI-A模块具有13个控制寄存器。增强功能:(1)具有自动波特率检测硬件逻辑。(2)接收器和发送器各具有一个16级深度的FIFO。

817SCI与CPU的接口818

818819

8197.2SCI模块功能820图7-2中SCI模块可以工作在全双工模式,主要部件有:(1)发送器和它的主要寄存器(图中上半部)SCITXBUF是发送数据缓冲寄存器。包括由CPU加载的、要发送出去的数据。TXSHF寄存器是发送移位寄存器。接收来自发送数据缓冲寄存器SCITXBUF的数据,并逐位将数据移到SCI发送引脚SCITXD。

820821(2)接收器和它的主要寄存器(图中下半部)RXSHF寄存器是接收移位寄存器。逐位接收来自SCI接收引脚SCIRXD的数据并移入。SCIRXBUF是接收数据缓冲寄存器。包含CPU要读的数据。来自远端处理器的数据加载到接收移位寄存器RXSHF中,然后进入接收数据缓冲寄存器SCIRXBUF中。(3)可编程的波特率发生器。(4)数据存储器映射的控制和状态寄存器。(5)SCI发送器和接收器可以独立工作,也可以同时工作。

821SCI-A寄存器AddressRegisterName0x007050SCICCRSCI-A通信控制寄存器0x007051SCICTL1SCI-A控制寄存器10x007052SCIHBAUDSCI-A波特率寄存器,高位0x007053SCILBAUDSCI-A波特率寄存器,低位0x007054SCICTL2SCI-A控制寄存器20x007055SCIRXSTSCI-A接收状态寄存器0x007056SCIRXEMUSCI-A接收仿真数据寄存器0x007057SCIRXBUFSCI-A接收数据寄存器0x007059SCITXBUFSCI-A发送数据寄存器0x00705ASCIFFTXSCI-AFIFO发送寄存器0x00705BSCIFFRXSCI-AFIFO接收寄存器0x00705CSCIFFCTSCI-AFIFO控制寄存器0x00705FSCIPRISCI-A优先级控制寄存器

822SCI-A寄存器823

8237.3SCI工作原理SCITXBUFTXSHFSCIDevice#1SCIRXDSCITXDSCITXDSCIRXDSCIDevice#28SCIRXBUFRXSHF8SCITXBUFTXSHF8SCIRXBUFRXSHF8全双工RXFIFO_0RXFIFO_15RXFIFO_0RXFIFO_15TXFIFO_0TXFIFO_15TXFIFO_0TXFIFO_15

824825SCI模块发送和接收数据的工作原理

825SCI的工作原理826SCI可以工作于全双工模式,因为它有独立的数据发送器和数据接收器,能够保证SCI既能够同时进行,也能够独立进行发送和接收的操作。SCI发送数据的过程:在FIFO功能使能的情况下,首先,发送数据缓冲寄存器SCITXBUF获取由CPU加载的需要发送的数据,然后SCITXBUF将数据传输给发送移位寄存器TXSHF,如果SCI的发送功能使能,TXSHF将接收到的数据逐位逐位地移到SCITXD引脚上。

826SCI的工作原理827SCI接收数据的过程:接收移位寄存器RXSHF逐位逐位地接收来自于SCIRXD引脚的数据,如果SCI的接收功能使能,RXSHF将这些数据传输给接收缓冲寄存器SCIRXBUF,CPU就能从SCIRXBUF读取外部发送来的数据。如果FIFO功能使能,SCIRXBUF将数据加载到RXFIFO的队列中,CPU再从FIFO的队列中读取数据。

8277.3.2数据接收与发送过程828数据接收数据发送SCIRXDRXSHFSCIRXBUFCPUSCITXDTXSHFSCITXBUFCPU

8287.3.2数据接收与发送过程829一.数据接收过程

8297.3.2数据接收与发送过程8301.执行指令使能SCI数据接收,置接收器使能位RXENA=1(SCICTL1.0)。SciaRegs.SCICTL1.bit.RXENA=1,即RXENA(SCICTL1.0)变为高,使能接收器接收数据。SCICTL1.0是SCI控制寄存器SCICTL1的D0位。2.数据到达SCI接收数据引脚SCIRXD后,检测起始位。

8307.3.2数据接收与发送过程8313.数据从接收移位寄存器RXSHF中移位到接收数据缓冲寄存器SCIRXBUF时,产生一个中断申请。接收器准备好标志位RXRDY(SCIRXST.6)从0变为1。表明已经接收到一个新的字符。此时如果接收缓冲寄存器中断使能,即RX/BKINTENA(SCICTL2.1)已经置1,则产生一个接收中断RXINT请求。4.CPU读取SCI接收数据缓冲寄存器SCIRXBUF中的数据后,接收器准备好标志位RXRDY自动被清零。

8317.3.2数据接收与发送过程8325.下一个数据到达SCI接收数据引脚SCIRXD时,再次检测到起始位。6.若使接收器使能位RXENA(SCICTL1.0)为低电平,禁止接收器接收数据。此时SCI接收数据引脚SCIRXD上的数据继续移入接收移位寄存器RXSHF中,但接收移位寄存器RXSHF中的数据不会装载到接收数据缓冲寄存器SCIRXBUF中。

8327.3.2数据接收与发送过程833二.数据发送过程

8337.3.2数据接收与发送过程834图7-8中表明了发送信号时序是地址位模式。每个字符有3位数据。1.使能SCI发送器使能位TXENA=1(SCICTL1.1);执行指令SciaRegs.SCICTL1.bit.TXENA=1,使能发送器发送数据。SCICTL1.1是SCI控制寄存器SCICTL1的D1位。2.执行指令发送数据SciaRegs.SCITXBUF=0x10CPU写数据到SCI发送数据缓冲寄存器SCITXBUF中,使得发送器不为空,发送缓冲寄存器准备好标志TXRDY(SCICTL2.7)由1变为0。

8347.3.2数据接收与发送过程8353.SCI将发送数据缓冲寄存器SCITXBUF中的数据装载到发送移位寄存器TXSHF后,发送缓冲寄存器准备好标志TXRDY由0变为1,此时可以发送下一个字符。如果发送缓冲寄存器中断使能位TXINTENA(SCICTL2.0)已经置1,则产生一个发送中断请求。4.发送缓冲寄存器准备好标志TXRDY由0变为1后,CPU可以写第二个字符到SCI发送数据缓冲寄存器SCITXBUF中,一旦第二个字符写入到发送数据缓冲寄存器SCITXBUF后,TXRDY由1变为0。

8357.3.2数据接收与发送过程8365.第一个字符通过发送移位寄存器TXSHF从低位到高位传送到发送引脚SCITXD进行发送完毕后,第二个字符开始移入到发送移位寄存器TXSHF中。6.如果使发送器使能位TXENA(SCICTL1.1)为低电平,在SCI结束当前字符的发送后,将禁止发送器发送数据。7.第二个字符发送完成后,发送器变空,准备发送下一个字符。

8367.3.2数据接收与发送过程837图7-8中发送缓冲寄存器准备好标志TXRDY(SCICTL2.7)判断发送数据缓冲寄存器SCITXBUF是否为空,如果TXRDY=1,表示发送数据缓冲寄存器SCITXBUF中的值进入发送移位寄存器TXSHF中。发送器空标志位TXEMPTY(SCICTL2.6)判断一个数据是否被传送完毕。TXEMPTY=1表示发送移位寄存器TXSHF中为空,数据发送完成。

8377.3.3SCI数据帧格式8381.空闲线模式——用于正常的非多处理器通信空闲线模式格式是起始位、数据位、奇偶校验位和停止位。数据位中是先传送低位LSB,再传送高位MSB。用于非多处理器通信。

8387.3.3SCI数据帧格式8392.地址位模式——常用于多处理器模式用一个附加的地址位来标志这一帧数据是地址还是数据。

8397.3.3SCI数据帧格式840SCI的接收和发送都采用非归零NRZ(non-return-to-zero)数据格式,包括:(1)1个起始位;(2)1~8位数据位;(3)1个奇/偶校验位或无奇/偶校验位;(4)1个或2个停止位;(5)区别数据和地址的附加位(仅在地址位模式存在)。数据的基本单元为字符,有1~8位长。每个数据字符包含1个起始位,1或2位停止位,可选择的奇偶校验位以及地址位。通过SCI通信控制寄存器SCICCR的配置编程实现SCI通信的数据格式。

8407.4SCI寄存器841SCI通信控制寄存器SCICCR(SCICommunicationControlRegister)如图7-11所示。数据格式通过SCI通信控制寄存器SCICCR进行设置。设置数据长度、是否使能奇偶校验,校验方式是奇校验还是偶校验以及停止位设置。

8417.4SCI寄存器8427:STOPBITS:指定发送的停止位个数,0-1个停止位,1-2个停止位;6:EVEN/ODDPARITY:奇偶校验选择,0-奇校验,1-偶校验;5:PARITYENALBE:校验使能,0-禁止奇偶校验,1-允许奇偶校验;4:LOOPBACKENA:环路测试模式使能,1-Tx数据内部送Rx,0-禁止3:ADDR/IDLEMODE:多处理器模式选择,0-空闲线模式,1-地址位模式2~0:SCICHAR2~0:数据长度选择,1~8位数据(000-111)。SCI通信控制寄存器书P275

842SCI的数据格式843使用SCICCR进行数据格式编程SciaRegs.SCICCR.bit.SCICHAR=7;//选择数据长度,为8个数据位SciaRegs.SCICCR.bit.PARITYENA=1;//奇偶校验使能SciaRegs.SCICCR.bit.PARITY=0;//0-奇校验,1-偶校验SciaRegs.SCICCR.bit.STOPBITS=0;//选择停止位,有1个停止位,上述4条语句可以合并成:SciaRegs.SCICCR.all=0x27;

8437.4SCI寄存器8447.4.1SCI通信控制寄存器SCICCRSCI通信控制寄存器SCICCR(SCICommunicationControlRegister)定义了SCI使用的字符格式、通信协议及模式。

8448457.4.2SCI控制寄存器1(SCICTL1)位6RXERRINTENA:SCI接收错误中断使能位。位5SWRESET:SCI软件复位位(低电平有效)。位3TXWAKE:SCI发送器唤醒方法选择位。位2SLEEP:SCI休眠位。1:使能休眠。位1TXENA:SCI发送使能位。1:使能发送。位0RXENA:SCI接收使能位。1:使能接收。SCI控制寄存器1(SCIControlRegister1,SCICTL1)控制接收/发送的使能,TXWAKE和SLEEP功能,以及SCI软件复位。P318

845846位7TXRDY:发送缓冲寄存器准备就绪标志位。1:准备接收数据。位6TXEMPTY:发送器空标志位。位1RX/BKINTENA:接收缓冲器/间断中断使能位。1:使能。位0TXINTENA:发送缓冲寄存器(SCITXBUF)中断使能位。1:使能。7.4.3SCI控制寄存器2(SCICTL2)

846847SCI控制寄存器2(SCICTL2)

847848SCI接收状态寄存器(SCIReceiverStatusRegister,SCIRXST)包含了7位接收器的状态标志。位7RXERROR:SCI接收器错误标志位。位6RXRDY:SCI接收器准备就绪标志位。位5BRKDT:SCI间断检测标志位。位4FE:SCI帧错误(FrameError)标志位。位3OE:SCI超时错误标志位。位2PE:SCI奇/偶校验错误标志位。位1RXWAKE:SCI接收器唤醒检测标志位。7.4.4SCI接收状态寄存器SCIRXST

848849SCI接收状态寄存器SCIRXST

849850接收数据缓冲寄存器(SCIRXBUF)用于接收数据,将数据从寄存器RXSHF转移到SCIRXBUF中。7.4.6SCI接收数据缓冲寄存器(书P323)

8507.4.7SCI发送数据缓冲寄存器SCITXBUF851将要发送的数据写入到发送数据缓冲寄存器SCITXBUF中。数据从发送数据缓冲寄存器SCITXBUF移到发送移位寄存器TXSHF中,发送缓冲寄存器准备好标志位TXRDY(SCICTL2.7)置1,表明发送数据缓冲寄存器SCITXBUF已准备好接收下一个要发送的数据。如果发送缓冲寄存器使能位TXINTENA(SCICTL2.0)被置1,则这次数据传送将会产生一个中断。

8517.4.9SCI波特率选择寄存器852BAUD15(MSB)BAUD14Baud-SelectMSbyteRegister(SCIHBAUD)–0x00705276543210BAUD13BAUD12BAUD11BAUD10BAUD9BAUD8BAUD6Baud-SelectLSbyteRegister(SCILBAUD)–0x00705376543210BAUD5BAUD4BAUD3BAUD2BAUD1BAUD7BAUD0(LSB)SCIbaudrate=LSPCLK(BRR+1)x8LSPCLK16,BRR=1to65535,BRR=0

852SCI的波特率计算853波特率:串行通信过程每秒钟传送的二进制位数,单位:bit/s(位/秒)串行时钟SCICLK由低速外设时钟LSPCLK和波特率选择寄存器确定;SCI使用16位波特率选择寄存器,可以设定波特率BRR;SCI波特率=LSPCLKBRR+1=LSPCLK(BRR+1)×8SCI波特率×8如果BRR=0,则波特率选择高字节寄存器SCIHBAUD和低字节寄存器SCILBAUD二者确定了SCI的波特率。书P326

853波特率计算854例如外部晶振为30MHz,经过PLL之后SYSCLKOUT为150MHz,当低速预定标器LOSPCP的值为2时,SYSCLKOUT经过低速预定标器之后产生低速外设时钟LSPCLK为37.5MHz,即SCI的时钟为37.5MHz。如果需要SCI的波特率为19200,将LSPCLK和波特率的数值代入公式,得到:BRR=243.14,由于寄存器都是正整数,省略小数后可以得到BRR=243。将243转换成16进制是0xF3,因此SCIHBAUD的值为0,SCILBAUD的值为0xF3。由于省略了小数,将会产生0.06%的误差。

854波特率计算855理想的波特率低速时钟频率LSPCLK=37.5MHZ波特率选择寄存器BRR的设定值实际波特率BRR与实际波特率的误差(百分比/%)12003905(0x0F41)1200024001952(0x07A0)240004800976(0x03D0)4798-0.049600487(0x01E7)96060.0619200243(0x00F3)192110.0638400121(0x0079)384220.06表7-9SCI的波特率选择

8557.6SCI发送数据和接收数据机制856查询方式和中断方式程序不断去查询状态标志位。当数据发送时,需要查询SCI控制寄存器2的第7位(SCICTL2.7)TXRDY,发送数据缓冲寄存器就绪标志。当TXRDY位为1时,表明发送数据缓冲寄存器SCITXBUF已经准备好开始从CPU接收并发送下一个数据。当向SCITXBUF写入数据后,TXRDY自动会清零;如果TXENA(SCICTL1.1)使能,发送移位寄存器TXSHF会将SCITXBUF中的数据发送出去。7.6.1SCI查询方式

856当数据接收时,需要查询SCI接收状态寄存器(SCIRXST)中的RXRDY(SCIRXST.6),接收器就绪标志。当从SCIRXBUF寄存器中已经准备好一个字符的数据,等待CPU去读时,RXRDY位会置1。当数据被CPU从SCIRXBUF读出后,或者系统复位,都可以使RXRDY清0。7.6SCI发送数据和接收数据机制857

857使用查询方式发送或者接收数据的程序结构如下:if(SciaTx_Ready()==1){SciaRegs.SCITXBUF=SCI_Senddata;//SCI_Senddata为需要发送的数据}if(SciaRx_Ready()==1){Sci_Receivedata=SciaRegs.SCIRXBUF.all;//SCI_Receivedata用于存放接收的数据}7.6.1SCI查询方式858

858//发送就绪标志状态查询函数intSciaTx_Ready(void){unsignedinti;if(SciaRegs.SCICTL2.bit.TXRDY==1){i=1;//返回1说明发送器准备就绪,可以接收新的数据进行发送}else{i=0;}return(i);}7.6.1SCI查询方式859

859//接收就绪标志状态查询函数intSciaRx_Ready(void){unsignedinti;if(SciaRegs.SCIRXST.bit.RXRDY==1){i=1;//返回1说明数据接收已经就绪,等待CPU去读取数据}else{i=0;}return(i);}7.6.1SCI查询方式860

860三级中断必须使能外设自己的中断、PIE中断和CPU中断。SCIA的接收和发送中断分别位于PIE模块第9组的第1和第2位,同时对应于CPU中断的INT9。7.6.2SCI中断方式861TXRDY是中断标志位,当TXRDY位置1时,会产生发送中断事件,如果各级中断都已经使能,则会响应SCI的发送中断函数。当接收中断标志位RXRDY置1时,会产生接收中断标志。如果各级中断已经使能,则会响应SCI的接收中断。

861F2812PIE中断INTx.8INTx.7INTx.6INTx.5INTx.4INTx.3INTx.2INTx.1INT1WAKEINTTINT0ADCINTXINT2XINT1PDPINTBPDPINTAINT2T1OFINTT1UFINTT1CINTT1PINTCMP3INTCMP2INTCMP1INTINT3CAPINT3CAPINT2CAPINT1T2OFINTT2UFINTT2CINTT2PINTINT4T3OFINTT3UFINTT3CINTT3PINTCMP6INTCMP5INTCMP4INTINT5CAPINT6CAPINT5CAPINT4T4OFINTT4UFINTT4CINTT4PINTINT6MXINTMRINTSPITXINTASPIRXINTAINT7INT8INT9SCITXINTBSCIRXINTBSCITXINTASCIRXINTAINT10INT11INT12ECAN0INTECAN1INT共45个中断源

8627.6.2SCI中断方式863SCI发送和接收都可以采用中断控制。SCI控制寄存器SCICTL2中有一个发送缓冲寄存器准备好标志位TXRDY。当发送缓冲寄存器准备好标志位TXRDY置1时,会产生发送中断事件。如果各级中断都已经使能,则会响应SCI的发送中断函数。

8637.6.2SCI中断方式864SCI接收状态寄存器SCIRXST中有接收器准备好标志位RXRDY和SCI间断检测标志位BRKDT,还有SCI接收器错误标志位RXERROR。SCI接收器错误标志位RXERROR是间断检测标志BRKDT、帧错误标志FE、超时错误标志OE和奇偶校验错误标志PE的逻辑或。发送器和接收器有独立的中断使能位。当禁止中断时,中断不能够被响应。但是条件标志保持有效状态,可以反映发送和接收的状态。

8647.6.2SCI中断方式865SCI有着独立的外设中断向量用于接收和发送。接收中断请求和发送中断请求在同一个时间产生时,接收中断请求的优先级高于发送中断请求的优先级。需要减少接收器数据溢出的可能性。当接收器准备好标志位RXRDY置1时,会产生接收中断标志。如果各级中断已经使能,则会响应SCI的接收中断。

8657.6.2SCI中断方式866外设中断的标志位一定要用软件复位,SCI特殊。原因:当发送器缓冲寄存器SCITXBUF的数据到达TXSHF寄存器时,发送缓冲寄存器准备好标志位TXRDY置1,当CPU将数据写入SCITXBUF时,TXRDY自动清0。当数据从RXSHF接收移位寄存器移入接收缓冲寄存器SCIRXBUF时,SCI接收器准备好标志位RXRDY从0变为1,表明一个新的字符已经接收。当CPU将数据从SCIRXBUF读出时,RXRDY会自动清0。发送和接收这两个中断标志位都是可以自动清零的,所以无需手动复位。这是与其他外设中断不一样的地方。

866例7.1SCI采用中断方式接收数据7.6.2SCI中断方式867#include"DSP28_Device.h“unsignedintuart_sendtype;unsignedintSci_VarRx[100];unsignedinti,j;unsignedintSend_Flag;voidmain(void){InitSysCtrl();//系统控制初始化DINT;//禁止全局中断INTMIER=0x0000;//禁止CPU中断IFR=0x0000;//CPU中断标志寄存器清零InitPieCtrl();//初始化PIE控制寄存器InitPieVectTable();//初始化PIE中断向量表InitSci();//初始化SCI

8677.6.2SCI中断方式868for(i=0;i<100;i++){Sci_VarRx[i]=0;}i=0;j=0;Send_Flag=0;//发送标志清零EALLOW;//解除寄存器保护PieVectTable.RXAINT=&SCIRXINTA_ISR;//SCI接收中断函数入口地址装入中断向量表EDIS;//使能寄存器保护IER|=M_INT9;//使能CPU级INT9中断EINT;//使能全局中断INTMERTM;//使能全局实时中断DBGM

8687.6.2SCI中断方式869for(;;){if((SciaTx_Ready()==1)&&(Send_Flag==1)){SciaRegs.SCITXBUF=Sci_VarRx[i];//数据送到发送数据缓冲寄存器SCITXBUF中Send_Flag=0;//发送标志清零i++;if(i==j){i=0;j=0;}}}}

8697.6.2SCI中断方式870interruptvoidSCIRXINTA_ISR(void)//SCI-A接收中断函数{PieCtrl.PIEACK.bit.ACK9=1;if(SciaRx_Ready()==1){Sci_VarRx[j]=SciaRegs.SCIRXBUF.all;//读取接收数据缓冲寄存器SCIRXBUF的值Send_Flag=1;//接收数据后将发送标志置1j++;if(j==100){j=0;}}}

8707.6.2SCI中断方式871intSciaTx_Ready(void){unsignedinti;if(SciaRegs.SCICTL2.bit.TXRDY==1)//发送缓冲寄存器准备好标志位TXRDY为1{i=1;//返回1说明发送器准备就绪,可以进行新的数据发送}else{i=0;}return(i);}

871intSciaRx_Ready(void){unsignedinti;if(SciaRegs.SCIRXST.bit.RXRDY==1)//接收器准备好标志位RXRDY为1{i=1;//返回1说明数据接收已经就绪,等待CPU读取数据}else{i=0;}return(i);}7.6.2SCI中断方式872

872SCI中断举例873voidInitSci(void){//InitializeSCI-A:EALLOW;GpioMuxRegs.GPFMUX.all=0x0030;//GPIOF4、GPIOF5为外设功能,串口接收与发送EDIS;SciaRegs.SCICCR.all=0x07;//8位数据,1个停止位,无奇偶校验SciaRegs.SCICTL1.all=0x03;//发送器、接收器使能SciaRegs.SCICTL2.all=0x03;//使能TXRDY、RXRDY中断SciaRegs.SCIHBAUD=0x00;SciaRegs.SCILBAUD=0xF3;//19200波特率SciaRegs.SCICTL1.all=0x23;//SCI退出复位状态PieCtrl.PIEIER9.bit.INTx1=1;//SCIRXINTAPieCtrl.PIEIER9.bit.INTx2=1;//SCITXINTA}合众达DEC2812SCI例7.2

873SCI中断举例874

874//发送中断函数应用举例interruptvoidSCITXINTA_ISR(void)//SCI-A{PieCtrl.PIEACK.bit.ACK9=1;//释放PIE同组中断if(SciaTx_Ready()==1){SciaRegs.SCITXBUF=SCI_Senddata;//SCI_Senddata为需要发送的数据}}SCI中断举例875其他:

8757.6.3SCI发送和接收独立的中断8761、发送中断TXINT:只有一个(1)首先置1发送缓冲寄存器使能位TXINTENA(SCICTL2.0)。(2)只要发送数据缓冲寄存器SCITXBUF中数据传送到发送移位寄存器TXSHF中,就会产生发送中断。该操作将发送缓冲寄存器准备好标志位TXRDY置1(SCICTL2.7),表示发送数据缓冲寄存器SCTXIBUF已经准备好从CPU接收下一个数据。

8768772、接收中断RXINT:有三种如果接收缓冲寄存器/间断中断使能RX/BKINTENA(SCICTL2.1)为1,下列事件发生时会产生一个接收中断。(1)SCI接收器准备好(RXRDY)中断SCI接收到一个完整的帧,数据从接收移位寄存器RXSHF移入到接收数据缓冲寄存器SCIRXBUF时,SCI接收器准备好标志位RXRDY(SCIRXST.6)从0变为1表明一个新的字符已经接收。如果接收缓冲寄存器/间断中断使能位RX/BKINTENA(SCICTL2.1)为1,将发出一个接收中断请求,CPU读取接收数据缓冲寄存器SCIRXBUF中的值,接收器准备好标志位RXRDY清零。7.6.3SCI发送和接收独立的中断

8777.6.3SCI发送和接收独立的中断878(2)SCI间断检测(BRKDT)中断接收引脚SCIRXD在丢失第一个停止位后有10位的连续低电平,SCI认为接收产生了一次间断。SCI间断检测标志位BRKDT(SCIRXST.5)被置1。如果接收缓冲寄存器/间断使能位RX/BKINTENA(SCICTL2.1)已被置1,将发出一个接收中断请求,但没有数据装入接收数据缓冲寄存器SCIRXBUF中。即使接收器休眠位SLEEP已被置1,也会发生BRKDT中断。

8787.6.3SCI发送和接收独立的中断8793.接收器错误(RXERROR)中断接收器错误标志位RXERROR是间断检测BRKDT、帧错误FE、超时错误OE及奇偶校验错误PE标志的“逻辑或”操作。即检测到这四者之一出错,则接收器错误标志位RXERROR置1。(1)FE:当检测不到一个期望的停止位时,帧错误标志FE置位。(2)OE:在前一个字符被CPU读取前,有新的字符送到接收数据缓冲寄存器SCIRXBUF中时,置位超时错误标志OE,此时前一个字符被覆盖。

8798803.接收器错误(RXERROR)中断(3)PE:当接收字符中1的个数和它的奇偶校验位之间不匹配时(含地址位),且校验模式被使能时,奇偶校验错误标志PE置位。(4)间断检测BRKDT。接收引脚SCIRXD在丢失第一个停止位后有10位的连续低电平,SCI认为接收产生了一次间断。SCI间断检测标志位BRKDT(SCIRXST.5)被置1。7.6.3SCI发送和接收独立的中断

8807.7SCI多处理器通信881根据地址信息识别方法的不同,多处理器通信方式分为空闲线模式和地址位模式。7.7.1多处理器通信概述

8817.7.2空闲线多处理器模式882在空闲线多处理器模式中,通信控制寄存器SCICCR的D3即SCI多处理器模式控制位ADDR/IDLEMODE=0,数据块与数据块之间有一段空闲时间,这段时间比数据块中的帧间距要长。如果一帧之后有一段10个位或者更长的空闲时间,就表明是一个新数据块的开始。

8827.7.2空闲线多处理器模式883空闲线模式在地址字节之前预留一个“静空间”,该模式没有额外的地址/数据位。通过静空间判断是否是一个数据块的开始。两个数据块之间的间隔大于10位。一个数据块内两帧之间间隔小于10位。

8837.7.2空闲线多处理器模式884

8847.7.2空闲线多处理器模式885在空闲线模式中,块与块之间有一段比较长的空闲时间,这段时间要明显长于块内帧与帧之间的空闲时间。在某一个数据块中,第一帧代表地址信息,后面的帧为数据信息。地址信息还是数据信息是通过帧与帧之间的空闲间隔来判断的。当帧与帧之间的空闲间隔超过10个位时,表示新的数据块开始,而且其第一帧为地址信息。

8857.7.2地址位多处理器模式886在地址位多处理器模式中,通信控制寄存器SCICCR的D3位即SCI多处理器模式控制位ADDR/IDLEMODE=1,每帧的最后一个数据位后有一个附加的地址位。数据块第一帧的地址位设置为1,其余帧的地址位为0。对数据块之间的空闲周期没有要求。这种模式下数据块之间不需要等待,因此在处理小数据块时比空闲线多处理器模式效率高。

8867.7.2地址位多处理器模式887

8877.7.2地址位多处理器模式888某一个数据块中的第一帧是地址信息,第二帧是数据信息,然后留有一些空余空间之后,又有一个数据块,第一帧也是地址信息,后面是数据信息。在通信格式中加入地址位判断信息是数据还是地址的方式叫做多处理器通信的地址位模式。当处理器发出一串数据时,叫做数据块,由一个一个的帧构成。帧就是带有格式信息的字符数据。第一帧地址信息后面的一个位是1,而第2帧数据信息后面的一个位是0。这一位称为地址位,表示这个帧的数据是地址信息还是数据信息。

888识别地址字节889空闲线模式中数据格式里没有额外的地址位,在处理10个字节以上的数据块时比地址位模式更为有效,被应用于典型的非多处理器SCI通信场合。地址位模式由于有专门的位来进行识别地址信息,所以数据块之间不需要空闲时间等待,这种模式在处理一些小的数据块时更为有效;

8897.8SCI发送与接收数据应用实例890ICL3232E为RS-232信号传输接收芯片,工作电压在+3.0V~+5.5V。通过外接四个自举电容将输入的TTL电平转换成负逻辑电平即-3V~-15V为逻辑“1”,+3V~+15V为逻辑“0”。ICL3232E典型工作电路如图7-24所示。

8907.8SCI发送与接收数据应用实例891例7.2:基于DSP的电路板通过SCIRXDA引脚接收计算机发送来的数据,再从DSP电路板上SCITXDA引脚将数据发送到计算机上。在图7-27中XSCITXDA和XSCIRXDA是SCI-A的发送和接收引脚,XSCITXDB和XSCIRXDB是SCI-B的发送和接收引脚。将DSP的SCI-A通过电平转换芯片ICL3232E配置成RS232通信协议;将DSP的SCI-B通过电平转换芯片ISL83072E配置成RS485通信协议。经电平转换后连接到DB9连接器上。

8917.8SCI发送与接收数据应用实例892

8927.8SCI发送与接收数据应用实例893(1)在文件SCI_TEST.c中,主程序设计如下所示。#include"DSP28_Device.h"#defineSCIA_INT1unsignedintSci_VarRx[100];unsignedinti,j;unsignedintSend_Flag;voidmain(void){InitSysCtrl();//系统控制初始化DINT;//禁止全局中断INTMIER=0x0000;//禁止CPU中断IFR=0x0000;//CPU中断标志寄存器清零InitPieCtrl();//初始化PIE中断控制寄存器InitPieVectTable();//初始化PIE中断向量表InitSci();//初始化SCI-Afor(i=0;i<100;i++){Sci_VarRx[i]=0;}

8937.8SCI发送与接收数据应用实例894i=0;j=0;Send_Flag=0;//发送标志清零#ifSCIA_INT//SCIA_INT=1,中断方式EALLOW;//解除寄存器保护PieVectTable.RXAINT=&SCIRXINTA_ISR;//装入SCI_A接收中断服务程序入口地址EDIS;//使能寄存器保护IER|=M_INT9;//使能CPU级INT9中断,SCI_A接收中断是INT9.1#endifEINT;//使能全局中断INTMERTM;

8947.8SCI发送与接收数据应用实例895for(;;){if((SciaTx_Ready()==1)&&(Send_Flag==1)){SciaRegs.SCITXBUF=Sci_VarRx[i];//数据送到发送数据缓冲寄存器SCITXBUF中Send_Flag=0;//发送标志清零i++;if(i==j){i=0;j=0;}}

8957.8SCI发送与接收数据应用实例896#if!SCIA_INT//SCIA_INT=0,查询方式if(SciaRx_Ready()==1){Sci_VarRx[j]=SciaRegs.SCIRXBUF.all;//读取接收数据缓冲寄存器SCIRXBUF的值Send_Flag=1;//接收到数据后将发送标志置1j++;if(j==100){j=0;}}#endif}}

8967.8SCI发送与接收数据应用实例897在main()函数中的for(;;)循环实现发送数据功能。(2)在DSP28_Device.h文件中#defineSCIA_INT1#defineM_INT90x0100#defineSCIA_INT1说明是采用中断方式接收函数。若改为#defineSCIA_INT0,则采用查询方式接收函数。

8977.8SCI发送与接收数据应用实例898(3)在DSP28_Sci.c文件中#include"DSP28_Device.h"voidInitSci(void){EALLOW;//解除寄存器保护GpioMuxRegs.GPFMUX.all=0x0030;//GPIOF4、GPIOF5为外设功能,串口接收与发送EDIS;//使能寄存器保护SciaRegs.SCICCR.all=0x07;//8位数据,1个停止位,无奇偶校验SciaRegs.SCICTL1.all=0x03;//发送器、接收器使能SciaRegs.SCICTL2.all=0x03;//使能TXRDY和RXRDY中断SciaRegs.SCIHBAUD=0x00;//BRR=0x00F3,波特率选择为19200bpsSciaRegs.SCILBAUD=0xF3;SciaRegs.SCICTL1.all=0x23;//SCI退出复位状态PieCtrl.PIEIER9.bit.INTx1=1;//SCIRXINTA接收中断使能PieCtrl.PIEIER9.bit.INTx2=1;//SCITXINTA发送中断使能}

8987.8SCI发送与接收数据应用实例899/**************************************************name:intSciaTx_Ready(void)input:noneoutput:i1:ready0:busy******************************************************/intSciaTx_Ready(void){unsignedinti;if(SciaRegs.SCICTL2.bit.TXRDY==1)//发送缓冲寄存器准备好标志位TXRDY为1{i=1;//返回1说明发送器准备就绪,可以进行新的数据发送}else{i=0;}return(i);}

8997.8SCI发送与接收数据应用实例900/*********************************************************name:intSciaRx_Ready(void)input:noneoutput:i1:newdata0:none******************************************************/intSciaRx_Ready(void){unsignedinti;if(SciaRegs.SCIRXST.bit.RXRDY==1)//接收器准备好标志位RXRDY为1{i=1;//返回1说明数据接收已经就绪,等待CPU读取数据}else{i=0;}return(i);}

9007.8SCI发送与接收数据应用实例901(4)在文件DSP28_DefaultIsr.c文件中interruptvoidSCIRXINTA_ISR(void)//SCI-A接收中断函数{PieCtrl.PIEACK.bit.ACK9=1;//中断应答寄存器写1清零,释放PIE同组中断if(SciaRx_Ready()==1){Sci_VarRx[j]=SciaRegs.SCIRXBUF.all;//从SCI接收数据缓冲寄存器SCIRXBUF中接收数据Send_Flag=1;//接收到数据后将发送标志置1j++;if(j==100){j=0;}}}

9017.8SCI发送与接收数据应用实例902连接计算机串口和电路板串口,利用串口调试助手进行数据通信。将串口调试助手界面中的波特率选择为19200bps,在串口调试助手中输入发送数据1234567890,选择自动发送,十六进制,程序运行结果如图7-28所示。在接收中断服务程序中语句Send_Flag=1;处设置断点,可以看到接收数组中的接收数据。图7-29是CCS调试界面WatchWindow中显示数组Sci_VarRx[j]中接收的数据为0x0012。

9027.8SCI发送与接收数据应用实例903

9037.8SCI发送与接收数据应用实例904

904SCI的增强特性905SCIFIFO描述发送器与接收器各有16级FIFO,有3个专门的寄存器控制;复位时,SCI工作于标准模式,禁止FIFO功能。自动波特率检测自动检测SCI通信的波特率,并刷新BRR寄存器。

9057.8SCIFIFO寄存器9067.9.1SCIFIFO发送寄存器SCIFFTXSCIFIFO发送寄存器SCIFFTX(SCIFIFOTransmitRegister)地址为705Ah。

9067.8SCIFIFO寄存器9077.9.2SCIFIFO接收寄存器SCIFFRXSCIFIFO接收寄存器SCIFFRX(SCIFIFOReceiveRegister)地址为705Bh。

9077.8SCIFIFO寄存器9087.9.3SCIFIFO控制寄存器SCIFFCTSCIFIFO控制寄存器SCIFFCT(SCIFIFOControlRegister)地址为705Ch。

9087.10SCIFIFO功能描述909FIFO模式下的发送数据在FIFO模式下,当发送移位寄存器TXSHF最后一位被移出时,经过一个可选择的延迟,发送移位寄存器TXSHF中的值直接从发送FIFO中加载,不需要使用发送移位寄存器TXSHF和发送FIFO之间的发送数据缓冲寄存器SCITXBUF。在标准SCI模式下的一个字节发送数据缓冲寄存器SCITXBUF是作为在发送FIFO和发送移位寄存器TXSHF之间的发送缓冲器。

9097.11SCIFIFO中断9107.11.1SCIFIFO可编程中断级别发送FIFO和接收FIFO能够产生CPU中断。中断触发的产生是当SCIFIFO发送寄存器SCIFFTX的D12~D8即发送FIFO状态位TXFFTST4~0与SCIFIFO发送寄存器SCIFFTX的D4~D0即中断级别位TXFFIL4~0匹配时(小于或等于)就能触发一个中断。对SCIFIFO的发送和接收提供了一个可编程的中断触发条件。接收FIFO触发级别的默认值为11111B,发送FIFO触发级别的默认值为00000B。

9107.11.1SCIFIFO可编程中断级别9111.发送FIFO中断可以控制有多少个数据时产生发送中断。SCIFIFO发送寄存器SCIFFTX的D12~D8即发送FIFO状态位TXFFTST4~0表示发送FIFO中还有多少个数据没有发送。如果发送FIFO中数据即发送FIFO状态位TXFFTST4~0小于等于SCIFIFO发送寄存器SCIFFTX的D4~D0即中断级别位TXFFIL4~0中的值时产生发送中断。通知CPU可以向FIFO中写数据。

9117.11.1SCIFIFO可编程中断级别912假设编程将发送中断级别位TXFFIL4~0设置为01000B即8,那么当FIFO队列中还剩8个数据需要发送时,此时TXFFTST4~0中的值为8,正好与发送中断级别位TXFFIL4~0中的值相等,此时发送FIFO就会产生发送中断匹配事件,产生发送中断。复位时,发送中断级别位TXFFIL4~0中的默认值为00000B,表示发送FIFO中数据全部发送完毕产生发送中断请求。

9127.11.1SCIFIFO可编程中断级别9132.接收FIFO中断SCIFIFO接收寄存器SCIFFRX的D12~D8即接收FIFO状态位RXFFTST4~0大于等于SCIFIFO接收寄存器SCIFFRX的D4~D0即中断级别位RXFFIL4~0中的值时产生接收中断,通知CPU读取数据。假设编程将接收中断级别位RXFFIL4~0设置为10000B即16,那么当FIFO中接收到16个数据时,接收FIFO状态位RXFFTST4~0中的值为16,正好与接收中断级别位RXFFIL4~0中的值相等时,接收FIFO就会产生接收中断匹配事件,产生接收中断。

9137.11.2SCIFIFO中断标志和使能逻辑914

9147.11.2SCIFIFO中断标志和使能逻辑915FIFO选择SCI中断源中断标志中断使能FIFO使能SCIFFENA中断线SCI不使用FIFO接收错误RXERRORRXERRINTENA0RXINT接收间断BRKDTRX/BKINTENA0RXINT数据接收RXRDYRX/BKINTENA0RXINT发送空TXRDYTXINTENA0TXINTSCI使用FIFO接收错误和接收间断RXERRORRXERRINTENA1RXINTFIFO接收(溢出和匹配)RXFFOVFRXFFILRXFFIENA1RXINTFIFO发送匹配TXFFILTXFFIENA1TXINT自动波特率自动波特率检测ABD无关xTXINT表7-13SCI中断标志

9157.11.2SCIFIFO中断标志和使能逻辑916一、SCI不使用FIFO1.接收中断RXINT有三种(1)接收错误(RXERROR标志产生)(2)接收间断(BRKDT标志产生)(3)正常的数据接收(接收器准备好标志位RXRDY=1)。2.发送中断TXINT当发送缓冲寄存器准备好标志TXRDY=1时,产生发送中断TXINT。

9167.11.2SCIFIFO中断标志和使能逻辑917二、SCI使用FIFO1.接收中断RXINT有两种(1)接收错误和接收间断(RXERROR标志产生)(2)FIFO接收a.接收FIFO溢出(RXFFOVF标志产生)。b.当产生FIFO接收匹配时即接收FIFO状态位RXFFTST4~0中的值大于等于中断级别位RXFFIL4~0中的值时产生接收中断RXINT。

9177.11.2SCIFIFO中断标志和使能逻辑9182.发送中断TXINT当产生FIFO发送匹配时即发送FIFO状态位TXFFTST4~0中的值小于等于中断级别位TXFFIL4~0中的值时,产生发送中断TXINT。

9187.12SCIFIFO应用举例919例7.3:利用SCIFIFO发送字符串Hello!。程序功能是执行系统初始化子程序后,初始化SCI-A。发送字符串Hello!,执行while(1);。说明:(1)初始化SCI-A程序包括配置SCI-A接收引脚SCIRXDA和发送引脚SCITXDA,复位SCI的发送和接收通道。设置SCI通信的数据格式和通信协议。正常的非多处理器通信采用空闲线模式。设置波特率为9600bps。使能SCI发送和接收功能。使能SCIFIFO功能,这样SCIFIFO的三个寄存器才有效。

9197.12SCIFIFO应用举例920(2)根据传送的数据设置中断级别位。通过SCIFIFO接收寄存器SCIFFRX的RXFFIL4~0设置接收FIFO中断级别位。通过SCIFIFO发送寄存器SCIFFTX的TXFFIL4~0设置发送FIFO中断级别位。用语句SciaRegs.SCIFFRX.bit.RXFFIL=16;设置接收FIFO中断级别位,即当接收FIFO中接收到16个字符时,产生接收中断请求。用语句SciaRegs.SCIFFTX.bit.TXFFIL=0;设置发送FIFO中断级别位为0。说明FIFO中数据全部发送完毕后产生发送中断请求。本题中发送没有采用中断。

9207.12SCIFIFO应用举例921(3)使能中断(包含外设级、PIE级和CPU级),设置中断函数入口地址更新中断向量。(4)退出复位状态。即通过SciaRegs.SCICTL1.bit.SWRESET=1;对SCI控制寄存器1(SCICTL1)的软件复位SWRESET写1使SCI退出复位状态。通过SciaRegs.SCIFFTX.bit.SCIRST=1;对SCIFIFO发送寄存器SCIFFTX的SCIRST位置1,使SCIFIFO恢复SCIFIFO的发送或接收。

921

922DSP原理及应用第八章A/D转换模块8.1ADC模块结构和功能8.2ADC寄存器描述8.3自动排序器原理8.4A/D转换配置方法8.5顺序采样与同步采样应用举例8.6ADC时钟ADCCLK8.7ADC寄存器8.9ADC模块应用举例923

9238.1ADC模块结构和功能92412位ADC模块内含采样/保持电路,25MHz的ADC时钟频率,转换时间短。具有灵活的中断控制,允许每个或每隔一个序列转换结束产生中断请求。

9248.1ADC模块结构和功能925ADC模块功能框图

9258.1ADC模块结构和功能926TMS320F2812的ADC模块是一个12位分辨率的模数转换器。具有16个通道,可以配置为2个独立的8通道模块。也可以级联成一个16通道的模块。模拟输入电压范围为0~3V。输入通道ADCINA0~ADCINA7使用采样保持器S/H-A,输入通道ADCINB0~ADCINB7使用采样保持器S/H-B。两个采样/保持器,采样时间可独立控制。每次转换的通道可通过两个功能强大的自动排序器设定。

9268.1ADC模块结构和功能9273.ADC具有多路选通输入。可在一次采样中同时实现16路自动转换的自动排序。虽然有多个输入通道和两个排序器,但在ADC模块中只有一个转换器。4.排序器可以工作在启动/停止模式,允许多个按时间排序的触发源同步转换。事件管理器EVA和EVB触发源可以独立工作在双排序器模式。

9279285.2812具有2个排序器SEQ1和SEQ2,分别对应于2个独立的8通道模块。当ADC级联成一个16通道的模块时,SEQ1和SEQ2也级联成一个16状态的排序器SEQ。对于每个排序器,一旦转换结束,已选择采样的通道值就会被保存到各个通道的转换结果寄存器中。6.ADC模块总共有16个结果寄存器,分别用于保存16个通道的转换结果。16个结果寄存器存放A/D转换结果,输入模拟电压值与转换后数字量的数值对应关系为:数字值=4095×(输入模拟量-ADCLO)/3上述公式中4095对应于满量程输入为3V的转换结果,ADCLO为参考电平,实际使用时将其接地。8.1ADC模块结构和功能

928929输入模拟电压值与转换后的数值对应关系

9299307.多个触发源可以启动A/D转换。包括软件启动、事件管理器A和事件管理器B的多个触发源启动和外部引脚触发启动。多个触发源启动A/D转换过程:(1)S/W:软件立即启动。(2)EVA:事件管理器A(在EVA中有多个事件源可启动ADC转换)。EVB:事件管理器B(在EVB中有多个事件源可启动ADC转换)。(3)外部引脚GPIOE1/XINT2_ADCSOC。8.1ADC模块结构和功能

9309318.ADC有顺序采样(SequentialSampling)或同步采样(SimultaneousSampling)两种方式。8.1ADC模块结构和功能

931932

9329338.3自动排序器原理自动排序器可以对模拟通道的转换顺序进行排序。ADC排序器由两个8状态排序器SEQ1和SEQ2组成,也可以级联成一个16状态排序器。这里的状态指排序器中自动转换的模拟输入通道数。排序器有两种工作模式:单排序器即级联模式,双排序器模式。单排序器可以有16个转换通道。双排序器模式为两个独立的8通道转换。

933934图8-2单排序器(级联)模式的自动排序ADC框图

934935图8-3双排序器模式的自动排序ADC框图

935936排序器SEQ1排序器SEQ2级联排序器SEQ软件触发即软件SOC(Start-of-conversion)软件触发即软件SOC(Start-of-conversion)软件触发即软件SOC(Start-of-conversion)事件管理器A(EVA的多种事件)事件管理器EVB的多种事件事件管理器EVA的多种事件外部GPIOE1/XINT2_ADCSOC引脚事件管理器EVB的多种事件外部GPIOE1/XINT2_ADCSOC引脚表8-2ADC寄存器不同排序器下的不同触发源

936937ADC的16个通道可以通过编程选择在某一时刻是哪个通道被选通进行采样。通过ADC输入通道选择排序控制寄存器ADCCHSELSEQx(x=1,2,3,4)来实现。每一个输入通道选择排序控制寄存器都是16位的,被分成4个功能位CONVxx,每一个功能位占据寄存器的4位;在ADC转换的过程中,当前CONVxx位定义了要进行采样和转换的引脚。8.4A/D转换配置方法

9379388.4A/D转换配置方法ADCInputChannelSelectSequencingControlRegisters(ADCCHSELSEQ1)ADCInputChannelSelectSequencingControlRegisters(ADCCHSELSEQ2)ADCInputChannelSelectSequencingControlRegisters(ADCCHSELSEQ3)ADCInputChannelSelectSequencingControlRegisters(ADCCHSELSEQ4)

9388.4.1ADC输入通道选择排序控制寄存器Bits15-12Bits11-8Bits7-4Bits3-00x007103CONV03CONV02CONV01CONV00ADCCHSELSEQ10x007104CONV07CONV06CONV05CONV04ADCCHSELSEQ20x007105CONV11CONV10CONV09CONV08ADCCHSELSEQ30x007106CONV15CONV14CONV13CONV12ADCCHSELSEQ4设置转换序列的通道以及先后顺序ADCInputChannelSelectSequencingControlRegisters

939940ADC可工作于顺序采样和同步采样两种模式。顺序采样,按照顺序一个通道一个通道的进行采样;ADCINA0,ADCINA1……ADCINA7;ADCINB0,ADCINB1……ADCINB7。同步采样,一对通道一对通道的进行采样;ADCINA0和ADCINB0同时采样;ADCINA1和ADCINB1同时采样;……ADCINA7和ADCINB7同时采样。8.4.2顺序采样和同步采样

940941(1)在顺序采样模式下,CONVxx的4位均用来定义输入引脚。最高位为0时,说明采样的是A组,采样保持器用的是S/H-A;最高位为1时,说明采样的是B组,采样保持器用的是S/H-B。而低3位定义的是偏移量,决定了某一组内的特定引脚。如果CONVxx的数值是0101b,则说明选择的输入通道是ADCINA5引脚。如果CONVxx的数值是1011b,则说明选择的输入通道是ADCINB3引脚。8.4.2顺序采样和同步采样

941942(2)在同步采样模式下,因为是一对一对进行采样的,S/H-A和S/H-B会同时使用到;CONVxx的最高位被舍弃,只有低3位的数据才是有效位。如果CONVxx的数值为0101b,则S/H-A对ADCINA5进行采样,而S/H-B对ADCINB5进行采样。如果CONVxx的数值是1011b,则S/H-A对ADCINA3进行采样,而S/H-B对ADCINB3进行采样8.4.2顺序采样和同步采样

942943在双排序发生器模式下;SEQ1将用到ADCCHSELSEQ1和ADCCHSELSEQ2;SEQ2将用到ADCCHSELSEQ3和ADCCHSELSEQ4。8.4.2顺序采样和同步采样

943944最大转换通道寄存器:ADCMAXCONV位6~0MAXCONVn:定义一次自动转换最多可以转换的通道个数。一次转换的个数为MAXCONVn+1。书P376MaximumConversionChannelsRegister8.4.3确定采样通道总数

944945最大转换通道寄存器ADCMAXCONV,决定了本次采样序列所要进行采样的通道总数;当ADC工作在两个独立的8通道排序器时;排序器SEQ1使用位MAXCONV1_0~2;排序器SEQ2使用位MAXCONV2_0~2。当ADC工作在1个级联的16通道排序器时;SEQ使用位MAXCONV1_0~3。最大通道数等于(MAXCONVn+1)。如果要转换6个通道,则需要将MAXCONVn的值设定为5。8.4.3确定采样通道总数

945946顺序采样、同步采样;双排序器模式、级联模式;前者讲的是采样方式,而后者讲的是排序器模式。在双排序器模式下可以采用顺序采样和同步采样;在级联模式下可以采用顺序采样和同步采样。8.5顺序采样与同步采样应用举例

946947ADC控制寄存器1:ADCTRL1位14RESET:模数转换模块软件复位位。为1,复位模块。位13~12SUSMOD1~SUSMOD0:仿真悬挂模式。位11~8ACQ_PS3~ACQ_PS0:采样时间窗宽度位。位7CPS:内核时钟预分频器。设定对外设高速时钟(HSPCLK)的分频。位6CONTRUN:连续运行位。0:启动/停止模式。1:连续转换模式。位5SEQOVRD:排序器超越模式位。1:使能超越模式。位4SEQCASC:级联排序器工作模式位。0:双排序器工作模式。1:级联模式。书P382

947948ADC控制寄存器3:ADCTRL3位7~6ADCBGRFDN1、ADCBGRFDN0:模数转换内部带隙(Bandgap)和参考电压源电路的电源上电。这两位控制ADC内部参考电压源电路的上电与断电。位5ADCPWDN:模数转换模块掉电控制位。位0SMODE_SEL:采样模式选择位。0:顺序采样。1:同歩采样。书P385

948949ADC控制寄存器1(ADCTRL1)的D4即SEQCASC位选择双排序器模式还是级联模式,ADC控制寄存器3(ADCTRL3)的D0即SMODESEL位选择顺序采样模式还是同步采样模式。如下面语句所示。AdcRegs.ADCTRL1.bit.SEQ_CASC=0;//设置双排序器AdcRegs.ADCTRL1.bit.SEQ_CASC=1;//设置级联模式AdcRegs.ADCTRL3.bit.SMODE_SEL=0;//设置顺序采样模式AdcRegs.ADCTRL3.bit.SMODE_SEL=1;//设置同步采样模式8.5顺序采样与同步采样应用举例

949950例8.1级联和顺序采样模式AdcRegs.ADCTRL1.bit.SEQ_CASC=1;//设置级联模式AdcRegs.ADCTRL3.bit.SMODE_SEL=0;//设置顺序采样模式AdcRegs.MAX_CONV.all=0x000F;//排序器最大转换通道数为16,一次采1个通道,总共可采16个通道。/*排序器将用到ADC输入通道选择排序控制寄存器ADCCHSELSEQ1、ADCCHSELSEQ2、ADCCHSELSEQ3、ADCCHSELSEQ4*/AdcRegs.CHSELSEQ1.bit.CONV00=0x0;//采样ADCINA0AdcRegs.CHSELSEQ1.bit.CONV01=0x1;//采样ADCINA1AdcRegs.CHSELSEQ1.bit.CONV02=0x2;//采样ADCINA2AdcRegs.CHSELSEQ1.bit.CONV03=0x3;//采样ADCINA3AdcRegs.CHSELSEQ2.bit.CONV04=0x4;//采样ADCINA4AdcRegs.CHSELSEQ2.bit.CONV05=0x5;//采样ADCINA5AdcRegs.CHSELSEQ2.bit.CONV06=0x6;//采样ADCINA6AdcRegs.CHSELSEQ2.bit.CONV07=0x7;//采样ADCINA7

950951例8.1级联和顺序采样模式AdcRegs.CHSELSEQ3.bit.CONV08=0x8;//采样ADCINB0AdcRegs.CHSELSEQ3.bit.CONV09=0x9;//采样ADCINB1AdcRegs.CHSELSEQ3.bit.CONV10=0xA;//采样ADCINB2AdcRegs.CHSELSEQ3.bit.CONV11=0xB;//采样ADCINB3AdcRegs.CHSELSEQ4.bit.CONV12=0xC;//采样ADCINB4AdcRegs.CHSELSEQ4.bit.CONV13=0xD;//采样ADCINB5AdcRegs.CHSELSEQ4.bit.CONV14=0xE;//采样ADCINB6AdcRegs.CHSELSEQ4.bit.CONV15=0xF;//采样ADCINB7

951952例8.1级联和顺序采样模式

952953例8.2双排序器和顺序采样模式AdcRegs.ADCTRL1.bit.SEQ_CASC=0;//设置双排序器模式AdcRegs.ADCTRL3.bit.SMODE_SEL=0;//设置顺序采样模式AdcRegs.MAX_CONV.all=0x0077;//每个排序器最大转换通道数为8,可采样16个通道/*排序器SEQ1将用到ADC输入通道选择排序控制寄存器ADCCHSELSEQ1、ADCCHSELSEQ2,排序器SEQ2将用到ADC输入通道选择排序控制寄存器ADCCHSELSEQ3、ADCCHSELSEQ4*/AdcRegs.CHSELSEQ1.bit.CONV00=0x0;//采样ADCINA0AdcRegs.CHSELSEQ1.bit.CONV01=0x1;//采样ADCINA1AdcRegs.CHSELSEQ1.bit.CONV02=0x2;//采样ADCINA2AdcRegs.CHSELSEQ1.bit.CONV03=0x3;//采样ADCINA3AdcRegs.CHSELSEQ2.bit.CONV04=0x4;//采样ADCINA4AdcRegs.CHSELSEQ2.bit.CONV05=0x5;//采样ADCINA5AdcRegs.CHSELSEQ2.bit.CONV06=0x6;//采样ADCINA6AdcRegs.CHSELSEQ2.bit.CONV07=0x7;//采样ADCINA7

953954例8.2双排序器和顺序采样模式AdcRegs.CHSELSEQ3.bit.CONV08=0x8;//采样ADCINB0AdcRegs.CHSELSEQ3.bit.CONV09=0x9;//采样ADCINB1AdcRegs.CHSELSEQ3.bit.CONV10=0xA;//采样ADCINB2AdcRegs.CHSELSEQ3.bit.CONV11=0xB;//采样ADCINB3AdcRegs.CHSELSEQ4.bit.CONV12=0xC;//采样ADCINB4AdcRegs.CHSELSEQ4.bit.CONV13=0xD;//采样ADCINB5AdcRegs.CHSELSEQ4.bit.CONV14=0xE;//采样ADCINB6AdcRegs.CHSELSEQ4.bit.CONV15=0xF;//采样ADCINB7

954955例8.2双排序器和顺序采样模式

955956例8.3级联和同步采样模式AdcRegs.ADCTRL1.bit.SEQ_CASC=1;//设置级联模式AdcRegs.ADCTRL3.bit.SMODE_SEL=1;//设置同步采样模式AdcRegs.MAX_CONV.all=0x0007;//排序器最大转换通道数为8,一次采2个通道,总共可采16个通道//排序器将用到ADC输入通道选择排序控制寄存器ADCCHSELSEQ1、ADCCHSELSEQ2AdcRegs.CHSELSEQ1.bit.CONV00=0x0;//采样ADCINA0和ADCINB0AdcRegs.CHSELSEQ1.bit.CONV01=0x1;//采样ADCINA1和ADCINB1AdcRegs.CHSELSEQ1.bit.CONV02=0x2;//采样ADCINA2和ADCINB2AdcRegs.CHSELSEQ1.bit.CONV03=0x3;//采样ADCINA3和ADCINB3AdcRegs.CHSELSEQ2.bit.CONV04=0x4;//采样ADCINA4和ADCINB4AdcRegs.CHSELSEQ2.bit.CONV05=0x5;//采样ADCINA5和ADCINB5AdcRegs.CHSELSEQ2.bit.CONV06=0x6;//采样ADCINA6和ADCINB6AdcRegs.CHSELSEQ2.bit.CONV07=0x7;//采样ADCINA7和ADCINB7

956957例8.3级联和同步采样模式

957958例8.3级联和同步采样模式同步采样模式ADC可以同时对两个ADCINxx输入进行采样,假定一个输入来自ADCINA0~ADCINA7,另一个输入来自ADCINB0~ADCINB7,而且,这两个输入必须有相同的保持偏移的采样(即ADCINA4和ADCINB4但不是ADCINA7和ADCINB6)。要把ADC设为同步采样模式,必须设置ADC控制寄存器3的D0即ADCTRL3寄存器的SMODESEL位为1,选择同步采样模式。

958959例8.4双排序器和同步采样模式AdcRegs.ADCTRL1.bit.SEQ_CASC=0;//设置双排序器模式AdcRegs.ADCTRL3.bit.SMODE_SEL=1;//设置同步采样模式AdcRegs.MAX_CONV.all=0x0033;//由于是同步采样,可以采16个通道。//排序器SEQ1将用到ADC输入通道选择排序控制寄存器ADCCHSELSEQ1//排序器SEQ2将用到ADC输入通道选择排序控制寄存器ADCCHSELSEQ3AdcRegs.CHSELSEQ1.bit.CONV00=0x0;//采样ADCINA0和ADCINB0AdcRegs.CHSELSEQ1.bit.CONV01=0x1;//采样ADCINA1和ADCINB1AdcRegs.CHSELSEQ1.bit.CONV02=0x2;//采样ADCINA2和ADCINB2AdcRegs.CHSELSEQ1.bit.CONV03=0x3;//采样ADCINA3和ADCINB3AdcRegs.CHSELSEQ3.bit.CONV08=0x4;//采样ADCINA4和ADCINB4AdcRegs.CHSELSEQ3.bit.CONV09=0x5;//采样ADCINA5和ADCINB5AdcRegs.CHSELSEQ3.bit.CONV10=0x6;//采样ADCINA6和ADCINB6AdcRegs.CHSELSEQ3.bit.CONV11=0x7;//采样ADCINA7和ADCINB7

959960例8.4双排序器和同步采样模式

960961例8.4双排序器和同步采样模式结论:最简单的是采用级联模式顺序采样。需要计算瞬时功率时,可以选用双排序器同步采样模式。一路采集电压,另一路同时采集电流。

9619628.6ADC时钟ADCCLK晶振经过锁相环PLL模块之后产生了CLKIN,进入CPU后输出的系统时钟SYSCLKOUT经过高速时钟预定标器配置的分频系数分频后得到高速外设时钟HSPCLK提供给ADC模块。ADC控制寄存器3(ADCCTRL3)的D4~D1,即ADCCLKPS[3:0],可对高速外设时钟HSPCLK进行分频。如表8-3所示。另外ADC控制寄存器1(ADCCTRL1)的D7即ADC内核时钟预定标器CPS位还提供了一个2分频。

962963ADCCLKPS[3~0]内核时钟分频ADCCLK00000HSPCLK/(ADCTRLl[7]+1)000l1HSPCLK/[2×(ADCTRLl[7]+1)]00102HSPCLK/[4×(ADCTRLl[7]+1)]………111014HSPCLK/[28×(ADCTRLl[7]+1)]111115HSPCLK/[30×(ADCTRLl[7]+1)]表8-3ADC时钟ADCCLKADC控制寄存器3ADCCTRL3的D4~D1是ADCCLKPS[3:0]8.6ADC时钟ADCCLK

9639648.6ADC时钟ADCCLK图8-11ADC时钟框图图中说明见书P382

964965

965966

9669678.7.1ADC控制寄存器ADCTRL1位14RESET:ADC模块软件复位。为1,复位ADC模块。位13~12SUSMOD1~SUSMOD0:仿真悬挂模式。位11~8ACQ_PS3~ACQ_PS0:采样时间窗宽度位。位7CPS:内核时钟预分频器。设定对外设高速时钟HSPCLK的分频。位6CONTRUN:连续运行位。0:启动-停止模式。1:连续转换模式。位5SEQOVRD:排序器超越模式位。1:使能超越模式。位4SEQCASC:级联排序器工作模式位。0:双排序器工作模式。1:级联模式。书P3828.7ADC寄存器

9679688.7.2ADC控制寄存器ADCTRL2位15EVBSOCSEQ:级联排序器模式下EVBSOC使能位。1:EVB的信号启动级联的排序器SEQ。位14RSTSEQ1:复位排序器1位。1:立即将排序器复位到CONV00。位13SOCSEQ1:开始转换SOC触发排序器1。位11INTENASEQ1:排序器SEQ1的中断使能位。1:使能。位10INTMODSEQ1:排序器SEQ1的中断模式控制位。0:每个SEQ1排序结束时置1。1:每隔一个SEQ1排序结束时置1。位8EVASOCSEQ1:EVA对SEQ1产生SOC信号的屏蔽位。1:允许事件管理器EVA的事件触发排序器SEQ1。

968969位7EXTSOCSEQ1:1:使能由外部引脚ADCSOC信号启动ADC自动转换序列。位6RSTSEQ2:1:立即复位复位排序器SEQ2。位5SOCSEQ2:排序器SEQ2的Start-of-conversion(SOC)触发。位3INTENASEQ2:SEQ2的中断使能控制位。1:使能。ADC控制寄存器2:ADCTRL2

969970位2INTMODSEQ2:SEQ2的中断模式位。0:排序器SEQ2每个序列结束时,排序器SEQ2中断标志INTSEQ2(ADC状态和标志寄存器ADCST的D1即ADCST.1)置1。1:排序器SEQ2每隔一个序列结束时,排序器SEQ2中断标志INTSEQ2(ADC状态和标志寄存器ADCST的D1即ADCST.1)置1。位0EVBSOCSEQ2:事件管理器EVB对排序器SEQ2的启动转换Start-of-conversion(SOC)使能位。0:事件管理器EVB的事件不能触发排序器SEQ2。1:允许事件管理器EVB的事件触发排序器SEQ2。可以对事件管理器编程用不同事件启动A/D转换。ADC控制寄存器2:ADCTRL2

970971ADC控制寄存器ADCTRL3位7~6ADCBGRFDN1、ADCBGRFDN0:ADC带隙(Bandgap)和参考电路的掉电和上电。这两位控制ADC内部参考电压源电路的上电与断电。位5ADCPWDN:控制ADC模块中除了带隙和参考电路之外所有模拟电路的上电和掉电。0:除了带隙和参考电路外,所有ADC模块中的模拟电路都掉电。1:ADC模块中的模拟电路上电。位0SMODE_SEL:采样模式选择位。0:顺序采样。1:同歩采样。书P385

971972ADC控制寄存器ADCTRL3ADC内核时钟分频器。首先HSPCLK被2×ADCCLKPS[3:0]分频,如果ADCCLKPS[3:0]为0,HSPCLK直接送出。己分频的时钟被ADCTRL1[7]+1进一步分频,产生ADC内核时钟ADCCLK。ADCCLKPS[3:0]内核时钟分频器ADC内核时钟ADCCLK

972973寄存器ADCRESULTn中12位转换结果是左对齐的;存放在16位寄存器的高12位。8.7.4ADC转换结果缓冲寄存器ADCRESULT0~15ADCConversionResultBufferRegisters(ADCRESULTn)

973ADC转换结果寄存器ADCRESULT0@0x007108;ADCRESULT15@0x007117模拟输入0V~3V:analogvoltsconvertedvalueRESULTx3.0FFF0h1111|1111|1111|00001.57FF0h0111|1111|1111|00000.000730010h0000|0000|0001|000000000h0000|0000|0000|0000MSB0123456789101112131415LSB

974ADC转换结果的读取RESULTxACCDataMembitshiftrightxxxxxxxxxx0000150xxxxxxxxxx0000xxxxxxxxxx0000000000000000xxxxxx例如:读取ADC转换结果寄存器0即ADCRESULT0的值#include"DSP281x_Device.h"voidmain(void){Uint16value;//unsignedvalue=AdcRegs.ADCRESULT0>>4;}

9759768.7.5最大转换通道寄存器ADCMAXCONVD6~D0MAXCONVn位域定义了自动转换过程中要转换的最大通道数。本位域和它们的操作随排序器方式的不同而不同(双排序/级联)。对排序器SEQ1操作来说,使用位MAXCONV1_2~MAXCONV1_0。对排序器SEQ2操作来说,使用位MAXCONV2_2~MAXCONV2_0。对排序器SEQ操作来说,使用位MAXCONV1_3~MAXCONV1_0。

9769778.7.5最大转换通道寄存器ADCMAXCONV一个自动转换序列总是从初始状态开始,按顺序连续转换直到允许转换的通道转换结束。按顺序转换完毕的结果存放到ADC转换结果缓冲寄存器中。可以编程实现对A/D转换通道数的配置。转换通道数为1~MAXCONVn+1之间。

9779788.7.5最大转换通道寄存器ADCMAXCONV例8.5:如果需要5个通道转换,采用级联模式,顺序采样。对最大转换通道寄存器ADCMAXCONV进行编程设置。解:设置MAXCONV1_3~MAXCONV1_0=0100b。即MAXCONVn设置为4。转换通道排序结果来自于ADC输入通道选择排序控制寄存器ADCCHSELSEQ1和ADCCHSELSEQ2中,依次在CONV00~CONV04中,5个转换结果分别存储到ADC转换结果缓冲寄存器ADCRESULT0~ADCRESULT4中。

9789798.7.5最大转换通道寄存器ADCMAXCONVAdcRegs.ADCTRL1.bit.SEQ_CASC=1;//设置级联模式AdcRegs.ADCTRL3.bit.SMODE_SEL=0;//设置顺序采样模式AdcRegs.MAX_CONV.all=0x0004;//排序器最大转换通道数为5,一次采1个通道,总共可采5个通道。AdcRegs.CHSELSEQ1.bit.CONV00=0x0;//采样ADCINA0AdcRegs.CHSELSEQ1.bit.CONV01=0x1;//采样ADCINA1AdcRegs.CHSELSEQ1.bit.CONV02=0x2;//采样ADCINA2AdcRegs.CHSELSEQ1.bit.CONV03=0x3;//采样ADCINA3AdcRegs.CHSELSEQ2.bit.CONV04=0x4;//采样ADCINA4

9799808.7.5最大转换通道寄存器ADCMAXCONVMAXCONV1_3~MAXCONV1_0转换通道数000010001200103001140100501016011070111810009100110101011101112110013110114111015111116

980981位11~8SEQCNTR[3~0]:排序计数器状态位。在转换排序开始时,SEQCNTR[3~0]初始化为MAXCONV中的值。在一个自动转换排序的每一个转换之后,排序器的计数器减1。位6~0是排序器SEQ2和SEQ1的指针。作为TI测试用。书P3908.7.6自动排序状态寄存器ADCASEQSRAutosequenceStatusRegister

981982一个序列的转换数是由最大转换通道寄存器中ADCMAXCONV的MAXCONVn位进行控制的;在启动一个转换序列进行转换时,ADC模块将MAXCONVn的值装载进自动序列状态寄存器ADCASEQSR的排序计数器状态位D11~D8即SEQCNTR[3~0]中。当排序器从状态CONV00开始并顺序进行CONV01,CONV02……转换时,SEQCNTR[3~0]的值从装入值开始递减,直到为0,结束一个序列的转换,完成转换通道数为(MAXCONVn+1)。8.7.6自动排序状态寄存器ADCASEQSR

982983ADC状态和标志寄存器ADCST(ADCStatusandFlagRegister)是一个专门的状态和标志寄存器。该寄存器中的各位是只读状态或只读位。8.7.7ADC状态和标志寄存器ADCST图8-18ADC状态和标志寄存器(ADCST)书P391

983984ADC状态和标志寄存器ADCST位7EOSBUF2:SEQ2的排序缓冲器结束位。位6EOSBUF1:SEQ1的排序缓冲器结束位。位5INTSEQ2CLR:SEQ2中断清零位。位4INTSEQ1CLR:SEQ1中断清零位。位3SEQ2BSY:SEQ2忙状态位。位2SEQ1BSY:SEQ1忙状态位。位1INTSEQ2:SEQ2中断标志位。位0INTSEQ1:SEQ1中断标志位。ADCStatusandFlagRegister

984985例8.6:在级联模式下,采用顺序采样。设在排序器SEQ1中有8路转换,即ADCINA3和ADCINA4各两次,ADCINA6、ADCINA7、ADCINB1和ADCINB3各1次。采用排序器SEQ1进行A/D转换,如何设置ADC输入通道选择排序控制寄存器?解:在最大转换通道寄存器ADCMAXCONV中的MAXCONV1中设置为7,设置ADC输入通道选择排序控制寄存器ADCCHSELSEQ1=0x4343,ADCCHSELSEQ2=0xB976。ADC输入通道选择排序控制寄存器ADCCHSELSEQn数值如表8-12所示。8.7.8ADC寄存器应用举例

9859868.7.8ADC寄存器应用举例寄存器地址位15~12位11~8位7~4位3~0输入通道选择排序控制寄存器70A3H4343ADCCHSELSEQ170A4HB976ADCCHSELSEQ270A5HxxxxADCCHSELSEQ370A6HxxxxADCCHSELSEQ4表8-12ADCCHSELSEQn各寄存器数值

9869878.7.8ADC寄存器应用举例级联和顺序采样模式程序设计如下所示。AdcRegs.ADCTRL1.bit.SEQ_CASC=1;//设置级联模式AdcRegs.ADCTRL3.bit.SMODE_SEL=0;//设置顺序采样模式AdcRegs.MAX_CONV.all=0x0007;//排序器最大转换通道数为8,一次采1个通道,总共可采8个通道。/*排序器SEQ将用到ADC输入通道选择排序控制寄存器ADCCHSELSEQ1、ADCCHSELSEQ2、ADCCHSELSEQ3、ADCCHSELSEQ4*/AdcRegs.CHSELSEQ1.bit.CONV00=0x3;//采样ADCINA3AdcRegs.CHSELSEQ1.bit.CONV01=0x4;//采样ADCINA4AdcRegs.CHSELSEQ1.bit.CONV02=0x3;//采样ADCINA3AdcRegs.CHSELSEQ1.bit.CONV03=0x4;//采样ADCINA4AdcRegs.CHSELSEQ2.bit.CONV04=0x6;//采样ADCINA6AdcRegs.CHSELSEQ2.bit.CONV05=0x7;//采样ADCINA7AdcRegs.CHSELSEQ2.bit.CONV06=0x9;//采样ADCINB1AdcRegs.CHSELSEQ2.bit.CONV07=0xB;//采样ADCINB3

9879888.7.8ADC寄存器应用举例当排序器收到Start-of-conversion(SOC)触发信号时,A/D转换立即开始。SOC触发ADC模块将最大转换通道寄存器ADCMAXCONV的MAXCONVn值(MAXCONV1_3~MAXCONV1_0)装载到自动排序状态寄存器ADCASEQSR的D11~D8排序计数器状态位即SEQCNTR3~0中。在ADC输入通道选择排序控制寄存器ADCCHSELSEQn中设置的通道按预定的序列开始进行转换。每次转换完成后,排序计数器状态位SEQCNTR3~0自动减1。一旦SEQCNTR3~0减到0,会发生两件事情,这取决于ADC控制寄存器1(ADCTRL1)的D6即连续运行位CONTRUN的状态。

9889898.9ADC模块应用举例例8.11:利用事件管理器EVA的通用定时器T1的下溢中断触发启动ADC模块。采集ADCINA4和ADCINA5两路信号源的信号。并将采集到的信号存储到指定的内存区域。采用级联模式和顺序采样模式。

9899908.9ADC模块应用举例1.在文件Example_281xAdcSoc.c中#include"DSP281x_Device.h"//包含DSP281x_Device头文件#include"DSP281x_Examples.h"//包含DSP281x_Examples头文件interruptvoidadc_isr(void);//Globalvariablesusedinthisexample:Uint16LoopCount;Uint16ConversionCount;Uint16input1[256];Uint16input2[256];voidmain(void){InitSysCtrl();//系统控制初始化,锁相环PLL、看门狗和使能外设时钟等EALLOW;//解除寄存器保护SysCtrlRegs.HISPCP.all=0x3;//如果SYSCLKOUT为150MHz,高速外设时钟HSPCLK=SYSCLKOUT/6=25MHzEDIS;//使能寄存器保护

9909918.9ADC模块应用举例DINT;//禁止全局中断INTMInitPieCtrl();//初始化PIE控制寄存器IER=0x0000;//禁止CPU中断IFR=0x0000;//清除CPU中断标志InitPieVectTable();//初始化PIE向量表EALLOW;//解除寄存器保护PieVectTable.ADCINT=&adc_isr;//A/D中断服务程序入口地址装入中断向量表EDIS;//使能寄存器保护InitAdc();//初始化ADCPieCtrlRegs.PIEIER1.bit.INTx6=1;//PIE级使能ADC中断ADCINTIER|=M_INT1;//CPU级使能ADC中断,INT1.6EINT;//使能全局中断INTMERTM;LoopCount=0;ConversionCount=0;

9919928.9ADC模块应用举例//配置ADCAdcRegs.ADCTRL1.bit.SEQ_CASC=1;//级联排序器AdcRegs.ADCTRL3.bit.SMODE_SEL=0;//顺序采样模式AdcRegs.ADCMAXCONV.all=0x0001;//两个通道AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x4;//排序器SEQ1中ADCINA4作为第一个转换通道AdcRegs.ADCCHSELSEQ1.bit.CONV01=0x5;//排序器SEQ1中ADCINA5作为第二个转换通道AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=1;//使能事件管理器EVA作为触发信号启动ADCAdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;//使能排序器SEQ1中断AdcRegs.ADCTRL1.bit.COUNT_RUN=0;//启动—停止模式AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0;//排序器SEQ1每个序列结束产生中断

9929938.9ADC模块应用举例//配置事件管理器EVAEvaRegs.T1CMPR=0x0380;//设置通用定时器1比较寄存器值EvaRegs.T1PR=0x0FFF;//设置通用定时器1周期寄存器值EvaRegs.GPTCONA.bit.T1TOADC=1;//使能EVA定时器1下溢中断启动ADCEvaRegs.T1CON.all=0x1042;//通用定时器1工作在连续递增,定时器使能,使能定时器比较操作。while(1){LoopCount++;}}

9939948.9ADC模块应用举例interruptvoidadc_isr(void)//A/D转换中断服务程序{input1[ConversionCount]=AdcRegs.ADCRESULT0>>4;//读取ADC转换结果缓冲寄存器0的值,右移4位,得到12位A/D转换值。input2[ConversionCount]=AdcRegs.ADCRESULT1>>4;//读取ADC转换结果缓冲寄存器1的值,右移4位,得到12位A/D转换值。if(ConversionCount==256){ConversionCount=0;}elseConversionCount++;//准备下一次A/D序列转换AdcRegs.ADCTRL2.bit.RST_SEQ1=1;//复位排序器SEQ1AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;//写1清除排序器SEQ1的中断标志位PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;//PIE中断应答寄存器写1清零相应位}

9949958.9ADC模块应用举例在文件DSP281x_Adc.c中voidInitAdc(void){AdcRegs.ADCTRL3.bit.ADCBGRFDN=0x3;//带隙和参考电路上电AdcRegs.ADCTRL3.bit.ADCPWDN=1;//ADC模块中的模拟电路上电}

9959968.9ADC模块应用举例3.在DSP28_Device.h中,有下列宏定义。#defineEINTasm("clrcINTM")#defineDINTasm("setcINTM")#defineERTMasm("clrcDBGM")#defineDRTMasm("setcDBGM")#defineEALLOWasm("EALLOW")#defineEDISasm("EDIS")

9969978.9ADC模块应用举例4.程序执行结果显示在文件Example_281xAdcSoc.c中,图8-24中箭头所指“ConversionCount=0”处设置断点,单击“Run”运行程序,程序运行到断点处停止。

9979988.9ADC模块应用举例

9989998.9ADC模块应用举例用下拉菜单中的View/Graph的“Time/Frequency”打开一个图形观察窗口。设置该图形观察窗口的参数如图8-25所示。显示类型设为DualTime,观察起始地址为input1和input2,长度为256的存储器单元内的数据,该数据为输入信号经A/D转换之后的数据,数据类型为16位整型。单击“Animate”运行程序,在图形观察窗口观察A/D转换后的数据波形变化,调节输入信号的频率和幅值可以在图形窗口观察到相应的波形变化如图8-26所示。单击“Halt”暂停程序运行。

99910008.9ADC模块应用举例

100010018.9ADC模块应用举例图8-27A/D转换中断服务程序流程图

100110028.9ADC模块应用举例6.输入模拟电压与A/D转换后数字量y之间换算公式A/D的满量程为3V,A/D转换结果在高12位中,经过右移4位处理后得到A/D转换结果为y。输入模拟电压与A/D转换后数字量y之间换算公式如下所示。本题是采用语句EvaRegs.GPTCONA.bit.T1TOADC=1;事件管理器通用定时器1下溢中断启动A/D转换,在A/D转换中断服务中,读取A/D转换结果。

100210038.9ADC模块应用举例例8.12:采样16个通道,采用级联模式和顺序采样模式。软件触发排序器SEQ1进行A/D转换。1.ADC时钟分析(1)在系统初始化程序中,SysCtrlRegs.PLLCR=0xA;假设振荡器时钟OSCCLK=30MHz,则CPU系统时钟SYSCLKOUT=150MHz。(2)由于SysCtrlRegs.HISPCP.all=0x0001,所以高速外设时钟HSPCLK=150/(2×1)=75MHz

100310048.9ADC模块应用举例(3)由于AdcRegs.ADCTRL3.bit.ADCCLKPS=15,即ADC时钟的分频系数为15,FCLK=HSPCLK/(2×ADCCLKPS[3:0])=75/(2×15)=2.5MHz(4)由于AdcRegs.ADCTRL1.bit.CPS=0,ADC内核时钟预定标器CPS=0,所以ADC时钟ADCCLK=FCLK/1=2.5MHz。

100410058.9ADC模块应用举例2.ADC转换结果换算公式12位ADC转换结果存放在ADC转换结果缓冲寄存器的高12位,由于0xFFF0=65520,而ADCLO=0,设x为模拟电压,A/D转换后数字量在ADC转换结果寄存器ADCRESULT0中,则换算公式是:

100510068.9ADC模块应用举例3.系统初始化程序设计(1)设置锁相环控制寄存器。(2)高速外设时钟预定标器和低速外设时钟预定标器设置。(3)事件管理器EVA、EVB和ADC时钟使能。(4)禁止看门狗功能。4.在主程序for循环中,不断执行“喂狗”程序。5.语句AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;实现用软件写1触发排序器SEQ1进行A/D转换。在A/D转换中断服务程序中,读取A/D转换结果。

100610078.9ADC模块应用举例1.在DSP28_SysCtrl.c文件中voidInitSysCtrl(void){Uint16i;EALLOW;//解除寄存器保护SysCtrlRegs.WDCR=0x0068;//禁止看门狗SysCtrlRegs.PLLCR=0xA;//初始化锁相环PLLfor(i=0;i<5000;i++){}//等待锁相环PLL稳定SysCtrlRegs.HISPCP.all=0x0001;//HISPCP寄存器设置,高速外设时钟HSPCLK=SYSCLKOUT/2SysCtrlRegs.LOSPCP.all=0x0002;//LOSPCP寄存器设置,低速外设时钟LSPCLK=SYSCLKOUT/4

100710088.9ADC模块应用举例//对所选择的外设进行时钟使能设置SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;//EVA时钟使能SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;//EVB时钟使能//SysCtrlRegs.PCLKCR.bit.SCIENCLKA=1;//SysCtrlRegs.PCLKCR.bit.SCIENCLKB=1;SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;//ADC时钟使能EDIS;//使能寄存器保护}

100810098.9ADC模块应用举例voidKickDog(void)//喂看门狗{EALLOW;//解除寄存器保护SysCtrlRegs.WDKEY=0x0055;SysCtrlRegs.WDKEY=0x00AA;//写入0x0055+0x00AA,清零看门狗计数器WDCNTREDIS;//使能寄存器保护}

100910108.9ADC模块应用举例在文件ad.c中:#include"DSP28_Device.h"floata1[16];unsignedinta2=0;floatadclo=0.0;interruptvoidad(void);voidmain(void){InitSysCtrl();//系统控制初始化DINT;//禁止全局中断INTMIER=0x0000;//禁止CPU中断IFR=0x0000;//清除CPU中断标志InitPieCtrl();//初始化PIE控制寄存器InitPieVectTable();//初始化PIE向量表EALLOW;//解除寄存器保护PieVectTable.ADCINT=&ad;//A/D转换中断服务程序入口地址装入中断向量表EDIS;//使能寄存器保护

101010118.9ADC模块应用举例InitAdc();//初始化A/DPieCtrlRegs.PIEIER1.bit.INTx6=1;//使能外设中断扩展模块PIE的ADC中断ADCINTIER|=M_INT1;//CPU级使能ADC中断,INT1.6EINT;//使能全局中断INTMERTM;//使能全局实时中断DBGMwhile(AdcRegs.ADC_ST_FLAG.bit.SEQ1_BSY==0)//SEQ1处于空闲状态,等待触发{AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;//软件写1触发排序器SEQ1进行A/D转换}for(;;){KickDog();//使能看门狗功能,写入0x55+0xAA,清零看门狗计数器WDCNTR}}

101110128.9ADC模块应用举例interruptvoidad(void){PieCtrl.PIEACK.all=0xffff;//PIE中断应答寄存器写1清除对应的中断位a2++;a1[0]=((float)AdcRegs.RESULT0)*3.0/65520.0+adclo;//读取ADC转换结果缓冲寄存器0的值,并换算成模拟电压值a1[1]=((float)AdcRegs.RESULT1)*3.0/65520.0+adclo;a1[2]=((float)AdcRegs.RESULT2)*3.0/65520.0+adclo;a1[3]=((float)AdcRegs.RESULT3)*3.0/65520.0+adclo;a1[4]=((float)AdcRegs.RESULT4)*3.0/65520.0+adclo;a1[5]=((float)AdcRegs.RESULT5)*3.0/65520.0+adclo;a1[6]=((float)AdcRegs.RESULT6)*3.0/65520.0+adclo;a1[7]=((float)AdcRegs.RESULT7)*3.0/65520.0+adclo;a1[8]=((float)AdcRegs.RESULT8)*3.0/65520.0+adclo;

101210138.9ADC模块应用举例a1[9]=((float)AdcRegs.RESULT9)*3.0/65520.0+adclo;a1[10]=((float)AdcRegs.RESULT10)*3.0/65520.0+adclo;a1[11]=((float)AdcRegs.RESULT11)*3.0/65520.0+adclo;a1[12]=((float)AdcRegs.RESULT12)*3.0/65520.0+adclo;a1[13]=((float)AdcRegs.RESULT13)*3.0/65520.0+adclo;a1[14]=((float)AdcRegs.RESULT14)*3.0/65520.0+adclo;a1[15]=((float)AdcRegs.RESULT15)*3.0/65520.0+adclo;AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;//写1清除排序器SEQ1中断标志位AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;//软件触发排序器SEQ1进行A/D转换}

101310148.9ADC模块应用举例在文件DSP28_Adc.c中#include"DSP28_Device.h"voidInitAdc(void){unsignedinti;AdcRegs.ADCTRL1.bit.RESET=1;//复位ADC模块NOP;AdcRegs.ADCTRL1.bit.RESET=0;//没有影响AdcRegs.ADCTRL1.bit.SUSMOD=3;//仿真挂起时,立即停止排序器和其它逻辑AdcRegs.ADCTRL1.bit.ACQ_PS=0;//设置采样脉冲的宽度为1个ADCCLK周期AdcRegs.ADCTRL1.bit.CPS=0;//ADC内核时钟预定标器CPS=0,ADCCLK=FCLK,FCLK=HSPCLK/(2×ADCCLKPS[3:0])AdcRegs.ADCTRL1.bit.CONT_RUN=0;//启动—停止模式

101410158.9ADC模块应用举例AdcRegs.ADCTRL1.bit.SEQ_CASC=1;//级联模式AdcRegs.ADCTRL3.bit.ADCBGRFDN=3;//带隙和参考电路上电for(i=0;i<10000;i++)NOP;AdcRegs.ADCTRL3.bit.ADCPWDN=1;//ADC模块中的模拟电路上电for(i=0;i<5000;i++)NOP;AdcRegs.ADCTRL3.bit.ADCCLKPS=15;//设定ADC内核时钟分频器AdcRegs.ADCTRL3.bit.SMODE_SEL=0;//选择顺序采样模式AdcRegs.MAX_CONV.bit.MAX_CONV=15;//16个转换通道AdcRegs.CHSELSEQ1.bit.CONV00=0;//采样ADCINA0AdcRegs.CHSELSEQ1.bit.CONV01=1;//采样ADCINA1AdcRegs.CHSELSEQ1.bit.CONV02=2;//采样ADCINA2AdcRegs.CHSELSEQ1.bit.CONV03=3;//采样ADCINA3

101510168.9ADC模块应用举例AdcRegs.CHSELSEQ2.bit.CONV04=4;//采样ADCINA4AdcRegs.CHSELSEQ2.bit.CONV05=5;//采样ADCINA5AdcRegs.CHSELSEQ2.bit.CONV06=6;//采样ADCINA6AdcRegs.CHSELSEQ2.bit.CONV07=7;//采样ADCINA7AdcRegs.CHSELSEQ3.bit.CONV08=8;//采样ADCINB0AdcRegs.CHSELSEQ3.bit.CONV09=9;//采样ADCINB1AdcRegs.CHSELSEQ3.bit.CONV10=10;//采样ADCINB2AdcRegs.CHSELSEQ3.bit.CONV11=11;//采样ADCINB3

101610178.9ADC模块应用举例AdcRegs.CHSELSEQ4.bit.CONV12=12;//采样ADCINB4AdcRegs.CHSELSEQ4.bit.CONV13=13;//采样ADCINB5AdcRegs.CHSELSEQ4.bit.CONV14=14;//采样ADCINB6AdcRegs.CHSELSEQ4.bit.CONV15=15;//采样ADCINB7AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;//写1清除排序器SEQ1的中断标志位AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;//使能排序器SEQ1的中断AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0;//在排序器SEQ1每个序列结束,产生中断AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=0;//禁止事件管理器EVA触发排序器SEQ1AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;//软件写1触发排序器SEQ1进行A/D转换}

101710188.9ADC模块应用举例初始化ADC程序voidInitAdc(void)完成ADC初始化工作。复位ADC模块,设置ADC时钟,采用启动—停止模式,选择级联模式和顺序采样模式,16个转换通道,使能排序器SEQ1的中断,在排序器SEQ1每个序列结束产生中断,软件写1触发排序器SEQ1进行A/D转换。

10181019End

1019第9章DSP软件开发与C语言编程9.1集成开发环境CCS9.2DSPC工程文件9.3DSPC语言程序设计基础9.4DSP外设寄存器定义9.5典型的C文件举例9.6复位引导与Bootloader9.7片内Flash运行应用程序

1020DSP开发工具与软件开发流程1.DSP开发工具硬件TIXDS510(ExtendedDevelopmentSystem)硬件仿真器。DSK(DSPStarterKit)初学者开发套件。评估板。DSP教学实验系统。开发工具包括硬件、软件两部分。硬件部分主要是仿真器(Emulator),软件主要是集成开发环境CCS(CodeComposerStudio)。DSP开发系统(仿真器)有PCI插卡式、并口式、USB接口式,目前多用USB接口式,即DSP开发系统通过USB接口与PC机相连,开发系统通过JTAG(基于扫描的仿真)接口与用户目标板相连,实现DSP软硬件调试与程序烧写。

1021DSP原理及应用1022C源文件C编译器汇编源文件汇编器汇编源文件COFF目标文件链接器可执行的COFF文件宏源文件归档器宏库归档器目标文件库建库工具运行时支持库EPROM编程器TMS320DSP调试工具XDSEmulatorwithDebugger绝对地址列表器HEX代码转换工具Simulator2.软件开发流程

1022软件开发流程1)编辑:生成源程序(*.asm,*.c)、头文件(*.h)与命令文件(*.cmd)。2)编译与汇编:生成目标文件(*.obj,公共目标文件COFF格式)及列表文件(*.lst)。3)连接:生成可执行代码文件(*.out)及映射文件(*.map)。4)调试:通过JTAG接口下载到目标系统。5)通过JTAG接口将程序固化烧写到Flash存储器。

1023软件开发工具主要有源程序编辑器(Editor)、编译器(Compiler)、汇编器(Assembler)、链接器(Linker)、归档器(Archiver)、运行时支持库(Run-Time-SupportLibrary)、库建立程序(Library-buildUtility)、HEX转换程序(HexConversionUtility)、绝对列表器(AbsoluteLister)和交叉引用列表器(Cross-ReferenceLister)、调试工具(Debuggingtools)、GEL语言(GeneralExtensionLanguage,通用扩展语言)、DSP/BIOS等。3.软件工具DSP开发工具与软件开发流程

1024CCS的简介CCS是一种针对TMS320系列DSP的集成开发环境,在Windows操作系统下,采用图形接口界面,提供有环境配置、源文件编辑、程序调试、跟踪和分析等工具。CCS有两种工作模式,即软件仿真器模式:脱离DSP芯片,在PC机上模拟DSP指令集和工作机制,主要用于前期算法实现和调试。硬件在线编程模式:可以实时运行在DSP芯片上,与硬件开发板相结合在线编程和调试应用程序。DSP开发工具与软件开发流程

1025CCS的组成①TMS320集成代码产生工具用来对C语言、汇编语言或混合语言编程的DSP源程序进行编译汇编,并链接成为可执行的DSP程序。②CCS集成开发环境集编辑、编译、链接、软件仿真、硬件调试和实时跟踪等功能于一体。DSP软件开发与C语言编程

1026DSP软件开发与C语言编程CCS的主要功能CCS的功能十分强大,它集成了代码的编辑、编译、链接和调试等诸多功能,而且支持C/C++和汇编的混合编程,其主要功能如下:具有集成可视化代码编辑界面,用户可通过其界面直接编写C、汇编、.cmd文件等;含有集成代码生成工具,包括汇编器、优化C编译器、链接器等,将代码的编辑、编译、链接和调试等诸多功能集成到一个软件环境中;

1027DSP软件开发与C语言编程CCS的主要功能高性能编辑器支持汇编文件的动态语法加亮显示,使用户很容易阅读代码,发现语法错误;工程项目管理工具可对用户程序实行项目管理。基本调试工具具有装入执行代码、查看寄存器、存储器、反汇编、变量窗口等功能,并支持C源代码级调试;

1028CCS的主要功能断点工具,能在调试程序的过程中,完成硬件断点、软件断点和条件断点的设置;探测点工具,可用于算法的仿真,数据的实时监视等;分析工具,包括模拟器和仿真器分析,可用于模拟和监视硬件的功能、评价代码执行的时钟;DSP软件开发与C语言编程

1029CCS的主要功能数据的图形显示工具,可以将运算结果用图形显示,包括显示时域/频域波形、眼图、星座图、图像等,并能进行自动刷新;提供GEL工具。利用GEL扩展语言,用户可以编写自己的控制面板/菜单,设置GEL菜单选项,方便直观地修改变量,配置参数等;DSP软件开发与C语言编程

10301.CCS软件安装与设置(CCS3.3)驱动程序设置。Simulator:PC模拟软件仿真。Emulator:实时DSP硬件仿真。9.1集成开发环境CCS

1031

1032

1033CCS主要工具源程序编辑器(Editor)。C编译器(CCompiler)。汇编器(Assembler)。连接器(Linker)。调试工具(Debug)。十六进制转换公用程序(HexConversionUtility)。9.1集成开发环境CCS

10342.CCS主要菜单与功能CCS的功能可以通过菜单或工具条按钮实现。主要的菜单项有File、Edit、View、Project、Debug等。

1035典型CCS运行界面

1036主菜单功能菜单选项菜单功能File文件文件管理,载入执行程序、符号及数据、文件输入/输出等Edit编辑文字及变量编辑。如剪贴、查找替换、内存变量和寄存器编辑等View查看工具条显示设置。包括内存、寄存器和图形显示等Project项目工程项目管理、工程项目编译和构建工程项目等Debug调试设置断点、探测点,完成单步执行、复位等Profiler性能性能菜单。包括设置时钟和性能断点等Option选项选项设置。设置字体、颜色、键盘属性、动画速度、内存映射等GEL扩展功能利用通用扩展语言扩展功能菜单Tools工具工具菜单。包括管脚连接、端口连接、命令窗口、链接配置等Window视窗窗口管理。包括窗口排列、窗口列表等Help帮助帮助菜单。为用户提供在线帮助信息9.1集成开发环境CCS

1037File菜单

1038Project菜单

1039View菜单

1040Debug菜单

10413.采用CCS开发应用程序的步骤创建一个新工程(project)。编辑源程序(*.asm,*.c)与连接命令文件(*.cmd)。将文件添加到该工程中(*.asm,*.c,*.h,*.cmd)。编译汇编连接。装载程序。调试程序。程序固化。9.1集成开发环境CCS

10424.调试程序连续运行与单步运行。设置断点。查看与修改存储单元。查看与修改寄存器内容。观察和编辑变量。程序Animate运行和数据图形显示。9.1集成开发环境CCS

1043C工程(Project)几种基本文件CCS工程文件(扩展名为.pjt)。由CCS自动生成。源程序:汇编语言文件(*.asm),C文件(*.c)。头文件(*.h):定义寄存器映射地址,用户自定义的常量等。例如,头文件DSP281x_Adc.h定义了ADC寄存器,头文件DSP281x_PieVec.h定义了PIE中断矢量。链接命令文件(*.cmd)。库文件(*.lib)。运行时支持库rts2800_ml.lib。目标文件(*.obj):COFF公共目标文件格式。列表文件(*.lst):汇编生成的文件。映射文件(*.map):存储器分配。可执行代码文件(*.out)。9.2DSPC工程文件

1044DSP28_ADC.C——外设AD的初始化函数,与外设AD相关。DSP28_CpuTimers.C——CPU定时器的初始化和配置函数,与CPU的定时器相关。DSP28_DefaultIsr.C——包含了2812所有的中断函数,写中断时,只要将程序写在对应的函数内就可以。DSP28_ECan.C——外设CAN的初始化函数,与外设CAN相关。DSP28_Ev.C——外设EV的初始化函数,与外设EV相关。DSP28_GlobalVariableDefs.C——全局变量的定义,定义了2812的寄存器结构变量和数据段分配的声明。9.2DSPC工程文件以合众达实验箱cputimer为例

1045DSP28_Gpio.C——GPIO的初始化函数和GPIO相关。DSP28_InitPeripherals.C——所有外设的初始化函数,函数的内容是调用了2812各个外设的初始化函数。DSP28_Mcbsp.C——Mcbsp的初始化函数,与Mcbsp相关。DSP28_PieCtrl.C——PIE初始化函数与中断相关。DSP28_PieVect.C——PIE中断向量表定义以及初始化。9.2DSPC工程文件

1046DSP28_Sci.C——外设SCI的初始化函数,与外设SCI相关。DSP28_Spi.C——外设SPI的初始化函数,与外设SPI相关。DSP28_SysCtrl.C——系统初始化,对开门狗,时钟等模块进行初始化,以保证2812正常工作,非常重要。DSP28_Xintf.C——外部接口的初始化函数。DSP28_XIntrupt.C——外部中断的初始化函数。main.C——main函数所在的文件。9.2DSPC工程文件

1047几个文件非常重要;DSP28_DefaultIsr.C(中断入口)DSP28_GlobalVariableDefs.C(寄存器结构变量)DSP28_PieCtrl.C(PIE初始化函数与中断相关)DSP28_PieVect.C(PIE中断向量表定义以及初始化)DSP28_SysCtrl.C(系统初始化)9.2DSPC工程文件

1048COFF的一般概念TI公司的汇编器和链接器创建的目标文件采用一种称为COFF(CommonObjectFileFormat)的目标文件格式。采用COFF目标文件格式非常有利于模块化编程,基于COFF目标文件格式编写汇编程序或高级语言程序时,不必为程序代码或变量指定目标地址。9.2DSPC工程文件

1049COFF的一般概念COFF目标文件格式的核心是在编写DSP程序时,基于代码段和数据段的概念,而不是一条条命令或一个个数据,这使得程序的可读性和可移植性大大增强。9.2DSPC工程文件

1050COFF的一般概念汇编器和链接器生成的目标文件,是一个可以由DSP器件执行的文件。在编写汇编语言程序时,COFF采用代码段和数据段的形式,以便于模块化的编程,这些代码段和数据段简称为段。汇编器和链接器提供一些伪指令来建立和管理各种各样的段。9.2DSPC工程文件

1051COFF目标文件都包含以下3种形式的段:.text段(文本段),通常包含可执行代码;.data段(数据段),通常包含初始化数据;.bss段(保留空间段),通常为未初始化变量保留存储空间。COFF文件的基本单元1.段(sections)9.2DSPC工程文件

10522.段的基本类型COFF目标文件中的段有两种基本类型。初始化段未初始化段(1)初始化段初始化段中包含有数据或程序代码。主要有:.text段——已初始化段;.data段——已初始化段;.sect段——已初始化段,由汇编器伪指令建立的自定义段。COFF文件的基本单元9.2DSPC工程文件

1053(2)未初始化段在存储空间中,为未初始化数据保留存储空间。它包括:.bss段——未初始化段;.usect段——未初始化段,由汇编命令建立的命名段(自定义段)。COFF文件的基本单元9.2DSPC工程文件

10543.段与目标存储器的对应关系汇编器的任务:在汇编过程中,根据汇编命令用适当的段将各部分程序代码和数据连在一起,构成目标文件。链接器的任务:就是分配存储单元,将目标文件中的段重新定位到目标系统的存储器中,这一过程称为定位或分配。COFF文件的基本单元9.2DSPC工程文件

1055目标文件中的段与目标存储器之间的关系目标文件目标存储器.bss.data.textRAMFLASHFLASH9.2DSPC工程文件

1056汇编器对段的处理汇编器对段的处理是通过段伪指令来区别各个段的,并将段名相同的语句汇编在一起。汇编器有5条伪指令可识别汇编语言程序的各个部分:●.bss●.usect●.text●.data●.sect——定义未初始化段——定义未初始化段——定义已初始化段——定义已初始化段——定义已初始化段9.2DSPC工程文件

1057未初始化段是在DSP存储器中保留空间,通常它们被定位在RAM区。在目标文件中,这些段中没有确切内容。由这些段定义的空间仅作为临时存储空间,在程序运行时,可以利用这些存储空间存放变量。未初始化段分为默认的和命名的两种,分别由汇编器伪指令.bss和.usect产生。1.未初始化段汇编器对段的处理9.2DSPC工程文件

1058(1).bss伪指令用于在bss段中保留若干个空间。格式:.bss符号,字数(.bssINDATA,1)符号——对应于保留的存储空间第一个字的变量名称。可以让其他段引用字数——表示在bss段或标有名字的段中保留若干个存储单元。每调用一次.bss伪指令,汇编器在相应的段保留更多的空间。1.未初始化段9.2DSPC工程文件

1059(2).usect伪指令用于为指定的命名段保留若干个空间。格式:符号.usect“段名”,字数段名——程序员为未初始化的命名段定义的名字。每调用一次.usect伪指令,汇编器在指定的命名段保留更多的空间。1.未初始化段9.2DSPC工程文件

1060已初始化段中包含有可执行代码或初始化数据。这些段中的内容都在目标文件中,当加载程序时再放到DSP的存储器中。已初始化段由.text、.data和.sect三个伪指令建立。2.已初始化段9.2DSPC工程文件

1061已初始化命令的句法:.text[段起点].data[段起点].sect“段名”[,段起点]段起点——是任选项。若选用,它为段程序计数器SPC定义一个起始值。若默认,则SPC从0开始。2.已初始化段9.2DSPC工程文件

1062汇编器对段的处理命名段由用户指定,与默认的.text,.data和.bss段的使用相同,但它们被分开汇编。假如一部分可执行代码(例如初始化程序)不希望和.text段分配在一起,可将它们汇编进一个命名段,这样就可定位在与.text不同的地方。也可将初始化的数据汇编到与.data段不同的地方,或者将未初始化的变量保留在与.bss段不同的位置。可用.usect和.sect两个伪指令产生命名段。3.命名段(自定义段)9.2DSPC工程文件

1063.usect伪指令产生类似.bss的段,为变量在RAM中保留存储空间。.sect伪指令产生类似.text和.data的段,可以包含代码或数据。命名段(自定义段)产生命名段伪指令格式:符号.usect“段名”,字数.sect“段名”(例如:.sect“.vectors”)9.2DSPC工程文件

1064链接器对段的处理链接器是开发DSP器件必不可少的开发工具之一,它对段处理时有2个主要任务:①将一个或多个COFF目标文件中的各种段作为链接器的输入段,经链接后在一个执行的COFF输出模块中建立各个输出段;②在程序装入时对其重新定位,为各个输出段选定存储器地址。9.2DSPC工程文件

1065初始化段包含可执行代码或常数表。C编译器产生的初始化段有.pint、.const、.econst、.text、.cinit、.switch。.text段,包含可执行代码和常量(constant)。.cinit段和.pint段,包含初始化变量和常量。.const段,包含串常量,全局变量、静态变量的声明和初始化。.econst段,包含串常量,全局变量、静态变量的声明和初始化。变量由farconst修饰,或用大存储器模型,初始化后放进远(far)存储器。.switch段,包含switch语句表。9.2DSPC工程文件书P429

1066C编译器产生的未初始化段有.bss、.ebss、.stack、.sysmem和.esysmem段。.bss段,为全局和静态变量保留空间。.ebss段,为全局和静态变量保留空间。变量由far修饰,或用大存储器模型使用。.stack段,为C系统堆栈。用于保护函数的返回地址、分配局部变量、调用函数时传递参数。.sysmem段,为动态存储器分配保留空间,malloc函数使用。.esysmem段,为动态存储器分配保留空间,farmalloc函数使用。9.2DSPC工程文件

1067初始化段链接段名称描述限制.text可执行代码和常量程序.cint已初始化的全局与静态变量的C初始化记录低64K数据.pint全局构造器(C++constructor)表程序.switch实现switch语句表程序/低64K数据.const已初始化的全局与静态const修饰变量,串常量低64K数据.econstfarcostant变量数据任何位置9.2DSPC工程文件

1068未初始化段链接段名称内容限制.bss全局与静态变量低64K数据.ebssfar全局与静态变量数据任何位置.stack堆栈空间低64K数据.sysmemmalloc函数存储区低64K数据.esysmemfarmalloc函数存储区数据任何位置9.2DSPC工程文件

1069存储器映射表段(Section)存储器类型(TypeofMemory)页面(Page).textROM或RAM0.cintROM或RAM0.pintROM或RAM0.switchROM或RAM0,1.constROM或RAM1.econstROM或RAM1.bssRAM1.ebssRAM1.stackRAM1.sysmemRAM1.esysmemRAM1

1070MEMORY和SECTIONS伪指令通常需要建立一个链接命令文件,在cmd文件中,有2条伪指令支持链接器对段的处理。在链接器命令文件中,可使用MEMORY和SECTIONS伪指令。为实际应用指定存储器结构和地址的映射。定义存储器和配置段地址。9.2DSPC工程文件书430

1071MEMORY伪指令——用来定义目标系统的存储器配置空间,包括对存储器各部分命名,以及规定它们的起始地址和长度。SECTIONS伪指令——该命令告诉链接器如何将输入段进行组合以及在存储器何处存放组合后的输出模块。MEMORY——用来指定目标存储器结构。SECTIONS——用来控制段的构成与地址分配。9.2DSPC工程文件

1072MEMORY命令MEMORY命令定义目标系统中可以使用的存储器范围,每个存储器范围具有名字、起始地址和长度。一般形式为MEMORY{PAGE0:name:origin=constant,length=constant;…PAGEn:name:origin=constant,length=constant;}name:存储器范围名字。可以是1~8个字符。origin或简写为o:存储器范围的起始地址。length或简写为l:存储器范围的长度。

1073PAGE:指定存储器空间页面,最多为255页,取决于目标存储器的配置。每一个PAGE代表一个完全独立的地址空间。通常,PAGE0用于程序存储器;PAGE1用于数据存储器。MEMORY指令9.2DSPC工程文件

1074SECTIONS命令SECTIONS命令用于将输出各段定位到所定义的存储器。一般形式为SECTIONS{name:[property,property,…]name:[property,property,…]…}9.2DSPC工程文件

1075SECTIONS指令的句法:SECTIONS{name:[property,property,property,…]name:[property,property,property,…]name:[property,property,property,…]}指令字输出段说明语句段名:定义输出段的名称。属性:定义该段的内容和存储器的分配。段名SECTIONS指令语法属性属性属性9.2DSPC工程文件

1076例如:.text:load=0x1000.text:load>ROM.text:align=0x80.text:PAGE0将.text段定位到一个特定的地址。将.text段定位到命名为ROM存储区。将.text段定位到从地址0x80开始。将.text段定位到PAGE0。SECTIONS指令语法SECTIONS指令9.2DSPC工程文件

1077MEMORY{PAGE0:PRAMH0:origin=0x3f8000,length=0x001000PAGE1:/*SARAM*/RAMM0:origin=0x000000,length=0x000400RAMM1:origin=0x000400,length=0x000400/*PeripheralFrame0:*/DEV_EMU:origin=0x000880,length=0x000180FLASH_REGS:origin=0x000A80,length=0x000060CSM:origin=0x000AE0,length=0x000010XINTF:origin=0x000B20,length=0x000020CPU_TIMER0:origin=0x000C00,length=0x000008CPU_TIMER1:origin=0x000C08,length=0x000008CPU_TIMER2:origin=0x000C10,length=0x000008PIE_CTRL:origin=0x000CE0,length=0x000020PIE_VECT:origin=0x000D00,length=0x0001009.2DSPC工程文件合众达cputimer工程书431

1078/*PeripheralFrame1:*/ECAN_A:origin=0x006000,length=0x000100ECAN_AMBOX:origin=0x006100,length=0x000100/*PeripheralFrame2:*/SYSTEM:origin=0x007010,length=0x000020SPI_A:origin=0x007040,length=0x000010SCI_A:origin=0x007050,length=0x000010XINTRUPT:origin=0x007070,length=0x000010GPIOMUX:origin=0x0070C0,length=0x000020GPIODAT:origin=0x0070E0,length=0x000020ADC:origin=0x007100,length=0x000020EV_A:origin=0x007400,length=0x000040EV_B:origin=0x007500,length=0x000040SPI_B:origin=0x007740,length=0x000010SCI_B:origin=0x007750,length=0x000010MCBSP_A:origin=0x007800,length=0x000040/*CSMPasswordLocations*/CSM_PWL:origin=0x3F7FF8,length=0x000008/*SARAM*/DRAMH0:origin=0x3f9000,length=0x001000}

1079SECTIONS{/*Allocateprogramareas:*/.reset:>PRAMH0,PAGE=0.text:>PRAMH0,PAGE=0.cinit:>PRAMH0,PAGE=0/*Allocatedataareas:*/.stack:>RAMM1,PAGE=1.bss:>DRAMH0,PAGE=1.ebss:>DRAMH0,PAGE=1.const:>DRAMH0,PAGE=1.econst:>DRAMH0,PAGE=1.sysmem:>DRAMH0,PAGE=1将H0分为程序存储器和数据存储器

1080/*AllocatePeripheralFrame0RegisterStructures:*/DevEmuRegsFile:>DEV_EMU,PAGE=1FlashRegsFile:>FLASH_REGS,PAGE=1CsmRegsFile:>CSM,PAGE=1XintfRegsFile:>XINTF,PAGE=1CpuTimer0RegsFile:>CPU_TIMER0,PAGE=1CpuTimer1RegsFile:>CPU_TIMER1,PAGE=1CpuTimer2RegsFile:>CPU_TIMER2,PAGE=1PieCtrlRegsFile:>PIE_CTRL,PAGE=1PieVectTable:>PIE_VECT,PAGE=1/*AllocatePeripheralFrame2RegisterStructures:*/ECanaRegsFile:>ECAN_A,PAGE=1ECanaMboxesFile:>ECAN_AMBOXPAGE=1

1081/*AllocatePeripheralFrame1RegisterStructures:*/SysCtrlRegsFile:>SYSTEM,PAGE=1SpiaRegsFile:>SPI_A,PAGE=1SciaRegsFile:>SCI_A,PAGE=1XIntruptRegsFile:>XINTRUPT,PAGE=1GpioMuxRegsFile:>GPIOMUX,PAGE=1GpioDataRegsFile:>GPIODATPAGE=1AdcRegsFile:>ADC,PAGE=1EvaRegsFile:>EV_A,PAGE=1EvbRegsFile:>EV_B,PAGE=1ScibRegsFile:>SCI_B,PAGE=1McbspaRegsFile:>MCBSP_A,PAGE=1/*CSMPasswordLocations*/CsmPwlFile:>CSM_PWL,PAGE=1}

10829.3DSPC语言程序设计基础9.3.1数据类型9.3.2C语言运算符与基本语句9.4.3函数9.4.4指针9.4.5编译预处理命令9.4.6C语言与汇编语言混合编程9.4.7C28xDSP编译器的关键字

1083C28xDSP具有优化的C编译器,它支持ANSIC标准。还具有一些不同于标准C的特征。DSP的基本数据类型如表所示,还具有数组、结构、联合等构造类型数据。9.3.1数据类型9.3DSPC语言程序设计基础

1084TMS320C28xC的数据类型C28x编译器基本数据类型

1085片内外设寄存器通常通过结构与联合变量的方法进行访问。1.结构例如,GPIOA口的MUX复用控制寄存器可用位段结构表示structGPAMUX_BITS{unsignedintPWM1_GPIOA0:1;//第0位unsignedintPWM2_GPIOA1:1;// … unsignedintC2TRIP_GPIOA14:1;// unsignedintC3TRIP_GPIOA15:1;//第15位};9.3.3结构与联合

1086例如,GPIOD口的MUX复用控制寄存器结构structGPDMUX_BITS{unsignedintT1CTRIP_PDPA_GPIOD0:1;//第0位unsignedintT2CTRIP_PDPA_GPIOD1:1;//1 unsignedintrsvd1:3;//4:2,保留unsignedintT3CTRIP_PDPA_GPIOD5:1;//5 unsignedintT4CTRIP_PDPA_GPIOD6:1;//6 unsignedintrsvd2:9;//15:7,保留};当一个结构中有效字段(位段)的长度不足16位时,可以加入保留字段,以保证数据的完整性。结构变量的定义与成员变量的引用,例如,structGPDMUX_BITSbit;//bit为GPDMUX_BITS类型变量bit.T1CTRIP_PDPA_GPIOD0=1

1087联合体类型,可以将不同类型的数据存放在同一个地方,且占据同样大小的存储空间。例如,定义联合体类型GPDMUX_REG,unionGPDMUX_REG{unsignedintall;//all为无符号整型变量structGPDMUX_BITSbit;//bit为结构型变量};联合变量的定义与成员变量的引用,例如,unionGPDMUX_REGGPDMUX;//GPDMUX为联合类型变量GPDMUX.all=1;//将D0引脚定义为外设功能,其他为数字I/O2.联合9.3.3结构与联合

1088联合可以出现在结构和数组中,结构和数组也可以出现在联合中。例如,结构类型GPIO_MUX_REGS,structGPIO_MUX_REGS{ unionGPAMUX_REGGPAMUX; unionGPDMUX_REGGPDMUX; };9.3.3结构与联合

1089结构变量的定义与成员变量的引用,例如,structGPIO_MUX_REGSGpioMuxRegs; //表示GpioMuxRegs是结构GPIO_MUX_REGS的一个变量。可以采用点运算符的方法引用各成员变量;GpioMuxRegs.GPAMUX.all=0x077F;//CAP1-3,PWM1-6,T1PWM GpioMuxRegs.GPDMUX.bit.T1CTRIP_PDPA__GPIOD0=1;//PDPINTA GpioMuxRegs.GPDMUX.bit.T2CTRIP_SOCA__GPIOD1=0;//GPIOD1 GpioMuxRegs.GPDMUX.bit.T3CTRIP_PDPB__GPIOD5=0;//GPIOD5 GpioMuxRegs.GPDMUX.bit.T4CTRIP_SOCB__GPIOD6=0;//GPIOD6例如:定义GPIOA口时,采用一条C语句。定义GPIOD口时,采用了4条C语句。编程风格可以编程者自己决定。9.3.3结构与联合书P437

1090与普通的C语言程序类似,DSPC程序是由若干模块化的函数构成。函数是C程序的基本模块,子程序就是由函数来实现的。用户可以根据需要定义自己的功能函数,也可以调用C编译器提供的标准函数(库函数)来完成某种特定的功能。1函数9.3.4函数与指针

1091C函数的一般格式为类型函数名(形式参数及其类型表){变量声明部分;执行语句部分;}一个函数在程序中可以三种形态出现:函数定义(Definition)、函数调用和函数声明(Declaration)。函数定义相当于汇编语言中的一般子程序。函数调用相当于调用子程序。函数定义和函数调用不分先后,但若调用在定义之前,那么在调用前必须先进行函数声明。函数声明是一个没有函数体的函数定义,而函数调用则要求有函数名和实际参数表。

1092可以用指针的方法访问变量,用指针访问数组、结构、联合变量非常方便。2指针例如,指向结构类型的指针变量pstructGPDMUX_BITS*p;structGPDMUX_BITSbit; p=&bit; bit的成员T1CTRIP_PDPA_GPIOD0可用下述3种形式之一访问bit.T1CTRIP_PDPA_GPIOD0 (*p).T1CTRIP_PDPA_GPIOD0 p->T1CTRIP_PDPA_GPIOD09.3.4函数与指针

1093ANSIC新标准增加了一种void*指针类型,即可以定义一个指针变量,但不指定它是指向哪一种数据类型,例unsignedlong*Source=(void*)&PieVectTableInit;地址&PieVectTableInit被(void*)强制成了void*类型。指针Source为unsignedlong类型。例如,描述中断矢量表的指针PINTtypedefunsignedintUnit16;//定义一种类型Uint16Uint16i;typedefinterruptvoid(*PINT)(void);//指针PINT指向中断函数structPIE_VECT_TABLE{PINTPIE1_RESERVED;PINTPIE2_RESERVED;…}DSP281x_PieVect.c

1094C语言用指针访问数据存储器(或片内外设寄存器)可以用指针方法实现。从扩展的外设接口读取开关状态,然后输出到扩展的指示灯外设接口。#defineLBDS(*((unsignedint*)0xc0000))//扩展的外设寄存器,指示灯#defineDIPS(*(unsignedint*)0xc0001)//扩展的外设寄存器,开关LBDS=DIPS;//读取拨码开关状态直接送指示灯显示9.3.4函数与指针

1095main(){inti;unsignedint*px,*py,*pz;px=(unsignedint*)0x80000;py=(unsignedint*)0x80100;for(i=0,pz=px;i<16;i++,pz++)(*pz)=i;//0x80000~0x8000F单元赋值0~15for(i=0,pz=py;i<16;i++,pz++)(*pz)=0x1234;//0x80100~0x8010F单元赋值0x1234for(i=0;i<16;i++,px++,py++)(*py)=(*px);//0x80000开始的16个单元内容复制到0x8010F单元while(1){;}}例:将数据存储器80000H开始的16个单元复制到80100H开始的单元。

1096例9.3:扩展外部接口,编写C程序将4个开关状态反应到4个指示灯。#include"DSP281x_Device.h"//DSP281xHeadfileIncludeFile//定义指示灯控制寄存器地址和寄存器类型#defineLBDS(*((unsignedint*)0xc0000))//定义拨码开关控制寄存器地址和寄存器类型#defineDIPS(*(unsignedint*)0xc0001)main(){InitSysCtrl();//初始化DSP时钟,自定义函数while(1)LBDS=DIPS;//读取拨码开关状态直接送指示灯显示}

10971.宏定义#define#definePI3.14159#defineUint16unsignedint#defineEINTasm(“clrcINTM”)#defineEALLOWasm(“EALLOW”)2.文件包含#include#include#include“DSP281x_Device.h”9.3.5宏定义、文件包含与条件编译

10983.条件编译#ifdef标识符程序段1#else程序段2#endif9.3.5宏定义、文件包含与条件编译

1099通过#pragma可以定义自己的段。#pragma的语法格式如下所示。#pragmaCODE_SECTION(symbol,“sectionname”);#pragmaDATA_SECTION(symbol,“sectionname”);(1)symbol是符号,可以是函数名或全局变量名。sectionname是用户自己定义的段名。9.3.6pragma命令

11009.3.6pragma命令(2)CODE_SECTION用来定义代码段,DATA_SECTION用来定义数据段。(3)不能在函数体内声明#pragma,必须在符号被定义和使用前使用#pragma。通过pragma伪指令告诉编译器如何对待特定的函数、对象或代码段。如果需要代码链接到与.text不同的段,则CODE_SECTION很有用。

1101(1)CODE_SECTION代码段它为函数func在一个名为sectionname的段(section)中指定空间。将一个代码对象连接到一个不同于.text段的空间时;该语法非常有用。例9.4charbufferA[80];#pragmaCODE_SECTION(funA,“codeA”)charfunA(inti);voidmain(){charc;c=funA(1);}charfunA(inti){returnbufferA[i];}9.3.6pragma命令

1102(2)DATA_SECTION数据段它为符号symbol在一个名为sectionname的段中指定空间。将一个数据对象连接到一个不同于.bss段的空间时;该语法非常有用。例9.6#pragmaDATA_SECTION(bufferB,“my_sect”)charbufferB[512];数据块bufferB被定位于my_sect段中,my_sect段在.cmd文件中规定物理地址。9.3.6pragma命令

1103在C程序中直接嵌入汇编语句。独立的C模块和汇编模块接口。独立编写C程序与汇编程序,分别编译、汇编生成目标代码模块,然后用连接器连接起来。从C程序中访问汇编程序变量。9.3.7C语言与汇编语言混合编程

1104在C程序中直接嵌入汇编语句C程序嵌入汇编语句是一种直接的C模块和汇编模块接口方法。可以在C程序中实现用C语言难以实现的一些硬件控制功能。用这种方法在C程序中的关键部分用汇编语句代替C语句以优化程序。缺点是比较容易破坏C环境,因为C编译器在编译嵌入了汇编语句的C程序时并不检查或分析所嵌入的汇编语句。9.3.7C语言与汇编语言混合编程

11051.在C程序中直接嵌入汇编语句直接在C语言程序中相应位置嵌入汇编语句,只需在汇编语句加上双引号和小括号,前面加asm标识符号,双引号内第一个字符应是空格。即asm(”汇编语句”)#defineEINTasm("clrcINTM")//使能全局中断#defineDINTasm("setcINTM")//禁止全局中断#defineEALLOWasm("EALLOW")//解除寄存器保护#defineEDISasm("EDIS")//使能寄存器保护#defineNOPasm("NOP")//空操作书P4419.3.7C语言与汇编语言混合编程

11069.3.7C语言与汇编语言混合编程C语言与汇编语言混合编程例9.7:1.文件main.c如下所示。#includevoidmain(){inta=10;intb=10;intsum;addasm();sum=add(a,b);for(;;);}

11079.3.7C语言与汇编语言混合编程add(intadd1,intadd2){intc;c=add1+add2;returnc;}

11089.3.7C语言与汇编语言混合编程2.文件addasm.asm如下所示.file"addasm.asm".global_addasm.text_addasm:MOVACC,#10MOVT,#2ADDACC,TLRETR

1109C28xDSPC/C++编译器,支持标准的const、register、volatile等关键字,还扩展了cregister、interrupt、far、near等关键字。1.关键字const该关键字可以优化存储器的分配。加const到任何变量的定义可以确保其内的值不变。9.3.8C28xDSP编译器关键字

11102.关键字volatile该关键字所定义的变量是可变的,可以被其他硬件修改,而不仅仅只能由C程序修改。优化器会尽量减少存储器的访问,所以有时必须禁止优化,特别是循环控制变量。例如:volatileunsignedint*ctrl;while(*ctrl!=0xff);//循环等待,直到ctrl地址的内容为0xffctrl指针所指向的地址不会优化成单次读,可以读取外部事件引起的单元内容的变化。如果没有关键字volatile,ctrl指针所指向地址单元的内容在循环过程中不会发生变化,循环被优化成单次读,造成死循环。9.3.8C28xDSP编译器关键字

11113.关键字cregster该扩展关键字允许高级语言读/写控制寄存器。在F281xC中,cregister仅限于中断使能寄存器IER和中断标志寄存器IFR,程序中应有如下声明externcregistervolatileunsignedintIER;externcregistervolatileunsignedintIFR;可以用|(位或)和&(位与)进行操作,例如IFR|=0x100;IFR&=0x100;9.3.8C28xDSP编译器关键字

11124.关键字interrupt该扩展关键字用来说明函数是一个中断函数。中断函数被定义成返回void类型,而且无参数调用。例如:interruptvoidint_handler(){unsignedintflags;…}9.3.8C28xDSP编译器关键字

1113#include"DSP281x_Device.h"//DSP281xHeaderfileIncludeFile//定义指示灯寄存器地址和寄存器类型#defineLBDS(*((unsignedint*)0xc0000))//指定地址的整型变量voidDelay(unsignedintnDelay);//延时子程序,函数声明main(){unsignedintuLED[4]={1,2,4,8};//控制字0001,0010,0100,1000数组inti;InitSysCtrl();//初始化DSP运行时钟,自定义函数//系统时钟150MHz,使能外设时钟,禁止看门狗while(1)例9.94个LED指示灯接到DSP通过CPLD扩展的外部简单接口电路,其地址为0xc0000。用C语言编程使之按一定顺序点亮。+3.3V1kLED9.3.8C28xDSP编译器关键字

1114{for(i=0;i<4;i++){LBDS=uLED[i];//正向顺序送控制字Delay(256);//延时}for(i=3;i>=0;i--){LBDS=uLED[i];//反向顺序送控制字Delay(256);//延时}}}9.3.8C28xDSP编译器关键字

1115voidDelay(unsignedintnDelay)//延时程序,自定义函数{intii,jj,kk=0;for(ii=0;ii

11169.4DSP外设寄存器定义第一步:采用结构体、共用体、位域结构体定义寄存器。第二步:通过pragma伪指令将寄存器变量分配到数据段。第三步:通过MEMORY伪指令指示寄存器的实际硬件空间。第四步:通过SECTIONS伪指令将寄存器数据段分配到实际硬件空间。以工程cputimer的系统控制寄存器举例说明。

1117End

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
最近更新
更多
大家都在看
近期热门
关闭