用原廠的例程 UART1,把串口改成中斷方式接收,并且串口1改成串口3(串口1用作日志打印),發(fā)現(xiàn)串口3在中斷時若調(diào)用printf打印log,則串口3中斷接收的數(shù)據(jù)會出錯,沒有調(diào)用printf的話是沒有問題的
int main()
{
? ? UINT8 len;
? ??
/* 配置串口1:先配置IO口模式,再配置串口 */? ?
? ? GPIOA_SetBits(GPIO_Pin_9);
? ? GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);// RXD-配置上拉輸入
? ? GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);// TXD-配置推挽輸出,注意先讓IO口輸出高電平
? ? UART1_DefInit();
? ??
#if 1? ? ? ?// 測試串口發(fā)送字符串
? ? UART1_SendString( TxBuff, sizeof(TxBuff) );
#endif? ?
#if 0? ? ? ?// 查詢方式:接收數(shù)據(jù)后發(fā)送出去
? ? while(1)
? ? {
? ? ? ? len = UART1_RecvString(RxBuff);
? ? ? ? if( len )
? ? ? ? {
? ? ? ? ? ? UART1_SendString( RxBuff, len );? ? ? ? ? ??
? ? ? ? }
? ? }
? ??
#endif? ??
#if 1? ? ? // 中斷方式:接收數(shù)據(jù)后發(fā)送出去
//? ? UART1_ByteTrigCfg( UART_7BYTE_TRIG );
//? ? trigB = 7;
//? ? UART1_INTCfg( ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT );
//? ? NVIC_EnableIRQ( UART1_IRQn );
//uart tx io
? ? GPIOA_SetBits(bTXD3);
? ? GPIOA_ModeCfg(bTXD3, GPIO_ModeOut_PP_5mA);
? ? //uart rx io
? ? GPIOA_SetBits(bRXD3);
? ? GPIOA_ModeCfg(bRXD3, GPIO_ModeIN_PU);
? ??
? ? //uart3 init
? ? UART3_DefInit( );
? ??
? ? //enable interupt
//trigB = 7;
//UART3_INTCfg( ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT );
//NVIC_SetPriority(UART3_IRQn, 5);
//NVIC_EnableIRQ( UART3_IRQn );
UART3_ByteTrigCfg( UART_7BYTE_TRIG );
trigB = 7;
UART3_INTCfg( ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT );
NVIC_EnableIRQ( UART3_IRQn );
#endif? ??
? ? while(1);? ??
}
void UART3_IRQHandler(void)
{
? ? UINT8 i;
? ? switch( UART3_GetITFlag() )
? ? {
? ? ? ? case UART_II_LINE_STAT:? ? ? ? // 線路狀態(tài)錯誤
? ? ? ? ? ? UART3_GetLinSTA();
? ? ? ? ? ? break;
? ? ? ??
? ? ? ? case UART_II_RECV_RDY:? ? ? ? ? // 數(shù)據(jù)達到設(shè)置觸發(fā)點
//PRINT("0 R8_UART3_RFC : %d \n", R8_UART3_RFC);
for(i = 0; i != trigB; i++) {
RxBuff[i] = UART3_RecvByte();
UART3_SendByte(RxBuff[i]);
}
//PRINT("0 RDY -- i : %d \n", i);
break;
? ? ? ??
? ? ? ? case UART_II_RECV_TOUT:? ? ? ? ?// 接收超時,暫時一幀數(shù)據(jù)接收完成
//PRINT("1 R8_UART3_RFC : %d \n", R8_UART3_RFC);
i = UART3_RecvString(RxBuff);
UART3_SendString( RxBuff, i );
//PRINT("1 TOUT -- i : %d \n", i);
? ? ? ? ? ? break;
? ? ? ??
? ? ? ? case UART_II_THR_EMPTY:? ? ? ? ?// 發(fā)送緩存區(qū)空,可繼續(xù)發(fā)送
? ? ? ? ? ? break;
? ? ? ??
? ? ? ? case UART_II_MODEM_CHG:? ? ? ? ?// 只支持串口0
? ? ? ? ? ? break;
? ? ? ??
? ? ? ? default:
? ? ? ? ? ? break;
? ? }
}
測試發(fā)現(xiàn) 只要在 UART_II_RECV_RDY 里調(diào)用PRINT("0 RDY -- i : %d \n", i); 數(shù)據(jù)就會出錯