Open dubkov opened 9 years ago
Думаю, ссылку на файл с идеями тоже надо сюда вставить, там тоже есть дискуссии на эту тему https://docs.google.com/document/d/12RIDl4r5kiGJtICcBlIlFFWj7MZ_OjPcSUu7LgRWlJw/view
Я на самом деле больше не вижу смысла использования отдельных
port_from_pin
и port_from_virtual_pin
.
Достаточно сделать
#define A0 0
#define A1 1
............
#define B0 8
#define B1 9
............
#define D0 16
............
#define C7 30
и все унифицируется.
@ko10ok говорил, что можно завести uint32_t мапу всех пинов всех используемых портов, и использовать ее. Я теперь думаю, что это не такая безумная идея, как мне казалось изначально. Буду думать, что с этим можно сделать.
Например, сделать "виртуальный регистр", который содержит отображение младших байтов регистров PA, PB, PD, PF. Писать всё в него, а программа будет масками раскидывать виртуальный регистр по реальным. Но! тогда каждый раз будет производиться запись в четыре регистра. Жирный минус
Я заметил, что в pinDoSomething(pin_num, WHAT) параметр pin_num получается довольно интересным.
Предположим, что пины нумеруются 0-31, это соответствует по очереди младшим байтам в портах A, B, D, F.
Тогда в pin_num получается биты 0-2 - признак бита, а 3-4 признак порта. Например,
Таким образом, для определения бита из номера пина не нужно вызывать подпрограмму, достаточно маской отделить 3 младшие бита - это примерно 2 ассемблерные инструкции.
Для определения можно придумать что-то аналогичтное, если учесть, что их адреса:
Попробовал криво реализовать: https://github.com/PeterBeklemishev/mila/pull/7
Предпосылки
Никто еще не задумывался, как будут организовываться выводы на плате. Многие задумались, что нестандартизованные порты - это очень коряво.
Док
В документе https://docs.google.com/spreadsheets/d/1_A__mS1dGBmSGELw2Ocl_VE5S5aANFM1sRQrPwT0EE0/edit#gid=0 описывается какими функциями обладает каждый пин. (у кого нет доступа, тыкайте меня)
Предложение по организации
Порты
PORTA 0...7 - просто порт PORTB 0...7 - просто порт PORTD 0...7 - порт или ацп PORTF 0...6 (FUUUUU) - просто порт
Получаем более менее что-то удобоваримое для работы с портами.
Куда я дел остальное? Жестко забиндил ноги на функции. Хардкод при инициализации, и красивые блоки пинов на плате.
Дополнительные функции
B8 - выход компаратора, B9 и B10 либо оба внешние прерывания либо ИК-приемопередатчик. C1 и C2 - I2C, С3 не разводить (или как-то присобачить к обкусанному порту Ф, но помоему жопа)
E0 - выход ЦАП, E1 - референц ЦАП, E2-E3 - входы компаратора, E6-E7 - реалтаймовый клок.
Итого
ШИМ
Среди 0-26 ШИМ будет так: (T - timer, C - channel) T1C1 - F6 T1C2 - A3 T1C3 - A5 T2C1 - A1 T3C1 - C2 T3C2 - D2 T3C3 - B5 T3C4 - D7 Смотрел другие варианты, не рационально.
UART
UARTов два. Один будет использоваться для передачи прямо в ПК, другой - для периферии. UART1 может быть на пинах B5-B6 и A6-A7 UART2 может быть на пинах F0-F1, D0-D1 (здесь АЦП референц, кстати)
Лал
То, что на пинах забинденных на функции, можно делать что-то еще, будет недокументированной фичей.