硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3710|回复: 9
收起左侧

[UART] STM32H7的HAL库串口中断服务程序里面的串口FIFO发送空中断处理估计是手抖多写出来的一个处理

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2018-11-15 01:42:50 | 显示全部楼层 |阅读模式
这个地方的确有些莫名其妙,串口HAL里面全程无发送FIFO空中断使能,中断里面搞了一个检测。

后面再深入研究下是不是手抖造成的。


  1. /**
  2.   * @brief Handle UART interrupt request.
  3.   * @param huart: UART handle.
  4.   * @retval None
  5.   */
  6. void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
  7. {
  8.   uint32_t isrflags   = READ_REG(huart->Instance->ISR);
  9.   uint32_t cr1its     = READ_REG(huart->Instance->CR1);
  10.   uint32_t cr3its     = READ_REG(huart->Instance->CR3);
  11.   uint32_t errorflags;

  12.   /* If no error occurs */
  13.   errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE));
  14.   if (errorflags == RESET)
  15.   {
  16.     /* UART in mode Receiver ---------------------------------------------------*/
  17.     if(((isrflags & USART_ISR_RXNE) != RESET)
  18.      && (   ((cr1its & USART_CR1_RXNEIE) != RESET)
  19.          || ((cr3its & USART_CR3_RXFTIE) != RESET)) )
  20.     {
  21.       UART_Receive_IT(huart);
  22.       return;
  23.     }
  24.   }

  25.   /* If some errors occur */
  26.   if(   (errorflags != RESET)
  27.      && (   ((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != RESET)
  28.          || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET)))
  29.   {
  30.     /* UART parity error interrupt occurred -------------------------------------*/
  31.     if(((isrflags & USART_ISR_PE) != RESET) && ((cr1its & USART_CR1_PEIE) != RESET))
  32.     {
  33.       __HAL_UART_CLEAR_IT(huart, UART_CLEAR_PEF);

  34.       huart->ErrorCode |= HAL_UART_ERROR_PE;
  35.     }

  36.     /* UART frame error interrupt occurred --------------------------------------*/
  37.     if(((isrflags & USART_ISR_FE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
  38.     {
  39.       __HAL_UART_CLEAR_IT(huart, UART_CLEAR_FEF);

  40.       huart->ErrorCode |= HAL_UART_ERROR_FE;
  41.     }

  42.     /* UART noise error interrupt occurred --------------------------------------*/
  43.     if(((isrflags & USART_ISR_NE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
  44.     {
  45.       __HAL_UART_CLEAR_IT(huart, UART_CLEAR_NEF);

  46.       huart->ErrorCode |= HAL_UART_ERROR_NE;
  47.     }

  48.     /* UART Over-Run interrupt occurred -----------------------------------------*/
  49.     if(   ((isrflags & USART_ISR_ORE) != RESET)
  50.         &&(  ((cr1its & USART_CR1_RXNEIE) != RESET) ||
  51.              ((cr3its & USART_CR3_RXFTIE) != RESET) ||
  52.              ((cr3its & USART_CR3_EIE) != RESET)) )
  53.     {
  54.       __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);

  55.       huart->ErrorCode |= HAL_UART_ERROR_ORE;
  56.     }

  57.     /* Call UART Error Call back function if need be --------------------------*/
  58.     if(huart->ErrorCode != HAL_UART_ERROR_NONE)
  59.     {
  60.       /* UART in mode Receiver ---------------------------------------------------*/
  61.       if(((isrflags & USART_ISR_RXNE) != RESET)
  62.          && (   ((cr1its & USART_CR1_RXNEIE) != RESET)
  63.              || ((cr3its & USART_CR3_RXFTIE) != RESET)) )
  64.       {
  65.         UART_Receive_IT(huart);
  66.       }

  67.       /* If Overrun error occurs, or if any error occurs in DMA mode reception,
  68.          consider error as blocking */
  69.       if (((huart->ErrorCode & HAL_UART_ERROR_ORE) != RESET) ||
  70.           (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)))
  71.       {
  72.         /* Blocking error : transfer is aborted
  73.            Set the UART state ready to be able to start again the process,
  74.            Disable Rx Interrupts, and disable Rx DMA request, if ongoing */
  75.         UART_EndRxTransfer(huart);

  76.         /* Disable the UART DMA Rx request if enabled */
  77.         if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
  78.         {
  79.           CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);

  80.           /* Abort the UART DMA Rx channel */
  81.           if(huart->hdmarx != NULL)
  82.           {
  83.             /* Set the UART DMA Abort callback :
  84.                will lead to call HAL_UART_ErrorCallback() at end of DMA abort procedure */
  85.             huart->hdmarx->XferAbortCallback = UART_DMAAbortOnError;

  86.             /* Abort DMA RX */
  87.             if(HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK)
  88.             {
  89.               /* Call Directly huart->hdmarx->XferAbortCallback function in case of error */
  90.               huart->hdmarx->XferAbortCallback(huart->hdmarx);
  91.             }
  92.           }
  93.           else
  94.           {
  95.             /* Call user error callback */
  96.             HAL_UART_ErrorCallback(huart);
  97.           }
  98.         }
  99.         else
  100.         {
  101.           /* Call user error callback */
  102.           HAL_UART_ErrorCallback(huart);
  103.         }
  104.       }
  105.       else
  106.       {
  107.         /* Non Blocking error : transfer could go on.
  108.            Error is notified to user through user error callback */
  109.         HAL_UART_ErrorCallback(huart);
  110.         huart->ErrorCode = HAL_UART_ERROR_NONE;
  111.       }
  112.     }
  113.     return;

  114.   } /* End if some error occurs */

  115.   /* UART wakeup from Stop mode interrupt occurred ---------------------------*/
  116.   if(((isrflags & USART_ISR_WUF) != RESET) && ((cr3its & USART_CR3_WUFIE) != RESET))
  117.   {
  118.     __HAL_UART_CLEAR_IT(huart, UART_CLEAR_WUF);
  119.     /* Set the UART state ready to be able to start again the process */
  120.     huart->gState  = HAL_UART_STATE_READY;
  121.     huart->RxState = HAL_UART_STATE_READY;
  122.     HAL_UARTEx_WakeupCallback(huart);
  123.     return;
  124.   }

  125.   /* UART in mode Transmitter ------------------------------------------------*/
  126.   if(((isrflags & USART_ISR_TXE) != RESET)
  127.      && (   ((cr1its & USART_CR1_TXEIE) != RESET)
  128.          || ((cr3its & USART_CR3_TXFTIE) != RESET)) )
  129.   {
  130.     UART_Transmit_IT(huart);
  131.     return;
  132.   }

  133.   /* UART in mode Transmitter (transmission end) -----------------------------*/
  134.   if(((isrflags & USART_ISR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET))
  135.   {
  136.     UART_EndTransmit_IT(huart);
  137.     return;
  138.   }

  139.   /* UART TX FIFO Empty  -----------------------------------------------------*/
  140.   if(((isrflags & USART_ISR_TXFE) != RESET) && ((cr1its & USART_CR1_TXFEIE) != RESET))
  141.   {
  142.     CLEAR_BIT(huart->Instance->CR1, USART_CR1_TXFEIE);
  143.   }
  144. }
复制代码



回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2018-11-15 10:01:56 | 显示全部楼层
那句话,末尾的那个吗?
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
 楼主| 发表于 2018-11-15 11:58:17 | 显示全部楼层
byccc 发表于 2018-11-15 10:01
那句话,末尾的那个吗?

对的。
回复

使用道具 举报

610

主题

3060

回帖

4910

积分

至尊会员

积分
4910
发表于 2018-11-15 16:02:25 | 显示全部楼层

这个 貌似是只要一旦开启 usart 中断,那个 fifo 就会自动打开的吧 ??? 所以此处需要判断下 ????????
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
 楼主| 发表于 2018-11-15 16:47:25 | 显示全部楼层
hpdell 发表于 2018-11-15 16:02
这个 貌似是只要一旦开启 usart 中断,那个 fifo 就会自动打开的吧 ??? 所以此处需要判断下 ???? ...

不是,是需要专门配置的。
看此贴源码:
http://www.armbbs.cn/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

610

主题

3060

回帖

4910

积分

至尊会员

积分
4910
发表于 2018-11-15 17:15:16 | 显示全部楼层
eric2013 发表于 2018-11-15 16:47
不是,是需要专门配置的。
看此贴源码:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=90447 ...

貌似串口的内容比较多啊
回复

使用道具 举报

4

主题

42

回帖

54

积分

初级会员

积分
54
发表于 2018-11-15 19:08:23 | 显示全部楼层
研究这个干什么啊,自己写一个串口驱动也不过是一两天的事情而已。
以前搞单片机,只用看器件手册就可以了,最多再扫几眼别人的示例代码,现在研究完硬件,还要学习研究这个臃肿的库,明显付出加倍啊!
还总有人不断地强调因为这个库给你省出了时间,学习或者参考一下还可以,何必一定要把它搬到自己的工程里才算安心?点一下编译要等好几分钟就是个伤不起的事情。更别提它这里有时候出现一些暗坑,一旦跌进去就有可能好几天爬不出来。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
 楼主| 发表于 2018-11-15 19:43:57 | 显示全部楼层
jinggx 发表于 2018-11-15 19:08
研究这个干什么啊,自己写一个串口驱动也不过是一两天的事情而已。
以前搞单片机,只用看器件手册就可以了 ...

我们的就是自己写的

不过提供的HAL库,既然搞就要一撸到底,吃透它。
回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
发表于 2018-11-15 20:27:50 | 显示全部楼层
eric2013 发表于 2018-11-15 19:43
我们的就是自己写的

不过提供的HAL库,既然搞就要一撸到底,吃透它。

厉害了 我的哥
回复

使用道具 举报

4

主题

42

回帖

54

积分

初级会员

积分
54
发表于 2018-11-15 21:25:15 | 显示全部楼层
eric2013 发表于 2018-11-15 19:43
我们的就是自己写的

不过提供的HAL库,既然搞就要一撸到底,吃透它。

大赞!还是自己写一个比较好。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-10 18:41 , Processed in 0.178453 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表