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-EXP430FR2433:确认了 MSP430FR2433 SMCLK 相关问题。

Guru**** 2465890 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1028759/msp-exp430fr2433-msp430fr2433-smclk-related-issues-confirmed

器件型号:MSP-EXP430FR2433

您好、请检查随附的代码。 我们已经配置了 CS、captrue 计时器和 ADC 函数、但我们发现 ADC_init 中的以下配置将影响 SMCLK 的精度。
TA1CTL = tassel_SMCLK | MC_UP | TACLR;
我们测试了 Mg_SLEEP 接口并每1秒翻转一次 P1.0引脚、但当调用 ADC_INIT 接口时、引脚电平不会根据1S 时间发生变化。但当 ADC_INIT 接口被屏蔽、1s 时间正常时。(示波器测试 P1.0)
我们当前需要在当前项目中同时使用 ADC 功能、因此请帮助确认。
请参阅项目代码的附件。 谢谢。

e2e.ti.com/.../8054.PUMA_2D00_MCU_2D00_test.zip

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

    正如您所说的"但是、当调用 ADC_init 接口时、引脚电平不会根据1S 时间进行更改"。 您是指引脚不会改变、还是更改时间长于1s。

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

    在实际测试情况下、当调用 ADC_init 接口时、更改时间超过1S、即大约1.6s。

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

    我想它受到中断的干扰。 我建议您使用计时器来生成1s 时钟

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

    我们已经尝试对 ADC_init 接口进行注释、mg/sleep 时间正常、并且 ADC_init 接口已开启、时间异常。
    同时、我们尝试在 ADC_init 接口中修改以下配置:
    变化
    TA1CTL = tassel_SMCLK | MC_UP | TACLR;
    更改为
    TA1CTL = TASSEL_ACLK | MC_UP | TACLR;
    Mg_SLEEP 1s 时间恢复正常、因此"TA1CTL = tassel_SMCLK | MC_UP | TACLR;"将影响 SMCLK 时钟?

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

    正如我尝试过的、原因是您在计时器中断中放置了过多的代码。 延迟的情况。

    在我删除计时器中断中的所有代码之后。 它变为1。

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

    正如伊斯天说的、__delay_cycles 是一个简单的旋转循环、不考虑任何背景(中断)活动。 在您的情况下、该活动包括对 ADC_ISR 的80000调用(可能还包括对 TIMER0_A1_ISR 的一些调用)。 这会累加。

    您已经在使用这两个计时器、但请考虑 ADC_ISR 的调用速率与 TA1溢出(80kHz)的调用速率相同。 如果您对其中的80进行计数、您将得到1毫秒。 例如

    if (++tick_count >= 80) {
        tick_count=0; 
        ++ms_clock;
    }

    将为您提供一个简单的软件时钟、您可以使用它来延迟几毫秒。 延迟可能如下所示:

    void ms_delay (unsigned ms) {
        unsigned start = ms_clock;
        while ((ms_clock - start) < ms) /*EMPTY*/;
        return;
    }