[DemoCode下载] NUC123的PDMA操作

[复制链接]
592|4
 楼主| xuanhuanzi 发表于 2019-12-26 21:43 | 显示全部楼层 |阅读模式
  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: 7 $
  5. * $Date: 15/07/02 3:11p $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    Demonstrate how to use PDMA channel 0 to transfer data from memory to memory.
  7. * @note
  8. * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved.
  9. *
  10. ******************************************************************************/
  11. #include <stdio.h>
  12. #include "NUC123.h"

  13. /*---------------------------------------------------------------------------------------------------------*/
  14. /* Macro, type and constant definitions                                                                    */
  15. /*---------------------------------------------------------------------------------------------------------*/

  16. #define PLLCON_SETTING      CLK_PLLCON_72MHz_HXT
  17. #define PLL_CLOCK           72000000

  18. #define TEST_CH     0

  19. uint32_t PDMA_TEST_LENGTH = 64;
  20. uint8_t SrcArray[256];
  21. uint8_t DestArray[256];
  22. uint32_t volatile u32IsTestOver = 0xFF;

  23. /*---------------------------------------------------------------------------------------------------------*/
  24. /* Global variables                                                                                        */
  25. /*---------------------------------------------------------------------------------------------------------*/

  26. /**
  27. * @brief       DMA IRQ
  28. *
  29. * @param       None
  30. *
  31. * [url=home.php?mod=space&uid=266161]@return[/url]      None
  32. *
  33. * [url=home.php?mod=space&uid=1543424]@Details[/url]     The DMA default IRQ, declared in startup_nuc200Series.s.
  34. */
  35. void PDMA_IRQHandler(void)
  36. {
  37.     uint32_t status = PDMA_GET_INT_STATUS();

  38.     if(status & 0x1)    /* CH0 */
  39.     {
  40.         if(PDMA_GET_CH_INT_STS(0) & 0x2)
  41.             u32IsTestOver = 0;
  42.         PDMA_CLR_CH_INT_FLAG(0, PDMA_ISR_BLKD_IF_Msk);
  43.     }
  44.     else if(status & 0x2)      /* CH1 */
  45.     {
  46.         if(PDMA_GET_CH_INT_STS(1) & 0x2)
  47.             u32IsTestOver = 1;
  48.         PDMA_CLR_CH_INT_FLAG(1, PDMA_ISR_BLKD_IF_Msk);
  49.     }
  50.     else if(status & 0x4)      /* CH2 */
  51.     {
  52.         if(PDMA_GET_CH_INT_STS(2) & 0x2)
  53.             u32IsTestOver = 2;
  54.         PDMA_CLR_CH_INT_FLAG(2, PDMA_ISR_BLKD_IF_Msk);
  55.     }
  56.     else if(status & 0x8)      /* CH3 */
  57.     {
  58.         if(PDMA_GET_CH_INT_STS(3) & 0x2)
  59.             u32IsTestOver = 3;
  60.         PDMA_CLR_CH_INT_FLAG(3, PDMA_ISR_BLKD_IF_Msk);
  61.     }
  62.     else if(status & 0x10)      /* CH4 */
  63.     {
  64.         if(PDMA_GET_CH_INT_STS(4) & 0x2)
  65.             u32IsTestOver = 4;
  66.         PDMA_CLR_CH_INT_FLAG(4, PDMA_ISR_BLKD_IF_Msk);
  67.     }
  68.     else if(status & 0x20)      /* CH5 */
  69.     {
  70.         if(PDMA_GET_CH_INT_STS(5) & 0x2)
  71.             u32IsTestOver = 5;
  72.         PDMA_CLR_CH_INT_FLAG(5, PDMA_ISR_BLKD_IF_Msk);
  73.     }
  74.     else
  75.         printf("unknown interrupt !!\n");
  76. }

  77. void SYS_Init(void)
  78. {
  79.     /*---------------------------------------------------------------------------------------------------------*/
  80.     /* Init System Clock                                                                                       */
  81.     /*---------------------------------------------------------------------------------------------------------*/

  82.     /* Enable Internal RC clock */
  83.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

  84.     /* Waiting for IRC22M clock ready */
  85.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

  86.     /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
  87.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

  88.     /* Enable XT1_OUT(PF.0) and XT1_IN(PF.1) */
  89.     SYS->GPF_MFP |= SYS_GPF_MFP_PF0_XT1_OUT | SYS_GPF_MFP_PF1_XT1_IN;

  90.     /* Enable external 12MHz XTAL, internal 22.1184MHz */
  91.     CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk | CLK_PWRCON_OSC22M_EN_Msk);

  92.     /* Enable PLL and Set PLL frequency */
  93.     CLK_SetCoreClock(PLL_CLOCK);

  94.     /* Waiting for clock ready */
  95.     CLK_WaitClockReady(CLK_CLKSTATUS_PLL_STB_Msk | CLK_CLKSTATUS_XTL12M_STB_Msk | CLK_CLKSTATUS_OSC22M_STB_Msk);

  96.     /* Switch HCLK clock source to PLL, STCLK to HCLK/2 */
  97.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_PLL, CLK_CLKDIV_HCLK(2));

  98.     /* Enable UART module clock */
  99.     CLK_EnableModuleClock(UART0_MODULE);

  100.     /* Enable PDMA module clock */
  101.     CLK->AHBCLK |= CLK_AHBCLK_PDMA_EN_Msk;

  102.     /* Select UART module clock source */
  103.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));

  104.     /* Update System Core Clock */
  105.     /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
  106.     //SystemCoreClockUpdate();
  107.     PllClock        = PLL_CLOCK;            // PLL
  108.     SystemCoreClock = PLL_CLOCK / 1;        // HCLK
  109.     CyclesPerUs     = PLL_CLOCK / 1000000;  // For SYS_SysTickDelay()

  110.     /*---------------------------------------------------------------------------------------------------------*/
  111.     /* Init I/O Multi-function                                                                                 */
  112.     /*---------------------------------------------------------------------------------------------------------*/
  113.     /* Set GPB multi-function pins for UART0 RXD and TXD */
  114.     SYS->GPB_MFP &= ~(SYS_GPB_MFP_PB0_Msk | SYS_GPB_MFP_PB1_Msk);
  115.     SYS->GPB_MFP |= (SYS_GPB_MFP_PB0_UART0_RXD | SYS_GPB_MFP_PB1_UART0_TXD);
  116. }

  117. void UART0_Init()
  118. {
  119.     /*---------------------------------------------------------------------------------------------------------*/
  120.     /* Init UART                                                                                               */
  121.     /*---------------------------------------------------------------------------------------------------------*/
  122.     /* Reset IP */
  123.     SYS_ResetModule(UART0_RST);

  124.     /* Configure UART0 and set UART0 Baudrate */
  125.     UART_Open(UART0, 115200);
  126. }

  127. /*---------------------------------------------------------------------------------------------------------*/
  128. /*  Main Function                                                                                          */
  129. /*---------------------------------------------------------------------------------------------------------*/
  130. int32_t main(void)
  131. {
  132.     /* Init System, IP clock and multi-function I/O
  133.        In the end of SYS_Init() will issue SYS_LockReg()
  134.        to lock protected register. If user want to write
  135.        protected register, please issue SYS_UnlockReg()
  136.        to unlock protected register if necessary */

  137.     /* Unlock protected registers */
  138.     SYS_UnlockReg();

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

  141.     /* Lock protected registers */
  142.     SYS_LockReg();

  143.     /* Init UART0 for printf */
  144.     UART0_Init();

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

  146.     printf("+--------------------------------------+ \n");
  147.     printf("|    NUC123 PDMA Driver Sample Code   | \n");
  148.     printf("+--------------------------------------+ \n");

  149.     /* Open Channel TEST_CH */
  150.     PDMA_Open(1 << TEST_CH);
  151.     PDMA_SetTransferCnt(TEST_CH, PDMA_WIDTH_32, PDMA_TEST_LENGTH);
  152.     PDMA_SetTransferAddr(TEST_CH, (uint32_t)SrcArray, PDMA_SAR_INC, (uint32_t)DestArray, PDMA_DAR_INC);
  153.     PDMA_EnableInt(TEST_CH, PDMA_IER_BLKD_IE_Msk);
  154.     NVIC_EnableIRQ(PDMA_IRQn);
  155.     u32IsTestOver = 0xFF;
  156.     PDMA_Trigger(TEST_CH);
  157.     while(u32IsTestOver == 0xFF);

  158.     if(u32IsTestOver == TEST_CH)
  159.         printf("test done...\n");

  160.     PDMA_Close();

  161.     while(1);
  162. }






幸福小强 发表于 2019-12-26 22:47 | 显示全部楼层

    /* Open Channel TEST_CH */
    PDMA_Open(1 << TEST_CH);
    PDMA_SetTransferCnt(TEST_CH, PDMA_WIDTH_32, PDMA_TEST_LENGTH);
    PDMA_SetTransferAddr(TEST_CH, (uint32_t)SrcArray, PDMA_SAR_INC, (uint32_t)DestArray, PDMA_DAR_INC);
    PDMA_EnableInt(TEST_CH, PDMA_IER_BLKD_IE_Msk);
    NVIC_EnableIRQ(PDMA_IRQn);
    u32IsTestOver = 0xFF;
    PDMA_Trigger(TEST_CH);
幸福小强 发表于 2019-12-26 22:47 | 显示全部楼层
配置挺简单的,有没有中文教程说明原理之类的。
yiy 发表于 2019-12-29 17:40 | 显示全部楼层
需要好好研究一下这个方面的,一直没用过,也不知道怎么用,干啥用噢那个。
捉虫天师 发表于 2020-1-6 20:08 | 显示全部楼层
支持所有外设?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

183

主题

2331

帖子

3

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