Cortex-M 3割り込み
5738 ワード
1異常
2割込み優先度について
割り込み構成ベースの各外部割り込みは、NVICの次のレジスタに「書留」されます.
異常マスクレジスタPRIMASKは、NMIおよびハードfault以外のすべての異常に使用され、現在の優先度を効率的に0(プログラマブル優先度の中で最も高い優先度)に変更する.このレジスタはMRSとMSRの以下の例でアクセスできる:1.オフ割り込みオープンブレーク
また、CPSコマンドにより、上記の機能を迅速に実行することもできる.
Active状態レジスタは、外部割り込みごとにアクティブな状態ビットを有する.プロセッサがISRの最初の命令を実行すると、そのアクティブビットは1に設定され、ISRが戻るまでハードウェアがクリアされない.ネストがサポートされているため、優先度の高い例外がISRをプリエンプトできます.しかし,中断されてもプリエンプトされ,その活動状態は依然として1である.
3使用中断
アプリケーションがROMに格納されている場合は、例外サービスプログラムを変更する必要はありません.優先度グループ を確立する.は、割り込みの優先度 を指定する.は、この割り込み を可能にする.
4 cm 3.hでの操作中断相関関数
5ユーザEFM 32割り込み
1)優先度数は、まず、特定のプロセッサに対してサポートされる外部割り込み数が異なるため、割り込み優先度を設定する際に、チップが実際にどれだけのビットを使用して優先度を表すかを知る必要がある.EFM 32にて:_NVIC_PRIO_BITS定義efm 32 g 280 f 128 h中.
6 SVC使用
M3 15 ,240 IRQ, NMI, ,hardfault , 。
M3 。
2割込み優先度について
M3 , ,NMI fault , 。 ,CM3 3 256 , 128 。 , CM3 , , 8 ,16 ,32 。 。
3 :
(https://img-blog.csdn.net/20150918210348709)
M3 , , , 。 ,
1、
2、 。
, 3 ([7:5]), 5( 5 ), 4 , 2 ,
(https://img-blog.csdn.net/20150918210522808)
(https://img-blog.csdn.net/20150918210552871)
, , m3 API 。
CM3 , 3 8 。 , 0xFF, , 1, 。
割り込み構成ベースの各外部割り込みは、NVICの次のレジスタに「書留」されます.
1.
2. “ ”
3.
4.
5. (PRIMASK, FAULTMASK BASEPRI)
,
1.
2.
3.
Handler SHCSR fault, fault fault , 。 SHCSR , faults 。
ICSR
, , 。
異常マスクレジスタPRIMASKは、NMIおよびハードfault以外のすべての異常に使用され、現在の優先度を効率的に0(プログラマブル優先度の中で最も高い優先度)に変更する.このレジスタはMRSとMSRの以下の例でアクセスできる:1.オフ割り込み
MOV R0, #1
MSR PRIMASK, R0
MOV R0, #0
MSR PRIMASK, R0
また、CPSコマンドにより、上記の機能を迅速に実行することもできる.
CPSID i ;
CPSIE i ;
FAULTMASK , -1。 , fault 。 PRIMASK 。 ,FAULTMASK 。
, NMI, NMI 。 , 。 NMI ,“ , , ”! , NMI , …… , , , 。
Active状態レジスタは、外部割り込みごとにアクティブな状態ビットを有する.プロセッサがISRの最初の命令を実行すると、そのアクティブビットは1に設定され、ISRが戻るまでハードウェアがクリアされない.ネストがサポートされているため、優先度の高い例外がISRをプリエンプトできます.しかし,中断されてもプリエンプトされ,その活動状態は依然として1である.
3使用中断
アプリケーションがROMに格納されている場合は、例外サービスプログラムを変更する必要はありません.
4 cm 3.hでの操作中断相関関数
__STATIC_INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) //---
__STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void) //---
__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) //---
__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) //---
__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) //---
__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) //---
__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) //---
__STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) //---
__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) //---
__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) //---
__STATIC_INLINE void NVIC_SystemReset(void) //---NVIC
5ユーザEFM 32割り込み
1)優先度数は、まず、特定のプロセッサに対してサポートされる外部割り込み数が異なるため、割り込み優先度を設定する際に、チップが実際にどれだけのビットを使用して優先度を表すかを知る必要がある.EFM 32にて:_NVIC_PRIO_BITS定義efm 32 g 280 f 128 h中.
#define __NVIC_PRIO_BITS 3 /**< NVIC interrupt priority bits */
cm3.h :
NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff);
cm3.h (8-__NVIC_PRIO_BITS) 。 EFM32 startup.s 30 。
2)
, AIPCR[8:10] 0, (8-__NVIC_PRIO_BITS) 。
, 。
void NVIC_SetPriorityGrouping (uint32_t PriorityGroup)
PriorityGroup
7-PriorityGroup 。 PriorityGroup 5, [7:6] 。
3)
core_cmFunc.h PRIMASK
__disable_irq(void);
__enable_irq(void);
__get_PRIMASK(void);
__set_PRIMASK(uint32_t priMask);
6 SVC使用
SVC 8 , , , :
SVC 3 ; 3
SVC OS API 。 OS , API 。