TM4C123, ¿solo funciona un temporizador a la vez?

0

Estoy utilizando MCU TivaC TM4C123. Estoy tratando de enviar datos en serie a través de un pin y un reloj sincronizado a través de otro pin. Aquí hay una ilustración:

UséelmóduloTimer0paralosdatosenserieyTimer1paraelreloj.Lafrecuenciadelrelojdebesereldobledelosdatos.Aquíestálaparteimportantedelcódigo:

voidDATA(longnumber,intiteration)//number:datatobesendserially{longx=0;//iteration:numberofbitstosendfor(inty=0;y<iteration;y++){while((TIMER0->RIS&0x00000001)!=1){}//waituntilTimer0timesoutx=number&(0x1<<y);//Geteachbitindividuallyif(x==(0X1<<y))//Ifbitis1GPIOF->DATA|=(1<<1);//MakePF1Highelseif(x==0X0)//Ifbitis0GPIOF->DATA&=0XFD;//MakePF1LowTIMER0->ICR|=(1<<0);//ResetTimer0flagwhile((TIMER1->RIS&0x00000001)!=1){}//waituntilTimer1timesoutGPIOF->DATA^=(1<<2);//ToggleclockTIMER1->ICR|=(1<<0);//ResetTimer1flag}}intmain(){GPIO_INIT();//InitiateGPIOTIMER_INIT();//InitiateTimerswithTimer0=1/2Timer1while(1){DATA(0XAB01,16);//0xAB0116bitdataneedtobesendserially}}

Hayunproblemaenestecódigo,queesquetantolosdatoscomoelrelojtienenlamismafrecuencia,loquesignificaqueTimer0oTimer1estándeshabilitados.

Paraquemiproblemaseamásclaroyfácildeentender.Escribídoscódigossimplesconunagráficaparacadaunodeellos.Aquíestáelprimercódigo:EstoyusandoWhileloop

intmain(){GPIO_INIT();TIMER_INIT();//Timer0=1/2Timer1while(1){while((TIMER0->RIS&0x00000001)!=1){}//WaitforTIMER0totimeoutGPIOF->DATA^=(1<<1);//TogglePF1TIMER0->ICR|=(1<<0);//ResetTIMER0flagwhile((TIMER1->RIS&0x00000001)!=1){}//WaitforTIMER1totimeoutGPIOF->DATA^=(1<<2);//TogglePF2TIMER1->ICR|=(1<<0);//ResetTIMER1flag}}

Aquíestálasalidaquetengo:

Aquíestáelsegundocódigo:EstoyusandolacondiciónIf

intmain(){GPIO_INIT();TIMER_INIT();//Timer0=1/2Timer1while(1){if((TIMER0->RIS&0x00000001)==1){//IfTIMER0outtimedoutGPIOF->DATA^=(1<<1);//TogglePF1TIMER0->ICR|=(1<<0);//ResetTIMER0flag}if((TIMER1->RIS&0x00000001)==1){//IfTIMER1timedoutGPIOF->DATA^=(1<<2);//TogglePF2TIMER1->ICR|=(1<<0);//ResetTIMER1flag}}}

Aquíestálasalida:

Conclusión: cuando usé la condición if, los dos temporizadores están funcionando normalmente, pero cuando usé el bucle While, solo está funcionando un temporizador y el otro solo está usando las mismas cuentas del otro.

    

1 respuesta

2

Aparentemente, su temporizador de reloj Timer0 es más lento que el temporizador de datos Timer1 , por lo que no hay nada sorprendente en el comportamiento representado porque su código salta cada segundo evento de Timer1 cuando usa while .

Creo que hay suficiente un temporizador con la frecuencia máxima utilizada - es Timer1 . Más allá, debería haber un temporizador porque los datos y el reloj deben estar sincronizados y esta condición no está garantizada por el código representado en su pregunta.

int main()
{
    char even = (char)0x1;
    GPIO_INIT();  
    TIMER_INIT();   //Timer0= 1/2 Timer1
    while (1) {
        while((TIMER1->RIS & 0x00000001) != 1);    //Wait for TIMER1 to time out
        TIMER1->ICR |= (1<<0);             //Reset TIMER1 flag
        even ^= (char)0x1;
        if (even) GPIOF->DATA ^= (1<<1);   // Toggle PF1 [Clock]
        GPIOF->DATA ^= (1<<2);             // Toggle PF2 [Data]
    }
}

Entonces su función DATA(long number, int iteration) será:

void DATA(long number, int iteration) //number: data to be send serially
{ 
    long x=0;                           // iteration: number of bits to send
    char even = (char)0x1; 
    for(int y=0; y<iteration;) {
        while((TIMER1->RIS & 0x00000001) != 1){}   //wait until Timer1 times out
        TIMER1->ICR |= (1<<0);     //Reset Timer1 flag
        even ^= (char)0x1;
        GPIOF->DATA ^= (1<<2);     //Toggle clock
        if (even) continue;
        // data change every odd cycle
        x= number & (0x1<<y);      //Get each bit individually  
        if(x==(0X1<<y))            //If bit is 1
            GPIOF->DATA |= (1<<1); //Make PF1 High 
        else if(x==0X0) //If bit is 0
            GPIOF->DATA &= 0XFD;   //Make PF1 Low
        y++;
    }
}
    
respondido por el imbearr

Lea otras preguntas en las etiquetas