Настройка бит ввода / вывода GPIO - PullRequest
1 голос
/ 02 апреля 2019

Я работаю над проектом сборки Raspberry Pi с некоторыми светодиодами и кнопкой ввода.На данный момент у меня есть мигающий светодиод и кнопка для включения другого светодиода.Теперь я хочу установить еще один светодиод, и я застрял на чем-то, что делаю неправильно или не совсем понимаю.

Так что, если у меня более одного светодиода в одном GPFSEL, мне нужно их установитьв одной строке кода, чтобы они не перезаписывали друг друга.Например:

Порт 21 GPIO - это FSEL21 = Бит 5 - 3

Порт 27 GPIO - это FSEL27 = Бит 23 - 21

Чтобы установить их на Выход, мне нужно установитьмладший значащий бит в 1. Это: 0x08 и 0x200000 в шестнадцатеричном формате.

Если я делаю это в двух строках кода, например:

ldr register,=0x08
str register,[base,#GPFSEL2]

ldr register,=0x200000 
str register,[base,#GPFSEL2]

Это не работает.

Итак, я сделал это в одной строке кода, и это сработало:

ldr register,=0x200008
str register,[base,#GPFSEL2]

Теперь у меня проблема в том, чтобы установить GPFSEL1, потому что он имеет один выход и один вход.Документальный фильм говорит, что я должен установить 000 для входа.

Итак, у меня есть:

GPIO Port 19 = Выход FSEL19 = Бит 29 - 27

GPIO Port 17 =Кнопка ввода - FSEL17 = бит 23-21

GPIO 19 = 0x8000000

GPIO Port 17, документальный фильм говорит, что я должен установить биты в 000. И учебник, который я читаю, устанавливаетмаска для 0xFF1FFFFF, которая в двоичном виде равна 11111111000111111111111111111111.

Теперь я не понимаю, как я не могу установить их вместе.И я должен установить вход?Разве это не должно быть 000, если я ничего не установлю?Я пытался ничего не устанавливать на входе, и он работал как вход, но мигающий светодиод стал очень медленным без каких-либо других изменений в коде.Я надеюсь, что вы можете сказать мне, как правильно установить эти биты.

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 02 апреля 2019
  1. Вы должны убедиться, что касаетесь только тех битов, которые вас интересуют. Изменение других битов повлияет на работу несвязанных контактов.

  2. соответственно таблица данных BCM, вы хотите установить эти биты в 0b001 (выход GPIO).

Чтобы установить функцию выходных контактов, вы можете использовать

ldr        r0, [base,#GPFSEL2]
bic        r0, #(7 << 3)
bic        r0, #(7 << 21)
orr        r0, #(1 << 3)
orr        r0, #(1 << 21)
str        r0, [base,#GPFSEL2]

То же самое для ввода, но вы можете опустить orr там.

...