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 + -
显示快捷键?