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

 

 

 

 

本人愚昧,上边如果有错误,还希望各位指正。

 

posted @ 2020-09-02 21:19  采风远行  阅读(932)  评论(0编辑  收藏  举报