Всем добрый день.
Стоит задача используя вход TIOB2 определить частоту сигнала на этом входе (~1Гц-2000кГц)
TIOB2 настроил как внешний триггер по переднему фронту. Настроил загрузку LDRA/LDRB по переднему фронту триггера.
Чтобы грубо оценить частоту считаю кол-во переполнений таймера плюс текущее значение из LDRA/LDRB;
Прикинул код инициализации ТС2
Код
//--------------------------------------------
//настройка timer2
__thumb void ConfigureTC2(void)
{
volatile unsigned int dummy;
// Enable peripheral clock
AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_TC2;
// Disable TC clock
AT91C_BASE_TC2->TC_CCR = AT91C_TC_CLKDIS;
// Disable interrupts
AT91C_BASE_TC2->TC_IDR = 0xFFFFFFFF;
// Clear status register
dummy = AT91C_BASE_TC2->TC_SR;
// Set mode
//LDRB = AT91C_TC_LDRB_RISING
//LDRA = AT91C_TC_LDRA_RISING
//WAVE = 0, capture mode
//CPCTRG = 0
//ABETRG - TIOB external trigger
//ETRGEDG = AT91C_TC_EEVTEDG_RISING
//LDBDIS = 0, Counter clock is not disabled when RB loading occurs.
//BURST = 0
//CLKI = 0, без инверсии клока
//BOARD_MCK/1024 (48000000/1024)
AT91C_BASE_TC2->TC_CMR = AT91C_TC_LDRB_RISING|AT91C_TC_LDRA_RISING|AT91C_TC_EEVTEDG_RISING|AT91C_TC_CLKS_
TIMER_DIV5_CLOCK;
//инсталяция прерываний в AIC
IRQ_DisableIT(AT91C_ID_TC2);
IRQ_ConfigureIT(AT91C_ID_TC2, 1, TC2_ISR);
IRQ_EnableIT(AT91C_ID_TC2);
//разрешаем прерывание по переполнению счётного регистра, внешнего триггера и загрузке регистра А/B
AT91C_BASE_TC2->TC_IER = AT91C_TC_COVFS|AT91C_TC_ETRGS|AT91C_TC_LDRAS|AT91C_TC_LDRBS;
//запуск ТС2
AT91C_BASE_TC2->TC_CCR = AT91C_TC_CLKEN;
}
//--------------------------------------------
Описал обработчик прерываний в котором надеялся увидеть прерывания по загрузке LDRA/LDRB
CODE
//--------------------------------------------
//обработчик прерываний 2
__thumb void TC2_ISR(void)
{
static unsigned int state=0;
static unsigned int ovf_cnt=0;
unsigned int status;
static unsigned int led_stat=0;
//читаем статус прерывания
status = AT91C_BASE_TC2->TC_SR;
//проверка переполнения
if(status&AT91C_TC_COVFS)
{
//переполнение
ovf_cnt++;
}
//проверка загрузки регистра
if( status&AT91C_TC_ETRGS )
{
if(led_stat == 0)
{
led_stat = 1;
SET_LED(LED0);
}
else
{
led_stat = 0;
CLR_LED(LED0);
}
unsigned int val=0;
if(status&AT91C_TC_LDRAS)
{
val = AT91C_BASE_TC2->TC_RA;
}
else
{
val = AT91C_BASE_TC2->TC_RB;
}
//загрузка
if(state == 0)
{
//первый фронт
//исходное состояние
ovf_cnt = 0;
state = 1; //переход на ожидание второго фронта
}
else
{
//второй фронт
//можно определить частоту
unsigned int cnt_num = ovf_cnt*0xffff+val;
if(cnt_num == 0)
{
FRQ = 0xffffffff;
}
else
{
FRQ = BOARD_MCK/(cnt_num*TC2_BOARD_MCK_DIV);
}
//готовимся к след. определению частоты
ovf_cnt = 0;
}
}
}
//--------------------------------------------
Опытным путём уствновил что возникают только прерывания по переполнению AT91C_TC_LDRAS и срабатыванию триггера AT91C_TC_ETRGS , а прерываний AT91C_TC_LDRAS/AT91C_TC_LDRBS отсутствуют. Может кто подскажет что там ещё надо настроить чтоб они появились? Перечитал несколько раз описание ТС2 и всё время прихлжу к одному и тому же коду инициализации.