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/MSP430FR5857:计时器

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/610629/ccs-msp430fr5857-timer

器件型号:MSP430FR5857

工具/软件:Code Composer Studio

我的设计需要一个引脚在5分钟内保持低电平、然后持续5秒、并且想要不停地重复。 我想为此使用计时器。  

#include 
unsigned int i=1;
int main (void)
{
WDTCTL = WDTPW | WDTHOLD; //停止 WDT

//配置 GPIO
P1DIR |= BIT2;

//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;

TA0CCTL0 = CCIE; //启用 TACCR0中断
TA0CCR0 = 50000;
TA0CTL = tassel_SMCLK | MC__Continous;// SMCLK、连续模式

_bis_SR_register (GIE); //输入 LPM0,带中断
__no_operation(); //对于调试
器}

void __attribute__((interrupt (TIMER0_A0_Vector)) Timer0_A0_ISR (void)
{
i++;
if (i%2=0)
{
P1OUT |= BIT2;
TA0CCR0 += 50;
}
if (i%2!=0)
{
P1OUT &=0xFFFB;
TA0CCR0 +=65535;
}
}

此代码正常工作、但我需要较长的关断时间、如上所述。 我该怎么做?

我可以使用计时器以外的其他器件来执行上述操作吗?

提前感谢您。

Viswanath。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以使用 DIVS 使 SMCLK 比时钟源慢多达32倍。 (默认情况下已将8MHz 源除以8。)
    您可以使用 ID 和 IDEX 使计时器的输入时钟速度降低64倍。

    默认 DCOFSEL 约为8MHz 时、这将导致一个4096Hz 的定时器节拍、即、最大延迟约为16s
    如果您减少 DCOFSEL、则会得到一个512Hz 的定时器节拍、即最大延迟约为128s
    如果您有一个32768Hz 晶振、则可以改用 ACLK;计时器节拍将为16Hz、最大延迟约为4096s (68分钟)。

    或者、不要将其视为5分钟的延迟;将其拆分为20个15秒、仅在最后一个周期之后切换输出。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢克莱明。 我使用16MHz 是因为我需要在电路的某些部分进行高速操作。 关于最后一个想法、您能指导我如何做到这一点吗? 我的意思是在代码方面。 我是 CCS 的初学者、但这么做有点令人困惑。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此时、中断处理程序有两种状态。

    名称"i"毫无意义;将其重命名为"state"。 当它到达最后一个状态时、将其复位、而不是查看其最低位。

    然后在每个状态下执行必要的操作:

    开关(状态){
    案例0:
    TA0CCR0 += 15000;
    P1OUT |= BIT2;
    中断;
    情况1:
    TA0CCR0 += 50000;
    P1OUT &=~BIT2;
    中断;
    案例2:
    案例3:
    ...
    案例20:
    TA0CCR0 += 50000;
    break;
    }
    
    state++;
    if (state == 21)
    状态= 0; 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢克莱明。 我找到了另一个解决此问题的解决方案。 我使用 VLOCLK 作为计时器时钟、然后应用了预分频器。 使用此功能、我们可以得到将近270分钟的最大时间计数。