Какой аналог PORTx для Teensy (4.0)?
Я видел людей, использующих такой код, как PORTB |= 0x1 << 6
, чтобы установить шестой бит PORTB в Arduino. Я понимаю, что это значительно быстрее, чем использование digitalWrite
. Как это можно сделать с помощью современного Teensy (т.е. 3.6 или 4.0) и вообще?
@Jachdich, 👍1
Обсуждение1 ответ
Лучший ответ:
▲ 5
Все устройства для подростков поддерживают digitalWriteFast по умолчанию. digitalWriteFast компилируется, просто устанавливая бит в правильном регистре порта. Вы не можете сделать это быстрее, напрямую манипулируя регистром.
Однако, если по какой-то причине вы хотите манипулировать регистрами напрямую, вот отношение pin/gpio для T4. (Создано с помощью скетча, описанного здесь: https://github.com/luni64/TeensyTimerTool/wiki/ Избегайте конфликтов PWM-таймера")
Pin | GPIO Reg | PWM timer
----|------------|-------------
00 | GPIO6_03 | FLEX_PWM1
01 | GPIO6_02 | FLEX_PWM1
02 | GPIO9_04 | FLEX_PWM4
03 | GPIO9_05 | FLEX_PWM4
04 | GPIO9_06 | FLEX_PWM2
05 | GPIO9_08 | FLEX_PWM2
06 | GPIO7_10 | FLEX_PWM2
07 | GPIO7_17 | FLEX_PWM1
08 | GPIO7_16 | FLEX_PWM1
09 | GPIO7_11 | FLEX_PWM2
10 | GPIO7_00 | QUAD1
11 | GPIO7_02 | QUAD1
12 | GPIO7_01 | QUAD1
13 | GPIO7_03 | QUAD2
14 | GPIO6_18 | QUAD3
15 | GPIO6_19 | QUAD3
16 | GPIO6_23 | no pwm
17 | GPIO6_22 | no pwm
18 | GPIO6_17 | QUAD3
19 | GPIO6_16 | QUAD3
20 | GPIO6_26 | no pwm
21 | GPIO6_27 | no pwm
22 | GPIO6_24 | FLEX_PWM4
23 | GPIO6_25 | FLEX_PWM4
24 | GPIO6_12 | FLEX_PWM1
25 | GPIO6_13 | FLEX_PWM1
26 | GPIO6_30 | no pwm
27 | GPIO6_31 | no pwm
28 | GPIO8_18 | FLEX_PWM3
29 | GPIO9_31 | FLEX_PWM3
30 | GPIO8_23 | no pwm
31 | GPIO8_22 | no pwm
32 | GPIO7_12 | no pwm
33 | GPIO9_07 | FLEX_PWM2
34 | GPIO8_15 | FLEX_PWM1
35 | GPIO8_14 | FLEX_PWM1
36 | GPIO8_13 | FLEX_PWM1
37 | GPIO8_12 | FLEX_PWM1
38 | GPIO8_17 | FLEX_PWM1
39 | GPIO8_16 | FLEX_PWM1
#### Sorted by PWM timer
Pin | GPIO Reg | PWM timer
----|------------|-------------
12 | GPIO7_01 | QUAD1
11 | GPIO7_02 | QUAD1
10 | GPIO7_00 | QUAD1
13 | GPIO7_03 | QUAD2
18 | GPIO6_17 | QUAD3
15 | GPIO6_19 | QUAD3
14 | GPIO6_18 | QUAD3
19 | GPIO6_16 | QUAD3
24 | GPIO6_12 | FLEX_PWM1
01 | GPIO6_02 | FLEX_PWM1
25 | GPIO6_13 | FLEX_PWM1
34 | GPIO8_15 | FLEX_PWM1
35 | GPIO8_14 | FLEX_PWM1
36 | GPIO8_13 | FLEX_PWM1
37 | GPIO8_12 | FLEX_PWM1
38 | GPIO8_17 | FLEX_PWM1
39 | GPIO8_16 | FLEX_PWM1
00 | GPIO6_03 | FLEX_PWM1
08 | GPIO7_16 | FLEX_PWM1
07 | GPIO7_17 | FLEX_PWM1
09 | GPIO7_11 | FLEX_PWM2
04 | GPIO9_06 | FLEX_PWM2
05 | GPIO9_08 | FLEX_PWM2
06 | GPIO7_10 | FLEX_PWM2
33 | GPIO9_07 | FLEX_PWM2
28 | GPIO8_18 | FLEX_PWM3
29 | GPIO9_31 | FLEX_PWM3
23 | GPIO6_25 | FLEX_PWM4
22 | GPIO6_24 | FLEX_PWM4
03 | GPIO9_05 | FLEX_PWM4
02 | GPIO9_04 | FLEX_PWM4
27 | GPIO6_31 | no pwm
17 | GPIO6_22 | no pwm
26 | GPIO6_30 | no pwm
30 | GPIO8_23 | no pwm
31 | GPIO8_22 | no pwm
32 | GPIO7_12 | no pwm
21 | GPIO6_27 | no pwm
20 | GPIO6_26 | no pwm
16 | GPIO6_23 | no pwm
#### Sorted by GPIO register:
Pin | GPIO Reg | PWM timer
----|------------|-------------
01 | GPIO6_02 | FLEX_PWM1
00 | GPIO6_03 | FLEX_PWM1
24 | GPIO6_12 | FLEX_PWM1
25 | GPIO6_13 | FLEX_PWM1
19 | GPIO6_16 | QUAD3
18 | GPIO6_17 | QUAD3
14 | GPIO6_18 | QUAD3
15 | GPIO6_19 | QUAD3
17 | GPIO6_22 | no pwm
16 | GPIO6_23 | no pwm
22 | GPIO6_24 | FLEX_PWM4
23 | GPIO6_25 | FLEX_PWM4
20 | GPIO6_26 | no pwm
21 | GPIO6_27 | no pwm
26 | GPIO6_30 | no pwm
27 | GPIO6_31 | no pwm
10 | GPIO7_00 | QUAD1
12 | GPIO7_01 | QUAD1
11 | GPIO7_02 | QUAD1
13 | GPIO7_03 | QUAD2
06 | GPIO7_10 | FLEX_PWM2
09 | GPIO7_11 | FLEX_PWM2
32 | GPIO7_12 | no pwm
08 | GPIO7_16 | FLEX_PWM1
07 | GPIO7_17 | FLEX_PWM1
37 | GPIO8_12 | FLEX_PWM1
36 | GPIO8_13 | FLEX_PWM1
35 | GPIO8_14 | FLEX_PWM1
34 | GPIO8_15 | FLEX_PWM1
39 | GPIO8_16 | FLEX_PWM1
38 | GPIO8_17 | FLEX_PWM1
28 | GPIO8_18 | FLEX_PWM3
31 | GPIO8_22 | no pwm
30 | GPIO8_23 | no pwm
02 | GPIO9_04 | FLEX_PWM4
03 | GPIO9_05 | FLEX_PWM4
04 | GPIO9_06 | FLEX_PWM2
33 | GPIO9_07 | FLEX_PWM2
05 | GPIO9_08 | FLEX_PWM2
29 | GPIO9_31 | FLEX_PWM3
,
@luni64
Смотрите также:
- Миграция проекта Arduino Uno R3 в Wemos D1 R2 — проблемы с распиновкой
- Почему некоторые контакты Arduino Nano (D3, D4, A3, A4, A6, A7) не могут быть установлены на высокий уровень?
- Опасно ли соединять два выходных контакта вместе?
- Как настроить контакт как двунаправленный и с открытым коллектором?
- Встроенные светодиоды HIGH и LOW кажутся перевернутыми
- Почему мы используем побитовые операторы для назначения PORTx, DDRx и Pinx?
- ESP 8266 обратное поведение digitalWrite на каких контактах?
- Могу ли я отключить контакт TX, установив для него режим INPUT, при этом получая данные на контакт RX UART?
Шаг первый: прочитайте техническое описание чипа на плате. Шаг второй: реализуйте то, чему вы научились на шаге 1. Шаг третий: прибыль., @Majenko
@Majenko, одна небольшая проблема: как узнать, какие контакты каким портам соответствуют? Кроме того, я нахожу такие таблицы данных очень запутанными, поэтому нет никакой гарантии, что я смогу точно понять, что происходит., @Jachdich
Вам необходимо связать информацию в техническом описании с исходным кодом для определения ядра и платы., @Majenko
Для Teensy 3.6 вам необходимо ознакомиться с разделом 63.3 https://www.nxp.com/docs/en/reference-manual/K66P144M180SF5RMV2.pdf., @Majenko
DDRA эквивалентно GPIOA_PDDR. «PORTA» — это «GPIOA_PDOR», «PINA» — это «GPIOA_PDIR»., @Majenko
@Majenko хорошо, большое спасибо, я прочитаю об этом., @Jachdich
Для этих чипов существуют определенные адреса памяти, которые соответствуют определенным битам и операциям установки или очистки. Вместо цикла из трех инструкций «чтение или запись» вы можете установить или очистить бит с помощью одной инструкции записи по специальному адресу, специфичному для бита. Об этом упоминается в разделе «5.2.1 Aliased bit-band region» в указанном руководстве @Majenko. Кроме того, посмотрите на инструкцию Teensy
digitalWriteFast(pin,val)
, которая оптимизирует эквивалентный код в соответствии с разделом 63.3, на который ссылается @Majenko., @Dave X