Настройка входных / выходных битов GPIO

#assembly #raspberry-pi #arm

#сборка #raspberry-pi #arm

Вопрос:

Я работаю над проектом сборки 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 19 = Выход — FSEL19 = Бит 29-27

Порт GPIO 17 = Кнопка ввода — FSEL17 = Бит 23-21

GPIO 19 = 0x8000000

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

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

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

Комментарии:

1. в общем, вы хотите прочитать-изменить запись, а не просто записать все биты. любой способ работает, если вы все делаете правильно, но поскольку эти регистры доступны для чтения, вы можете читать-изменять-записывать регистр и изменять только некоторые биты, чтобы включить или отключить или изменить функцию чего-либо.

Ответ №1:

  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 там.

Комментарии:

1. Спасибо за вашу помощь. Мне нужно провести некоторые исследования, чтобы понять ваши решения, но я думаю, что это то, над чем я могу поработать.