This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430FR5994 Time_A中断

Expert 2115 points
Other Parts Discussed in Thread: MSP430FR5994

MSP430FR5994  有两个中断使能位,分别是TAxCTL Register的TAIE和TAxCCTLn Register的CCIE ,这两个有什么区别?需不需要手动清理中断标志位?

MSP430FR5994   开发套件的实例程序OutOfBox_MSP430FR5994中:

param.clockSource = TIMER_A_CLOCKSOURCE_ACLK;
param.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_1;
param.timerPeriod = 13;
param.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;
param.captureCompareInterruptEnable_CCR0_CCIE = TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE;
param.timerClear = TIMER_A_DO_CLEAR;
param.startTimer = true;

ACLK为8M,定时时间是多少?怎么计算的?

  • 你好

         因为Timer_A包含两个中断向量所以有两个中断使能位。TAIE是标识溢出中断即定时器溢出后产生中断,CCIE为比较中断即定时器达到比较值出现的中断。不需要手动清零。关于定时时间就是你的Timer 时钟源频率除以分频系数,然后取倒数*周期数就是烦中断周期时间。可以在中断服务函数 中反转IO口用示波器验证一下结果。

  • 溢出中断是指计数达到 0FFFFh时产生的中断吗?CCRO寄存器的值为13,ACLK为8M,分频系数为1,那么周期应该为13/8  us才对吧?CCIE中断是不是计数值达到CCRO值时产生

  • 你好:

          这要看你的定时器设置的模式,溢出的意思是计数器计数值回零,如果是Up mode 技术到达TAXCCR0就会溢出,如果是continuous mode 则是计数到FFFFh溢出,如果是Up/down mode 则是计数值从1变到0时算是溢出。

  • 定时器工作在UP mode时,TAIE中断和CCIE中断有区别吗,不都是计数到CCRO时产生中断吗?

  • 你好

          不一样,溢出中断是计数到CCR0产生中断,而比较中断是计数值计到CCRx就产生中断x取1,2.。。

  • 比较中断是计数值计到CCRx就产生中断x取1,2? 

    从官网上下的实例到吗不是这样啊,设为UP mode,使能CCIE,禁止TAIE, CCR0写入13 ,这怎么理解?

    这是溢出中断还是比较中断?

  • 你好:

    不好意思,更正一下之前的描述。

       1. 因为Timer_A包含两个中断向量所以有两个中断使能位。TAIE是标识溢出中断和除CCR0的CCIFG即定时器溢出后产生中断和非CCR0的比较中断,CCIE为比较中断即定时器达到比较值出现的中断。

    2.定时器工作在UP mode时,TAIE中断和CCIE中断有区别吗,不都是计数到CCRO时产生中断吗?

           这个问题的答案是这样的CCR0的中断会在溢出中断前一个时钟发生如下图所示

          

  •  谢谢,那定时时间如何计算的,我的计算结果还是和理论值不一样?

  • 你配置的timer时钟源是选择的ACLK是吧,先用Pj.2把ACLK 时钟用示波器看下是不是8M,我感觉应该是你的时钟源没配置好。

  • 程序都是下载的实例程序,这是分配部分:

    CS_setDCOFreq(CS_DCORSEL_0, CS_DCOFSEL_6);// Set DCO frequency to 8 MHz

    CS_setExternalClockSource(32768, 0);//Set external clock frequency to 32.768 KHz
    CS_initClockSignal(CS_ACLK, CS_LFXTCLK_SELECT, CS_CLOCK_DIVIDER_1);//Set ACLK=LFXT
    CS_initClockSignal(CS_SMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1);//Set SMCLK = DCO with frequency divider of 1
    CS_initClockSignal(CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1);// Set MCLK = DCO with frequency divider of 1
    CS_turnOnLFXT(CS_LFXT_DRIVE_3);//Start XT1 with no time out

    ACLK没引出,不好观察,但是SMCLK通过P3.4引出,用示波器观察确实为8M,所以时钟源应该没问题

  • 但是SMCLK的时钟源你配置的是CS_DCOCLK_SELECT(因为DCO为8MHz,所以SMCLK为8MHz), 而ACLK配置的是CS_LFXTCLK(这个是低频振荡器最高也就50KHz,一般都是32KHz),你用ACLK为32K计算一下,看跟实际的输出是不是一至.如果一不一致请把你的全部代码发上来可以吗,我可以帮你测一下,还有你的计算过程

  • 见附件,这是网上下载的示例函数,配置部分在main.c和SDCardLogMode.c两个文件

    OutOfBox_MSP430FR5994.rar
  • 之前可能记错了,ACLK应该是32.768KHz,但按这个计算也不对啊