2016-04-23 66 views
0

我有在獲得運行的uC/OS-III上的NXP LPC1857平穩運行的LED的PWM信號的麻煩。只有當我禁用以1ms運行的OS systick時,正常發生的閃爍停止。的uC/OS-III SYSTICK&爲PWM外設定時器0干擾

我已經建立了我的定時器有4個匹配寄存器,每一種顏色(紅,綠,藍)和一個完整的週期。前三個匹配輸出將清除每種顏色的物理輸出引腳。最後的週期匹配生成一箇中斷以設置下一個週期的所有三種顏色輸出。

我試圖通過添加以下代碼角落找尋中斷定時器0中斷期間禁用從OS中斷:

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(); 
} 

有沒有人有一個想法,爲什麼系統定時器可能導致的PWM信號閃爍?

+0

的CPU頻率設置爲180MHz的這不應導致任何麻煩定時器percerheral我會想? – Futience

回答

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); 
} 

有人可以解釋爲什麼這個重置是必要的嗎?

我期待下面的行會照顧的(這是我的初始化程序):所以用一個系統定時器中斷每1ms

Chip_TIMER_ResetOnMatchEnable(PWM_TIMER, PWM_MATCH); 
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); 
    } 
} 

+0

感謝您的回覆。我從上面提到的代碼開始,在定時器中斷之前和之後都沒有調用OS特定的函數。但是不知何故,當操作系統運行時,定時器的輸出會受到影響,我無法找到發生這種情況的原因。添加操作系統功能也沒有幫助,但是是我擁有的最後一個地位。 – Futience

+0

一旦禁用了systick處理程序中的OS功能,定時器就會完美運行。有沒有人知道從哪裏開始尋找運行操作系統時遇到的問題? – Futience

+0

今天我再次嘗試找到這個神祕問題的原因。 不幸的是沒有成功。當我測量活動通道時,我可以看到幾乎每秒都會出現的短暫「活動」脈衝,脈衝之間有相當精確的1秒週期。這些脈衝是我注意到的閃光,當我看着LED時,這些閃光幾乎每秒都在發生。每當我禁用其中一個通道的定時器輸出時,該通道在1秒間隔內也不會有這個脈衝,但會像我所期望的那樣保持不活動狀態。有人知道還有什麼可以嘗試的? – Futience