- 48
- 0
- 约1.92万字
- 约 82页
- 2017-04-14 发布于江苏
- 举报
* 山东大学控制学院 张东亮 * 4.4.6 C28x DSP编译器的关键字 C28x DSP C/C++编译器,支持标准的const、register、volatile等关键字, 还扩展了cregister 、interrupt、 far、 near等关键字。 关键字const 该关键字可以优化存储器的分配。加const 到任何变量的定义可以确保其内的值不变。 * 山东大学控制学院 张东亮 * 关键字volatile 该关键字所定义的变量是可变的,可以被其他硬件修改,而不仅仅只能由C程序修改。优化器会尽量减少存储器的访问,所以有时必须禁止优化,特别是循环控制变量。例子 volatile unsigned int *ctrl; while(*ctrl != 0xff) ; //循环等待,直到 ctrl 地址的内容为0xff * 山东大学控制学院 张东亮 * 关键字cregster 该扩展关键字允许高级语言读/写控制寄存器。 在F281x C中,cregister仅限于中断使能寄存器IER和中断标志寄存器IFR,程序中应有如下声明 extern cregister volatile unsigned int IER; extern cregister volatile unsigned int IFR; 可以用|(位或)和(位与)进行操作,例如 IFR|=0x100; IFR=0x100; * 山东大学控制学院 张东亮 * 关键字interrupt 该扩展关键字用来说明函数是一个中断函数。 中断函数被定义成返回void类型,而且无参数调用,例如, interrupt void int_handler( ) { unsigned int flags; … } * 山东大学控制学院 张东亮 * 关于中断函数 中断的使能和屏蔽必须由程序员自己设置。 中断程序没有参数传递,既使说明,也会被忽略。 中断处理程序不能被正常的C程序调用。 为了使中断程序与中断一致,在相应的中断矢量中必须放置一条转移指令,可以用.sect汇编伪指令建立一个简单的跳转指令表来完成此项功能。 在汇编语言中断程序中,注意在符号名前面加上一个下划线,例如c_int00记为_ c_int00。 中断程序使用的所有寄存器,包括状态寄存器和程序中调用函数使用的寄存器都必须予以保护。 * 山东大学控制学院 张东亮 * 关键字far C/C++编译器的默认寻址空间是64K。所有指针的默认大小为16位。C28x支持的寻址空间达4M字, 即22位。加上far关键字限定符的指针大小为22位,可以寻址4M字空间。 * 山东大学控制学院 张东亮 * #include DSP281x_Device.h // DSP281x Header file Include File //定义指示灯寄存器地址和寄存器类型 #define LBDS (*( (unsigned int *)0xc0000)) //指定地址的整型变量 void Delay(unsigned int nDelay); //延时子程序,函数声明 main( ) { unsigned int uLED[4]={1,2,4,8}; / /控制字 0001, 0010,0100,1000 数组 int i; InitSysCtrl( ); //初始化DSP运行时钟,自定义函数 //系统时钟150MHz, 使能外设时钟,禁止WD while ( 1 ) 例4-7 4个LED指示灯接到DSP通过CPLD扩展的外部简单接口电路, 其地址为0xc0000。用C语言编程使之闪烁。 +3.3V 1k LED 4.5 DSP C程序举例 * 山东大学控制学院 张东亮 * { for ( i=0;i4;i++ ) { LBDS=uLED[i]; //正向顺序送控制字 Delay(256); //延时 } for ( i=3;i=0;i-- ) { LBDS=uLED[i]; //反向顺序送控制字 Delay(256); //延时 } } } * 山东大学控制学院 张东亮 * void Delay(unsigned int nDelay) //延时程序, 自定义函数 { int ii, jj, kk=0; for ( ii=
原创力文档

文档评论(0)