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/MSP430FG439:外部定时器输入捕捉最大频率

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/914252/ccs-msp430fg439-external-timer-input-capture-maximum-frequency

器件型号:MSP430FG439

工具/软件:Code Composer Studio

尊敬的团队:

我的客户希望使用计时器捕获模式测量外部信号的频率。

硬件: MSP-FET430U80与 FG439

XT1 = 32.768kHz  XT2 = 4MHz

代码:  

#include 
#include "main.h"


unsigned long SMCLK_Count_Num = 0;
unsigned long 频率= 0;
unsigned char 计数= 0x0;
unsigned int REdge1、REdge2;


void main (void)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
SetupClock();
caption_Pos ();
//_enable_interrupt ();
while (1)
{
// _enable_interrupt ();
_bis_SR_register (LPM0_bits + GIE);//输入 LPM0
__no_operation(); //用于调试器
IF (TB0CCTL1和 COV) //检查捕捉溢出
while (1);

SMCLK_Count_Num = REdge2 - REdge1;
频率=(Count*SMCLK_Frequency)/SMCLK_Count_Num;
// TBCTL |= TBCLR + TBIE;
// TBCCTL1 |= CCIE;
}
}


void SetupClock()
{
uint16_t tmpv;
FLL_CTL1 &=~XT2OFF;
操作
{
IFG1 &=~OFIFG;
for (tmpv = 0xff;tmpv > 0;tmpv--);
}
while ((IFG1 & OFIFG)!=0);
IFG1 &=~OFIFG;
FLL_CTL1 |= SELM_XT2+SELS;
}


void Capture_Pos ()
{
P2SEL |= BIT2;
P2DIR &=~BIT2;

TB0CTL |= TBSSEL_2 + MC_2 + TBCLR;
TBCCTL1 = CM_1+ CCIS_1 + SCS + CAP + CCIE;
}

#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
#pragma vector = TIMERB1_vector
__interrupt void TIMER0_B1_ISR (void)
#Elif defineerISR (__TI_B1_COMPLESER)(void)(void
)#TI_B1_INTRISR_B1 (void)(void TI_TRIB1)(void TI_TRIB1)(void TI_TRIB1)#TI_ERROR)(void TI_B1)


#endif
//_interrupt void Timer_B1 (void)
{
switch (__event_in_range (TB0IV、0x0A))
{
案例 TB0IV_NONE:
中断;
案例 TB0IV_TBCCR1:
如果(!Count)
{
REdge1 = TB0CCR1;
count++;
}
其他
{
REdge2 = TB0CCR1;
计数= 0x0;
// TBCTL &=~TBIE;
// TBCCTL1 &=~CCIE;
__BIC_SR_REGISTER_ON_EXIT (LPM0_Bits + GIE);//返回 main 时退出 LPM0
}
中断;
案例 TB0IV_TBCCR2:
中断;
案例 TBIV_3:
中断;
案例 TBIV_4:
中断;
案例 TBIV_5:
中断;
案例 TBIV_6:
中断;
案例 TB0IV_TBIFG:
中断;
默认值:
中断;
}
} 

它挂起  

    IF (TB0CCTL1和 COV)                  //检查捕捉溢出
           while (1);

它们需要测量80KHz 外部信号。

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

    MCLK = 4MHz 时、80kHz 位于灰色区域:可行但并不简单。 该程序有4MHz/80kHz=50个 CPU 时钟来处理每个捕捉、其中大约一半用于 ISR 开销。 即使打开编译器优化也可能会有所改善。 该除法运算本身可能会导致一些数字(10、可能?) 但使用捕获的好处之一是每个周期(一对)为您提供了答案(如果您可以避免 COV 溢出)。

    未经请求:

    1)  

    >_BIC_SR_REGISTER_ON_EXIT (LPM0_Bits + GIE);  

    这将禁用 main 中的中断、这将在该除法操作运行时可预测地导致 COV 超限。 尝试:

    >_BIC_SR_REGISTER_ON_EXIT (LPM0_Bits);  

    2) 2)在 ISR 中执行(Redge2-Redge1)减法、以避免发生竞争。

    3)  

    >            Frequency = (Count*SMCLK_Frequency)/SMCLK_Count_Num;

    我不太理解为什么在这里计算数字。 计数为0或1、这不影响时间差。

    4) 4) Redge1、Redge2、可能还有 SMCLK_Count_Num 需要声明为"volatile"。