[其他ST产品] STM32 串口 FIFO

[复制链接]
 楼主| 梵蒂冈是神uy 发表于 2023-11-28 16:24 | 显示全部楼层 |阅读模式
使用FIFO实现串口数据的收发功能


1、Cubemx串口配置

        使用Cubmx对串口进行配置如下:

751806565a3ac8e4ce.png


384066565a3b96d0ff.png

677466565a3bf8b2f7.png


 楼主| 梵蒂冈是神uy 发表于 2023-11-28 16:24 | 显示全部楼层
2、驱动程序编写
2.1驱动初始化
        进行串口收发FIFO的创建,进行发送FIFO回调函数的初始化,调用函数UsartStartCloseHT实现串口DMA+IDLE模式接收,同时关闭DMA的半满中断,减少进中断次数。
  1. /**
  2. ***************************************************
  3. * [url=home.php?mod=space&uid=247401]@brief[/url]    bsp_uart_Init
  4. * [url=home.php?mod=space&uid=536309]@NOTE[/url]     串口初始化
  5. *                     FIFO的初始化,以DMA IDLE 模式开启接收
  6. * @param        NONE
  7. * @retval          NONE
  8. * [url=home.php?mod=space&uid=130263]@DATA[/url]           2021.09.03
  9. * [url=home.php?mod=space&uid=638116]@auth[/url]           WXL
  10. * @his            1.0.0.0     2021.09.03     WXL
  11. *                                 create
  12. ***************************************************
  13. **/
  14. void bsp_uart_Init()
  15. {
  16.         Usart1RxFifo = func_fifo_Create(UART_RX_BUFF_SIZE*2,FIFO_TYPE_INT_PUSH);
  17.         Usart1TxFifo = func_fifo_Create(UART_TX_BUFF_SIZE*2,FIFO_TYPE_INT_PULL);
  18.         Usart1TxFifo->func_timmer = Usart1_SendInTimer;

  19.         Usart6RxFifo = func_fifo_Create(UART_RX_BUFF_SIZE*2,FIFO_TYPE_INT_PUSH);
  20.         Usart6TxFifo = func_fifo_Create(UART_TX_BUFF_SIZE*2,FIFO_TYPE_INT_PULL);
  21.         Usart6TxFifo->func_timmer = Usart6_SendInTimer;

  22.         UsartStartCloseHT(&huart1, (uint8_t*)&Usart1RxBuff[0], UART_RX_BUFF_SIZE);
  23.         UsartStartCloseHT(&huart6, (uint8_t*)&Usart6RxBuff[0], UART_RX_BUFF_SIZE);
  24. }
 楼主| 梵蒂冈是神uy 发表于 2023-11-28 16:25 | 显示全部楼层
static void UsartStartCloseHT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
        HAL_StatusTypeDef ret = HAL_BUSY;
        while(ret != HAL_OK)
        {
                ret = HAL_UARTEx_ReceiveToIdle_DMA(huart, pData, Size);
        }
        huart->hdmarx->Instance->CR &= (uint32_t)~DMA_IT_HT;
}
 楼主| 梵蒂冈是神uy 发表于 2023-11-28 16:25 | 显示全部楼层
2.2串口接收处理
        使用HAL库使能串口接收DMA+IDLE后,串口在接收完成或DMA满后会进入到中断中,并调用回调函数HAL_UARTEx_RxEventCallback,我们在该函数中将接收到的数据进行FIFO写入操作。
 楼主| 梵蒂冈是神uy 发表于 2023-11-28 16:25 | 显示全部楼层
  串口接收过程中我们使用了两个缓冲区,中断中进行缓冲区的切换及数据向FIFO的写入操作。
 楼主| 梵蒂冈是神uy 发表于 2023-11-28 16:25 | 显示全部楼层
  1. /**
  2. ***************************************************
  3. * @brief   HAL_UARTEx_RxEventCallback
  4. * @note    串口接收中断函数
  5. *          进行当前中断时需写入到FIFO中数量的计算�??????
  6. *          更新FIFO的状态�??
  7. * @param        huart                指向对应的串�??????
  8. *                         Size                数量
  9. * @retval          NONE
  10. * @data           2021.09.03
  11. * @auth           WXL
  12. * @his            1.0.0.0     2021.09.03     WXL
  13. *                                 create
  14. ***************************************************
  15. **/
  16. void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
  17. {
  18.         if(huart == &huart1)
  19.         {
  20.                 if(huart1.hdmarx->Instance->M0AR == (int32_t)&Usart1RxBuff[0])
  21.                 {
  22.                         UsartStartCloseHT(&huart1, (uint8_t*)&Usart1RxBuff[1], UART_RX_BUFF_SIZE);
  23.                         func_fifo_PushInt(Usart1RxFifo, Size, (uint8_t*)&Usart1RxBuff[0]);
  24.                 }
  25.                 else
  26.                 {
  27.                         UsartStartCloseHT(&huart1, (uint8_t*)&Usart1RxBuff[0], UART_RX_BUFF_SIZE);
  28.                         func_fifo_PushInt(Usart1RxFifo, Size, (uint8_t*)&Usart1RxBuff[1]);
  29.                 }
  30.         }
  31.         if(huart == &huart6)
  32.         {
  33.                 if(huart6.hdmarx->Instance->M0AR == (int32_t)&Usart6RxBuff[0])
  34.                 {
  35.                         UsartStartCloseHT(&huart6, (uint8_t*)&Usart6RxBuff[1], UART_RX_BUFF_SIZE);
  36.                         func_fifo_PushInt(Usart6RxFifo, Size, (uint8_t*)&Usart6RxBuff[0]);
  37.                 }
  38.                 else
  39.                 {
  40.                         UsartStartCloseHT(&huart6, (uint8_t*)&Usart6RxBuff[0], UART_RX_BUFF_SIZE);
  41.                         func_fifo_PushInt(Usart6RxFifo, Size, (uint8_t*)&Usart6RxBuff[1]);
  42.                 }
  43.         }
  44. }
 楼主| 梵蒂冈是神uy 发表于 2023-11-28 16:25 | 显示全部楼层
2.2串口发送处理
        串口发送过程中,先将数据压入到串口发送的FIFO中,判断串口发送不繁忙时,将数据读取到发送缓冲区记性DMA发送。
/**
***************************************************
* @brief           USART_SendData
* @note            串口接收中断函数
*                  进行当前中断时需写入到FIFO中数量的计算�?????
*                  更新FIFO的状态�??
* @param        huart                指向对应的串�?????
*                         Size                数量
* @retval          NONE
* @data           2021.09.03
* @auth           WXL
* @his            1.0.0.0     2021.09.03     WXL
*                                 create
***************************************************
**/
FifoErr bsp_uart_Send(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
        FifoErr err = FIFO_EOK;
        INT16U len = 0;
        if(huart == &huart1)
        {
                //将数据压入到发的FIFO中去
                err = func_fifo_Push(Usart1TxFifo, Size, pData);
                if (huart->gState == HAL_UART_STATE_READY)
                {
                        if( func_fifo_PullPartInt(Usart1TxFifo, UART_TX_BUFF_SIZE, Usart1TxBuff, &len) == FIFO_EOK)
                        {
                                HAL_UART_Transmit_DMA(&huart1, Usart1TxBuff, len);
                        }
                }
                return err;
        }
        if(huart == &huart6)
        {
                //将数据压入到发的FIFO中去
                err = func_fifo_Push(Usart6TxFifo, Size, pData);
                if (huart->gState == HAL_UART_STATE_READY)
                {
                        if( func_fifo_PullPartInt(Usart6TxFifo, UART_TX_BUFF_SIZE, Usart6TxBuff, &len) == FIFO_EOK)
                        {
                                HAL_UART_Transmit_DMA(&huart6, Usart6TxBuff, len);
                        }
                }
                return err;
        }
        return FIFO_EFAILED;
}
 楼主| 梵蒂冈是神uy 发表于 2023-11-28 16:25 | 显示全部楼层
DMA发送完成后会进入发送完成中断,中断对未发送完的数据进行继续发送
  1. /**
  2. ***************************************************
  3. * @brief    HAL_UART_TxCpltCallback
  4. * @note     HAL库回调函数
  5. * @param        NONE
  6. * @retval          NONE
  7. * @data           2021.09.03
  8. * @auth           WXL
  9. * @his            1.0.0.0     2021.09.03     WXL
  10. *                                 create
  11. ***************************************************
  12. **/
  13. void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
  14. {
  15.         bsp_uart_TxCallBack(huart);
  16. }
 楼主| 梵蒂冈是神uy 发表于 2023-11-28 16:26 | 显示全部楼层
/**
***************************************************
* @brief    bsp_uart_SendTimer
* @note     串口发送时的FIFO回调函数。
* @param        NONE
* @retval          NONE
* @data           2021.09.03
* @auth           WXL
* @his            1.0.0.0     2021.09.03     WXL
*                                 create
***************************************************
**/
static void bsp_uart_TxCallBack(UART_HandleTypeDef *huart)
{
        INT16U len = 0;

        if (huart->gState == HAL_UART_STATE_READY)
        {
                if(huart == &huart1)
                {
                        HAL_GPIO_WritePin(O_SERIAL_GPIO_Port, O_SERIAL_Pin, GPIO_PIN_SET);
                        if( func_fifo_PullPart(Usart1TxFifo, UART_TX_BUFF_SIZE, Usart1TxBuff, &len) == FIFO_EOK)
                        {
                                HAL_UART_Transmit_DMA(&huart1, Usart1TxBuff, len);
                        }
                }
                if(huart == &huart6)
                {
                        if( func_fifo_PullPart(Usart6TxFifo, UART_TX_BUFF_SIZE, Usart6TxBuff, &len) == FIFO_EOK)
                        {
                                HAL_UART_Transmit_DMA(&huart6, Usart6TxBuff, len);
                        }
                }
        }
}
 楼主| 梵蒂冈是神uy 发表于 2023-11-28 16:26 | 显示全部楼层
2.3串口FIFO的定时器功能
        FIFO定时器遍历FIFO链表

        对接收FIFO实现备份缓冲到FIFO的写入操作

        对发送FIFO实现未发送完成数据的继续发送。
 楼主| 梵蒂冈是神uy 发表于 2023-11-28 16:26 | 显示全部楼层
2.3串口错误处理
        解决串口接收发送过程中发生溢出中断等意外情况

  1. /**
  2. ***************************************************
  3. * @brief   HAL_UART_ErrorCallback
  4. * @note    错误中断处理
  5. * @param        huart                指向对应的串口
  6. * @retval          NONE
  7. * @data           2021.09.17
  8. * @auth           WXL
  9. * @his            1.0.0.0     2021.09.17     WXL
  10. *                                 create
  11. ***************************************************
  12. **/
  13. void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
  14. {
  15.     __HAL_UART_CLEAR_OREFLAG(huart);

  16.         if(huart == &huart1)
  17.         {
  18.                 UsartStartCloseHT(&huart1, (uint8_t*)&Usart1RxBuff[1], UART_RX_BUFF_SIZE);
  19.         }
  20.         if(huart == &huart6)
  21.         {
  22.                 UsartStartCloseHT(&huart6, (uint8_t*)&Usart6RxBuff[0], UART_RX_BUFF_SIZE);
  23.         }
  24. }
 楼主| 梵蒂冈是神uy 发表于 2023-11-28 16:26 | 显示全部楼层
2.3详细完整代码
  1. /*   说明:
  2. *      @实现需要的支持:
  3. *         1)USART                        串口外设,进行数据接收及发送
  4. *         2)func_fifo.h        提供接收发送FIFO支持
  5. *
  6. *      @实现原理及功能:
  7. *         串口接收使用DMA+IDLE模式实现(关闭了DMA的半满中断)
  8. *                         1)中断中在FIFO不繁忙时将接收数据写入到FIFO中。
  9. *                         2)中断中在FIFO繁忙时,将数据写入到BACK区域
  10. *                            通过FIFO的定时器来实现BACK数据向FIFO的写入功能。
  11. *         串口的发送使用发送完成中断结合DMA的定时器回调功能实现。
  12. *     @his
  13. *        ver:1.0.0.0
  14. *        author:WXL
  15. *        note:create      2021.09.04
  16. *
  17. *        ver:1.0.0.1
  18. *        author:WXL
  19. *        note:create      2021.09.17
  20. *        增加错误中断处理,解决串口1不接受数据的问题。
  21. */
  22. /*************************************************************************************************************************
  23. *                                                   宏定义
  24. **************************************************************************************************************************/
  25. #include "bsp_uart.h"
  26. /*************************************************************************************************************************
  27. *                                                   宏定义
  28. **************************************************************************************************************************/
  29. #define UART_TX_BUFF_SIZE        1024
  30. #define UART_RX_BUFF_SIZE        1024
  31. /*************************************************************************************************************************
  32. *                                                   局部变量
  33. **************************************************************************************************************************/
  34. FifoTypeDef*                        Usart1RxFifo;
  35. static FifoTypeDef*                Usart1TxFifo;
  36. static INT8U                        Usart1RxBuff[2][UART_RX_BUFF_SIZE]={0};
  37. static INT8U                        Usart1TxBuff[UART_TX_BUFF_SIZE]={0};

  38. FifoTypeDef*                        Usart6RxFifo;
  39. static FifoTypeDef*                Usart6TxFifo;
  40. static INT8U                        Usart6RxBuff[2][UART_RX_BUFF_SIZE]={0};
  41. static INT8U                        Usart6TxBuff[UART_TX_BUFF_SIZE]={0};
  42. /*************************************************************************************************************************
  43. *                                                   全局变量
  44. **************************************************************************************************************************/
  45. extern UART_HandleTypeDef huart1;
  46. extern UART_HandleTypeDef huart6;
  47. /*************************************************************************************************************************
  48. *                                                    局部函数
  49. **************************************************************************************************************************/

  50. /**
  51. ***************************************************
  52. * @brief    bsp_uart_SendTimer
  53. * @note     串口发送时的FIFO回调函数。
  54. * @param        NONE
  55. * @retval          NONE
  56. * @data           2021.09.03
  57. * @auth           WXL
  58. * @his            1.0.0.0     2021.09.03     WXL
  59. *                                 create
  60. ***************************************************
  61. **/
  62. static void bsp_uart_TxCallBack(UART_HandleTypeDef *huart)
  63. {
  64.         INT16U len = 0;

  65.         if (huart->gState == HAL_UART_STATE_READY)
  66.         {
  67.                 if(huart == &huart1)
  68.                 {
  69.                         HAL_GPIO_WritePin(O_SERIAL_GPIO_Port, O_SERIAL_Pin, GPIO_PIN_SET);
  70.                         if( func_fifo_PullPart(Usart1TxFifo, UART_TX_BUFF_SIZE, Usart1TxBuff, &len) == FIFO_EOK)
  71.                         {
  72.                                 HAL_UART_Transmit_DMA(&huart1, Usart1TxBuff, len);
  73.                         }
  74.                 }
  75.                 if(huart == &huart6)
  76.                 {
  77.                         if( func_fifo_PullPart(Usart6TxFifo, UART_TX_BUFF_SIZE, Usart6TxBuff, &len) == FIFO_EOK)
  78.                         {
  79.                                 HAL_UART_Transmit_DMA(&huart6, Usart6TxBuff, len);
  80.                         }
  81.                 }
  82.         }
  83. }
  84. /**
  85. ***************************************************
  86. * @brief    Usart1_SendInTimer
  87. * @note     串口1发送时的FIFO回调函数。
  88. * @param        NONE
  89. * @retval          NONE
  90. * @data           2021.09.03
  91. * @auth           WXL
  92. * @his            1.0.0.0     2021.09.03     WXL
  93. *                                 create
  94. ***************************************************
  95. **/
  96. static void Usart1_SendInTimer()
  97. {
  98.         bsp_uart_TxCallBack(&huart1);
  99. }
  100. /**
  101. ***************************************************
  102. * @brief    Usart6_SendInTimer
  103. * @note     串口1发送时的FIFO回调函数。
  104. * @param        NONE
  105. * @retval          NONE
  106. * @data           2021.09.03
  107. * @auth           WXL
  108. * @his            1.0.0.0     2021.09.03     WXL
  109. *                                 create
  110. ***************************************************
  111. **/
  112. static void Usart6_SendInTimer()
  113. {
  114.         bsp_uart_TxCallBack(&huart6);
  115. }
  116. /**
  117. ***************************************************
  118. * @brief    UsartStartCloseHT
  119. * @note     串口1发送时的FIFO回调函数。
  120. * @param        NONE
  121. * @retval          NONE
  122. * @data           2021.09.03
  123. * @auth           WXL
  124. * @his            1.0.0.0     2021.09.03     WXL
  125. *                                 create
  126. ***************************************************
  127. **/
  128. static void UsartStartCloseHT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
  129. {
  130.         HAL_StatusTypeDef ret = HAL_BUSY;
  131.         while(ret != HAL_OK)
  132.         {
  133.                 ret = HAL_UARTEx_ReceiveToIdle_DMA(huart, pData, Size);
  134.         }
  135.         huart->hdmarx->Instance->CR &= (uint32_t)~DMA_IT_HT;
  136. }
  137. /*************************************************************************************************************************
  138. *                                                              全局函数
  139. **************************************************************************************************************************/
  140. /**
  141. ***************************************************
  142. * @brief    bsp_uart_Init
  143. * @note     串口初始化
  144. *                     FIFO的初始化,以DMA IDLE 模式开启接收
  145. * @param        NONE
  146. * @retval          NONE
  147. * @data           2021.09.03
  148. * @auth           WXL
  149. * @his            1.0.0.0     2021.09.03     WXL
  150. *                                 create
  151. ***************************************************
  152. **/
  153. void bsp_uart_Init()
  154. {
  155.         Usart1RxFifo = func_fifo_Create(UART_RX_BUFF_SIZE*2,FIFO_TYPE_INT_PUSH);
  156.         Usart1TxFifo = func_fifo_Create(UART_TX_BUFF_SIZE*2,FIFO_TYPE_INT_PULL);
  157.         Usart1TxFifo->func_timmer = Usart1_SendInTimer;

  158.         Usart6RxFifo = func_fifo_Create(UART_RX_BUFF_SIZE*2,FIFO_TYPE_INT_PUSH);
  159.         Usart6TxFifo = func_fifo_Create(UART_TX_BUFF_SIZE*2,FIFO_TYPE_INT_PULL);
  160.         Usart6TxFifo->func_timmer = Usart6_SendInTimer;

  161.         UsartStartCloseHT(&huart1, (uint8_t*)&Usart1RxBuff[0], UART_RX_BUFF_SIZE);
  162.         UsartStartCloseHT(&huart6, (uint8_t*)&Usart6RxBuff[0], UART_RX_BUFF_SIZE);
  163. }
  164. /**
  165. ***************************************************
  166. * @brief           USART_SendData
  167. * @note            串口接收中断函数
  168. *                  进行当前中断时需写入到FIFO中数量的计算�?????
  169. *                  更新FIFO的状态�??
  170. * @param        huart                指向对应的串�?????
  171. *                         Size                数量
  172. * @retval          NONE
  173. * @data           2021.09.03
  174. * @auth           WXL
  175. * @his            1.0.0.0     2021.09.03     WXL
  176. *                                 create
  177. ***************************************************
  178. **/
  179. FifoErr bsp_uart_Send(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
  180. {
  181.         FifoErr err = FIFO_EOK;
  182.         INT16U len = 0;
  183.         if(huart == &huart1)
  184.         {
  185.                 //将数据压入到发的FIFO中去
  186.                 err = func_fifo_Push(Usart1TxFifo, Size, pData);
  187.                 if (huart->gState == HAL_UART_STATE_READY)
  188.                 {
  189.                         if( func_fifo_PullPartInt(Usart1TxFifo, UART_TX_BUFF_SIZE, Usart1TxBuff, &len) == FIFO_EOK)
  190.                         {
  191.                                 HAL_UART_Transmit_DMA(&huart1, Usart1TxBuff, len);
  192.                         }
  193.                 }
  194.                 return err;
  195.         }
  196.         if(huart == &huart6)
  197.         {
  198.                 //将数据压入到发的FIFO中去
  199.                 err = func_fifo_Push(Usart6TxFifo, Size, pData);
  200.                 if (huart->gState == HAL_UART_STATE_READY)
  201.                 {
  202.                         if( func_fifo_PullPartInt(Usart6TxFifo, UART_TX_BUFF_SIZE, Usart6TxBuff, &len) == FIFO_EOK)
  203.                         {
  204.                                 HAL_UART_Transmit_DMA(&huart6, Usart6TxBuff, len);
  205.                         }
  206.                 }
  207.                 return err;
  208.         }
  209.         return FIFO_EFAILED;
  210. }

  211. void bsp_uart_Test()
  212. {
  213.         INT8U temp[1024] = {0};
  214.         INT16U len = 0;
  215.         if(func_fifo_PullPart(Usart6RxFifo, 1024, temp,&len) == FIFO_EOK)
  216.         {
  217.           bsp_uart_Send(&huart6, temp, len);
  218.         }
  219.         if(func_fifo_PullPart(Usart1RxFifo, 1024, temp,&len) == FIFO_EOK)
  220.         {
  221.           bsp_uart_Send(&huart1, temp, len);
  222.         }
  223. }


  224. /*************************************************************************************************************************
  225. *                                                              HAL库回调函数
  226. **************************************************************************************************************************/

  227. /**
  228. ***************************************************
  229. * @brief   HAL_UARTEx_RxEventCallback
  230. * @note    串口接收中断函数
  231. *          进行当前中断时需写入到FIFO中数量的计算�??????
  232. *          更新FIFO的状态�??
  233. * @param        huart                指向对应的串�??????
  234. *                         Size                数量
  235. * @retval          NONE
  236. * @data           2021.09.03
  237. * @auth           WXL
  238. * @his            1.0.0.0     2021.09.03     WXL
  239. *                                 create
  240. ***************************************************
  241. **/
  242. void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
  243. {
  244.         if(huart == &huart1)
  245.         {
  246.                 if(huart1.hdmarx->Instance->M0AR == (int32_t)&Usart1RxBuff[0])
  247.                 {
  248.                         UsartStartCloseHT(&huart1, (uint8_t*)&Usart1RxBuff[1], UART_RX_BUFF_SIZE);
  249.                         func_fifo_PushInt(Usart1RxFifo, Size, (uint8_t*)&Usart1RxBuff[0]);
  250.                 }
  251.                 else
  252.                 {
  253.                         UsartStartCloseHT(&huart1, (uint8_t*)&Usart1RxBuff[0], UART_RX_BUFF_SIZE);
  254.                         func_fifo_PushInt(Usart1RxFifo, Size, (uint8_t*)&Usart1RxBuff[1]);
  255.                 }
  256.         }
  257.         if(huart == &huart6)
  258.         {
  259.                 if(huart6.hdmarx->Instance->M0AR == (int32_t)&Usart6RxBuff[0])
  260.                 {
  261.                         UsartStartCloseHT(&huart6, (uint8_t*)&Usart6RxBuff[1], UART_RX_BUFF_SIZE);
  262.                         func_fifo_PushInt(Usart6RxFifo, Size, (uint8_t*)&Usart6RxBuff[0]);
  263.                 }
  264.                 else
  265.                 {
  266.                         UsartStartCloseHT(&huart6, (uint8_t*)&Usart6RxBuff[0], UART_RX_BUFF_SIZE);
  267.                         func_fifo_PushInt(Usart6RxFifo, Size, (uint8_t*)&Usart6RxBuff[1]);
  268.                 }
  269.         }
  270. }
  271. /**
  272. ***************************************************
  273. * @brief   HAL_UART_ErrorCallback
  274. * @note    错误中断处理
  275. * @param        huart                指向对应的串口
  276. * @retval          NONE
  277. * @data           2021.09.17
  278. * @auth           WXL
  279. * @his            1.0.0.0     2021.09.17     WXL
  280. *                                 create
  281. ***************************************************
  282. **/
  283. void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
  284. {
  285.     __HAL_UART_CLEAR_OREFLAG(huart);

  286.         if(huart == &huart1)
  287.         {
  288.                 UsartStartCloseHT(&huart1, (uint8_t*)&Usart1RxBuff[1], UART_RX_BUFF_SIZE);
  289.         }
  290.         if(huart == &huart6)
  291.         {
  292.                 UsartStartCloseHT(&huart6, (uint8_t*)&Usart6RxBuff[0], UART_RX_BUFF_SIZE);
  293.         }
  294. }

  295. /**
  296. ***************************************************
  297. * @brief    HAL_UART_TxCpltCallback
  298. * @note     HAL库回调函数
  299. * @param        NONE
  300. * @retval          NONE
  301. * @data           2021.09.03
  302. * @auth           WXL
  303. * @his            1.0.0.0     2021.09.03     WXL
  304. *                                 create
  305. ***************************************************
  306. **/
  307. void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
  308. {
  309.         bsp_uart_TxCallBack(huart);
  310. }
 楼主| 梵蒂冈是神uy 发表于 2023-11-28 16:26 | 显示全部楼层
#ifndef _BSP_UART_H_
#define _BSP_UART_H_
/*************************************************************************************************************************
*                                                   头文件
**************************************************************************************************************************/
#include "main.h"
#include "func_fifo.h"
/*************************************************************************************************************************
*                                                   全局变量申明
**************************************************************************************************************************/
extern FifoTypeDef*                Usart1RxFifo;
extern FifoTypeDef*                Usart6RxFifo;
/*************************************************************************************************************************
*                                                   函数声明
**************************************************************************************************************************/
extern void bsp_uart_Init();
extern FifoErr bsp_uart_Send(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
extern void bsp_uart_Test();

#endif
公羊子丹 发表于 2024-7-11 07:17 | 显示全部楼层

防雷电路的输出残压值必须比被防护电路自身能够耐受的过电压峰值低,并有一定裕量
万图 发表于 2024-7-11 08:20 | 显示全部楼层

模信号是幅度相等且相位相同的信号
Uriah 发表于 2024-7-11 09:23 | 显示全部楼层

在完成测试后,需要分析测试结果并进行评估
帛灿灿 发表于 2024-7-11 11:19 | 显示全部楼层

构成各种滤波器对EMI进行滤波
Bblythe 发表于 2024-7-11 12:22 | 显示全部楼层

在动态测试之前,首先需要设定测试时间和测试频率
周半梅 发表于 2024-7-11 14:18 | 显示全部楼层

测试负载测试是在特定的测试条件下进行的
Pulitzer 发表于 2024-7-11 15:21 | 显示全部楼层

在测试中,可以改变负载电流,得到最大输出电流和输出电压
您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

734

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

52

主题

734

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部