Función especial Registra el valor expresado como Hexadecimal y Bit shift

0

Me preguntaba si alguien podría ayudarme a resolver un problema, porque soy muy nuevo en esto y me dieron el código de un antiguo programador para trabajar.
Estoy tratando de averiguar el valor de 0x8008 & ~ (1 < < 15) .
Tal vez alguien también podría decirme cuál es el propósito de escribir un valor de esta manera?

Código:

   // STSEL 1; IREN disabled; PDSEL 8N; UARTEN enabled; RTSMD disabled; USIDL disabled; WAKE disabled; ABAUD disabled; LPBACK disabled; BRGH enabled; URXINV disabled; UEN TX_RX; 

   U1MODE = (0x8008 & ~(1<<15));  // disabling UARTEN bit  

Por lo que entiendo:

0x8008 = 1000000000001000

1 < < 15 = 1000000000000000

~ (1 < < 15) = 0111111111111111

entonces: 1000000000001000 & 0111111111111111 = 00000000000001000

Esta respuesta me molesta, porque a juzgar por eso, UART está deshabilitado, lo que definitivamente no es cierto.

hoja de datos: enlace

Hice algunas excavaciones en el código y encontré esta línea:

 U1MODEbits.UARTEN = 1;

Aún no entiendes cuál es el propósito de deshabilitar el UART primero y luego habilitarlo.

    
pregunta sharksWithLasers

1 respuesta

3

Este es un bit de código obtuso, y realmente no tiene ninguna virtud. Combina un cambio con un número mágico, por lo que es incluso menos claro que simplemente escribir el valor ...

Por lo general, definiría en algún lugar los nombres de bit significativos, en este caso UARTEN, con su índice en el registro. Sería más habitual hacer una secuencia de lectura-modificación-escritura (a menos que esté inicializando registros). Entonces, copie el original, modifique el bit y vuelva a escribir en el registro. Esto se vería algo así como:

#define UARTEN 15
U1MODE = U1MODE & ~(1<<UARTEN);  // clear UARTEN
U1MODE = U1MODE | (1<<UARTEN);   // set UARTEN

Como la máscara es una constante, el compilador debería optimizar el cambio y la negación y luego hacer una máscara simple a nivel de bits (aunque verifique la salida desmontada).

    
respondido por el awjlogan

Lea otras preguntas en las etiquetas