void stm32_USART1_IRQ(void) { bool resched = false; arm_cm_irq_entry(); /* UART parity error interrupt occurred -------------------------------------*/ if ((__HAL_UART_GET_IT(&handle, UART_IT_PE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&handle, UART_IT_PE) != RESET)) { __HAL_UART_CLEAR_PEFLAG(&handle); printf("UART PARITY ERROR\n"); } /* UART frame error interrupt occurred --------------------------------------*/ if ((__HAL_UART_GET_IT(&handle, UART_IT_FE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&handle, UART_IT_ERR) != RESET)) { __HAL_UART_CLEAR_FEFLAG(&handle); printf("UART FRAME ERROR\n"); } /* UART noise error interrupt occurred --------------------------------------*/ if ((__HAL_UART_GET_IT(&handle, UART_IT_NE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&handle, UART_IT_ERR) != RESET)) { __HAL_UART_CLEAR_NEFLAG(&handle); printf("UART NOISE ERROR\n"); } /* UART Over-Run interrupt occurred -----------------------------------------*/ if ((__HAL_UART_GET_IT(&handle, UART_IT_ORE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&handle, UART_IT_ERR) != RESET)) { __HAL_UART_CLEAR_OREFLAG(&handle); printf("UART OVERRUN ERROR\n"); } /* UART in mode Receiver ---------------------------------------------------*/ if ((__HAL_UART_GET_IT(&handle, UART_IT_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&handle, UART_IT_RXNE) != RESET)) { /* we got a character */ uint8_t c = (uint8_t)(handle.Instance->RDR & 0xff); if (cbuf_write_char(&uart1_rx_buf, c, false) != 1) { printf("WARNING: uart cbuf overrun!\n"); } resched = true; /* Clear RXNE interrupt flag */ __HAL_UART_SEND_REQ(&handle, UART_RXDATA_FLUSH_REQUEST); } /* UART in mode Transmitter ------------------------------------------------*/ if ((__HAL_UART_GET_IT(&handle, UART_IT_TXE) != RESET) &&(__HAL_UART_GET_IT_SOURCE(&handle, UART_IT_TXE) != RESET)) { ; } /* UART in mode Transmitter (transmission end) -----------------------------*/ if ((__HAL_UART_GET_IT(&handle, UART_IT_TC) != RESET) &&(__HAL_UART_GET_IT_SOURCE(&handle, UART_IT_TC) != RESET)) { ; } arm_cm_irq_exit(resched); }
/** * @brief 通讯用串口初始化 * @param hcomm : 句柄 * @param huart : 串口句柄 * @retval None */ void CommUsart_Init(CommUsartType *hcomm, UART_HandleTypeDef *huart) { hcomm->huart = huart; hcomm->tx_tc_flag = __HAL_DMA_GET_TC_FLAG_INDEX(huart->hdmatx); hcomm->offset = 0; __HAL_UART_CLEAR_OREFLAG(huart); //__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE); //__HAL_UART_ENABLE(huart); HAL_DMA_Start(huart->hdmarx, (u32)&huart->Instance->DR, (u32)hcomm->dma_rx_buffer, hcomm->buffer_size); huart->Instance->CR3 |= USART_CR3_DMAR; }
static void uart_irq(UARTName name, int id) { UartHandle.Instance = (USART_TypeDef *)name; if (serial_irq_ids[id] != 0) { if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TC) != RESET) { irq_handler(serial_irq_ids[id], TxIrq); __HAL_UART_CLEAR_FLAG(&UartHandle, UART_FLAG_TC); } if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_RXNE) != RESET) { irq_handler(serial_irq_ids[id], RxIrq); __HAL_UART_CLEAR_FLAG(&UartHandle, UART_FLAG_RXNE); } if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_ORE) != RESET) { __HAL_UART_CLEAR_OREFLAG(&UartHandle); } } }
static void TM_USART_INT_ClearAllFlags(USART_TypeDef* USARTx, IRQn_Type irq) { UART_Handle.Instance = USARTx; #ifdef __HAL_UART_CLEAR_PEFLAG __HAL_UART_CLEAR_PEFLAG(&UART_Handle); #endif #ifdef __HAL_UART_CLEAR_FEFLAG __HAL_UART_CLEAR_FEFLAG(&UART_Handle); #endif #ifdef __HAL_UART_CLEAR_NEFLAG __HAL_UART_CLEAR_NEFLAG(&UART_Handle); #endif #ifdef __HAL_UART_CLEAR_OREFLAG __HAL_UART_CLEAR_OREFLAG(&UART_Handle); #endif #ifdef __HAL_UART_CLEAR_IDLEFLAG __HAL_UART_CLEAR_IDLEFLAG(&UART_Handle); #endif /* Clear IRQ bit */ HAL_NVIC_ClearPendingIRQ(irq); }
void CommUartIrqHandler(UART_HandleTypeDef *huart) { uint32_t tmp_flag = 0, tmp_it_source = 0; tmp_flag = __HAL_UART_GET_FLAG(huart, UART_FLAG_PE); tmp_it_source = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_PE); /* UART parity error interrupt occurred ------------------------------------*/ if ((tmp_flag != RESET) && (tmp_it_source != RESET)) { __HAL_UART_CLEAR_PEFLAG(huart); huart->ErrorCode |= HAL_UART_ERROR_PE; } tmp_flag = __HAL_UART_GET_FLAG(huart, UART_FLAG_FE); tmp_it_source = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR); /* UART frame error interrupt occurred -------------------------------------*/ if ((tmp_flag != RESET) && (tmp_it_source != RESET)) { __HAL_UART_CLEAR_FEFLAG(huart); huart->ErrorCode |= HAL_UART_ERROR_FE; } tmp_flag = __HAL_UART_GET_FLAG(huart, UART_FLAG_NE); /* UART noise error interrupt occurred -------------------------------------*/ if ((tmp_flag != RESET) && (tmp_it_source != RESET)) { __HAL_UART_CLEAR_NEFLAG(huart); huart->ErrorCode |= HAL_UART_ERROR_NE; } tmp_flag = __HAL_UART_GET_FLAG(huart, UART_FLAG_ORE); /* UART Over-Run interrupt occurred ----------------------------------------*/ if ((tmp_flag != RESET) && (tmp_it_source != RESET)) { __HAL_UART_CLEAR_OREFLAG(huart); huart->ErrorCode |= HAL_UART_ERROR_ORE; } tmp_flag = __HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE); tmp_it_source = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE); /* UART in mode Receiver ---------------------------------------------------*/ if ((tmp_flag != RESET) && (tmp_it_source != RESET)) { CommUartRxIrqProcess(huart); } tmp_flag = __HAL_UART_GET_FLAG(huart, UART_FLAG_TXE); tmp_it_source = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_TXE); /* UART in mode Transmitter ------------------------------------------------*/ if ((tmp_flag != RESET) && (tmp_it_source != RESET)) { CommUartTxIrqProcess(huart); } tmp_flag = __HAL_UART_GET_FLAG(huart, UART_FLAG_TC); tmp_it_source = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC); /* UART in mode Transmitter end --------------------------------------------*/ if ((tmp_flag != RESET) && (tmp_it_source != RESET)) { } if (huart->ErrorCode != HAL_UART_ERROR_NONE) { /* Set the UART state ready to be able to start again the process */ huart->State = HAL_UART_STATE_READY; HAL_UART_ErrorCallback(huart); } }