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

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

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

使用MSP430的外部中斷來切換不同的LED

科技觀察員 ? 來源:circuitdigest ? 作者:Surya Siddharth ? 2022-08-10 16:18 ? 次閱讀

考慮一個(gè)簡(jiǎn)單的數(shù)字手表,它被編程為只顯示時(shí)間,現(xiàn)在想象你想改變它的時(shí)區(qū)。你會(huì)怎么做?您只需按下一個(gè)按鈕,即可更改為使您能夠更改時(shí)區(qū)的菜單。在這里,系統(tǒng)無法預(yù)測(cè)您對(duì)其計(jì)時(shí)過程的外部中斷,也無法要求您等待,因?yàn)樗τ谠黾幽直砩系拿胫?。這就是中斷派上用場(chǎng)的地方。

中斷不一定是外部的;它也可以是內(nèi)部的。大多數(shù)情況下,嵌入式中斷還有助于 CPU 的兩個(gè)外設(shè)之間的通信??紤]一個(gè)預(yù)設(shè)定時(shí)器被復(fù)位,當(dāng)時(shí)間達(dá)到定時(shí)器寄存器中的值時(shí)觸發(fā)中斷。中斷處理程序可用于啟動(dòng)其他外設(shè),如 DMA。

在本教程中,我們使用了MSP430 上的外部中斷來切換不同的 LED。當(dāng)使用按鈕通過狀態(tài)改變給出外部中斷時(shí),控制權(quán)被轉(zhuǎn)移(搶占)到 ISR 并且它完成了必要的工作。

為什么我們需要中斷?

需要中斷來節(jié)省嵌入式系統(tǒng)中的輪詢開銷。當(dāng)需要通過搶占當(dāng)前正在運(yùn)行的任務(wù)來執(zhí)行優(yōu)先級(jí)較高的任務(wù)時(shí)調(diào)??用它們。它也可用于將 CPU 從低功耗模式喚醒。當(dāng)通過 GPIO 端口被外部信號(hào)的邊沿轉(zhuǎn)換喚醒時(shí),執(zhí)行 ISR 并且 CPU 再次返回低功耗模式。

MSP430 中的中斷類型

MSP430 中的中斷分為以下類型-

系統(tǒng)重置

不可屏蔽中斷

可屏蔽中斷

向量和非向量中斷

系統(tǒng)重置:

它可能由于電源電壓 (Vcc) 和選擇了復(fù)位模式的 RST/NMI 引腳中的低信號(hào)而發(fā)生,也可能由于看門狗定時(shí)器溢出和安全密鑰違規(guī)等原因而發(fā)生。

不可屏蔽中斷:

這些中斷不能被 CPU 指令屏蔽。一旦啟用了通用中斷,不可屏蔽的中斷就不能從處理中轉(zhuǎn)移。這是由振蕩器故障和手動(dòng)提供給 RST/NMI(在 NMI 模式下)的邊沿等源產(chǎn)生的。

可屏蔽中斷:

當(dāng)中斷發(fā)生時(shí),如果它可以被 CPU 指令屏蔽,那么它就是可屏蔽中斷。它們不必總是外部的。它們還依賴于外圍設(shè)備及其功能。這里使用的外部端口中斷屬于這一類。

向量中斷和非向量中斷:

Vectored:在這種情況下,中斷設(shè)備通過傳遞中斷向量地址為我們提供中斷源。這里ISR 的地址是固定的,控制權(quán)轉(zhuǎn)移到該地址,ISR 負(fù)責(zé)其余的工作。

Non-Vectored: 這里所有的中斷都有共同的 ISR。當(dāng)來自非向量源的中斷發(fā)生時(shí),控制權(quán)被轉(zhuǎn)移到所有非向量中斷共享的公共地址。

MSP430 中的中斷程序控制

當(dāng)中斷發(fā)生時(shí),MCLK 開啟,CPU 從關(guān)閉狀態(tài)回調(diào)。由于在中斷發(fā)生后程序的控制權(quán)被轉(zhuǎn)移到 ISR 地址,程序計(jì)數(shù)器和狀態(tài)寄存器中的值被移入堆棧。

pYYBAGLzaQ6ALFtbAASMPgs7D2w624.png

連續(xù)清除狀態(tài)寄存器,從而清除 GIE 并終止低功耗模式。通過將中斷向量地址放入程序計(jì)數(shù)器來選擇并執(zhí)行具有最高優(yōu)先級(jí)的中斷。在我們了解MSP430 GPIO 中斷示例代碼之前,了解其中涉及的端口寄存器的工作非常重要。

MSP430 上用于 GPIO 控制的端口寄存器:

PxDIR:端口方向控制寄存器。它允許程序員通過寫入 0 或 1 來專門選擇其功能。如果一個(gè)引腳被選擇為 1,則它充當(dāng)輸出。將端口 1 視為 8 位端口,如果將引腳 2 和 3 分配為輸出端口,則必須將 P1DIR 寄存器的值設(shè)置為 0x0C。

PxIN:它是一個(gè)只讀寄存器,可以使用該寄存器讀取端口中的當(dāng)前值。

PxOUT:此特定寄存器可用于將值直接寫入端口。這只有在上拉/下拉寄存器被禁用時(shí)才有可能。

PxREN:它是一個(gè) 8 位寄存器,用于啟用或禁用上拉/下拉寄存器。當(dāng)一個(gè)引腳在 PxREN 和 PxOUT 寄存器中都設(shè)置為 1 時(shí),特定引腳被上拉。

poYBAGLzaQqAa4OwAAATDm3VfkA343.png

PxSEL 和 PxSEL2:由于 MSP430 中的所有引腳都是多路復(fù)用的,因此在使用它之前必須選擇特定的功能。當(dāng)特定引腳的 PxSEL 和 PxSEL2 寄存器都設(shè)置為 0 時(shí),則選擇通用 I/O。當(dāng) PxSEL 設(shè)置為 1 時(shí),選擇主要外圍功能,依此類推。

PxIE:它啟用或禁用端口 x 中特定引腳的中斷。

PxIES:它選擇產(chǎn)生中斷的邊沿。為 0,選擇上升沿,為 1,選擇下降沿。

用于測(cè)試 GPIO 中斷的 MSP430 電路

用于測(cè)試我們的MSP430 中斷示例代碼的 MSP430 電路如下所示。

poYBAGLzaQSAMRSGAAOp3QZFBAc368.png

電路板的接地用于將 LED 和按鈕接地。按鈕的對(duì)角兩側(cè)為常開端子,按下按鈕時(shí)連接。在 LED 之前連接一個(gè)電阻器,以避免 LED 的高電流消耗。通常,使用 100 歐姆 - 220 歐姆范圍內(nèi)的低電阻。

我們使用 3 種不同的代碼來更好地理解端口中斷。前兩個(gè)代碼使用與電路圖 1 中相同的電路。讓我們深入研究代碼。建立連接后,我的設(shè)置如下所示。

poYBAGLzaQCAEptwAAbVqy-MhSI614.png

對(duì) MSP430 進(jìn)行中斷編程

完整的MSP430 中斷程序可以在本頁底部找到,代碼解釋如下。

下面的行使看門狗定時(shí)器停止運(yùn)行??撮T狗定時(shí)器通常執(zhí)行兩個(gè)操作。一種是通過重置控制器來防止控制器無限循環(huán),另一種是使用內(nèi)置計(jì)時(shí)器觸發(fā)周期性事件。當(dāng)微控制器復(fù)位(或上電)時(shí),它處于定時(shí)器模式,并傾向于在 32 毫秒后復(fù)位 MCU。此行阻止控制器執(zhí)行此操作。

WDTCTL = WDTPW + WDTHOLD;

將P1DIR寄存器設(shè)置為值 0x07 將 pin0、pin1 和 pin2 的方向設(shè)置為輸出。將P1OUT設(shè)置為 0x30 可將其配置為在 pin4 和 pin5 上啟用內(nèi)部上拉電阻的輸入。將P1REN設(shè)置為 0x30 會(huì)啟用這些引腳上的內(nèi)部上拉電阻。P1IE使能中斷,其中 P1IES 選擇從高到低的轉(zhuǎn)換作為這些引腳上的中斷沿。

P1DIR |= 0x07;

P1OUT = 0x30;

P1REN |= 0x30;

P1IE |= 0x30;

P1IES |= 0x30;

P1IFG &= ~0x30;

下一行啟用低功耗模式并啟用狀態(tài)寄存器中的GIE,以便可以接收中斷。

__bis_SR_register(LPM4bits+GIE)

程序計(jì)數(shù)器使用宏設(shè)置為端口 1 向量的地址。

PORT1_VECTOR。

#pragma vector=PORT1_VECTOR

__interrupt void Port_1(void)

下面的代碼一個(gè)接一個(gè)地切換連接到 pin0、pin1、pin2 的每個(gè) LED。

if(count%3==0)

{

P1OUT ^= BIT1;

P1IFG &= ~0x30;

計(jì)數(shù)++;

}

else if(count%3==1) { P1OUT ^= BIT1; P1IFG &= ~0x30; 計(jì)數(shù)++; } 其他 { P1OUT ^= BIT2; P1IFG &= ~0x30; 計(jì)數(shù)++; }

電路圖2:

同樣,讓我們??嘗試一個(gè)不同的引腳來更好地理解這個(gè)概念。所以這里的按鈕連接到針腳 2.0 而不是針腳 1.5。修改后的電路如下。該電路再次用于測(cè)試MSP430 按鈕中斷程序。

poYBAGLzaPuAF7cyAAN4yttulzw625.png

這里的端口 2 用于輸入。所以必須使用不同的中斷向量。P1.4和P2.0接受輸入。

由于端口 2 僅用于輸入,P2DIR 設(shè)置為 0。要將端口 2 的 pin0 設(shè)置為輸入并啟用內(nèi)部上拉電阻,寄存器 P2OUT 和 P2REN 必須設(shè)置為 1。要啟用端口 2 的 pin0 上的中斷以及選擇中斷的邊沿,P2IE 和 P2IES 的值設(shè)置為 1。要重置端口 2 中的標(biāo)志,P2IFG 被清除,這樣標(biāo)志可以再次設(shè)置在中斷的發(fā)生。

P2DIR |= 0x00;

P2OUT = 0x01;

P2REN |= 0x01;

P2IE |= 0x01;

P2IES |= 0x01;

P2IFG &= ~0x01;

當(dāng)中斷源來自端口 1 時(shí),連接到端口 1 引腳 1 的 LED 會(huì)發(fā)光。當(dāng)中斷源屬于端口 2 時(shí),連接到端口 1 的 pin2 的 LED 會(huì)發(fā)光。

#pragma vector=PORT1_VECTOR

__interrupt void Port_1(void)

{

P1OUT ^= BIT1;

P1IFG &= ~0x10;

for(i=0;i《20000;i++)

{

}

P1OUT ^= BIT1;

}

#pragma vector=PORT2_VECTOR

__interrupt void Port_2(void)

{

P1OUT ^= BIT2;

P2IFG &= ~0x01;

for(j=0;j《20000;j++)

{

}

P1OUT ^= BIT2;

}

從 CCS 上傳程序到 MSP430

要將項(xiàng)目加載到啟動(dòng)板并對(duì)其進(jìn)行調(diào)試,請(qǐng)選擇項(xiàng)目,然后單擊工具欄中的調(diào)試圖標(biāo)。或者,按 F11 或單擊 RunàDebug 進(jìn)入調(diào)試模式。

pYYBAGLzaPWATIdNAAG0G59nTes406.png

進(jìn)入調(diào)試模式后,按下綠色運(yùn)行按鈕即可在 MCU 中自由運(yùn)行加載的代碼。現(xiàn)在,當(dāng)按下按鈕時(shí),邊沿的變化觸發(fā)中斷,從而提示 LED 狀態(tài)的變化。

poYBAGLzaPKAdx9FAAHcZuSKcgs055.png

MSP430 上的中斷程序

代碼上傳成功后,我們可以通過簡(jiǎn)單的按鈕進(jìn)行測(cè)試。每當(dāng)使用按鈕發(fā)出中斷時(shí),LED 模式將根據(jù)我們的程序發(fā)生變化。

pYYBAGLzaO6AaEYXAAcbJnFqxbI884.png

#項(xiàng)目1:
#include
整數(shù)計(jì)數(shù) = 0;
詮釋主要(無效)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR |= 0x07;
P1OUT = 0x30;
P1REN |= 0x30;
P1IE |= 0x30;
P1IES |= 0x30;
P1IFG &= ~0x30;
__bis_SR_register(LPM4_bits + GIE); // 進(jìn)入帶中斷的 LPM4

}
// 端口 1 中斷服務(wù)程序
#pragma 向量=PORT1_VECTOR
__interrupt 無效端口_1(無效)
{
如果(計(jì)數(shù)%3==0)
{
P1OUT ^= BIT1;
P1IFG &= ~0x30;
計(jì)數(shù)++;
}
否則 if(count%3==1)
{
P1OUT ^= BIT1;
P1IFG &= ~0x30;
計(jì)數(shù)++;
}
別的
{
P1OUT ^= BIT2;
P1IFG &= ~0x30;
計(jì)數(shù)++;
}
}

#項(xiàng)目2:
#include
整數(shù) i, j;
詮釋主要(無效)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR |= 0x06;
P1OUT = 0x10;
P1REN |= 0x10;
P1IE |= 0x10;
P1IES |= 0x10;
P1IFG &= ~0x10;
P2DIR |= 0x00;
P2OUT = 0x01;
P2REN |= 0x01;
P2IE |= 0x01;
P2IES |= 0x01;
P2IFG &= ~0x01;
__bis_SR_register(LPM4_bits + GIE); // 進(jìn)入帶中斷的 LPM4
}
// 端口 1 中斷服務(wù)程序
#pragma 向量=PORT1_VECTOR
__interrupt 無效端口_1(無效)
{
P1OUT ^= BIT1;
P1IFG &= ~0x10;
for(i=0;i<20000;i++)
{
}
P1OUT ^= BIT1;
}
#pragma 向量=PORT2_VECTOR
__interrupt 無效端口_2(無效)
{
P1OUT ^= BIT2;
P2IFG &= ~0x01;
對(duì)于(j=0;j<20000;j++)
{
}
P1OUT ^= BIT2;
}

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

    關(guān)注

    240

    文章

    22991

    瀏覽量

    654658
  • msp430
    +關(guān)注

    關(guān)注

    180

    文章

    2381

    瀏覽量

    229118
  • 外部中斷
    +關(guān)注

    關(guān)注

    1

    文章

    131

    瀏覽量

    15757
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    msp430單片機(jī)是不是都有io外部中斷有效MSP430G2001單片機(jī)具有外部中斷

    各位前輩好,我是用的MSP430G2001單片機(jī),英文資料看不明白,想知道IO具有外部中斷不?是不是所有的MSP430單片機(jī)都具有外部中段?
    發(fā)表于 02-14 16:11

    msp430中斷

    msp430 調(diào)試IO中斷時(shí),P1.0到P1.3設(shè)置輸出控制led屏,然后設(shè)置P1.4到P1.7為外部中斷。但開
    發(fā)表于 07-18 00:05

    MSP430外部中斷響應(yīng)時(shí)間是多少?

    MSP430外部中斷響應(yīng)時(shí)間是多少
    發(fā)表于 10-30 08:02

    MSP430單片機(jī)中斷系統(tǒng)

    中斷MSP430單片機(jī)的一大特點(diǎn),有效地利用中斷可以簡(jiǎn)化程序并提高執(zhí)行效率。在MSP430單片機(jī)中,幾乎每個(gè)片上外設(shè)都能夠產(chǎn)生中斷,為
    發(fā)表于 07-15 15:27 ?0次下載

    MSP430單片機(jī)的定時(shí)器

    實(shí)現(xiàn)MSP430單片機(jī)的定時(shí)器中斷,并在中斷中使LED閃爍
    發(fā)表于 03-15 16:10 ?5次下載

    MSP430中斷

    MSP430中斷分為3種: 1.系統(tǒng)復(fù)位、 2.非屏蔽中斷、 3.可屏蔽中斷。 系統(tǒng)復(fù)位指向中斷向量表的最高地址0xFFFE。 非屏蔽
    發(fā)表于 03-26 09:51 ?1次下載

    MSP430單片機(jī)實(shí)踐篇之MSP430單片機(jī)ADC模數(shù)轉(zhuǎn)換操作

    MSP430單片機(jī)中斷編程;ADC(模數(shù)轉(zhuǎn)換)的實(shí)現(xiàn);MSP430單片機(jī)低功耗控制(休眠)。
    發(fā)表于 04-28 10:46 ?43次下載
    <b class='flag-5'>MSP430</b>單片機(jī)實(shí)踐篇之<b class='flag-5'>MSP430</b>單片機(jī)ADC模數(shù)轉(zhuǎn)換操作

    MSP430單片機(jī)ADC模數(shù)轉(zhuǎn)換操作

    學(xué)習(xí)要點(diǎn):MSP430單片機(jī)中斷編程;ADC(模數(shù)轉(zhuǎn)換)的實(shí)現(xiàn);MSP430單片機(jī)低功耗控制(休眠)。
    發(fā)表于 05-08 08:43 ?45次下載
    <b class='flag-5'>MSP430</b>單片機(jī)ADC模數(shù)轉(zhuǎn)換操作

    MSP430有哪些可屏蔽中斷_MSP430中斷的優(yōu)先級(jí)

    MSP430有哪些可屏蔽中斷,中斷很大程度上體現(xiàn)了一款單片機(jī)的性能,從這一點(diǎn)將MSP430中斷方面做得很不錯(cuò),主要是提供了非常豐富的
    發(fā)表于 05-29 15:41 ?2880次閱讀

    MSP430中斷分為哪3種?MSP430中斷優(yōu)先級(jí)順序是什么樣的?

    MSP430中斷分為3種:系統(tǒng)復(fù)位、不可屏蔽中斷、可屏蔽中斷
    的頭像 發(fā)表于 07-16 17:10 ?1.9w次閱讀
    <b class='flag-5'>MSP430</b>的<b class='flag-5'>中斷</b>分為哪3種?<b class='flag-5'>MSP430</b>的<b class='flag-5'>中斷</b>優(yōu)先級(jí)順序是什么樣的?

    MSP430單片機(jī)】中斷

    MSP430單片機(jī)】中斷
    發(fā)表于 11-19 15:51 ?12次下載
    【<b class='flag-5'>MSP430</b>單片機(jī)】<b class='flag-5'>中斷</b>篇

    MSP430學(xué)習(xí)筆記-低功耗與中斷系統(tǒng)

    年前忙于項(xiàng)目都有段時(shí)間沒更新博客了,趁年后有點(diǎn)時(shí)間更新了一篇,在這篇學(xué)習(xí)筆記里我們探討一下MSP430系列單片機(jī)的低功耗模式與中斷系統(tǒng),從下一篇開始,將會(huì)開始更新MSP430外設(shè)部分
    發(fā)表于 11-19 18:36 ?9次下載
    <b class='flag-5'>MSP430</b>學(xué)習(xí)筆記-低功耗與<b class='flag-5'>中斷</b>系統(tǒng)

    msp430中斷優(yōu)先級(jí)和中斷嵌套(及容易理解錯(cuò)誤的說明)

    msp430中斷優(yōu)先級(jí)和中斷嵌套 MSP430中斷優(yōu)先級(jí)按所在的向量的大小排列,中斷
    發(fā)表于 11-19 19:06 ?11次下載
    <b class='flag-5'>msp430</b>的<b class='flag-5'>中斷</b>優(yōu)先級(jí)和<b class='flag-5'>中斷</b>嵌套(及容易理解錯(cuò)誤的說明)

    MSP430中斷MSP430的IO口中斷/中斷特性

    MSP430學(xué)習(xí)筆記之七:IO口中斷 MSP430中斷嵌套機(jī)制 (1) 430默認(rèn)的是關(guān)閉
    發(fā)表于 12-16 16:56 ?9次下載
    【<b class='flag-5'>MSP430</b><b class='flag-5'>中斷</b>】<b class='flag-5'>MSP430</b>的IO口<b class='flag-5'>中斷</b>/<b class='flag-5'>中斷</b>特性

    MSP430單片機(jī)中斷系統(tǒng)課件ppt

    中斷MSP430單片機(jī)的一大特點(diǎn),有效地利用中斷可以簡(jiǎn)化程序并提高執(zhí)行效率。在MSP430單片機(jī)中,幾乎每個(gè)片上外設(shè)都能夠產(chǎn)生中斷,為
    發(fā)表于 08-01 15:13 ?8次下載