串口接收
串口接收空闲中断+DMA
static void Receive_DataPack(void)
{
usart_interrupt_disable(EVAL_COM2, USART_INT_IDLE);
dma_channel_disable(EVAL_COM2_DMA, EVAL_COM2_RX_DMA_CH);/* 暂时关闭dma,数据尚未处理, 关闭DMA ,防止干扰 */
dma_flag_clear(EVAL_COM2_DMA, EVAL_COM2_RX_DMA_CH, DMA_FLAG_FTF); /* 清DMA标志位 */
modbus.recount = CMD_MAX_SIZE-dma_transfer_number_get(EVAL_COM2_DMA, EVAL_COM2_RX_DMA_CH); //接收到数据个数
dma_transfer_number_config(EVAL_COM2_DMA,EVAL_COM2_RX_DMA_CH, CMD_MAX_SIZE); /* 重新赋值计数值,必须大于等于最大可能接收到的数据帧数目 */
dma_channel_enable(EVAL_COM2_DMA, EVAL_COM2_RX_DMA_CH); /* 此处应该在处理完数据再打开,如在 DataPack_Process() 打开*/
usart_interrupt_enable(EVAL_COM2, USART_INT_IDLE);
}
void EVAL_COM2_IRQHandler(void)
{
if (usart_interrupt_flag_get(EVAL_COM2, USART_INT_FLAG_IDLE) != RESET) //进入一次中断,说明接收到一帧指令
{
//usart_interrupt_flag_clear(EVAL_COM2,USART_INT_FLAG_IDLE);
usart_data_receive(EVAL_COM2); /*注意,必须读数据才能清空标志位*/
Receive_DataPack();
modbus.reflag = 1;
}
}
使用usart_interrupt_flag_clear(EVAL_COM2,USART_INT_FLAG_IDLE); 并不能清除空闲中断标志USART_INT_FLAG_IDLE,必须读取数据usart_data_receive(EVAL_COM2);