https://github.com/yuvadm/tiva-c/blob/master/driverlib/gpio.c
//The pin(s) are specified using a bit-packed byte, where each bit that is
//! set identifies the pin to be accessed, and where bit 0 of the byte
//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, and so on.
El primer parámetro indica el puerto en el que se escribirá. El segundo ui8Pins
es como una máscara, de forma que la función sólo afecta a los pines especificados (bits de ui8Pins
que son 1), para esos bits 1 ui8Pins
los bits en la misma posición de ui8Val
(0 o 1) se escribirá en el puerto.
Este enmascaramiento de ui8Pins
es en realidad parte de la arquitectura del Tiva, la función que está utilizando escribirá en una dirección como esta
(*((volatile ulong *)(ui32Port + (GPIO_O_DATA + (ui8Pins << 2))))) = ui8Val;
y el (ui8Pins << 2)
no se dirigirá realmente a una "memoria" sino a una máscara de bits ui8Val
para que no todos sus bits cambien los valores en ui32Port + GPIO_O_DATA
que serían los datos GPIO (cada pin siendo alto o bajo).
GPIO DataThis register is virtually mapped to 256 locations in the address space.
To facilitate the reading and writing of data to these registers byindependent
drivers, the data read from and written to the registers aremasked by the
eight address lines [9:2]. Reads from this register return its current state.
Writes to this register only affect bits that are not masked by ADDR[9:2] and are
configured as outputs. See “Data RegisterOperation” on page 654 for examples
of reads and writes.
En la mayoría de los demás microcontroladores, el proceso de enmascaramiento y escritura puede realizarse de la siguiente manera
(*((volatile ulong *)(ui32Port + (GPIO_O_DATA)))) = (~ui8Pins & *(ui32Port + (GPIO_O_DATA))) +(ui8Pins & ui8Val);
\\for all the bits that are zero in ui8Pins, the values in the memory to which you are writing should remain the same
(~ui8Pins & *(ui32Port + (GPIO_O_DATA)));
\\for the bits that are one in ui8Pins use the same bits in ui8Val
(GPIO_O_DATA))) +(ui8Pins & ui8Val);