Other Parts Discussed in Thread: 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