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.

[参考译文] MSP430F5510:使用硬件计时器来实现高效的阻断延迟

Guru**** 2392905 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/802002/msp430f5510-using-hw-timers-to-do-an-efficient-blocking-delay

器件型号:MSP430F5510

您好!

我正在尝试为我的大学项目执行有效的阻止延迟。 我现在的工作:

volatile int32_t 计数器;

void timers_init (void){

TA0CTL |= TASSEL_SMCLK | MC__UP;
TA0CCR0 = 16000;                    //SMCLK 为16MHz、因此我们通过这种方式计算每个中断的时间为1ms

void wait_ms (uint32_t delay){

计数器=延迟;
TA0CTL |= TACLR;
TA0CCTL0 |= CCIE;

_bis_SR_register (LPM0_bits + GIE);
while (计数器>0);

#pragma vector=TIMER0_A0_VECTOR
_interrupt void timer0_A0_ISR (void){

----柜台;
如果(counter ==0){

_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);
TA0CCTL0 &=~(CCIE);

TA0CCTL0 &=~(TA0IV_TA0IFG);

是否有任何方法可以提高效率? 延迟的精度不是一个优先级、但我不想只通过"它在工作"来解决

感谢您的任何帮助!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不确定"高效"是您在 LPM 中几乎所有时间都在等待的主要问题、但我确实看到了一些漏洞:
    ------------
    > TA0CCTL0 &=~(TA0IV_TA0IFG);

    如果这里的目标是清除 TA0CCTL0:CCIFG、那么(1)这不会清除它、(2)你不需要清除它、因为当你获取中断时 TA0CCTL0:CCIFG (具体来说)会自动清除。 我怀疑您应该删除这一行。
    ------------
    >_bis_SR_register (LPM0_bits + GIE);
    >while (计数器>0);

    如果您认为(唯一可能的)唤醒发生在 counter=0时、则第二行是不必要的。 如果您认为程序中的其他实体也可能执行唤醒操作、它可能看起来更像:

    >while (计数器>0)
    >_bis_SR_register (LPM0_bits + GIE);

    (对于这一点,如果程序中有多个唤醒代理,我可能会通过将清除 CCIE 的操作从 ISR 移到这里来使这更安全,因此 ISR 只会继续发出唤醒信号--通常只有一个唤醒信号--直到此代码识别它为止。)
    ------------
    >易失性 int32_t 计数器;

    无法自动提取/存储32位变量。 如果无法使用 int16_t (32+秒)、则应禁用取指令和存储的中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Jordi:

    5天以来,我没有听到您的声音,因此我假设您能够解决您的问题。 如果情况并非如此,请单击“这无法解决我的问题”按钮,并使用更多信息回复此主题。 如果此主题锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。