MSP430-LED中斷閃爍代碼詳解


使用MSP430F149的開發板,首先對LED閃爍燈的例程進行講解,然后下邊是自己寫的,將部分代碼寫入了新建的led.c程序中

 

#include  <msp430x14x.h>      // 這是程序都要包含的頭文件,里邊包含的很多寄存器和接口函數

void main(void)
{ 
/*下面六行程序關閉所有的IO口*/
P1DIR = 0XFF;P1OUT = 0XFF;   //  P1DIR是P1端口的方向寄存器,DIR:direction register  當他為0的時候表示輸入模式
P2DIR = 0XFF;P2OUT = 0XFF;   //  0xff表示二進制的1111 1111,正好對應八個I/O口
P3DIR = 0XFF;P3OUT = 0XFF;   //  P1OUT是輸出寄存器,OUT:output register  當他為0的時候表示輸出低電平,1的時候為輸出高電平    
P4DIR = 0XFF;P4OUT = 0XFF;
P5DIR = 0XFF;P5OUT = 0XFF;
P6DIR = 0XFF;P6OUT = 0XFF;  //  以上是對板子的初始化,沒有具體功能,在32中我們沒有都進行配置是因為32最開始就是默認輸出高電平

WDTCTL = WDTPW + WDTHOLD; //關閉看門狗  // MSP430板子是默認開啟看門狗的,那為什么要關掉它呢?

                       // 因為開啟看門狗后,你要不定時的喂狗(計數清零),如果不喂狗,程序就會間隔着復位。
                        // WDTCTL是看門狗定時器寄存器,watch dog timer control register 

                       // WDTHOLD 是看門狗停止位,當為0的時候是激活的,為1的時候是關閉的

                                                                             // WDTHOLD在頭文件中是0x0080,低八位是1000 0000,所以就關閉了看門狗
P6DIR |= BIT2;P6OUT |= BIT2; //關閉電平轉換


CCTL0 = CCIE; //使能CCR0中斷  // CCTL0是比較/捕獲寄存器的控制器(capture control register),當是0禁止中斷,1開啟中斷,
CCR0 = 2047; //設定周期0.5S      // 這個是設置中斷時長的,因為下邊這個語句用的ACLK(輔助時鍾且經過了八分頻)

                                                     // 本來是32768HZ,經過八分頻,就是4096HZ

                                                     // 4096HZ的意思就是計數器每加1所需要的時間就是1/4096秒,如果CCR0等於4096,那么就是1s產生一個中斷


TACTL = TASSEL_1 + ID_3 + MC_1;  // 定時器A的時鍾源選擇ACLK,增計數模式   

                                                            // TACTL指的是timer a這個計數器寄存器的控制器,timer A control register 然后有多種模式可以選擇。

                                                            // TASSEL:timer A source select   時鍾源的選擇,這里選擇的是ACLK(輔助時鍾源:Auxillary Cloclk)

                                                            // ID: input divider  分頻器,,可以是1,2,4,8分頻,這里選擇的八分頻

                                                            // MC:mode control  模式選擇,這里選擇的模式是從0開始計數,計到CCR0就會產生一次中斷,然后繼續從零開始


P2DIR = 0xff; //設置P2口方向為輸出
P2OUT = 0xff;

_EINT(); //使能全局中斷     // EINT :  enable  interrupt   使能中斷,與他對應的是_DINT: disable interrupt
LPM3; //CPU進入LPM3模式    // LPM: low power mode 進入低功耗模式,現在只有ACLK時鍾可以用
}

/*******************************************
函數名稱:Timer_A 
功 能:定時器A的中斷服務函數
參 數:無
返回值 :無
********************************************/
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A (void)
{ 
P2OUT ^= 0xff; //P2口輸出取反     // ^表示異或,這里0 xor 1=1; 1 xor 1=0;可以起到取反。
}

 

 

 

 

****************下邊是我自己寫的,其實都差不多,不過我喜歡32那種,把初始化都獨立起來******************

main函數 

 

#include <MSP430x14x.h>
#include "led.h"

void main( void )
{
LED_Init();
CCTL0=CCIE;//turn on the interrupt 
CCR0=4096;// 1s 
TACTL=TASSEL_1+ID_3+MC_1;//TASSEL: timer A source select 
//ID: input divider
//MC: mode control
_EINT();
LPM3;
}

/**@brief timer A CCR0 interrupt
*@param no
*@retval no
*/
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A_CCR0 (void)
{
P2OUT ^= 0xff; //XOR
}

 

 

 

 

led.c

 

#include "led.h"
#include <MSP430x14x.h>

void LED_Init()
{
//make fority eight general-purpose i/o output high level
P1DIR=0xff; P1OUT=0xff;//DIR:direction register -- 0:input mode --1:output mode
P2DIR=0xff; P2OUT=0xff;//OUT:low or high output level --0:low --1:high
P3DIR=0xff; P3OUT=0xff;//eight bits represent eight pin
P4DIR=0xff; P4OUT=0xff;
P5DIR=0xff; P5OUT=0xff;
P6DIR=0xff; P6OUT=0xff;

// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;//WDTCTL:watch dog timer register --16 bits
//the 8th bit: --0: proper function --1:stop work

P6DIR |= BIT2;P6OUT |= BIT2;
} 

 

led.h

 

#ifndef _LED_H

#define _LED_H

void LED_Init(void);

#endif

 

 

 

 

本人愚昧,上邊如果有錯誤,還希望各位指正。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM