0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ARM Cortex-M內(nèi)核MCU的三重中斷控制設(shè)計(jì)

Dp1040 ? 來(lái)源: 痞子衡嵌入式 ? 2023-10-31 11:04 ? 次閱讀

我們知道在 MCU 裸機(jī)中程序代碼之所以能完成多任務(wù)并行實(shí)時(shí)處理功能,其實(shí)主要是靠中斷來(lái)調(diào)度的,沒(méi)有中斷,CPU 就只能按順序"呆板"地執(zhí)行代碼。很多人都說(shuō)是中斷能力賦予了 MCU 真正的靈魂,能正確認(rèn)識(shí)和熟練使用 MCU 中斷,基本上就算玩熟了這顆 MCU。

之前寫(xiě)過(guò)一篇《中斷處理函數(shù)(IRQHandler)的標(biāo)準(zhǔn)流程》,里面詳細(xì)講了中斷處理函數(shù)里的標(biāo)準(zhǔn)代碼流程與寫(xiě)法,這篇文章可讓大家對(duì) MCU 里的中斷用法有個(gè)初步認(rèn)識(shí)。今天以 ARM Cortex-M 內(nèi)核 MCU 為例再來(lái)介紹下業(yè)界標(biāo)準(zhǔn)的三重中斷控制設(shè)計(jì):

一、外設(shè)事件中斷控制

MCU 中最底層的中斷控制針對(duì)的是外設(shè)里某個(gè)具體的事件,這個(gè)控制來(lái)自于外設(shè)模塊本身,以恩智浦 i.MXRT 系列 MCU 的 GPT 定時(shí)器模塊為例。如下是 GPT 模塊寄存器列表,你可以發(fā)現(xiàn)其中有經(jīng)典的 IR 和 SR 寄存器,SR 是事件狀態(tài)寄存器,IR 是中斷事件控制寄存器:

a5214dae-7799-11ee-939d-92fbcf53809c.png


GPT 定時(shí)器一旦被使能,其運(yùn)行狀態(tài)(一共支持 6 個(gè)事件:超時(shí)、輸入捕獲 x 2ch、比較輸出 x 3ch)都會(huì)實(shí)時(shí)記錄在 SR 寄存器中,如果不在 IR 寄存器中將事件中斷開(kāi)啟(默認(rèn)是關(guān)閉的),那么就需要用戶(hù)在代碼里手動(dòng)去查詢(xún) SR 寄存器置起的事件標(biāo)志位以處理對(duì)應(yīng)事件。

Note:SR 寄存器中置起的事件標(biāo)志位需要在事件處理前手動(dòng)清除掉。如果標(biāo)志位不及時(shí)清除,可能會(huì)遺漏下一次事件的處理(比如先處理當(dāng)前事件,后清除事件標(biāo)志位,那么處理事件期間再次發(fā)生的事件就會(huì)被漏掉)。如果標(biāo)志位忘了清除,同一次事件就會(huì)被處理兩次及以上。

當(dāng)然在實(shí)際應(yīng)用中,為了節(jié)省 CPU 帶寬,我們都是要開(kāi)啟外設(shè)事件中斷的,MCU 廠商 SDK 包里一般都會(huì)提供相應(yīng)接口函數(shù)(取自 fsl_gpt.h):

typedefenum_gpt_interrupt_enable
{
kGPT_OutputCompare1InterruptEnable=GPT_IR_OF1IE_MASK,
kGPT_OutputCompare2InterruptEnable=GPT_IR_OF2IE_MASK,
kGPT_OutputCompare3InterruptEnable=GPT_IR_OF3IE_MASK,
kGPT_InputCapture1InterruptEnable=GPT_IR_IF1IE_MASK,
kGPT_InputCapture2InterruptEnable=GPT_IR_IF2IE_MASK,
kGPT_RollOverFlagInterruptEnable=GPT_IR_ROVIE_MASK,
}gpt_interrupt_enable_t;

//開(kāi)啟GPTx的xx事件中斷
staticinlinevoidGPT_EnableInterrupts(GPT_Type*base,uint32_tmask)
{
base->IR|=mask;
}

//關(guān)閉GPTx的xx事件中斷
staticinlinevoidGPT_DisableInterrupts(GPT_Type*base,uint32_tmask)
{
base->IR&=~mask;
}

使能 GPT1 的超時(shí)事件中斷代碼示例如下:

voidperiph_int_config(void)
{
//初始化GPT1...
GPT_Init(GPT1,&gptConfig);
//...

//開(kāi)啟GPT1的超時(shí)事件中斷
GPT_EnableInterrupts(GPT1,kGPT_RollOverFlagInterruptEnable);
}

二、外設(shè)全局中斷控制

MCU 中第二層的中斷控制針對(duì)的是整個(gè)外設(shè),這個(gè)控制來(lái)自于 Cortex-M 內(nèi)核的 NVIC 模塊。如下是 NVIC 模塊寄存器列表(取自 ARMv8-M 手冊(cè),除了 IABRn 和 ITNSn 寄存器組外,其余寄存器適用全部的 Cortex-M 家族),其中跟中斷開(kāi)關(guān)相關(guān)的是 ISER 和 ICER 寄存器:

a52dcef8-7799-11ee-939d-92fbcf53809c.png

當(dāng) MCU 中某外設(shè)(比如上一節(jié)里的 GPT)被使能后,即使其內(nèi)部事件中斷已被開(kāi)啟,也不意味著系統(tǒng)中斷一定會(huì)被觸發(fā),因?yàn)?NVIC 里對(duì)于這個(gè)外設(shè)的全局中斷開(kāi)關(guān)(同一外設(shè)中所有事件共享一個(gè)系統(tǒng)中斷資源,即一個(gè)中斷號(hào))還沒(méi)有開(kāi)啟。ARM CMSIS 包里提供了外設(shè)全局中斷控制函數(shù)(取自 core_cm7.h 文件):

#defineNVIC_EnableIRQ__NVIC_EnableIRQ
#defineNVIC_DisableIRQ__NVIC_DisableIRQ

//開(kāi)啟xx外設(shè)的全局中斷
__STATIC_INLINEvoid__NVIC_EnableIRQ(IRQn_Type IRQn)
{
if((int32_t)(IRQn)>=0)
{
__COMPILER_BARRIER();
NVIC->ISER[(((uint32_t)IRQn)>>5UL)]=(uint32_t)(1UL<uint32_t)IRQn)&0x1FUL));
__COMPILER_BARRIER();
}
}

//關(guān)閉xx外設(shè)的全局中斷
__STATIC_INLINEvoid__NVIC_DisableIRQ(IRQn_Type IRQn)
{
if((int32_t)(IRQn)>=0)
{
NVIC->ICER[(((uint32_t)IRQn)>>5UL)]=(uint32_t)(1UL<uint32_t)IRQn)&0x1FUL));
__DSB();
__ISB();
}
}

增加了使能 GPT1 的全局中斷代碼示例如下,其中 GPT1_IRQn 和 GPT1_IRQHandler 是固定名字,在 MCU 廠商提供的頭文件(MIMXRT1176_cm7.h)和啟動(dòng)文件(startup_MIMXRT1176_cm7.s)里有定義。

voidperiph_int_config(void)
{
//初始化GPT1...
GPT_Init(GPT1,&gptConfig);
//...

//開(kāi)啟GPT1的超時(shí)事件中斷
GPT_EnableInterrupts(GPT1,kGPT_RollOverFlagInterruptEnable);

//開(kāi)啟GPT1的全局中斷
NVIC_EnableIRQ(GPT1_IRQn);
}

//GPT1的中斷響應(yīng)函數(shù)
voidGPT1_IRQHandler(void)
{
GPT_ClearStatusFlags(GPT1,kGPT_RollOverFlagInterruptEnable);

//中斷業(yè)務(wù)處理代碼
}

三、系統(tǒng)全局中斷控制

MCU 中最頂層的中斷控制針對(duì)的是整個(gè)芯片系統(tǒng),這個(gè)控制來(lái)自于 Cortex-M 內(nèi)核的 CPS 指令。如下是 CPS 指令用法(取自 ARMv7-M 手冊(cè)):

a542a7e2-7799-11ee-939d-92fbcf53809c.png

當(dāng)你想對(duì) MCU 整個(gè)芯片的所有中斷進(jìn)行統(tǒng)一開(kāi)關(guān)控制時(shí),就必須借助 CPS 指令。一般情況下開(kāi)啟芯片系統(tǒng)全局中斷動(dòng)作在 MCU 啟動(dòng)文件里已經(jīng)做好了,所以在用戶(hù)代碼環(huán)境里常常不需要使能系統(tǒng)全局中斷的動(dòng)作。如下是 IAR 環(huán)境下 i.MXRT1170 啟動(dòng)文件中系統(tǒng)全局中斷操作,基于匯編指令實(shí)現(xiàn):

a54d51a6-7799-11ee-939d-92fbcf53809c.png

為了便于用戶(hù)在 C 代碼中操作系統(tǒng)全局中斷,各 IDE 下均按同樣的接口函數(shù)( __disable_irq / __enable_irq )做了封裝實(shí)現(xiàn)。IAR 環(huán)境見(jiàn) IAR SystemsEmbedded Workbench 8.50.6armincciccarm_builtin.h 文件,但是封裝進(jìn)其 Lib 了,沒(méi)有暴露源碼:

#include"iccarm_builtin.h"

#define__disable_irq__iar_builtin_disable_interrupt
#define__enable_irq__iar_builtin_enable_interrupt

Keil 環(huán)境見(jiàn) Keil_v5ARMARMCLANGincludearm_compat.h 文件,我們可以看到源碼:

static__inline__unsignedint__attribute__((__always_inline__,__nodebug__))
__disable_irq(void){
unsignedintcpsr;
#if__ARM_ARCH>=6
#ifdefined(__ARM_ARCH_PROFILE)&&__ARM_ARCH_PROFILE=='M'
__asm__ __volatile__("mrs%[cpsr],primask
"
"cpsid i
"
:[cpsr]"=r"(cpsr));
returncpsr&0x1;
#endif
#endif
}

static__inline__void__attribute__((__always_inline__,__nodebug__))
__enable_irq(void){
#if__ARM_ARCH>=6
__asm__ __volatile__("cpsie i");
#endif
}

最終 GPT 例程里完整的三重中斷使能代碼應(yīng)如下:

voidperiph_int_config(void)
{
//初始化GPT1...
GPT_Init(GPT1,&gptConfig);
//...

//開(kāi)啟GPT1的超時(shí)事件中斷
GPT_EnableInterrupts(GPT1,kGPT_RollOverFlagInterruptEnable);

//開(kāi)啟GPT1的全局中斷
NVIC_EnableIRQ(GPT1_IRQn);

//開(kāi)啟芯片系統(tǒng)全局中斷
__enable_irq();
}
本文轉(zhuǎn)載自痞子衡嵌入式

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16667

    瀏覽量

    347772
  • 嵌入式
    +關(guān)注

    關(guān)注

    5045

    文章

    18817

    瀏覽量

    298495
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5253

    瀏覽量

    119201
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10702

    瀏覽量

    209356
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    889

    瀏覽量

    41219

原文標(biāo)題:嵌入式MCU中標(biāo)準(zhǔn)的三重中斷控制設(shè)計(jì)

文章出處:【微信號(hào):玩點(diǎn)嵌入式,微信公眾號(hào):玩點(diǎn)嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    怎么實(shí)現(xiàn)嵌入式MCU中標(biāo)準(zhǔn)的三重中斷控制設(shè)計(jì)?

    怎么實(shí)現(xiàn)嵌入式MCU中標(biāo)準(zhǔn)的三重中斷控制設(shè)計(jì)?
    發(fā)表于 11-29 06:02

    ARM Cortex-M內(nèi)核的相關(guān)資料推薦

      大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是ARM Cortex-M功能模塊,不過(guò)側(cè)重點(diǎn)是款安全特性處理器?! ?b class='flag-5'>ARM C
    發(fā)表于 12-27 07:21

    Arm 10款 Cortex-M系列MCU內(nèi)核對(duì)比

    MCU出現(xiàn)的歷史并不長(zhǎng),但其發(fā)展非常迅速。就目前來(lái)說(shuō),第方的MCU內(nèi)核中,占主導(dǎo)地位的是Arm Cor
    發(fā)表于 07-29 11:30

    方的MCU內(nèi)核中,Arm Cortex M系列為什么占主導(dǎo)地位

    MCU出現(xiàn)的歷史并不長(zhǎng),但其發(fā)展非常迅速。就目前來(lái)說(shuō),第方的MCU內(nèi)核中,占主導(dǎo)地位的是Arm Cor
    發(fā)表于 07-29 11:33

    干貨:對(duì)比看看Arm推出的10款Cortex-M系列MCU內(nèi)核IP

    。公司產(chǎn)品被廣泛應(yīng)用于電動(dòng)車(chē)、無(wú)人機(jī)、智能家居、GPS模塊、打印控制、運(yùn)動(dòng)控制和人工智能等領(lǐng)域。核心團(tuán)隊(duì)擁有超過(guò)20年的MCU產(chǎn)品研發(fā)經(jīng)驗(yàn)。公司核心產(chǎn)品是基于ARM
    發(fā)表于 07-29 11:35

    國(guó)內(nèi)MCU廠商90%都采用的ArmCortex-M系列內(nèi)核,優(yōu)點(diǎn)在哪?

    MCU出現(xiàn)的歷史并不長(zhǎng),但其發(fā)展非常迅速。就目前來(lái)說(shuō),第方的MCU內(nèi)核中,占主導(dǎo)地位的是Arm Cor
    發(fā)表于 07-29 11:37

    ARM Cortex-M 系列微控制器(ST)

    ARM Cortex-M 系列微控制器(ST) 意法半導(dǎo)體(ST)宣布在基于ARM Cortex-M系列處理器
    發(fā)表于 11-02 09:29 ?929次閱讀

    傳統(tǒng)的單片機(jī)和ARM較量 助推MCU踏上高端Cortex-M市場(chǎng)

    據(jù)有關(guān)市場(chǎng)調(diào)研機(jī)構(gòu)稱(chēng),基于ARM Cortex-M內(nèi)核MCU在2010年創(chuàng)紀(jì)錄地實(shí)現(xiàn)了100%的出貨量增長(zhǎng)。而整個(gè)MCU市場(chǎng)才增長(zhǎng)了37%
    發(fā)表于 04-28 10:00 ?1524次閱讀

    mcookie與單片機(jī)的關(guān)系_使用ARM Cortex-M MCU拓展單片機(jī)教學(xué)

    mcookie與單片機(jī)的關(guān)系_使用ARM Cortex-M MCU拓展單片機(jī)教學(xué)
    發(fā)表于 11-30 19:36 ?9次下載
    mcookie與單片機(jī)的關(guān)系_使用<b class='flag-5'>ARM</b> <b class='flag-5'>Cortex-M</b> <b class='flag-5'>MCU</b>拓展單片機(jī)教學(xué)

    一點(diǎn)理解之 CmBacktrace: ARM Cortex-M 系列 MCU 錯(cuò)誤追蹤庫(kù)

    一點(diǎn)理解之 CmBacktrace: ARM Cortex-M 系列 MCU 錯(cuò)誤追蹤庫(kù)
    發(fā)表于 11-30 19:51 ?10次下載
    一點(diǎn)理解之 CmBacktrace: <b class='flag-5'>ARM</b> <b class='flag-5'>Cortex-M</b> 系列 <b class='flag-5'>MCU</b> 錯(cuò)誤追蹤庫(kù)

    Cortex-M中斷及FreeRTOS中斷優(yōu)先級(jí)配置原理

    下面就來(lái)說(shuō)說(shuō)關(guān)于Cortex-M中斷,及FreeRTOS中斷優(yōu)先級(jí)配置原理。
    發(fā)表于 02-08 15:30 ?3次下載
    <b class='flag-5'>Cortex-M</b><b class='flag-5'>中斷</b>及FreeRTOS<b class='flag-5'>中斷</b>優(yōu)先級(jí)配置原理

    分析ARM Cortex-M內(nèi)核復(fù)位啟動(dòng)過(guò)程

    ARM Cortex-M內(nèi)核的復(fù)位啟動(dòng)過(guò)程也被稱(chēng)為復(fù)位序列(Reset sequence),下面就來(lái)簡(jiǎn)要總結(jié)分析下這一過(guò)程。
    的頭像 發(fā)表于 03-20 09:58 ?2065次閱讀

    基于32位Arm Cortex-M內(nèi)核N32系列MCU應(yīng)用

    國(guó)民技術(shù)N32系列MCU產(chǎn)品基于32位Arm Cortex-M內(nèi)核,內(nèi)置嵌入式高速閃存、低功耗電源管理,集成數(shù)?;旌想娐?,并內(nèi)置硬件密碼算法加速引擎以及安全單元。
    發(fā)表于 03-28 11:35 ?748次閱讀

    Cortex-M 內(nèi)核中斷/異常系統(tǒng)、中斷優(yōu)先級(jí)/嵌套 詳解

    Cortex-M 內(nèi)核中斷/異常系統(tǒng)、中斷優(yōu)先級(jí)/嵌套 詳解
    的頭像 發(fā)表于 09-27 15:29 ?1684次閱讀
    <b class='flag-5'>Cortex-M</b> <b class='flag-5'>內(nèi)核</b><b class='flag-5'>中斷</b>/異常系統(tǒng)、<b class='flag-5'>中斷</b>優(yōu)先級(jí)/嵌套 詳解

    瑞薩Cortex-M內(nèi)核RA MCU的RT-Thread BSP制作教程發(fā)布

    瑞薩Cortex-M內(nèi)核RA MCU的RT-Thread BSP制作教程發(fā)布
    的頭像 發(fā)表于 09-18 10:58 ?583次閱讀
    瑞薩<b class='flag-5'>Cortex-M</b><b class='flag-5'>內(nèi)核</b>RA <b class='flag-5'>MCU</b>的RT-Thread BSP制作教程發(fā)布