注:このブログ投稿は、時間厳守のアトミックコースを繰り返したものであり、時間厳守のチュートリアルを要約し、独創性の名の下に盗用ではなく、いくつかの洞察を書いています。
1つは、STM32F4割り込みの導入です。
1.STM32F4割り込みの数とタイプ
STM32F4のコアはARMのCortex-M4です。実際のCortex-M4は、16個のコア割り込みと240個の外部割り込みを含む256個の割り込みをサポートし、256レベルのプログラム可能な割り込み設定を備えています。
ただし、STM32F4はすべてのCortex-M4割り込みを使用するわけではなく、その一部のみを使用します。10個のコア割り込みと82個のマスク可能割り込みを含む合計92個の割り込みがあります。16レベルのプログラム可能な割り込み優先度があります。これらの82個をよく使用します。マスク可能な割り込み。
2.カーネル割り込みと外部割り込みとは何ですか?
参照:CSDNブロガー[dgergeg]の記事:外部割り込みと内部割り込み
外部割り込みとは、外部割り込みソースによって実行される割り込みプログラムを指し、主にINT0、INT1、通信割り込みを指します。内部割り込みとは、主に、スタックオーバーフロー後に設定されるタイマー/カウンター割り込みなどの関連する特殊レジスタによって実行される割り込みを指します。
たとえば、外部からの中断:食事をしているときに、この時点で電話が鳴りました。一時的に調理器具を置いて電話に応答します。ここで食事をしているのは、現在実行中のプログラムです。電話が鳴ったのは、割り込みソースです。ランダムです。 。定期的に発生しません。電話に応答した後(中断イベントを処理)、戻って食事を続けます(
中断ポイントで処理されていないプログラムを実行し続けます)内部中断:食事をしているので、もうありませんこの時、ボウルにご飯を入れて、お食事を出します。ご飯を持って戻ってきて、食べ続けます。ここでの食事は、現在も取り組んでいるプログラムです。ボウルにご飯が入っていないのと同じです。中断。この中断はあなたの食事によって引き起こされます。これはシステム内のフラグのオーバーフローに相当します。
3.マスク不可割り込みとマスク不可割り込みとは何ですか?
参照:CSDNブロガー[lidandan2016]の記事:マスク不可割り込みとマスク不可割り込みの違い
よると、それはマスクすることが可能かどうかマスク不可能割り込み(非マスカブル割り込みと呼ばれる)とマスカブル割り込み:割り込みは、2つのカテゴリに分けることができます。
マスク不可割り込みソースが要求を行うと、CPUは無条件に応答する必要があり、マスク不可割り込みソースからの要求の場合、CPUは応答するかどうかを指定できます。
cupは通常、2つの割り込み要求入力ラインを設定します。マスク可能な割り込み要求INTR(割り込み要求)とマスク不可能な割り込み要求NMI(マスク不可能な割り込み)です。マスク可能な割り込みの場合、独自のマスクビットによって制御されるだけでなく、一般的な制御、つまりCPUフラグレジスタの割り込みイネーブルフラグビットIF(割り込みフラグ)によっても制御される必要があります。IFビットが1の場合、CPUを取得できます。それ以外の場合、応答は取得されません。その中で、IFビットはユーザーが制御できます。
シールドされていない割り込みソースの典型的な例は、電源障害です。一度発生すると、すぐに無条件に応答する必要があります。そうしないと、他の作業を行う意味がありません。マスク可能な割り込みソースの典型的な例は、プリンタ割り込みです。CPUは、プリンタをしばらく待機させることが完全に可能であるため、プリンタ割り込み要求に高速または低速で応答できます。
上記の分類によると、STM32F4には10個のコア割り込みと82個のマスク可能な割り込みがあり、16レベルのプログラム可能な割り込み優先度があります。何であるかについては、プログラム可能な割り込み優先、後で読みください。
2. STM32F4の割り込みを設定するにはどうすればよいですか?
1. NVICとは何ですか?
NVICのフルネームは、ネストされたベクトル化された割り込みコントローラー、つまりネストされたベクトル化された割り込みコントローラーです。Cortex-M3またはM4コアMCUの場合、各割り込みの優先度はレジスタの8ビットで設定されます。8ビットでは、2 ^ 8 = 256レベルの割り込みを設定できますが、実際にはあまり使用できないため、チップメーカーは製造するチップに応じて調整を行っています。たとえば、STM32F4は8ビットの上位4ビット[7:4]のみを使用し、下位4ビットはゼロを取るため、2 ^ 4 = 16となり、16レベルの割り込みネスティングしか表すことができません。このNVICには、優先度のグループ化、プリエンプションの優先度、応答の優先度という重要な知識ポイントがあります。以下では、STM32を例として紹介します。
2. NVICでの優先度のグループ化、プリエンプションの優先度、および応答の優先度
2.1プリエンプションの優先順位と応答の優先順位
まず、明確な概念。プログラムAのプリエンプション優先度が0の場合、プログラムBのプリエンプション優先度は1であり、プログラムAの特定の手順Bは、より高い優先度を取得します。つまり、数値が小さいほど、優先度が高くなります。
プリエンプションの優先順位と応答の優先順位について話しましょう:
①:プログラムAがすでに実装プロセスにある場合、今回はプログラムBの実装を開始し、Aよりもプリエンプションの優先度が高い場合はBを中断し、システム実行Bを実行できます。
②:プログラムAとプログラムBが同時に実行を開始したいが、Bの応答優先度がAより高い場合、システムはBを先に実行します。
2.2優先グループ化
優先度には、0、1、2、3、4の5つのグループ番号を付けることができます。異なるグループは、プリエンプション優先度と応答優先度に細分できるレベルの数を表します。たとえば、グループ0は0:4を意味し、0ビットが優先度をプリエンプトします。 、4ビットの応答優先度。言い換えると、システム内のすべての割り込みプログラムで、プリエンプションの優先度は同じで、すべて0であり、応答の優先度は2 ^ 4 = 16の異なるレベルを持つことができます。
次のショー(から特定の配布関係表厳守原子):
プログラムを書くときに、我々がすべき最初のconfigure優先グループ、そしてその後、別の割り込みプログラムの先取優先度と応答の優先順位を設定します。
3.プログラムでSTM32F4割り込みを設定するにはどうすればよいですか?
1.優先度のグループ化を構成します
プログラムでは、優先度のグループ化を最初に構成する必要があります。これにより、グループ化に基づいてプリエンプションの優先度と応答の優先度のレベルがいくつあるかを知ることができます。
次の機能を使用して優先度のグループ化を構成します。
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
その中で、優先度のグループ化には5つの異なるオプション(0、1、2、3、および4)があるため、パラメーターNVIC_PriorityGroup
には次の5つのオプションがあります。
NVIC_PriorityGroup_0
NVIC_PriorityGroup_1
NVIC_PriorityGroup_2
NVIC_PriorityGroup_3
NVIC_PriorityGroup_4
2.プリエンプション優先度と応答優先度を構成します
次の機能を使用して、プリエンプション優先度と応答優先度を設定します。
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
その中で、パラメータタイプNVIC_InitTypeDef
は構造体であり、その定義は次のとおりです。
typedef struct
{
uint8_t NVIC_IRQChannel;
uint8_t NVIC_IRQChannelPreemptionPriority;
uint8_t NVIC_IRQChannelSubPriority;
FunctionalState NVIC_IRQChannelCmd;
} NVIC_InitTypeDef;
その中で、NVIC_IRQChannel
どの割り込みを初期化するかを定義します。このために、stm32f10x.hで各割り込みの対応する名前を見つけることができます。例えば、USART1_IRQnは、NVIC_IRQChannelPreemptionPriority
規定の先取り優先順位NVIC_IRQChannelSubPriority
この割り込みを、規定のサブ優先この割り込みとも呼ばれ、応答の優先順位を、NVIC_IRQChannelCmd
設定するために使用されるのイネーブル割り込みチャネル。
たとえば、シリアルポート1の割り込みを有効にし、プリエンプション優先度を1に設定し、応答優先度ビットを2に設定します。初期化方法は次のとおりです。
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口 1 中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 响应优先级位 2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能
NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数,调用函数来初始化 NVIC 寄存器,达到对中断进行设置的目的