STM 32 F 1ノート(四)NVIC割込み優先度管理

2600 ワード

STM 32は、割り込みを5つのグループに分けて0~4のグループとする.構成コードは次のとおりです.
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

標準ライブラリでは、グループの定義は次のとおりです.
/** @defgroup Preemption_Priority_Group 
  * @{
  */

#define NVIC_PriorityGroup_0         ((uint32_t)0x700) /*!< 0 bits for pre-emption priority
                                                            4 bits for subpriority */
#define NVIC_PriorityGroup_1         ((uint32_t)0x600) /*!< 1 bits for pre-emption priority
                                                            3 bits for subpriority */
#define NVIC_PriorityGroup_2         ((uint32_t)0x500) /*!< 2 bits for pre-emption priority
                                                            2 bits for subpriority */
#define NVIC_PriorityGroup_3         ((uint32_t)0x400) /*!< 3 bits for pre-emption priority
                                                            1 bits for subpriority */
#define NVIC_PriorityGroup_4         ((uint32_t)0x300) /*!< 4 bits for pre-emption priority
                                                            0 bits for subpriority */

翻訳すると、
パケット0は0ビット優先度、4ビット応答優先度である.
パケット1は1ビット優先度、3ビット応答優先度である.
パケット2は2ビット優先度、2ビット応答優先度である.
パケット3は3ビット優先度、1ビット応答優先度である.
パケット4は4ビット優先度、0ビット応答優先度である.
 
パケット3を使用すると仮定すると、使用可能なプリエンプト優先度は2^3=8、すなわち0~7であり、コードは以下のように構成することができる.
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 6;
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 7;

使用可能な応答優先度は2^1=2、すなわち0~1であり、コードは以下のように構成できる.
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
//NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

優先度ロジック:
1.優先権のレベルが応答の優先度より高い.すなわち、優先度の高い割り込みは、実行中の優先度の低い割り込みを中断することができる.
2、数値が小さいほど優先度が高くなります.つまり、0が最も優先度が高いです.
3、優先順位が同じである場合、応答優先度が高いものは優先順位が低いものを中断してはならない.
4、両方の割り込みの優先順位と応答の優先順位が同じである場合、どの割り込みが先に発生したかは先に実行する.
 
NVIC構成例:
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);