[DemoCode下载] NUC240 RTX 结合 SPI PDMA

[复制链接]
3426|12
 楼主| a_ziliu 发表于 2015-10-22 14:44 | 显示全部楼层 |阅读模式
使用NUC240 RTX 结合 SPI PDMA 读取SPI FLASH.
NUC230_240BSP_CMSIS_V3.00.001 - RTX SPI PDMA.zip (402.33 KB, 下载次数: 35)

734774645 发表于 2015-10-22 17:21 | 显示全部楼层
SPI的DMA,为何要带个P呢。PDMA是什么,跟DMA有区别吗
捉虫天师 发表于 2015-10-22 21:14 | 显示全部楼层
使用NUC240 RTX 结合 SPI PDMA 读取SPI FLASH。有意思
yiyigirl2014 发表于 2015-10-23 09:01 | 显示全部楼层
实时发送的意思吗?还是怎么回事。
huangcunxiake 发表于 2015-10-25 15:40 | 显示全部楼层
SPI的例程还这么特别,一定看看。
天灵灵地灵灵 发表于 2015-10-25 23:14 | 显示全部楼层
  1. /**************************************************************************//**
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V2.00
  4. * $Revision: 1 $
  5. * $Date: 14/05/21 4:10p $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    NUC230_240 Series GPIO Driver Sample Code
  7. *
  8. * @note
  9. * Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved.
  10. ******************************************************************************/
  11. #include <stdio.h>
  12. #include "NUC230_240.h"
  13. #include <RTL.h>

  14. #define PLL_CLOCK           48000000
  15. unsigned char DestArray[256];

  16. void SYS_Init(void)
  17. {
  18.     /*---------------------------------------------------------------------------------------------------------*/
  19.     /* Init System Clock                                                                                       */
  20.     /*---------------------------------------------------------------------------------------------------------*/

  21.     /* Enable Internal RC 22.1184MHz clock */
  22.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

  23.     /* Waiting for Internal RC clock ready */
  24.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

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

  27.     /* Enable external XTAL 12MHz clock */
  28.     CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

  29.     /* Waiting for external XTAL clock ready */
  30.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

  31.     /* Set core clock as PLL_CLOCK from PLL */
  32.     CLK_SetCoreClock(PLL_CLOCK);

  33.     /* Enable UART module clock */
  34.     CLK_EnableModuleClock(UART0_MODULE);

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


  37.      CLK_SetSysTickClockSrc(CLK_CLKSEL0_STCLK_S_HCLK_DIV2);//SYSTICK CLOCK IS hclk /2

  38.     /*---------------------------------------------------------------------------------------------------------*/
  39.     /* Init I/O Multi-function                                                                                 */
  40.     /*---------------------------------------------------------------------------------------------------------*/

  41.     /* Set GPB multi-function pins for UART0 RXD and TXD */
  42.     SYS->GPB_MFP &= ~(SYS_GPB_MFP_PB0_Msk | SYS_GPB_MFP_PB1_Msk);
  43.     SYS->GPB_MFP |= (SYS_GPB_MFP_PB0_UART0_RXD | SYS_GPB_MFP_PB1_UART0_TXD);

  44. }

  45. void UART0_Init()
  46. {
  47.     /*---------------------------------------------------------------------------------------------------------*/
  48.     /* Init UART                                                                                               */
  49.     /*---------------------------------------------------------------------------------------------------------*/
  50.     /* Reset IP */
  51.     SYS_ResetModule(UART0_RST);

  52.     /* Configure UART0 and set UART0 Baudrate */
  53.     UART_Open(UART0, 115200);
  54. }

  55. __task void task1 (void);                                                // Tasks function prototypes
  56. __task void task2 (void);
  57. __task void task3 (void);

  58. OS_TID tsk1,tsk2,tsk3;                                                        // Define the task ID variables

  59. void Ex_Int0_Init(void);

  60. #define SPI_FLASH_PORT  SPI2

  61. #define TEST_NUMBER         1   /* page numbers */
  62. #define TEST_LENGTH         256 /* length */
  63. #define CH1                     1
  64. #define CH2                     2

  65. #define MODE_PER2MEM        1
  66. #define MODE_MEM2PER        2

  67. volatile    uint32_t    PDMA_CH1_INT_Flag;
  68. volatile    uint32_t    PDMA_CH2_INT_Flag;


  69. void PDMA_IRQHandler(void)
  70. {
  71.     uint32_t status = PDMA_GCR->GCRISR;

  72.     /* CH1 */
  73.     if(status & 0x2)
  74.     {
  75.         if(PDMA_GET_CH_INT_STS(1) & 0x2)
  76.         {
  77.             PDMA_CH1_INT_Flag = 1;
  78.             PDMA_CLR_CH_INT_FLAG(1, PDMA_ISR_BLKD_IF_Msk);
  79.         }
  80.         /* CH2 */
  81.     }
  82.     else if(status & 0x4)
  83.     {
  84.         if(PDMA_GET_CH_INT_STS(2) & 0x2)
  85.         {
  86.                                                 isr_evt_set(0x0001,tsk1);                                        // Signal Task 3 with an event
  87.             PDMA_CH2_INT_Flag = 2;
  88.             PDMA_CLR_CH_INT_FLAG(2, PDMA_ISR_BLKD_IF_Msk);
  89.         }
  90.     }

  91. }

  92. void Initial_SPI2_GPIO(void)
  93. {
  94.     /* Set PD0, PD1, PD2 and PD3 for SPI2 */
  95.     SYS->GPD_MFP |= SYS_GPD_MFP_PD0_SPI2_SS0 | SYS_GPD_MFP_PD1_SPI2_CLK | SYS_GPD_MFP_PD2_SPI2_MISO0 | SYS_GPD_MFP_PD3_SPI2_MOSI0;

  96. }

  97. // **************************************
  98. void Open_SPI_Flash(void)
  99. {
  100.     /* Init GPIO for SPI2 */
  101.     Initial_SPI2_GPIO();

  102.     /* Enable SPI2 IP clock */
  103.     CLK->APBCLK |= CLK_APBCLK_SPI2_EN_Msk;

  104.     /* Configure SPI2 as a master, MSB first, clock idle low, falling clock edge Tx, rising edge Rx and 32-bit transaction */
  105.     //SPI2->CNTRL = SPI_CNTRL_MASTER_MODE | SPI_CNTRL_MSB_FIRST | SPI_CNTRL_CLK_IDLE_LOW | SPI_CNTRL_TX_FALLING |
  106.     //            SPI_CNTRL_RX_RISING | SPI_CNTRL_TX_BIT_LEN(32);

  107.     SPI_Open(SPI2, SPI_MASTER, SPI_MODE_0, 32, 2000000);
  108.     /* Disable the automatic hardware slave select function. Select the SS pin and configure as low-active. */
  109.     SPI_DisableAutoSS(SPI2);
  110.     SPI_SET_SS0_HIGH(SPI2);

  111. }

  112. // **************************************
  113. void Init_PDMA_CH1_for_SPI2_TX(uint32_t u32SrcAddr)
  114. {
  115.     uint32_t SPI2_TX;
  116.     PDMA_T *PDMA_CH1;

  117.     // PDMA Channel 1 control registers
  118.     PDMA_CH1 = (PDMA_T *)((uint32_t) PDMA1_BASE);

  119.     // SPI2 TX register
  120.     SPI2_TX = SPI2_BASE + 0x20;

  121.     // Enable DMA IP clock
  122.     CLK->AHBCLK |= CLK_AHBCLK_PDMA_EN_Msk;

  123.     // Enable Channel 1 clock
  124.     PDMA_GCR->GCRCSR |= ((1 << CH1) << 8);

  125.     // Set Channel 1 for SPI2_TX
  126.     PDMA_GCR->PDSSR0 = (PDMA_GCR->PDSSR0 & ~PDMA_PDSSR0_SPI2_TXSEL_Msk) | (1 << PDMA_PDSSR0_SPI2_TXSEL_Pos);

  127.     // Set Transfer Byte Count
  128.     PDMA_CH1->BCR = TEST_LENGTH;

  129.     // Set Source Address
  130.     PDMA_CH1->SAR = u32SrcAddr;

  131.     // Set Destination Address
  132.     PDMA_CH1->DAR = SPI2_TX;

  133.     // Set Transfer Width = 8 bits, Source Direction = INC, Destination Direction = FIX and Mode = Memory to Peripheral
  134.     PDMA_CH1->CSR = (PDMA_CH1->CSR & ~(PDMA_CSR_APB_TWS_Msk | PDMA_CSR_SAD_SEL_Msk | PDMA_CSR_DAD_SEL_Msk | PDMA_CSR_MODE_SEL_Msk)) |
  135.                     (PDMA_WIDTH_8 | PDMA_SAR_INC | PDMA_DAR_FIX | (MODE_MEM2PER << PDMA_CSR_MODE_SEL_Pos));

  136.     // Enable Transfer Block Done Interrupt
  137.     PDMA_CH1->IER = (PDMA_CH1->IER & ~(PDMA_IER_TABORT_IE_Msk | PDMA_IER_BLKD_IE_Msk)) | PDMA_IER_BLKD_IE_Msk;
  138. }

  139. // **************************************
  140. void Init_PDMA_CH2_for_SPI2_RX(uint32_t u32DstAddr)
  141. {
  142.     uint32_t SPI2_RX;
  143.     PDMA_T *PDMA_CH2;

  144.     // PDMA Channel 2 control registers
  145.     PDMA_CH2 = (PDMA_T *)((uint32_t) PDMA2_BASE);

  146.     // SPI2 RX register
  147.     SPI2_RX = SPI2_BASE + 0x10;

  148.     // Enable PDMA IP clock
  149.     CLK->AHBCLK |= CLK_AHBCLK_PDMA_EN_Msk;

  150.     // Enable Channel 2 clock
  151.     PDMA_GCR->GCRCSR |= ((1 << CH2) << 8);

  152.     // Set Channel 2 for SPI2_RX
  153.     PDMA_GCR->PDSSR0 = (PDMA_GCR->PDSSR0 & ~PDMA_PDSSR0_SPI2_RXSEL_Msk) | (2 << PDMA_PDSSR0_SPI2_RXSEL_Pos);

  154.     // Set Transfer Byte Count
  155.     PDMA_CH2->BCR = TEST_LENGTH;

  156.     // Set Source Address
  157.     PDMA_CH2->SAR = SPI2_RX;

  158.     // Set Destination Address
  159.     PDMA_CH2->DAR = u32DstAddr;

  160.     // Set Transfer Width = 8 bits, Source Direction = FIX, Destination Direction = INC and Mode = Peripheral to Memory
  161.     PDMA_CH2->CSR = (PDMA_CH2->CSR & ~(PDMA_CSR_APB_TWS_Msk | PDMA_CSR_SAD_SEL_Msk | PDMA_CSR_DAD_SEL_Msk | PDMA_CSR_MODE_SEL_Msk)) |
  162.                     (PDMA_WIDTH_8 | PDMA_SAR_FIX | PDMA_DAR_INC | (MODE_PER2MEM << PDMA_CSR_MODE_SEL_Pos));

  163.     // Enable Transfer Block Done Interrupt
  164.     PDMA_CH2->IER = (PDMA_CH2->IER & ~(PDMA_IER_TABORT_IE_Msk | PDMA_IER_BLKD_IE_Msk)) | PDMA_IER_BLKD_IE_Msk;

  165. }

  166. // **************************************
  167. // For W25Q16BV, Manufacturer ID: 0xEF; Device ID: 0x14
  168. // For W26X16, Manufacturer ID: 0xEF; Device ID: 0x14
  169. unsigned int SpiFlash_w_PDMA_ReadMidDid(void)
  170. {
  171.     unsigned int au32SourceData;
  172.     unsigned int au32DestinationData;

  173.     // configure transaction length as 8 bits
  174.     SPI_SET_DATA_WIDTH(SPI2, 8);

  175.     // /CS: active
  176.     SPI_SET_SS0_LOW(SPI2);

  177.     // send Command: 0x90, Read Manufacturer/Device ID
  178.     au32SourceData = 0x90;
  179.     SPI2->TX[0] = au32SourceData;
  180.     SPI2->CNTRL |= SPI_CNTRL_GO_BUSY_Msk;

  181.     // wait
  182.     while(SPI2->CNTRL & SPI_CNTRL_GO_BUSY_Msk) {}

  183.     // configure transaction length as 24 bits
  184.     //SPI2->CNTRL = SPI2->CNTRL & (~SPI_CNTRL_TX_BIT_LEN_Msk) | SPI_CNTRL_TX_BIT_LEN(24);
  185.     SPI_SET_DATA_WIDTH(SPI2, 24);
  186.     // send 24-bit '0', dummy
  187.     au32SourceData = 0x0;
  188.     SPI2->TX[0] = au32SourceData;
  189.     SPI2->CNTRL |= SPI_CNTRL_GO_BUSY_Msk;

  190.     // wait
  191.     while(SPI2->CNTRL & SPI_CNTRL_GO_BUSY_Msk) {}

  192.     // configure transaction length as 16 bits
  193.     //SPI2->CNTRL = SPI2->CNTRL & (~SPI_CNTRL_TX_BIT_LEN_Msk) | SPI_CNTRL_TX_BIT_LEN(16);
  194.     SPI_SET_DATA_WIDTH(SPI2, 16);
  195.     // receive
  196.     au32SourceData = 0x0;
  197.     SPI2->TX[0] = au32SourceData;
  198.     SPI2->CNTRL |= SPI_CNTRL_GO_BUSY_Msk;

  199.     // wait
  200.     while(SPI2->CNTRL & SPI_CNTRL_GO_BUSY_Msk) {}

  201.     // /CS: de-active
  202.     //SPI2->SSR = SPI_SSR_SW_SS_PIN_HIGH;
  203.     SPI_SET_SS0_HIGH(SPI2);
  204.     // dump Rx register
  205.     au32DestinationData = SPI2->RX[0];

  206.     return (au32DestinationData & 0xffff);

  207. }

  208. // **************************************
  209. void SpiFlash_w_PDMA_ChipErase(void)
  210. {
  211.     unsigned int au32SourceData;

  212.     // configure transaction length as 8 bits
  213.     //SPI2->CNTRL = SPI2->CNTRL & (~SPI_CNTRL_TX_BIT_LEN_Msk) | SPI_CNTRL_TX_BIT_LEN(8);
  214.     SPI_SET_DATA_WIDTH(SPI2, 8);
  215.     // /CS: active
  216.     //SPI2->SSR = SPI_SSR_SW_SS_PIN_LOW;
  217.     SPI_SET_SS0_LOW(SPI2);

  218.     // send Command: 0x06, Write enable
  219.     au32SourceData = 0x06;
  220.     SPI2->TX[0] = au32SourceData;
  221.     SPI2->CNTRL |= SPI_CNTRL_GO_BUSY_Msk;

  222.     // wait
  223.     while(SPI2->CNTRL & SPI_CNTRL_GO_BUSY_Msk) {}

  224.     // /CS: de-active
  225.     //SPI2->SSR = SPI_SSR_SW_SS_PIN_HIGH;
  226.     SPI_SET_SS0_HIGH(SPI2);
  227.     // /CS: active
  228.     //SPI2->SSR = SPI_SSR_SW_SS_PIN_LOW;
  229.     SPI_SET_SS0_LOW(SPI2);
  230.     // send Command: 0xC7, Chip Erase
  231.     au32SourceData = 0xc7;
  232.     SPI2->TX[0] = au32SourceData;
  233.     SPI2->CNTRL |= SPI_CNTRL_GO_BUSY_Msk;

  234.     // wait
  235.     while(SPI2->CNTRL & SPI_CNTRL_GO_BUSY_Msk) {}

  236.     // /CS: de-active
  237.     //SPI2->SSR = SPI_SSR_SW_SS_PIN_HIGH;
  238.     SPI_SET_SS0_HIGH(SPI2);

  239. }

  240. // **************************************
  241. unsigned int SpiFlash_w_PDMA_ReadStatusReg1(void)
  242. {
  243.     unsigned int au32SourceData;
  244.     unsigned int au32DestinationData;

  245.     // configure transaction length as 16 bits
  246.     //SPI2->CNTRL = SPI2->CNTRL & (~SPI_CNTRL_TX_BIT_LEN_Msk) | SPI_CNTRL_TX_BIT_LEN(16);
  247.     SPI_SET_DATA_WIDTH(SPI2, 16);
  248.     // /CS: active
  249.     //SPI2->SSR = SPI_SSR_SW_SS_PIN_LOW;
  250.     SPI_SET_SS0_LOW(SPI2);
  251.     // send Command: 0x05, Read status register 1
  252.     au32SourceData = 0x0500;
  253.     SPI2->TX[0] = au32SourceData;
  254.     SPI2->CNTRL |= SPI_CNTRL_GO_BUSY_Msk;

  255.     // wait
  256.     while(SPI2->CNTRL & SPI_CNTRL_GO_BUSY_Msk) {}

  257.     // /CS: de-active
  258.     //SPI2->SSR = SPI_SSR_SW_SS_PIN_HIGH;
  259.     SPI_SET_SS0_HIGH(SPI2);
  260.     // dump Rx register
  261.     au32DestinationData = SPI2->RX[0];

  262.     return (au32DestinationData & 0xFF);

  263. }


  264. // **************************************
  265. unsigned int SpiFlash_w_PDMA_ReadStatusReg2(void)
  266. {
  267.     unsigned int au32SourceData;
  268.     unsigned int au32DestinationData;

  269.     // configure transaction length as 16 bits
  270.     //SPI2->CNTRL = SPI2->CNTRL & (~SPI_CNTRL_TX_BIT_LEN_Msk) | SPI_CNTRL_TX_BIT_LEN(16);
  271.     SPI_SET_DATA_WIDTH(SPI2, 16);
  272.     // /CS: active
  273.     //SPI2->SSR = SPI_SSR_SW_SS_PIN_LOW;
  274.     SPI_SET_SS0_LOW(SPI2);
  275.     // send Command: 0x35, Read status register 2
  276.     au32SourceData = 0x3500;
  277.     SPI2->TX[0] = au32SourceData;
  278.     SPI2->CNTRL |= SPI_CNTRL_GO_BUSY_Msk;

  279.     // wait
  280.     while(SPI2->CNTRL & SPI_CNTRL_GO_BUSY_Msk) {}

  281.     // /CS: de-active
  282.     //SPI2->SSR = SPI_SSR_SW_SS_PIN_HIGH;
  283.     SPI_SET_SS0_HIGH(SPI2);
  284.     // dump Rx register
  285.     au32DestinationData = SPI2->RX[0];

  286.     return (au32DestinationData & 0xFF);

  287. }


  288. // **************************************
  289. void SpiFlash_w_PDMA_WaitReady(void)
  290. {
  291.     unsigned int ReturnValue;

  292.     do
  293.     {
  294.         ReturnValue = SpiFlash_w_PDMA_ReadStatusReg1();
  295.         ReturnValue = ReturnValue & 1;
  296.     }
  297.     while(ReturnValue != 0); // check the BUSY bit

  298. }

  299. // **************************************
  300. void SpiFlash_w_PDMA_PageProgram(unsigned int StartAddress, unsigned int ByteCount)
  301. {
  302.     unsigned int au32SourceData;

  303.     // configure transaction length as 8 bits
  304.     SPI_SET_DATA_WIDTH(SPI2, 8);

  305.     // /CS: active

  306.     SPI_SET_SS0_LOW(SPI2);
  307.     // send Command: 0x06, Write enable
  308.     au32SourceData = 0x06;
  309.     SPI2->TX[0] = au32SourceData;
  310.     SPI2->CNTRL |= SPI_CNTRL_GO_BUSY_Msk;

  311.     // wait
  312.     while(SPI2->CNTRL & SPI_CNTRL_GO_BUSY_Msk) {}

  313.     // /CS: de-active
  314.     SPI_SET_SS0_HIGH(SPI2);

  315.     // /CS: active
  316.     SPI_SET_SS0_LOW(SPI2);

  317.     // send Command: 0x02, Page program
  318.     au32SourceData = 0x02;
  319.     SPI2->TX[0] = au32SourceData;
  320.     SPI2->CNTRL |= SPI_CNTRL_GO_BUSY_Msk;

  321.     // wait
  322.     while(SPI2->CNTRL & SPI_CNTRL_GO_BUSY_Msk) {}

  323.     // configure transaction length as 24 bits
  324.     SPI_SET_DATA_WIDTH(SPI2, 24);

  325.     // send 24-bit start address
  326.     au32SourceData = StartAddress;
  327.     SPI2->TX[0] = au32SourceData;
  328.     SPI2->CNTRL |= SPI_CNTRL_GO_BUSY_Msk;

  329.     // wait
  330.     while(SPI2->CNTRL & SPI_CNTRL_GO_BUSY_Msk) {}

  331.     // configure transaction length as 8 bits
  332.     SPI_SET_DATA_WIDTH(SPI2, 8);

  333.     // enable SPI PDMA
  334.     SPI_FLASH_PORT->DMA = (SPI_FLASH_PORT->DMA & ~(SPI_DMA_RX_DMA_GO_Msk | SPI_DMA_TX_DMA_GO_Msk)) | SPI_DMA_TX_DMA_GO_Msk;

  335.     // SPI go
  336.     PDMA_CH1_INT_Flag = 0;
  337.     SPI_FLASH_PORT->CNTRL |= SPI_CNTRL_GO_BUSY_Msk;

  338.     // wait PDMA done
  339.     while(1)
  340.     {
  341.         if(PDMA_CH1_INT_Flag)
  342.         {
  343.             PDMA_CH1_INT_Flag = 0;
  344.             break;
  345.         }
  346.     }

  347.     // wait
  348.     while(SPI2->CNTRL & SPI_CNTRL_GO_BUSY_Msk) {}

  349.     // /CS: de-active
  350.     //SPI2->SSR = SPI_SSR_SW_SS_PIN_HIGH;
  351.     SPI_SET_SS0_HIGH(SPI2);

  352. }


  353. // **************************************
  354. void SpiFlash_w_PDMA_ReadData(unsigned int StartAddress, unsigned int ByteCount)
  355. {
  356.     unsigned int au32SourceData;

  357.     // configure transaction length as 8 bits
  358.     SPI_SET_DATA_WIDTH(SPI2, 8);

  359.     // /CS: active
  360.     SPI_SET_SS0_LOW(SPI2);

  361.     // send Command: 0x03, Read data
  362.     au32SourceData = 0x03;
  363.     SPI2->TX[0] = au32SourceData;
  364.     SPI2->CNTRL |= SPI_CNTRL_GO_BUSY_Msk;

  365.     // wait
  366.     while(SPI2->CNTRL & SPI_CNTRL_GO_BUSY_Msk) {}

  367.     // configure transaction length as 24 bits
  368.     SPI_SET_DATA_WIDTH(SPI2, 24);

  369.     // send 24-bit start address
  370.     au32SourceData = StartAddress;
  371.     SPI2->TX[0] = au32SourceData;
  372.     SPI2->CNTRL |= SPI_CNTRL_GO_BUSY_Msk;

  373.     // wait
  374.     while(SPI2->CNTRL & SPI_CNTRL_GO_BUSY_Msk) {}

  375.     // configure transaction length as 8 bits
  376.     SPI_SET_DATA_WIDTH(SPI2, 8);

  377.     // enable SPI PDMA
  378.     SPI_FLASH_PORT->DMA = (SPI_FLASH_PORT->DMA & ~(SPI_DMA_RX_DMA_GO_Msk | SPI_DMA_TX_DMA_GO_Msk)) | SPI_DMA_RX_DMA_GO_Msk;

  379.     // SPI go
  380.     PDMA_CH2_INT_Flag = 0;
  381.     SPI_FLASH_PORT->CNTRL |= SPI_CNTRL_GO_BUSY_Msk;
  382. #if 0
  383.     // wait PDMA done
  384.     while(1)
  385.     {
  386.         if(PDMA_CH2_INT_Flag)
  387.         {
  388.             PDMA_CH2_INT_Flag = 0;
  389.             break;
  390.         }
  391.     }

  392.     // wait
  393.     while(SPI2->CNTRL & SPI_CNTRL_GO_BUSY_Msk) {}

  394.     // /CS: de-active
  395.     //SPI2->SSR = SPI_SSR_SW_SS_PIN_HIGH;
  396.     SPI_SET_SS0_HIGH(SPI2);
  397.                         #endif
  398. }

  399.     unsigned int MidDid;
  400.     PDMA_T *PDMA_CH1, *PDMA_CH2;
  401. /*---------------------------------------------------------------------------------------------------------*/
  402. /* MAIN function                                                                                           */
  403. /*---------------------------------------------------------------------------------------------------------*/
  404. int main(void)
  405. {
  406.     // PDMA Channel 1/2 control registers
  407.     PDMA_CH1 = (PDMA_T *)((uint32_t) PDMA1_BASE);
  408.     PDMA_CH2 = (PDMA_T *)((uint32_t) PDMA2_BASE);

  409.     /* Unlock protected registers */
  410.     SYS_UnlockReg();

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

  413.     /* Lock protected registers */
  414.     SYS_LockReg();

  415.     /* Init UART0 for printf */
  416.     UART0_Init();
  417.          
  418.           //Ex_Int0_Init();                                                                // Initialize External interrupt 1
  419.                 /* Open SPI for Serial Flash */
  420.     Open_SPI_Flash();

  421.     /* Initial PDMA Channels */
  422.     //Init_PDMA_CH1_for_SPI2_TX((uint32_t)SrcArray);
  423.     Init_PDMA_CH2_for_SPI2_RX((uint32_t)DestArray);
  424.        
  425.     /* Enable PDMA IRQ */
  426.     NVIC_EnableIRQ(PDMA_IRQn);

  427.     /* Read MID & DID */
  428.     MidDid = SpiFlash_w_PDMA_ReadMidDid();
  429.     printf("\nMID and DID = %x", MidDid);               


  430.           os_sys_init (task1);                                                // Start the RTX scheduler and task1       
  431.        
  432.     while(1);
  433. }


  434. __task void task1  (void)
  435. {
  436.         unsigned int u32VerifyFlashAddress = 0;
  437.             unsigned int u32ByteCount;
  438.         tsk1 = os_tsk_self();                                                   // Read the task-ID
  439.         os_tsk_prio_self (1);                                                // Set task priorities
  440.         tsk2 = os_tsk_create(task2,1);
  441.         //tsk3 = os_tsk_create(task3,2);                                   // The ISR task has highest priority
  442.           
  443.         while(1)
  444.         {
  445.                 printf("task1 is running-\n");
  446.                 for(u32ByteCount = 0; u32ByteCount < 256; u32ByteCount++)
  447.         {
  448.             DestArray[u32ByteCount] =0;            
  449.         }
  450.                 /* Trigger PDMA specified Channel */
  451.     PDMA_CH2->CSR |= (PDMA_CSR_TRIG_EN_Msk | PDMA_CSR_PDMACEN_Msk);

  452.     /* Page Read */
  453.     SpiFlash_w_PDMA_ReadData(u32VerifyFlashAddress, 256);
  454.                 #if 0               
  455.                 // wait PDMA done               
  456.     while(1)
  457.     {
  458.         if(PDMA_CH2_INT_Flag)
  459.         {
  460.             PDMA_CH2_INT_Flag = 0;
  461.             break;
  462.         }
  463.     }
  464.     #endif
  465.                 os_evt_wait_or(0x0001,0xffff);                        // Wait for the ISR to set event        flag
  466.                
  467.                
  468.     // wait
  469.     while(SPI2->CNTRL & SPI_CNTRL_GO_BUSY_Msk);

  470.     // /CS: de-active
  471.     //SPI2->SSR = SPI_SSR_SW_SS_PIN_HIGH;
  472.     SPI_SET_SS0_HIGH(SPI2);
  473.                 for(u32ByteCount = 0; u32ByteCount < 256; u32ByteCount++)
  474.         {
  475.             //printf("\nByteCount:%d, %d\n", u32ByteCount, DestArray[u32ByteCount]);
  476.             if(DestArray[u32ByteCount] != u32ByteCount)
  477.             {
  478.                 /* Error */
  479.                 printf("SPI Flash R/W Fail!");
  480.                 while(1);
  481.             }
  482.         }
  483.                 printf("task1 is verify end\n");               
  484.                 os_dly_wait(20);                                                                    
  485.         }
  486. }

  487. __task void task2 (void)       
  488. {
  489.         while(1)
  490.         {
  491.                 printf("task2 is running--\n");
  492.                 os_dly_wait(20);                                                // Delay for 20 clock ticks
  493.         }
  494. }


天灵灵地灵灵 发表于 2015-10-25 23:15 | 显示全部楼层
#define PLL_CLOCK           48000000
unsigned char DestArray[256];
要学习一下,时钟如何配置。
734774645 发表于 2015-10-26 17:38 | 显示全部楼层
/* Enable Internal RC 22.1184MHz clock */
    CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

    /* Waiting for Internal RC clock ready */
    CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

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

    /* Enable external XTAL 12MHz clock */
    CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

    /* Waiting for external XTAL clock ready */
    CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

    /* Set core clock as PLL_CLOCK from PLL */
    CLK_SetCoreClock(PLL_CLOCK);

    /* Enable UART module clock */
    CLK_EnableModuleClock(UART0_MODULE);

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


     CLK_SetSysTickClockSrc(CLK_CLKSEL0_STCLK_S_HCLK_DIV2);//SYSTICK CLOCK IS hclk /2
--------------------------------
时钟配置,很给力。
wahahaheihei 发表于 2015-10-26 19:16 | 显示全部楼层
Open_SPI_Flash(void)是个无参数的函数,应该带有返回值。
yiyigirl2014 发表于 2015-10-26 19:39 | 显示全部楼层
    /* Enable Internal RC 22.1184MHz clock */
    CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

    /* Waiting for Internal RC clock ready */
    CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);
HAL库函数还是很简单的。
wahahaheihei 发表于 2015-10-27 08:58 | 显示全部楼层
55.    /* Set GPB multi-function pins for UART0 RXD and TXD */

56.    SYS->GPB_MFP &= ~(SYS_GPB_MFP_PB0_Msk | SYS_GPB_MFP_PB1_Msk);

57.    SYS->GPB_MFP |= (SYS_GPB_MFP_PB0_UART0_RXD | SYS_GPB_MFP_PB1_UART0_TXD);
----------------------------配置这些端口作为串口?
643757107 发表于 2015-10-27 10:41 | 显示全部楼层
__task void task1 (void);                                                // Tasks function prototypes
__task void task2 (void);
__task void task3 (void);
643757107 发表于 2015-10-27 10:42 | 显示全部楼层
* @file     main.c
* @version  V2.00
这些url是起什么作用呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

100

主题

310

帖子

6

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