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.

[参考译文] MSP-EXP430FR2355:每10ms 出现一次计时器中断问题

Guru**** 2535150 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/975780/msp-exp430fr2355-issue-with-timer-interrupt-for-every-10ms

器件型号:MSP-EXP430FR2355

大家好、团队、

我正在处理每   20微秒生成一次中断的计时器代码(TB1CCR0 = SMCLK_FREQUENCY / 100000UL;)。

现在、我需要每10毫秒生成一次中断。 下面是我正在尝试的代码

#include 
#include 

#define DCOCLK_FREQUENCY 24000000UL
#define MCLK_FREQUENCY DCOCLK_FREQUENCY
#define SMCLK_FREQUENCY DCOCLK_FREQUENCY void

Timer1_init ()
{
// Timer1_B3设置

TB1CCTL0 = CCIE; // TBCCR0中断使能
TB1CCR0 = SMCLK_FREQUENCY / 500UL;
TB1CTL = TBSSEL_SMCLK |上行模式; // ACLK、连续模式

__ bis_SR_register (GIE); //输入带中断的 LPM3
}

// Timer B1中断服务例程
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = Timer1_B0_vector
__interrupt void Timer1_B0_ISR (void)
#Elif defined (__GISR_BIST_1


)(void)(timer0_BIST_NOT_BIST_NOT_BIST_BIST_NOT_BIST_1)(void)#interrupt!
#endif


^ TB1CCTL0 &=~CCIFG;P1OUT = BIT0;
} 


蓝线生成中断的时间最长为2毫秒。 当我将除数减少到500UL 以下时、会发出警告:"整数转换结果被截断"。 我想生成10毫秒的中断、任何人都可以帮助我
解决这个问题?

 

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

    尊敬的 Vamshi:

    我想您希望将 SMCLK 分频为较低的频率、或者为您的计时器转到较低频率的时钟源。 这将为您的捕获比较寄存器提供较小的值。

    BR、
    Leo

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

    使用24MHz SMCLK 时、您可以得到的最长时间间隔(以16位为单位)为65536/24M=~2.7ms。

    使用 TB1CTL:ID 字段、您可以将 TB1输入时钟除以高达/8、从而提供8*2.7ms=~21ms。

    TB1EX0寄存器可提供另一个高达/8 (总计/64)的分频值、从而提供高达~172ms 的分频值。

    之后、您需要使用时钟系统(CS)寄存器对 SMCLK 进行分频。

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

    感谢您的回复 Bruce、

    那么24000000UL/100000UL 和65536/24M 之间有何区别?

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

    我不确定我是否理解这个问题。

    如果您将24M/100k-1放入 TB1CCR0、您将获得100kHz 循环频率或10us (微秒)周期。 您正尝试这么做吗?

    要获得10ms (毫秒)的周期、请尝试以下操作:

    > TB1CCR0 =(SMCLK_FREQUENCY / 8/100UL)-1; // 100Hz (10ms 周期)、ID = 3 (/8)

    > TB1CTL = TBSSEL_2 | ID_3 | MC_1; // SMCLK/8、向上计数模式

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

    感谢您的回复 Bruce、

    我有计时器中断20微秒。 我正在考虑10ms 的中断、我在  " 24000000UL/100000UL 和65536/24M "之间产生了混淆。

    在这两种情况下、除数是不同的。

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

    (24M 时钟/秒)/(100k 周期/秒)为您提供时钟/周期、这对于设置 CCR0很有用。

    (65536时钟)/(24M 时钟/秒)为您提供秒、这对人类(主要)很有用。

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

    非常感谢 Bruce、

    很棒,很好的描述