#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:
-
вы должны убедиться, что касаетесь только тех битов, которые вас интересуют. Изменение других битов повлияет на работу несвязанных выводов.
-
в соответствии с таблицей данных 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. Спасибо за вашу помощь. Мне нужно провести некоторые исследования, чтобы понять ваши решения, но я думаю, что это то, над чем я могу поработать.