27-03-2017, 19:12
Kod:
void TC3_Handler(){
TC_GetStatus(TC1, 0);
}
void startTimer(Tc *tc, uint32_t channel, IRQn_Type irq, uint32_t frequency){
pmc_set_writeprotect(false);
pmc_enable_periph_clk((uint32_t)irq);
TC_Configure(tc, channel, TC_CMR_WAVE|TC_CMR_WAVSEL_UP_RC|TC_CMR_TCCLKS_TIMER_CLOCK4);
uint32_t rc = VARIANT_MCK/128/frequency;
TC_SetRA(tc, channel, rc/2);
TC_SetRC(tc, channel, rc);
TC_Start(tc, channel);
tc->TC_CHANNEL[channel].TC_IER = TC_IER_CPCS;
tc->TC_CHANNEL[channel].TC_IDR = ~TC_IER_CPCS;
NVIC_EnableIRQ(irq);
}
void setup() {
startTimer(TC1, 0, TC3_IRQn, 1);
}
void loop() {
}
Użyłem takiego kodu. W rutynie TC3_Handler() będą się działy rzeczy z częstotliwością 1Hz. Poroblem w tym iż dzieje mi się tylko 4 razy. Wyjaśnię to tak. Program mieli rzeczy na wyświetlacz w kółko. A w Handler wykonuje tylko obliczenia 1/sec. Sprawdziłem to tak. W loop dałem serial.print("ekran "); a w handler serial.println("sec ");. Na terminalu wypisuje tak:
e e e e e e e e e e e e sec
e e e e e e e e e e e e sec
e e e e e e e e e e e e sec
e e e e e e e e e e e e sec
sec
sec
sec
itd....
Dlaczego tylko 4 razy ?
Oczywiście to wywaliłem: counter++; if(counter > 3) x++; counter = 0; //wcześniej było dla tego że timer liczył tylko 0,25s i musiał to 4 razy powtórzyć.