vendredi 13 juillet 2007, par patrick Deflandre
Pour utiliser un compteur et générer une horloge sur sa sortie A, il faut :
activer la clock du périphérique,
valider la fonction périphérique du port IO,
desactiver le compteur,
modifier sa config pour obtenir l’effet désiré,
configurer le gestionnaire d’interruption,
valider les interruptions du compteur
parametrer les valeurs du compteur,
et enfin valider et trigger le compteur.
Ce qui donne par exemple :
// Enable the USART clock.
AT91F_TC0_CfgPMC();
// Set the alternative io port
AT91C_BASE_PIOB->PIO_ASR = AT91C_PB23_TIOA0;
AT91C_BASE_PIOB->PIO_PDR = AT91C_PB23_TIOA0;
AT91C_BASE_PIOB->PIO_ODR = AT91C_PB23_TIOA0;
// disable the counter before any change
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS;
// Select the timer0 mode
AT91C_BASE_TC0->TC_CMR = AT91C_TC_CLKS_TIMER_DIV1_CLOCK
| AT91C_TC_WAVE
| AT91C_TC_WAVESEL_UP_AUTO
| AT91C_TC_ASWTRG_SET
| AT91C_TC_ACPA_CLEAR
| AT91C_TC_LDRA
| AT91C_TC_ACPC_SET
| AT91C_TC_CPCTRG;
// Enable the corresponding interrupts in the AIC.
AT91F_AIC_ConfigureIt( AT91C_BASE_AIC,
AT91C_ID_TC0,
motorINTERRUPT_LEVEL,
AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE,
( void (*)( void ) ) vTimerISR );
AT91F_AIC_ClearIt( AT91C_BASE_AIC, AT91C_ID_TC0 );
AT91F_AIC_EnableIt( AT91C_BASE_AIC, AT91C_ID_TC0 );
// Enable the compare mode interrupt on timer 0
AT91F_TC_InterruptEnable( AT91C_BASE_TC0, AT91C_TC_CPAS | AT91C_TC_CPCS);
// start the counter
AT91C_BASE_TC0->TC_RC = 0xbb33;
AT91C_BASE_TC0->TC_RA = 0x2ecc;
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;