[DemoCode下载] NUC123串口唤醒

[复制链接]
1313|7
 楼主| 玛尼玛尼哄 发表于 2017-6-23 08:00 | 显示全部楼层 |阅读模式
  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. * $Revision: 3 $
  5. * $Date: 15/07/02 3:13p $
  6. * @brief
  7. *           Show how to wake up system form Power-down mode by UART interrupt.
  8. *
  9. * @note
  10. * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved.
  11. *
  12. ******************************************************************************/
  13. #include <stdio.h>
  14. #include "NUC123.h"


  15. #define HCLK_CLOCK  72000000


  16. /*---------------------------------------------------------------------------------------------------------*/
  17. /* Define functions prototype                                                                              */
  18. /*---------------------------------------------------------------------------------------------------------*/
  19. int32_t main(void);
  20. void UART_CTSWakeUpTest(void);


  21. /*---------------------------------------------------------------------------------------------------------*/
  22. /* ISR to handle UART Channel 1 interrupt event                                                            */
  23. /*---------------------------------------------------------------------------------------------------------*/
  24. void UART1_IRQHandler(void)
  25. {   
  26.     if(UART_GET_INT_FLAG(UART1, UART_ISR_MODEM_INT_Msk))    /* UART Modem Status interrupt flag */
  27.     {
  28.         printf("UART Modem Status interrupt happen.");
  29.         UART_ClearIntFlag(UART1, UART_ISR_MODEM_INT_Msk);   /* Clear UART Modem Status interrupt flag */
  30.     }
  31. }

  32. /*---------------------------------------------------------------------------------------------------------*/
  33. /*  Function for System Entry to Power Down Mode                                                           */
  34. /*---------------------------------------------------------------------------------------------------------*/
  35. void PowerDownFunction(void)
  36. {
  37.     /* Check if all the debug messages are finished */
  38.     UART_WAIT_TX_EMPTY(UART0);

  39.     /* Enter to Power-down mode */
  40.     CLK_PowerDown();

  41. }

  42. /*---------------------------------------------------------------------------------------------------------*/
  43. /*  UART nCTS Wake-up Function                                                                             */
  44. /*---------------------------------------------------------------------------------------------------------*/
  45. void UART_CTSWakeUpTest(void)
  46. {

  47.     printf("+----------------------------------------------------------+\n");
  48.     printf("|   Power-Down and Wake-up by UART interrupt Sample Code   |\n");
  49.     printf("+----------------------------------------------------------+\n\n");   
  50.    
  51.     /* Clear Modem Status interrupt before entering Power-down mode */
  52.     UART_ClearIntFlag(UART1, UART_ISR_MODEM_INT_Msk);

  53.     /* Enable UART Wake-up function and Modem Status interrupt */
  54.     UART_EnableInt(UART1, UART_IER_WAKE_EN_Msk|UART_IER_MODEM_IEN_Msk);

  55.     printf("System enter to Power-down mode.\n");
  56.     printf("Toggle nCTS of UART1 to wake-up system.\n\n");

  57.     /* Unlock protected registers before entering Power-down mode */
  58.     SYS_UnlockReg();

  59.     /* Enter to Power-down mode */
  60.     PowerDownFunction();

  61.     /* Lock protected registers after entering Power-down mode */
  62.     SYS_LockReg();

  63.     /* Disable UART Wake-up function and Modem Status interrupt */
  64.     UART_DisableInt(UART1, UART_IER_WAKE_EN_Msk|UART_IER_MODEM_IEN_Msk);
  65.       
  66.     printf("\nSystem waken-up done.\n");      
  67.     printf("\nUART Sample Program End.\n");   

  68. }

  69. void SYS_Init(void)
  70. {
  71.     /*---------------------------------------------------------------------------------------------------------*/
  72.     /* Init System Clock                                                                                       */
  73.     /*---------------------------------------------------------------------------------------------------------*/

  74.     /* Enable XT1_OUT(PF0) and XT1_IN(PF1) */
  75.     SYS->GPF_MFP |= SYS_GPF_MFP_PF0_XT1_OUT | SYS_GPF_MFP_PF1_XT1_IN;

  76.     /* Enable Internal RC 22.1184MHz clock */
  77.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

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

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

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

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

  86.     /* Set core clock as HCLK_CLOCK */
  87.     CLK_SetCoreClock(HCLK_CLOCK);

  88.     /* Enable UART module clock */
  89.     CLK_EnableModuleClock(UART0_MODULE);
  90.     CLK_EnableModuleClock(UART1_MODULE);

  91.     /* Select UART module clock source */
  92.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));
  93.     CLK_SetModuleClock(UART1_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));
  94.    
  95.     /*---------------------------------------------------------------------------------------------------------*/
  96.     /* Init I/O Multi-function                                                                                 */
  97.     /*---------------------------------------------------------------------------------------------------------*/

  98.     /* Set GPB multi-function pins for UART0 RXD(PB.0) and TXD(PB.1) */
  99.     /* Set GPB multi-function pins for UART1 RXD(PB.4), TXD(PB.5) and nCTS(PB.7) */

  100.     SYS->GPB_MFP &= ~(SYS_GPB_MFP_PB0_Msk | SYS_GPB_MFP_PB1_Msk |
  101.                       SYS_GPB_MFP_PB4_Msk | SYS_GPB_MFP_PB5_Msk | SYS_GPB_MFP_PB7_Msk);
  102.     SYS->GPB_MFP |= (SYS_GPB_MFP_PB0_UART0_RXD | SYS_GPB_MFP_PB1_UART0_TXD |
  103.                      SYS_GPB_MFP_PB4_UART1_RXD | SYS_GPB_MFP_PB5_UART1_TXD | SYS_GPB_MFP_PB7_UART1_nCTS);

  104.     SYS->ALT_MFP &= ~(SYS_ALT_MFP_PB4_Msk | SYS_ALT_MFP_PB5_Msk | SYS_ALT_MFP_PB7_Msk);
  105.     SYS->ALT_MFP |= (SYS_ALT_MFP_PB4_UART1_RXD | SYS_ALT_MFP_PB5_UART1_TXD | SYS_ALT_MFP_PB7_UART1_nCTS);   

  106. }

  107. void UART0_Init()
  108. {
  109.     /*---------------------------------------------------------------------------------------------------------*/
  110.     /* Init UART                                                                                               */
  111.     /*---------------------------------------------------------------------------------------------------------*/
  112.     /* Reset UART0 */
  113.     SYS_ResetModule(UART0_RST);

  114.     /* Configure UART0 and set UART0 Baudrate */
  115.     UART_Open(UART0, 115200);
  116. }


  117. void UART1_Init()
  118. {
  119.     /*---------------------------------------------------------------------------------------------------------*/
  120.     /* Init UART                                                                                               */
  121.     /*---------------------------------------------------------------------------------------------------------*/
  122.     /* Reset UART1 */
  123.     SYS_ResetModule(UART1_RST);

  124.     /* Configure UART1 and set UART1 Baudrate */
  125.     UART_Open(UART1, 115200);
  126. }

  127. /*---------------------------------------------------------------------------------------------------------*/
  128. /* MAIN function                                                                                           */
  129. /*---------------------------------------------------------------------------------------------------------*/

  130. int main(void)
  131. {      
  132.     /* Unlock protected registers */
  133.     SYS_UnlockReg();

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

  136.     /* Lock protected registers */
  137.     SYS_LockReg();

  138.     /* Init UART0 for printf */
  139.     UART0_Init();

  140.     /* Init UART1 for testing */
  141.     UART1_Init();

  142.     /*---------------------------------------------------------------------------------------------------------*/
  143.     /* SAMPLE CODE                                                                                             */
  144.     /*---------------------------------------------------------------------------------------------------------*/

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

  146.     printf("\n\nUART Sample Program.\n");

  147.     /* UART wake-up sample function */
  148.     UART_CTSWakeUpTest();
  149.    
  150.     while(1);
  151. }


 楼主| 玛尼玛尼哄 发表于 2017-6-23 08:01 | 显示全部楼层
printf("+----------------------------------------------------------+\n");
    printf("|   Power-Down and Wake-up by UART interrupt Sample Code   |\n");
    printf("+----------------------------------------------------------+\n\n");   

    /* Clear Modem Status interrupt before entering Power-down mode */
    UART_ClearIntFlag(UART1, UART_ISR_MODEM_INT_Msk);

    /* Enable UART Wake-up function and Modem Status interrupt */
    UART_EnableInt(UART1, UART_IER_WAKE_EN_Msk|UART_IER_MODEM_IEN_Msk);

    printf("System enter to Power-down mode.\n");
    printf("Toggle nCTS of UART1 to wake-up system.\n\n");

    /* Unlock protected registers before entering Power-down mode */
    SYS_UnlockReg();

    /* Enter to Power-down mode */
    PowerDownFunction();

    /* Lock protected registers after entering Power-down mode */
    SYS_LockReg();

    /* Disable UART Wake-up function and Modem Status interrupt */
    UART_DisableInt(UART1, UART_IER_WAKE_EN_Msk|UART_IER_MODEM_IEN_Msk);

    printf("\nSystem waken-up done.\n");      
    printf("\nUART Sample Program End.\n");   


 楼主| 玛尼玛尼哄 发表于 2017-6-23 08:02 | 显示全部楼层
其实很简单就实现了,比较给力。
yiyigirl2014 发表于 2017-6-23 15:39 | 显示全部楼层
串口中断唤醒。
598330983 发表于 2017-6-24 12:07 | 显示全部楼层
void UART1_IRQHandler(void)
{   
    if(UART_GET_INT_FLAG(UART1, UART_ISR_MODEM_INT_Msk))    /* UART Modem Status interrupt flag */
    {
        printf("UART Modem Status interrupt happen.");
        UART_ClearIntFlag(UART1, UART_ISR_MODEM_INT_Msk);   /* Clear UART Modem Status interrupt flag */
    }
}
读取和清理都是一一对应的。
598330983 发表于 2017-6-24 12:08 | 显示全部楼层
void UART1_IRQHandler(void)
{   
    if(UART_GET_INT_FLAG(UART1, UART_ISR_MODEM_INT_Msk))    /* UART Modem Status interrupt flag */
    {
        printf("UART Modem Status interrupt happen.");
        UART_ClearIntFlag(UART1, UART_ISR_MODEM_INT_Msk);   /* Clear UART Modem Status interrupt flag */
    }
}
读取和清理都是一一对应的。
dongnanxibei 发表于 2017-6-25 15:49 | 显示全部楼层
原来也不是很难啊。
zhuotuzi 发表于 2017-6-25 16:20 | 显示全部楼层
每种中断其实都不难,特别是用库函数操作。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

198

主题

3432

帖子

2

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