91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

中斷是什么 如何使用它們

454398 ? 來源:工程師吳畏 ? 2019-07-31 14:08 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

原理圖

中斷是什么 如何使用它們

什么是中斷?

微控制器編寫的簡單程序通常都可以在主函數(shù)內(nèi)部完成,并且?guī)缀醪恍枰褂猛庠O(shè)。但是,大多數(shù)其他微控制器程序更復(fù)雜,需要大量代碼。當(dāng)發(fā)生這種情況時,中斷會變得非常有用,但究竟什么是中斷?

想象一下,我們的微控制器需要同時做兩件事:準(zhǔn)確跟蹤時間并使LED閃爍。我們的程序可以通過重置計時器,遞增計數(shù)器,然后等待計時器溢出來開始。完成后,我們的代碼可以使LED閃爍。雖然這有點完成工作,但是有兩個問題。 CPU花費大部分時間坐在延遲循環(huán)中,這浪費了CPU時間,并且LED的執(zhí)行時間很難計算。

那么,我們?nèi)绾谓鉀Q這個問題呢?我們可以在計時器上使用中斷!因此,我們不是在主代碼中遞增計數(shù)器,而是將代碼轉(zhuǎn)換為處理時序的中斷服務(wù)程序。

通常,微控制器將運行LED閃爍代碼,但是一旦定時器生成中斷請求,微控制器停止LED閃爍代碼,執(zhí)行定時器中斷服務(wù)程序,然后返回到LED閃爍代碼。這樣,LED閃爍代碼不會干擾我們的定時器代碼,它可以更準(zhǔn)確(并且更容易)跟蹤時間。

AVR Core上的中斷

AVR有一個向量表,每個中斷源都跳轉(zhuǎn)到一個唯一的地址。這是非常有利的,因為我們不再需要執(zhí)行比較來查看觸發(fā)了哪個中斷,這可能需要一些時間。

下表顯示了Atmega168上可用的不同中斷以及它們跳轉(zhuǎn)到的地址。程序記憶。但是,在我們使用它們之前必須配置幾個中斷選項。

從ATmega168數(shù)據(jù)表中提取

表位置

Atmega168具有允許的引導(dǎo)加載程序區(qū)域它可以動態(tài)地重寫自己的程序存儲器,這對固件更新很有用。因此,ISR向量表將位于內(nèi)存中很重要。如果表位于引導(dǎo)加載程序區(qū)域中,則在啟用引導(dǎo)加載程序時永遠(yuǎn)不會更新(不推薦)。

因此,如果沒有引導(dǎo)加載程序,則應(yīng)將向量表放在內(nèi)存的底部(接近地址0x0000),但如果使用引導(dǎo)加載程序,則應(yīng)將向量表移動到引導(dǎo)加載程序上方。這可以通過改變MCUCR寄存器中的幾個位來輕松完成。

如果IVSEL = 0,則ISR位于向量表的起始,否則ISR駐留在引導(dǎo)加載程序中?,F(xiàn)在,將其保留為0,因為我們沒有使用引導(dǎo)加載程序

如果IVCE = 1,則執(zhí)行ISR切換。暫時保留為0

中斷啟用位

每個中斷源(I/O引腳,外設(shè)等)都有關(guān)聯(lián)中斷使能位。與PIC類似,STATUS寄存器中有一個全局中斷使能位,需要將其設(shè)置為允許中斷工作。要找出這些中斷標(biāo)志所在的位置,需要參考數(shù)據(jù)手冊中的特定外設(shè)章節(jié)。

例如,我們將在定時器0上使用溢出中斷,所以如果我們看一下定時器0在章節(jié)中,我們發(fā)現(xiàn)中斷使能位位于TIMSK0寄存器(第89頁)中,稱為TOIE0。需要將此位設(shè)置為1才能觸發(fā)定時器溢出。該寄存器還有另外兩個中斷源,A匹配溢出和B匹配溢出,這對PWM功能很有用(將來會介紹)。

注意,設(shè)置我在SREG中的位不是使用SREG本身,而是使用函數(shù)sei();設(shè)置I位和cei();清除I位。

在WinAVR中編寫ISR

所以我們現(xiàn)在明白需要啟用中斷才能啟動,但我們?nèi)绾问褂肅和WINAVR編譯器編寫?答案很簡單:我們使用特殊保留字ISR并傳遞中斷名稱參數(shù)來告訴編譯器哪個中斷函數(shù)處理。注意我們需要包含中斷頭文件,否則中斷函數(shù)將不起作用!

#include

ISR(TIMER0_OVF_vect)

{

// Interestingly, the AVR automatically clears interrupt flags.。。.unlike the PIC

// Put your code here

}

簡單閃爍示例

在這個例子中,ATmega168會使連接到PD0的LED頻繁閃爍,其中閃爍的速率受到控制通過定時器0但是,您可能會注意到主功能為空,并且LED在定時器溢出中斷服務(wù)程序(ISR)內(nèi)閃爍。這意味著我們可以在while循環(huán)中放入我們想要的任何代碼,并且該代碼不會阻止中斷運行。

/*

* AVR Interrupt.c

*

* Created: 09/01/2018

* Author : RobinLaptop

*/

// These are really useful macros that help to get rid of unreadable bit masking code

#define setBit(reg, bit) (reg = reg | (1 《《 bit))

#define clearBit(reg, bit) (reg = reg & ~(1 《《 bit))

#define toggleBit(reg, bit) (reg = reg ^ (1 《《 bit))

#define clearFlag(reg, bit) (reg = reg | (1 《《 bit))

#include

#include

ISR(TIMER0_OVF_vect)

{

// Interestingly, the AVR automatically clears interrupt flags =) 。。..unlike the PIC =(

// Toggle the LED (PD0 , Pin 2)

toggleBit(PORTD, PD0);

}

int main(void)

{

// Initialize Registers

clearBit(TCCR0A, WGM00); // Configure WGM to be 0x00 for normal mode

clearBit(TCCR0A, WGM01);

clearBit(TCCR0B, WGM02);

setBit(TCCR0B, CS00); // Configure clock source to be clock io at 1024 pre-scale

clearBit(TCCR0B, CS01);

setBit(TCCR0B, CS02);

DDRD = 0xFF; // Make PORT D and output

sei(); // Enable interrupts

setBit(TIMSK0, TOIE0); // Enable the timer interrupt

while (1)

{

// Put any code you want here

// It should not affect the interrupt service routine!

}

}

結(jié)論

本教程僅涵蓋單個中斷,即定時器0溢出中斷,但它清楚地表明中斷是非常強大。如果使用得當(dāng),您可以擁有一個系統(tǒng),它可以在信號到達(dá)時立即響應(yīng)并暫停主代碼。這可以用來做很多事情,包括多任務(wù)處理,不同外圍設(shè)備的多重處理,以及創(chuàng)建實時代碼!

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

    關(guān)注

    5

    文章

    917

    瀏覽量

    43771
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Linux中斷“搬家”指南:從應(yīng)用到操作,手把手教你轉(zhuǎn)移中斷核心(RK3588)

    在高性能服務(wù)器或嵌入式設(shè)備(如瑞芯微 RK3588)上,中斷處理的 CPU 核心綁定是優(yōu)化性能的關(guān)鍵手段之一。比如網(wǎng)卡中斷默認(rèn)綁在小核上時,高網(wǎng)絡(luò)負(fù)載會導(dǎo)致小核過載,而大核卻“閑置”;通過中斷轉(zhuǎn)移,把網(wǎng)卡
    的頭像 發(fā)表于 02-04 16:20 ?739次閱讀
    Linux<b class='flag-5'>中斷</b>“搬家”指南:從應(yīng)用到操作,手把手教你轉(zhuǎn)移<b class='flag-5'>中斷</b>核心(RK3588)

    中斷還是輪詢?嵌入式外設(shè)驅(qū)動的最佳實踐!

    剛?cè)腴T做嵌入式開發(fā)時,很多人經(jīng)常糾結(jié):用定時器采集傳感器數(shù)據(jù),是直接while循環(huán)里輪詢標(biāo)志位,還是寫個中斷函數(shù)?串口收發(fā)數(shù)據(jù)時,是用while(!(USART_SR&RXNE))這種
    的頭像 發(fā)表于 01-04 09:15 ?389次閱讀
    <b class='flag-5'>中斷</b>還是輪詢?嵌入式外設(shè)驅(qū)動的最佳實踐!

    RISC-V怎么實現(xiàn)核間中斷?核心本地中斷控制器(CLINT)深度解析

    全稱為Core Local Interruptor(核心本地中斷控制器),是 RISC-V 特權(quán)架構(gòu)規(guī)范(Privileged Architecture Specification)中明確定義的內(nèi)建
    的頭像 發(fā)表于 12-13 14:06 ?2441次閱讀
    RISC-V怎么實現(xiàn)核間<b class='flag-5'>中斷</b>?核心本地<b class='flag-5'>中斷</b>控制器(CLINT)深度解析

    電能質(zhì)量在線監(jiān)測裝置可監(jiān)測電壓中斷持續(xù)時間嗎?

    電能質(zhì)量在線監(jiān)測裝置可精準(zhǔn)監(jiān)測電壓中斷持續(xù)時間 ,這是其核心暫態(tài)事件監(jiān)測功能之一,嚴(yán)格遵循 GB/T 30137-2013《電能質(zhì)量 電壓暫升、暫降與短時中斷》和國標(biāo) IEC 61000-4-30
    的頭像 發(fā)表于 12-11 10:24 ?458次閱讀
    電能質(zhì)量在線監(jiān)測裝置可監(jiān)測電壓<b class='flag-5'>中斷</b>持續(xù)時間嗎?

    電能質(zhì)量在線監(jiān)測裝置能識別電壓中斷事件嗎?

    現(xiàn)代電能質(zhì)量在線監(jiān)測裝置(無論 A 類還是 S 類精度)均能精準(zhǔn)識別電壓中斷事件,且完全符合 GB/T 30137-2013《電能質(zhì)量 電壓暫降、短時中斷和電壓暫升》、IEC 61000-4-30
    的頭像 發(fā)表于 11-27 16:27 ?941次閱讀
    電能質(zhì)量在線監(jiān)測裝置能識別電壓<b class='flag-5'>中斷</b>事件嗎?

    SysTick初始化函數(shù)和中斷服務(wù)函數(shù)詳解

    SysTick定時器的計數(shù)器是向下遞減計數(shù)的,計數(shù)一次的時間TDEC=1/CLKICLK,當(dāng)重裝載寄存器中的值VALUELOAD減到0的時候,產(chǎn)生中斷,可知中斷一次的時間TINT=VALUELOAD*TDEC=VALUE LOAD/CLKICLK,其中CLKICLK=20
    的頭像 發(fā)表于 09-23 09:57 ?797次閱讀
    SysTick初始化函數(shù)和<b class='flag-5'>中斷</b>服務(wù)函數(shù)詳解

    瑞薩RA系列MCU的中斷過程介紹

    當(dāng)中斷來臨的時候會最先經(jīng)過IRQ寄存器,IRQ寄存器檢測到中斷的時候,會向中央處理嵌套向量中斷控制器NVIC發(fā)送中斷信號,當(dāng)NVIC檢測到中斷
    的頭像 發(fā)表于 09-23 09:45 ?1292次閱讀
    瑞薩RA系列MCU的<b class='flag-5'>中斷</b>過程介紹

    瑞薩RA系列MCU的外部引腳中斷詳解

    上一章節(jié)我們已經(jīng)詳細(xì)介紹了NVIC、ICU、ELC、NMI并對RA系列MCU的中斷管理系統(tǒng)有個全局的了解,我們這一章節(jié)的內(nèi)容是如何控制外部中斷,也是內(nèi)核里的NVIC的實例應(yīng)用,這也是RA系列MCU非常重要的一個外部中斷資源。
    的頭像 發(fā)表于 09-23 09:38 ?1692次閱讀
    瑞薩RA系列MCU的外部引腳<b class='flag-5'>中斷</b>詳解

    CYT2B93CAE如何構(gòu)建不產(chǎn)生中斷的FIFO?

    你好,我正在使用 CYT2B93CAE 使用設(shè)備配置器 5.3,我選擇將不匹配的 ID 存儲在 FIFO 0 中,問題是它正在生成中斷,而對于不匹配的 ID,我不想中斷 CPU,只是將它們傳遞給 DMA 線。 如何構(gòu)建不產(chǎn)生
    發(fā)表于 07-15 06:29

    第六章 外部中斷

    本章介紹W55MH32的IO口作為外部中斷輸入的使用。先闡述了NVIC(嵌套向量中斷控制器) 的結(jié)構(gòu)、寄存器、優(yōu)先級及相關(guān)函數(shù),再說明EXTI(外部中斷和事件控制器)的功能??驁D及IO口與
    的頭像 發(fā)表于 05-26 16:27 ?1501次閱讀
    第六章 外部<b class='flag-5'>中斷</b>

    極海APM32F003觸發(fā)NMI中斷的解決方案

    問題:APM32F003F6P6 PC3配置成外部中斷口,下拉觸發(fā)之后沒有進入EINTC_IRQHandler外部中斷函數(shù),反而一直觸發(fā)NMI中斷。
    的頭像 發(fā)表于 05-24 14:44 ?959次閱讀
    極海APM32F003觸發(fā)NMI<b class='flag-5'>中斷</b>的解決方案

    AS32X601驅(qū)動系列教程 PLIC_中斷應(yīng)用詳解

    平臺中斷控制器(Platform Level Interrupt Controller,PLIC)是國科安芯AS32系列MCU芯片的中斷控制器,主要對中斷源進行采樣,優(yōu)先級仲裁和分發(fā)。各外設(shè)
    的頭像 發(fā)表于 05-23 17:10 ?717次閱讀
    AS32X601驅(qū)動系列教程 PLIC_<b class='flag-5'>中斷</b>應(yīng)用詳解

    第十章 W55MH32中斷應(yīng)用概覽

    本章講述了W55MH32中斷應(yīng)用,涵蓋異常類型、NVIC介紹、優(yōu)先級定義與分組,闡述中斷編程三要點(使能中斷、配置 NVIC、編寫服務(wù)函數(shù)),并強調(diào)優(yōu)先級分組設(shè)置注意事項。
    的頭像 發(fā)表于 05-22 17:07 ?1911次閱讀
    第十章 W55MH32<b class='flag-5'>中斷</b>應(yīng)用概覽

    如何在CYPD7299中禁用和啟用SWD,并在需要時啟用它?

    基本上,我的要求是在 CYPD7299 中禁用 SWD,并在需要時啟用它。 僅供參考,我們正在通過 LIN 使用固件更新。 有人可以指導(dǎo)如何實現(xiàn)這一點嗎?
    發(fā)表于 05-19 08:02

    求助,關(guān)于CM0.c中的USBFS和中斷問題求解

    ,USBFS 在 CM0.c 文件中仍無法正常運行。 我已經(jīng)驗證了配置并確保所有必需的設(shè)置都已到位,但 USBFS 仍然無法按預(yù)期運行。 中斷未觸發(fā):我已經(jīng)在 CM0 核心中設(shè)置了中斷,但它們沒有按應(yīng)有
    發(fā)表于 05-16 06:44