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?

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

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 */

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é.


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
}

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.