Comment transformer un GPIO en fonction alternative?

9

Je veux utiliser la fonction altenate de GPIO 4 à savoir la fonction GPCLK0. Comment définir un GPIO sur sa fonction alternative? De nombreuses fonctions alternatives sont résumées ici: elinux-wiki

Le mieux serait s'il est possible avec la bibliothèque de câblagePi . Mais cela ne me dérange pas d'utiliser du code C arbitraire si quelqu'un me dit comment le faire. Après avoir entré une fonction alternative, je pense qu'il est nécessaire de la configurer?

user61664
la source

Réponses:

3

Vous pouvez utiliser la macro C suivante pour changer un GPIO donné en une fonction alternative comme spécifié par ce tableau: 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))

Exemple (à partir de http://elinux.org/RPi_Low-level_peripherals#GPIO_hardware_hacking )

Les macros C suivantes changeraient GPIO g en sa fonction ALT0:

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

Utilisez toujours INP_GPIO (x) avant d'utiliser SET_GPIO_ALT (x, y)

#define INP_GPIO(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3))
Rob_Bishop
la source
3
Sensationnel. Cette première macro est ... incroyable. Pourriez-vous expliquer comment cela fonctionne?
Fouric
0

voici quelques autres fils (sur www.raspberrypi.org ) qui traitent de la GPCLK0fonction.

le deuxième lien a un exemple C exact sur la façon de définir la fonction alternative GPCLK0.

/* Setup GPIO 4 as ALT0 function i.e. GPCLK0 */
mov r0, #4
mov r1, #4 /* ALT0 */
parasew
la source
Merci pour cette réponse, j'ai essayé un peu avec ce code assembleur, mais je pense que l'assembleur n'est pas mon truc. Cela prend plus de temps que prévu.
user61664
0

Ce didacticiel montre différentes façons de configurer les broches GPIO, telles que bash, python et C à l'aide de câblagePi. C'est aussi simple qu'un Arduino.

http://log.liminastudio.com/writing/tutorials/tutorial-how-to-use-your-raspberry-pi-like-an-arduino

Vous aurez besoin de regarder un peu plus dans la bibliothèque WiringPi pour savoir exactement quoi définir pour la "fonction alternative" spécifique que vous voulez, par exemple SPI, PWM, I²C, etc., puisque vous ne l'avez pas spécifié.

jbyrnes
la source
0

Utilisez ce code pour définir la fonction 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
}
AQU
la source