c - 用于 PWM 干扰的 uC/OS-III Systick 和外设定时器0

标签 c timer pwm ucos micrium

我在获取在运行 uC/OS-III 的 NXP LPC1857 上平稳运行的 LED 的 PWM 信号时遇到问题。仅当我禁用以 1ms 运行的操作系统 systick 时,定期发生的闪烁才会停止。

我已经用 4 个匹配寄存器设置了计时器,一个用于每种颜色(红、绿、蓝),一个用于整个周期。前三个匹配输出正在清除每种颜色的物理输出引脚。最后一个周期匹配会生成一个中断,以设置下一个周期的所有三种颜色输出。

我尝试通过在中断周围添加以下代码来在timer0中断期间禁用来自操作系统的中断:

void TIMER0_IRQHandler(void)
{
    CPU_SR_ALLOC();
    OS_CRITICAL_ENTER();
    OSIntEnter();
    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);
    }
    OS_CRITICAL_EXIT();
    OSIntExit();
}

有人知道为什么 systick 会导致 PWM 信号闪烁吗?

最佳答案

您不应该使用 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);
    }
}

关于c - 用于 PWM 干扰的 uC/OS-III Systick 和外设定时器0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36816519/

相关文章:

python - 从传感器读取方波信号

c - 初始化链接列表与数组所需的时间

c - 找到突变最多的最长回文 DNA 子序列

java - 监听器和计时器之间的通信

java - java中有没有时间跟踪/监控框架

timer - Arduino PWM 衰落由 avra 引导

c - 使用 C 字符串查找和替换

c - 我的代码无法将我输入的数据放入我的txt文件中,不知道我哪里做错了

android - Android activityView 中倒计时/计时器的后台任务

python - 运行时错误: No access to/dev/mem