在這一部分中我們將會初步了解到中斷的概念及其作用, 我們會嘗試使用計時器中斷和 I/O 中斷操作 LED 燈,讓我們開始吧!
什么是中斷?我們可以將它理解為一個約定的信號,來告知單片 機特定的事件發(fā)生了,引起程序從正常運行的主函數(shù)中斷開,轉(zhuǎn)而 執(zhí)行中斷處理程序,處理特定的事件。
中斷是一個非常重要的概念,它可以讓處理器免于執(zhí)行冗余的輪 詢操作等待特定的外部事件的發(fā)生。在 MSP430 的架構(gòu)中,有許 多種類的中斷:計時器中斷,I/O 中斷,ADC 中斷等等。每一種中 斷在使用前都要使能和配置,每一種中斷又分別有中斷處理程序 (Service Routine)。
下面就讓我們嘗試寫一個小程序,實現(xiàn)使用計時器中斷和 I/O 中 斷操作 LED 燈。
?#include "msp430g2553.h" void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
按照慣例,首先包含 g2553 的頭文件,關(guān)閉看門狗。每次寫程序的時候你總會用到它們。
CCTL0 = CCIE; // CCR0 interrupt enabled
TACTL = TASSEL_2 + MC_1 + ID_3; // SMCLK/8, upmode
TACCR0 = 10000; // 12.5 Hz
這幾行簡單配置了計時器中斷。
CCTL0 = CCIE; // CCR0 interrupt enabled
我們首先通過置 CCTL0(Timer_A capture/compare control 0)寄存器的 CCIE 位(Capture/compare interrupt enable)使能了計時器中斷。
TACTL = TASSEL_2 + MC_1 + ID_3; // SMCLK/8, up mode
然后我們通過 TACTL(Timer_A control)寄存器配置了計時器的時鐘。如果查閱一下 MSP430 的手冊,你會看到之后幾位分別表示什么含義:
TASSEL_2 選擇了 SMCLK 時鐘(由內(nèi)部 DCO 支持,默認頻 率大約為 1MHz);
MC_1 選擇了上升模式(up mode),即計時器計數(shù)的時候由小 至大,計數(shù)上限由 TACCR0(Timer_A capture/compare 0)寄存器決定。
由此就有
TACCR0 = 10000; // 12.5 Hz
你一定猜到了配置的結(jié)果 12.5Hz 是怎么得來的了吧, 1M/8/10000=12.5Hz,這就是產(chǎn)生計時器中斷的頻率。
通過選擇不同的時鐘源,不同的時鐘分頻,不同的計數(shù)上限,你幾乎可以配置出任何你想要的頻率,需要注意的是,MSP430的寄存器都是16 位的,所以 TACCR0 的上限是 65535。
我們繼續(xù)完善我們的程序。
P1OUT &= 0x00; // Shut down everything P1DIR &= 0x00;
P1DIR |= BIT0 + BIT6; // P1.0 and P1.6 pins output
P1REN |= BIT3; // Enable internal pull-up/down resistors
P1OUT |= BIT3; // Select pull-up mode for P1.3
這幾行代碼我們應(yīng)該已經(jīng)熟悉了。我們首先清空了 PORT1 的輸 出寄存器和方向寄存器,然后配置板上兩個 LED 所對應(yīng)引腳為輸出, 為按鍵對應(yīng)的引腳配置上拉電阻。
P1IE |= BIT3; // P1.3 interrupt enabled
P1IES |= BIT3; // P1.3 Falling edge
P1IFG &= ~BIT3; // P1.3 IFG cleared
這幾行代碼中,我們首先使能了 P1.3 引腳的中斷功能,然后我 們選擇了下降沿觸發(fā)中斷(高電平到低電平觸發(fā)),Launchpad 上的按鍵在不按下的時候連接著 VCC,而按下的時候連接的是 GND,因此我們選擇下降沿觸發(fā)。最后,我們要清除相應(yīng)的中斷標(biāo) 志位。中斷標(biāo)志位通知單片機一個中斷的產(chǎn)生,因此在每次中斷處 理程序結(jié)束后,如果我們希望下次產(chǎn)生事件的時候依然有中斷,我 們應(yīng)當(dāng)清除中斷標(biāo)志位。
_EINT(); // Enable all interrupts
while(1) // Loop forever, we work with interrupts!
{}
打開所有中斷,輕松加愉快。接下來就是中斷的事兒了。
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR __interrupt void Timer_A0 (void) {
P1OUT ^= BIT0; // Toggle P1.0
}
這是 TimerA 的中斷處理程序。每當(dāng)計數(shù)器溢出的時候,中斷觸 發(fā),程序便會執(zhí)行這段代碼,翻轉(zhuǎn) P1.0 的輸出,對應(yīng)地,LED1 會 出現(xiàn)閃爍的效果。每次翻轉(zhuǎn)之后,程序便會回到觸發(fā)中斷的地方, 在本例中,回到 While(1)。
// Port 1 interrupt service routine
?#pragma vector=PORT1_VECTOR __interrupt void Port_1(void) {
P1OUT ^= BIT6; // Toggle P1.6
P1IFG &= ~BIT3; // P1.3 IFG cleared
}
這是PORT1的中斷處理程序,每當(dāng)我們按下P1.3對應(yīng)的按鍵時,中斷觸發(fā),程序便會執(zhí)行這段代碼,效果如同在前一節(jié)中演示的一樣。
燒代碼看效果吧!
以下是這一節(jié)的完整代碼:
#include "msp430g2553.h"
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
CCTL0 = CCIE; // CCR0 interrupt enabled
TACTL = TASSEL_2 + MC_1 + ID_3; // SMCLK/8, upmode
TACCR0 = 10000; // 12.5 Hz
P1OUT &= 0x00; // Shut down everything
P1DIR &= 0x00;
P1DIR |= BIT0 + BIT6; // P1.0 and P1.6 pins output
P1REN |= BIT3; // Enable internal pull-up/down resistors
P1OUT |= BIT3; // Select pull-up mode for P1.3
P1IE |= BIT3; // P1.3 interrupt enabled
P1IES |= BIT3; // P1.3 Falling edge
P1IFG &= ~BIT3; // P1.3 IFG cleared
_EINT(); // Enable all interrupts
while(1) // Loop forever, we work with interrupts!
{}
}
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR __interrupt void Timer_A0 (void) {
P1OUT ^= BIT0; // Toggle P1.0
}
// Port 1 interrupt service routine
?#pragma vector=PORT1_VECTOR __interrupt void Port_1(void) {
P1OUT ^= BIT6; // Toggle P1.6
P1IFG &= ~BIT3; // P1.3 IFG cleared
}
上一篇:lcd12864驅(qū)動程序 用于MSP430
下一篇: [MSP430] 3.UART
推薦閱讀
史海拾趣
隨著可穿戴設(shè)備的興起,Cramer公司迅速捕捉到了市場機遇。他們推出了一款智能手表,該手表不僅具備基本的時間顯示功能,還集成了健康監(jiān)測、運動追蹤等多項實用功能。為了提升產(chǎn)品的競爭力,Cramer公司與多家科技公司合作,共同研發(fā)新技術(shù)。這款智能手表在市場上獲得了廣泛認可,進一步提升了Cramer公司的品牌知名度和市場份額。
背景:雖然此處的FRONTIER可能指的是邊疆通信公司(Frontier Communications),但為符合電子行業(yè)背景,我們假設(shè)其在農(nóng)村寬帶服務(wù)方面的創(chuàng)新。
發(fā)展故事:在21世紀(jì)初期,F(xiàn)RONTIER Communications認識到農(nóng)村地區(qū)對于寬帶服務(wù)的迫切需求,于是開始大規(guī)模投資農(nóng)村寬帶基礎(chǔ)設(shè)施建設(shè)。通過引入先進的通信技術(shù)和設(shè)備,F(xiàn)RONTIER Communications成功地將高速互聯(lián)網(wǎng)帶到了偏遠地區(qū),極大地改善了當(dāng)?shù)鼐用竦纳詈凸ぷ鳁l件。這一舉措不僅贏得了市場的廣泛贊譽,也為公司帶來了穩(wěn)定的收入來源和持續(xù)增長的動力。
為了提供更好的物流服務(wù),eBay推出了國際運送計劃(eBay International Shipping)。該計劃允許賣家將來自同一訂單的多件物品合并在一個包裹中運送,從而減少了買家支付的運費。這一舉措不僅提高了物流效率,也增加了買家的購買意愿。eBay還與其他物流公司合作,提供更快捷、更可靠的配送服務(wù)。
為了進一步提升綜合競爭力,銓力公司開始著手深化產(chǎn)業(yè)鏈整合。通過收購、合作等方式,公司逐漸掌握了從原材料供應(yīng)、產(chǎn)品生產(chǎn)到銷售終端的完整產(chǎn)業(yè)鏈。這一舉措不僅降低了生產(chǎn)成本,提高了生產(chǎn)效率,還為公司帶來了更多的利潤增長點。
為了進一步提升公司的競爭力和市場地位,富芯森美積極尋求資本市場的支持。通過上市融資等方式,公司獲得了充足的資金支持,為技術(shù)研發(fā)、市場拓展和產(chǎn)能擴張?zhí)峁┝擞辛ΡU?。同時,資本市場的關(guān)注也進一步提升了富芯森美的品牌價值和市場影響力。在資本市場的助力下,富芯森美實現(xiàn)了快速發(fā)展,成為了電子行業(yè)中一顆璀璨的明星。
目前有個項目,需要請一位工程師(業(yè)余兼職即可)。 1、熟悉TI 達芬奇系列DSP芯片,有DM64xx上開發(fā),優(yōu)化經(jīng)驗。 2、熟悉H264協(xié)議或者MPEG4協(xié)議,最好在DM64XX上做過相關(guān)協(xié)議的開發(fā)或者優(yōu)化工作。 詳細可以QQ455247859聯(lián)系。 … 查看全部問答∨ |
|
關(guān)于simulink利用rtw工具箱轉(zhuǎn)化成C代碼的一些問題 小弟是DSP初學(xué)者,想把simulink的框圖轉(zhuǎn)化成c代碼,在DSP上跑.我在rtw工具箱的設(shè)置是: Solver: stop time 選inf &nb ...… 查看全部問答∨ |
|
例如我要傳送一張圖片 大小為100KB,而我的端點最大包長度為1KB,那么我就要傳100次是嗎,對數(shù)據(jù)的分割時應(yīng)用層來做還是驅(qū)動層自動做的,我大概看了驅(qū)動的代碼好像沒有數(shù)據(jù)分割這么一說,見笑?!? 查看全部問答∨ |
SPI總線通信里面,是不是一個設(shè)備為主設(shè)備就永遠只能做主設(shè)備,做從設(shè)備的設(shè)備永遠只能做從設(shè)備?主從設(shè)備能不能按要求動態(tài)切換? //================ 就是某一刻通信::A(主)-----》B(從) 隨后的某一刻通信::B(主)-----》A(從) ...… 查看全部問答∨ |
沒有接觸過不間斷電源,有幾個問題像大家請教,忘不惜告知,先謝了! 有裝飾用的LED燈,總功率根據(jù)項目不同一般在25W~50W之間,12Vdc。之前一直采用開關(guān)電源(輸入220,輸出12vdc)直接供電,停電后則滅。 現(xiàn)客戶提出新要求: 要求正常時,LED燈 ...… 查看全部問答∨ |
usbdemo代碼在flash可以運行,無法在ram里面運行?(問題已經(jīng)解決) IAR EWARM 4.41 & JLink & STR912FW44 & Windows 2003我把中斷向量表復(fù)制到ram的最高端, 一共64bytes.在flash里面, 中斷都沒有問題. 但是在ram里面不正常.我測試了0x04000000&nb ...… 查看全部問答∨ |
小弟最近剛開始學(xué)習(xí)單片機,最近要用單片機來控制MOS管的開斷,僅僅是開斷就可以了,我想用單片機直接控制門級可以嗎?必須要加驅(qū)動電路嗎?… 查看全部問答∨ |
關(guān)于tiny210開發(fā)板中su: must be suid to work properly的問題 嵌入式文件系統(tǒng)一般用戶執(zhí)行su root切換根用戶提示錯誤:su: must be suid to work properly解決方法:修改busybox權(quán)限,chmod 4755 busybox … 查看全部問答∨ |
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- STM32高級開發(fā)(11)-使用GDB調(diào)試你的工程
- STM32F4標(biāo)準(zhǔn)外設(shè)庫模板工程建立與使用
- 基于STM32的外設(shè)的GPIO外設(shè)設(shè)置總結(jié)
- 在STM32中配置片內(nèi)外設(shè)使用I/O端口
- STM32為什么必須先配置時鐘
- 傳臺積電和三星3nm開發(fā)遇阻,恐推遲量產(chǎn)時間
- 華為下一代旗艦芯片麒麟9010將采用3nm工藝
- 全球多家一線手機大廠扎堆布局,關(guān)鍵芯片自主化成為潮流
- EMS行業(yè)爆發(fā),華智機器乘勝追擊后毛利率下滑
- IC封測廠商藍箭電子科創(chuàng)板IPO成功過會了
- Pctolcd2002怎么顯示在msp上啊
- 模塊撥號上網(wǎng),要先設(shè)定模塊嗎?
- 請教能否通過串口控制另一個ATX電源的開關(guān)
- 能否提供虛擬串口例程驅(qū)動的的dll文件與操作的.h文件
- 電源
- WINCE60下基于DirectShow技術(shù)怎么寫Camera相機的應(yīng)用程序?就像在PC上通過DirectShow技術(shù)做的攝像頭的應(yīng)用程序一樣可以瀏覽,可以拍照
- 今天上午10:00開啟 艾睿電子有獎直播:英特爾?FPGA深度學(xué)習(xí)加速技術(shù)
- xilinx 的開發(fā)軟件有哪些
- 原理圖——這個電路是如何實現(xiàn)開關(guān)自鎖功能的?
- 電組匹配表