CH579 串口接收問題

用原廠的例程 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ù)就會出錯

RJ7@4XAHP}7%0JDGGEX9~0J.png


5Q(G5X7A7240IOJO767WM2M.png

官網(wǎng)的例程中,PRINT的實現(xiàn)是 阻塞的,而不是異步的.

這意味著,打印是很耗時的,基本上取決于串口的速率.


建議:

1,打印的數(shù)據(jù)盡量的少


2,適當(dāng)?shù)奶岣叽蛴〉乃俾?初始化UART1時候,再執(zhí)行一次設(shè)置速率為更塊的函數(shù),比如用500K:?? ? UART1_BaudRateCfg( 5E5); )


3,降低uart3 的速率,給打印留時間


好的 非常感謝你的回復(fù)


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频