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.

[参考译文] LAUNCHXL-F280049C:C2KWare-v5.03 GPIO 切换停止切换 LED5

Guru**** 2466550 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1485622/launchxl-f280049c-c2kware-v5-03-gpio-toggle-stops-toggling-led5

器件型号:LAUNCHXL-F280049C
Thread 中讨论的其他器件:C2000WARE

工具与软件:

团队成员、您好!

当应用程序开始运行时、GPIO 切换速率问题突然停止(GPIO 高电平状态= LED 关闭)。 闪烁速率根据 while 环路测试中的有效状态加快、然后在几秒钟后停止切换、奇怪的是、GPIO 端口通常处于高电平状态(LED5关闭)。 早期版本的 C2KWare v4.01编译了类似项目、相同的闪烁速率代码不会停止切换 LED。 这时生效速率更快的 ISR (main.c ISR 调用)生效的 LED 闪烁速率的速度会发生变化。 即使在 ISR 中放置更快的 LED 闪烁速率切换代码、GPIO 切换也会停止。 但是、闪烁切换速率循环计数在测试期间被清除、以启动 STOP GPIO 切换计数。 两个示例项目使用了相同的 LaunchXL49c 焊盘。 降低 GPIO 切换速度无法纠正闪烁速率 LED 停止 LED 驱动器 IC 的高电平状态。

在按下包含 GPIO 闪烁速率计数的循环时看起来较慢、稍后在 ISR ACK 组之后从堆栈弹出 SYSCLK 时间。 看似闪烁计数(uint32_t)变量。 不会溢出但之前的类似工程示例没有上述 GPIO 切换速率停止问题。

为什么最新的 C2000Ware v5.04 (GPIO.c)会在非常快速的 ISR (21.5µs)开始断言后立即随机停止 GPIO 切换?

希望看到 LED 在两种控制模式(空闲和运行)之间切换、从而生成视觉指示的独立应用没有停止。

#define LED_BLINK_FREQ_Hz              (70.0)  
#define RUN_LED_BLINK_FREQ_Hz           (2.0)     
#define IDLE_LED_BLINK_FREQ_Hz          (1.5)

HAL_GPIO_LED2C = 34,   //!< GPIO pin number for LaunchPad LED 4 (yellow)

// GPIO34->LaunchPad LED4 (yellow)
// SPI-CS J8-pin72
#ifdef CLA
GPIO_setMasterCore(34, GPIO_CORE_CPU1_CLA1);
#else
GPIO_setMasterCore(34, GPIO_CORE_CPU1);
#endif
GPIO_setPinConfig(GPIO_34_GPIO34);
GPIO_writePin(34, 0);
GPIO_setDirectionMode(34, GPIO_DIR_MODE_OUT);
GPIO_setPadConfig(34, GPIO_PIN_TYPE_STD)

while(systemVars.flagEnableSystem == true)
{
    // loop while the enable system flag is true
    systemVars.mainLoopCnt++;

    // 1ms time base
    if(HAL_getCPUTimerStatus(halHandle, HAL_CPU_TIMER1))
    {
        /* cleear overflow flag */
        HAL_clearCPUTimerFlag(halHandle, HAL_CPU_TIMER1);
        /* reload the timer from period register */
        CPUTimer_reloadTimerCounter(HAL_CPU_TIMER1);
        
        /* Motor Idle LED @2.5Hz, @400ms interval count */
        if((systemVars.flagEnableSystem == true) &&
             (motorVars_M1.flagRunIdentAndOnLine == false) &&
                (systemVars.counterLEDC >= (uint32_t)(LED_BLINK_FREQ_Hz / IDLE_LED_BLINK_FREQ_Hz))) //150
        {
            //HAL_toggleLED(halHandle, HAL_GPIO_LED2C); //yellow LED
            GPIO_togglePin(HAL_GPIO_LED2C);
        
            systemVars.counterLEDC = 0;
        }
        
        /* Motor Run LED flash @5Hz, @200ms interval count */
        if((systemVars.counterLEDC) > ((uint32_t)(LED_BLINK_FREQ_Hz / RUN_LED_BLINK_FREQ_Hz)) &&
                (motorVars_M1.flagRunIdentAndOnLine == true) && (systemVars.flagEnableSystem == true))
        {
            //HAL_toggleLED(halHandle, HAL_GPIO_LED2C); // yellow LED
            GPIO_togglePin(HAL_GPIO_LED2C);
        
            systemVars.counterLEDC = 0;
        }
            systemVars.timerBase_1ms++;

            switch(systemVars.timerBase_1ms)
            {
                case 1:     // motor 1 protection check
                    runMotorMonitor(motorHandle_M1);
                    break;
                case 2:
                    calculateRMSData(motorHandle_M1);
                    break;
                case 3:
            #if defined(MOTOR1_PI_TUNE)
               // Tune the gains of the controllers (Note:Not being asserted)
                tuneControllerGains(motorHandle_M1);
            #endif  // MOTOR1_PI_TUNE
                    break;
                case 4:     // calculate motor protection value
                    calcMotorOverCurrentThreshold(motorHandle_M1);
                    break;
                case 5:     // system control
                    systemVars.timerBase_1ms = 0;
                    systemVars.timerCnt_5ms++;
                    break;
                   //
                  default:
                  {
                      break;
                  }
            }
        // runs control ISR for motor 1
        runMotor1Control(motorHandle_M1);
        
} // End of while loop
 

 

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

    您好!

    我已经对 GPIO.c 文件运行比较、这两个文件之间没有明显的差异、这会影响 GPIO 切换行为。 函数将 GPIO_setMasterCore 重命名为 GPIO_setControllerCore、但该函数仅用于多核应用。  

    您能否检查代码中可能导致此问题的其他区域? 看起来您提供的代码片段来自我们的电机控制解决方案、该解决方案应该具有用于添加简单 GPIO 切换功能的合适基础

    此致、

    Peter

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有一个函数将 GPIO_setMasterCore 重命名为 GPIO_setControllerCore

    除了旧版 GPIO.c 之外、没有任何明显的区别、就是通过直接调用来设置核心函数、而不是通过#define 指针在后来调用核心函数 C2KWare v3.05。 在后续示例代码版本中、我们将尝试在 LED5上直接进行状态控制切换、而不是切换 LED。 LED 闪烁速率是一个有用的调试工具、可指示 C 代码主 ISR 的行为是否符合预期。  

    //
    //
    // GPIO_setMasterCore
    //
    //
    空洞
    GPIO_setMasterCore (uint32_t 引脚、GPIO_CoreSelect 内核)

    }

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

    尊敬的 Peter:

    奇怪的是、它是 CPU 计时器1中断导致更快的 GPIO 切换速率突然停止。 必须在驱动开关情况的较低 while 环路中禁用 CPU 计时器。 并增加 LED5间隔计数、直接切换 GPIO 状态以补偿快得多的 while 循环服务例程。 感谢您检查 GPIO 切换调用。

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

    您好!

    感谢您跟进您的错误解决方案。 我现在更好地理解您提供的代码。 只有当 CPU 不处理任何中断和后台任务时、LOOP 较低优先级的才会运行。 在固件执行中、没有空闲时间执行代码来切换 GPIO。 如果有更多的调试 GPIO、最好在其他中断和后台任务中对 GPIO 进行性能分析、以便了解执行这些 GPIO 所需的时间。

    此致、

    Peter

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

    尊敬的 Peter:

    您似乎忽略了在先前的示例软件 while 循环中相同的 GPIO 切换代码在 CPU 计时器1中的运行情况。 当 while 循环在切换情况和最后一个函数调用结束时返回、似乎出现了 GPIO 切换返回地址未从堆栈中弹出的堆栈推入弹出问题。 SCIB TX/RX ISR 均优先于21µs (main.c) ISR、非常快速的中断。 检查两个项目中的堆栈大小是否相似。