Bagaimana saya bisa mengubah GPIO ke fungsi alternatifnya?

9

Saya ingin menggunakan fungsi altenate GPIO 4 yaitu fungsi GPCLK0. Bagaimana seseorang dapat mengatur GPIO ke fungsi alternatifnya? Banyak fungsi alternatif dirangkum di sini: elinux-wiki

Yang terbaik adalah jika dimungkinkan dengan Perpustakaan wiringPi . Tapi saya tidak keberatan menggunakan kode-C yang sewenang-wenang jika seseorang memberi tahu saya cara melakukannya. Setelah memasukkan fungsi alternatif, saya pikir perlu untuk mengkonfigurasinya?

pengguna61664
sumber

Jawaban:

3

Anda dapat menggunakan C Macro berikut untuk mengubah GPIO yang diberikan ke fungsi alternatif seperti yang ditentukan oleh tabel ini: 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))

Contoh (dari http://elinux.org/RPi_Low-level_peripherals#GPIO_hardware_hacking )

Macro C berikut akan mengubah GPIO g ke fungsi ALT0-nya:

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

Selalu gunakan INP_GPIO (x) sebelum menggunakan SET_GPIO_ALT (x, y)

#define INP_GPIO(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3))
Rob_Bishop
sumber
3
Wow. Makro pertama itu ... tidak bisa dipercaya. Maukah Anda menjelaskan cara kerjanya?
Fouric
0

berikut adalah beberapa utas lainnya (di www.raspberrypi.org ) yang berhubungan dengan GPCLK0fungsi tersebut.

tautan kedua memiliki contoh C yang tepat tentang cara mengatur fungsi alternatif GPCLK0.

/* Setup GPIO 4 as ALT0 function i.e. GPCLK0 */
mov r0, #4
mov r1, #4 /* ALT0 */
paragraf
sumber
Terima kasih atas jawaban itu, saya mencoba littlebit dengan assembler-code itu, tetapi saya kira assembler bukan milik saya. Ini membutuhkan waktu lebih lama dari yang diharapkan ..
user61664
0

Gunakan kode ini untuk mengatur fungsi 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
sumber
0

Menggunakan perpustakaan pigpio untuk mengatur GPIO 4 sebagai fungsi ALT0 yaitu GPCLK0:

$ pigs m 4 0

Ref .: mengubah mode GPIO

J. Piel
sumber