用原厂的例程 UART1,把串口改成中断方式接收,并且串口1改成串口3(串口1用作日志打印),发现串口3在中断时若调用printf打印log,则串口3中断接收的数据会出错,没有调用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 // 测试串口发送字符串
UART1_SendString( TxBuff, sizeof(TxBuff) );
#endif
#if 0 // 查询方式:接收数据后发送出去
while(1)
{
len = UART1_RecvString(RxBuff);
if( len )
{
UART1_SendString( RxBuff, len );
}
}
#endif
#if 1 // 中断方式:接收数据后发送出去
// 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: // 线路状态错误
UART3_GetLinSTA();
break;
case UART_II_RECV_RDY: // 数据达到设置触发点
//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: // 接收超时,暂时一帧数据接收完成
//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: // 发送缓存区空,可继续发送
break;
case UART_II_MODEM_CHG: // 只支持串口0
break;
default:
break;
}
}
测试发现 只要在 UART_II_RECV_RDY 里调用PRINT("0 RDY -- i : %d \n", i); 数据就会出错