bool
UART_Putc( c, delay)
{
if( QU_IsEmpty(&TxQu_Uart1) )
{
if( !(UART1->FR & UART_FR_TXFF_MASK) ) {
UART1->DR = c;
return true;
}
}
if( !QU_IsFull(&TxQu_Uart1) ) ---> 若這時中斷產生,跳躍至IRQ handler,IRQ handler將
{ Queue的資料填入UART FIFO, 所填入的資料量依舊無
taskENTER_CRITICAL(); 法使INT flag清除, 所以只好強制清除INT flag.
QU_Append(&TxQu_Uart1, c); 問題出現,把資料Append至Queue後,這時再也不會產
taskEXIT_CRITICAL(); 生中斷。 再次再進入UART_Putc便不會把資料Put至
return true; FIFO, 而是放到Queue。----> UART function failed.
}
} /* UART_Putc */
P.S.
清除UART INT flag的方式,
I. 填入UART FIFO的資料大於INT trigger level.
Ex: trigger level == 8,則當中斷發生的時候,FIFO所buffer的資料已小於8,這時必須將FIFO的資料填入超過8,方可清除INT flag。
II. UART1->ICR = UART_ICR_TXIC_MASK; /* Clear interruption flag. */
No comments:
Post a Comment