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:PIN2上的计时器 CC 测量 RTC

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1070092/cc3200-timer-cc-on-pin2-measures-the-rtc

部件号:CC3200
“线程”中讨论的其它部件:UNIFLASH,,, CC3100

您好,  

我再次遇到了与上一次相同的问题。 请参阅相关问题。 上次我以为硬件有缺陷,但我现在已经不太确定了。  

问题仍然是一样的:它不是测量 PIN2上标志之间的时间,而是测量 RTC 频率。 在 Evalboard (CC3200-Laurchxl)上,它运行正常,但在真正的硬件上却不工作。  

但这次我用 CC3200-Lauchxl 板重现了这个问题! 我在板上安装了什么软件,调试器现在也在测量 RTC,而不是 PIN2,这一点无关紧要。   

通常,我是通过内部 TI 调试器直接从 IAR 环境中刷新评估板的。 真正的硬件通过 UART 和释放被闪存。 我现在在评估板上尝试了相同的方法,但现在我们去了,问题是一样的...真正奇怪的是,无论我用调试器闪存什么软件,问题都是一样的。 但软件仍被刷新! 当我将针脚从 低更改为高时,针脚工作正常。  

因此,影响 PIN2边缘检测行为的是一种不可避免的做法,甚至使用调试器覆盖软件也不会改变它。  

一些线索可能是什么?  

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

    您好,丹尼尔,

    让我了解一下,您是否仍在使用 timer_cc 示例? 请说明您使用的 SDK 版本吗?  

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

    大部分是肯定的。 我做了一些更改,但代码正在与调试器一起进行评估。 但是,在用毫不花时间刷新它后,我无法获得相同的代码。  

    我已经检查了这些版本,似乎带有 uniflash 的闪存服务接收器来自 v1.4。 但我发现一些头文件似乎来自 v1.2。 我将对其进行清理并使用新的 v1.5重新测试。 遗憾的是,这需要一段时间,因为只能将其作为同样需要管理员权限的安装程序来获取。  

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

    您好,Sabeeh,

    这种情况又发生了变化。 我用 v1.4和 v1.5创建了全新的项目。 现在我再也看不到一些 RTC 时钟,但中断现在也根本没有出现。 因此,我认为 map_可能被混淆,因此在项目 v1.4中,我删除了所有 map_函数。 但这并没有什么改变。 我似乎无法附加项目,因此下面是 v1.5项目的 main.c 文件:

    #include <stdint.h>
    #include "hw_types.h"
    #include "hw_ints.h"
    #include "prcm.h"
    #include "interrupt.h"
    #include "timer.h"
    #include "gpio.h"
    #include "hw_memmap.h"
    #include "pin.h"
    #include "rom_map.h"
    
    
    volatile uint32_t pingCaptureValue = 0;
    uint32_t timeDiffInTicks = 0;
    
    void MyTimerHandler()
    { 
        static uint8_t ping = true;
        uint32_t timerValue = MAP_TimerValueGet(TIMERA1_BASE, TIMER_A);
        uint32_t intStatus = MAP_TimerIntStatus(TIMERA1_BASE, true);
        
        MAP_TimerIntClear (TIMERA1_BASE, intStatus);
        
        if (ping == true)
        {
            ping = false;
            MAP_GPIOPinWrite (GPIOA0_BASE, GPIO_PIN_0, GPIO_PIN_0);
            /* falling edge detected */
            MAP_TimerControlEvent (TIMERA1_BASE, TIMER_A, TIMER_EVENT_POS_EDGE);
            pingCaptureValue = timerValue;
        }
        else
        {
            ping = true;
            MAP_GPIOPinWrite (GPIOA0_BASE, GPIO_PIN_0, 0);
            /* rising edge detected */
            MAP_TimerControlEvent (TIMERA1_BASE, TIMER_A, TIMER_EVENT_NEG_EDGE);
            timeDiffInTicks = (timerValue - pingCaptureValue) & 0xFFFFFFuL; 
        }  
    }
    
     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_PRCMPeripheralReset (PRCM_GPIOA0);
      
      MAP_PinTypeGPIO(PIN_50, PIN_MODE_0, false);
      MAP_GPIODirModeSet (GPIOA0_BASE, GPIO_PIN_0, GPIO_DIR_MODE_OUT);
      MAP_PinTypeGPIO(PIN_55, PIN_MODE_0, false);
      MAP_GPIODirModeSet (GPIOA0_BASE, GPIO_PIN_1, GPIO_DIR_MODE_OUT);
      MAP_GPIOPinWrite (GPIOA0_BASE, GPIO_PIN_1, GPIO_PIN_1);
    
      /* 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_UP));
      MAP_TimerControlEvent(TIMERA1_BASE, TIMER_A, TIMER_EVENT_NEG_EDGE);
      MAP_TimerLoadSet(TIMERA1_BASE, TIMER_A, 0xFFFFFFuL); 
      MAP_TimerIntEnable( TIMERA1_BASE, TIMER_CAPA_EVENT);
      MAP_TimerEnable( TIMERA1_BASE, TIMER_A);
    
      while(1)
      {
        __asm("nop");
      }
    }

    我正在使用 CC3200-Lunchxl。 连接的跳线包括:J8,J9,J10,J11,J12和 J13。 我将 J6和 J7连接在中间,以获得上升和下降的边缘。 其余部分未连接。

    要使用无间隙闪烁,我使用的是默认设置和已连接的 J15。 J6和 J7连接到闪存。

    v1.4的确切版本是:
    CC3200SDK_1.4.0
    CC3100_CC3200_ServicePack_1.0.1.131-2.11.0.1

    对于 v1.5:
    CC3200SDK_1.5.0
    CC3100_CC3200_ServicePack_1.0.1.15-2.14.0.0

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

    好的,在这个项目中,我忘记设置引导程序表。 此处为当前版本:

    #include <stdint.h>
    #include "hw_types.h"
    #include "hw_ints.h"
    #include "prcm.h"
    #include "interrupt.h"
    #include "timer.h"
    #include "gpio.h"
    #include "hw_memmap.h"
    #include "pin.h"
    #include "rom_map.h"
    
    
    extern uVectorEntry __vector_table;
    
    volatile uint32_t pingCaptureValue = 0;
    uint32_t timeDiffInTicks = 0;
    
    /* SET this to TIMERA2_BASE for Pin4 and TIMERA1_BASE for Pin2 */
    unsigned long timerBase = TIMERA1_BASE;
    
    void MyTimerHandler()
    { 
        static uint8_t ping = true;
        uint32_t timerValue = MAP_TimerValueGet(timerBase, TIMER_A);
        uint32_t intStatus = MAP_TimerIntStatus(timerBase, true);
        
        MAP_TimerIntClear (timerBase, intStatus);
        
        if (ping == true)
        {
            ping = false;
            MAP_GPIOPinWrite (GPIOA0_BASE, GPIO_PIN_0, GPIO_PIN_0);
            /* falling edge detected */
            MAP_TimerControlEvent (timerBase, TIMER_A, TIMER_EVENT_POS_EDGE);
            pingCaptureValue = timerValue;
        }
        else
        {
            ping = true;
            MAP_GPIOPinWrite (GPIOA0_BASE, GPIO_PIN_0, 0);
            /* rising edge detected */
            MAP_TimerControlEvent (timerBase, TIMER_A, TIMER_EVENT_NEG_EDGE);
            timeDiffInTicks = (timerValue - pingCaptureValue) & 0xFFFFuL; 
        }  
    }
    
    
     void BoardInit(void)
    {
        
        MAP_IntVTableBaseSet((unsigned long)&__vector_table);
      
        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_PRCMPeripheralReset (PRCM_GPIOA0);
      
      MAP_PinTypeGPIO(PIN_50, PIN_MODE_0, false);
      MAP_GPIODirModeSet (GPIOA0_BASE, GPIO_PIN_0, GPIO_DIR_MODE_OUT);
      MAP_PinTypeGPIO(PIN_55, PIN_MODE_0, false);
      MAP_GPIODirModeSet (GPIOA0_BASE, GPIO_PIN_1, GPIO_DIR_MODE_OUT);
      MAP_GPIOPinWrite (GPIOA0_BASE, GPIO_PIN_1, GPIO_PIN_1);
    
      /* timer cc */
      if (timerBase == TIMERA1_BASE)
      {
        MAP_PRCMPeripheralClkEnable( PRCM_TIMERA1, PRCM_RUN_MODE_CLK);
        MAP_PRCMPeripheralReset( PRCM_TIMERA1);
        MAP_PinTypeTimer(PIN_02, PIN_MODE_12);
      }
      else
      {
        MAP_PRCMPeripheralClkEnable(PRCM_TIMERA2, PRCM_RUN_MODE_CLK);
        MAP_PRCMPeripheralReset( PRCM_TIMERA2);
        MAP_PinTypeTimer(PIN_04, PIN_MODE_12);
      }
      
      MAP_TimerIntRegister(timerBase, TIMER_A, MyTimerHandler);
      MAP_TimerConfigure(timerBase, (TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME));
      MAP_TimerControlEvent(timerBase,TIMER_A,TIMER_EVENT_POS_EDGE);
      MAP_TimerLoadSet(timerBase,TIMER_A,0xffff);
      MAP_TimerIntEnable(timerBase,TIMER_CAPA_EVENT);
      MAP_TimerEnable(timerBase,TIMER_A);
    
      while(1)
      {
        __asm("nop");
      }
    }

    我还添加了变量 timerBase。 通过将其设置为 TIMERA2_BASE,它与示例中的相同,将使用引脚4。 中断正在出现,因此似乎可以正常工作。 通过将其设置为 TIMERA1_BASE,将使用 PIN2,并且不会出现中断.... 两者之间的区别仅为 IF 中的3行。 我不明白问题是什么。 两个引脚12均使用此模式。 那么我在这里错过了什么呢?

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

    好的另一个错误。 我现在检查了错误的针脚。 因此,新项目正在运行。 但我想我知道以前的问题是什么。

    当闪烁时,我选择了/sys/mcuimg.bin 我自己的 bin 文件。 之后,我连接了调试器并重新刷新了调试器。 我觉得应该只使用 service pack 刷新:单击 format (1MB),然后单击 flash service pack。 之后可以使用调试器。 是这样吗?

    或者调试器正在重新编程哪些区域?

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

    好的,终于找到了真正的根本原因。 MAP_函数的指向部分错误。 我以为这是来自 TI 的,但原始文件 rom_map.h 工作正常。 评估板和真正的硬件以不同的方式被刷新,这就是为什么它在一个硬件上而不是在另一个硬件上工作。 此外,还有一个版本冲突(map_function 预期 v1.4之前的 lib 版本,但 v1.4已刷新)。 现在它很干净,希望能正常工作。XD