我无法在运行uC / OS-III的恩智浦LPC1857上获得LED运行平稳的PWM信号。只有当我禁用在1ms运行的OS systick时,才会出现常规闪烁停止。
我已经设置了4个匹配寄存器,每种颜色一个(红色,绿色,蓝色),一个用于整个时间段。前三个匹配输出清除每种颜色的物理输出引脚。最后一个周期匹配会生成一个中断,以设置下一个周期的所有三个颜色输出。
我尝试在timer0中断期间通过在中断周围添加以下代码来禁用OS的中断:
{{1}}
有谁知道为什么systick会导致PWM信号闪烁?
答案 0 :(得分:0)
您不应该使用OS_CRITICAL_ENTER()和OS_CRITICAL_EXIT()。相反,您应该使用CPU_CRITICAL()和CPU_CRITICAL_EXIT()来禁用关键部分中的中断。
此外,此ISR不会发出任何任务信号,因此您不需要调用OSIntEnter()和OSIntExit()。我相信你的代码应该只是:
void TIMER0_IRQHandler(void)
{
if (Chip_TIMER_MatchPending(PWM_TIMER, PWM_RED))
{
Chip_TIMER_ClearMatch(PWM_TIMER, PWM_RED);
PWM_TIMER->EMR &= ~(((uint32_t) 0x01) << PWM_RED);
}
if (Chip_TIMER_MatchPending(PWM_TIMER, PWM_GREEN))
{
Chip_TIMER_ClearMatch(PWM_TIMER, PWM_GREEN);
PWM_TIMER->EMR &= ~(((uint32_t) 0x01) << PWM_GREEN);
}
if (Chip_TIMER_MatchPending(PWM_TIMER, PWM_BLUE))
{
Chip_TIMER_ClearMatch(PWM_TIMER, PWM_BLUE);
PWM_TIMER->EMR &= ~(((uint32_t) 0x01) << PWM_BLUE);
}
if (Chip_TIMER_MatchPending(PWM_TIMER, PWM_MATCH))
{
Chip_TIMER_ClearMatch(PWM_TIMER, PWM_MATCH);
PWM_TIMER->EMR |= (((uint32_t) 0x01) << PWM_RED);
PWM_TIMER->EMR |= (((uint32_t) 0x01) << PWM_GREEN);
PWM_TIMER->EMR |= (((uint32_t) 0x01) << PWM_BLUE);
}
}
让
答案 1 :(得分:0)
最后找到了解决方案,虽然我不完全理解为什么:P。
除了PWM任务之外,从我自己的任务中完全剥离操作系统之后,问题仍然存在。所以我回到了计时器代码。
为了消除闪烁,我唯一需要添加的是在我获得周期中断后重置计时器:
旧:
if (Chip_TIMER_MatchPending(PWM_TIMER, PWM_MATCH))
{
Chip_TIMER_ClearMatch(PWM_TIMER, PWM_MATCH);
PWM_TIMER->EMR |= (((uint32_t) 0x01) << PWM_RED);
PWM_TIMER->EMR |= (((uint32_t) 0x01) << PWM_GREEN);
PWM_TIMER->EMR |= (((uint32_t) 0x01) << PWM_BLUE);
}
新:
if (Chip_TIMER_MatchPending(PWM_TIMER, PWM_MATCH))
{
Chip_TIMER_ClearMatch(PWM_TIMER, PWM_MATCH);
PWM_TIMER->EMR |= (((uint32_t) 0x01) << PWM_RED);
PWM_TIMER->EMR |= (((uint32_t) 0x01) << PWM_GREEN);
PWM_TIMER->EMR |= (((uint32_t) 0x01) << PWM_BLUE);
Chip_TIMER_Reset(PWM_TIMER);
}
有人可以解释为什么需要重置吗?
我希望以下行能解决这个问题(这是我的初始化例程):
Chip_TIMER_ResetOnMatchEnable(PWM_TIMER, PWM_MATCH);