timers.c

来自「BlackFin处理器视频演示代码」· C语言 代码 · 共 164 行

C
164
字号
/**
 *@file timers.c
 *@author Zlatan Stanojevic
 */

#include <services/services.h>

typedef struct
{
	volatile unsigned short *config;
	volatile unsigned long *width;
	volatile unsigned long *period;
	volatile unsigned long *counter;
	volatile unsigned short *enable_reg; int enable_bit;
	volatile unsigned short *disable_reg; int disable_bit;
	volatile unsigned long *status_reg; int run_bit; int irq_bit; int err_bit;
	ADI_INT_PERIPHERAL_ID p_id;
} TimerInfo;


#if defined( __ADSPBF561__ )

#include <cdefBF561.h>

static volatile TimerInfo timers[] = 
{
	{ pTIMER0_CONFIG, pTIMER0_WIDTH, pTIMER0_PERIOD, pTIMER0_COUNTER,
	  pTMRS8_ENABLE, 0, pTMRS8_DISABLE, 0, pTMRS8_STATUS, 12,  0,  4, 
	  ADI_INT_TIMER0 },
	{ pTIMER1_CONFIG, pTIMER1_WIDTH, pTIMER1_PERIOD, pTIMER1_COUNTER,
	  pTMRS8_ENABLE, 1, pTMRS8_DISABLE, 1, pTMRS8_STATUS, 13,  1,  5, 
	  ADI_INT_TIMER1 },
	{ pTIMER2_CONFIG, pTIMER2_WIDTH, pTIMER2_PERIOD, pTIMER2_COUNTER,
	  pTMRS8_ENABLE, 2, pTMRS8_DISABLE, 2, pTMRS8_STATUS, 14,  2,  6, 
	  ADI_INT_TIMER2 },
	{ pTIMER3_CONFIG, pTIMER3_WIDTH, pTIMER3_PERIOD, pTIMER3_COUNTER,
	  pTMRS8_ENABLE, 3, pTMRS8_DISABLE, 3, pTMRS8_STATUS, 15,  3,  7, 
	  ADI_INT_TIMER3 },
	{ pTIMER4_CONFIG, pTIMER4_WIDTH, pTIMER4_PERIOD, pTIMER4_COUNTER,
	  pTMRS8_ENABLE, 4, pTMRS8_DISABLE, 4, pTMRS8_STATUS, 28, 16, 20, 
	  ADI_INT_TIMER4 },
	{ pTIMER5_CONFIG, pTIMER5_WIDTH, pTIMER5_PERIOD, pTIMER5_COUNTER,
	  pTMRS8_ENABLE, 5, pTMRS8_DISABLE, 5, pTMRS8_STATUS, 29, 17, 21, 
	  ADI_INT_TIMER5 },
	{ pTIMER6_CONFIG, pTIMER6_WIDTH, pTIMER6_PERIOD, pTIMER6_COUNTER,
	  pTMRS8_ENABLE, 6, pTMRS8_DISABLE, 6, pTMRS8_STATUS, 30, 18, 22, 
	  ADI_INT_TIMER6 },
	{ pTIMER7_CONFIG, pTIMER7_WIDTH, pTIMER7_PERIOD, pTIMER7_COUNTER,
	  pTMRS8_ENABLE, 7, pTMRS8_DISABLE, 7, pTMRS8_STATUS, 31, 19, 23, 
	  ADI_INT_TIMER7 },
};

#elif defined( __ADSPBF533__ )

#include <cdefBF533.h>

static volatile TimerInfo timers[] = 
{
	{ pTIMER0_CONFIG, pTIMER0_WIDTH, pTIMER0_PERIOD, pTIMER0_COUNTER,
	  pTIMER_ENABLE, 0, pTIMER_DISABLE, 0, (volatile unsigned long *)pTIMER_STATUS, 
	  12,  0,  4, ADI_INT_TIMER0 },
	{ pTIMER1_CONFIG, pTIMER1_WIDTH, pTIMER1_PERIOD, pTIMER1_COUNTER,
	  pTIMER_ENABLE, 1, pTIMER_DISABLE, 1, (volatile unsigned long *)pTIMER_STATUS,
	  13,  1,  5, ADI_INT_TIMER1 },
	{ pTIMER2_CONFIG, pTIMER2_WIDTH, pTIMER2_PERIOD, pTIMER2_COUNTER,
	  pTIMER_ENABLE, 2, pTIMER_DISABLE, 2, (volatile unsigned long *)pTIMER_STATUS,
	  14,  2,  6, ADI_INT_TIMER2 },
};

#elif defined( __ADSPBF537__ )
  
#include <cdefBF537.h>

static volatile TimerInfo timers[] = 
{
	{ pTIMER0_CONFIG, pTIMER0_WIDTH, pTIMER0_PERIOD, pTIMER0_COUNTER,
	  pTIMER_ENABLE, 0, pTIMER_DISABLE, 0, (volatile unsigned long *)pTIMER_STATUS, 
	  12,  0,  4, ADI_INT_TIMER0 },
};

#else
#error Target not supported (yet).
#endif


#include "timers.h"


void timerEnable( int timer )
{
	*(timers[ timer ].enable_reg) = 1 << timers[ timer ].enable_bit;
}


void timerDisable( int timer )
{
	*(timers[ timer ].disable_reg) = 1 << timers[ timer ].disable_bit;
}


int timerIsEnabled( int timer )
{
	return *(timers[ timer ].enable_reg) & ( 1 << timers[ timer ].enable_bit );
}

int timerIsRunning( int timer )
{
	return *(timers[ timer ].status_reg) & ( 1 << timers[ timer ].run_bit );
}


int timerClearInterrupt( int timer )
{
	int imask;
	asm( "cli %0;" :"=d"(imask)	: );
	int ret = *(timers[ timer ].status_reg) & ( 1 << timers[ timer ].irq_bit );
	*(timers[ timer ].status_reg) = 1 << timers[ timer ].irq_bit;
	asm( "sti %0;" : :"d"(imask) );
	return ret;
}


int timerClearOVFError( int timer )
{
	int imask;
	asm( "cli %0;" :"=d"(imask)	: );
	int ret = *(timers[ timer ].status_reg) & ( 1 << timers[ timer ].err_bit );
	*(timers[ timer ].status_reg) = 1 << timers[ timer ].err_bit;
	asm( "sti %0;" : :"d"(imask) );
	return ret;
}


volatile unsigned short *timerConfig( int timer )
{
	return timers[ timer ].config;
}


volatile unsigned long *timerWidth( int timer )
{
	return timers[ timer ].width;
}


volatile unsigned long *timerPeriod( int timer )
{
	return timers[ timer ].period;
}


volatile unsigned long *timerCounter( int timer )
{
	return timers[ timer ].counter;
}

ADI_INT_PERIPHERAL_ID getTimerPeripheralID( int timer )
{
	return timers[ timer ].p_id;
}



⌨️ 快捷键说明

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