Никак не могу побороть проблему с генерацией временных задержек таймером.
Код
#define TC_CLKS_MCK8 0x1
void timer_init ( void )
{
AT91F_TC_Open(AT91C_BASE_TC1,TC_CLKS_MCK8,AT91C_ID_TC1);
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_TC1, TIMER1_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, timer1_c_irq_handler);
AT91C_BASE_TC1->TC_IER = AT91C_TC_CPCS;
}
Таким образом,инкримент счетчика будет происходить 48000000/8=6000000 раз/с.
сделал процедурку
Код
void UTIL_DelayTimeInUs(unsigned long time_us)
{
DelayFlag = 0;
AT91C_BASE_TC1->TC_RC = 6*time_us; //умножив на шесть, получим 1 инкримент счетчика за 1мкс
//умножив все это на требуемое количество мкс получим прерывание, по истечении заданного кол-ва мкс
AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG;
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_TC1);
while(!DelayFlag);
AT91F_AIC_DisableIt (AT91C_BASE_AIC, AT91C_ID_TC1);
}
void timer1_c_irq_handler(void)
{
AT91PS_TC TC_pt = AT91C_BASE_TC1;
unsigned int dummy;
static unsigned long usCount = 0;
//* Acknowledge interrupt status
dummy = TC_pt->TC_SR;
//* Suppress warning variable "dummy" was set but never used
dummy = dummy;
DelayFlag = 1;
MOV_PWM(); //вызываю требуемую ф-цию
}
Решил прописать вызов MOV_PWM() прямо в обработчике - срабатывает моментально, не дожидаясь окончания заданного интервала ( UTIL_DelayTimeInUs(6000000); задержка должна быть 6с!). если же убрать MOV_PWM из обработчика и прописать
Код
UTIL_DelayTimeInUs(6000000);
MOV_PWM();
то MOV_PWM() вообще не вызывается, подскажите пожалуйста, в чем проблемма.