DIO (GPIO)
AHI の DIO (GPIO) 関連の一部について、ソースコードの互換を目的として実装しています。
- この実装は完全な互換性を保つことを目的とはしていません。
- 本書記述時点で判明している留意点などを記載します。
- 内部の実装は予告なく変更される場合があります。
- 解説中のパラメータについても、留意が必要な部分のみ記述しています。省略部分は、原典の AHI ライブラリマニュアルを参照ください。
- 本解説で PIO と DIO という2つの用語が出てきます。
- PIO: TWELITE GOLD の使用半導体で定義されているピン番号で、FSLライブラリなどでは全てこのピン番号を用いる。
- DIO: TWELITE BLUE/RED での AHI API でも使用するピン番号です。当ライブラリでは TWELITE BLUE/RED のソースコードの互換性を保つために DIO から PIO の変換、またはその反対を行っています。
概要
ピンの割当については TWELITE BLUE/RED とは違うアーキテクチャになっています。ここでは TWELITE BLUE/RED で使用したピンを DIO0..19/DO0..1/ADC0…3、TWELITE GOLD の半導体でのピン名を PIO0..21 と記載します。ピンの詳細は、各モジュール利用の半導体データシートを参照ください。
- モジュール上のピンの対応が1:1にならない部分がある。
- PIO0 は DIO11 と DO0 で共用。
- PIO14 は DIO8 と ADC1 で共用。
- DIO割り込みについて、以下の相違点がある。
- DIO0..19まで独立した割り込みが可能であったが、そういった機能は存在しないため GINT (グループ割り込み) 機能を用いて、類似の動作を実現している。(他に独立した割り込みが可能な PINT という機能があるが4ポートまでの利用なので、本ライブラリでは使用していない)
- ハードウェアの割り込み検出は両エッジのみであるため、いずれかのエッジで内部割込みが発生する。
- 稼働中(スリープしていない)の場合は、割り込み発生後のピンの状態で AHI の割り込みハンドラを呼び出すか決めているため、両エッジであることは表面的に見えません。
- スリープ起床でのエッジは指定できません。
ピンの割当
| DIO | DIO | PIO | 備考 |
|---|---|---|---|
| DIO0 | 0 | 16 | |
| DIO1 | 1 | 17 | |
| DIO2 | 2 | 18 | |
| DIO3 | 3 | 19 | |
| DIO4 | 4 | 7 | |
| DIO5 | 5 | 6 | |
| DIO6 | 6 | 8 | |
| DIO7 | 7 | 9 | |
| DIO8 | 8 | 14 | ADC1と共用 |
| DIO9 | 9 | 12 | |
| DIO10 | 10 | 4 | |
| DIO11 | 11 | 0 | DO0と共用 |
| DIO12 | 12 | 13 | |
| DIO13 | 13 | 1 | |
| DIO14 | 14 | 10 | |
| DIO15 | 15 | 11 | |
| DIO16 | 16 | 20 | |
| DIO17 | 17 | 21 | |
| DIO18 | 18 | 2 | |
| DIO19 | 19 | 3 | |
| DO0 (PROG) | 0 | DIO11と共用 | |
| DO1 | 5 | ||
| ADC2 | 14 | DIO8と共用 | |
| ADC1 | 15 |
AHIcmpt_Dio.cpp - 定義・定数
定義
#define BOARD_GPIO_PORT_MAX_PIN_COUNT 22 // ピン数
#define BOARD_GPIO_PIN_TABLE_SIZE 24 // ピン数22を4の倍数で切り上げたもの
g_twenet_ioport_remap_by_PIOn[]
const uint8 g_twenet_ioport_remap_by_PIOn[BOARD_GPIO_PIN_TABLE_SIZE];
(ライブラリ内部使用)PIO番号をDIO番号に変換するテーブル。
- 0x80: SPIMISO ピン
- 0x90: ADC1ピン (アナログ専用)
- 0xFF: 未使用・未定義
g_twenet_ioport_remap_by_AHIn[]
const uint8 g_twenet_ioport_remap_by_AHIn[BOARD_GPIO_PIN_TABLE_SIZE];
(ライブラリ内部使用)AHI番号からPIO番号を参照するテーブル。
AHIcmpt_Dio.cpp - 定義
変数
uint32 G_TWENET_IOPORT_OUTPUT_BM() = 0; // 出力ポート一覧のDIOビットマップ
uint32 G_TWENET_IOPORT_INT_ENABLED_BM() = 0; // 割り込み有効ポート一覧のDIOビットマップ
uint32 G_TWENET_IOPORT_INT_RISING_BM() = 0; // 立ち上がり割り込み有効のDIOビットマップ
uint32 G_TWENET_IOPORT_INT_FALLING_BM() = 0; // 立ち下がり割り込み有効のDIOビットマップ
volatile uint32 G_TWENET_IOPORT_INT_STATUS() = 0; // DIO割り込み起床した場合の、起床ピンを記録したDIOビットマップ
uint32 G_TWENET_IOPORT_WAKE_STATUS() = 0; // 起床時のIO割り込み要因を保存したDIOビットマップ
- DIOビットマップはビットnがDIOnに対応します (例: DIO0, 3 なら
(1UL << 0) | (1UL << 3))
check_pio(), get_pio(), get_dio()
static inline bool check_pio(uint8 u8pio);
static inline uint8 get_pio(const uint8 u8dio);
static inline uint8 get_dio(const uint8 u8pio);
check_pio(): 指定された PIO が有効な番号か、また、他のペリフェラルで使用済みかどうかを判定するインライン関数。get_pio(): 指定された DIO 番号に対応する PIO 番号を返します。無効な割当である場合は0xffを返します。get_dio(): 指定された PIO 番号に対応する DIO 番号を返します。無効な割当である場合は0xffを返します。
s_gpio_int_handler()
static void s_gpio_int_handler(uint32 bm_pio, uint32 bm_pio_changed, void* p_data);
DIO割り込み発生時に内部的に呼び出される割り込み処理関数。
- ピンの変化がある場合は
__twenet_vAppQApiPostHwIntT()を用いて、AppQAPI 経由で割り込み情報を伝達します。
AHIcmpt_Dio.cpp - AHI関数定義
vAHI_DioSetDirection()
void vAHI_DioSetDirection(
uint32 u32Inputs,
uint32 u32Outputs);
ポートの入出力を設定します。
- 原則として初期化時は入力状態ですが、厳密には TWENETmcu ライブラリの pinmux.c
BOARD_InitPins()の初期化状態が規定値になります。
vAHI_DioSetOutput()
void vAHI_DioSetOutput( // u32On:HIGH, u32Off::LOW
uint32 u32On,
uint32 u32Off);
ポートの出力状態を変更します。u32OnはHIGHレベルに変更するDIOビットマップ、u32offはLOWレベルに変更するDIOビットマップです。
- 複数のピンを指定した場合はピンの変化は同時では有りません。
- 内部実装として、ループ内で1ピンずつ設定されるためです。
vAHI_DioSetPullup()
void vAHI_DioSetPullup(
uint32 u32On,
uint32 u32Off);
プルアップ状態を設定します。
- 原則としてプルアップ有りの設定ですが、厳密には TWENETmcu ライブラリの pinmux.c
BOARD_InitPins()の初期化状態が規定値になります。
u32AHI_DioReadInput()
uint32 u32AHI_DioReadInput(void);
すべてのポートの状態を一度に取得します。
- 戻り値が全ポートの状態を示すビットマップで
1になっているビットがHIGHレベル、0がLOWレベルです。 - 存在しないDIO番号やペリフェラルなどで使用中のポートの値は未定義です。
vAHI_DioWakeEnable()
void vAHI_DioWakeEnable(
uint32 u32Enable,
uint32 u32Disable);
DIO割り込みを開始します。u32Enableには割り込み処理を追加するDIOビットマップ、u32Disableには割り込み処理を除外するDIOビットマップを指定します。加えて割り込みを有効にしたピンに対して vAHI_DioWakeEdge() により割り込みエッジを指定する必要があります。
- 入力設定ピンでないピン(出力ピンや他のペリフェラル機能が割り当てられているピン)を指定した時の振る舞いは未定です。
vAHI_DioWakeEdge()
void vAHI_DioWakeEdge(
uint32 u32Rising,
uint32 u32Falling);
割り込みピンの設定を行います。この呼び出しでは、指定したピンに対して立ち上がり立ち下がり設定を一度に行います。追加や削除は出来ないことに注意してください。
本関数名には Wake が含まれますが、稼働中の割り込みの処理と、スリープ復帰の処理の両方を設定します。
- 動作原理上
u32Risingとu32Fallingに同一ピンを指定した場合は、双方のエッジで割り込みが発生します。(ただし、AHIでの有効な設定ではないため、動作検証外とします) - 割り込み動作中は
vAHI_DioWakeEnable()が内部的に呼び出され再設定されます。 - 入力設定ピンでないピン(出力ピンや他のペリフェラル機能が割り当てられているピン)を指定した時の振る舞いは未定です。
- スリープ復帰時の割り込みエッジは、両エッジになります。
u32AHI_DioWakeStatus()
uint32 u32AHI_DioWakeStatus(void);
DIO割り込み起床時の起床要因となったピンのビットマップを返します。
- 内部的には、呼び出し時の
__twenet_ioport_int_statusの値を返します。呼び出し後は0にセットされます。
bAHI_DoEnableOutputs()
static inline bool_t bAHI_DoEnableOutputs(bool_t bEnableDO) {
return bAHI_DoEnableOutputsEx_MW(bEnableDO, bEnableDO);
}
DO0,DO1ピンを出力設定にします。
- DO0/DO1 双方ともに出力設定にします。
- 片側だけを設定したい場合は
bAHI_DoEnableOutputsEx_MW()を呼び出します。- DO1 (PIO5) は、始動時にプログラムモードへの遷移判定(ISP_ENT)をするピンに割り当てられているため、ハードウェア設計上留意が必要なピンです。特別な理由がなければ、別のピンを利用することを推奨します。
- DO0(PIO0) は DIO11 にも割り当てられているため、両方利用している場合はコードの調整(片側の制御を除外する)が必要です。
vAHI_DoSetDataOut()
void vAHI_DoSetDataOut(
uint8 u8On,
uint8 u8Off);
DO0(PIO0),DO1(PIO1)に対して出力設定を行います。
- DO0がbit0 (0x1)、DO1がbit1 (0x2) のビットマップで指定します。
u8Onにビットを設定すると HIGH レベル、u8offに指定すると LOW レベルになります。
vAHI_DoSetPullup()
void vAHI_DoSetPullup(
uint8 u8On,
uint8 u8Off);
なにもしません。
AHIcmpt_Dio.cpp - AHI拡張API
末尾に _MW がつく関数は、AHI ライブラリには存在しない独自拡張です。
bAHI_DoEnableOutputsEx_MW()
bool_t bAHI_DoEnableOutputsEx_MW(
bool_t bEnableDO0, bool_t bEnableDO1);
DO0, DO1 を出力用に設定する。bAHI_DoEnableOutputs()が2ポート双方を設定するために追加した関数。
vAHI_DioInterruptDisablePinsIntWhenChanged_MW(), vAHI_DioInterruptReavtivate_MW()
void vAHI_DioInterruptDisablePinsIntWhenChanged_MW(bool_t bSet);
void vAHI_DioInterruptReavtivate_MW();
割り込み判定されたピンの割り込みを一時的に停止する。
bSetをTRUEとして呼び出すと、DIO割り込みが発生した時点で、その割り込み対象ピンの割り込みは一時的に停止します。チャタリングが多いメカボタンなどの入力の場合この設定を有効にして、割り込み発生から一定時間経過後に vAHI_DioInterruptReavtivate_MW() を呼び出し割り込みを再開します。
vAHI_DioOnSleep_MW()
void vAHI_DioOnSleep_MW();
内部的な処理関数でユーザは呼び出しを行いません。スリープ前の DIO 割り込み関係の処理を行います。具体的には DIO 起床ピンの設定を行います。
vAHI_DioOnWakeup_MW()
void vAHI_DioOnWakeup_MW(bool_t b_init_2nd);
内部的な処理関数でユーザは呼び出しを行いません。起床時の DIO 割り込み関係の処理を行います。起床要因となったピンを保存します。
b_init_2ndがfalseの呼び出しは、WarmMain()処理のごく初期の段階で呼び出され、起床要因の特定などの処理が行われます。つづいてcbAppWarmStart(TRUE)の呼び出しの直前にtrueでの呼び出しを行います。
vAHI_DioRetentionRelease_MW()
void vAHI_DioRetentionRelease_MW();
スリープ復帰後の DIO 出力状態保持を解除する。本関数は RAM OFF スリープ復帰時かつcbAppColdStart()内で使用します。
JN518Xでは、DIO出力状態を保持するためのレジスタ設定 (SYSCON->RETENTIONCTRL) を行ってからスリープします。出力設定を行ったDIOピンはレジスタ設定時の出力状態を維持し、スリープ復帰後もレジスタ設定を変更しない限り出力状態が保持されます。本関数を呼び出すことで出力保持が解除されます。
スリープ前の状態と同じ設定にするには本関数呼び出し前にvAHI_DioSetDirection()やvAHI_DioSetOutput()を行い、明示的に出力設定を行っておきます。DIOの内部レジスタはスリープ時にクリアされるためです。
cbAppColdStart()呼び出し後は、TWENETmcuライブラリ内の処理として、本関数と同じ処理を実行します。不用意なポートのHI/LO遷移を避けたい場合は、cbAppColdStart()内でポートの出力設定を行うようにしてください。
その他
本ライブラリを利用しない場合の留意事項
本ライブラリ中の関数は呼び出さないようにしてください。呼び出しを行わない場合であっても、本ライブラリは TWENETmcu, TWENETlib ライブラリと依存性があります。
依存関係を解消するためには以下を参考にしてください。
- スリープ手続きを行う際の割り込みピンに関する部分
vAHI_DioOnSleep_MW(),vAHI_DioOnWakeup_MW()を調整する必要があります。- この2つの関数は TWENETcmpt 内の
vAHI_OnSleep_MW(),vAHI_OnWakeup_MW()から呼び出されます。
- この2つの関数は TWENETcmpt 内の
vAHI_OnSleep_MW()関数は、ソース非開示のTWENETlibライブラリに依存しています。vAHI_DioOnSleep_MW()で__twenet_ioport_int_statusに割り込み起床判定を行う PIO ビットマップを指定します。ToCoNet_vSleep()内で反映され、適切にスリープ実行されます。
vAHI_OnWakeup_MW(),vAHI_DioOnWakeup_MW()は、TWENETmcuライブラリソース中で呼び出されます。必要に応じて処理を変更してください。