[技术问答] NANO100系列那些外设支持PDMA功能?

[复制链接]
855|9
 楼主| 猫灵的星星 发表于 2020-5-11 09:46 | 显示全部楼层 |阅读模式
NANO100系列那些外设支持PDMA功能?有专业人士或者大神帮忙解答一下吗?规格书上没有写,例程里面也没有!提问那么多次,没有一次是能解决的,加代理商好友也全是拉着你买IC,还不帮你解决问题。感觉对论坛失去信心了,所有问题都没有人一起讨论,规格书出了问题也没有专业人士出来回答,也不知论坛有没有新唐MCU大神,反正在论坛提问那么多次,从来没见过
奔跑的牛 发表于 2020-5-11 09:56 | 显示全部楼层
 楼主| 猫灵的星星 发表于 2020-5-11 09:59 | 显示全部楼层
antusheng 发表于 2020-5-11 22:23 | 显示全部楼层
另外可以在PDMA的头文件里看到那些可以。
wahahaheihei 发表于 2020-5-20 21:18 | 显示全部楼层
968915ec52e3536b49.png
楼主新手啊,这BSP的例子里不是有几个例子吗,怎么说没有呢
wahahaheihei 发表于 2020-5-20 21:20 | 显示全部楼层
  1. /**************************************************************************//**
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
  4. * $Revision: 3 $
  5. * $Date: 14/09/11 7:12p $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    Demonstrate PDMA trigger DAC convert sine wave outputs.
  7. *
  8. * @note
  9. * Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved.
  10. *****************************************************************************/
  11. #include <stdio.h>
  12. #include "Nano100Series.h"

  13. #define SINE_ARRAY_SIZE 63
  14. const uint16_t a16Sine[SINE_ARRAY_SIZE] = {2047, 2251, 2453, 2651, 2844, 3028, 3202, 3365, 3515, 3650, 3769, 3871, 3954,
  15.                                            4019, 4064, 4088, 4095, 4076, 4040, 3984, 3908, 3813, 3701, 3573, 3429, 3272,
  16.                                            3102, 2921, 2732, 2536, 2335, 2132, 1927, 1724, 1523, 1328, 1141,  962,  794,
  17.                                            639,  497,  371,  262,  171,   99,   45,   12,    0,    7,   35,   84,  151,
  18.                                            238,  343,  465,  602,  754,  919, 1095, 1281, 1475, 1674, 1876
  19.                                           };




  20. /*---------------------------------------------------------------------------------------------------------*/
  21. /* Init System Clock                                                                                       */
  22. /*---------------------------------------------------------------------------------------------------------*/
  23. void SYS_Init(void)
  24. {
  25.     /* Unlock protected registers */
  26.     SYS_UnlockReg();

  27.     /* Set HCLK source form HXT and HCLK source divide 1  */
  28.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HXT,CLK_HCLK_CLK_DIVIDER(1));

  29.     /* Enable external 12MHz HXT, 32KHz LXT and HIRC */
  30.     CLK_EnableXtalRC(CLK_PWRCTL_HXT_EN_Msk | CLK_PWRCTL_LXT_EN_Msk | CLK_PWRCTL_HIRC_EN_Msk);

  31.     /* Waiting for clock ready */
  32.     CLK_WaitClockReady(CLK_CLKSTATUS_HXT_STB_Msk | CLK_CLKSTATUS_LXT_STB_Msk | CLK_CLKSTATUS_HIRC_STB_Msk);

  33.     /*  Set HCLK frequency 42MHz */
  34.     CLK_SetCoreClock(42000000);

  35.     /* Enable IP clock */
  36.     CLK_EnableModuleClock(UART0_MODULE);
  37.     CLK_EnableModuleClock(TMR0_MODULE);

  38.     /* Enable DAC clock */
  39.     CLK->APBCLK |= CLK_APBCLK_DAC_EN_Msk;
  40.     /* Enable DMA clock */
  41.     CLK->AHBCLK |= CLK_AHBCLK_DMA_EN_Msk;

  42.     /* Select IP clock source */
  43.     CLK_SetModuleClock(UART0_MODULE,CLK_CLKSEL1_UART_S_HXT,CLK_UART_CLK_DIVIDER(1));

  44.     /*---------------------------------------------------------------------------------------------------------*/
  45.     /* Init I/O Multi-function                                                                                 */
  46.     /*---------------------------------------------------------------------------------------------------------*/
  47.     /* Set PA multi-function pins for UART0 RXD and TXD */
  48.     SYS->PB_L_MFP &= ~( SYS_PB_L_MFP_PB0_MFP_Msk | SYS_PB_L_MFP_PB1_MFP_Msk);
  49.     SYS->PB_L_MFP |= (SYS_PB_L_MFP_PB0_MFP_UART0_RX | SYS_PB_L_MFP_PB1_MFP_UART0_TX );

  50.     /* Set PC.6 multi-function pin for DAC channel 0 */
  51.     SYS->PC_L_MFP &= ~(SYS_PC_L_MFP_PC6_MFP_Msk);
  52.     SYS->PC_L_MFP |= SYS_PC_L_MFP_PC6_MFP_DA_OUT0;

  53.     /* Disable digital input path for both PC.6 */
  54.     GPIO_DISABLE_DIGITAL_PATH(PC, 1 << 6);

  55.     /* Lock protected registers */
  56.     SYS_LockReg();
  57. }



  58. int32_t main (void)
  59. {

  60.     /* Init System, IP clock and multi-function I/O
  61.        In the end of SYS_Init() will issue SYS_LockReg()
  62.        to lock protected register. If user want to write
  63.        protected register, please issue SYS_UnlockReg()
  64.        to unlock protected register if necessary */
  65.     SYS_Init();

  66.     /* Init UART0 for printf */
  67.     UART_Open(UART0, 115200);

  68.     printf("\nThis sample code demonstrate PDMA channel 1 trigger DAC channel 0 function.\n");

  69.     // Enable DAC channel 0, trigger by PDMA.
  70.     DAC_Open(DAC, 0, DAC_PDMA_TRIGGER);
  71.     // DAC clock is 42MHz, update DAC output every 5 us, the stable time is 42 * 5 clocks
  72.     DAC_SetDelayTime(DAC, 42 * 5);

  73.     // Wait 'til both channels are ready
  74.     while(DAC_IS_BUSY(DAC, 0) == 1);

  75.     /* Configure  PDMA channel 1 to trigger DAC */
  76.     PDMA_Open(1 << 1);
  77.     PDMA_SetTransferCnt(1, PDMA_WIDTH_16, SINE_ARRAY_SIZE);
  78.     // Set source to wrap around mode to generate sine wave continuously
  79.     // Set destination to DAC DATA0 address.
  80.     PDMA_SetTransferAddr(1, (uint32_t)a16Sine, PDMA_SAR_WRA, (uint32_t)&DAC->DATA0, PDMA_DAR_FIX);
  81.     // Set channel 1 transfer mode to DAC channel 0 TX
  82.     PDMA_SetTransferMode(1, PDMA_DAC0_TX, 0, 0);

  83.     PDMA_Trigger(1);

  84.     while(1);

  85. }

  86. /*** (C) COPYRIGHT 2014 Nuvoton Technology Corp. ***/


wahahaheihei 发表于 2020-5-20 21:21 | 显示全部楼层
  1. /**************************************************************************//**
  2. * @file     main.c
  3. * @version  V2.10
  4. * $Date: 15/06/30 11:40a $
  5. * @brief    Use PDMA channel 4 to demonstrate memory to memory transfer.
  6. *
  7. * @note
  8. * Copyright (C) 2012 Nuvoton Technology Corp. All rights reserved.
  9. *
  10. ******************************************************************************/
  11. #include <stdio.h>
  12. #include "Nano100Series.h"

  13. #define TEST_CH     4

  14. uint32_t PDMA_TEST_LENGTH = 64;
  15. uint8_t SrcArray[256];
  16. uint8_t DestArray[256];
  17. uint32_t volatile u32IsTestOver = 0;

  18. /**
  19. * @brief       DMA IRQ
  20. *
  21. * @param       None
  22. *
  23. * [url=home.php?mod=space&uid=266161]@return[/url]      None
  24. *
  25. * [url=home.php?mod=space&uid=1543424]@Details[/url]     The DMA default IRQ, declared in startup_nano100series.s.
  26. */
  27. void PDMA_IRQHandler(void)
  28. {
  29.     uint32_t status = PDMA_GET_INT_STATUS();

  30.     if (status & 0x2)   /* CH1 */
  31.     {
  32.         if (PDMA_GET_CH_INT_STS(1) & 0x2)
  33.             u32IsTestOver = 1;
  34.         PDMA_CLR_CH_INT_FLAG(1, PDMA_ISR_TD_IS_Msk);
  35.     }
  36.     else if (status & 0x4)     /* CH2 */
  37.     {
  38.         if (PDMA_GET_CH_INT_STS(2) & 0x2)
  39.             u32IsTestOver = 2;
  40.         PDMA_CLR_CH_INT_FLAG(2, PDMA_ISR_TD_IS_Msk);
  41.     }
  42.     else if (status & 0x8)     /* CH3 */
  43.     {
  44.         if (PDMA_GET_CH_INT_STS(3) & 0x2)
  45.             u32IsTestOver = 3;
  46.         PDMA_CLR_CH_INT_FLAG(3, PDMA_ISR_TD_IS_Msk);
  47.     }
  48.     else if (status & 0x10)     /* CH4 */
  49.     {
  50.         if (PDMA_GET_CH_INT_STS(4) & 0x2)
  51.             u32IsTestOver = 4;
  52.         PDMA_CLR_CH_INT_FLAG(4, PDMA_ISR_TD_IS_Msk);
  53.     }
  54.     else if (status & 0x20)     /* CH5 */
  55.     {
  56.         if (PDMA_GET_CH_INT_STS(5) & 0x2)
  57.             u32IsTestOver = 5;
  58.         PDMA_CLR_CH_INT_FLAG(5, PDMA_ISR_TD_IS_Msk);
  59.     }
  60.     else if (status & 0x40)     /* CH6 */
  61.     {
  62.         if (PDMA_GET_CH_INT_STS(6) & 0x2)
  63.             u32IsTestOver = 6;
  64.         PDMA_CLR_CH_INT_FLAG(6, PDMA_ISR_TD_IS_Msk);
  65.     }
  66.     else
  67.         printf("unknown interrupt !!\n");
  68. }

  69. void SYS_Init(void)
  70. {
  71.     /* Unlock protected registers */
  72.     SYS_UnlockReg();

  73.     /* Enable external 12MHz HXT */
  74.     CLK_EnableXtalRC(CLK_PWRCTL_HXT_EN_Msk);
  75.     CLK_EnablePLL(CLK_PLLCTL_PLL_SRC_HXT, 96000000);
  76.     /* Waiting for clock ready */
  77.     CLK_WaitClockReady(CLK_CLKSTATUS_HXT_STB_Msk | CLK_CLKSTATUS_PLL_STB_Msk);

  78.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_PLL, CLK_HCLK_CLK_DIVIDER(3));

  79.     CLK->AHBCLK |= CLK_AHBCLK_DMA_EN_Msk;
  80.     /* Select IP clock source */
  81.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_UART_CLK_DIVIDER(1));
  82.     /* Enable IP clock */
  83.     CLK_EnableModuleClock(UART0_MODULE);

  84.     /*---------------------------------------------------------------------------------------------------------*/
  85.     /* Init I/O Multi-function                                                                                 */
  86.     /*---------------------------------------------------------------------------------------------------------*/
  87.     /* Set PA multi-function pins for UART0 RXD and TXD */
  88. //    SYS->PA_H_MFP &= ~( SYS_PA_H_MFP_PA15_MFP_Msk | SYS_PA_H_MFP_PA14_MFP_Msk);
  89. //    SYS->PA_H_MFP |= (SYS_PA_H_MFP_PA15_MFP_UART0_TX|SYS_PA_H_MFP_PA14_MFP_UART0_RX);
  90.     SYS->PB_L_MFP &= ~( SYS_PB_L_MFP_PB0_MFP_Msk | SYS_PB_L_MFP_PB1_MFP_Msk);
  91.     SYS->PB_L_MFP |= (SYS_PB_L_MFP_PB1_MFP_UART0_TX|SYS_PB_L_MFP_PB0_MFP_UART0_RX);

  92.     /* Lock protected registers */
  93.     SYS_LockReg();
  94. }

  95. void UART0_Init(void)
  96. {
  97.     /* Reset IP */
  98.     SYS_ResetModule(UART0_RST);
  99.     UART0->BAUD = 0x67;              /* Baud Rate:115200  OSC:12MHz */
  100.     UART0->TLCTL = 0x03;             /* Character len is 8 bits */
  101. }

  102. /*---------------------------------------------------------------------------------------------------------*/
  103. /* MAIN function                                                                                           */
  104. /*---------------------------------------------------------------------------------------------------------*/
  105. int main (void)
  106. {
  107.     /* Init System, IP clock and multi-function I/O */
  108.     SYS_Init(); //In the end of SYS_Init() will issue SYS_LockReg() to lock protected register. If user want to write protected register, please issue SYS_UnlockReg() to unlock protected register.

  109.     /* Init UART for printf */
  110.     UART0_Init();

  111.     printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %dHz <%d>\n", SystemCoreClock, TEST_CH);

  112.     printf("+--------------------------------------+ \n");
  113.     printf("|    NANO100 PDMA Driver Sample Code   | \n");
  114.     printf("+--------------------------------------+ \n");

  115.     /* Open Channel 2 */
  116.     PDMA_Open(1 << TEST_CH);
  117.     PDMA_SetTransferCnt(TEST_CH, PDMA_WIDTH_32, PDMA_TEST_LENGTH);
  118.     PDMA_SetTransferAddr(TEST_CH, (uint32_t)SrcArray, PDMA_SAR_INC, (uint32_t)DestArray, PDMA_DAR_INC);
  119.     PDMA_SetTransferMode(TEST_CH, PDMA_MEM, 0, 0);
  120.     PDMA_SetTimeOut(TEST_CH, 0, 0x5555);
  121.     PDMA_EnableInt(TEST_CH, PDMA_IER_TD_IE_Msk);
  122.     NVIC_EnableIRQ(PDMA_IRQn);
  123.     u32IsTestOver = 0;
  124.     PDMA_Trigger(TEST_CH);
  125.     while(u32IsTestOver == 0);

  126.     if (u32IsTestOver == TEST_CH)
  127.         printf("test done...\n");

  128.     PDMA_Close();
  129.     while(1);
  130. }


wahahaheihei 发表于 2020-5-20 21:22 | 显示全部楼层
  1. /**************************************************************************//**
  2. * @file     main.c
  3. * @version  V1.00
  4. * $Revision: 4 $
  5. * $Date: 14/09/11 5:46p $
  6. * @brief    Demonstrate PWM Capture function by using PWM0 channel 2 to capture the output of PWM0 channel 0 and move captured data to SRAM with PDMA.
  7. *
  8. * @note
  9. * Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved.
  10. *****************************************************************************/
  11. #include <stdio.h>
  12. #include "Nano100Series.h"

  13. #define PDMA_CH 1
  14. #define SAMPLE_CNT 32

  15. uint16_t g_au16RxPDMADestination[SAMPLE_CNT];

  16. volatile uint32_t g_u32PdmaTDoneInt;

  17. void PDMA_IRQHandler(void)
  18. {
  19.     uint32_t status = PDMA_GET_INT_STATUS();

  20.     if (status & 0x2)   /* CH1 */
  21.     {
  22.         if (PDMA_GET_CH_INT_STS(1) & 0x2)
  23.             g_u32PdmaTDoneInt = 1;
  24.         PDMA_CLR_CH_INT_FLAG(1, PDMA_ISR_TD_IS_Msk);
  25.     }
  26.     else if (status & 0x4)     /* CH2 */
  27.     {
  28.         if (PDMA_GET_CH_INT_STS(2) & 0x2)
  29.             g_u32PdmaTDoneInt = 2;
  30.         PDMA_CLR_CH_INT_FLAG(2, PDMA_ISR_TD_IS_Msk);
  31.     }
  32.     else if (status & 0x8)     /* CH3 */
  33.     {
  34.         if (PDMA_GET_CH_INT_STS(3) & 0x2)
  35.             g_u32PdmaTDoneInt = 3;
  36.         PDMA_CLR_CH_INT_FLAG(3, PDMA_ISR_TD_IS_Msk);
  37.     }
  38.     else if (status & 0x10)     /* CH4 */
  39.     {
  40.         if (PDMA_GET_CH_INT_STS(4) & 0x2)
  41.             g_u32PdmaTDoneInt = 4;
  42.         PDMA_CLR_CH_INT_FLAG(4, PDMA_ISR_TD_IS_Msk);
  43.     }
  44.     else if (status & 0x20)     /* CH5 */
  45.     {
  46.         if (PDMA_GET_CH_INT_STS(5) & 0x2)
  47.             g_u32PdmaTDoneInt = 5;
  48.         PDMA_CLR_CH_INT_FLAG(5, PDMA_ISR_TD_IS_Msk);
  49.     }
  50.     else if (status & 0x40)     /* CH6 */
  51.     {
  52.         if (PDMA_GET_CH_INT_STS(6) & 0x2)
  53.             g_u32PdmaTDoneInt = 6;
  54.         PDMA_CLR_CH_INT_FLAG(6, PDMA_ISR_TD_IS_Msk);
  55.     }
  56.     else
  57.         printf("unknown interrupt !!\n");
  58. }

  59. /*---------------------------------------------------------------------------------------------------------*/
  60. /* Init System Clock                                                                                       */
  61. /*---------------------------------------------------------------------------------------------------------*/
  62. void SYS_Init(void)
  63. {
  64.     /* Unlock protected registers */
  65.     SYS_UnlockReg();

  66.     /* Set HCLK source form HXT and HCLK source divide 1  */
  67.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HXT,CLK_HCLK_CLK_DIVIDER(1));

  68.     /* Enable external 12MHz HXT, 32KHz LXT and HIRC */
  69.     CLK_EnableXtalRC(CLK_PWRCTL_HXT_EN_Msk | CLK_PWRCTL_LXT_EN_Msk | CLK_PWRCTL_HIRC_EN_Msk);

  70.     /* Waiting for clock ready */
  71.     CLK_WaitClockReady(CLK_CLKSTATUS_HXT_STB_Msk | CLK_CLKSTATUS_LXT_STB_Msk | CLK_CLKSTATUS_HIRC_STB_Msk);

  72.     /*  Set HCLK frequency 42MHz */
  73.     CLK_SetCoreClock(42000000);

  74.     CLK->AHBCLK |= CLK_AHBCLK_DMA_EN_Msk;

  75.     /* Enable IP clock */
  76.     CLK_EnableModuleClock(UART0_MODULE);

  77.     /* Enable PWM clock */
  78.     CLK_EnableModuleClock(PWM0_CH01_MODULE);
  79.     CLK_EnableModuleClock(PWM0_CH23_MODULE);

  80.     /* Select IP clock source */
  81.     CLK_SetModuleClock(UART0_MODULE,CLK_CLKSEL1_UART_S_HXT,CLK_UART_CLK_DIVIDER(1));

  82.     /* Set HCLK as PWM clock source */
  83.     CLK_SetModuleClock(PWM0_CH01_MODULE, CLK_CLKSEL1_PWM0_CH01_S_HCLK, 0);
  84.     CLK_SetModuleClock(PWM0_CH23_MODULE, CLK_CLKSEL1_PWM0_CH23_S_HCLK, 0);


  85.     /*---------------------------------------------------------------------------------------------------------*/
  86.     /* Init I/O Multi-function                                                                                 */
  87.     /*---------------------------------------------------------------------------------------------------------*/
  88.     /* Set PA multi-function pins for UART0 RXD and TXD */
  89.     SYS->PB_L_MFP &= ~( SYS_PB_L_MFP_PB0_MFP_Msk | SYS_PB_L_MFP_PB1_MFP_Msk);
  90.     SYS->PB_L_MFP |= (SYS_PB_L_MFP_PB0_MFP_UART0_RX | SYS_PB_L_MFP_PB1_MFP_UART0_TX );

  91.     /* Set PB multi-function pins for Clock Output */
  92.     SYS->PB_H_MFP = ( SYS->PB_H_MFP & ~SYS_PB_H_MFP_PB12_MFP_Msk ) |  SYS_PB_H_MFP_PB12_MFP_CKO;

  93.     /* Set PA.12 and PA.14 multi-function pins for PWM channel 0 and 2 */
  94.     SYS->PA_H_MFP = (SYS->PA_H_MFP & ~SYS_PA_H_MFP_PA12_MFP_Msk) | SYS_PA_H_MFP_PA12_MFP_PWM0_CH0;
  95.     SYS->PA_H_MFP = (SYS->PA_H_MFP & ~SYS_PA_H_MFP_PA14_MFP_Msk) | SYS_PA_H_MFP_PA14_MFP_PWM0_CH2;

  96.     /* Lock protected registers */
  97.     SYS_LockReg();
  98. }

  99. void UART0_Init()
  100. {
  101.     /*---------------------------------------------------------------------------------------------------------*/
  102.     /* Init UART                                                                                               */
  103.     /*---------------------------------------------------------------------------------------------------------*/
  104.     UART_Open(UART0, 115200);
  105. }

  106. static void PDMA_INIT(void)
  107. {
  108.     uint32_t u32SrcAddr, u32DstAddr;

  109.     /* Configure PDMA channel 1 to trigger PWM */
  110.     PDMA_Open(1 << PDMA_CH);
  111.     PDMA_SetTransferCnt(PDMA_CH, PDMA_WIDTH_16, SAMPLE_CNT);
  112.     u32SrcAddr = (uint32_t)&PWM0->PDMACH2;
  113.     u32DstAddr = (uint32_t)g_au16RxPDMADestination;
  114.     PDMA_SetTransferAddr(PDMA_CH, u32SrcAddr, PDMA_SAR_FIX, u32DstAddr, PDMA_DAR_INC);
  115.     PDMA_SetTimeOut(PDMA_CH, 0, 0x5555);
  116.     PDMA_EnableInt(PDMA_CH, PDMA_IER_TD_IE_Msk);
  117.     NVIC_EnableIRQ(PDMA_IRQn);

  118.     /* Set PDMA Channel 1 for PWM0 channel 2, and start timeout counting */
  119.     PDMA_SetTransferMode(PDMA_CH, PDMA_PWM0_CH2, 0, 0);

  120.     PDMA_Trigger(PDMA_CH);
  121. }

  122. int32_t main (void)
  123. {
  124.     uint8_t i;

  125.     /* Init System, IP clock and multi-function I/O
  126.        In the end of SYS_Init() will issue SYS_LockReg()
  127.        to lock protected register. If user want to write
  128.        protected register, please issue SYS_UnlockReg()
  129.        to unlock protected register if necessary */
  130.     SYS_Init();

  131.     /* Init UART to 115200-8n1 for print message */
  132.     UART0_Init();

  133.     printf("\nThis sample code demonstrates PWM captured data transferred by PDMA.\n");
  134.     printf("PWM0 channel 2 will capture the output of PWM0 channel 0\n");
  135.     printf("So, please connect GPIO port A12 with A14.\n");
  136.     // PWM0 frequency is 25000Hz, duty 30%,
  137.     PWM_ConfigOutputChannel(PWM0, 0, 25000, 30);

  138.     // PWM2
  139.     PWM_ConfigCaptureChannel(PWM0,2,50,0);

  140.     // Enable output of channel 0
  141.     PWM_EnableOutput(PWM0, PWM_CH_0_MASK);

  142.     // Enable capture of channel 2
  143.     PWM_EnableCapture(PWM0, PWM_CH_2_MASK);

  144.     //Enable PWM channel 2 capture PDMA
  145.     PWM_EnablePDMA(PWM0, 2, PWM_CAP_PDMA_RFORDER_R, PWM_RISING_FALLING_LATCH_PDMA_ENABLE);

  146.     /* Configure PDMA channel 1 */
  147.     PDMA_INIT();

  148.     /* Clear destination buffer */
  149.     for(i = 0; i < SAMPLE_CNT; i++)
  150.         g_au16RxPDMADestination[i] = 0;

  151.     // Start
  152.     PWM_Start(PWM0, (PWM_CH_0_MASK|PWM_CH_2_MASK));

  153.     /* Wait for PDMA transfer down */
  154.     while(g_u32PdmaTDoneInt == 0);

  155.     // Stop
  156.     PWM_Stop (PWM0, (PWM_CH_0_MASK|PWM_CH_2_MASK));

  157.     printf("Captured data is as below.\n");
  158.     printf("(rising : falling)\n");
  159.     for(i = 1; i < (SAMPLE_CNT  >> 1); i+=2)    // ignore first sampled data. it's wrong
  160.     {
  161.         printf("%d, %d : %d\n", i, g_au16RxPDMADestination[i], g_au16RxPDMADestination[i+1]);
  162.     }

  163.     while(1);


  164. }

  165. /*** (C) COPYRIGHT 2014 Nuvoton Technology Corp. ***/


wahahaheihei 发表于 2020-5-20 21:22 | 显示全部楼层
  1. /**************************************************************************//**
  2. * @file     main.c
  3. * @version  V1.00
  4. * $Revision: 2 $
  5. * $Date: 14/09/09 8:57a $
  6. * @brief    Demonstrate the usage of PDMA transfer. One SPI interface
  7. *           is enabled in loopback mode. Two PDMA channels are used
  8. *           in this sample, one for transmit, the other for receive.
  9. *
  10. * @note
  11. * Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved.
  12. *
  13. ******************************************************************************/
  14. #include <stdio.h>
  15. #include "Nano100Series.h"

  16. #define PDMA_TEST_COUNT 16

  17. uint32_t g_au32SrcData[PDMA_TEST_COUNT];
  18. uint32_t g_au32DstData[PDMA_TEST_COUNT];
  19. uint32_t volatile u32IsTestOver = 0;

  20. void PDMA_IRQHandler(void)
  21. {
  22.     uint32_t status = PDMA_GET_INT_STATUS();

  23.     if (status & 0x2)   /* done */
  24.     {
  25.         PDMA_CLR_CH_INT_FLAG(1, PDMA_ISR_TD_IS_Msk);
  26.     }
  27.     else if (status & 0x4)     /* done */
  28.     {
  29.         if (PDMA_GET_CH_INT_STS(2) & 0x2)
  30.             u32IsTestOver = 1;
  31.         PDMA_CLR_CH_INT_FLAG(2, PDMA_ISR_TD_IS_Msk);
  32.     }
  33.     else
  34.         printf("unknown interrupt, status=0x%x !!\n", status);
  35. }

  36. void SYS_Init(void)
  37. {
  38.     /*---------------------------------------------------------------------------------------------------------*/
  39.     /* Init System Clock                                                                                       */
  40.     /*---------------------------------------------------------------------------------------------------------*/
  41.     /* Unlock protected registers */
  42.     SYS_UnlockReg();

  43.     /* Set HCLK source form HXT and HCLK source divide 1  */
  44.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HXT,CLK_HCLK_CLK_DIVIDER(1));

  45.     /* Enable external 12MHz HXT, 32KHz LXT and HIRC */
  46.     CLK_EnableXtalRC(CLK_PWRCTL_HXT_EN_Msk | CLK_PWRCTL_LXT_EN_Msk | CLK_PWRCTL_HIRC_EN_Msk);

  47.     /* Waiting for clock ready */
  48.     CLK_WaitClockReady(CLK_CLKSTATUS_HXT_STB_Msk | CLK_CLKSTATUS_LXT_STB_Msk | CLK_CLKSTATUS_HIRC_STB_Msk);

  49.     /*  Set HCLK frequency 42MHz */
  50.     CLK_SetCoreClock(42000000);

  51.     /* Select IP clock source */
  52.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HIRC, CLK_UART_CLK_DIVIDER(1));
  53.     CLK_SetModuleClock(SPI0_MODULE, CLK_CLKSEL2_SPI0_S_HCLK, 0);

  54.     /* Enable IP clock */
  55.     CLK_EnableModuleClock(UART0_MODULE);
  56.     CLK_EnableModuleClock(SPI0_MODULE);
  57.     CLK_EnableModuleClock(DMA_MODULE);

  58.     /* Update System Core Clock */
  59.     /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
  60.     SystemCoreClockUpdate();

  61.     /*---------------------------------------------------------------------------------------------------------*/
  62.     /* Init I/O Multi-function                                                                                 */
  63.     /*---------------------------------------------------------------------------------------------------------*/
  64.     /* Set PA multi-function pins for UART0 RXD and TXD  */
  65.     SYS->PA_H_MFP = (SYS_PA_H_MFP_PA14_MFP_UART0_RX | SYS_PA_H_MFP_PA15_MFP_UART0_TX);

  66.     /* Set multi function pin for SPI0 */
  67.     SYS->PC_L_MFP = (SYS_PC_L_MFP_PC0_MFP_SPI0_SS0 | SYS_PC_L_MFP_PC1_MFP_SPI0_SCLK | SYS_PC_L_MFP_PC2_MFP_SPI0_MISO0 | SYS_PC_L_MFP_PC3_MFP_SPI0_MOSI0);

  68.     /* Lock protected registers */
  69.     SYS_LockReg();
  70. }

  71. int main(void)
  72. {
  73.     uint32_t u32Err=0;
  74.     uint32_t i;

  75.     /* Init System, IP clock and multi-function I/O */
  76.     SYS_Init();

  77.     /* Init UART to 115200-8n1 for print message */
  78.     UART_Open(UART0, 115200);

  79.     /* Configure SPI0 as a master, MSB first, 32-bit transaction, SPI Mode-0 timing, clock is 2MHz */
  80.     SPI_Open(SPI0, SPI_MASTER, SPI_MODE_0, 32, 2000000);

  81.     /* Enable the automatic hardware slave select function. Select the SPI0_SS0 pin and configure as low-active. */
  82.     SPI_EnableAutoSS(SPI0, SPI_SS0, SPI_SS0_ACTIVE_LOW);

  83.     printf("\n\n");
  84.     printf("+----------------------------------------------------------------------+\n");
  85.     printf("|                     SPI with PDMA Sample Code                        |\n");
  86.     printf("+----------------------------------------------------------------------+\n");
  87.     printf("\n");

  88.     printf("The I/O connection for SPI0 loopback:\n");
  89.     printf("    SPI0_MISO(PC.2) <--> SPI0_MOSI(PC.3)\n\n\n");
  90.     printf("Please connect SPI0 MISO and MOSI pin, and press any key to start transmission ...");
  91.     getchar();
  92.     printf("\n");

  93.     for(i=0; i<PDMA_TEST_COUNT; i++)
  94.         g_au32SrcData[i] = 0x55550000 + i;

  95.     /* Open Channel 1 for SPI0 TX, channel 2 for SPI0 RX */
  96.     PDMA_Open(3 << 1);

  97.     /* Configure channel 1 */
  98.     PDMA_SetTransferCnt(1, PDMA_WIDTH_32, PDMA_TEST_COUNT);
  99.     PDMA_SetTransferAddr(1, (uint32_t)g_au32SrcData, PDMA_SAR_INC, (uint32_t)&SPI0->TX0, PDMA_DAR_FIX);
  100.     PDMA_SetTimeOut(1, 0, 0x5555);
  101.     PDMA_EnableInt(1, PDMA_IER_TD_IE_Msk);

  102.     /* Configure channel 2 */
  103.     PDMA_SetTransferCnt(2, PDMA_WIDTH_32, PDMA_TEST_COUNT);
  104.     PDMA_SetTransferAddr(2, (uint32_t)&SPI0->RX0, PDMA_SAR_FIX, (uint32_t)g_au32DstData, PDMA_DAR_INC);
  105.     PDMA_SetTimeOut(2, 0, 0x5555);
  106.     PDMA_EnableInt(2, PDMA_IER_TD_IE_Msk);

  107.     /* Set Channel 1 for SPI0 TX, channel 2 for SPI0 RX, and then start timeout counting */
  108.     PDMA_SetTransferMode(1, PDMA_SPI0_TX, 0, 0);
  109.     PDMA_SetTransferMode(2, PDMA_SPI0_RX, 0, 0);

  110.     PDMA_Trigger(1);
  111.     PDMA_Trigger(2);

  112.     /* Enable PDMA IRQ */
  113.     NVIC_EnableIRQ(PDMA_IRQn);

  114.     /* Trigger PDMA */
  115.     SPI_TRIGGER_RX_PDMA(SPI0);
  116.     SPI_TRIGGER_TX_PDMA(SPI0);

  117.     /* Wait for PDMA operation finish */
  118.     while(u32IsTestOver == 0);

  119.     /* Check PDMA status */
  120.     if(u32IsTestOver != 1)
  121.         printf("PDMA error !\n");

  122.     /* Check Rx Data */
  123.     for(i=0; i<PDMA_TEST_COUNT; i++)
  124.     {
  125.         if(g_au32SrcData[i] != g_au32DstData[i])
  126.         {
  127.             u32Err ++;
  128.         }
  129.     }

  130.     if(u32Err)
  131.         printf(" [FAIL]\n\n");
  132.     else
  133.         printf(" [PASS]\n\n");

  134.     while(1);
  135. }

  136. /*** (C) COPYRIGHT 2014 Nuvoton Technology Corp. ***/
wahahaheihei 发表于 2020-5-20 21:23 | 显示全部楼层
官方提供了大概这几个例子,你可以对比学习,会发现他们之间的共同点。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

23

帖子

0

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