1 votos

TIVA TM4C123G Driverlib Función Pregunta

Tengo una pregunta sobre cómo utilizar una función GPIO básica de la biblioteca de controladores TIVA para poner un pin de salida en alto. Vea la imagen de abajo para más detalles.

El subrayado rojo en el código de la izquierda utiliza GPIOPinWrite. A la derecha está la hoja de datos de la biblioteca de controladores que muestra una descripción de la función.

¿Alguien puede explicar cómo esto pone el pin 2 alto? Entiendo los dos primeros valores pasados en la función, pero no cómo el último Ui8Val establece el pin alto?

EDITAR

Veo en el archivo de cabecera GPIO que GPIO_PIN_2 está definido como 0x04.

Gracias.

enter image description here

2voto

jDAQ Puntos 86

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);

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X