ch32v003-getting-started-ja

MounRiver Studioで使う CH32V003 はじめの一歩

View on GitHub

目次に戻る

プログラマブル高速割り込みコントローラ (PFIC)

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を書くとフラグクリア

この文章のライセンス

CC0 1.0 Universal

2026-02-19作成 2026-02-20更新 佐藤恭一 kyoutan.jpn.org

目次に戻る