⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 analy.c

📁 这是本人参与实验室项目编写的实现dvb-mpeg2码流解复用中和码流相关的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************/
/*                                                                         */
/*     analy . C                                                           */
/*                                                                         */
/*                                                                         */
/***************************************************************************/



/***************************************************************************/

#include "54regs.h"			//54寄存器定义
#include "defdef.h"			//宏定义
#include "stdio.h"

/***************************************************************************/



/***************************************************************************/
/*                                                                         */
/*     定义函数		                                                       */
/*                                                                         */
/*                                                                         */
/*                                                                         */
/***************************************************************************/




void initial(void);              //系统初始化
void resetfifo(void);            //各FIFO清零
void loaddata(void);             //搬移数据(8010H---),要计算码率的pid信息
void readin(void);
int  getpid(int a ,int b);
void getpidpacket();//取特定pid值TS包
void caculaterate();//计算码率
void interrupt tint(void);
void wait(void);



/***************************************************************************/



//变量
/***************************************************************************/
int receiveTS[200];                  //存放读取的TS流
int ramdata[0x100];                    //存放RAM搬移数据(8010H---)放到ramdata[]中
int pid;                          //读取ts流的pid值
int tsnum;                        //要求查找或计算码率的pid值                                     
int halfflag;                     //半满标志
int getpidflag;                   //标志规定pid号的TS包是否找到
int siaddr;                       //上传SI包起始地址
int incnum;                       //上传SI包时设置为增长变量 0--187
int timer=0;                      //计时用timer=1000时1秒计时到
int num1=0;                         //7010---7019
int num2=0;                         //7020---7029
int num3=0;                         //7030---7039
int num4=0;                         //7040---7049
int tempdata;                     //临时读取的数据,作判断用
/***************************************************************************/



void main()
{//main
  
   initial();            //系统初始化
   resetfifo();          //各FIFO清零
   
   for(;;)
   {
   
  analy_pro:
  
   
  /* wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();
   wait();*/
   
   /*for(;;)
   {
   asm("  nop   ");
   }*/
   
   
   //PtoD(0x8002,&tempdata,0);
   /*asm(" stm   #14h,AR4     ");
   asm(" pshd   AR4     ");
   asm(" mvpd   8002h,*AR4     ");
   tempdata=(*AR4);
   asm(" popd   AR4     ");*/
   
   
   PtoD(0x8000,&tempdata,0);
   PtoD(0x8001,&tempdata,0);
   PtoD(0x8003,&tempdata,0);
   PtoD(0x8002,&tempdata,0);
   if(tempdata==1)
     { 
       getpidflag=0;
       PtoD(0x8004,&tempdata,0);
       if(tempdata==1)
            {
             getpidpacket();
             goto analy_pro;
            }
       else 
            if(tempdata==2)
            {
            caculaterate(); 
            goto analy_pro;
            }    
     }  
        
   }//analy_pro

}//main







void initial()
{



/**初始化系统**************/

/**配置C5402系统寄存器*****/

			   asm ("   STM		#0x2f92,SWWSR	");
			   ////*SWWSR=0x2f92;         //0010 1111 1001 0010
			   asm ("   STM     #0x0002,BSCR	");                       //I/O等待2个时钟,数据和程序空间无等待???
               ////*BSCR=0x0000;          //为块切换等待0个时钟
               asm ("   STM		#0x0ffe8,PMST	");
               //*PMST=0x0ffe8;
		       ////*PMST=0xffe8;          //0x17e8=0001 0111 1110 1000
		                                //0x1780=0001 0111 1000 0000
		       //*ST0=0x1800;           //复位数据页指针,DP数据存储器页面指针
		       //*ST1=0x2900;           //0001 1000 0000 0000
		                              //0010 1001 0000 0000 两者均为复位后的值
                                      //屏蔽全局中断
    
/**使所有的中断无效*******/
		         asm ("   STM    #0x0000,IMR	");
		         asm ("   STM    #0x0FFFF,IFR	");
		                              //INTM已通过ST1初始化置1
				////*IMR=0x0000;          //屏蔽所有的中断
				////*IFR=0x0FFFF;         //清除中断标志寄存器
				
/**时钟方案选择***********/
                
			    asm ("   STM		#0x9007,CLKMD	");
				////*CLKMD=0x9007;        //设置DSP时钟到160MHz 6.25ns
				                      //1001 0000 0000 0111 
				                      //工作在PLL模式,PLL模式开
				                      //PLL计数器为0  乘法系数为10

/**设置定时器控制寄存器***/
                asm ("   STM		#0x0010,TCR	");
			    ////*TCR=0x0010;          //片内定时器0停止
			    
			    

}






void resetfifo()
{
 
 porte005=0x8011;

}





void loaddata()
{
    int data;
    int start=0x8010;
    int i;
    for(i=0;i<0x60;i++)
    {
       
   	   PtoD(start,&data,0);
   	   ramdata[i]=data;
   	   start++;
   	   
   	}                               

}





void readin()
{
   int i;
   for(i=1;i<188;i++)
   {
     receiveTS[i]=port00;  
   }
}




int getpid(int a ,int b)

{   int apid;
    int bpid;
    apid=a<<8;
    bpid=b;
    apid=(apid|bpid)&0x1fff;
    return apid;
}  






void getpidpacket()
{
     int i;

     PtoD(0x8006,&tempdata,0);
     tsnum=tempdata;
 
    do{
        halfflag=porte006;           //读取半满标志
  
        for(;;)              //判断IN_FIFO是否半满
        {                     //值为0x0040时未半满
                             //半满时读取
        halfflag=porte006;
       if(halfflag!=0x0040)
         break;
    
        } 
    
    //resetfifo();
    
        for(;;)             //读取同步
       {
   
        receiveTS[0]=port00;
        receiveTS[0]=receiveTS[0]&0x80ff;
        if(receiveTS[0]==0x8047)
          break;
    
        } 
    
    
       readin();       //开始数据的读取放到receiveTS[]中
  
       pid=getpid(receiveTS[1],receiveTS[2]);
       
       if(pid==tsnum)
       {
       
          siaddr=0x9008;
          incnum=0;
       
          for(i=0;i<188;i++)
          {
          DtoP(siaddr++,&receiveTS[incnum++],0);
          }
       
          tempdata=0;
          DtoP(0x8002,&tempdata,0);    //修改上传下传标志
          DtoP(0x8004,&tempdata,0);
       
          tempdata=1;
          DtoP(0x9002,&tempdata,0);
          DtoP(0x9004,&tempdata,0);
       
          getpidflag=1;
       

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -