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.