如何将GPIO转换为其备用功能?


9

我想使用GPIO 4的替代功能,即GPCLK0功能。如何将GPIO设置为其备用功能?这里总结了许多替代功能:elinux-wiki

最好的办法是,如果可以使用connectioningPi库。但是,如果有人告诉我该怎么做,我不介意使用任意的C代码。输入替代功能后,我认为需要对其进行配置?

Answers:


3

您可以使用以下C宏将给定的GPIO更改为该表指定的替代功能: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))

示例(来自http://elinux.org/RPi_Low-level_peripherals#GPIO_hardware_hacking

以下C宏会将GPIO g更改为其ALT0功能:

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

使用SET_GPIO_ALT(x,y)之前始终使用INP_GPIO(x)

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

3
哇。那第一个宏令人难以置信。您介意解释它的工作原理吗?
Fouric 2013年

0

这里是一些其他处理该功能的线程(在www.raspberrypi.org上GPCLK0

第二个链接提供了有关如何设置GPCLK0备用功能的精确C示例。

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

感谢您的答复,我尝试了一点汇编代码,但我认为汇编不是我的事。这需要比exspected长..
user61664


0

使用此代码设置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
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.