По достижению значения счетчика значения регистра RA на выводе TIOA1 должен устанавливаться высокий уровень, по достижению значения RC (RC>RA) на
TIOA1 должен быть низкий уровень.
Параллельно,чтобы видеть что таймер работает разрешаю прерывания от таймера TC1 по достижению значения RC. В обработчике моргаю светодиодом.
Так вот, светодиод моргает, период тот, что надо.
А вот на ноге TIOA1 висит "0" . Ч
Может не правильно линии выбираю ???, но вроде бы так.
mask = AT91C_PB14_TIOA1 | AT91C_PB15_TIOB1 | AT91C_PB10_TCLK1 ;
AT91C_BASE_PIOB->PIO_PDR =mask; // запр PIO
AT91C_BASE_PIOB->PIO_BSR =mask ; // подкл к пер B
Хотя возникает вопрос , если ,например,линия PB14 мультиплексирована с таймером,ADC,PWM, т.е.
ADC0_AD0/PWM0/TIOA1/PB14, то при вышеописанных действиях как определить какая именно периферия подключена.
Вот код
Код
void timer_init ( void )
{
unsigned int mask;
mask= TC_CLKS_MCK32 | AT91C_TC_WAVE | AT91C_TC_WAVESEL_UP_AUTO | AT91C_TC_ACPA_SET | AT91C_TC_ACPC_CLEAR;
AT91F_TC_Open(AT91C_BASE_TC1,mask,AT91C_ID_TC1);
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_TC1, TIMER1_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,tm1_per_irq_handler);
AT91C_BASE_AIC->AIC_EOICR = 0;
__enable_interrupt();
AT91C_BASE_TC1->TC_IER = AT91C_TC_CPCS; // разр прерыв на уровне TC1 по достижению RC
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_TC1); // разр прерывания на уровне AIC
AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG; // сброс и запуск TC1
}
void AT91F_TC_Open ( AT91PS_TC TC_pt, unsigned int Mode, unsigned int TimerId)
{
unsigned int mask;
mask = AT91C_PB14_TIOA1 | AT91C_PB15_TIOB1 | AT91C_PB10_TCLK1;
AT91C_BASE_PIOB->PIO_PDR =mask; // запр PIO
AT91C_BASE_PIOB->PIO_BSR =mask; // подкл к пер B
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1<< TimerId );
TC_pt->TC_CCR = AT91C_TC_CLKDIS; //* Disable the clock and the interrupts
TC_pt->TC_IDR = 0xFFFFFFFF;
AT91C_BASE_TC1->TC_RA=0x7FFF; // загр RA
AT91C_BASE_TC1->TC_RC=0xFFFE; // загр RC
TC_pt->TC_SR; //* Clear status bit
TC_pt->TC_CMR = Mode; //* Set the Mode of the Timer Counter
TC_pt->TC_CCR = AT91C_TC_CLKEN; //* Enable the clock
}
{
unsigned int mask;
mask= TC_CLKS_MCK32 | AT91C_TC_WAVE | AT91C_TC_WAVESEL_UP_AUTO | AT91C_TC_ACPA_SET | AT91C_TC_ACPC_CLEAR;
AT91F_TC_Open(AT91C_BASE_TC1,mask,AT91C_ID_TC1);
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_TC1, TIMER1_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,tm1_per_irq_handler);
AT91C_BASE_AIC->AIC_EOICR = 0;
__enable_interrupt();
AT91C_BASE_TC1->TC_IER = AT91C_TC_CPCS; // разр прерыв на уровне TC1 по достижению RC
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_TC1); // разр прерывания на уровне AIC
AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG; // сброс и запуск TC1
}
void AT91F_TC_Open ( AT91PS_TC TC_pt, unsigned int Mode, unsigned int TimerId)
{
unsigned int mask;
mask = AT91C_PB14_TIOA1 | AT91C_PB15_TIOB1 | AT91C_PB10_TCLK1;
AT91C_BASE_PIOB->PIO_PDR =mask; // запр PIO
AT91C_BASE_PIOB->PIO_BSR =mask; // подкл к пер B
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1<< TimerId );
TC_pt->TC_CCR = AT91C_TC_CLKDIS; //* Disable the clock and the interrupts
TC_pt->TC_IDR = 0xFFFFFFFF;
AT91C_BASE_TC1->TC_RA=0x7FFF; // загр RA
AT91C_BASE_TC1->TC_RC=0xFFFE; // загр RC
TC_pt->TC_SR; //* Clear status bit
TC_pt->TC_CMR = Mode; //* Set the Mode of the Timer Counter
TC_pt->TC_CCR = AT91C_TC_CLKEN; //* Enable the clock
}