[技术问答] NUC140 DMA flash memeory

[复制链接]
1220|4
 楼主| stormwind123 发表于 2024-7-18 09:28 | 显示全部楼层 |阅读模式

您好 我想要
UART 使用DMA的功能和flash memory相關功能
不知道m0是否有相關功能和範例程式
jiekou001 发表于 2024-7-25 23:13 | 显示全部楼层
看了一下,这个芯片还真支持DMA。
jiekou001 发表于 2024-7-25 23:18 | 显示全部楼层
NUC100 series (NUC100 / NUC120 / NUC130 / NUC140) software package based on CMSIS version 1.3. It supports both IAR and Keil development environment with drivers and samples codes. Examples source code for NuTiny-SDK-NUC100/120/130/140 and Learning Board are included. For detailed, please download it and unzip it.
jiekou001 发表于 2024-7-25 23:22 | 显示全部楼层
  1. /**************************************************************************//**
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V3.0
  4. * $Revision: 1 $
  5. * $Date: 15/04/20 4:04p $
  6. * @brief
  7. *           Demonstrate SPI data transfer with PDMA.
  8. *           SPI0 will be configured as Master mode and SPI1 will be configured as Slave mode.
  9. *           Both TX PDMA function and RX PDMA function will be enabled.
  10. * @note
  11. * Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved.
  12. *
  13. ******************************************************************************/
  14. #include <stdio.h>
  15. #include "NUC100Series.h"

  16. #define PLL_CLOCK           50000000

  17. #define TEST_COUNT 64

  18. #define SPI_MASTER_TX_DMA_CH 3
  19. #define SPI_MASTER_RX_DMA_CH 2
  20. #define SPI_SLAVE_TX_DMA_CH  0
  21. #define SPI_SLAVE_RX_DMA_CH  1

  22. /* Global variable declaration */
  23. uint32_t g_au32MasterToSlaveTestPattern[TEST_COUNT];
  24. uint32_t g_au32SlaveToMasterTestPattern[TEST_COUNT];
  25. uint32_t g_au32MasterRxBuffer[TEST_COUNT];
  26. uint32_t g_au32SlaveRxBuffer[TEST_COUNT];

  27. /* Function prototype declaration */
  28. void SYS_Init(void);
  29. void SPI_Init(void);
  30. void SpiLoopTest_WithPDMA(void);

  31. /* ------------- */
  32. /* Main function */
  33. /* ------------- */
  34. int main(void)
  35. {
  36.     /* Unlock protected registers */
  37.     SYS_UnlockReg();
  38.     /* Init system, IP clock and multi-function I/O. */
  39.     SYS_Init();
  40.     /* Lock protected registers */
  41.     SYS_LockReg();

  42.     /* Configure UART0: 115200, 8-bit word, no parity bit, 1 stop bit. */
  43.     UART_Open(UART0, 115200);

  44.     /* Init SPI */
  45.     SPI_Init();

  46.     printf("\n\n");
  47.     printf("+--------------------------------------------------------------+\n");
  48.     printf("|                  SPI + PDMA Sample Code                      |\n");
  49.     printf("+--------------------------------------------------------------+\n");
  50.     printf("\n");
  51.     printf("Configure SPI0 as a master and SPI1 as a slave.\n");
  52.     printf("Bit length of a transaction: 32\n");
  53.     printf("The I/O connection for SPI0/SPI1 loopback:\n");
  54.     printf("    SPI0_SS0  (PC.0) <--> SPI1_SS0(PC.8)\n    SPI0_CLK  (PC.1) <--> SPI1_CLK(PC.9)\n");
  55.     printf("    SPI0_MISO0(PC.2) <--> SPI1_MISO0(PC.10)\n    SPI0_MOSI0(PC.3) <--> SPI1_MOSI0(PC.11)\n\n");
  56.     printf("Please connect SPI0 with SPI1, and press any key to start transmission ...");
  57.     getchar();
  58.     printf("\n");

  59.     SpiLoopTest_WithPDMA();

  60.     printf("\n\nExit SPI driver sample code.\n");

  61.     /* Reset SPI0 */
  62.     SPI_Close(SPI0);
  63.     /* Reset SPI1 */
  64.     SPI_Close(SPI1);
  65.     while(1);
  66. }

  67. void SYS_Init(void)
  68. {
  69.     /*---------------------------------------------------------------------------------------------------------*/
  70.     /* Init System Clock                                                                                       */
  71.     /*---------------------------------------------------------------------------------------------------------*/

  72.     /* Enable Internal RC 22.1184 MHz clock */
  73.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

  74.     /* Waiting for Internal RC clock ready */
  75.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);
  76.    
  77.     /* Enable external 12 MHz XTAL */
  78.     CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

  79.     /* Waiting for clock ready */
  80.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

  81.     /* Set core clock rate as PLL_CLOCK from PLL */
  82.     CLK_SetCoreClock(PLL_CLOCK);

  83.     /* Select HXT as the clock source of UART0 */
  84.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));

  85.     /* Select HCLK as the clock source of SPI0 */
  86.     CLK_SetModuleClock(SPI0_MODULE, CLK_CLKSEL1_SPI0_S_HCLK, MODULE_NoMsk);

  87.     /* Select HCLK as the clock source of SPI1 */
  88.     CLK_SetModuleClock(SPI1_MODULE, CLK_CLKSEL1_SPI1_S_HCLK, MODULE_NoMsk);

  89.     /* Enable UART peripheral clock */
  90.     CLK_EnableModuleClock(UART0_MODULE);
  91.     /* Enable SPI0 peripheral clock */
  92.     CLK_EnableModuleClock(SPI0_MODULE);
  93.     /* Enable SPI1 peripheral clock */
  94.     CLK_EnableModuleClock(SPI1_MODULE);
  95.     /* Enable PDMA peripheral clock */
  96.     CLK_EnableModuleClock(PDMA_MODULE);

  97.     /* Update System Core Clock */
  98.     /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CyclesPerUs automatically. */
  99.     SystemCoreClockUpdate();

  100.     /*---------------------------------------------------------------------------------------------------------*/
  101.     /* Init I/O Multi-function                                                                                 */
  102.     /*---------------------------------------------------------------------------------------------------------*/
  103.     /* Set PB multi-function pins for UART0 RXD and TXD */
  104.     SYS->GPB_MFP &= ~(SYS_GPB_MFP_PB0_Msk | SYS_GPB_MFP_PB1_Msk);
  105.     SYS->GPB_MFP |= (SYS_GPB_MFP_PB0_UART0_RXD | SYS_GPB_MFP_PB1_UART0_TXD);

  106.     /* Setup SPI0 and SPI1 multi-function pins */
  107.     SYS->GPC_MFP &= ~(SYS_GPC_MFP_PC0_Msk | SYS_GPC_MFP_PC1_Msk | SYS_GPC_MFP_PC2_Msk | SYS_GPC_MFP_PC3_Msk |
  108.                       SYS_GPC_MFP_PC8_Msk | SYS_GPC_MFP_PC9_Msk | SYS_GPC_MFP_PC10_Msk | SYS_GPC_MFP_PC11_Msk);
  109.     SYS->GPC_MFP |= (SYS_GPC_MFP_PC0_SPI0_SS0 | SYS_GPC_MFP_PC1_SPI0_CLK | SYS_GPC_MFP_PC2_SPI0_MISO0 | SYS_GPC_MFP_PC3_SPI0_MOSI0 |
  110.                      SYS_GPC_MFP_PC8_SPI1_SS0 | SYS_GPC_MFP_PC9_SPI1_CLK | SYS_GPC_MFP_PC10_SPI1_MISO0 | SYS_GPC_MFP_PC11_SPI1_MOSI0);
  111.     SYS->ALT_MFP &= ~(SYS_ALT_MFP_PC0_Msk | SYS_ALT_MFP_PC1_Msk | SYS_ALT_MFP_PC2_Msk | SYS_ALT_MFP_PC3_Msk |
  112.                       SYS_ALT_MFP_PC8_Msk);
  113.     SYS->ALT_MFP |= (SYS_ALT_MFP_PC0_SPI0_SS0 | SYS_ALT_MFP_PC1_SPI0_CLK | SYS_ALT_MFP_PC2_SPI0_MISO0 | SYS_ALT_MFP_PC3_SPI0_MOSI0 |
  114.                      SYS_ALT_MFP_PC8_SPI1_SS0 | SYS_ALT_MFP_PC9_SPI1_CLK | SYS_ALT_MFP_PC10_SPI1_MISO0 | SYS_ALT_MFP_PC11_SPI1_MOSI0);
  115. }

  116. void SPI_Init(void)
  117. {
  118.     /*---------------------------------------------------------------------------------------------------------*/
  119.     /* Init SPI                                                                                                */
  120.     /*---------------------------------------------------------------------------------------------------------*/
  121.     /* Configure SPI0 */
  122.     /* Configure as a master, clock idle low, 32-bit transaction, drive output on falling clock edge and latch input on rising edge. */
  123.     /* Set IP clock divider. SPI clock rate = 1 MHz */
  124.     SPI_Open(SPI0, SPI_MASTER, SPI_MODE_0, 32, 1000000);
  125.     /* Enable the automatic hardware slave select function. Select the SPI0_SS0 pin and configure as low-active. */
  126.     SPI_EnableAutoSS(SPI0, SPI_SS0, SPI_SS_ACTIVE_LOW);
  127.    
  128.     /* Configure SPI1 */
  129.     /* Configure SPI1 as a slave, clock idle low, 32-bit transaction, drive output on falling clock edge and latch input on rising edge. */
  130.     /* Configure SPI1 as a low level active device. */
  131.     SPI_Open(SPI1, SPI_SLAVE, SPI_MODE_0, 32, 0);
  132.     /* Enable FIFO mode */
  133.     SPI1->CNTRL |= SPI_CNTRL_FIFO_Msk;
  134. }

  135. void SpiLoopTest_WithPDMA(void)
  136. {
  137.     PDMA_T *pdma;
  138.     uint32_t u32DataCount;
  139.     int32_t i32Err;


  140.     printf("\nSPI0/1 loop test with PDMA ... ");

  141.     /* Source data initiation */
  142.     for(u32DataCount = 0; u32DataCount < TEST_COUNT; u32DataCount++)
  143.     {
  144.         g_au32MasterToSlaveTestPattern[u32DataCount] = 0x55000000 | (u32DataCount + 1);
  145.         g_au32SlaveToMasterTestPattern[u32DataCount] = 0xAA000000 | (u32DataCount + 1);
  146.     }

  147.     /* Enable PDMA channels */
  148.     PDMA_Open((1 << SPI_MASTER_TX_DMA_CH) | (1 << SPI_MASTER_RX_DMA_CH) | (1 << SPI_SLAVE_RX_DMA_CH) | (1 << SPI_SLAVE_TX_DMA_CH));

  149.     /* SPI master PDMA TX channel configuration */
  150.     /* Set transfer width (32 bits) and transfer count */
  151.     PDMA_SetTransferCnt(SPI_MASTER_TX_DMA_CH, PDMA_WIDTH_32, TEST_COUNT);
  152.     /* Set source/destination address and attributes */
  153.     PDMA_SetTransferAddr(SPI_MASTER_TX_DMA_CH, (uint32_t)g_au32MasterToSlaveTestPattern, PDMA_SAR_INC, (uint32_t)&SPI0->TX, PDMA_DAR_FIX);
  154.     /* Set request source. */
  155.     PDMA_SetTransferMode(SPI_MASTER_TX_DMA_CH, PDMA_SPI0_TX, FALSE, 0);
  156.     /* Set Memory-to-Peripheral mode */
  157.     pdma = (PDMA_T *)((uint32_t) PDMA0_BASE + (0x100 * SPI_MASTER_TX_DMA_CH));
  158.     pdma->CSR = (pdma->CSR & (~PDMA_CSR_MODE_SEL_Msk)) | (0x2<<PDMA_CSR_MODE_SEL_Pos);
  159.    
  160.     /* SPI master PDMA RX channel configuration */
  161.     /* Set transfer width (32 bits) and transfer count */
  162.     PDMA_SetTransferCnt(SPI_MASTER_RX_DMA_CH, PDMA_WIDTH_32, TEST_COUNT);
  163.     /* Set source/destination address and attributes */
  164.     PDMA_SetTransferAddr(SPI_MASTER_RX_DMA_CH, (uint32_t)&SPI0->RX, PDMA_SAR_FIX, (uint32_t)g_au32MasterRxBuffer, PDMA_DAR_INC);
  165.     /* Set request source. */
  166.     PDMA_SetTransferMode(SPI_MASTER_RX_DMA_CH, PDMA_SPI0_RX, FALSE, 0);
  167.     /* Set Peripheral-to-Memory mode */
  168.     pdma = (PDMA_T *)((uint32_t) PDMA0_BASE + (0x100 * SPI_MASTER_RX_DMA_CH));
  169.     pdma->CSR = (pdma->CSR & (~PDMA_CSR_MODE_SEL_Msk)) | (0x1<<PDMA_CSR_MODE_SEL_Pos);
  170.    
  171.     /* SPI slave PDMA RX channel configuration */
  172.     /* Set transfer width (32 bits) and transfer count */
  173.     PDMA_SetTransferCnt(SPI_SLAVE_RX_DMA_CH, PDMA_WIDTH_32, TEST_COUNT);
  174.     /* Set source/destination address and attributes */
  175.     PDMA_SetTransferAddr(SPI_SLAVE_RX_DMA_CH, (uint32_t)&SPI1->RX, PDMA_SAR_FIX, (uint32_t)g_au32SlaveRxBuffer, PDMA_DAR_INC);
  176.     /* Set request source. */
  177.     PDMA_SetTransferMode(SPI_SLAVE_RX_DMA_CH, PDMA_SPI1_RX, FALSE, 0);
  178.     /* Set Peripheral-to-Memory mode */
  179.     pdma = (PDMA_T *)((uint32_t) PDMA0_BASE + (0x100 * SPI_SLAVE_RX_DMA_CH));
  180.     pdma->CSR = (pdma->CSR & (~PDMA_CSR_MODE_SEL_Msk)) | (0x1<<PDMA_CSR_MODE_SEL_Pos);
  181.    
  182.     /* SPI slave PDMA TX channel configuration */
  183.     /* Set transfer width (32 bits) and transfer count */
  184.     PDMA_SetTransferCnt(SPI_SLAVE_TX_DMA_CH, PDMA_WIDTH_32, TEST_COUNT);
  185.     /* Set source/destination address and attributes */
  186.     PDMA_SetTransferAddr(SPI_SLAVE_TX_DMA_CH, (uint32_t)g_au32SlaveToMasterTestPattern, PDMA_SAR_INC, (uint32_t)&SPI1->TX, PDMA_DAR_FIX);
  187.     /* Set request source. */
  188.     PDMA_SetTransferMode(SPI_SLAVE_TX_DMA_CH, PDMA_SPI1_TX, FALSE, 0);
  189.     /* Set Memory-to-Peripheral mode */
  190.     pdma = (PDMA_T *)((uint32_t) PDMA0_BASE + (0x100 * SPI_SLAVE_TX_DMA_CH));
  191.     pdma->CSR = (pdma->CSR & (~PDMA_CSR_MODE_SEL_Msk)) | (0x2<<PDMA_CSR_MODE_SEL_Pos);
  192.    
  193.     /* Trigger PDMA */
  194.     PDMA_Trigger(SPI_SLAVE_RX_DMA_CH);
  195.     PDMA_Trigger(SPI_SLAVE_TX_DMA_CH);
  196.     PDMA_Trigger(SPI_MASTER_TX_DMA_CH);
  197.     PDMA_Trigger(SPI_MASTER_RX_DMA_CH);
  198.    
  199.     /* Enable SPI slave DMA function */
  200.     SPI_TRIGGER_TX_RX_PDMA(SPI1);
  201.     /* Enable SPI master DMA function */
  202.     SPI_TRIGGER_TX_RX_PDMA(SPI0);
  203.    
  204.     /* Check Master RX DMA transfer done interrupt flag */
  205.     while((PDMA_GET_CH_INT_STS(SPI_MASTER_RX_DMA_CH) & PDMA_ISR_BLKD_IF_Msk)==0);
  206.     /* Clear the transfer done interrupt flag */
  207.     PDMA_CLR_CH_INT_FLAG(SPI_MASTER_RX_DMA_CH, PDMA_ISR_BLKD_IF_Msk);
  208.    
  209.     /* Check Master TX DMA transfer done interrupt flag */
  210.     while((PDMA_GET_CH_INT_STS(SPI_MASTER_TX_DMA_CH) & PDMA_ISR_BLKD_IF_Msk)==0);
  211.     /* Clear the transfer done interrupt flag */
  212.     PDMA_CLR_CH_INT_FLAG(SPI_MASTER_TX_DMA_CH, PDMA_ISR_BLKD_IF_Msk);
  213.    
  214.     /* Check Slave TX DMA transfer done interrupt flag */
  215.     while((PDMA_GET_CH_INT_STS(SPI_SLAVE_TX_DMA_CH) & PDMA_ISR_BLKD_IF_Msk)==0);
  216.     /* Clear the transfer done interrupt flag */
  217.     PDMA_CLR_CH_INT_FLAG(SPI_SLAVE_TX_DMA_CH, PDMA_ISR_BLKD_IF_Msk);
  218.    
  219.     /* Check Slave RX DMA transfer done interrupt flag */
  220.     while((PDMA_GET_CH_INT_STS(SPI_SLAVE_RX_DMA_CH) & PDMA_ISR_BLKD_IF_Msk)==0);
  221.     /* Clear the transfer done interrupt flag */
  222.     PDMA_CLR_CH_INT_FLAG(SPI_SLAVE_RX_DMA_CH, PDMA_ISR_BLKD_IF_Msk);
  223.    
  224.     i32Err = 0;
  225.     /* Check the transfer data */
  226.     for(u32DataCount=0; u32DataCount<TEST_COUNT; u32DataCount++)
  227.     {
  228.         if(g_au32MasterToSlaveTestPattern[u32DataCount] != g_au32SlaveRxBuffer[u32DataCount]){
  229.             i32Err = 1;
  230.             break;
  231.         }
  232.         if(g_au32SlaveToMasterTestPattern[u32DataCount] != g_au32MasterRxBuffer[u32DataCount]){
  233.             i32Err = 1;
  234.             break;
  235.         }
  236.     }
  237.    
  238.     /* Disable PDMA peripheral clock */
  239.     CLK->AHBCLK &= ~CLK_AHBCLK_PDMA_EN_Msk;

  240.     if(i32Err)
  241.     {
  242.         printf("[FAIL]\n");
  243.     }
  244.     else
  245.     {
  246.         printf("[PASS]\n");
  247.     }

  248.     return;
  249. }


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

jiekou001 发表于 2024-7-25 23:22 | 显示全部楼层
你可以参靠SPI的这个DMA例子
您需要登录后才可以回帖 登录 | 注册

本版积分规则

605

主题

3755

帖子

3

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