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