LPC824 SCTimer cannot unset the CTRL::STOP bit flag

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

LPC824 SCTimer cannot unset the CTRL::STOP bit flag

418件の閲覧回数
fjrg76
Contributor IV

Hi,

Right after clearing the CTRL::HOLD bit flag (in order to start the timer), the CTRL::STOP bit flag is automatically set, and there's no way to clear it!

This same application runs nicely on a LPC812MAX board:

20221204_153826.jpg

A synchrony signal is shown on yellow color, while an output signal is shown in blue color. What I'm trying to achieve is (which I've already done it in the LPC812 uC):

CamScanner 12-04-2022 19.32.jpg

The problem with the LPC812 is that you forgot to include an ADC, so for my application I needed to find a similar device.

 

Now, what's the problem with the LPC824? Let me show you the last instruction after the timer has been configured:

//Chip_SCT_ClearControl( LPC_SCT, SCT_CTRL_HALT_L ); // both instructions are the same
LPC_SCT->CTRL_U &= ~( 4 );

After executing this instruction the CTRL::STOP bit flag is set:

Captura de pantalla de 2022-12-04 19-48-15.png

And none of these instructions are capable of clearing the STOP flag:

Chip_SCT_ClearControl( LPC_SCT, SCT_CTRL_STOP_L );
LPC_SCT->CTRL_U &= ~(0x2);

At the end of this post I'll show you the complete code for such configuration; but before in doing so, I found that if I comment this next instruction out, which stops the timer in EVENT1, then the STOP flag is not set; however, my application is still failing at its purpose:

LPC_SCT->STOP_U = SCT_EVT_1;

 

Thank you in advance. Any hint or suggestion is appreciated.

 

Here is my code (SystemCoreClock is running at 30MHz):

void sct_fsm_init (void)
{
Chip_SCT_Init(LPC_SCT);

Chip_SCT_Config(LPC_SCT,
SCT_CONFIG_32BIT_COUNTER // 32 bits
| SCT_CONFIG_AUTOLIMIT_L ) // timer resets itself
;

// F=120Hz, steps=1000:
Chip_SCT_SetControl( LPC_SCT,
SCT_CTRL_HALT_L
| SCT_CTRL_CLRCTR_L
| SCT_CTRL_PRE_L( SystemCoreClock/120000 - 1 ) )
;

LPC_SCT->STATE_U = 0;
// no states (UM_LPC812: 10.7.12; UM_LPC824: 16.7.12)


// --------------- EVENT registers ---------------

// *** EVENT 0 ***

LPC_SCT->EV[ SCT_EVENT_0 ].STATE = ENABLE_STATE0;
/* Event 0 only happens in state 0 */


LPC_SCT->EV[ SCT_EVENT_0 ].CTRL =
SCT_OUTSEL_L // inputs
| (0 << 6 ) // CTIN0
| SCT_IOCOND_RAISE
| SCT_COMBMODE_IO // only CTIN0
| SCT_STATELD_0 // no state changes are allowed
| SCT_STATEEV_0
;

LPC_SCT->START_U = SCT_EVT_0;
// EV0 starts the timer

LPC_SCT->OUT[ SCT_OUTPUT_0 ].CLR = SCT_EVT_0;
// EV0 clear the output

// *** EVENT 1 ***

LPC_SCT->EV[ SCT_EVENT_1 ].STATE = ENABLE_STATE0;
// EVT1 habilitado en ST0

LPC_SCT->EV[ SCT_EVENT_1 ].CTRL =
SCT_EVECTRL_MATCH0 // match
| SCT_COMBMODE_MATCH // only match
| SCT_STATELD_0 // state changes are not allowed
| SCT_STATEEV_0
;

Chip_SCT_SetMatchCount( LPC_SCT, SCT_MATCH_0, 250 );
Chip_SCT_SetMatchReload( LPC_SCT, SCT_MATCH_0, 250 );

LPC_SCT->STOP_U = SCT_EVT_1;
// EV1 stops the timer


LPC_SCT->OUT[ SCT_OUTPUT_0 ].SET = SCT_EVT_1;
// EV1 sets the output


//Chip_SCT_ClearControl( LPC_SCT, SCT_CTRL_HALT_L );
LPC_SCT->CTRL_U &= ~( 4 );

}

 

 

 

 

 

 

ラベル(2)
0 件の賞賛
返信
0 返答(返信)