Nested Vector Interrupt Controller (NVIC) support(nvic.h)
ネスト型ベクタ割り込みコントローラ(NVIC)のサポート
概要(*1)
この節では、ネスト型ベクタ割り込みコントローラ(NVIC)とそれが使用するレジスタについて説明します。
NVICは以下をサポートしています:
最大81個の割り込み(STM32デバイスのタイプに依存、データシートを参照)
割り込みごとに0〜15のプログラム可能な優先レベル。0が最高の割り込み優先度、15が最低の優先度です。優先度が同じ場合は、割り込みベクター番号が小さいほど優先度が高くなります。
割り込み信号のレベルとパルス検出
割り込みの動的再優先順位付け
優先度値をグループ優先度と従属性フィールドにグループ化する
割り込みテールチェーニング
外部ノンマスカブル割り込み(NMI)
プロセッサは自動的にその状態を例外エントリにスタックし、命令のオーバーヘッドなしで例外終了時にこの状態をアンスタックします。 これは、遅延が少ない例外処理を提供します。
データ型
■ struct nvic_reg_map
NVICレジスタマップ
パブリックメンバー
__io uint32 ISER[8] 割り込みセットイネーブルレジスタ (NVIC_ISERx)
uint32 RESERVED0[24] リザーブ
__io uint32 ICER[8] 割り込みクリア・イネーブル・レジスタ (NVIC_ICERx)
uint32 RESERVED1[24] リザーブ
__io uint32 ISPR[8] 割込みセット保留レジスタ (NVIC_ISPRx)
uint32 RESERVED2[24] リザーブ
__io uint32 ICPR[8] 割り込みクリア・ペンディング・レジスタ (NVIC_ICPRx)
uint32 RESERVED3[24] リザーブ
__io uint32 IABR[8] 割り込みアクティブビットレジスタ (NVIC_IABRx)
uint32 RESERVED4[56] リザーブ
__io uint8 IP[240] 割り込み優先順位レジスタ (NVIC_IPRx)
uint32 RESERVED5[644] リザーブ
__io uint32 STIR ソフトウェアトリガ割り込みレジスタ (NVIC_STIR)
■ nvic_irq_num enum
STM32F1割り込みベクタテーブル割り込み番号
各正の値の列挙子は、ベクタテーブル内の対応する割り込みの位置です。 負の値を持つ列挙子は、システムハンドラブロックによって制御される割り込みに対応します。
NVIC_NMI -14 Non-maskable interrupt
NVIC_HARDFAULT -13 Hard fault (all class of fault)
NVIC_MEM_MANAGE -12 Memory management
NVIC_BUS_FAULT -11 Bus fault: prefetch fault, memory access fault.
NVIC_USAGE_FAULT -10 Usage fault: Undefined instruction or illegal state.
NVIC_SVC -5 System service call via SWI insruction
NVIC_DEBUG_MON -4 Debug monitor
NVIC_PEND_SVC -2 Pendable request for system service
NVIC_SYSTICK -1 System tick timer
NVIC_WWDG 0 Window watchdog interrupt
NVIC_PVD 1 PVD through EXTI line detection
NVIC_TAMPER 2 Tamper
NVIC_RTC 3 Real-time clock
NVIC_FLASH 4 Flash
NVIC_RCC 5 Reset and clock control
NVIC_EXTI0 6 EXTI line 0
NVIC_EXTI1 7 EXTI line 1
NVIC_EXTI2 8 EXTI line 2
NVIC_EXTI3 9 EXTI line 3
NVIC_EXTI4 10 EXTI line 4
NVIC_DMA_CH1 11 DMA1 channel 1
NVIC_DMA_CH2 12 DMA1 channel 2
NVIC_DMA_CH3 13 DMA1 channel 3
NVIC_DMA_CH4 14 DMA1 channel 4
NVIC_DMA_CH5 15 DMA1 channel 5
NVIC_DMA_CH6 16 DMA1 channel 6
NVIC_DMA_CH7 17 DMA1 channel 7
NVIC_ADC_1_2 18 ADC1 and ADC2
NVIC_USB_HP_CAN_TX 19 USB high priority or CAN TX
NVIC_USB_LP_CAN_RX0 20 USB low priority or CAN RX0
NVIC_CAN_RX1 21 CAN RX1
NVIC_CAN_SCE 22 CAN SCE
NVIC_EXTI_9_5 23 EXTI line [9:5]
NVIC_TIMER1_BRK_TIMER9 24 Timer 1 break, Timer 9.
NVIC_TIMER1_UP_TIMER10 25 Timer 1 update, Timer 10.
NVIC_TIMER1_TRG_COM_TIMER11 26 Timer 1 trigger and commutation, * Timer 11
NVIC_TIMER1_CC 27 Timer 1 capture/compare
NVIC_TIMER2 28 Timer 2
NVIC_TIMER3 29 Timer 3
NVIC_TIMER4 30 Timer 4
NVIC_I2C1_EV 31 I2C1 event
NVIC_I2C1_ER 32 I2C1 error
NVIC_I2C2_EV 33 I2C2 event
NVIC_I2C2_ER 34 I2C2 error
NVIC_SPI1 35 SPI1
NVIC_SPI2 36 SPI2
NVIC_USART1 37 USART1
NVIC_USART2 38 USART2
NVIC_USART3 39 USART3
NVIC_EXTI_15_10 40 EXTI line [15:10]
NVIC_RTCALARM 41 RTC alarm through EXTI line
NVIC_USBWAKEUP 42 USB wakeup from suspend through EXTI line
NVIC_TIMER8_BRK_TIMER12 43 Timer 8 break, timer 12
NVIC_TIMER8_UP_TIMER13 44 Timer 8 update, timer 13
NVIC_TIMER8_CC 46 Timer 8 capture/compare
NVIC_TIMER8_TRG_COM_TIMER14 45 Timer 8 trigger and commutation, * Timer 14
NVIC_ADC3 47 ADC3
NVIC_FSMC 48 FSMC
NVIC_SDIO 49 SDIO
NVIC_TIMER5 50 Timer 5
NVIC_SPI3 51 SPI3
NVIC_UART4 52 UART4
NVIC_UART5 53 UART5
NVIC_TIMER6 54 Timer 6
NVIC_TIMER7 55 Timer 7
NVIC_DMA2_CH1 56 DMA2 channel 1
NVIC_DMA2_CH2 57 DMA2 channel 2
NVIC_DMA2_CH3 58 DMA2 channel 3
NVIC_DMA2_CH_4_5 59 DMA2 channels 4 and 5
NVIC_TIMER1_BRK NVIC_TIMER1_BRK_TIMER9 Timer 1 break
NVIC_TIMER1_UP NVIC_TIMER1_UP_TIMER10 Timer 1 update
NVIC_TIMER1_TRG_COM NVIC_TIMER1_TRG_COM_TIMER11 Timer 1 trigger and commutation.
NVIC_TIMER8_BRK NVIC_TIMER8_BRK_TIMER12 Timer 8 break
NVIC_TIMER8_UP NVIC_TIMER8_UP_TIMER13 Timer 8 update
NVIC_TIMER8_TRG_COM NVIC_TIMER8_TRG_COM_TIMER14 Timer 8 trigger and commutation.
デバイス
なし
API関数
■ void nvic_init(uint32 address, uint32 offset)
NVICを初期化し、割り込みをデフォルトの優先度に設定します。
引数
address :ベクトルテーブルのベースアドレス
offset :vector_table_addressからのオフセット
非ゼロオフセットの使用にはいくつかの制限が適用されます。 ST RM0008およびARM Cortex M3テクニカルリファレンスマニュアルを参照してください。
SysTick割り込みおよび、すべての周辺割り込みの優先度に15(最低順位)を設定しています。
■ void nvic_set_vector_table(uint32 address, uint32 offset)
ベクタテーブルのベースアドレスを設定します。
引数
address :ベクトルテーブルのベースアドレス
offset :vector_table_addressからのオフセット
非ゼロオフセットの使用にはいくつかの制限が適用されます。 ST RM0008およびARM Cortex M3テクニカルリファレンスマニュアルを参照してください。
■ void nvic_irq_set_priority(nvic_irq_num irqn, uint8 priority)
割り込みラインの割り込み優先順位を設定します。
STM32は下位4ビットを無視して4ビットの優先度しか実装しません。 これは、16レベルの優先度しかないことを意味します。 ビット[3:0]はゼロとして読み出され、書き込みは無視されます。
デフォルトでは、全ての割り込みラインの優先度は15が設定されています。
本関数では、引数 priority を4ビット分左シフトし、下位4ビット無視の条件を補正しています。指定する値は0~15の16レベルで指定します。
引数
irqn : 設定するデバイス
priority : 設定優先順位は0が最高優先順位、15が最低順位
■ void nvic_sys_reset()
強制的にシステムをリセットします。
デバッグを除くすべての主要なシステムコンポーネントをリセットします。
■ void nvic_globalirq_enable()
割り込みと構成可能なフォルトハンドラを有効にします(PRIMASKをクリア)。
■ void nvic_globalirq_disable()
割り込みと構成可能なフォルトハンドラを無効にする(PRIMASKを設定)。
■ void nvic_irq_enable(nvic_irq_num irq_num)
irq_numで指定した割り込みを有効にします。
引数
irqn : 設定するデバイス
■ void nvic_irq_disable(nvic_irq_num irq_num)
irq_numで指定した割り込みを無効にします。
引数
irqn : 設定するデバイス
■ void nvic_irq_disable_all(void)
すばやくすべての割り込みを無効にします。
この関数を呼び出すと、ループ内でnvic_irq_disable()を呼び出すよりもはるかに高速です。
関連項目
参考文献
レジスタマップベースポインタ
■ NVIC_BASE
NVICレジスタマップベースポインタ
レジスタのビット定義
なし
脚注
(*1)は、参考文献1より引用しています。
このドキュメントはleafLabs, LLC.が執筆し、たま吉が翻訳・一部加筆修正したものです。
NAVER、ヤフオク等の営利目的の記事転用、リンク貼りは禁止です。