Teensy 4.1メモ2 - ベアメタルでLチカとピン機能対応表

f:id:yuppi5:20210220173704j:plain

前回 : Teensy 4.1メモ1 - 開発環境を整える

前回はサンプルをそのまま使ってLチカをしました。 今回はベアメタルでLチカをします。 また、ベアメタルで必須であるポート番号がわかるピン機能対応表も載せています。

ベアメタルでLチカするプログラム

int cnt = 0;

void setup(void){
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop(void){
  if (cnt & 1) {
    GPIO7_DR = CORE_PIN13_BITMASK;
  } else {
    GPIO7_DR = 0;
  }
  cnt++;
  delay(250);
}

ベアメタルでLチカするプログラムは上のようになっています。 ボードについている LED を0.5秒周期で点滅させるプログラムです。 コピペして書き込めば動きます。

プログラムの特徴

ピン番号について

LEDがついているピン番号は13番です。 CORE_PIN13_BITMASK13 はそのためです。

GPIO7_DR の使用

特定のピンだけ値を変えたい場合には、参考サイトのように CORE_PIN13_PORTSETCORE_PIN13_PORTCLEAR を使うと便利です。 しかし、いくつかのピンの値を一括で変更したい場合は不便です。 そこで、GPIO7_DR を使うと、ピンの値を一括で変更できて便利になります。 AVRやSTM32などといった標準的なマイコンではお馴染みの方法ですね。 日本語で GPIO7_DR を解説しているサイトはなかったので、この記事を書きました。

なぜ 7 なのかや、どのピンがどんな数字なのかについてはピン機能対応表にて後述します。

pinMode の併用

pinMode の中身を覗いた感じ、GPIOの設定までベアメタルでやるのは難しそうだったので併用しました。

(ほぼ自分用メモ) この13番ピンに限っては、GPIO7_GDIR とか、IOMUXC_SW_MUX_CTL_PAD_GPIO_B0_03 とかが出てきました。後者に関してはピンごとに名前がかなり変わっていたので追うのをやめました。

(ARDUINOのフォルダー)/hardware/teensy/avr/cores/teensy4 の中に根幹となるライブラリーが入っているようです。この中身を全文検索すると pinMode の中身やピン番号、GPIOのポート番号がわかったりします。

ピン機能対応表

ピン機能対応表です。 公式サイト(ARDUINOのフォルダー)/hardware/teensy/avr/cores/teensy4/core_pins.h を照らし合わせて作りました。7・8列目が何を示しているのかは未調査です…。各自で適当に補完してください。

ピン番号 ポート マスク AD UART SPI ? ? PWM I2C SDIO RAM
P0 6 3 RX1 CS1 CRX2 PWM
P1 6 2 TX1 MISO1 CTX2 PWM
P2 9 4 OUT2 PWM
P3 9 5 LRCLK2 PWM
P4 9 6 BCLK2 PWM
P5 9 8 IN2 PWM
P6 7 10 OUT1D PWM
P7 7 17 RX2 OUT1A PWM
P8 7 16 TX2 IN1 PWM
P9 7 11 OUT1C PWM
P10 7 0 CS MQSR PWM
P11 7 2 MOSI CTX1 PWM
P12 7 1 MISO MQSL PWM
P13 7 3 SCK PWM
P14 6 18 A0 TX3 S/PDIF OUT PWM
P15 6 19 A1 RX3 S/PDIF IN PWM
P16 6 23 A2 RX4 SCL1
P17 6 22 A3 TX4 SDA1
P18 6 17 A4 PWM SDA
P19 6 16 A5 PWM SCL
P20 6 26 A6 TX5 LRCLK1
P21 6 27 A7 RX5 BCLK1
P22 6 24 A8 CTX1 PWM
P23 6 25 A9 CRX1 MCLK1 PWM
P24 6 12 A10 TX6 PWM
P25 6 13 A11 RX6 PWM
P26 6 30 A12 MOSI1
P27 6 31 A13 SCK1
P28 8 18 RX7 PWM
P29 9 31 TX7 PWM
P30 8 23 CRX3
P31 8 22 CTX3
P32 7 12 OUT1B
P33 9 7 MCLK2 PWM
P34 7 29 RX8
P35 7 28 TX8
P36 7 18 CS PWM
P37 7 19 CS PWM
P38 6 28 A14 CS1 IN1
P39 6 29 A15 MISO1 OUT1A
P40 6 20 A16
P41 6 21 A17
P42 8 15 MISO2 PWM DAT1
P43 8 14 MOSI2 PWM DAT0
P44 8 13 CS2 PWM SDA1 CLK
P45 8 12 SCK2 PWM SCL1 CMD
P46 8 17 RX5 PWM DAT3
P47 8 16 TX5 PWM DAT2
P48 9 24 RX8 CS0
P49 9 27 SCK2 D1
P50 9 28 MOSI2 D2
P51 9 22 PWM SCL1 CS1
P52 9 26 RX1 D0
P53 9 25 TX1 PWM CLK
P54 9 29 MISO2 D3

例えば、LEDがくっついている13番ピンについて見ていきます。 このピンのポート番号は7なので、GPIO7_DR を使うことがわかります。

マスクは GPIOx_DR の何ビット目にそのピンが対応しているのかを示しています。ただ、CORE_PIN13_BITMASK と公式でラップされているので、実用上マスクの番号を知る必要はなさそうです。

参考サイトさん

ehbtj.com


前回 : Teensy 4.1メモ1 - 開発環境を整える

次回 :