[技术问答] M261在DCDC模式下进不了低功耗模式。

[复制链接]
974|4
 楼主| nbiot 发表于 2020-2-20 21:06 | 显示全部楼层 |阅读模式
M261在DCDC模式下进不了低功耗模式。
进入DCDC的指令是:
SYS_SetPowerRegulator(SYS_PLCTL_MVRS_DCDC);
电流确实是比没有执行此命令时小30%左右。说明此命令有作用了。
但却进入不了低功耗模式。

进入低功耗模式的代码如下:
  1.          SYS_UnlockReg();
  2.                 power_flag=1;
  3.                  //SYS_SetPowerRegulator(SYS_PLCTL_MVRS_LDO);
  4.     /* Select Power-down mode */
  5.     CLK_SetPowerDownMode(CLK_PMUCTL_PDMSEL_FWPD);

  6.         
  7.     /* To check if all the debug messages are finished */
  8.    // while(IsDebugFifoEmpty() == 0);

  9.     /* Enter to Power-down mode */
  10.     CLK_PowerDown();
643757107 发表于 2020-2-20 23:01 | 显示全部楼层
我去看看BSP里面有没有这个例子
643757107 发表于 2020-2-20 23:07 | 显示全部楼层
  1. /**************************************************************************//**
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V3.00
  4. * @brief
  5. *           Show how to enter to different Power-down mode and wake-up by RTC.
  6. *
  7. * [url=home.php?mod=space&uid=17282]@CopyRight[/url] (C) 2019 Nuvoton Technology Corp. All rights reserved.
  8. *
  9. ******************************************************************************/
  10. #include <stdio.h>
  11. #include "NuMicro.h"



  12. #define PDMD_FLAG_ADDR      0x20000FFC



  13. extern int IsDebugFifoEmpty(void);
  14. uint32_t g_u32PowerDownMode;
  15. volatile uint32_t g_u32RTCTickINT;

  16. /**
  17. * [url=home.php?mod=space&uid=247401]@brief[/url]       IRQ Handler for RTC Interrupt
  18. *
  19. * @param       None
  20. *
  21. * [url=home.php?mod=space&uid=266161]@return[/url]      None
  22. *
  23. * [url=home.php?mod=space&uid=1543424]@Details[/url]     The RTC_IRQHandler is default IRQ of RTC, declared in startup_M261.s.
  24. */
  25. void RTC_IRQHandler(void)
  26. {
  27.     /* To check if RTC tick interrupt occurred */
  28.     if(RTC_GET_TICK_INT_FLAG(RTC) == 1)
  29.     {
  30.         /* Clear RTC tick interrupt flag */
  31.         RTC_CLEAR_TICK_INT_FLAG(RTC);
  32.     }

  33.     g_u32RTCTickINT++;
  34. }

  35. /*---------------------------------------------------------------------------------------------------------*/
  36. /*  Function for RTC wake-up source setting                                                                */
  37. /*---------------------------------------------------------------------------------------------------------*/
  38. void RTC_Init(void)
  39. {
  40.     S_RTC_TIME_DATA_T sWriteRTC;

  41.     /* Init RTC in the start of sample code */
  42.     if(RTC->INIT != RTC_INIT_ACTIVE_Msk)
  43.     {
  44.         printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %dHz\n", SystemCoreClock);
  45.         printf("+------------------------------------------+\n");
  46.         printf("|    Power-down and Wake-up Sample Code    |\n");
  47.         printf("+------------------------------------------+\n\n");

  48.         /* Open RTC */
  49.         sWriteRTC.u32Year       = 2017;
  50.         sWriteRTC.u32Month      = 3;
  51.         sWriteRTC.u32Day        = 16;
  52.         sWriteRTC.u32DayOfWeek  = RTC_MONDAY;
  53.         sWriteRTC.u32Hour       = 0;
  54.         sWriteRTC.u32Minute     = 0;
  55.         sWriteRTC.u32Second     = 0;
  56.         sWriteRTC.u32TimeScale  = RTC_CLOCK_24;
  57.         RTC_Open(&sWriteRTC);
  58.         printf("# Set RTC current date/time: 2017/03/16 00:00:00.\n");

  59.         /* It is the start of sample code */
  60.         M32(PDMD_FLAG_ADDR) = 0;
  61.     }

  62.     /* Clear RTC tick interrupt flag */
  63.     RTC_CLEAR_TICK_INT_FLAG(RTC);

  64.     /* Enable RTC NVIC */
  65.     NVIC_EnableIRQ(RTC_IRQn);

  66.     /* Enable RTC tick interrupt and wake-up function will be enabled also */
  67.     RTC_EnableInt(RTC_INTEN_TICKIEN_Msk);
  68.     RTC_SetTickPeriod(RTC_TICK_1_SEC);

  69.     /* Unlock protected registers */
  70.     SYS_UnlockReg();

  71.     /* Enable RTC wake-up from SPD and DPD */
  72.     CLK_ENABLE_RTCWK();

  73.     /* Lock protected registers */
  74.     SYS_LockReg();

  75. }

  76. /*---------------------------------------------------------------------------------------------------------*/
  77. /*  Function for System Entry to Power Down Mode                                                           */
  78. /*---------------------------------------------------------------------------------------------------------*/
  79. void PowerDownFunction(void)
  80. {
  81.     /* Select Power-down mode */
  82.     CLK_SetPowerDownMode(g_u32PowerDownMode);

  83.     /* To check if all the debug messages are finished */
  84.     while(IsDebugFifoEmpty() == 0);

  85.     /* Enter to Power-down mode */
  86.     CLK_PowerDown();
  87. }

  88. /*-----------------------------------------------------------------------------------------------------------*/
  89. /*  Function for Check Power Manager Status                                                                  */
  90. /*-----------------------------------------------------------------------------------------------------------*/
  91. void CheckPowerSource(void)
  92. {
  93.     S_RTC_TIME_DATA_T sReadRTC;

  94.     /* Get Power Manager Status */
  95.     uint32_t u32Status = CLK_GetPMUWKSrc();

  96.     /* Clear wake-up status flag */
  97.     CLK->PMUSTS = CLK_PMUSTS_CLRWK_Msk;

  98.     /* Check Power Manager Status is wake-up by RTC */
  99.     if(u32Status & CLK_PMUSTS_RTCWK_Msk)
  100.     {
  101.         g_u32PowerDownMode = M32(PDMD_FLAG_ADDR);
  102.         switch(g_u32PowerDownMode)
  103.         {

  104.             case CLK_PMUCTL_PDMSEL_PD:

  105.                 /* It is the start of sample code by pressing reset button */
  106.                 printf("\n\nCPU @ %dHz\n", SystemCoreClock);
  107.                 printf("+------------------------------------------+\n");
  108.                 printf("|    Power-down and Wake-up Sample Code    |\n");
  109.                 printf("+------------------------------------------+\n");
  110.                 break;

  111.             case CLK_PMUCTL_PDMSEL_SPD:

  112.                 /* Wake-up from Standby Power-down Mode */
  113.                 printf("Wake-up!\n");

  114.                 /* Read current RTC date/time */
  115.                 RTC_GetDateAndTime(&sReadRTC);
  116.                 printf("# Get RTC current date/time: %d/%02d/%02d %02d:%02d:%02d.\n",
  117.                        sReadRTC.u32Year, sReadRTC.u32Month, sReadRTC.u32Day, sReadRTC.u32Hour, sReadRTC.u32Minute, sReadRTC.u32Second);

  118.                 /* Next Power-down Mode is Deep Power-down Mode */
  119.                 M32(PDMD_FLAG_ADDR) = CLK_PMUCTL_PDMSEL_DPD;
  120.                 break;

  121.             default:

  122.                 /* Wake-up from Deep Power-down Mode */
  123.                 printf("Wake-up!\n");

  124.                 /* Read current RTC date/time */
  125.                 RTC_GetDateAndTime(&sReadRTC);
  126.                 printf("# Get RTC current date/time: %d/%02d/%02d %02d:%02d:%02d.\n",
  127.                        sReadRTC.u32Year, sReadRTC.u32Month, sReadRTC.u32Day, sReadRTC.u32Hour, sReadRTC.u32Minute, sReadRTC.u32Second);

  128.                 /* End of sample code and clear Power-down Mode flag */
  129.                 printf("\nSample code end. Press Reset Button and continue.\n");
  130.                 M32(PDMD_FLAG_ADDR) = 0;
  131.                 while(1);

  132.         }

  133.     }

  134. }


  135. void SYS_Init(void)
  136. {

  137.     /* Set PF multi-function pins for XT1_OUT(PF.2) and XT1_IN(PF.3) */
  138.     SYS->GPF_MFPL = (SYS->GPF_MFPL & (~SYS_GPF_MFPL_PF2MFP_Msk)) | SYS_GPF_MFPL_PF2MFP_XT1_OUT;
  139.     SYS->GPF_MFPL = (SYS->GPF_MFPL & (~SYS_GPF_MFPL_PF3MFP_Msk)) | SYS_GPF_MFPL_PF3MFP_XT1_IN;

  140.     /* Set PF multi-function pins for X32_OUT(PF.4) and X32_IN(PF.5) */
  141.     SYS->GPF_MFPL = (SYS->GPF_MFPL & (~SYS_GPF_MFPL_PF4MFP_Msk)) | SYS_GPF_MFPL_PF4MFP_X32_OUT;
  142.     SYS->GPF_MFPL = (SYS->GPF_MFPL & (~SYS_GPF_MFPL_PF5MFP_Msk)) | SYS_GPF_MFPL_PF5MFP_X32_IN;

  143.     /*---------------------------------------------------------------------------------------------------------*/
  144.     /* Init System Clock                                                                                       */
  145.     /*---------------------------------------------------------------------------------------------------------*/

  146.     /* Enable HIRC, HXT and LXT clock */
  147.     CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk | CLK_PWRCTL_HXTEN_Msk | CLK_PWRCTL_LXTEN_Msk);

  148.     /* Wait for HIRC, HXT and LXT clock ready */
  149.     CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk | CLK_STATUS_LXTSTB_Msk | CLK_STATUS_HXTSTB_Msk);

  150.     /* Enable PLL */
  151.     CLK->PLLCTL = CLK_PLLCTL_128MHz_HIRC;

  152.     /* Wait for PLL stable */
  153.     CLK_WaitClockReady(CLK_STATUS_PLLSTB_Msk);

  154.     /* Select HCLK clock source as PLL and HCLK source divider as 2 */
  155.     CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_PLL, CLK_CLKDIV0_HCLK(2));

  156.     /* Enable UART module clock */
  157.     CLK_EnableModuleClock(UART0_MODULE);

  158.     /* Select UART module clock source as HXT and UART module clock divider as 1 */
  159.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HXT, CLK_CLKDIV0_UART0(1));

  160.     /* Enable peripheral clock */
  161.     CLK_EnableModuleClock(RTC_MODULE);

  162.     /* Update System Core Clock */
  163.     /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock. */
  164.     SystemCoreClockUpdate();

  165.     /*---------------------------------------------------------------------------------------------------------*/
  166.     /* Init I/O Multi-function                                                                                 */
  167.     /*---------------------------------------------------------------------------------------------------------*/

  168.     /* Set multi-function pins for UART0 RXD and TXD */
  169.     SYS->GPB_MFPH = (SYS->GPB_MFPH & (~(UART0_RXD_PB12_Msk | UART0_TXD_PB13_Msk))) | UART0_RXD_PB12 | UART0_TXD_PB13;

  170.     /* Set PC multi-function pins for CLKO(PC.13) */
  171.     SYS->GPC_MFPH = (SYS->GPC_MFPH & (~SYS_GPC_MFPH_PC13MFP_Msk)) | SYS_GPC_MFPH_PC13MFP_CLKO;

  172. }

  173. void UART0_Init()
  174. {
  175.     /*---------------------------------------------------------------------------------------------------------*/
  176.     /* Init UART                                                                                               */
  177.     /*---------------------------------------------------------------------------------------------------------*/
  178.     /* Reset UART0 */
  179.     SYS_ResetModule(UART0_RST);

  180.     /* Configure UART0 and set UART0 baud rate */
  181.     UART_Open(UART0, 115200);
  182. }

  183. /*---------------------------------------------------------------------------------------------------------*/
  184. /*  Main Function                                                                                          */
  185. /*---------------------------------------------------------------------------------------------------------*/
  186. int32_t main(void)
  187. {
  188.     S_RTC_TIME_DATA_T sReadRTC;

  189.     /* Unlock protected registers */
  190.     SYS_UnlockReg();

  191.     /* Init System, peripheral clock and multi-function I/O */
  192.     SYS_Init();
  193.    
  194.     /* Release I/O hold status */
  195.     CLK->IOPDCTL = 1;   

  196.     /* Lock protected registers */
  197.     SYS_LockReg();

  198.     /* Init UART0 for printf */
  199.     UART0_Init();

  200.     /* Enable Clock Output function, output clock is stopped in Power-down mode */
  201.     CLK_EnableCKO(CLK_CLKSEL1_CLKOSEL_HCLK, 3, 0);

  202.     /* Get power manager wake up source */
  203.     CheckPowerSource();

  204.     /* RTC wake-up source setting */
  205.     RTC_Init();

  206.     /*
  207.         This sample code will enter to different Power-down mode and wake-up by RTC:
  208.         1. Normal Power-down mode (PD).
  209.         2. Low Leakage Power-down mode (LLPD).
  210.         3. Fast Wake-up Power-down mode (FWPD).
  211.         4. Ultra Low Leakage Power-down mode (ULLPD).
  212.         5. Standby Power-down mode (SPD).
  213.         6. Deep Power-down mode (DPD).
  214.     */
  215.     while(1)
  216.     {

  217.         /* Select Power-down mode */
  218.         g_u32PowerDownMode = M32(PDMD_FLAG_ADDR);
  219.         switch(g_u32PowerDownMode)
  220.         {
  221.             case CLK_PMUCTL_PDMSEL_PD:
  222.                 printf("\nSystem enter to PD power-down mode ... ");
  223.                 break;
  224.             case CLK_PMUCTL_PDMSEL_LLPD:
  225.                 printf("\nSystem enter to LLPD power-down mode ... ");
  226.                 break;
  227.             case CLK_PMUCTL_PDMSEL_FWPD:
  228.                 printf("\nSystem enter to FWPD power-down mode ... ");
  229.                 break;
  230.             case CLK_PMUCTL_PDMSEL_ULLPD:
  231.                 printf("\nSystem enter to ULLPD power-down mode ... ");
  232.                 break;
  233.             case CLK_PMUCTL_PDMSEL_SPD:
  234.                 printf("\nSystem enter to SPD power-down mode ... ");
  235.                 break;
  236.             case CLK_PMUCTL_PDMSEL_DPD:
  237.                 printf("\nSystem enter to DPD power-down mode ... ");
  238.                 break;
  239.             default:
  240.                 printf("\nInit sample code. Press Reset Button and continue.\n");
  241.                 M32(PDMD_FLAG_ADDR) = 0;
  242.                 while(1);
  243.                 break;
  244.         }

  245.         /* Unlock protected registers before setting Power-down mode */
  246.         SYS_UnlockReg();

  247.         /* Enter to Power-down mode */
  248.         PowerDownFunction();
  249.         while(g_u32RTCTickINT == 0);
  250.         printf("Wake-up!\n");

  251.         /* Read current RTC date/time after wake-up */
  252.         RTC_GetDateAndTime(&sReadRTC);
  253.         printf("# Get RTC current date/time: %d/%02d/%02d %02d:%02d:%02d.\n",
  254.                sReadRTC.u32Year, sReadRTC.u32Month, sReadRTC.u32Day, sReadRTC.u32Hour, sReadRTC.u32Minute, sReadRTC.u32Second);

  255.         /* Select next Power-down mode */
  256.         switch(g_u32PowerDownMode)
  257.         {
  258.             case CLK_PMUCTL_PDMSEL_PD:
  259.                 M32(PDMD_FLAG_ADDR) = CLK_PMUCTL_PDMSEL_LLPD;
  260.                 break;
  261.             case CLK_PMUCTL_PDMSEL_LLPD:
  262.                 M32(PDMD_FLAG_ADDR) = CLK_PMUCTL_PDMSEL_FWPD;
  263.                 break;
  264.             case CLK_PMUCTL_PDMSEL_FWPD:
  265.                 M32(PDMD_FLAG_ADDR) = CLK_PMUCTL_PDMSEL_ULLPD;
  266.                 break;
  267.             case CLK_PMUCTL_PDMSEL_ULLPD:
  268.                 M32(PDMD_FLAG_ADDR) = CLK_PMUCTL_PDMSEL_SPD;
  269.                 break;
  270.             default:
  271.                 printf("\nPress Reset Button and continue.\n");
  272.                 M32(PDMD_FLAG_ADDR) = 0;
  273.                 while(1);
  274.                 break;
  275.         }

  276.     }


  277. }


  278. /*** (C) COPYRIGHT 2019 Nuvoton Technology Corp. ***/
643757107 发表于 2020-2-20 23:07 | 显示全部楼层
试试这个例子电流多大
 楼主| nbiot 发表于 2020-2-21 11:07 | 显示全部楼层
几乎是一样的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:QQ 2419286292

82

主题

181

帖子

3

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