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

📄 utils.c

📁 TS201 FFT程序
💻 C
字号:
//ADSP TS-201 下常用功能函数   ----zww
//文件名:utils.c
//最新修改:2008-03-19
//最新修改:2008-07-07

#include <sysreg.h>								//DSP主要寄存器读写函数所使用的寄存器ID
#include <builtins.h>							//提供DSP基本数据类型和寄存器读写函数
#include <signal.h>								//中断函数库
#include <defts201.h> 						//DSP寄存器基本定义和位定义
#include "utils.h"

///////////////////////////////////////////////////
//初始化板卡,必须在操作板卡前首先使用
void init_Tiger(void)
{
	unsigned long syscon,sdrcon; //复位后默认为 syscon:0xXX009067 sdrcon:0xXX000000 其中XX为未定义
	
	//此处的位定义在 defts201.h 中
	syscon = 	SYSCON_MP_WID64 | SYSCON_MEM_WID64 |SYSCON_MSH_PIPE2|SYSCON_MSH_WT0 |  
		        SYSCON_MSH_IDLE | SYSCON_MS1_PIPE1 |SYSCON_MS1_WT3  |SYSCON_MS1_IDLE | 
						SYSCON_MS0_SLOW | SYSCON_MS0_WT3   |SYSCON_MS0_IDLE;
  	 
  	 
  sdrcon = SDRCON_INIT | SDRCON_RAS2PC5 | SDRCON_PC2RAS2 |             
           SDRCON_REF3700 | SDRCON_PG256 | SDRCON_CLAT2 | 
           SDRCON_ENBL;
 
 	//此处的读写函数定义在 builtins.h 中
	__builtin_sysreg_write(__SYSCON, 0x1899a5); 
  __builtin_sysreg_write(__SDRCON, 0x59a5); 
}



///////////////////////////////////////////////////
//得到程序所在芯片ID :ID初值为 0
int GetIDC(void)
{ 
	//SYSTAT的 bit0~bit2 为处理器系统中的ID号
 	return (int)(__builtin_sysreg_read(__SYSTAT)&0x7);
} 

//////////////////////////////////////////////////
//将信号灯设置为输出使能状态,信号灯初始为 灯灭状态
void prep_leds(void)
{
	//FLAG寄存器有三个 :FLAG存储值,FLAGREGST设置值,FLAGREGCL清除值
	//FLAG2、FLAG3 对应于LED0、LED1
	__builtin_sysreg_write(__FLAGREGST,FLAGREG_FLAG2_EN  );  
}

//////////////////////////////////////////////////
//将指定flag管脚设置为输出状态,可选参数:FLAG0,FLAG1,FLAG2,FLAG3
void set_flags_as_output(unsigned long mask)
{
	
	if(mask&FLAG0)	__builtin_sysreg_write(__FLAGREGST,FLAGREG_FLAG0_EN );	
	if(mask&FLAG1)	__builtin_sysreg_write(__FLAGREGST,FLAGREG_FLAG1_EN );
	if(mask&FLAG2)	__builtin_sysreg_write(__FLAGREGST,FLAGREG_FLAG2_EN );
	if(mask&FLAG3)	__builtin_sysreg_write(__FLAGREGST,FLAGREG_FLAG3_EN );
	
}	

//////////////////////////////////////////////////
//将信号灯的状态取反,参数可选为:LED0,LED1
void toggle_leds(unsigned long mask)
{
	int temp;
	temp= __builtin_sysreg_read(__FLAGREG);
	
	if(mask&LED0){
		if(temp&FLAGREG_FLAG2_OUT ){
			__builtin_sysreg_write(__FLAGREGCL,~(FLAGREG_FLAG2_OUT) );
		}else{
			__builtin_sysreg_write(__FLAGREGST,FLAGREG_FLAG2_OUT );
		}
	 			
	}	
	
	if(mask&LED1){
		if(temp&FLAGREG_FLAG3_OUT ){
			__builtin_sysreg_write(__FLAGREGCL,~(FLAGREG_FLAG3_OUT) );
		}else{
			__builtin_sysreg_write(__FLAGREGST,FLAGREG_FLAG3_OUT );
		}
	}

}


//////////////////////////////////////////////////
//打开信号灯,参数可选为:LED0,LED1
void leds_on(unsigned long mask)
{
	if(mask&LED0){
	 	__builtin_sysreg_write(__FLAGREGST,FLAGREG_FLAG2_OUT);		
	}	
	
	if(mask&LED1){
		__builtin_sysreg_write(__FLAGREGST,FLAGREG_FLAG3_OUT);
	}
		 

}


//////////////////////////////////////////////////
//关闭信号灯,参数可选为:LED0,LED1
void leds_off(unsigned long mask)
{
	if(mask&LED0){
	 	__builtin_sysreg_write(__FLAGREGCL,~(FLAGREG_FLAG2_OUT));		
	}	
	
	if(mask&LED1){
		__builtin_sysreg_write(__FLAGREGCL,~(FLAGREG_FLAG2_OUT));
	}

}



//////////////////////////////////////////////////
//设置指定的flag管脚输出高电平,可选参数:FLAG0,FLAG1,FLAG2,FLAG3
void set_flags(unsigned long mask)
{
	if(mask&FLAG0)	__builtin_sysreg_write(__FLAGREGST,FLAGREG_FLAG0_OUT );	
	if(mask&FLAG1)	__builtin_sysreg_write(__FLAGREGST,FLAGREG_FLAG1_OUT );
	if(mask&FLAG2)	__builtin_sysreg_write(__FLAGREGST,FLAGREG_FLAG2_OUT );
	if(mask&FLAG3)	__builtin_sysreg_write(__FLAGREGST,FLAGREG_FLAG3_OUT );
}



//////////////////////////////////////////////////
//将flag管脚的输出值取反,可选参数:FLAG0,FLAG1,FLAG2,FLAG3
void toggle_flags(unsigned long mask)
{
	int temp;
	temp= __builtin_sysreg_read(__FLAGREG);
	
	if(mask&FLAG0){
		if(temp&FLAGREG_FLAG0_OUT){
			__builtin_sysreg_write(__FLAGREGCL,~FLAGREG_FLAG0_OUT);
		}else{
			__builtin_sysreg_write(__FLAGREGST,FLAGREG_FLAG0_OUT);
		}
	 			
	}	
	
	if(mask&FLAG1){
		if(temp&FLAGREG_FLAG1_OUT){
			__builtin_sysreg_write(__FLAGREGCL,~FLAGREG_FLAG1_OUT);
		}else{
			__builtin_sysreg_write(__FLAGREGST,FLAGREG_FLAG1_OUT);
		}
	}
	
	if(mask&FLAG2){
		if(temp&FLAGREG_FLAG2_OUT){
			__builtin_sysreg_write(__FLAGREGCL,~FLAGREG_FLAG2_OUT);
		}else{
			__builtin_sysreg_write(__FLAGREGST,FLAGREG_FLAG2_OUT);
		}
	 			
	}	
	
	if(mask&FLAG3){
		if(temp&FLAGREG_FLAG3_OUT){
			__builtin_sysreg_write(__FLAGREGCL,~FLAGREG_FLAG3_OUT);
		}else{
			__builtin_sysreg_write(__FLAGREGST,FLAGREG_FLAG3_OUT);
		}
	}

}
//////////////////////////////////////////////////
//清除指定的flag管脚输出电平,可选参数:FLAG0,FLAG1,FLAG2,FLAG3
void clr_flags(unsigned long mask)
{
	if(mask&FLAG0)	__builtin_sysreg_write(__FLAGREGCL,~FLAGREG_FLAG0_OUT);	
	if(mask&FLAG1)	__builtin_sysreg_write(__FLAGREGCL,~FLAGREG_FLAG1_OUT);
	if(mask&FLAG2)	__builtin_sysreg_write(__FLAGREGCL,~FLAGREG_FLAG2_OUT);
	if(mask&FLAG3)	__builtin_sysreg_write(__FLAGREGCL,~FLAGREG_FLAG3_OUT);
}


//////////////////////////////////////////////////
//设置定时器初始值,mask可选值:TMR0RN,TMR1RN。lo、hi为输入
void init_timer(int timer,unsigned long hi,unsigned long lo)
{
	int temp;
	temp= __builtin_sysreg_read(__INTCTL);
	if(timer == 0){
        __builtin_sysreg_write(__INTCTL,temp&(~INTCTL_TMR0RN));
		__builtin_sysreg_write(__TMRIN0L,lo);
		__builtin_sysreg_write(__TMRIN0H,hi);
	}
	else if (timer == 1){
		__builtin_sysreg_write(__INTCTL,temp&(~INTCTL_TMR1RN)); 
	    __builtin_sysreg_write(__TMRIN1L,lo);
		__builtin_sysreg_write(__TMRIN1H,hi);
				
	}
		
}
//////////////////////////////////////////////////
//启动定时器,mask可选值:TMR0RN,TMR1RN
unsigned int start_timer(int timer)
{
	int temp;
	temp= __builtin_sysreg_read(__INTCTL);
	if(timer == 0)
	{		
		__builtin_sysreg_write(__INTCTL,temp|INTCTL_TMR0RN);
		return (__builtin_sysreg_read(__TIMER0L));
		
	}
	else if(timer == 1)
	{
		__builtin_sysreg_write(__INTCTL,temp|INTCTL_TMR1RN);
		return (__builtin_sysreg_read(__TIMER1L));
	}
	return 0;
}
//////////////////////////////////////////////////
//关闭定时器,mask可选值:TMR0RN,TMR1RN
unsigned int stop_timer(int timer)
{
	volatile unsigned int temp;
	temp= __builtin_sysreg_read(__INTCTL);
	if(timer == 0)
	{		
		__builtin_sysreg_write(__INTCTL,temp&(~INTCTL_TMR0RN));
		return (__builtin_sysreg_read(__TIMER0L));
		
	}
	else if(timer == 1)
	{
		__builtin_sysreg_write(__INTCTL,temp&(~INTCTL_TMR1RN));
		return (__builtin_sysreg_read(__TIMER1L));
	}
	return 0;
	

}
//////////////////////////////////////////////////
//读取定时器现在的值,mask可选值:TMR0RN,TMR1RN。lo、hi为输出
unsigned int get_timer(int timer,int *hi,int *lo)
{
	if (timer == 0) 
	{
		*hi = __builtin_sysreg_read(__TIMER0H);
		*lo = __builtin_sysreg_read(__TIMER0L);		
	}
	else if (timer == 1)
	{
		*hi = __builtin_sysreg_read(__TIMER1H);
		*lo = __builtin_sysreg_read(__TIMER1L);		
	}
	return (*lo);
	
}
//////////////////////////////////////////////////
//设置IRQ中断管脚的触发方式:LEVEL 电平触发、EDGE 边沿触发
void irq_set_trigger(unsigned long mask,unsigned long type)
{
	int temp;
	temp= __builtin_sysreg_read(__INTCTL);
	if(type== LEVEL)
	{
		switch(mask)
		{
			case IRQ0:__builtin_sysreg_write(__INTCTL,temp|INTCTL_IRQ0_EDGE);
				break;
			case IRQ1:__builtin_sysreg_write(__INTCTL,temp|INTCTL_IRQ1_EDGE);
				break;
			case IRQ2:__builtin_sysreg_write(__INTCTL,temp|INTCTL_IRQ2_EDGE);
				break;
			case IRQ3:__builtin_sysreg_write(__INTCTL,temp|INTCTL_IRQ3_EDGE);
				break;
			default:break;
		}
	}else
	{
		switch(mask)
		{
			case IRQ0:__builtin_sysreg_write(__INTCTL,temp&(~INTCTL_IRQ0_EDGE));
				break;
			case IRQ1:__builtin_sysreg_write(__INTCTL,temp&(~INTCTL_IRQ1_EDGE));
				break;
			case IRQ2:__builtin_sysreg_write(__INTCTL,temp&(~INTCTL_IRQ2_EDGE));
				break;
			case IRQ3:__builtin_sysreg_write(__INTCTL,temp&(~INTCTL_IRQ3_EDGE));
				break;
			default:break;
		}
	}
}
//////////////////////////////////////////////////
//提供粗略的延时,时间长度由time参数决定
void delay(int time)
{
	int i,j;
	for(i=0;i<time;i++)
	{
		for(j=0;j < DELAYLEN;j++)
		;
	}
}
//////////////////////////////////////////////////



⌨️ 快捷键说明

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