any012 发表于 2018-11-22 09:43:55

请教,hal库的串口空闲中断怎么写?另,串口中断函数看...

void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
{
   uint32_t isrflags   = READ_REG(huart->Instance->SR);
   uint32_t cr1its   = READ_REG(huart->Instance->CR1);
   uint32_t cr3its   = READ_REG(huart->Instance->CR3);
   uint32_t errorflags = 0x00U;
   uint32_t dmarequest = 0x00U;

/* If no error occurs 没有校验错误、帧错误、过载错误、噪声错误*/
errorflags = (isrflags & (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE));
if(errorflags == RESET)
{
    /* UART in mode Receiver 如果接收非空标志置位,调用接收中断函数-------------------------------------------------*/
    if(((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
    {
      UART_Receive_IT(huart);
      return;
    }
}

/* If some errors occur 如果有错误,且CR3错误中断使能或CR1的非空中断或校验错误中断使能,不明白这里为什么加上非空中断*/
if((errorflags != RESET) && (((cr3its & USART_CR3_EIE) != RESET) || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET)))
{
    /* UART parity error interrupt occurred校验错误 ----------------------------------*/
    if(((isrflags & USART_SR_PE) != RESET) && ((cr1its & USART_CR1_PEIE) != RESET))
    {
      huart->ErrorCode |= HAL_UART_ERROR_PE;
    }

    /* UART noise error interrupt occurred 噪声错误-----------------------------------*/
    if(((isrflags & USART_SR_NE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
    {
      huart->ErrorCode |= HAL_UART_ERROR_NE;
    }

    /* UART frame error interrupt occurred 帧错误-----------------------------------*/
    if(((isrflags & USART_SR_FE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
    {
      huart->ErrorCode |= HAL_UART_ERROR_FE;
    }

    /* UART Over-Run interrupt occurred 过载错误--------------------------------------*/
    if(((isrflags & USART_SR_ORE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
    {
      huart->ErrorCode |= HAL_UART_ERROR_ORE;
    }

    /* Call UART Error Call back function if need be 调用错误处理回调函数--------------------------*/
    if(huart->ErrorCode != HAL_UART_ERROR_NONE)
    {
      /* UART in mode Receiver 这里不是和函数一开始那句重了吗?!-----------------------------------------------*/
      if(((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
      {
      UART_Receive_IT(huart);
      }

   ...
}
这个中断函数,先是判断串口SR寄存器有没有错误,没有错误的话,调用串口中断接收函数UART_Receive_IT(huart);
后面在SR寄存器有错误标识的情况下,进行了一堆判断,结果还是调用UART_Receive_IT(huart)这个函数?
第52行和第14行不是重了吗?

没有错误的情况下,如果处于接收状态,且接收非空标志被置位了,调用中断接收函数;
如果有错误,判断错误类型,如果处于接收状态,且接收非空标志被置位了,调用中断接收函数?

斜阳__ 发表于 2018-11-22 09:43:56

直接在it文件里在HAL库的中断处理之前加上空闲中断的处理

any012 发表于 2018-11-22 10:29:31

之后行吗?

发表于 2018-11-22 10:36:38

我理解的是,上面满足后就跳出了,如果上面不满足,会走下面的代码,处理UART_Receive_IT用的是同样的标志位,是不同的处理过程。

any012 发表于 2018-11-22 11:23:04

谢谢。

斜阳__ 发表于 2018-11-23 11:19:05

any012 发表于 2018-11-22 10:29
之后行吗?

建议放前边,自己的代码把空闲中断处理完就可以退出中断服务函数了,不需要再走HAL库的处理过程

likang1202 发表于 2019-10-21 11:22:49

官方给的串口中断程序

likang1202 发表于 2019-10-21 11:24:19

串口空闲中断
页: [1]
查看完整版本: 请教,hal库的串口空闲中断怎么写?另,串口中断函数看...