¿Dará XOR al registro FIO0PIN en un LPC175x6x dar resultados inesperados?

0

¿Se garantiza que este código solo afectará al pin 22?

int* FIO0PIN = (int*)0x2009C014;
*FIO0PIN ^= (1<<22);

Al principio parece una pregunta tonta, pero recuerdo que trabajé con un microcontrolador PIC18 en el que podría dañar la salida del puerto al hacer esto. La corrupción ocurrió cuando una escritura anterior en el latch de salida aún no se reflejaba en el estado de salida (el pin está impulsando una carga capacitiva), XOR en un bit no relacionado significaba leer el puerto, hacer el XOR y volver a escribir en el latch de salida (con el antiguo valor de dicho pin no relacionado).

int* FIO0PIN = (int*)0x2009C014;
*FIO0PIN &= (1<<4);  //set bit 4
*FIO0PIN ^= (1<<22); //if pin 4 has not yet transitioned to 1 because of capacitive load
                    //will this clear it again?

¿Cómo evita el Cortex este problema? ¿O lo hace?

Soy consciente de los registros FIOxSET y FIOxCLR, sin embargo, la activación de bits a través de ellos es mucho menos eficaz si uno no conoce el valor actual del bit en cuestión. Estoy escribiendo un lenguaje específico de dominio utilizando la programación de C ++ que resume todas las funciones básicas de IO y realiza las optomizaciones en conjuntos de ellas. Con las partes de LPC11xx, la implementación del bit toggeling es súper fácil, solo uso el registro dedicado, me gustaría obtener la implementación de LPC17xx lo más eficiente posible.

Aquí está el código en caso de que alguien esté interesado: enlace la fábrica de "makeToggle" crea la "acción de registro" aquí enlace utilizando una especialización de plantilla aquí enlace Actualmente hago una XorAction de este chip, sin embargo No estoy seguro de si es correcto.

Soy consciente de que el FIOxPIN está en la zona direccionable de la banda de bits, sin embargo, según UM10360.pdf página 749 "Los accesos de datos a esta región se vuelven a correlacionar con la banda de bits región. Una operación de escritura se realiza como leer-modificar-escribir. Los accesos de instrucciones no están permitidos ", lo que, en mi opinión, sería tan susceptible al problema mencionado anteriormente.

    
pregunta odinthenerd

3 respuestas

1

Es exactamente por eso que existen registros FIOxSET y FIOxCLR:

FIO0CLR = (1<<4);
FIO0SET = (1<<22);

Esos no necesitan un ciclo de lectura-modificación-escritura para borrar o establecer pines.

    
respondido por el Turbo J
0

En las partes de LPC175x / 6x que está utilizando hay un conjunto de registros FIOxMASK que restringen los bits que se modifican al escribir en los otros registros de pin, por lo que debería poder usar eso para evitar cambios falsos en los bits no relacionados.

    
respondido por el user1844
0

Esto es lo que encontré como la solución correcta más eficiente y garantizada:

constexpr int mask{(1<<5)};
*FIOxPIN = *FIOxSET ^ mask; 

Funciona porque el registro FIOxSET devolverá el valor del latch de salida cuando se lea, por lo que no hay problema si el valor del latch de salida difiere del valor de FIOxPIN. Todavía estoy interesado en una mejor respuesta si alguien puede ofrecer una.

    
respondido por el odinthenerd

Lea otras preguntas en las etiquetas