Вот код:
Подскажите, а то что-то туплюююю Вот код:
Код
volatile unsigned char doo = 0;
__arm void tim0isr (void)
{
doo = 1;
AT91C_BASE_AIC->AIC_EOICR = AT91C_BASE_TC0->TC_SR;
AT91C_BASE_AIC->AIC_IVR = 0;
AT91C_BASE_AIC->AIC_ICCR = 1 << AT91C_ID_TC0;
AT91C_BASE_AIC->AIC_EOICR = 0;
AT91C_BASE_TC0->TC_IDR = AT91C_TC_CPCS;
}
char InitTimer()
{
AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_TC0;// Enable Clock for TIM0
// TIM0 Interrupt: Mode and Vector with Lowest Priority and Enable
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC0] = AT91C_AIC_PRIOR_HIGHEST;
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC0] = (unsigned long) tim0isrEntry;
AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_TC0);
AT91C_BASE_TC0->TC_CMR = TC_CLKS_MCK32 | AT91C_TC_WAVE | AT91C_TC_WAVESEL_UP_AUTO | AT91C_TC_CPCSTOP;
return 1;
}
void DELAY_MK(unsigned short coef)
{
unsigned int delay = ((coef*22)/15);
AT91C_BASE_TC0->TC_RC = delay;
AT91C_BASE_TC0->TC_IER = AT91C_TC_CPCS;
doo = 0;
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
while(!doo)
;
}
Когда я выполняю:
Код
DELAY_MK(3000);
DELAY_MK(4000);
DELAY_MK(5000);
DELAY_MK(6000);
DELAY_MK(2000);
DELAY_MK(10000);
DELAY_MK(17000);
То это занимает 46 милисекунд, все правильно
А если выполняю:
Код
for(int i =0; i < 20000; i++)
DELAY_MK(6);
То вместо 120 милисекнд, этот код выполняеться чуть более 300 милисекунд.
Вопрос, в чем и где я ошибился? Просто мне нужно гарантированно добиться задержки в 6 микросекунд.
И встречный вопрос. Никто не поделиться кодом, который делает задежку в микросекундах без таймеров, а так просто с помощью нупов или циклом для частоты 48 Мгц???
Заранее всем спасмбо.