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.

[参考译文] CC3200:计时器 CC 测量未触发的 RTC 和 GPIO 中断

Guru**** 2771175 points

Other Parts Discussed in Thread: CC3200

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1043183/cc3200-timer-cc-measures-the-rtc-and-gpio-interrupt-not-triggered

器件型号:CC3200


您好!

我对 CC3200有一个非常奇怪的问题。 我正在尝试测量输入端口上的边沿之间的时间。 例如、我使用了 timer_cc。 我的代码几乎相同、但它不测量输入线上的边沿、而是测量 RTC 时钟。 (用 OSCi 这条线测量、没有 RTC。) 我不明白这是怎么可能的。 代码如下:

volatile uint32_t captureValue = 0;
volatile unsigned long debugReg = 0;

void MyTimerHandler()
{ 
    MAP_GPIOPinWrite(GPIOA0_BASE, GPIO_INT_PIN_0, 0);
    
    unsigned long ulTimerState =  MAP_TimerIntStatus(TIMERA1_BASE, 1);
    if (ulTimerState & TIMER_CAPA_EVENT)
    {
        captureValue = MAP_TimerValueGet(TIMERA1_BASE,TIMER_A);
        MAP_TimerIntClear(TIMERA1_BASE, TIMER_CAPA_EVENT);
        MAP_GPIOPinWrite(GPIOA0_BASE, GPIO_INT_PIN_0, 1);
    }
    else
    {
        __asm("nop");
    }  
}

 void BoardInit(void)
{
    MAP_IntMasterEnable();
    MAP_IntEnable(FAULT_SYSTICK);

    PRCMCC3200MCUInit();
}

int main(int argc, char * argv[])
{
   BoardInit();

  /* Debug LED */
  MAP_PRCMPeripheralClkEnable (PRCM_GPIOA0, PRCM_RUN_MODE_CLK);
  MAP_PinTypeGPIO(PIN_50, PIN_MODE_0, false);
  MAP_GPIODirModeSet (GPIOA0_BASE, GPIO_INT_PIN_0, GPIO_DIR_MODE_OUT);

  /* timer cc */
  MAP_PRCMPeripheralClkEnable( PRCM_TIMERA1, PRCM_RUN_MODE_CLK);
  MAP_PRCMPeripheralReset( PRCM_TIMERA1);
  MAP_PinTypeTimer(PIN_02, PIN_MODE_12);
  MAP_TimerIntRegister( TIMERA1_BASE, TIMER_A, MyTimerHandler);
  MAP_TimerConfigure( TIMERA1_BASE, (TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME));
  MAP_TimerControlEvent(TIMERA1_BASE, TIMER_A, TIMER_EVENT_NEG_EDGE);
  MAP_TimerLoadSet(TIMERA1_BASE, TIMER_A, 0xFFFFuL); 
  MAP_TimerIntEnable( TIMERA1_BASE, TIMER_CAPA_EVENT);
  MAP_TimerEnable( TIMERA1_BASE, TIMER_A);

  while(1)
  {
    debugReg =  MAP_TimerIntStatus(TIMERA1_BASE, 1);
    __asm("nop");
  }
}

它根本没有检测到的边沿。 当我取消注释线路 MAP_PinTypeTimer (PIN_02、PIN_MODE_12)时、行为完全不变。 中断像连接 RTC 一样进入。 但 PIN2端口上的实边沿根本不会触发中断。

然后我尝试使用 GPIO 而不是计时器。 我只是想在每个边沿上都有一个中断。 在这种情况下、完全没有产生中断。 但是、当我在 while 环路中使用轮询模式时、情况良好。 代码如下:

void MyGpioHandler()
{ 
	MAP_GPIOPinWrite(GPIOA0_BASE, GPIO_INT_PIN_0, 0);

	unsigned long ulPinState =  GPIOIntStatus(GPIOA1_BASE,1);
	if(ulPinState & GPIO_PIN_3)
	{
		MAP_GPIOIntClear(GPIOA1_BASE,GPIO_INT_PIN_3);
		MAP_GPIOPinWrite(GPIOA0_BASE, GPIO_INT_PIN_0, 1);
	}
}

int main(int argc, char * argv[])
{
   BoardInit();

  /* Debug LED */
  MAP_PRCMPeripheralClkEnable (PRCM_GPIOA0, PRCM_RUN_MODE_CLK);
  MAP_PinTypeGPIO(PIN_50, PIN_MODE_0, false);
  MAP_GPIODirModeSet (GPIOA0_BASE, GPIO_INT_PIN_0, GPIO_DIR_MODE_OUT);

  MAP_PRCMPeripheralClkEnable(PRCM_GPIOA1, PRCM_RUN_MODE_CLK);
  MAP_PRCMPeripheralReset( PRCM_GPIOA1);
  MAP_PinTypeGPIO(PIN_02, PIN_MODE_0, true);
  MAP_GPIODirModeSet(GPIOA1_BASE, GPIO_PIN_3, GPIO_DIR_MODE_IN);
  MAP_GPIOIntTypeSet(GPIOA1_BASE, GPIO_INT_PIN_3, GPIO_FALLING_EDGE);  
  MAP_IntPrioritySet(INT_GPIOA1, INT_PRIORITY_LVL_1);
  MAP_GPIOIntRegister(GPIOA1_BASE, MyGpioHandler);
  MAP_GPIOIntClear(GPIOA1_BASE,GPIO_INT_PIN_3);
  MAP_GPIOIntEnable(GPIOA1_BASE,GPIO_INT_PIN_3);
  
  while(1)
  {
    debugReg =  GPIOIntStatus(GPIOA1_BASE,1);
#if 0
	if(ulPinState & GPIO_PIN_3)
    {
      MAP_GPIOIntClear(GPIOA1_BASE,GPIO_INT_PIN_3);
      MAP_GPIOPinWrite(GPIOA0_BASE, GPIO_INT_PIN_0, 1);
    }
#endif
    __asm("nop");
  }
}

那么、我的问题是、为什么计时器 cc 测量 RTC? 为什么 GPIO 中断不出现?

提前感谢您。
Daniel

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

    Daniel、您好!

    在第一个代码片段中、您将使用具有中断的计时器外设、然后在处理程序中切换 GPIO 输出。 我很困惑您是如何在这里测量 GPIO 中断的?

    在第二个片段中、我只看到您在下降沿(第26行)设置中断。 您是否尝试 过 GPIO_both _edges 参数?

    此致、

    Sarah

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

    您好 Sarah、  

    感谢您的回复。 第一个小插件恰好是 CC3200_SDK 中的 TIMER_cc 示例。  然后可以使用 CaptureValue 来计算时间。 (此处未实现。) 不要混淆输出 GPIO。 我使用它只是为了在 OSCi 上查看中断发生的时间。 因此、为了检查定时器捕获是在输入 GPIO 的下降沿还是在其他某个地方完成的。 (另一个似乎是 RTC。 这是怎么可能的?)

    不、在第二个片段上、我只想具有下降沿。 正如我说的、中断不会出现、但轮询模式正在工作。 这是怎么可能的?

    此致、
    Daniel

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

    我已部分确定此问题来自硬件。 我已经用评估板对其进行了重新测试、在这里它看起来可以正常工作。 我仍然不知道电路板/芯片上的缺陷导致了这种情况、但至少不是软件造成的。