Los temporizadores en TM4C123G no funcionan

Quería usar temporizadores en TM4C123GH6PM (en el kit de evaluación Launchpad TM4C123G de la serie TIVA C). Así que decidí usar GPTM TimerA0 en 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 periódico/de un disparo de la hoja de datos en la página 722. Quiero que un LED parpadee cada 3 segundos (conectado al PUERTO F- clavija 1). Pero el LED siempre está ENCENDIDO. ¿Están equivocadas las direcciones de los registros a los que me refiero? ¿O algo más 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
        }
    }
}
@Mahendra Gunawardena Pin1 del puerto F (LED rojo en la placa)
Solo un aviso; Si tiene la intención de utilizar los controladores de esta serie (o del fabricante), consulte la Hoja de erratas de silicio. Que viene por separado. Porque para muchos de los 123 son más de 110 páginas.
He publicado una posible solución. También siempre he usado interrupciones con los tiempos. No te veo habilitando interrupciones.
@Asmyldof +100. Especialmente para TM4C123, debe tener mucho cuidado al diseñar su propia placa. Un pequeño problema en la errata puede ser una razón para agregar docenas de componentes adicionales a su PCB (consulte GPIO # 10, por ejemplo)...
@GAttuso si la rama "moderna" de diseño de procesadores de TI quiebra mañana, no perderé mucho el sueño por eso.

Respuestas (1)

También aquí hay un código de ejemplo para la configuración del temporizador TIVA. Es posible que pueda ver esto y tener una idea

#define TIMER0_CFG_R            (*((volatile unsigned long *)0x40030000))
#define TIMER0_TAMR_R           (*((volatile unsigned long *)0x40030004))
#define TIMER0_CTL_R            (*((volatile unsigned long *)0x4003000C))
#define TIMER0_IMR_R            (*((volatile unsigned long *)0x40030018))
#define TIMER0_MIS_R            (*((volatile unsigned long *)0x40030020))
#define TIMER0_ICR_R            (*((volatile unsigned long *)0x40030024))
#define TIMER0_TAILR_R          (*((volatile unsigned long *)0x40030028))
#define TIMER0_TAPR_R           (*((volatile unsigned long *)0x40030038))
#define TIMER0_TAR_R            (*((volatile unsigned long *)0x40030048))
#define TIMER_CFG_16_BIT        0x00000004  // 16-bit timer configuration,
                                            // function is controlled by bits
                                            // 1:0 of GPTMTAMR and GPTMTBMR
#define TIMER_TAMR_TAMR_PERIOD  0x00000002  // Periodic Timer mode
#define TIMER_CTL_TAEN          0x00000001  // GPTM TimerA Enable
#define TIMER_IMR_TATOIM        0x00000001  // GPTM TimerA Time-Out Interrupt
                                            // Mask
#define TIMER_ICR_TATOCINT      0x00000001  // GPTM TimerA Time-Out Raw
                                            // Interrupt
#define TIMER_TAILR_TAILRL_M    0x0000FFFF  // GPTM TimerA Interval Load
                                            // Register Low
#define SYSCTL_RCGC1_R          (*((volatile unsigned long *)0x400FE104))
#define SYSCTL_RCGC1_TIMER0     0x00010000  // timer 0 Clock Gating Control

void DisableInterrupts(void); // Disable interrupts
void EnableInterrupts(void);  // Enable interrupts
long StartCritical (void);    // previous I bit, disable interrupts
void EndCritical(long sr);    // restore I bit to previous value
void WaitForInterrupt(void);  // low power mode
void (*PeriodicTask)(void);  // user function
// ***************** Timer0A_Init ****************
// Activate Timer0A interrupts to run user task periodically
// Inputs:  task is a pointer to a user function
//          period in usec
// Outputs: none
void Timer0A_Init(void(*task)(void), unsigned short period){ 
  SYSCTL_RCGC1_R |= SYSCTL_RCGC1_TIMER0; // 0) activate timer0
  PeriodicTask = task;             // user function 
  TIMER0_CTL_R &= ~0x00000001;     // 1) disable timer0A during setup
  TIMER0_CFG_R = 0x00000004;       // 2) configure for 16-bit timer mode
  TIMER0_TAMR_R = 0x00000002;      // 3) configure for periodic mode
  TIMER0_TAILR_R = period;         // 4) reload value
  TIMER0_TAPR_R = 49;              // 5) 1us timer0A
  TIMER0_ICR_R = 0x00000001;       // 6) clear timer0A timeout flag
  TIMER0_IMR_R |= 0x00000001;      // 7) arm timeout interrupt
  NVIC_PRI4_R = (NVIC_PRI4_R&0x00FFFFFF)|0x40000000; // 8) priority 2
  NVIC_EN0_R |= NVIC_EN0_INT19;    // 9) enable interrupt 19 in NVIC
  TIMER0_CTL_R |= 0x00000001;      // 10) enable timer0A
  EnableInterrupts();
}
void Timer0A_Handler(void){
  TIMER0_ICR_R = TIMER_ICR_TATOCINT;// acknowledge timer0A timeout
  (*PeriodicTask)();                // execute user task
}

En el TIVA, el puerto F del microcontrolador TM4C123GH6PM es un puerto especial. PF0 en TIVA necesita ser desbloqueado.

ingrese la descripción de la imagen aquí
Haga clic en la imagen para una versión más grande de la imagen.

A continuación se muestra el código de ejemplo.

void PortF_Init(void){ volatile unsigned long delay;
  SYSCTL_RCGC2_R |= 0x00000020;     // 1) activate clock for Port F
  delay = SYSCTL_RCGC2_R;           // allow time for clock to start
  GPIO_PORTF_LOCK_R = 0x4C4F434B;   // 2) unlock GPIO Port F
  GPIO_PORTF_CR_R = 0x1F;           // allow changes to PF4-0
  // only PF0 needs to be unlocked, other bits can't be locked
  GPIO_PORTF_AMSEL_R = 0x00;        // 3) disable analog on PF
  GPIO_PORTF_PCTL_R = 0x00000000;   // 4) PCTL GPIO on PF4-0
  GPIO_PORTF_DIR_R = 0x0E;          // 5) PF4,PF0 in, PF3-1 out
  GPIO_PORTF_AFSEL_R = 0x00;        // 6) disable alt funct on PF7-0
  GPIO_PORTF_PUR_R = 0x11;          // enable pull-up on PF0 and PF4
  GPIO_PORTF_DEN_R = 0x1F;          // 7) enable digital I/O on PF4-0
}

Por favor tome nota de

GPIO_PORTF_LOCK_R = 0x4C4F434B; // 2) desbloquear puerto GPIO F

También le sugiero que se inscriba en Embedded Systems - Shape The World . Usan TIVA y es un gran curso semi-autodidacta.

Referencias

Gracias por la respuesta. Desafortunadamente, DESBLOQUEAR el PUERTO F no supuso ninguna diferencia. También hice uso de los registros que proporcionó (excepto que elegí Sondear en lugar de interrumpir) y nuevamente el LED rojo siempre está ENCENDIDO. Muchas gracias por los enlaces de referencia (especialmente users.ece.utexas.edu/~valvano/arm )
@user3219492 De nada, normalmente sigo el curso cada año por diversión. Así que identifícate en los foros. Buena suerte. También noté que está tratando de usar el Pin 1, no el Pin 0, solo el pin 0 en el puerto F está bloqueado.
Bueno. He publicado la pregunta en los foros de la comunidad de TI. Esperemos eso. Entonces, la declaración de desbloqueo no tendrá ningún efecto ya que no estoy usando PF0.