📄 utils.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 + -