[DemoCode下载] 串口PDMA的用法

[复制链接]
1781|4
 楼主| xuanhuanzi 发表于 2024-2-19 22:51 | 显示全部楼层 |阅读模式
  1. /**************************************************************************//**
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V3.00
  4. * $Revision: 5 $
  5. * $Date: 18/07/16 10:28a $
  6. * @brief
  7. *           Transmit and receive UART data with PDMA.
  8. *
  9. * @note
  10. * SPDX-License-Identifier: Apache-2.0
  11. * Copyright (C) 2016 Nuvoton Technology Corp. All rights reserved.
  12. *
  13. ******************************************************************************/
  14. #include <stdio.h>
  15. #include "NuMicro.h"


  16. #define PLLCTL_SETTING      CLK_PLLCTL_72MHz_HXT
  17. #define PLL_CLOCK           72000000

  18. #define UART_RX_DMA_CH 0
  19. #define UART_TX_DMA_CH 1

  20. /*---------------------------------------------------------------------------------------------------------*/
  21. /* Global variables                                                                                        */
  22. /*---------------------------------------------------------------------------------------------------------*/
  23. int32_t UART_TEST_LENGTH = 64;
  24. uint8_t SrcArray[64];
  25. uint8_t DestArray[64];
  26. volatile int32_t IntCnt;
  27. volatile int32_t IsTestOver;
  28. volatile uint32_t g_u32TwoChannelPdmaTest = 0;


  29. /*---------------------------------------------------------------------------------------------------------*/
  30. /* Define functions prototype                                                                              */
  31. /*---------------------------------------------------------------------------------------------------------*/
  32. int32_t main(void);


  33. /*---------------------------------------------------------------------------------------------------------*/
  34. /* Clear buffer funcion                                                                                    */
  35. /*---------------------------------------------------------------------------------------------------------*/
  36. void ClearBuf(uint32_t u32Addr, uint32_t u32Length, uint8_t u8Pattern)
  37. {
  38.     uint8_t* pu8Ptr;
  39.     uint32_t i;

  40.     pu8Ptr = (uint8_t *)u32Addr;

  41.     for(i = 0; i < u32Length; i++)
  42.     {
  43.         *pu8Ptr++ = u8Pattern;
  44.     }
  45. }

  46. /*---------------------------------------------------------------------------------------------------------*/
  47. /* Bulid Src Pattern function                                                                              */
  48. /*---------------------------------------------------------------------------------------------------------*/
  49. void BuildSrcPattern(uint32_t u32Addr, uint32_t u32Length)
  50. {
  51.     uint32_t i = 0, j, loop;
  52.     uint8_t* pAddr;

  53.     pAddr = (uint8_t *)u32Addr;

  54.     do
  55.     {
  56.         if(u32Length > 256)
  57.             loop = 256;
  58.         else
  59.             loop = u32Length;

  60.         u32Length = u32Length - loop;

  61.         for(j = 0; j < loop; j++)
  62.             *pAddr++ = (uint8_t)(j + i);

  63.         i++;
  64.     }
  65.     while((loop != 0) || (u32Length != 0));
  66. }

  67. /*---------------------------------------------------------------------------------------------------------*/
  68. /* UART Tx PDMA Channel Configuration                                                                      */
  69. /*---------------------------------------------------------------------------------------------------------*/
  70. void PDMA_UART_TxTest(void)
  71. {
  72.     /* UART Tx PDMA channel configuration */
  73.     PDMA->DSCT[UART_TX_DMA_CH].CTL =
  74.         (UART_TEST_LENGTH - 1) << PDMA_DSCT_CTL_TXCNT_Pos | /* Transfer count */
  75.         PDMA_WIDTH_8 |  /* Transfer width 8 bits */
  76.         PDMA_DAR_FIX  | /* Fixed destination address */
  77.         PDMA_SAR_INC  | /* Increment source address */
  78.         PDMA_DSCT_CTL_TBINTDIS_Msk  | /* Table interrupt disabled */
  79.         PDMA_REQ_SINGLE  | /* Single request type */
  80.         PDMA_OP_BASIC;     /* Basic mode */
  81.     PDMA->DSCT[UART_TX_DMA_CH].SA = (uint32_t)SrcArray;     /* Source address */
  82.     PDMA->DSCT[UART_TX_DMA_CH].DA = (uint32_t)&UART1->DAT;  /* Destination address */

  83.     /* Request source selection */
  84.     PDMA->REQSEL0_3 = (PDMA->REQSEL0_3 & (~PDMA_REQSEL0_3_REQSRC1_Msk)) | (PDMA_UART1_TX << PDMA_REQSEL0_3_REQSRC1_Pos);
  85. }

  86. /*---------------------------------------------------------------------------------------------------------*/
  87. /* UART Rx PDMA Channel Configuration                                                                      */
  88. /*---------------------------------------------------------------------------------------------------------*/
  89. void PDMA_UART_RxTest(void)
  90. {
  91.     /* UART Rx PDMA channel configuration */
  92.     PDMA->DSCT[UART_RX_DMA_CH].CTL =
  93.         (UART_TEST_LENGTH - 1) << PDMA_DSCT_CTL_TXCNT_Pos | /* Transfer count */
  94.         PDMA_WIDTH_8 |  /* Transfer width 8 bits */
  95.         PDMA_DAR_INC  | /* Increment destination address */
  96.         PDMA_SAR_FIX  | /* Fixed source address */
  97.         PDMA_DSCT_CTL_TBINTDIS_Msk  | /* Table interrupt disabled */
  98.         PDMA_REQ_SINGLE  | /* Single request type */
  99.         PDMA_OP_BASIC;     /* Basic mode */
  100.     PDMA->DSCT[UART_RX_DMA_CH].SA = (uint32_t)&UART1->DAT;  /* Source address */
  101.     PDMA->DSCT[UART_RX_DMA_CH].DA = (uint32_t)DestArray;    /* Destination address */

  102.     /* Request source selection */
  103.     PDMA->REQSEL0_3 = (PDMA->REQSEL0_3 & (~PDMA_REQSEL0_3_REQSRC0_Msk)) | (PDMA_UART1_RX << PDMA_REQSEL0_3_REQSRC0_Pos);
  104. }

  105. /*---------------------------------------------------------------------------------------------------------*/
  106. /* PDMA Callback function                                                                                  */
  107. /*---------------------------------------------------------------------------------------------------------*/
  108. void PDMA_Callback_0(void)
  109. {
  110.     printf("\tTransfer Done %d!\r", ++IntCnt);

  111.     /* Use PDMA to do UART loopback test 10 times */
  112.     if(IntCnt < 10)
  113.     {
  114.         /* UART Tx and Rx PDMA configuration */
  115.         PDMA_UART_TxTest();
  116.         PDMA_UART_RxTest();

  117.         /* Enable UART Tx and Rx PDMA function */
  118.         UART1->INTEN |= (UART_INTEN_RXPDMAEN_Msk | UART_INTEN_TXPDMAEN_Msk);
  119.     }
  120.     else
  121.     {
  122.         /* Test is over */
  123.         IsTestOver = TRUE;
  124.     }
  125. }

  126. void PDMA_Callback_1(void)
  127. {
  128.     int32_t i ;

  129.     printf("\tTransfer Done %d!\t", ++IntCnt);

  130.     /* Show UART Rx data */
  131.     for(i = 0; i < UART_TEST_LENGTH; i++)
  132.         printf(" 0x%x(%c),", inpb(((uint32_t)DestArray + i)), inpb(((uint32_t)DestArray + i)));
  133.     printf("\n");

  134.     /* Use PDMA to do UART Rx test 10 times */
  135.     if(IntCnt < 10)
  136.     {
  137.         /* UART Rx PDMA configuration */
  138.         PDMA_UART_RxTest();

  139.         /* Enable UART Rx PDMA function */
  140.         UART1->INTEN |= UART_INTEN_RXPDMAEN_Msk;
  141.     }
  142.     else
  143.     {
  144.         /* Test is over */
  145.         IsTestOver = TRUE;
  146.     }
  147. }

  148. void PDMA_IRQHandler(void)
  149. {
  150.     /* Get PDMA interrupt status */
  151.     uint32_t status = PDMA_GET_INT_STATUS(PDMA);
  152.     uint32_t u32ABTSTS  = PDMA->ABTSTS;

  153.     if(status & PDMA_INTSTS_ABTIF_Msk)   /* Target Abort */
  154.     {
  155.         IsTestOver = 2;
  156.         PDMA->ABTSTS = u32ABTSTS;
  157.     }
  158.     else if(status & PDMA_INTSTS_TDIF_Msk)     /* Transfer Done */
  159.     {
  160.         /* UART Tx PDMA transfer done interrupt flag */
  161.         if(PDMA_GET_TD_STS(PDMA) & (1 << UART_TX_DMA_CH))
  162.         {
  163.             /* Clear PDMA transfer done interrupt flag */
  164.             PDMA_CLR_TD_FLAG(PDMA, (1 << UART_TX_DMA_CH));

  165.             /* Disable UART Tx PDMA function */
  166.             UART1->INTEN &= ~UART_INTEN_TXPDMAEN_Msk;
  167.         }

  168.         /* UART Rx PDMA transfer done interrupt flag */
  169.         if(PDMA_GET_TD_STS(PDMA) & (1 << UART_RX_DMA_CH))
  170.         {
  171.             /* Clear PDMA transfer done interrupt flag */
  172.             PDMA_CLR_TD_FLAG(PDMA, (1 << UART_RX_DMA_CH));

  173.             /* Disable UART Rx PDMA function */
  174.             UART1->INTEN &= ~UART_INTEN_RXPDMAEN_Msk;

  175.             /* Handle PDMA transfer done interrupt event */
  176.             if(g_u32TwoChannelPdmaTest == 1)
  177.             {
  178.                 PDMA_Callback_0();
  179.             }
  180.             else if(g_u32TwoChannelPdmaTest == 0)
  181.             {
  182.                 PDMA_Callback_1();
  183.             }
  184.         }
  185.     }
  186.     else
  187.     {
  188.         printf("unknown interrupt, status=0x%x !!\n", status);
  189.     }
  190. }

  191. /*---------------------------------------------------------------------------------------------------------*/
  192. /* ISR to handle UART Channel 0 interrupt event                                                            */
  193. /*---------------------------------------------------------------------------------------------------------*/
  194. void UART02_IRQHandler(void)
  195. {
  196.     /* Get UART0 Rx data and send the data to UART1 Tx */
  197.     if(UART_GET_INT_FLAG(UART0, UART_INTSTS_RDAIF_Msk))
  198.         UART1->DAT = UART0->DAT;
  199. }

  200. /*---------------------------------------------------------------------------------------------------------*/
  201. /* PDMA Sample Code:                                                                                       */
  202. /*         i32option : ['1'] UART1 TX/RX PDMA Loopback                                                     */
  203. /*                     [Others] UART1 RX PDMA test                                                         */
  204. /*---------------------------------------------------------------------------------------------------------*/
  205. void PDMA_UART(int32_t i32option)
  206. {
  207.     /* Source data initiation */
  208.     BuildSrcPattern((uint32_t)SrcArray, UART_TEST_LENGTH);
  209.     ClearBuf((uint32_t)DestArray, UART_TEST_LENGTH, 0xFF);

  210.     /* Reset PDMA module */
  211.     SYS->IPRST0 |= SYS_IPRST0_PDMARST_Msk;
  212.     SYS->IPRST0 &= ~SYS_IPRST0_PDMARST_Msk;

  213.     if(i32option == '1')
  214.     {
  215.         printf("  [Using TWO PDMA channel].\n");
  216.         printf("  This sample code will use PDMA to do UART1 loopback test 10 times.\n");
  217.         printf("  Please connect UART1_RXD(PB.2) <--> UART1_TXD(PB.3) before testing.\n");
  218.         printf("  After connecting PB.2 <--> PB.3, press any key to start transfer.\n");
  219.         g_u32TwoChannelPdmaTest = 1;
  220.         getchar();
  221.     }
  222.     else
  223.     {
  224.         UART_TEST_LENGTH = 2;      /* Test Length */
  225.         printf("  [Using ONE PDMA channel].\n");
  226.         printf("  This sample code will use PDMA to do UART1 Rx test 10 times.\n");
  227.         printf("  Please connect UART1_RXD(PB.2) <--> UART1_TXD(PB.3) before testing.\n");
  228.         printf("  After connecting PB.2 <--> PB.3, press any key to start transfer.\n");
  229.         g_u32TwoChannelPdmaTest = 0;
  230.         getchar();
  231.         printf("  Please input %d bytes to trigger PDMA one time.(Ex: Press 'a''b')\n", UART_TEST_LENGTH);
  232.     }

  233.     if(g_u32TwoChannelPdmaTest == 1)
  234.     {
  235.         /* Enable PDMA channel */
  236.         PDMA->CHCTL |= ((1 << UART_RX_DMA_CH) | (1 << UART_TX_DMA_CH));

  237.         /* UART Tx and Rx PDMA configuration */
  238.         PDMA_UART_TxTest();
  239.         PDMA_UART_RxTest();

  240.         /* Enable PDMA Transfer Done Interrupt */
  241.         PDMA->INTEN |= ((1 << UART_TX_DMA_CH) | (1 << UART_RX_DMA_CH));
  242.     }
  243.     else
  244.     {
  245.         /* Enable PDMA channel */
  246.         PDMA->CHCTL |= (1 << UART_RX_DMA_CH);

  247.         /* UART Rx PDMA configuration */
  248.         PDMA_UART_RxTest();

  249.         /* Enable PDMA Transfer Done Interrupt */
  250.         PDMA->INTEN |= (1 << UART_RX_DMA_CH);
  251.     }

  252.     /* Enable PDMA Transfer Done Interrupt */
  253.     IntCnt = 0;
  254.     IsTestOver = FALSE;
  255.     NVIC_EnableIRQ(PDMA_IRQn);

  256.     /* Enable UART0 RDA interrupt */
  257.     if(g_u32TwoChannelPdmaTest == 0)
  258.     {
  259.         UART0->INTEN |= UART_INTEN_RDAIEN_Msk;
  260.         NVIC_EnableIRQ(UART02_IRQn);
  261.     }

  262.     /* Enable UART Tx and Rx PDMA function */
  263.     if(g_u32TwoChannelPdmaTest == 1)
  264.         UART1->INTEN |= UART_INTEN_TXPDMAEN_Msk;
  265.     else
  266.         UART1->INTEN &= ~UART_INTEN_TXPDMAEN_Msk;

  267.     UART1->INTEN |= UART_INTEN_RXPDMAEN_Msk;

  268.     /* Wait for PDMA operation finish */
  269.     while(IsTestOver == FALSE);

  270.     /* Check PDMA status */
  271.     if(IsTestOver == 2)
  272.         printf("target abort...\n");

  273.     /* Disable UART Tx and Rx PDMA function */
  274.     UART1->INTEN &= ~(UART_INTEN_TXPDMAEN_Msk | UART_INTEN_RXPDMAEN_Msk);

  275.     /* Disable PDMA channel */
  276.     PDMA->CHCTL = 0;

  277.     /* Disable PDMA Interrupt */
  278.     PDMA->INTEN = 0;
  279.     NVIC_DisableIRQ(PDMA_IRQn);

  280.     /* Disable UART0 RDA interrupt */
  281.     UART0->INTEN &= ~UART_INTEN_RDAIEN_Msk;
  282.     NVIC_DisableIRQ(UART02_IRQn);
  283. }

  284. void SYS_Init(void)
  285. {

  286.     /*---------------------------------------------------------------------------------------------------------*/
  287.     /* Init System Clock                                                                                       */
  288.     /*---------------------------------------------------------------------------------------------------------*/
  289.     /* Unlock protected registers */
  290.     SYS_UnlockReg();

  291.     /* Enable HIRC clock (Internal RC 48MHz) */
  292.     CLK->PWRCTL |= CLK_PWRCTL_HIRCEN_Msk;

  293.     /* Wait for HIRC clock ready */
  294.     while(!(CLK->STATUS & CLK_STATUS_HIRCSTB_Msk));

  295.     /* Select HCLK clock source as HIRC and HCLK clock divider as 1 */
  296.     CLK->CLKSEL0 = (CLK->CLKSEL0 & (~CLK_CLKSEL0_HCLKSEL_Msk)) | CLK_CLKSEL0_HCLKSEL_HIRC;
  297.     CLK->CLKDIV0 = (CLK->CLKDIV0 & (~CLK_CLKDIV0_HCLKDIV_Msk)) | CLK_CLKDIV0_HCLK(1);

  298.     /* Set PLL to Power-down mode */
  299.     CLK->PLLCTL |= CLK_PLLCTL_PD_Msk;

  300.     /* Enable UART module clock */
  301.     CLK->APBCLK0 |= (CLK_APBCLK0_UART0CKEN_Msk | CLK_APBCLK0_UART1CKEN_Msk);

  302.     /* Enable PDMA peripheral clock */
  303.     CLK->AHBCLK |= CLK_AHBCLK_PDMACKEN_Msk;

  304.     /* Select UART module clock source as HIRC and UART module clock divider as 1 */
  305.     CLK->CLKSEL1 = (CLK->CLKSEL1 & (~CLK_CLKSEL1_UART0SEL_Msk)) | CLK_CLKSEL1_UART0SEL_HIRC;
  306.     CLK->CLKDIV0 = (CLK->CLKDIV0 & (~CLK_CLKDIV0_UART0DIV_Msk)) | CLK_CLKDIV0_UART0(1);

  307.     CLK->CLKSEL1 = (CLK->CLKSEL1 & (~CLK_CLKSEL1_UART1SEL_Msk)) | CLK_CLKSEL1_UART1SEL_HIRC;
  308.     CLK->CLKDIV0 = (CLK->CLKDIV0 & (~CLK_CLKDIV0_UART1DIV_Msk)) | CLK_CLKDIV0_UART1(1);
  309.     /*---------------------------------------------------------------------------------------------------------*/
  310.     /* Init I/O Multi-function                                                                                 */
  311.     /*---------------------------------------------------------------------------------------------------------*/

  312.     /* Set PB multi-function pins for UART0 RXD=PB.12 and TXD=PB.13 */
  313.     SYS->GPB_MFPH = (SYS->GPB_MFPH & ~(SYS_GPB_MFPH_PB12MFP_Msk | SYS_GPB_MFPH_PB13MFP_Msk))    |       \
  314.                     (SYS_GPB_MFPH_PB12MFP_UART0_RXD | SYS_GPB_MFPH_PB13MFP_UART0_TXD);

  315.     /* Set PB multi-function pins for UART1 RXD(PB.2) and TXD(PB.3) */
  316.     SYS->GPB_MFPL = (SYS->GPB_MFPL & ~(SYS_GPB_MFPL_PB2MFP_Msk | SYS_GPB_MFPL_PB3MFP_Msk))    |       \
  317.                     (SYS_GPB_MFPL_PB2MFP_UART1_RXD | SYS_GPB_MFPL_PB3MFP_UART1_TXD);

  318.     /* Lock protected registers */
  319.     SYS_LockReg();
  320. }

  321. void UART0_Init()
  322. {
  323.     /*---------------------------------------------------------------------------------------------------------*/
  324.     /* Init UART                                                                                               */
  325.     /*---------------------------------------------------------------------------------------------------------*/
  326.     /* Reset UART0 */
  327.     SYS->IPRST1 |=  SYS_IPRST1_UART0RST_Msk;
  328.     SYS->IPRST1 &= ~SYS_IPRST1_UART0RST_Msk;

  329.     /* Configure UART0 and set UART0 baud rate */
  330.     UART0->BAUD = UART_BAUD_MODE2 | UART_BAUD_MODE2_DIVIDER(__HIRC, 115200);
  331.     UART0->LINE = UART_WORD_LEN_8 | UART_PARITY_NONE | UART_STOP_BIT_1;
  332. }

  333. void UART1_Init()
  334. {
  335.     /*---------------------------------------------------------------------------------------------------------*/
  336.     /* Init UART                                                                                               */
  337.     /*---------------------------------------------------------------------------------------------------------*/
  338.     /* Reset UART1 */
  339.     SYS->IPRST1 |=  SYS_IPRST1_UART1RST_Msk;
  340.     SYS->IPRST1 &= ~SYS_IPRST1_UART1RST_Msk;

  341.     /* Configure UART1 and set UART1 baud rate */
  342.     UART1->BAUD = UART_BAUD_MODE2 | UART_BAUD_MODE2_DIVIDER(__HIRC, 115200);
  343.     UART1->LINE = UART_WORD_LEN_8 | UART_PARITY_NONE | UART_STOP_BIT_1;
  344. }

  345. /*---------------------------------------------------------------------------------------------------------*/
  346. /*  Main Function                                                                                          */
  347. /*---------------------------------------------------------------------------------------------------------*/
  348. int32_t main(void)
  349. {

  350.     uint8_t unItem;

  351.     /* Init System, peripheral clock and multi-function I/O */
  352.     SYS_Init();

  353.     /* Init UART0 for printf */
  354.     UART0_Init();

  355.     /* Init UART1 for test */
  356.     UART1_Init();

  357.     /*---------------------------------------------------------------------------------------------------------*/
  358.     /* SAMPLE CODE                                                                                             */
  359.     /*---------------------------------------------------------------------------------------------------------*/

  360.     printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %d Hz\n", SystemCoreClock);

  361.     printf("\nUART PDMA Sample Program");

  362.     /* UART PDMA sample function */
  363.     do
  364.     {
  365.         printf("\n\n");
  366.         printf("+------------------------------------------------------------------------+\n");
  367.         printf("|                      UART PDMA Driver Sample Code                      |\n");
  368.         printf("+------------------------------------------------------------------------+\n");
  369.         printf("| [1] Using TWO PDMA channel to test. < TX1(CH1)-->RX1(CH0) >            |\n");
  370.         printf("| [2] Using ONE PDMA channel to test. < TX1-->RX1(CH0) >                 |\n");
  371.         printf("+------------------------------------------------------------------------+\n");
  372.         unItem = getchar();

  373.         IsTestOver = FALSE;
  374.         if((unItem == '1') || (unItem == '2'))
  375.         {
  376.             PDMA_UART(unItem);
  377.             printf("\n\n  UART PDMA sample code is complete.\n");
  378.         }

  379.     }
  380.     while(unItem != 27);

  381.     while(1);

  382. }


 楼主| xuanhuanzi 发表于 2024-2-19 22:52 | 显示全部楼层
初始化设置:

设置系统时钟和UART模块,包括初始化系统时钟、UART0和UART1。
初始化PDMA模块,包括启用PDMA时钟和设置PDMA通道。
PDMA配置:

定义了两个PDMA通道:UART_RX_DMA_CH(接收数据)和UART_TX_DMA_CH(发送数据)。
配置了PDMA通道的传输参数,包括传输计数、数据宽度、源地址和目标地址等。
配置了UART接收和发送的PDMA请求源。
PDMA中断处理函数:

定义了PDMA的中断处理函数PDMA_IRQHandler,处理PDMA传输完成和异常情况。
根据中断状态分别处理传输完成和传输异常的情况,并在传输完成时禁用相应的PDMA通道。
UART数据传输函数:

PDMA_UART函数用于初始化并启动UART的PDMA传输。
根据参数选择使用一个PDMA通道进行UART数据接收(选项2)或使用两个PDMA通道进行UART数据往返传输(选项1)。
初始化并启动PDMA传输,根据选项设置UART的PDMA传输使能。
在传输完成后,禁用相应的PDMA通道,并清除PDMA中断标志。
主函数:

初始化系统和UART模块。
显示菜单,等待用户输入以选择UART传输选项。
根据用户选择调用PDMA_UART函数进行相应的UART数据传输测试。
小明的同学 发表于 2024-2-27 11:52 | 显示全部楼层
不会DMA是真不行的。
幸福小强 发表于 2024-2-28 17:07 | 显示全部楼层
初始化PDMA:
在使用PDMA之前,需要对其进行初始化设置。这包括配置PDMA的工作模式、传输方向、数据宽度、中断设置等。一般来说,可以通过写入特定的寄存器来完成初始化配置。

配置传输参数:
在进行数据传输之前,需要配置传输的源地址、目的地址、传输数据长度等参数。这些参数决定了数据从哪里传输到哪里,以及传输的数据量。

启动传输:
配置完传输参数后,通过设置PDMA的使能位来启动数据传输。启动传输后,PDMA将会自动进行数据传输,而不需要CPU的干预。

等待传输完成:
在数据传输过程中,可以通过轮询或者中断的方式等待传输完成。一旦传输完成,PDMA将会生成相应的中断或者完成标志,通知CPU传输已经结束。

处理传输结果:
在传输完成后,可以根据需要进行相应的处理。例如,可以对接收到的数据进行处理,或者根据传输结果采取相应的措施。

关闭PDMA(可选):
在数据传输完成后,可以选择关闭PDMA以节省系统资源。关闭PDMA后,将不能再进行数据传输,直到再次启动PDMA。
LEDyyds 发表于 2024-2-28 20:26 | 显示全部楼层
PDMA和DMA是一个东西吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

183

主题

2331

帖子

3

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