Quería usar los temporizadores en TM4C123GH6PM (en el kit de evaluación Launchpad de TIVA C series TM4C123G). Así que decidí usar GPTM TimerA0 en el modo de temporizador periódico. Definí la dirección de los registros de GPTM y seguí los pasos dados en la sección 11.4.1 Modo de temporizador de disparo único / periódico del hoja de datos en la página 722. Quiero que parpadee un LED cada 3 segundos (conectado al PUERTO F-pin 1). Pero el LED está siempre encendido. ¿La dirección de los registros a los que me estoy refiriendo es incorrecta? ¿O otra cosa es el problema con el código?
//TIMER Registers
#define RCGCTIMER (*((volatile unsigned long *)0x400FE604))
#define GPTMCTL (*((volatile unsigned long *)0x4003000C)) //timer zero
#define GPTMCFG (*((volatile unsigned long *)0x40030000))
#define GPTMTAMR (*((volatile unsigned long *)0x40030004))
#define GPTMTAILR (*((volatile unsigned long *)0x40030028))
#define GPTMRIS (*((volatile unsigned long *)0x4003001C))
#define GPTMICR (*((volatile unsigned long *)0x40030024))
//PORT F Registers
#define GPIO_PORTF_DATA_R (*((volatile unsigned long*)0x400253FC))
#define GPIO_PORTF_DIR_R (*((volatile unsigned long *)0x40025400))
#define GPIO_PORTF_AFSEL_R (*((volatile unsigned long *)0x40025420))
#define GPIO_PORTF_DEN_R (*((volatile unsigned long *)0x4002551C))
#define SYSCTL_RCGC2_R (*((volatile unsigned long *)0x400FE108))
#define SYSCTL_RCGC2_GPIOF 0x00000020 // port F Clock Gating Control
void initializeTimer()
{
RCGCTIMER |= 0x00000001; //To use a GPTM, the appropriate TIMERn bit must be set in the RCGCTIMER. Here it is TIMER0
//Periodic timer mode
GPTMCTL &=0xFFFFFFFE; //TAEN is set 0. Timer A is disabled.
GPTMCFG = 0x00000000; //Write the GPTM Configuration Register (GPTMCFG) with a value of 0x0000.0000
GPTMTAMR |=0x00000002; GPTMTAMR &=0xFFFFFFFE; //TAMR is set 0x2. Periodic Timer mode is used (first bit1 is set 1 and then bit0 is set 0 in two statements)
GPTMTAMR &= 0xFFFFFFEF; //TACDIR is set 0. The timer counts down.
GPTMTAILR = 0x02DC6C00; //TAILR is set to 48,000,000 Hz
GPTMCTL |=0x00000001; //TAEN is set 1. Timer A is enabled.
}
void initializePORTF()
{
volatile unsigned long delay;
SYSCTL_RCGC2_R |= 0x00000020; // 1) F clock
delay = SYSCTL_RCGC2_R; // delay
GPIO_PORTF_DIR_R |= 0x02; // PF1 output
GPIO_PORTF_AFSEL_R &= 0x00; // No alternate function// 1) F clock
GPIO_PORTF_DEN_R |= 0x02; // Enable digital pins PF1
GPIO_PORTF_DATA_R |= 0x02; //PF1 Set to 1. LED is ON
}
int main()
{
initializeTimer();
initializePORTF();
while(1)
{
//did TATORIS in GPTMRIS become 1??
if((GPTMRIS | 0x00000001) == 1)
{
GPTMICR |= 0x00000001; //Set 1 to TATOCINT. Writing a 1 to this bit clears the TATORIS bit in the GPTMRIS register and the TATOMIS bit in the GPTMMIS register.
GPIO_PORTF_DATA_R ^= 0x02; //Toggle PF1. Toggle LED
}
}
}