Какой аналог PORTx для Teensy (4.0)?

Я видел людей, использующих такой код, как PORTB |= 0x1 << 6, чтобы установить шестой бит PORTB в Arduino. Я понимаю, что это значительно быстрее, чем использование digitalWrite. Как это можно сделать с помощью современного Teensy (т.е. 3.6 или 4.0) и вообще?

, 👍1

Обсуждение

Шаг первый: прочитайте техническое описание чипа на плате. Шаг второй: реализуйте то, чему вы научились на шаге 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


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 
,