[DemoCode下载] DAC的正确使用方法就是用PDMA投送数据

[复制链接]
1534|3
 楼主| 小灵通2018 发表于 2024-5-19 18:24 | 显示全部楼层 |阅读模式
pd, DMA, DM, DAC, AC
  1. /****************************************************************************
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V0.10
  4. * [url=home.php?mod=space&uid=247401]@brief[/url]    Demonstrate how to PDMA and trigger DAC by Timer.
  5. *
  6. * SPDX-License-Identifier: Apache-2.0
  7. * Copyright (C) 2016 Nuvoton Technology Corp. All rights reserved.
  8. *
  9. ******************************************************************************/
  10. #include "stdio.h"
  11. #include "NuMicro.h"

  12. #if defined (__GNUC__) && !defined(__ARMCC_VERSION) && defined(OS_USE_SEMIHOSTING)
  13. extern void initialise_monitor_handles(void);
  14. #endif

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

  22. void SYS_Init(void)
  23. {
  24.     /* Unlock protected registers */
  25.     SYS_UnlockReg();

  26.     /* Enable HIRC clock */
  27.     CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);

  28.     /* Waiting for HIRC clock ready */
  29.     CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);

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

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

  34.     /* Select UART module clock source as HIRC and UART module clock divider as 1 */
  35.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HIRC, CLK_CLKDIV0_UART0(1));

  36.     /* Enable DAC module clock */
  37.     CLK_EnableModuleClock(DAC01_MODULE);

  38.     /* Enable Timer 0 module clock */
  39.     CLK_EnableModuleClock(TMR0_MODULE);

  40.     /* Enable PDMA module clock */
  41.     CLK_EnableModuleClock(PDMA_MODULE);

  42.     /*---------------------------------------------------------------------------------------------------------*/
  43.     /* Init I/O Multi-function                                                                                 */
  44.     /*---------------------------------------------------------------------------------------------------------*/
  45.     /* Set PB multi-function pins for UART0 RXD=PB.12 and TXD=PB.13 */
  46.     SYS->GPB_MFPH = (SYS->GPB_MFPH & ~(SYS_GPB_MFPH_PB12MFP_Msk | SYS_GPB_MFPH_PB13MFP_Msk)) |
  47.                     (SYS_GPB_MFPH_PB12MFP_UART0_RXD | SYS_GPB_MFPH_PB13MFP_UART0_TXD);

  48.     /* Set PA multi-function pins for DAC voltage output */
  49.     SYS->GPA_MFPL = (SYS->GPA_MFPL & ~SYS_GPA_MFPL_PA0MFP_Msk) | SYS_GPA_MFPL_PA0MFP_DAC0_OUT;

  50.     /* Set PA.0 to input mode */
  51.     PA->MODE &= ~(GPIO_MODE_MODE0_Msk) ;

  52.     /* Disable digital input path of analog pin DAC01_OUT to prevent leakage */
  53.     GPIO_DISABLE_DIGITAL_PATH(PA, (1ul << 0));

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

  57. int32_t main(void)
  58. {
  59.     /* Init System, IP clock and multi-function I/O */
  60.     SYS_Init();

  61. #if defined (__GNUC__) && !defined(__ARMCC_VERSION) && defined(OS_USE_SEMIHOSTING)
  62.     initialise_monitor_handles();
  63. #endif

  64.     /* Configure UART0 and set UART0 baud rate */
  65.     UART_Open(UART0, 115200);

  66.     printf("+----------------------------------------------------------+\n");
  67.     printf("|            DAC Driver Sample Code                        |\n");
  68.     printf("+----------------------------------------------------------+\n");
  69.     printf("This sample code use PDMA and trigger DAC output sine wave by Timer 0.\n");

  70.     /* Open Channel 0 */
  71.     PDMA_Open(PDMA, 0x1);

  72.     /* Set transfer data width, and transfer count */
  73.     PDMA_SetTransferCnt(PDMA, 0, PDMA_WIDTH_16, g_u32ArraySize);

  74.     /* transfer width is one word(32 bit) */
  75.     PDMA_SetTransferAddr(PDMA, 0, (uint32_t)&g_au16Sine[0], PDMA_SAR_INC, (uint32_t)&DAC0->DAT, PDMA_DAR_FIX);

  76.     /* Select channel 0 request source from DAC */
  77.     PDMA_SetTransferMode(PDMA, 0, PDMA_DAC0_TX, FALSE, 0);

  78.     /* Set transfer type and burst size */
  79.     PDMA_SetBurstType(PDMA, 0, PDMA_REQ_SINGLE, PDMA_BURST_128);

  80.     /* Set the timer 0 trigger DAC and enable D/A converter */
  81.     DAC_Open(DAC0, 0, DAC_TIMER0_TRIGGER);

  82.     /* The DAC conversion settling time is 1us */
  83.     DAC_SetDelayTime(DAC0, 1);

  84.     /* Clear the DAC conversion complete finish flag for safe */
  85.     DAC_CLR_INT_FLAG(DAC0, 0);

  86.     /* Enable the PDMA Mode */
  87.     DAC_ENABLE_PDMA(DAC0);

  88.     /* Enable Timer0 counting to start D/A conversion */
  89.     TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 1000);
  90.     TIMER_SetTriggerTarget(TIMER0, TIMER_TRG_TO_DAC);
  91.     TIMER_Start(TIMER0);

  92.     while (1)
  93.     {
  94.         if (PDMA_GET_TD_STS(PDMA) == 0x1)
  95.         {
  96.             /* Re-Set transfer count and basic operation mode */
  97.             PDMA_SetTransferCnt(PDMA, 0, PDMA_WIDTH_16, g_u32ArraySize);
  98.             PDMA_SetTransferMode(PDMA, 0, PDMA_DAC0_TX, FALSE, 0);

  99.             /* Clear PDMA channel 0 transfer done flag */
  100.             PDMA_CLR_TD_FLAG(PDMA, 0x1);
  101.         }
  102.     }
  103. }

  104. /*** (C) COPYRIGHT 2018 Nuvoton Technology Corp. ***/


 楼主| 小灵通2018 发表于 2024-5-19 18:25 | 显示全部楼层
  1.     /* Enable DAC module clock */

  2.     CLK_EnableModuleClock(DAC01_MODULE);



  3.     /* Enable PDMA module clock */

  4.     CLK_EnableModuleClock(PDMA_MODULE);
使能DAC和PDMA的模块时钟,这样就开启了这两个模块。

 楼主| 小灵通2018 发表于 2024-5-19 18:27 | 显示全部楼层
  1.     /* Disable digital input path of analog pin DAC01_OUT to prevent leakage */
  2.     GPIO_DISABLE_DIGITAL_PATH(PA, (1ul << 0));
作为DAC的引脚即作为模拟引脚使用,所以要关闭该引脚的数字通道功能。
 楼主| 小灵通2018 发表于 2024-5-19 18:39 | 显示全部楼层

  1.     /* Open Channel 0 */
  2.     PDMA_Open(PDMA, 0x1);

  3.     /* Set transfer data width, and transfer count */
  4.     PDMA_SetTransferCnt(PDMA, 0, PDMA_WIDTH_16, g_u32ArraySize);

  5.     /* transfer width is one word(32 bit) */
  6.     PDMA_SetTransferAddr(PDMA, 0, (uint32_t)&g_au16Sine[0], PDMA_SAR_INC, (uint32_t)&DAC0->DAT, PDMA_DAR_FIX);

  7.     /* Select channel 0 request source from DAC */
  8.     PDMA_SetTransferMode(PDMA, 0, PDMA_DAC0_TX, FALSE, 0);

  9.     /* Set transfer type and burst size */
  10.     PDMA_SetBurstType(PDMA, 0, PDMA_REQ_SINGLE, PDMA_BURST_128);

  11.     /* Set the timer 0 trigger DAC and enable D/A converter */
  12.     DAC_Open(DAC0, 0, DAC_TIMER0_TRIGGER);

  13.     /* The DAC conversion settling time is 1us */
  14.     DAC_SetDelayTime(DAC0, 1);

  15.     /* Clear the DAC conversion complete finish flag for safe */
  16.     DAC_CLR_INT_FLAG(DAC0, 0);

  17.     /* Enable the PDMA Mode */
  18.     DAC_ENABLE_PDMA(DAC0);

  19.     /* Enable Timer0 counting to start D/A conversion */
  20.     TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 1000);
  21.     TIMER_SetTriggerTarget(TIMER0, TIMER_TRG_TO_DAC);
  22.     TIMER_Start(TIMER0);
对通道以及触发方式进行设置就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

158

主题

1732

帖子

4

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