C GPIO шестнадцатеричная нумерация - PullRequest
0 голосов
/ 20 января 2012

В качестве примера мне дали следующий бит кода:

Сделать порт 0 битов 0-2 выходами, остальные должны быть входами.

FIO0DIR = 0x00000007;

Установить P0.0, P0.1, P0.2 все низкие (0)

FIO0CLR = 0x00000007;

Мне сказали, что к порту подключено 31 светодиод. Я не могу понять, почему, чтобы включить первые 3 выхода, это 0x00000007, а не 0x00000003?

Ответы [ 2 ]

3 голосов
/ 20 января 2012

Эти регистры конфигурации GPIO являются битовыми картами.

Используйте калькулятор Windows для преобразования шестнадцатеричного значения в двоичное:

0x00000007 = 111 или с 32 битами - 00000000000000000000000000000111 // три выхода

0x00000003 = 11 или 32 бита - 00000000000000000000000000000011 // только два выхода

2 голосов
/ 20 января 2012

Поскольку значение, которое вы записываете в регистр, представляет собой двоичную битовую маску, бит которой равен одному, что означает «это выход». Вы не пишете «количество выходов, которое я хотел бы иметь», вы одновременно устанавливаете 8 отдельных флагов.

Число 7 в двоичном виде - 00000111, поэтому у него самые младшие три бита установлены в 1, что здесь, по-видимому, означает «это выход». Десятичное значение 3, с другой стороны, составляет просто 00000011 в двоичном виде, поэтому в нем установлены только два бита, равный 1, что, очевидно, слишком мало.

Биты индексируются справа, начиная с 0. Десятичное значение номера бита n равно 2 n . Десятичное значение двоичного числа с более чем одним установленным битом является просто суммой всех значений всех установленных битов.

Так, например, десятичное значение числа с установленными битами 0, 1 и 2 составляет 2 0 + 2 1 + 2 2 = 1 + 2 + 4 = 7.

Вот потрясающая таблица ASCII, показывающая 8 бит байта и их отдельные значения:

      +---+---+---+---+---+---+---+---+
index | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
      +---+---+---+---+---+---+---+---+
value |128| 64| 32| 16| 8 | 4 | 2 | 1 |
      +---+---+---+---+---+---+---+---+
...