Wie kann ich ein GPIO auf seine alternative Funktion umstellen?


9

Ich möchte die alteate-Funktion von GPIO 4 verwenden, nämlich die GPCLK0-Funktion. Wie kann man einen GPIO auf seine alternative Funktion einstellen? Viele alternative Funktionen sind hier zusammengefasst: elinux-wiki

Am besten wäre es, wenn es mit der wiringPi Library möglich wäre . Aber es macht mir nichts aus, beliebigen C-Code zu verwenden, wenn mir jemand sagt, wie es geht. Nach der Eingabe einer alternativen Funktion denke ich, dass es erforderlich ist, um sie zu konfigurieren?

Antworten:


3

Mit dem folgenden C-Makro können Sie einen bestimmten GPIO in eine alternative Funktion ändern, wie in dieser Tabelle angegeben: 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))

Beispiel (von http://elinux.org/RPi_Low-level_peripherals#GPIO_hardware_hacking )

Die folgenden C-Makros würden GPIO g in seine ALT0-Funktion ändern:

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

Verwenden Sie immer INP_GPIO (x), bevor Sie SET_GPIO_ALT (x, y) verwenden.

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

3
Beeindruckend. Das erste Makro ist ... unglaublich. Würde es Ihnen etwas ausmachen zu erklären, wie es funktioniert?
Fouric

0

Hier sind einige andere Threads (auf www.raspberrypi.org ), die sich mit der GPCLK0Funktion befassen .

Der zweite Link enthält ein genaues C-Beispiel zum Einstellen der alternativen Funktion GPCLK0.

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

Vielen Dank für diese Antwort, ich habe ein kleines bisschen mit diesem Assembler-Code versucht, aber ich denke, Assembler ist nicht mein Ding. Dies dauert länger als erwartet ..
user61664

0

Dieses Tutorial zeigt verschiedene Möglichkeiten, wie Sie die GPIO-Pins wie Bash, Python und C mithilfe von wiringPi konfigurieren können. Es ist so einfach wie ein Arduino.

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

Sie müssen sich die WiringPi-Bibliothek etwas genauer ansehen, um genau zu wissen, was für die gewünschte "alternative Funktion" eingestellt werden soll, z. B. SPI, PWM, I²C usw., da Sie dies nicht angegeben haben.


0

Verwenden Sie diesen Code, um die Alt-Funktion einzustellen

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
}

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.