Come posso trasformare un GPIO nella sua funzione alternativa?


9

Voglio usare la funzione altenate di GPIO 4, ovvero la funzione GPCLK0. Come si può impostare un GPIO sulla sua funzione alternativa? Molte funzioni alternative sono riassunte qui: elinux-wiki

Il migliore sarebbe se è possibile con la libreria cablaggioPi . Ma non mi dispiace usare un codice C arbitrario se qualcuno mi dice come farlo. Dopo aver inserito una funzione alternativa, penso che sia necessario configurarlo?

Risposte:


3

È possibile utilizzare la seguente macro C per modificare un determinato GPIO in una funzione alternativa come specificato da questa tabella: 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))

Esempio (da http://elinux.org/RPi_Low-level_peripherals#GPIO_hardware_hacking )

Le seguenti macro C cambiano GPIO g con la sua funzione ALT0:

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

Utilizzare sempre INP_GPIO (x) prima di utilizzare SET_GPIO_ALT (x, y)

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

3
Wow. Quella prima macro è ... incredibile. Ti dispiacerebbe spiegare come funziona?
Fouric

0

ecco alcuni altri thread (su www.raspberrypi.org ) che si occupano della GPCLK0funzione.

il secondo collegamento ha un esempio C esatto su come impostare la funzione alternativa GPCLK0.

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

Grazie per la risposta, ho provato un po 'con quel codice assembler, ma penso che assemblatore non sia la mia cosa. Questo richiede più tempo del previsto.
user61664


0

Utilizzare questo codice per impostare la funzione 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
}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.