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.

[参考译文] CCS/MSP-EXP430FR5969:MSP-EXP430FR5969 puls 计数器问题

Guru**** 2041660 points
Other Parts Discussed in Thread: MSP-EXP430FR5969
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/891240/ccs-msp-exp430fr5969-msp-exp430fr5969-puls-counter-problem

器件型号:MSP-EXP430FR5969

工具/软件:Code Composer Studio

我 正在尝试使用 MSP-EXP430FR5969对 开关 P1.1上来自外部源的脉冲进行计数。   我配置计时器 TA0来捕获脉冲并启用 全局中断。
 TIMER0_A3中断矢量服务例程、用于 对脉冲进行计数。 我设置断点、以便在中断例程行进行调试

 代码跳转至中断服务(按下开关时触发 P1.1)、然后在不按下开关的情况下继续触发!!!
 StoredCount 在增加!

   如果 您 能 解决我的问题、我将不胜感激


#include "driverlib.h"


void initGPIO (void);
void initClocks (void);


#define NUMBER_TIMER_CAPTURES 20

volatile unsigned int StoredCount = 0;


int main (void){



WDT_A_HOLD (WDT_A_base);

initClocks();

initGPIO();



// TA0CCTL2,TA0的捕捉/比较控制寄存器0
TA0CCTL2 |= CCIE;//中断使能
TA0CCTL2 |= CCIS_0;// CCI0A 的捕捉//捕捉输入 CCIxA 被连接到由 CCIS 位选择的外部引脚。
TA0CCTL2 |= CM_2;//在下降沿进行捕捉
TA0CCTL2 |= CAP;//捕捉模式

//Timer_A0控制寄存器
TA0CTL |= tassel_2;//来自 SMCLK 的源计时器 A1
// TA0CTL |= MC1;///启动计时器
TA0CTL |=TACLR;
//TA0CTL |=TAIE;




_BIS_SR (GIE);
_NO_OPERATION ();
// while (1)
// {
//}

}


void initClocks(void){

/*时钟系统设置、MCLK = SMCLK = DCO (1MHz)、ACLK = VLOCLK */
CSCTL0_H = CSKEY >> 8;
CSCTL1 = DCOFSEL_0;
CSCTL2 = SELA_VLOCLK | SELESS__DCOCLK | SELM_DCOCLK;
CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;
CSCTL0_H = 0;
}




void initGPIO (void)
{
/*将 GPIO 配置为默认状态*/
P1OUT = 0;P1DIR = 0xFF;
P2OUT = 0;P2DIR = 0xFF;
P3OUT = 0;P3DIR = 0xFF;
P4OUT = 0;P4DIR = 0xFF;
PJOUT = 0;PJDIR = 0xFFFF;


GPIO_setAsOutputPin (GPIO_PORT_P4、GPIO_PIN6);//将 P4.6设置为输出方向
GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);//将 P1.0设置为输出方向



GPIO_setAsInputPinWithPullupResistor (GPIO_PORT_P1、GPIO_PIN1);//上拉 P1.1 // P1DIR &=~BIT4;P1SEL1 &=~BIT4;P1SEL0 || BIT4;
GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、GPIO_PIN1、GPIO_secondary 模块_function);//P1.1用作输入捕捉设置引脚1.1/TA0.CCI2A


//设置引脚1.1/TA0.CCI2A
// P1DIR &=~BIT1;
// P1SEL1 &=~BIT1;
// P1SEL0 |= BIT1;



/*禁用 GPIO 上电默认高阻抗模式。 //
// PM5CTL0 &=~LOCKLPM5;LOCK 位被清零:
PMM_unlockLPM5 ();

}

#pragma vector = TIMER0_A1_vector
__interrupt void Timer0_A1_ISR (void)
{
StoredCount ++;

}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    看起来为这个矢量提供服务的另一个中断标志被置位。 请检查是否设置了以下任一项并进行相应清除。

    TA0CCR1.CCIFG、

    TA0CCR2.CCIFG、

    TA0CTL.TAIFG

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢你的答复  

    我找到了有关中断矢量的此状态:

    TACCR1、TACCR2和 TAR 的中断向量的名称是 TIMER0_A1_VECTOR。 全部三个
    是 TACCR1、TACCR2还是 TAR

    和 P1.1用作输入捕捉  设置引脚1.1/TA0.CCI2A 、如下表所示  

      

     让我知道应该使用哪个中断矢量?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    TA0CCR0是特殊的--它触发 TIMER0_A0_VECTOR,而不必显式清零。  所有其它触发器 TIMER0_A1_Vector 并且必须被明确清零。 [参考用户指南(SLAU367O)第25.2.6节]

    TA0.CCI2A 触发 TA0CCTL2:CCIFG.. TA0CCTL2:CCIFG 触发 TIMER0_A1_VECTOR。

    您已正确完成所有这些操作。 缺失的部分是、在 ISR 中、您必须显式清除 TA0CCTL2:CCIFG、否则它将保持触发:

    > TA0CCTL2 &=~CCIFG; //清除捕捉中断

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    Bruce 的意见是否有帮助? 如果不是、请告知我们、否则我将在本周结束前关闭该主题。