1.串口1初始化:
/* 配置串口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();
2.串口1中断初始化:
UART1_ByteTrigCfg(UART_7BYTE_TRIG); trigB = 7; UART1_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT); PFIC_EnableIRQ(UART1_IRQn);
3.中断服务函数:
__INTERRUPT __HIGH_CODE void UART1_IRQHandler(void) { volatile uint8_t i; switch(UART1_GetITFlag()) { case UART_II_LINE_STAT: // 线路状态错误 { UART1_GetLinSTA(); break; } case UART_II_RECV_RDY: // 数据达到设置触发点 for(i = 0; i != trigB; i++) { RxBuff[i] = UART1_RecvByte(); UART1_SendByte(RxBuff[i]); } break; case UART_II_RECV_TOUT: // 接收超时,暂时一帧数据接收完成 i = UART1_RecvString(RxBuff); UART1_SendString(RxBuff, i); break; case UART_II_THR_EMPTY: // 发送缓存区空,可继续发送 break; case UART_II_MODEM_CHG: // 只支持串口0 break; default: break; } }
例程中的逻辑是中断接收到数据后通过串口1发送出去。
例程中设置触发点为7字节,当fifo中有7字节数据时则触发UART_II_RECV_RDY中断,若fifo中不满7字节,且传输四个字节的时间没有数据,则会触发UART_II_RECV_TOUT中断,若发送端数据一直在发送,则不会产生UART_II_RECV_TOUT中断。
那么如何判断一包数据结束呢,可以这样来实现,在UART_II_RECV_RDY中断中只收取触发点-1字节数据,这样最终一定会产生超时,进入超时中断则说明一包结束了。
标签:II,UART,UART1,中断,CH5XX,串口,超时,RECV From: https://www.cnblogs.com/risc5-ble/p/18270264