[DemoCode下载] M451系列UART0通过PDMA发送数据的DemoCode

[复制链接]
5814|13
 楼主| YWBIN 发表于 2015-6-23 18:47 | 显示全部楼层 |阅读模式
附件为M451系列UART0通过PDMA发送数据的DemoCode,有需要的朋友可以参考下。
注:工程路径为“M451系列UART PDMA发送\M451SeriesBSP_CMSIS_v3.00.005\SampleCode\StdDriver\UART_PDMA_Send”。

M451系列UART PDMA发送.rar

500.13 KB, 下载次数: 123

天灵灵地灵灵 发表于 2015-6-23 19:24 | 显示全部楼层
UART0通过PDMA发送数据的DemoCode,非常赞,这一点很薄弱
稳稳の幸福 发表于 2015-6-23 19:59 | 显示全部楼层
工程路径:M451SeriesBSP_CMSIS_v3.00.005\SampleCode\StdDriver\UART_PDMA_Send

功能:UART0通过PMDA方式发送数据
稳稳の幸福 发表于 2015-6-23 20:00 | 显示全部楼层
  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: 14/10/28 5:32p $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    Use PDMA channel 2 to transfer data from memory to memory.
  7. * @note
  8. * Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved.
  9. *
  10. ******************************************************************************/
  11. #include <stdio.h>
  12. #include "M451Series.h"

  13. /*---------------------------------------------------------------------------------------------------------*/
  14. /* Macro, type and constant definitions                                                                    */
  15. /*---------------------------------------------------------------------------------------------------------*/
  16. #define PLL_CLOCK       72000000


  17. /*---------------------------------------------------------------------------------------------------------*/
  18. /* Global variables                                                                                        */
  19. /*---------------------------------------------------------------------------------------------------------*/
  20. uint32_t PDMA_TEST_LENGTH = 12;
  21. uint8_t SrcArray[256] = "hello world!";
  22. uint32_t volatile u32IsSendOver = 0;

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

  35.     if(status & 0x1)    /* abort */
  36.     {
  37.         if(PDMA_GET_ABORT_STS() & 0x4)
  38.             u32IsSendOver = 2;
  39.         PDMA_CLR_ABORT_FLAG(PDMA_ABTSTS_ABTIFn_Msk);
  40.     }
  41.     else if(status & 0x2)      /* done */
  42.     {
  43.         if(PDMA_GET_TD_STS() & 0x4)
  44.             u32IsSendOver = 1;
  45.         PDMA_CLR_TD_FLAG(PDMA_TDSTS_TDIFn_Msk);
  46.     }
  47.     else
  48.         printf("unknown interrupt !!\n");
  49. }

  50. void SYS_Init(void)
  51. {
  52.     /*---------------------------------------------------------------------------------------------------------*/
  53.     /* Init System Clock                                                                                       */
  54.     /*---------------------------------------------------------------------------------------------------------*/

  55.     /* Enable HIRC clock (Internal RC 22.1184MHz) */
  56.     CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);

  57.     /* Waiting for HIRC clock ready */
  58.     CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);

  59.     /* Select HCLK clock source as HIRC and and HCLK clock divider as 1 */
  60.     CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));

  61.     /* Enable HXT clock (external XTAL 12MHz) */
  62.     CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);

  63.     /* Waiting for HXT clock ready */
  64.     CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);

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

  67.     /* Waiting for PLL clock ready */
  68.     CLK_WaitClockReady(CLK_STATUS_PLLSTB_Msk);

  69.     /* Enable UART module clock */
  70.     CLK_EnableModuleClock(UART0_MODULE);

  71.     /* Select UART module clock source as HXT and UART module clock divider as 1 */
  72.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UARTSEL_HXT, CLK_CLKDIV0_UART(1));

  73.     /* Enable PDMA clock source */
  74.     CLK_EnableModuleClock(PDMA_MODULE);

  75.     /*---------------------------------------------------------------------------------------------------------*/
  76.     /* Init I/O Multi-function                                                                                 */
  77.     /*---------------------------------------------------------------------------------------------------------*/
  78.     /* Set PD multi-function pins for UART0 RXD and TXD */
  79.     SYS->GPD_MFPL &= ~(SYS_GPD_MFPL_PD0MFP_Msk | SYS_GPD_MFPL_PD1MFP_Msk);
  80.     SYS->GPD_MFPL |= (SYS_GPD_MFPL_PD0MFP_UART0_RXD | SYS_GPD_MFPL_PD1MFP_UART0_TXD);
  81. }

  82. void UART0_Init()
  83. {
  84.     /*---------------------------------------------------------------------------------------------------------*/
  85.     /* Init UART                                                                                               */
  86.     /*---------------------------------------------------------------------------------------------------------*/
  87.     /* Reset UART module */
  88.     SYS_ResetModule(UART0_RST);

  89.     /* Configure UART0 and set UART0 baud rate */
  90.     UART_Open(UART0, 115200);
  91. }

  92. void PDMA_Init()
  93. {
  94.     /* Enable PDMA clock source */
  95.     CLK_EnableModuleClock(PDMA_MODULE);
  96.     /* Reset PDMA module */
  97.     SYS_ResetModule(PDMA_RST);
  98.     PDMA_Open(0x4);
  99.     PDMA_SetTransferCnt(2, PDMA_WIDTH_8, PDMA_TEST_LENGTH);
  100.     PDMA_SetTransferAddr(2, (uint32_t)SrcArray, PDMA_SAR_INC, (uint32_t)&UART0->DAT, PDMA_DAR_FIX);
  101.     PDMA_SetTransferMode(2, PDMA_UART0_TX, FALSE, 0);
  102.     PDMA_EnableInt(2, PDMA_INT_TRANS_DONE);
  103.     NVIC_EnableIRQ(PDMA_IRQn);
  104.     UART0->INTEN = UART0->INTEN | (1<<14);//UARTO DMA send enable
  105. }

  106. void PDMA_Set()
  107. {
  108.     PDMA_SetTransferCnt(2, PDMA_WIDTH_8, PDMA_TEST_LENGTH);
  109.     PDMA_SetTransferAddr(2, (uint32_t)SrcArray, PDMA_SAR_INC, (uint32_t)&UART0->DAT, PDMA_DAR_FIX);
  110.     PDMA_SetTransferMode(2, PDMA_UART0_TX, FALSE, 0);
  111.     UART0->INTEN = UART0->INTEN | (1<<14);//UARTO DMA send enable
  112. }

  113. /*---------------------------------------------------------------------------------------------------------*/
  114. /*  Main Function                                                                                          */
  115. /*---------------------------------------------------------------------------------------------------------*/
  116. int main(void)
  117. {
  118.     /* Unlock protected registers */
  119.     SYS_UnlockReg();

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

  122.     /* Lock protected registers */
  123.     /* If user want to write protected register, please issue SYS_UnlockReg() to unlock protected register. */
  124.     SYS_LockReg();

  125.     /* Init UART for printf */
  126.     UART0_Init();

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

  128.     printf("+------------------------------------------------------+ \n");
  129.     printf("|          UART PDMA SEND Sample Code                  | \n");
  130.     printf("+------------------------------------------------------+ \n");
  131.    
  132.     PDMA_Init();

  133.     while(1)
  134.     {
  135.         if(u32IsSendOver == 1)
  136.         {
  137.             u32IsSendOver = 0;
  138.             PDMA_Set();            
  139.         }
  140.     }
  141. }


yiyigirl2014 发表于 2015-6-23 20:09 | 显示全部楼层
void PDMA_Set()
{
    PDMA_SetTransferCnt(2, PDMA_WIDTH_8, PDMA_TEST_LENGTH);
    PDMA_SetTransferAddr(2, (uint32_t)SrcArray, PDMA_SAR_INC, (uint32_t)&UART0->DAT, PDMA_DAR_FIX);
    PDMA_SetTransferMode(2, PDMA_UART0_TX, FALSE, 0);
    UART0->INTEN = UART0->INTEN | (1<<14);//UARTO DMA send enable
}
yiyigirl2014 发表于 2015-6-23 20:09 | 显示全部楼层
上面这个是设置什么东西的啊?:)
lsw200888 发表于 2015-6-23 23:35 | 显示全部楼层
楼主能否也发一份PDMA实现接收数据的DemoCode,不懂当接收数据未达到PDMA设置大小时如何处理
 楼主| YWBIN 发表于 2015-6-24 17:33 | 显示全部楼层
yiyigirl2014 发表于 2015-6-23 20:09
上面这个是设置什么东西的啊?

重新触发一次数据发送。
 楼主| YWBIN 发表于 2015-6-24 17:35 | 显示全部楼层
lsw200888 发表于 2015-6-23 23:35
楼主能否也发一份PDMA实现接收数据的DemoCode,不懂当接收数据未达到PDMA设置大小时如何处理 ...

https://bbs.21ic.com/icview-962974-1-1.html
yiyigirl2014 发表于 2015-6-24 22:43 | 显示全部楼层
这个内容真不错,看完了,收益颇丰。
JY-DX-JY 发表于 2016-5-7 11:00 | 显示全部楼层
顶一个。
玛尼玛尼哄 发表于 2016-5-7 12:22 | 显示全部楼层
那个中断函数写的不错,通过那个封装完美的get函数获取中断的类型,然后按类型处理,真是 太科学了。
mezstd 发表于 2018-4-1 22:16 | 显示全部楼层
传输数据大小PDMA_TEST_LENGTH超过16就挂掉,也是醉,直接HWBUFEIF。
小华dd 发表于 2022-5-9 11:18 | 显示全部楼层
顶一个
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

46

帖子

1

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