先看一下第一个实验的整个程序源码·
部分注释修改了哦亲
1 /*外部数据RAM测试程序*/ 2 #include "global.c" 3 void SystemInit(); 4 void RAM_Test(); 5 void KickDog(); 6 7 main() 8 { 9 10 SystemInit(); /*系统初始化*/ 11 12 MCRA=MCRA & 0xC0FF; //IOPB0-6设为IO口模式 13 PBDATDIR=0xFFC2; //所有LED=0 14 PBDATDIR=PBDATDIR |0x003C; //pb0口所接的led灭了哦,然后下面就是4秒, 15 //源程序可没有进入while循环哦,除非把“!=” 16 //变为“=” 17 18 RAM_Test(); 19 20 while(1); 21 22 } 23 24 void SystemInit() 25 { 26 27 asm(" SETC INTM "); /* 关闭总中断 */ 28 asm(" CLRC SXM "); /* 禁止符号位扩展 */ 29 asm(" CLRC CNF "); /* B0块映射为 on-chip DARAM*/ 30 asm(" CLRC OVM "); /* 累加器结果正常溢出*/ 31 SCSR1=0x83FE; /* 系统时钟CLKOUT=20*2=40M */ 32 /* 打开ADC,EVA,EVB,CAN和SCI的时钟,系统时钟CLKOUT=40M */ 33 WDCR=0x006F; /* 禁止看门狗,看门狗时钟64分频 */ 34 KickDog(); /* 初始化看门狗 */ 35 IFR=0xFFFF; /* 清除中断标志 */ 36 IMR=0x0000; /* 打开中断2*/ 37 38 } 39 40 void RAM_Test() 41 { 42 43 unsigned int i=0,j=0,t=0; 44 unsigned int *addr=(unsigned int *)0x8000; 45 46 for(i=0x7FFF;i<0xFFFF;i++) 47 { 48 49 *addr=0x5555; 50 while((*addr)!=0x5555) 51 { 52 if((t%1000)==0) 53 { 54 if((PBDATDIR& 0x0001)==0x0001) 55 PBDATDIR=PBDATDIR & 0xFFFE; //IOPB0=0;LED灭 56 else 57 PBDATDIR=PBDATDIR |0x0101; //IOPB0=1;LED亮 58 } 59 t++; 60 } 61 addr++; 62 for(j=0;j<50;j++); 63 64 } 65 66 PBDATDIR=PBDATDIR |0x0101; //IOPB0=1;LED亮 67 68 } 69 70 void KickDog() /*踢除看门狗 */ 71 { 72 WDKEY=0x5555; 73 WDKEY=0xAAAA; 74 }
注解:1、unsigned int *addr=(unsigned int *)0x8000; 为把地址“0x8000” )存入无符号整型指针变量addr。
2、*addr=0x5555; 为向此地址写入值“0x5555”
3、
1 while((*addr)!=0x5555) 2 { 3 if((t%1000)==0) //修改数值,在掉入次循环时候,调节PB0对应led灯闪烁的频率 4 { 5 if((PBDATDIR& 0x0001)==0x0001) 6 PBDATDIR=PBDATDIR & 0xFFFE; //IOPB0=0; 控制LED灭 7 else 8 PBDATDIR=PBDATDIR |0x0101; //IOPB0=1;LED亮 9 } 10 t++; 11 }
如上这段程序是一个开关,即,如果成功把值“0x5555”写入ram,则掉入while循环(当然了,把源程序中的“!=”改为“=”才能打开开关)。
4、源程序是pb0所接的led灯初始灭 的,然后4秒后又亮了,这里的4秒是软件延时。一般一条c语句的for循环是8个机器周期,lf2407时钟频率是40MHz,即
其时钟周期为25ns,剩下自己算吧。还有一种方法,就是用ccs软件,的profiler功能里面能测量某段程序的执行时间。具体用法参考如下
点我点我点我CCS调试及代码运行时间统计和这个CCS查看DSP程序运行时间
5、源程序源码注释有点问题哦,此文给的注释已经修改了哦,亲