Los temporizadores en TM4C123G no funcionan

1

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
        }
    }
}
    
pregunta user3219492

1 respuesta

1

También aquí hay un código de ejemplo para la configuración del temporizador TIVA. Es posible que puedas ver esto y tener alguna 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 microcontrolador TM4C123GH6PM Port F es un puerto especial. PF0 en TIVA necesita ser desbloqueado.


Hagaclicenlaimagenparaobtenerunaversiónmásgrandedelaimagen.

Acontinuaciónsemuestraelcódigodeejemplo.

voidPortF_Init(void){volatileunsignedlongdelay;SYSCTL_RCGC2_R|=0x00000020;//1)activateclockforPortFdelay=SYSCTL_RCGC2_R;//allowtimeforclocktostartGPIO_PORTF_LOCK_R=0x4C4F434B;//2)unlockGPIOPortFGPIO_PORTF_CR_R=0x1F;//allowchangestoPF4-0//onlyPF0needstobeunlocked,otherbitscan'tbelockedGPIO_PORTF_AMSEL_R=0x00;//3)disableanalogonPFGPIO_PORTF_PCTL_R=0x00000000;//4)PCTLGPIOonPF4-0GPIO_PORTF_DIR_R=0x0E;//5)PF4,PF0in,PF3-1outGPIO_PORTF_AFSEL_R=0x00;//6)disablealtfunctonPF7-0GPIO_PORTF_PUR_R=0x11;//enablepull-uponPF0andPF4GPIO_PORTF_DEN_R=0x1F;//7)enabledigitalI/OonPF4-0}

Porfavor,tomanotade

  

GPIO_PORTF_LOCK_R=0x4C4F434B;//2)desbloquearGPIOPortF

Tambiéntesugieroqueteregistresen Sistemas embebidos - Shape The World . Utilizan TIVA y es un gran curso semi-ritmo.

Referencias

respondido por el Mahendra Gunawardena

Lea otras preguntas en las etiquetas