Как я могу превратить GPIO в его альтернативную функцию?

9

Я хочу использовать альтернативную функцию GPIO 4, а именно функцию GPCLK0. Как можно установить GPIO на его альтернативную функцию? Многие альтернативные функции приведены здесь: elinux-wiki

Лучше всего было бы, если это возможно с библиотекой wiringPi . Но я не против использовать произвольный C-код, если кто-то скажет мне, как это сделать. После ввода альтернативной функции, я думаю, что это необходимо настроить?

user61664
источник

Ответы:

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

Всегда используйте INP_GPIO (x) перед использованием SET_GPIO_ALT (x, y)

#define INP_GPIO(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3))
Rob_Bishop
источник
3
Ух ты. Этот первый макрос ... невероятен. Не могли бы вы объяснить, как это работает?
четыре
0

Вот некоторые другие темы (на www.raspberrypi.org ), которые имеют дело с этой GPCLK0функцией.

вторая ссылка имеет точный пример C о том, как установить альтернативную функцию GPCLK0.

/* Setup GPIO 4 as ALT0 function i.e. GPCLK0 */
mov r0, #4
mov r1, #4 /* ALT0 */
parasew
источник
Спасибо за этот ответ, я попробовал немного с этим ассемблерным кодом, но я думаю, что ассемблер это не мое. Это займет больше времени, чем ожидалось ..
user61664
0

В этом руководстве показаны различные способы настройки выводов GPIO, таких как bash, python и C, с использованием wiringPi. Это так же просто, как Arduino.

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

Вам нужно еще немного заглянуть в библиотеку WiringPi, чтобы точно знать, что нужно установить для конкретной «альтернативной функции», которую вы хотите, например, SPI, PWM, I²C и т. Д., Поскольку вы не указали.

jbyrnes
источник
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
}
Aqu
источник