¿Cómo puedo convertir un GPIO en su función alternativa?


9

Quiero usar la función alternativa de GPIO 4, es decir, la función GPCLK0. ¿Cómo se puede configurar un GPIO a su función alternativa? Aquí se resumen muchas funciones alternativas: elinux-wiki

Lo mejor sería si es posible con el cableado de la Biblioteca Pi . Pero no me importa usar código C arbitrario si alguien me dice cómo hacerlo. Después de ingresar una función alternativa, ¿creo que es necesario configurarla?

Respuestas:


3

Puede usar la siguiente Macro C para cambiar un GPIO dado a una función alternativa como se especifica en esta tabla: http://elinux.org/RPi_BCM2835_GPIOs

volatile unsigned *gpio;

#define SET_GPIO_ALT(g,a) *(gpio+(((g)/10))) |= (((a)<=3?(a)+4:(a)==4?3:2)<<(((g)%10)*3))

Ejemplo (de http://elinux.org/RPi_Low-level_peripherals#GPIO_hardware_hacking )

Las siguientes macros C cambiarían GPIO g a su función ALT0:

INP_GPIO(g);
SET_GPIO_ALT(g,0);

Siempre use INP_GPIO (x) antes de usar SET_GPIO_ALT (x, y)

#define INP_GPIO(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3))

3
Guau. Esa primera macro es ... increíble. ¿Te importaría explicar cómo funciona?
Fouric

0

Aquí hay algunos otros hilos (en www.raspberrypi.org ) que se ocupan de la GPCLK0función.

el segundo enlace tiene un ejemplo exacto de C sobre cómo configurar la función alternativa GPCLK0.

/* Setup GPIO 4 as ALT0 function i.e. GPCLK0 */
mov r0, #4
mov r1, #4 /* ALT0 */

Gracias por esa respuesta, probé un bitbit con ese código ensamblador, pero creo que ensamblador no es lo mío. Esto lleva más tiempo de lo esperado ..
user61664


0

Use este código para configurar la función alt

static void bcm2708_set_gpio_alt(int pin, int alt)
{
    /*
     * This is the common way to handle the GPIO pins for
     * the Raspberry Pi.
     * TODO This is a hack. Use pinmux / pinctrl.
     */
#define INP_GPIO(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3))
#define SET_GPIO_ALT(g,a) *(gpio+(((g)/10))) |= (((a)<=3?(a)+4:(a)==4?3:2)        <<(((g)%10)*3))
    unsigned int *gpio;
    gpio = ioremap(GPIO_BASE, SZ_16K);
    INP_GPIO(pin);
    SET_GPIO_ALT(pin, alt);
    iounmap(gpio);
#undef INP_GPIO
#undef SET_GPIO_ALT
}

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.