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.

[参考译文] MSP432P401R:查看 Timer32的双中断

Guru**** 2555630 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/668118/msp432p401r-seeing-double-interrupts-for-timer32

器件型号:MSP432P401R

G'Day、

Timer32模块偶尔会以非常短的顺序(相隔几十微秒)提供两个中断、这有什么原因吗?

我使用的是 SimpleLink 1.4 (尚未升级到 v1.6)、我按照下面的代码片段所述设置 Timer32模块(我基本上将其设置为每10mSec 给我一次中断)

uint32_t tickCnt = 0;

void timer32_hwi (uintptr_t arg)
{
map_Timer32_clearInterruptFlag (timer_1_base);
tickCnt++;
}

void timer32_init (void)
{

//为 Timer32模块设置 HWI

hwi_handle





;t2 part_params (nwi_params = 0xt2);parhnwi_params = 0xt2;params (params) timer32_hwi、&params、NULL);

//设置 Timer32模块-不知道用于 Timer32的 SimpleLink 驱动程序、因此请使用 driverlib

map_Timer32_haltTimer (timer_1_base);
map_Timer32_initModule (timer_1_base、TIMER32_calpreser_1、TIMER32_32位、TIMER32位、TIMER32位、TIMER32位周期模式);TIMER32位
MAP_Timer32_setCount (timer_1_base、480000);
MAP_Timer32_clearInterruptFlag (timer_1_base);
MAP_Timer32_enableInterrupt (timer_1_base);
MAP_Timer32_startTimer (timer_1_base、 false);

tickCnt = 0;

}

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

    如果您有兴趣使用 TI 驱动程序、请查看示例"./examples/rtos/MSP_EXP432P401R/drivers/timerled。 如果您仍需要帮助、请告知我们。

    TIMER_1_BASE 映射到什么?

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

    抱歉、拼写错误。 应为 TIMER32_1_base。

    您发送的示例让我感到困惑。  

    乍一看、我以为该示例使用 ti.sysbios.family.arm.msp432 API (我已经使用了很多 API)、但有些内容已关闭。

    SysBIOS API 具有 Timer_handle、Timer_Params、Timer_Params_init (我在示例中看到)等函数/ typedef、但不像 Timer_open ()(也出现在示例中)调用

    实际上、SYSBIOS ti.SysBIOS.family.arm.msp432 API 和 SimpleLink Timer.h API 共享一组 typedef 和函数名称。  两个 API 以不同的方式实现这些共享名称后面的项目。  这似乎有点邪恶。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您如何知道您看到的中断数量是2倍? 惯性32是一个简单的外设。 那么、显示寄存器的打印并查看是否有意外情况。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我之所以能够将 Timer32中断紧密地联系在一起、是因为下面的 RTOS 分析器执行图

    hwi.timer32D_HWI_MODULE_环氧树脂 Ctr ()是 Timer32 TIMER32_1_base 的 HWI

    昨天、我经常看到上面的迹线之类的东西。  

    我不确定发生了什么变化、但今天我没有看到中断如此接近、但我仍然看到中断间隔小于10mSec。

    我按如下方式修改了 HWI、以便能够检测中断何时一起发生得太近。

    静态 uint32_t syst = 0;
    uint32_t tDiff;
    
    tDiff = syst - map_SysTK_getValue ();
    syst = map_SysTK_getValue ();
    if (tDiff < 400000)// 480000为10mSec…
    {
    _nop ();
    }
    
    map_Timer32_clearInterruptFlag (TIMER32_MODULE_EPOCHTR);
    g_timer32_epechcnt_u64++;
    g_timer32_freeCnt_u32++; 

    如果将一个断点放在__nop()上,则每隔几秒(相当随机) exeution 就会在断点处停止,tDiff 会在该位置发生变化(ROM 大约10,000到300,000以上)

    下面的屏幕截图显示了在_nop()处停止时的寄存器;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在 ISR 中翻转一个引脚并在其上放置一个示波器。

    是否有任何寄存器值意外?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    看起来我错误地使用 SysTick 来测量中断之间的周期。
    切换至已解决当今问题的其他计时器。

    我无法重复昨天的问题、因此如果我再次看到原始问题、我会将其标记为已解决并打开一个新问题、并提供更多详细信息。