プログラマブル高速割り込みコントローラ (PFIC)
- 独立した割り込みトリガ制御、マスク制御、ステータスビットを持つ
- 最大ネストは 2段、ハードウェアスタックも 2段
- ハードウェアによる高速なスタックと復帰
PFICは CPUコアの機能だけれど、リファレンスマニュアルにも説明あり。
PFICレジスタ
"core_riscv.h"
NVIC->ISR[8]
NVIC->IPR[8]
NVIC->ITHRESDR
NVIC->CFGR
NVIC->GISR
NVIC->VTFIDR[4]
NVIC->VTFADDR[4]
NVIC->IENR[8]
NVIC->IRER[8]
NVIC->IPSR[8]
NVIC->IPRR[8]
NVIC->IACTR[8]
NVIC->IPRIOR[256]
NVIC->SCTLR
ライブラリでは ARM由来の NVICという名前が使われている。
#define NVIC PFIC
とあるので、NVICのかわりに PFICも使える。
レジスタが多いが IENR, IRER で割り込み 有効 / 無効 の設定を行えば通常の利用は可能。
ISR[0] ISR1 割り込み許可ステータスレジスタ
[31: 0] INTENSTA RO #31 - #0 割り込み許可ステータスビット 1:割り込み許可
#15, #13, #11 - #4, #1 - #0 は Reserved
ISR[1] ISR2 割り込み許可ステータスレジスタ
[31: 7] RO Reserved
[ 6: 0] INTENSTA RO #38 - #32 割り込み許可ステータスビット 1:割り込み許可
IPR[0] IPR1 割り込み保留ステータスレジスタ
[31: 0] PENDSTA RO #31 - #0 割り込み保留ステータスビット
#15, #13, #11 - #4, #1 - #0 は Reserved
IPR[1] IPR2 割り込み保留ステータスレジスタ
[31: 7] RO Reserved
[ 6: 0] PENDSTA RO #38 - #32 割り込み保留ステータスビット
ITHRESDR 割り込みレベル設定レジスタ
[31: 8] RO Reserved
[ 7: 0] THRESHOLD RW この設定値より低い優先度の割り込みは保留される
[7:6] 有効値
[5:0] 予約、0に固定
CFGR PFIC割り込み構成レジスタ
[31:16] KEYCODE WO セキュリティアクセスキー KEY1=0xFA05 KEY2=0xBCAF KEY3=0xBEEF
[15: 8] RO Reserved
[ 7] RESETSYS WO KEY3と同時に 1を書き込むとシステムリセット
[ 6: 0] RO Reserved
GISR 割り込みグローバルステータスレジスタ
[31:10] RO Reserved
[ 9] GPENDSTA RO 保留中の割り込みがあるか 1:保留あり
[ 8] GACTSTA RO 現在実行中の割り込みがあるか 1:割り込み実行中
[ 7: 0] NESTSTA RO 現在の割り込みネスト状態
0x03:レベル2の割り込みが進行中
0x01:レベル1の割り込みが進行中
その他の値:割り込みは発生していない
VTFIDR[0] VTF割り込みID構成レジスタ
[31:16] RO Reserved
[15: 8] VTFID1 RW VTF割り込み1に対応する割り込み番号を設定
[15: 8] VTFID1 RW VTF割り込み1に対応する割り込み番号を設定
VTFADDR[0] VTFADDRR0 VTF割り込みアドレスレジスタ
[31: 1] ADDR0[31:1] VTF割り込み0サービスプログラムアドレス(bit0 は常に0である)
[ 0] VTF割り込み0 有効化ビット 1:有効
VTFADDR[1] VTFADDRR1 VTF割り込みアドレスレジスタ
[31: 1] ADDR0[31:1] VTF割り込み1サービスプログラムアドレス(bit0 は常に0である)
[ 0] VTF割り込み1 有効化ビット 1:有効
IENR[0] IENR1 割り込み許可設定レジスタ
[31: 0] INTEN WO #31 - #0 割り込み許可ビット 1:許可
#15, #13, #11 - #0 は Reserved
IENR[1] IENR2 割り込み許可設定レジスタ
[31: 7] RO Reserved
[ 6: 0] INTEN WO #38 - #32 割り込み許可ビット 1:許可
IRER[0] IRER1 割り込み許可クリアレジスタ
[31: 0] INTRSET WO #31 - #0 割り込み無効化ビット 1:割り込み無効化
#15, #13, #11 - #0 は Reserved
IRER[1] IRER2 割り込み許可クリアレジスタ
[31: 7] RO Reserved
[ 6: 0] INTRSET WO #38 - #32 割り込み無効化ビット 1:割り込み無効化
IPSR[0] IPSR1 割り込み保留設定レジスタ
[31: 0] PENDSET WO #31 - #0 割り込み保留設定ビット 1:割り込み保留
#15, #13, #11 - #4, #1 -#0 は Reserved
IPSR[1] IPSR2 割り込み保留設定レジスタ
[31: 7] RO Reserved
[ 6: 0] PENDSET WO #38 - #32 割り込み保留設定ビット 1:割り込み保留
IPRR[0] IPRR1 割り込み保留クリアレジスタ
[31: 0] PENDSET WO #31 - #0 割り込み保留クリアビット 1:割り込み保留状態をクリア
#15, #13, #11 - #4, #1 -#0 は Reserved
IPRR[1] IPRR2 割り込み保留クリアレジスタ
[31: 7] RO Reserved
[ 6: 0] PENDSET WO #38 - #32 割り込み保留クリアビット 1:割り込み保留状態をクリア
IACTR[0] IACTR1 割り込み動作ステータスレジスタ
[31: 0] IACTS RO #31 - #0 割り込み実行状態ビット 1:割り込みが実行中
#15, #13, #11 - #4, #1 -#0 は Reserved
IACTR[1] IACTR2 割り込み動作ステータスレジスタ
[31: 7] RO Reserved
[ 6: 0] IACTS RO #38 - #32 割り込み実行状態ビット 1:割り込みが実行中
IPRIOR[0] 割り込み優先順位構成レジスタ
[ 7: 0] IP_0 RW #0の優先度
[7:6] 有効値
[5:0] 予約、0に固定
:
IPRIOR[255] 割り込み優先順位構成レジスタ
[ 7: 0] IP_255 RW #255の優先度
(#0 ~ #255の並びが逆かも?)
SCTLR PFICシステムコントロールレジスタ
[ 31] SYSRESET WO システムリセット制御ビット 1:リセット(PFTC->CFGRの RESETSYSと同じ)
[30: 6] RO Reserved
[ 5] SETEVENT WO WFE(Wait For Event)状態からの復帰に使用するイベントを設定する
[ 4] SEVONPEND RW 保留で WFEから復帰 1:全て 0:有効に設定したもののみ
[ 3] WFITOWFE RW WFI(Wait For Interrupt)を WFEとして扱うか 1:扱う
[ 2] SLEEPDEEP RW 低消費電力モード選択 1:DEEPSLEEP 0:SLEEP
[ 1] SLEEPONEXIT RW 割り込みサービスプログラム終了後
1:消費電力モードに入る 0:メインプログラムに復帰
[ 0] RO Reserved
割り込みに関係する CSRレジスタ
CSRレジスタはメモリ空間にマップされておらず、RISC-VのCSR専用機械語命令で読み書きされる。”core_riscv.h” に Cの関数あり。
Interrupt System Control Register (INTSYSCR) 初期値 0x00000000
[31: 2]
[ 1] INESTEN MRW 割り込みネストの有効化制御ビット 1:ネスト有効
[ 0] HWSTKEN MRW ハードウェアスタックの有効化制御ビット 1:有効
Exception Entry Base Address Register (MTVEC) 初期値 0x00000000
[31: 2] BASEADDR[31:2] MRW 割り込みベクタテーブルのベースアドレス
[ 1] MODE1 MRW ベクタテーブルの識別方式 1:絶対アドレス 0:ジャンプ命令
[ 0] MODE0 MRW エントリアドレス方式 1:アドレスオフセット 0:共通のエントリアドレス
V2シリーズマイクロプロセッサのMCUでは、スタートアップファイルにおいて `MODE[1:0] == 11` がデフォルトで設定されている。
ベクタテーブルは絶対アドレスを使用し、エントリは「割り込み番号 × 4」に基づいてオフセットされる。
外部割り込みおよびイベントコントローラ (EXTI)
- 割り込み:例外処理
- イベント:ウェイクアップ要因
すべての GPIOポートが外部割り込み入力として構成可能。ただし 1つの外部割り込み入力には 1つの GPIOピンにのみマッピング可能であり、外部割り込みチャネルの番号は GPIOポートのビット番号と一致していなければならない。たとえば PA1(または PC1、PD1)は EXTI1 にのみマッピング可能。
EXTIレジスタ
EXTI->INTENR
EXTI->EVENR
EXTI->RTENR
EXTI->FTENR
EXTI->SWIEVR
EXTI->INTFR
INTENR 割り込み許可レジスタ 初期値 0x00000000
[31:10] RO Reserved
[ 9] MR9 RW チャンネル9 割り込み許可ビット 1:割り込み許可
[ 8] MR8 RW チャンネル8 割り込み許可ビット
[ 7] MR7 RW チャンネル7 割り込み許可ビット
[ 6] MR6 RW チャンネル6 割り込み許可ビット
[ 5] MR5 RW チャンネル5 割り込み許可ビット
[ 4] MR4 RW チャンネル4 割り込み許可ビット
[ 3] MR3 RW チャンネル3 割り込み許可ビット
[ 2] MR2 RW チャンネル2 割り込み許可ビット
[ 1] MR1 RW チャンネル1 割り込み許可ビット
[ 0] MR0 RW チャンネル0 割り込み許可ビット
EVENR イベント許可レジスタ 初期値 0x00000000
[31:10] RO Reserved
[ 9] MR9 RW チャンネル9 イベント許可ビット 1:イベント許可
[ 8] MR8 RW チャンネル8 イベント許可ビット
[ 7] MR7 RW チャンネル7 イベント許可ビット
[ 6] MR6 RW チャンネル6 イベント許可ビット
[ 5] MR5 RW チャンネル5 イベント許可ビット
[ 4] MR4 RW チャンネル4 イベント許可ビット
[ 3] MR3 RW チャンネル3 イベント許可ビット
[ 2] MR2 RW チャンネル2 イベント許可ビット
[ 1] MR1 RW チャンネル1 イベント許可ビット
[ 0] MR0 RW チャンネル0 イベント許可ビット
RTENR 立ち上がりエッジトリガ許可レジスタ 初期値 0x00000000
[31:10] RO Reserved
[ 9] TR9 RW チャンネル9 立ち上がりエッジトリガ有効ビット 1:有効
[ 8] TR8 RW チャンネル8 立ち上がりエッジトリガ有効ビット
[ 7] TR7 RW チャンネル7 立ち上がりエッジトリガ有効ビット
[ 6] TR6 RW チャンネル6 立ち上がりエッジトリガ有効ビット
[ 5] TR5 RW チャンネル5 立ち上がりエッジトリガ有効ビット
[ 4] TR4 RW チャンネル4 立ち上がりエッジトリガ有効ビット
[ 3] TR3 RW チャンネル3 立ち上がりエッジトリガ有効ビット
[ 2] TR2 RW チャンネル2 立ち上がりエッジトリガ有効ビット
[ 1] TR1 RW チャンネル1 立ち上がりエッジトリガ有効ビット
[ 0] TR0 RW チャンネル0 立ち上がりエッジトリガ有効ビット
FTENR 立ち下がりエッジトリガ許可レジスタ 初期値 0x00000000
[31:10] RO Reserved
[ 9] TR9 RW チャンネル9 立ち下がりエッジトリガ有効ビット 1:有効
[ 8] TR8 RW チャンネル8 立ち下がりエッジトリガ有効ビット
[ 7] TR7 RW チャンネル7 立ち下がりエッジトリガ有効ビット
[ 6] TR6 RW チャンネル6 立ち下がりエッジトリガ有効ビット
[ 5] TR5 RW チャンネル5 立ち下がりエッジトリガ有効ビット
[ 4] TR4 RW チャンネル4 立ち下がりエッジトリガ有効ビット
[ 3] TR3 RW チャンネル3 立ち下がりエッジトリガ有効ビット
[ 2] TR2 RW チャンネル2 立ち下がりエッジトリガ有効ビット
[ 1] TR1 RW チャンネル1 立ち下がりエッジトリガ有効ビット
[ 0] TR0 RW チャンネル0 立ち下がりエッジトリガ有効ビット
SWIEVR ソフトウェア割り込みイベントレジスタ 初期値 0x00000000
[31:10] RO Reserved
[ 9] SWIER9 RW チャンネル9 ソフトウェア割り込み要求ビット
[ 8] SWIER8 RW チャンネル8 ソフトウェア割り込み要求ビット
[ 7] SWIER7 RW チャンネル7 ソフトウェア割り込み要求ビット
[ 6] SWIER6 RW チャンネル6 ソフトウェア割り込み要求ビット
[ 5] SWIER5 RW チャンネル5 ソフトウェア割り込み要求ビット
[ 4] SWIER4 RW チャンネル4 ソフトウェア割り込み要求ビット
[ 3] SWIER3 RW チャンネル3 ソフトウェア割り込み要求ビット
[ 2] SWIER2 RW チャンネル2 ソフトウェア割り込み要求ビット
[ 1] SWIER1 RW チャンネル1 ソフトウェア割り込み要求ビット
[ 0] SWIER0 RW チャンネル0 ソフトウェア割り込み要求ビット
1を書くと INTENR / EVENR で有効にした割り込みやイベントを発生させることができる。
INTFR 割り込みフラグレジスタ 初期値 0x0000xxxx
[31:10] RO Reserved
[ 9] IF9 W1 チャンネル9 割り込みフラグビット
[ 8] IF8 W1 チャンネル8 割り込みフラグビット
[ 7] IF7 W1 チャンネル7 割り込みフラグビット
[ 6] IF6 W1 チャンネル6 割り込みフラグビット
[ 5] IF5 W1 チャンネル5 割り込みフラグビット
[ 4] IF4 W1 チャンネル4 割り込みフラグビット
[ 3] IF3 W1 チャンネル3 割り込みフラグビット
[ 2] IF2 W1 チャンネル2 割り込みフラグビット
[ 1] IF1 W1 チャンネル1 割り込みフラグビット
[ 0] IF0 W1 チャンネル0 割り込みフラグビット
1を書くとフラグクリア
この文章のライセンス
2026-02-19作成 2026-02-20更新 佐藤恭一 kyoutan.jpn.org