📄 analy.c
字号:
/***************************************************************************/
/* */
/* 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 + -