//Interrupt function for the rs485 module void RS485_IRQHandler(void) { if(UART_ReceiveByte((LPC_UART_TypeDef *) LPC_UART1) != 0x01){ return; } UART_RS485ReceiverCmd(LPC_UART1, ENABLE); UART_Receive((LPC_UART_TypeDef *) LPC_UART1, received_data, 10, BLOCKING); if((memcmp (&received_data[4], Net_settings.MAC_Address.addr, 6) == 0)||memcmp (&received_data[4], broadcast_mac, 6) == 0){ received_len = 0; received_len |= (received_data[0] << 24); received_len |= (received_data[1] << 16); received_len |= (received_data[2] << 8); received_len |= (received_data[3]); if(rs485_buffer != NULL){ free(rs485_buffer); rs485_buffer = NULL; } rs485_buffer = malloc(received_len); if(rs485_buffer == NULL){printf("rs485:malloc failed\r\n");} memmove(rs485_buffer,&received_data[4],6); GPDMA_Channel_CFG_Type GPDMAChannelConfig; GPDMAChannelConfig.ChannelNum = 0; GPDMAChannelConfig.TransferSize = received_len - 6; GPDMAChannelConfig.DstMemAddr = (uint32_t)(&rs485_buffer[5]); GPDMAChannelConfig.TransferType = GPDMA_TRANSFERTYPE_P2M; GPDMAChannelConfig.SrcConn = GPDMA_CONN_UART1_Rx; GPDMAChannelConfig.DMALLI = 0; if(GPDMA_Setup(&GPDMAChannelConfig) == ERROR){printf("dma error\r\n");} GPDMA_ChannelCmd(0, ENABLE); NVIC_DisableIRQ (UART1_IRQn); NVIC_EnableIRQ (DMA_IRQn); }else{ UART_RS485ReceiverCmd(LPC_UART1, DISABLE); } } void DMA_IRQHandler(void){ if (GPDMA_IntGetStatus(GPDMA_STAT_INT, 0)){ // Check counter terminal status if(GPDMA_IntGetStatus(GPDMA_STAT_INTTC, 0)){ // Clear terminate counter Interrupt pending GPDMA_ClearIntPending (GPDMA_STATCLR_INTTC, 0); poll_eth_RS485_driver(); } // Check error terminal status if (GPDMA_IntGetStatus(GPDMA_STAT_INTERR, 0)){ // Clear error counter Interrupt pending GPDMA_ClearIntPending (GPDMA_STATCLR_INTERR, 0); free(rs485_buffer); rs485_buffer = NULL; printf("rs485: DMA error\n\r"); } } GPDMA_ChannelCmd(0, DISABLE); UART_RS485ReceiverCmd(LPC_UART1, DISABLE); NVIC_EnableIRQ (UART1_IRQn); } |