Why clearing RTIF bit will cause PORF, LVRF bit cleared also for S12 MCU?

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Why clearing RTIF bit will cause PORF, LVRF bit cleared also for S12 MCU?

1,579 Views
007
Contributor II

Hello, I found a strange problem on S12G also on S12XE MCU. In our bootloader code, it will clear the RTIF bit (CPMUFLG_RTIF on S12G, CRGFLG_RTIF on S12XE), but I found other bits in the register also were cleared. PORF is used for power on reset judgement in my code, it can't be scratched.

 

My code is below:

S12G128 MCU:

CPMUFLG_RTIF = 1   // after this code, PORF is cleared.

 

S12XE256 MCU

CRGFLG_RTIF = 1     // after this code, PORF is cleared.

 

But if the code is as below, the PORF bit was not affected.

CPMUFLG = ~(U8)CPMUFLG_PORF_MASK;        /* Clear CMPMU int flags - not needed but good practice */

Labels (1)
0 Kudos
Reply
4 Replies

1,337 Views
kef2
Senior Contributor V

It is normal behavior. It was explained N*N times on this forum. Pls search for clear flags, clearing flags etc. To clear just RTIF you need to either

CPMUFLG = CPMUFLG_RTIF_MASK;

or

CPMUFLG &= CPMUFLG_RTIF_MASK;  // pls notice no ~ on the right, like one would use to zero memory bit  (x &= ~1;)

0 Kudos
Reply

1,337 Views
007
Contributor II

Thank you, it works. But what's the difference? "CPMUFLG_RTIF = 1" or "CPMUFLG |= CPMUFLG_RTIF_MASK" is translated to "bset CPMUFLG, RTIF_MASK", why the bset instruction will aftect other bits?

0 Kudos
Reply

1,337 Views
kef2
Senior Contributor V

Looks like you ignored my advice to search forums.

In short. Say you have flags registers, two flags are set, register reads as 3. You bset it with #1 mask. 3 | 1 = 3 and both flags are cleared. Simple. It doesn't matter all following variants are wrong

BSET reg, #1   ; clear all flags in reg

LDAA reg

ORAA #1

STAA reg   ; clear all flags, which were read as set when LDAA instruction was executed

reg_BIT0 = 0; // clear all flags except BIT0

reg_BIT0 = 1; // clear all flags

Only these and equivalent are working with flags:

reg = 1;

reg &= 1;

BCLR reg, #~1      ; or  BCLR reg, #0xFE

LDAA reg

ANDA  #1

STAA reg

LDAA #1

STAA  reg

0 Kudos
Reply

1,337 Views
007
Contributor II

Got it, thank you!

0 Kudos
Reply