




已阅读5页,还剩74页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2019/6/4,山东大学控制学院 张东亮,1,第4章 DSP的软件开发与C语言编程,本章内容: 4.1 DSP开发工具与软件开发流程 4.2 集成开发环境CCS 4.3 DSP的C工程文件 4.4 DSP C语言程序设计基础 4.5 DSP C程序举例,2019/6/4,山东大学控制学院 张东亮,2,4.1 DSP开发工具与软件开发流程,1. DSP开发工具 硬件 TI XDS510 (Extended Development System)硬件仿真器。 DSK(DSP Starter Kit)初学者开发套件。 瑞泰 ICETEK-5100PP/USB DSP开发系统。 评估板。 DSP教学实验系统 。,开发工具包括硬件、软件两部分。硬件部分主要是仿真器(Emulator),软件主要是集成开发环境CCS (Code Composer Studio)。,DSP开发系统(仿真器)有PCI插卡式、并口式、USB接口式,目前多用USB接口式,即DSP开发系统通过USB接口与PC机相连,开发系统通过JTAG(基于扫描的仿真)接口与用户目标板相连,实现DSP软硬件调试与程序烧写。,2019/6/4,山东大学控制学院 张东亮,3,DSP评估板(也称为EVM板、目标板、 DEMO板、实验板等),包括基本的DSP芯片及必要的电源、时钟、复位电路外,还经常包括用于程序调试的片外扩展存储器、扩展的A/D、D/A转换器、键盘显示电路、EEPROM、RS232串行接口、SPI接口、CAN接口驱动电路、简单应用电路等。,F2812 DSP评估板,2019/6/4,山东大学控制学院 张东亮,4,F2812 DSP评估板 原理框图,开发系统 与评估板,2019/6/4,山东大学控制学院 张东亮,5,2812 EVM板的主要性能指标如下: (1) TMS320F2812,运行速度150MIPS。 (2) 片内RAM 18K字。 (3) 扩展RAM 64K字。 (4) 片内16路12位A/D转换器, 最大采样速率12.5MSPS。 (5) 扩展的4路12位D/A转换器DAC7617。 (6) 两路UART串行接口,符合RS-232C标准。 (7) 16路PWM输出。 (8) CAN总线标准接口。 (9) 用户开关与指示灯。 (10) 片内128K字Flash存储器,带128位加密位。 (11) IEEE1149.1兼容的逻辑扫描电路即JTAG接口,用于仿真调试。 (12) +5V电源输入, 板上3.3V, 1.8V电源管理。,2019/6/4,山东大学控制学院 张东亮,6,2019/6/4,山东大学控制学院 张东亮,7,2. 软件开发流程,软件开发流程框图,2019/6/4,山东大学控制学院 张东亮,8,软件开发流程,1)编辑:生成源程序(*.asm, *.c)、头文件(*.h) 与命令文件(*.cmd)。 2)编译与汇编:生成目标文件(*.obj ,公共目标文件COFF格式)及列表文件(*.lst)。 3)连接:生成可执行代码文件(*.out)及映射文件(*.map)。 4)调试:通过JTAG接口下载到目标系统EVM。 5) 通过JTAG接口将程序固化烧写到Flash 存储器 。,2019/6/4,山东大学控制学院 张东亮,9,软件开发工具主要有 源程序编辑器(Editor) 编译器(Compiler) 汇编器(Assembler) 链接器(Linker) 归档器(Archiver) 运行时支持库(Run-Time-Support Library) 库建立程序(Library-build Utility) HEX转换程序(Hex Conversion Utility),3. 软件工具,2019/6/4,山东大学控制学院 张东亮,10,绝对列表器(Absolute Lister)和交叉引用列表器(Cross-Reference Lister) 调试工具(Debugging tools) C+名称复原程序(C+ Name Demangling Utility) GEL语言 (General Extension Language,通用扩展语言) DSP/BIOS等。,2019/6/4,山东大学控制学院 张东亮,11,1. CCS软件安装与设置,CCS2.0 C2000 (CCS3.3) 驱动程序设置。 Simulator: PC模拟软件仿真。 Emulator: 实时DSP硬件仿真。,4.2 集成开发环境CCS,2019/6/4,山东大学控制学院 张东亮,12,CCS运行主窗口,2019/6/4,山东大学控制学院 张东亮,13,CCS主要工具,源程序编辑器(Editor)。 C编译器(C Compiler)。 汇编器(Assembler)。 连接器(Linker)。 调试工具(Debug)。 十六进制转换公用程序(Hex Conversion Utility)。,2019/6/4,山东大学控制学院 张东亮,14,2. CCS主要菜单与功能,典型的CCS运行界面如图所示。CCS的功能可以通过菜单或工具条按钮实现。主要的菜单项有File、Edit、View、Project、Debug等。这些菜单的使用与常用的集成开发软件Visual C+等使用方法基本一样。,2019/6/4,山东大学控制学院 张东亮,15,典型CCS运行界面,2019/6/4,山东大学控制学院 张东亮,16,Code Composer Studio Components Robust, Easy-to-Use Development Environment,2019/6/4,山东大学控制学院 张东亮,17,Real-time Debugging,Allows you to halt in non-critical code for debug while time-critical interrupts continue to be serviced. Access memory and registers without stopping the processor. Implemented in silicon, not by a debug monitor: Easy-to-use, no application resources required,Halt and single step non-time critical code,Time-critical interrupts are still serviced.,In Control, If The Processor Stops, The System Can Go Out Of Control,2019/6/4,山东大学控制学院 张东亮,18,File菜单,2019/6/4,山东大学控制学院 张东亮,19,Project菜单,2019/6/4,山东大学控制学院 张东亮,20,View菜单,2019/6/4,山东大学控制学院 张东亮,21,Debug菜单,2019/6/4,山东大学控制学院 张东亮,22,3. 采用CCS开发应用程序的步骤,创建一个新工程(project)。 编辑源程序(*.asm, *.c)与连接命令文件(*.cmd) 。 将文件添加到该工程中(*.asm, *.c, *.h, *.cmd)。 编译汇编连接。 装载程序。 调试程序。 程序固化。,2019/6/4,山东大学控制学院 张东亮,23,调试程序,连续运行与单步运行。 设置断点。 查看与修改存储单元。 查看与修改寄存器内容。 观察和编辑变量。 程序Animate运行和数据图形显示。,2019/6/4,山东大学控制学院 张东亮,24,C工程(Project)几种基本文件,CCS工程文件(扩展名为.pjt)。由CCS自动生成。在CC(Code Composer)软件环境中,扩展名为.mak。 源程序: 汇编语言文件(*.asm), C文件(*.c)。 头文件(*.h): 定义寄存器映射地址,用户自定义的常量等。例如,头文件DSP281x_Adc.h定义了ADC寄存器, 头文件DSP281x_PieVec.h定义了PIE中断矢量。 链接命令文件(*.cmd)。 库文件(*.lib)。 运行时支持库rts2800_ml.lib。 目标文件(*.obj):COFF公共目标文件格式。 列表文件(*.lst):汇编生成的文件。 映射文件(*.map): 存储器分配。 可执行代码文件(*.out)。,4.3 DSP 的C工程文件,2019/6/4,山东大学控制学院 张东亮,25,4.3.1 公共目标文件格式COFF,编译、汇编与链接程序建立的目标文件采用共用目标文件格式(Common Object File Format, COFF),便于模块化编程、管理代码段和存储器,即不必为程序代码或变量指定目标地址。 汇编器根据命令用适当的段将各部分程序代码和数据连在一起,构成目标文件。链接器分配存储单元,即把各个段重新定位到目标存储器中。 段(section,也称为块)是目标文件的最小单位,是在存储器中占据连续空间的代码和数据块,各段相互独立。,2019/6/4,山东大学控制学院 张东亮,26,目标文件中段与目标存储器之间的关系,汇编器的COFF文件格式包括三个默认的段: .text段,即程序段,该段通常包含可执行代码即程序。 .data段,即数据段,该段通常包含已初始化的数据。 .bss段,即保留数据空间段,该段通常为未初始化的数据保留空间。,2019/6/4,山东大学控制学院 张东亮,27,汇编器和链接器允许用户建立和链接自定义的段。所有段可以分为初始化段和未初始化段两类。初始化段包含程序代码和数据。未初始化段则为未初始化的数据保留存储空间。汇编命令.sect和.usect可以分别用来创建自定义的初始化段和未初始化段。,C编译器对C程序编译后也产生初始化段和未初始化段两类,具体的段名稍有不同,除了不使用.data段之外,还产生一些新的段。,2019/6/4,山东大学控制学院 张东亮,28,编译器对C语言编译后除了生成2个基本段,即.text、.bss外,还生成其他一些段。 可分为初始化段和未初始化段。 初始化段包含可执行代码或常数表。C编译器产生的初始化段有 .pint、.const、.econst、.text、.cinit、.switch 。 .text段,包含可执行代码和常量(constant)。 .cinit段和.pint段,包含初始化变量和常量。 .const段,包含串常量,全局变量、静态变量的声明和初始化。 .econst段,包含串常量,全局变量、静态变量的声明和初始化。变量由far const修饰,或用大存储器模型,初始化后放进远(far)存储器。 .switch段,包含switch语句表。,2019/6/4,山东大学控制学院 张东亮,29,未初始化段用于保留存储器(通常为RAM)空间。C编译器产生的为初始化段有.bss、 .ebss、.stack、.sysmem和.esysmem段。 .bss段,为全局和静态变量保留空间。 .ebss段,为全局和静态变量保留空间。变量由far 修饰,或用大存储器模型使用。 .stack段,为C系统堆栈。用于保护函数的返回地址、分配局部变量、调用函数时传递参数。 .sysmem段,为动态存储器分配保留空间, malloc函数使用。 .esysmem段,为动态存储器分配保留空间,far malloc函数使用。,2019/6/4,山东大学控制学院 张东亮,30,初始化段链接,2019/6/4,山东大学控制学院 张东亮,31,未初始化段链接,2019/6/4,山东大学控制学院 张东亮,32,存储器映射表,2019/6/4,山东大学控制学院 张东亮,33,4.3.2 链接命令文件,CCS的链接器可以有很多选项,如-l(包含库文件)、-stack(定义堆栈)、-o(定义输出文件)等,并且将用户软件定义的段与目标系统存储器物理地址对应关系定义清楚。 链接器选项的实现通常采用工程选项菜单或链接器命令文件(.cmd)两种方法。 编写一个链接器命令文件,将所有链接器选项写在文件中,并将此文件加入到工程,这样CCS在进行编译链接时,会自动按照链接器命令文件中的选项进行。 有两条链接器命令MEMORY和SECTIONS可以实现对程序存储器和数据存储器空间的分配。MEMORY命令定义目标存储器的配置,SECTIONS命令定义编程段与目标存储器的关系。,2019/6/4,山东大学控制学院 张东亮,34,MEMORY命令,MEMORY命令定义目标系统中可以使用的存储器范围,每个存储器范围具有名字、起始地址和长度。一般形式为 MEMORY PAGE 0: name: origin=constant, length=constant; PAGE n: name: origin=constant, length=constant; PAGE n:定义存储器空间。n=0254. 通常PAGE 0定义程序存储器,PAGE 1定义数据存储器。 name:存储器范围名字。可以是18个字符。 origin或简写为o:存储器范围的起始地址。 length或简写为l:存储器范围的长度。,2019/6/4,山东大学控制学院 张东亮,35,SECTIONS命令,SECTIONS命令用于将输出各段定位到所定义的存储器。一般形式为 SECTIONS name: property, property, name: property, property, 在段名之后是是特性列表,定义段的内容以及是怎样分配的。段的特性(property)是装载位置、运行位置、输入段、段类型等。通常的特性符号“”表示输出段装载位置。,2019/6/4,山东大学控制学院 张东亮,36,4.4 DSP C语言程序设计基础,4.4.1 数据类型 4.4.2 C语言运算符与基本语句 4.4.3 函数 4.4.4 指针 4.4.5 编译预处理命令 4.4.6 C语言与汇编语言混合编程 4.4.7 C28x DSP编译器的关键字,2019/6/4,山东大学控制学院 张东亮,37,C语言程序设计优缺点,汇编语言程序设计: 执行速度快。 开发周期长、移植性和可读性差 。,C语言程序设计: 开发周期短、移植性和可读性好。 执行速度可以满足要求。,2019/6/4,山东大学控制学院 张东亮,38,C28x DSP具有优化的C编译器,它支持ANSI C 标准。还具有一些不同于标准C的特征。,DSP的基本数据类型如表所示,还具有数组、结构、联合等构造类型数据。,4.4.1 数据类型,2019/6/4,山东大学控制学院 张东亮,39,TMS320C28x C的数据类型,1. C28x编译器基本数据类型,2019/6/4,山东大学控制学院 张东亮,40,片内外设寄存器通常通过结构与联合变量的方法进行访问。,2. 结构,例如,GPIO A口的MUX复用控制寄存器可用位段(bit field)结构表示,struct GPAMUX_BITS unsigned int PWM1_GPIOA0:1; /第0位 unsigned int PWM2_GPIOA1:1; unsigned int C2TRIP_GPIOA14:1; unsigned int C3TRIP_GPIOA15:1; /第15位 ;,2019/6/4,山东大学控制学院 张东亮,41,例如,GPIO D口的MUX复用控制寄存器结构,struct GPDMUX_BITS unsigned int T1CTRIP_PDPA_GPIOD0:1; /第0位 unsigned int T2CTRIP_PDPA_GPIOD1:1; /1 unsigned int rsvd1:3; /4:2,保留unsigned int T3CTRIP_PDPA_GPIOD5:1; /5 unsigned int T4CTRIP_PDPA_GPIOD6:1; /6 unsigned int rsvd2:9; /15:7,保留 ;,当一个结构中有效字段(位段)的长度不足16位时,可以加入保留字段,以保证数据的完整性。,结构变量的定义与成员变量的引用,例如, struct GPDMUX_BITS bit; /bit为 GPDMUX_BITS 类型变量 bit. T1CTRIP_PDPA_GPIOD0=1 /将D0位定义为PDPA功能,2019/6/4,山东大学控制学院 张东亮,42,联合体(也称为共用体)类型,可以将不同类型的数据存放在同一个地方,且占据同样大小的存储空间。,例如,定义联合体类型GPDMUX_REG , union GPDMUX_REG unsigned int all; /all 为无符号整型变量 struct GPDMUX_BITS bit; /bit为结构型变量 ;,联合变量的定义与成员变量的引用,例如, union GPDMUX_REG GPDMUX; / GPDMUX为联合类型变量 GPDMUX.all=1; /将D0引脚定义为PDPA功能,其他为数字I/O,3. 联合,2019/6/4,山东大学控制学院 张东亮,43,联合可以出现在结构和数组中,结构和数组也可以出现在联合中。例如,结构类型GPIO_MUX_REGS, struct GPIO_MUX_REGS union GPAMUX_REG GPAMUX; union GPDMUX_REG GPDMUX; ;,结构变量的定义与成员变量的引用,例如, struct GPIO_MUX_REGS GpioMuxRegs; /表示GpioMuxRegs是结构GPIO_MUX_REGS的一个变量 可以采用点运算符的方法引用各成员变量, GpioMuxRegs.GPAMUX.all=0x077F; /CAP1-3, PWM1-6, T1pwm GpioMuxRegs.GPDMUX.bit.T1CTRIP_PDPA_GPIOD0=1; /PDPA GpioMuxRegs.GPDMUX.bit.T2CTRIP_SOCA_GPIOD1=0; /GPIOD1 GpioMuxRegs.GPDMUX.bit.T3CTRIP_PDPB_GPIOD5=0; /GPIOD5 GpioMuxRegs.GPDMUX.bit.T4CTRIP_SOCB_GPIOD6=0; /GPIOD6 定义GPIO A口时,采用了一条C语句。而定义GPIO D口时,采用了4条C语句。 编程风格可以编程者自己决定。,2019/6/4,山东大学控制学院 张东亮,44,4.4.2 C语言运算符与基本语句,1. C语言运算符,2. C语言基本语句,C语言运算符有算术运算符、关系运算符、逻辑运算符、位操作运算符等。不同的运算符可以有不同的优先级、运算对象个数与结合方向。,C语句有控制语句、表达式语句、函数调用语句、空语句和复合语句五类。控制语句有9种。,2019/6/4,山东大学控制学院 张东亮,45,与普通的C语言程序类似,DSP C程序是由若干模块化的函数构成。函数是C程序的基本模块,子程序就是由函数来实现的。,用户可以根据需要定义自己的功能函数,也可以调用C编译器提供的标准函数(库函数)来完成某种特定的功能。 注意函数调用的规则。,4.4.3 函数,2019/6/4,山东大学控制学院 张东亮,46,C函数的一般格式为 类型函数名(形式参数及其类型表) 变量声明部分; 执行语句部分; 一个函数在程序中可以三种形态出现:函数定义(Definition)、函数调用和函数声明(Declaration)。函数定义相当于汇编语言中的一般子程序。函数调用相当于调用子程序。函数定义和函数调用不分先后,但若调用在定义之前,那么在调用前必须先进行函数声明。函数声明是一个没有函数体的函数定义,而函数调用则要求有函数名和实际参数表。,2019/6/4,山东大学控制学院 张东亮,47,可以用指针的方法访问变量,用指针访问数组、结构、联合变量非常方便。,4.4.4 指针,例如,指向结构类型的指针变量p struct GPDMUX_BITS *p; struct GPDMUX_BITS bit; p= bit的成员T1CTRIP_PDPA_GPIOD0可用下述3种形式之一访问 bit.T1CTRIP_PDPA_GPIOD0 (*p). T1CTRIP_PDPA_GPIOD0 p-T1CTRIP_PDPA_GPIOD0,2019/6/4,山东大学控制学院 张东亮,48,ANSI C 新标准增加了一种 void *指针类型,即可以定义一个指针变量,但不指定它是指向哪一种数据类型,例 unsigned long *Source=(void*) 地址&PieVectTableInit被(void*)强制成了void *类型。指针Source为unsigned long 类型。,例如,描述中断矢量表的指针PINT typedef unsigned int Uint16; /定义一种类型Uint16 Uint16 i; typedef interrupt void (*PINT)(void);/指针PINT指向中断函数 struct PIE_VECT_TABLE PINT PIE1_RESERVED; PINT PIE2_RESERVED; ,2019/6/4,山东大学控制学院 张东亮,49,C语言用指针访问数据存储器(或片内外设寄存器),可以用指针方法实现。 例如,从扩展的外设接口读取开关状态,然后输出到扩展的指示灯外设接口。 #define LBDS (*(unsigned int *)0xc0000) /扩展的外设寄存器,指示灯 #define DIPS (*(unsigned int *)0xc0001) /扩展的外设寄存器,开关 LBDS=DIPS; /读取拨码开关状态直接送指示灯显示 一般将这些定义放到一个头文件,使用时,用编译预处理命令 include包含该头文件即可。,2019/6/4,山东大学控制学院 张东亮,50,main( ) int i; unsigned int * px, * py, * pz; px=(unsigned int *)0x80000; py=(unsigned int *)0x80100; for ( i=0,pz=px; i16;i+,pz+ ) (*pz)=i; for ( i=0,pz=py; i16;i+,pz+ ) (*pz)=0x1234; for ( i=0;i16; i+,px+,py+ ) (*py)=(*px); while(1) ; ,例4-3,将数据存储器80000H开始的16个单元复制到80100H开始的单元。,2019/6/4,山东大学控制学院 张东亮,51,例4-4 扩展外部接口, 编写C程序将4个开关状态反应到4个指示灯。,#include “DSP281x_Device.h“ / DSP281x Head file Include File / 定义指示灯控制寄存器地址和寄存器类型 #define LBDS (*(unsigned int *)0xc0000) / 定义拨码开关控制寄存器地址和寄存器类型 #define DIPS (*(unsigned int *)0xc0001) main( ) InitSysCtrl(); /初始化DSP运行时钟, 自定义函数 while ( 1 ) LBDS=DIPS; /读取拨码开关状态直接送指示灯显示 ,2019/6/4,山东大学控制学院 张东亮,52,宏定义 #define #define PI 3.14159 #define Uint16 unsigned int (typedef unsigned int Uint16; ) #define EINT asm(“ clrc INTM”) EINT; #define EALLOW asm(“ EALLOW”),4.4.5 编译预处理,文件包含#include #include #include “DSP281x_Device.h”,1. 宏定义、文件包含与条件编译,2019/6/4,山东大学控制学院 张东亮,53,条件编译 #ifdef 标识符 程序段1 #else 程序段2 #endif,2019/6/4,山东大学控制学院 张东亮,54,pragma是一类编译预处理命令(directive),通知编译预处理器如何处理函数。C28x C/C+ 支持如下pragma命令, CODE_SECTION(func, “section name”) DATA_SECTION(symbol, “section name”) INTERRUPT(func) FUNC_EXT_CALLED(func) FAST_CALL(func),2. pragma 命令,2019/6/4,山东大学控制学院 张东亮,55,CODE_SECTION 代码段 它为函数func在一个名为section name 的段(section)中指定空间。将一个代码对象连接到一个不同于.text段的空间时,该语法非常有用。例如 char bufferA80; #pragma CODE_SECTION(funA, “codeA”) char funA(int i); void main( ) char c; c=funA(1); char funA(int i) return bufferAi; ,2019/6/4,山东大学控制学院 张东亮,56,DATA_SECTION 数据段 它为符号symbol在一个名为section name 的段中指定空间。将一个数据对象连接到一个不同于.bss段的空间时,该语法非常有用。例如 #pragma DATA_SECTION(bufferB, “my_sect”) char bufferB(512); 数据块bufferB被定位于my_sect段中, my_sect段在.cmd文件中规定物理地址。,2019/6/4,山东大学控制学院 张东亮,57,4.4.6 C语言与汇编语言混合编程,在C程序中直接嵌入汇编语句。 独立的C模块和汇编模块接口。 独立编写C程序与汇编程序,分别编译、汇编生成目标代码模块,然后用连接器连接起来。 从C程序中访问汇编程序变量。,2019/6/4,山东大学控制学院 张东亮,58,1. 在C程序中直接嵌入汇编语句,C程序嵌入汇编语句是一种直接的C模块和汇编模块接口方法。可以在C程序中实现用C语言难以实现的一些硬件控制功能。另一方面,也可以用这种方法在C程序中的关键部分用汇编语句代替C语句以优化程序。 这种方法的一个缺点是它比较容易破坏C环境,因为C编译器在编译嵌入了汇编语句的C程序时并不检查或分析所嵌入的汇编语句。 直接在C语言程序中相应位置嵌入汇编语句,只需在汇编语句加上双引号和小括号,前面加asm标识符号,双引号内第一个字符应是空格。即, asm (“ 汇编语句”) 例如 asm (“ NOP”); #define EINT asm (“ CLRC INTM”) /开放中断 EINT;,2019/6/4,山东大学控制学院 张东亮,59,2. 独立的C模块和汇编模块接口,在编写独立的汇编程序时,必须注意以下几点: (1)不论是用C语言编写的函数还是用汇编语言编写的函数,都必须遵循寄存器使用规则。 (2)必须保护函数要用到的几个特定寄存器。 (3)中断程序必须保护所有用到的寄存器。 (4)从汇编程序调用C函数时,第一个参数(最左边)必须放入累加器A中,剩下的参数按自右向左的顺序压入堆栈。 (5)调用C函数时,注意C函数只保护了几个特定的寄存器,而其他寄存器可以自由使用。 (6)长整型和浮点数在存储器中存放的顺序是低位字在高地址,高位字在低地址。,2019/6/4,山东大学控制学院 张东亮,60,(7)如果函数有返回值,返回值存放在累加器中。 (8)汇编语言模块不能改变由C模块产生的.cinit段,如果改变其内容将会引起不可预测的后果。 (9)编译器在所有标识符(函数名、变量名等)前加下划线“_”。 (10)任何在汇编程序中定义的对象或函数,如果需要在C程序中访问或调用,则必须用汇编指令.global定义。,2019/6/4,山东大学控制学院 张东亮,61,3. 从C程序中访问汇编程序变量,从C程序中访问在汇编程序中定义的变量或常数,可以分为以下3种情况: (1)访问在.bss段中定义的变量。 (2)访问不在.bss段中定义的变量。 (3)对于在汇编程序中用.set和.global伪指令定义的全局常数,也可以使用特殊的操作从C程序中访问它们。,2019/6/4,山东大学控制学院 张东亮,62,例4-5,在C程序中访问在.bss段中定义的变量。 汇编程序: .bss _var,1 ;定义变量 .global _var ;声明为外部变量 C程序: extern int var /声明为外部变量 var=1 /访问变量,2019/6/4,山东大学控制学院 张东亮,63,例4-6,在C程序中访问不在.bss段中定义的变量。 汇编程序: .global _sine ;声明为外部变量 .sect “sine_tab” ;建立一个独立的段 _sine: ;常数表起始地址 .float 0.0 .float 0.015987 .float 0.022145 C程序: extern float sine /声明为外部变量 float *sine_p=sine; /声明一个指针指向该变量 f=sine_p4; /作为普通数组访问sine数组,2019/6/4,山东大学控制学院 张东亮,64,4.4.6 C28x DSP编译器的关键字,C28x DSP C/C+编译器,支持标准的const、register、volatile等关键字, 还扩展了cregister 、interrupt、 far、 near等关键字。,关键字const 该关键字可以优化存储器的分配。加const 到任何变量的定义可以确保其内的值不变。,2019/6/4,山东大学控制学院 张东亮,65,关键字volatile 该关键字所定义的变量是可变的,可以被其他硬件修改,而不仅仅只能由C程序修改。优化器会尽量减少存储器的访问,所以有时必须禁止优化,特别是循环控制变量。例子 volatile unsigned int *ctrl; while(*ctrl != 0xff) ; /循环等待,直到 ctrl 地址的内容为0xff,2019/6/4,山东大学控制学院 张东亮,66,关键字cregster 该扩展关键字允许高级语言读/写控制寄存器。 在F281x C中,cregister仅限于中断使能寄存器IER和中断标志寄存器IFR,程序中应有如下声明 extern cregister volatile unsigned int IER; extern cregister volatile unsigned int IFR; 可以用|(位或)和,2019/6/4,山东大学控制学院 张东亮,67,关键字interrupt 该扩展关键字用来说明函数是一个中断函数。 中断函数被定义成返回void类型,而且无参数调用,例如, interrupt void int_handler( ) unsigned int flags; ,2019/6/4,山东大学控制学院 张东亮,68,关于中断函数,中断的使能和屏蔽必须由程序员自己设置。 中断程序没有参数传递,既使说明,也会被忽略。 中断处理程序不能被正常的C程序调用。 为了使中断程序与中断一致,在相应的中断矢量中必须放置一条转移指令,可以用.sect汇编伪指令建立一个简单的跳转指令表来完成此项功能。 在汇编语言中断程序中,注意在符号名前面加上一个下划线,例如c_int00记为_ c_int00。 中断程序使用的所有寄存器,包括状态寄存器和程序中调用函数使用的寄存器都必须予以保护。,2019/6/4,山东大学控制学院 张东亮,69,关键字far C/C+编译器的默认寻址空间是64K。所有指针的默认大小为16位。C28x支持的寻址空间达4M字, 即22位。加上far关键字限定符的指针大小为22位,可以寻址4M字空间。,2019/6/4,山东大学控制学院 张东亮,70,#include “DSP281x_Device.h“ / DSP281x Header file Include File /定义指示灯寄存器地址和寄存器类型 #define LBDS (*( (unsigned int *)0xc0000) /指定地址的整型变量 void Delay(unsigned int nDelay); /延时子程序,函数声明 main( ) unsigned int uLED4=1,2,4,8; / /控制字 0001, 0010,0100,1000 数组 int i; InitSysCtrl( ); /初始化DSP运行时钟,自定义函数 /系统时钟150MHz, 使能外设时钟,禁止WD while ( 1 ),例4-7 4个LED指示灯接到DSP通过CPLD扩展的外部简单接口电路, 其地址为0xc0000。用C语言编程使之闪烁。,4.5 DSP C程序举例,2019/6/4,山东大学控制学院 张东亮,71, for ( i=0;i=0;i- ) LBDS=uLEDi; /反向顺序送控制字 Delay(256); /延时 ,2019/6/4,山东大学控制学院 张东亮,72,void Delay(unsigned int nDelay) /延时程序, 自定义函数 int ii, jj, kk=0; for ( ii=0; iinDelay; ii+ ) for ( jj=0; jj512; jj+ ) kk+; ,2019/6/4,山东大学控制学院 张东亮,73,#include “DSP281x_Device.h“ / DSP281x Header file Include File /定义指示灯寄存器地址和寄存器类型 void Delay(unsigned int nDelay); /延时子程序,函数声明 #define CTRGR *(int *)0x108000 /控制板全局控制寄存器 #define CTRLR *(int *)0x108007 /控制板辅助控制寄存器 main() InitSysCtrl(); /初始化PLL,CLKOUT=150M, 使能外设时钟,禁止WD EALLOW; / GpioMuxRegs.GPBMUX.all=00; / Configure MUXs as digital I/Os GpioMuxRegs.GPBDIR.all=0x00FF; / GPIO DIR select GPIOB7:1 as output EDIS;,例4-8 1个LED指示灯接到DSP的通用输入输出接口GPIOB5。用C语言编程使之闪烁。,2019/6/4,山东大学控制学院 张东亮,74,void Delay(unsigned int nDelay) /延时程序,自定义函数 int ii,jj,kk=0; for ( ii=0;iinDelay;ii+ ) for ( jj=0;jj512;jj+ ) kk+; ,CTRGR=0; / 初始化ICETEK-CTR CTRGR=0x80; CTRGR=0; CTRLR=0; / 关闭东西方向的交通灯 CTRLR=0x40; / 关闭南北方向的交通灯 CTRGR=2; while(1) GpioDataRegs.GPBDAT.bit.GPIOB5=0; Delay(10); GpioDataRegs.GPBDAT.bit.GPIOB5=1; Delay(10); ,2019/6/4,山东大学控制学院 张东亮,75,例4-9, 1个LED指示灯接到DSP通过扩展的外部简单接口电路的最低位, 其地址为0xc0000。采用通用定时器T1中断方式定时200ms, 用C语言编程使之闪烁,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年医学信息学系统应用考察答案及解析
- 2025年风湿免疫科风湿病诊治技术应用能力检测试卷答案及解析
- 2025年麻醉医学术语知识梳理考核答案及解析
- 2025年急诊护理现场急救演练模拟测试答案及解析
- 2025年预防保健理论知识检测试卷答案及解析
- 2025年传染病学预防控制原理答案及解析
- 2025年放射科常见放射影像解读与诊断综合测试卷答案及解析
- 2025年放射肿瘤科放疗方案设计评估测试卷答案及解析
- 2025年整形美容科尖端技术操作检验答案及解析
- 2025年骨科手术技术与围手术期护理考核答案及解析
- 2025主播签约合同范本
- 2025年咸阳机场安检员考试试题及答案
- 租房商场柜台合同(标准版)
- 湖北宜昌长阳清江水务投资控股集团有限公司招聘笔试题库2025
- (零模)南昌市2025年高三年级九月测试语文试卷(含标准答案)
- 2025年衢州编外考试试题及答案
- 2025-2026学年苏少版(2024)小学美术一年级上册教学计划及进度表
- 水务局面试真题及答案解析:水利行业招聘面试实战
- 邮政储蓄网点一点一策实施方案
- 2025年飞行服务站无人机培训行业现状分析报告
- 2025年中医理疗师考试题库及答案
评论
0/150
提交评论