コード例 #1
0
ファイル: serial_device.c プロジェクト: toyowata/mbed
static void uart_irq(UARTName uart_name)
{
    int8_t id = get_uart_index(uart_name);

    if (id >= 0) {
        UART_HandleTypeDef *huart = &uart_handlers[id];
        if (serial_irq_ids[id] != 0) {
            if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) {
                if (__HAL_UART_GET_IT(huart, UART_IT_TXE) != RESET) {
                    irq_handler(serial_irq_ids[id], TxIrq);
                }
            }
            if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) {
                if (__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESET) {
                    irq_handler(serial_irq_ids[id], RxIrq);
                    /* Flag has been cleared when reading the content */
                }
            }
            if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
                if (__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET) {
                    __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
                }
            }
        }
    }
}
コード例 #2
0
ファイル: stm32l0xx_it.c プロジェクト: tttqbf/balance
/**
* @brief This function handles USART1 global interrupt / USART1 wake-up interrupt through EXTI line 25.
*/
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
	uint8_t Res;
	uint16_t len=0;
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
	if(update==0)
	{
    if(__HAL_UART_GET_IT(&huart1, UART_IT_RXNE) != RESET)//接收到中断(接收到的数据必须是0x0d 0x0a结尾)  
    {
          USART1->RQR |= 0x08;//?? RXNE
          Res =USART1->RDR;//USARTx_RX_Data(&UartHandle);
       if((USART_RX_STA&0x8000)==0)//接收未完成
       {
          if(USART_RX_STA&0x4000)//接收到了0x0d
					{
							if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
							else USART_RX_STA|=0x8000; //接收完成       
					}
          else //还没有接受到0X0D
          { 
							if(Res==0x0d)USART_RX_STA|=0x4000;
							else
							{
									if(Res != 0x00)
									{
										USART_RX_BUF1[USART_RX_STA&0X3FFF]=Res ;
										USART_RX_STA++;
										if(USART_RX_STA>49)USART_RX_STA=0;// 接收数据错误,重新开始接收   
									}
						 }         
          }
       }  
    } 
	}
	else
	{
		if(__HAL_UART_GET_IT(&huart1, UART_IT_RXNE) != RESET)//接收到中断(接收到的数据必须是0x0d 0x0a结尾)  
    {
          USART1->RQR |= 0x08;//?? RXNE
          Res =USART1->RDR;//USARTx_RX_Data(&UartHandle);
					if(USART_RX_CNT<USART_REC_LEN)
					{
							if(Res != 0x00)
							{
									USART_RX_BUF[USART_RX_CNT]=Res;
									USART_RX_CNT++;	
							}		 									     
					}	  
    }   
	}
	HAL_NVIC_ClearPendingIRQ(USART1_IRQn);
  /* USER CODE END USART1_IRQn 1 */
}
コード例 #3
0
void USART6_IRQHandler(void) {
  volatile int8_t value;

  if (__HAL_UART_GET_IT(&UartHandle6, UART_IT_RXNE) != RESET) {
    // wenn ein Byte im Empfangspuffer steht
    value = (int8_t)((USART6->RDR) & 0xFF);
    // if(dataokold==dataok) return;
    if (rxrdy == 0)
      return;
    if (count1 == 0) {
      dataok = 0;
      if (value != 85)
        return; // wait for startpattern 0x55
      else
        rx_oldptr6 = rx_wr_ptr6;
    }
    rx_buf6[rx_wr_ptr6] = value; // byte speichern
    count1++;
    ++rx_wr_ptr6;
    if (rx_wr_ptr6 >= RX_BUF_SIZE - 6) { // ring buffer
      rx_wr_ptr6 = 0;
    }
    if (count1 == 6) {
      count1 = 0;
      if (value != 160)
        return; // no end- pattern 0xAA
      else {
        dataok = 1;
        return;
      }
    }
  }
}
コード例 #4
0
ファイル: stm32l0xx_it.c プロジェクト: tttqbf/balance
/**
* @brief This function handles USART2 global interrupt / USART2 wake-up interrupt through EXTI line 26.
*/
void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */
		uint8_t Res;
  /* USER CODE END USART2_IRQn 0 */
  HAL_UART_IRQHandler(&huart2);
  /* USER CODE BEGIN USART2_IRQn 1 */
    if(__HAL_UART_GET_IT(&huart2, UART_IT_RXNE) != RESET)//接收到中断(接收到的数据必须是0x0d 0x0a结尾)  
    {
          USART2->RQR |= 0x08;//?? RXNE
          Res =USART2->RDR;//USARTx_RX_Data(&UartHandle);
       if((USART_RX_STA2&0x8000)==0)//接收未完成
       {
          if(USART_RX_STA2&0x4000)//接收到了0x0d
					{
							if(Res!=0x0a)USART_RX_STA2=0;//接收错误,重新开始
							else USART_RX_STA2|=0x8000; //接收完成       
					}
          else //还没有接受到0X0D
          { 
							if(Res==0x0d)USART_RX_STA2|=0x4000;
							else
							{
									USART_RX_BUF2[USART_RX_STA2&0X3FFF]=Res ;
									USART_RX_STA2++;
									if(USART_RX_STA2>(USART_REC_LEN-1))USART_RX_STA2=0;// 接收数据错误,重新开始接收        
						 }         
          }
       }  
    } 
    HAL_NVIC_ClearPendingIRQ(USART2_IRQn); 
  /* USER CODE END USART2_IRQn 1 */
}
コード例 #5
0
ファイル: uart.c プロジェクト: nroychowdhury/lk
int uart_pgetc(int port)
{
  if ((__HAL_UART_GET_IT(&handle, UART_IT_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&handle, UART_IT_RXNE) != RESET)) {
      uint8_t c = (uint8_t)(handle.Instance->RDR & 0xff);
      return c;
  }
  return -1;
}
コード例 #6
0
ファイル: uart.c プロジェクト: nroychowdhury/lk
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);
}
コード例 #7
0
ファイル: uart.c プロジェクト: far-far-away-science/hab-v2
void UART_ProcessStatus(UART_HandleTypeDef* pUart) {
    /* UART parity error interrupt occurred ------------------------------------*/
    if ((__HAL_UART_GET_IT(pUart, UART_IT_PE) != RESET) &&
        (__HAL_UART_GET_IT_SOURCE(pUart, UART_IT_PE) != RESET))
    {
        __HAL_UART_CLEAR_IT(pUart, UART_CLEAR_PEF);
        pUart->ErrorCode |= HAL_UART_ERROR_PE;
    }
    /* UART frame error interrupt occurred --------------------------------------*/
    if ((__HAL_UART_GET_IT(pUart, UART_IT_FE) != RESET) &&
        (__HAL_UART_GET_IT_SOURCE(pUart, UART_IT_ERR) != RESET))
    {
        __HAL_UART_CLEAR_IT(pUart, UART_CLEAR_FEF);
        pUart->ErrorCode |= HAL_UART_ERROR_FE;
    }
    /* UART noise error interrupt occurred --------------------------------------*/
    if ((__HAL_UART_GET_IT(pUart, UART_IT_NE) != RESET) &&
        (__HAL_UART_GET_IT_SOURCE(pUart, UART_IT_ERR) != RESET))
    {
        __HAL_UART_CLEAR_IT(pUart, UART_CLEAR_NEF);
        pUart->ErrorCode |= HAL_UART_ERROR_NE;
    }
    /* UART Over-Run interrupt occurred -----------------------------------------*/
    if ((__HAL_UART_GET_IT(pUart, UART_IT_ORE) != RESET) &&
        (__HAL_UART_GET_IT_SOURCE(pUart, UART_IT_ERR) != RESET))
    {
        __HAL_UART_CLEAR_IT(pUart, UART_CLEAR_OREF);
        pUart->ErrorCode |= HAL_UART_ERROR_ORE;
    }

    /* Call UART Error Call back function if need be --------------------------*/
    if (pUart->ErrorCode != HAL_UART_ERROR_NONE)
    {
        HAL_UART_ErrorCallback(pUart);
    }

    /* UART Wake Up interrupt occurred ------------------------------------------*/
    if ((__HAL_UART_GET_IT(pUart, UART_IT_WUF) != RESET) &&
        (__HAL_UART_GET_IT_SOURCE(pUart, UART_IT_WUF) != RESET))
    {
        __HAL_UART_CLEAR_IT(pUart, UART_CLEAR_WUF);
        HAL_UARTEx_WakeupCallback(pUart);
    }
}
コード例 #8
0
void UART7_IRQHandler(void) {
  volatile uint8_t value;

  if (__HAL_UART_GET_IT(&UartHandle7, UART_IT_RXNE) != RESET) {
    // wenn ein Byte im Empfangspuffer steht
    value = (uint8_t)(UART7->RDR & 0xFF);
    // byte speichern
    rx_buf7[rx_wr_ptr7] = value;
    rx_wr_ptr7++;
    if (rx_wr_ptr7 >= RX_BUF_SIZE)
      rx_wr_ptr7 = 0;
  }
}
コード例 #9
0
ファイル: drv_usart.c プロジェクト: heyuanjie87/rt-thread
void USART3_IRQHandler(void)
{
    struct stm32_uart *uart;

    uart = &uart3;

    /* enter interrupt */
    rt_interrupt_enter();

    /* UART in mode Receiver ---------------------------------------------------*/
    if ((__HAL_UART_GET_IT(&uart->UartHandle, UART_IT_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&uart->UartHandle, UART_IT_RXNE) != RESET))
    {
        rt_hw_serial_isr(&serial3, RT_SERIAL_EVENT_RX_IND);
        /* Clear RXNE interrupt flag */
        __HAL_UART_SEND_REQ(&uart->UartHandle, UART_RXDATA_FLUSH_REQUEST);
    }
    /* leave interrupt */
    rt_interrupt_leave();
}
コード例 #10
0
void USART1_IRQHandler(void) {
  volatile uint8_t value;

  if (__HAL_UART_GET_IT(&UartHandle1, UART_IT_RXNE) != RESET) {
    // wenn ein Byte im Empfangspuffer steht
    value = (uint8_t)(USART1->RDR & 0xFF);
    // byte speichern
    if (rx_select == 0) // ** WK
      rx_buf1[rx_wr_ptr1] = value;
    else                           // **
      rx_buf2[rx_wr_ptr1] = value; // **
    rx_wr_ptr1++;
    if (rx_wr_ptr1 >= RX_BUF_SIZE) {
      rx_rdy = 1;
      rx_wr_ptr1 = 0;
      if (rx_select == 0)
        rx_select = 1; // **
      else
        rx_select = 0; // **
    }
  }
}
コード例 #11
0
ファイル: uart.c プロジェクト: far-far-away-science/hab-v2
bool UART_GetCharacter(UART_HandleTypeDef* pUart, uint8_t* pChar) {
    UART_ProcessStatus(pUart);

    /* UART in mode Receiver ---------------------------------------------------*/
    if((__HAL_UART_GET_IT(pUart, UART_IT_RXNE) != RESET) &&
       (__HAL_UART_GET_IT_SOURCE(pUart, UART_IT_RXNE) != RESET))
    {
        if((pUart->gState == HAL_UART_STATE_BUSY_RX) || (pUart->gState == HAL_UART_STATE_BUSY_TX_RX))
        {
            *pChar = (uint8_t) (pUart->Instance->RDR & (uint8_t) pUart->Mask);
            return true;
        }
        else
        {
            return false;
        }
    }
    else
    {
        return false;
    }
}
コード例 #12
0
/**
  * @brief This function handles UART interrupt request.
  * @param huart: uart handle
  * @retval None
  */
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
{
  /* UART parity error interrupt occurred -------------------------------------*/
  if((__HAL_UART_GET_IT(huart, UART_IT_PE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_PE) != RESET))
  { 
    __HAL_UART_CLEAR_IT(huart, UART_CLEAR_PEF);
    
    huart->ErrorCode |= HAL_UART_ERROR_PE;
    /* Set the UART state ready to be able to start again the process */
    huart->State = HAL_UART_STATE_READY;
  }
  
  /* UART frame error interrupt occured --------------------------------------*/
  if((__HAL_UART_GET_IT(huart, UART_IT_FE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESET))
  { 
    __HAL_UART_CLEAR_IT(huart, UART_CLEAR_FEF);
    
    huart->ErrorCode |= HAL_UART_ERROR_FE;
    /* Set the UART state ready to be able to start again the process */
    huart->State = HAL_UART_STATE_READY;
  }
  
  /* UART noise error interrupt occured --------------------------------------*/
  if((__HAL_UART_GET_IT(huart, UART_IT_NE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESET))
  { 
    __HAL_UART_CLEAR_IT(huart, UART_CLEAR_NEF);
    
    huart->ErrorCode |= HAL_UART_ERROR_NE;    
    /* Set the UART state ready to be able to start again the process */
    huart->State = HAL_UART_STATE_READY;
  }
  
  /* UART Over-Run interrupt occured -----------------------------------------*/
  if((__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESET))
  { 
    __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
    
    huart->ErrorCode |= HAL_UART_ERROR_ORE;     
    /* Set the UART state ready to be able to start again the process */
    huart->State = HAL_UART_STATE_READY;
  }
  
   /* Call UART Error Call back function if need be --------------------------*/
  if(huart->ErrorCode != HAL_UART_ERROR_NONE)
  {
    HAL_UART_ErrorCallback(huart);
  }
  
#if !defined(STM32F030x6) && !defined(STM32F030x8)  
  /* UART wakeup from Stop mode interrupt occurred -------------------------------------*/
  if((__HAL_UART_GET_IT(huart, UART_IT_WUF) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_WUF) != RESET))
  { 
    __HAL_UART_CLEAR_IT(huart, UART_CLEAR_WUF);
    /* Set the UART state ready to be able to start again the process */
    huart->State = HAL_UART_STATE_READY;
    HAL_UART_WakeupCallback(huart);
  }
#endif /* !defined(STM32F030x6) && !defined(STM32F030x8) */
  
  /* UART in mode Receiver ---------------------------------------------------*/
  if((__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE) != RESET))
  { 
    UART_Receive_IT(huart);
    /* Clear RXNE interrupt flag */
    __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
  }
  

  /* UART in mode Transmitter ------------------------------------------------*/
 if((__HAL_UART_GET_IT(huart, UART_IT_TC) != RESET) &&(__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC) != RESET))
  {
    UART_Transmit_IT(huart);
  } 
  
}
コード例 #13
0
ファイル: serial_device.c プロジェクト: toyowata/mbed
/**
 * The asynchronous TX and RX handler.
 *
 * @param obj The serial object
 * @return Returns event flags if a TX/RX transfer termination condition was met or 0 otherwise
 */
int serial_irq_handler_asynch(serial_t *obj)
{
    struct serial_s *obj_s = SERIAL_S(obj);
    UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];

    volatile int return_event = 0;
    uint8_t *buf = (uint8_t *)(obj->rx_buff.buffer);
    uint8_t i = 0;

    // TX PART:
    if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TC) != RESET) {
        if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC) != RESET) {
            // Return event SERIAL_EVENT_TX_COMPLETE if requested
            if ((obj_s->events & SERIAL_EVENT_TX_COMPLETE) != 0) {
                return_event |= (SERIAL_EVENT_TX_COMPLETE & obj_s->events);
            }
        }
    }

    // Handle error events
    if (__HAL_UART_GET_FLAG(huart, UART_FLAG_PE) != RESET) {
        if (__HAL_UART_GET_IT(huart, UART_IT_PE) != RESET) {
            return_event |= (SERIAL_EVENT_RX_PARITY_ERROR & obj_s->events);
        }
    }

    if (__HAL_UART_GET_FLAG(huart, UART_FLAG_FE) != RESET) {
        if (__HAL_UART_GET_IT(huart, UART_IT_FE) != RESET) {
            return_event |= (SERIAL_EVENT_RX_FRAMING_ERROR & obj_s->events);
        }
    }

    if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
        if (__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET) {
            return_event |= (SERIAL_EVENT_RX_OVERRUN_ERROR & obj_s->events);
        }
    }

    HAL_UART_IRQHandler(huart);

    // Abort if an error occurs
    if ((return_event & SERIAL_EVENT_RX_PARITY_ERROR) ||
            (return_event & SERIAL_EVENT_RX_FRAMING_ERROR) ||
            (return_event & SERIAL_EVENT_RX_OVERRUN_ERROR)) {
        return return_event;
    }

    //RX PART
    if (huart->RxXferSize != 0) {
        obj->rx_buff.pos = huart->RxXferSize - huart->RxXferCount;
    }
    if ((huart->RxXferCount == 0) && (obj->rx_buff.pos >= (obj->rx_buff.length - 1))) {
        return_event |= (SERIAL_EVENT_RX_COMPLETE & obj_s->events);
    }

    // Check if char_match is present
    if (obj_s->events & SERIAL_EVENT_RX_CHARACTER_MATCH) {
        if (buf != NULL) {
            for (i = 0; i < obj->rx_buff.pos; i++) {
                if (buf[i] == obj->char_match) {
                    obj->rx_buff.pos = i;
                    return_event |= (SERIAL_EVENT_RX_CHARACTER_MATCH & obj_s->events);
                    serial_rx_abort_asynch(obj);
                    break;
                }
            }
        }
    }

    return return_event;
}