大家好,我是電源漫談,很高興和各位一起分享我的第35篇原創(chuàng)文章,喜歡和支持我的工程師,一定記得給我點(diǎn)贊、收藏、分享。
MCU在正常的運(yùn)行中,總是會(huì)遇到一些突然發(fā)生的事情,這些事情往往是MCU的硬件驅(qū)動(dòng)的,和MCU的運(yùn)行是異步關(guān)系的一些高優(yōu)先級(jí)事件,這些事件可以打斷MCU的正常代碼運(yùn)行,從而去操作另外的事情,這個(gè)事件就是中斷,它需要去做的事情就是中斷服務(wù)程序ISR.打個(gè)比方,一個(gè)人正在工作,突然口渴了想喝水,那么"喝水"這個(gè)比"工作"更優(yōu)先的事件就可以打斷工作。本文主要針對(duì)16位MCU及DSC的中斷處理系統(tǒng)進(jìn)行一些討論。
圖1 中斷向量的位置及執(zhí)行示意圖
首先我們簡(jiǎn)要介紹一下中斷處理系統(tǒng)。16位MCU有一個(gè)中斷向量系統(tǒng),這個(gè)向量系統(tǒng)可以支持高達(dá)8個(gè)不可mask的Traps源,及高達(dá)246個(gè)普通中斷源。有人會(huì)問(wèn),什么是Traps源?這里其實(shí)就是如前面所描述的那樣,它是不可屏蔽的中斷,這些中斷可以表示一些硬件或者軟件上的故障發(fā)生。
在這些芯片中,每一個(gè)中斷源都可以指定為7個(gè)不同的優(yōu)先級(jí),即從0-7的優(yōu)先級(jí)。大家都知道進(jìn)到中斷和出中斷是需要時(shí)間的,一般而言,基本的進(jìn)入中斷的延時(shí)為3個(gè)指令周期,而出中斷延時(shí)為四個(gè)指令周期。這就是16位MCU及DSC的中斷處理系統(tǒng)的一個(gè)基本認(rèn)識(shí)。
每一個(gè)中斷源,都可以觸發(fā)一個(gè)獨(dú)立的代碼段的執(zhí)行,這個(gè)獨(dú)立的代碼段就稱(chēng)之為中斷服務(wù)程序ISR,而每一個(gè)ISR代碼的起始地址是存儲(chǔ)在芯片Flash的主中斷向量表中,即IVT中。這里需要注意的是,每一個(gè)中斷向量都是一個(gè)24位的地址。
圖2 芯片F(xiàn)LASH存儲(chǔ)的中斷向量表及輔助中斷向量表
從上圖2可以看出,在MCU內(nèi)部,用戶的代碼是放在中斷向量表之后的,同時(shí),我們也可以看出,除了中斷向量表IVT之外,有的芯片還存在一個(gè)輔助中斷向量表AIVT.
圖3 輔助中斷向量的作用
輔助中斷向量AIVT的主要作用是提供一種在不同應(yīng)用之間切換的方式,這種切換不需要重新編程中斷向量,另一種情況,比如說(shuō)評(píng)估采用不同的軟件算法的兩個(gè)應(yīng)用的切換等。
圖4 輔助中斷向量的定義和使能
當(dāng)定義了Boot Segment后,并且AIVT使能之后,輔助中斷向量AIVT才可以使用。除了在配置位AIVTDIS上使能AIVT之外,還需要在特殊功能寄存器INTCON2中的AIVTEN位來(lái)使能它。當(dāng)使能AIVT后,所有的中斷和中斷處理過(guò)程都會(huì)使用AIVT而不是用IVT了,這一點(diǎn)需要注意。
圖5 輔助中斷向量表的FLASH位置
圖6 輔助中斷向量的位置
AIVT在FLASH中的位置起始于Boot Segment的最后一個(gè)PAGE的第一個(gè)半頁(yè),這個(gè)起始位置由BSLIM來(lái)定義(具體某一個(gè)中斷向量的地址由頁(yè)地址和偏移地址決定),如圖5所示。第二個(gè)半頁(yè)實(shí)際上是不可以使用的,這里需要注意BSLIM的單位是PAGE。
圖7 Boot Segment和AIVT的關(guān)系
圖8 BOOT Segment中AIVT的實(shí)現(xiàn)
這里我們舉例說(shuō)明,當(dāng)我們?cè)O(shè)置三個(gè)PAGE作為BOOT Segment時(shí),這里將設(shè)置BSLIM<12:0>為0x1FFC,最低的兩位是0,確保實(shí)現(xiàn)3個(gè)PAGE.具體的FLASH的位置在圖7中可以了解。
總結(jié),以上初步介紹了16位MCU的中斷處理系統(tǒng)的一些基本的特性,后面我們將繼續(xù)介紹這一話題。