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.

[参考译文] RM42L432:将 RTI 比较单元用作简单的计时器

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/595307/rm42l432-using-the-rti-compare-units-as-simple-timers

器件型号:RM42L432
主题中讨论的其他器件:HALCOGEN

您好!

我正在尝试使用 RTI 比较单元作为简单的计时器、以阻止应用程序中的执行。 我希望的流程是:

  1. 复位比较单元、使其阻断的时间准确
  2. 等到比较结束
  3. 继续执行我的程序

现在、这些装置被设置为使用计数器0、该计数器在后台自由运行。 我已经制作了这个片段、但是它看起来不起作用(compare0被设定为1uS、而 compare1被设定为10ms、通过 HalCoGen):

#include "sys_common.h"
#include "RTI.h"

uint32_t micros = 0;

int main (void)
{
rtiInit();
_enable_IRQ ();

//启用 RTI 填充并启动计时器
rtiEnableNotification (rtiNOTIFICATION_COMPARE0);
rtiStartCounter (rtiCOUNTER_BLOCK0);

uint32_t s =微秒;

rtiREG1->INTFLAG = rtiNOTIFICATION_COMPARE1;//清除
rtiREG1->SETINTENA = rtiNOTIFICATION_COMPARE1;//启用

while (rtiREG1->INTFLAG & 0x02 = 0){}//等待

rtiREG1->CLEARINTENA= rtiNOTIFICATION_COMPARE1;//禁用

uint32_t d =微秒- s;

//示例1等待 COMPARE0 ISR
while (micros < 1000000){}

返回0;
}

// RTI ISR
void rtiNotification (uint32_t notification)
{
//比较0是一个1us 周期
if (rtiNOTIFICATION_COMPARE0 == notification)
{
Micros += RTI_UDCP0_CONFIGVALUE / 10;
}
} 

我不确定以下几点:

  1. 为什么在编程时间之后、COMPARE1位的 INTFLAG 寄存器不会转换为1 (d 仅为1)。
  2. 为了获得完整周期、我需要做什么来重置比较?

谢谢、

Nathan

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

    您是如何在 VIM 模块中初始化 RTI 中断的? 它是否映射到 IRQ? 您能否发布一个演示该问题的小项目、以便我查看它?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我没有映射 COMPARE1的 RTI 中断、我没有映射 COMPARE0的 RTI 中断。 我试图避免映射 VIM 表中的中断、只需轮询定时器寄存器、以便我可以在多个位置使用定时器。

    请注意、COMPARE0按预期工作、但手动读取 COMAPRE1寄存器不符合我的预期。

    今天晚上我可以结束一个项目。