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.

[参考译文] CC2630:时钟仅在调试会话期间和 CPU 复位后工作

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1242417/cc2630-clock-only-works-during-debug-sessions-and-after-cpu-reset

器件型号:CC2630
主题中讨论的其他器件:CC2650、TIMAC、 UNIFLASHCC2651R3、SYSBIOS

我正在使用 TIMAC (tirtos_simplelink_2_11_01_09)、并尝试编写一个可使一些 LED 闪烁的简单应用程序。 此程序在调试会话期间按预期工作、但当我断开电源并重新插入时、它将触发单个计时器事件、然后冻结。 如果我进入 Uniflash 并发出 CPU 或系统复位、则 LED 会按需闪烁。 如果我发出电路板复位命令、LED 永远不会亮起。 我是在 msa_cc2650示例应用程序中反向工作的、因此这里存在大量膨胀代码、但相关部分

Void main()
{
  Task_Params taskParams;

  // set RFC mode to support IEEE802.15.4
  // Note: This must be done before the RF Core is released from reset!
  SET_RFC_MODE( RFC_MODE_IEEE );

  // enable iCache prefetching
  VIMSConfigure(VIMS_BASE, TRUE, TRUE);

  // Enable cache
  VIMSModeSet( VIMS_BASE, VIMS_MODE_ENABLED );

  /* Initialization for board related stuff such as LEDs
   * following TI-RTOS convention */
  PIN_init(BoardGpioInitTable);

  // Configure task.
  Task_Params_init(&taskParams);
  taskParams.stack = myTaskStack;
  taskParams.stackSize = MSA_TASK_STACK_SIZE;
  taskParams.priority = 1;
  Task_construct(&myTask, taskFxn, &taskParams, NULL);

  BIOS_start();     /* enable interrupts and start SYS/BIOS */
}

/**************************************************************************************************
 *                                        GLOBAL VARIABLES
 **************************************************************************************************/

/* Clock resorces */
static Clock_Params  msaLed4Params;
static Clock_Struct msaLed4;

/** LED globals */
static PIN_Config ledPinTable[] = {
  Board_LED1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED1 initially off */
  Board_LED2 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED2 initially off */
  Board_LED3 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED2 initially off */
  Board_LED4 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED2 initially off */
  PIN_TERMINATE                                                               /* Terminate list     */
};

/* LED pin state */
static PIN_State ledPinState;

/* LED Pin Handle */
PIN_Handle ledPinHandle;


static void MSA_ClockFxn(UArg param)
{
  static bool index = false;

  PIN_setOutputValue(ledPinHandle, Board_LED1, index ? Board_LED_ON : Board_LED_OFF);
  PIN_setOutputValue(ledPinHandle, Board_LED3, index ? Board_LED_ON : Board_LED_OFF);
  PIN_setOutputValue(ledPinHandle, Board_LED2, index ? Board_LED_OFF : Board_LED_ON);
  PIN_setOutputValue(ledPinHandle, Board_LED4, index ? Board_LED_OFF : Board_LED_ON);
  index = !index;
}

static void MSA_Init(void)
{
  UInt msaLed4Period = MSA_LED4_INITIAL_PERIOD * 1000 / Clock_tickPeriod;

  ledPinHandle = PIN_open(&ledPinState, ledPinTable);

  /* Initialize clock poll parameters */
  Clock_Params_init(&msaLed4Params);
  
  /* Create a periodic poll timer */
  msaLed4Params.period = msaLed4Period;
  msaLed4Params.startFlag = TRUE; 
  msaLed4Params.arg = (UArg)MSA_LED4_EVENT;
  Clock_construct(&msaLed4, MSA_ClockFxn, msaLed4Period, &msaLed4Params);
}

void msa_task(void)
{
  /* Initialize application */
  MSA_Init();
  
  /* No return from MSA process */
  //MSA_Process();
}

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

    我认为这是一个竞态条件(或未定义的行为)、因为我删除了阻止任务代码返回的代码。 如果我添加一个阻止 MSA_task 返回的循环、它将始终按预期工作。

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

    Daniel、您好!

    感谢更新!  请 阐明以下内容:

    • 您是否将最新的 TIMAC 版本(1.5.2)与 IAR EWARM 7.40.1 (版本说明中列出了相关性)一起使用?
    • 您可以擦除所有闪存并运行默认 MSA 示例而不会出现任何问题、并在工程配置中定义 CC2630符号吗?
    • 您使用的是 TI EVM 还是定制电路板?

    这可能是依赖于硬件的情况吗?  我建议 改用评估 CC2651R3、它将提供更好的 HW (LP-CC2651P3)和 SW (SIMPLELINK-LOWPOWER-F2-SDK)支持。

    此致、
    瑞安

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

    是的、我使用的是最新版本的 TI MAC 和经过批准的 EWARM。 至于硬件的选择、我将重构现有已部署产品的固件。 CC2651R3可能适用于我们的下一个硬件版本。 另外、如果人们希望将来继续这样做、那么在配置中设置"CC2630"会比设置"TIMAC (和 SYSBIOS)"更简单、因为 TIMAC (和 SYSBIOS)通常使用 CC2650作为 CC26x0平台的全捕获工具、因为它们共享大量相同的属性。

    这几乎肯定与过早结束任务有关。 如果我防止这种情况发生、不会发生有问题的行为。 为什么它最初在某些条件下工作仍然是一个谜,但我的问题已消失。