社区导航

 

搜索
查看: 70|回复: 0

[资料分享] MSP430F149的TIMERA定时中断理解

[复制链接]

4348

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2020-5-13 21:49 | 显示全部楼层 |阅读模式

代码如下:

//本平台 msp430f149
#include <io430.h>
#include <in430.h>
 
volatile unsigned char count = 0,flag = 0;
void select_xt2(void){
    
    unsigned char i;
    
    /*------选择系统主时钟为8MHz-------*/
    BCSCTL1 &= ~XT2OFF;                     
    do{    
    IFG1 &= ~OFIFG;                     //清除晶振失败标志
        for (i = 0xFF; i > 0; i--);     //等待8MHz晶体起振
    }while ((IFG1 & OFIFG));                 
    
    BCSCTL2 |= SELM_2 + SELS  ;        //MCLK和SMCLK选择高频晶振    
 
}
 
 
void main(){
    WDTCTL = WDTPW + WDTHOLD;    // 关狗
    select_xt2();        //8MHz晶振    
    P2DIR = 0xFF;
    P2OUT = 0x00;
    
    CCTL0 = 0X0010;          // CCR0 中断使能,或写为 CCTL0 = CCIE;
     CCR0 = 10000;
      TACTL = 0X02E0;        // SMCLK = 1MHz, 连续计数模式
     _EINT();           // 开启全局中断
    
    while(1){
        if(count == 50){
            count = 0;
            P2OUT  = ~P2OUT ;
            
        }
        
    }
 
}
 
// Timer A0 中断服务函数
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  count ++;
  CCR0 += 10000;            // 下次中断时间装入CCR0中
}
我是比较 喜欢直接配置寄存器而不是使用库函数进行与或,所以在设置TACTL时

根据需要:1.使用8分频将8MHz变为1MHz

2.使用SMCLK子系统时钟,在设置xtal2中SMCLK和MCLK一样是外部晶振8MHZ

3.使用连续计数模式,此模式要手动重装

其余位均为0

所以TACTL控制字为:

0000,0010,1110,0000

02E0

CCTL0寄存器配置:、

因为我们是使用比较模式,开启中断,所以只有CCIEx位为1,其余全为0

控制字为:0X0010。此时也可以直接写出CCTL0 = CCIE0;不过我还是喜欢配置寄存器来写

CCR0中装入计数初值10000,当计数到10000,count加一,重装CCR0。当count等于50时,count=0


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/7 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

词云| Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-7-12 00:37 , Processed in 0.078254 second(s), 22 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表