前回はサンプルをそのまま使って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_BITMASK
の 13
はそのためです。
GPIO7_DR
の使用
特定のピンだけ値を変えたい場合には、参考サイトのように CORE_PIN13_PORTSET
と CORE_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
と公式でラップされているので、実用上マスクの番号を知る必要はなさそうです。