• 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

     

     

     

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

     

  • 相关阅读:
    python学习:字符编码与转码
    python学习:文件操作
    python学习:基本运算符
    python学习:列表、元组、字典、集合
    python学习:基础知识
    linux常用命令
    hadoop手动安全模式
    System.getProperty("user.dir")的理解
    如何获取SpringBoot项目的applicationContext对象
    spring无法注入bean
  • 原文地址:https://www.cnblogs.com/CaiFengYuanXing/p/13604430.html
Copyright © 2020-2023  润新知