text: /****************************************************************************
   * @file     main.c
   * @version  V1.00
   * $Revision: 2 $
   * $Date: 14/10/08 11:41a $
   * @brief    NUC029 Series UART Interface Controller Driver Sample Code
   *
   * @note
   * Copyright (C) 2011 Nuvoton Technology Corp. All rights reserved.
   *
   ******************************************************************************/
  #include <stdio.h>
  #include "NUC029xAN.h"
  
  #define PLL_CLOCK           50000000
  
  
  /*---------------------------------------------------------------------------------------------------------*/
  /* Define functions prototype                                                                              */
  /*---------------------------------------------------------------------------------------------------------*/
  extern char GetChar(void);
  int32_t main(void);
  void IrDA_FunctionTxTest(void);
  
  
  /*---------------------------------------------------------------------------------------------------------*/
  /*  IrDA Function Transmit Test                                                                            */
  /*---------------------------------------------------------------------------------------------------------*/
  void IrDA_FunctionTxTest()
  {
      uint8_t u8OutChar;
  
      printf("\n");
      printf("+-----------------------------------------------------------+\n");
      printf("|     Pin Configure                                         |\n");
      printf("+-----------------------------------------------------------+\n");
      printf("|     ______                                    _______     |\n");
      printf("|    |      |                                  |       |    |\n");
      printf("|    |Master|---TXD1(P1.3) <====> RXD1(P1.2)---|Slave  |    |\n");
      printf("|    |      |                                  |       |    |\n");
      printf("|    |______|                                  |_______|    |\n");
      printf("|                                                           |\n");
      printf("+-----------------------------------------------------------+\n");
  
      printf("\n");
      printf("+-----------------------------------------------------------+\n");
      printf("|     IrDA Function Test                                    |\n");
      printf("+-----------------------------------------------------------+\n");
      printf("|  Description :                                            |\n");
      printf("|    The sample code needs two boards. One is Master and    |\n");
      printf("|    the other is slave.  Master will send data based on    |\n");
      printf("|    terminal input and Slave will printf received data on  |\n");
      printf("|    terminal screen.                                       |\n");
      printf("+-----------------------------------------------------------+\n");
  
      /*
          UART0 is set to debug port and connect with PC firstly.
          The IrDA sample code needs two module board to execute.
          Set the master board is IrDA TX Mode and the other is IrDA Rx mode.
          Inputing char on terminal will be sent to the UART0 of master.
          After the master receiving, the inputing char will send to UART0 again.
          At the same time, it also sends to UART1 TX pin by IrDA mode.
          Slave will print received char after UART1 send out.
          Note that IrDA mode is ONLY used when baud rate equation is selected mode 0.
  
      */
  
      printf("\n");
      printf("+-----------------------------------------------------------+\n");
      printf("|     IrDA Function Mode Test (Master)                      |\n");
      printf("+-----------------------------------------------------------+\n");
      printf("| 1). Input char by UART0 terminal.                         |\n");
      printf("| 2). UART1 will send a char according to step 1.           |\n");
      printf("| 3). Return step 1. (Press '0' to exit)                    |\n");
      printf("+-----------------------------------------------------------+\n");
  
      printf("\nIRDA Sample Code Start. \n");
  
      /* Set IrDA Tx Mode, Baud Rate configuration must be used MODE0 */
      UART_SelectIrDAMode(UART1, 57600, UART_IRCR_TX_SELECT);
  
      /* Wait Terminal input to send data to UART1 TX pin */
      do
      {
          u8OutChar = GetChar();
          printf("   Input: %c , Send %c out\n", u8OutChar, u8OutChar);
          UART_WRITE(UART1, u8OutChar);
      }
      while(u8OutChar != '0');
  
      printf("\nIrDA Sample Code End.\n");
  
  }
  
  void SYS_Init(void)
  {
      /*---------------------------------------------------------------------------------------------------------*/
      /* Init System Clock                                                                                       */
      /*---------------------------------------------------------------------------------------------------------*/
  
      /* 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);
      CLK_EnableModuleClock(UART1_MODULE);
  
      /* Select UART module clock source */
      CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));
      CLK_SetModuleClock(UART1_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));
  
      /*---------------------------------------------------------------------------------------------------------*/
      /* Init I/O Multi-function                                                                                 */
      /*---------------------------------------------------------------------------------------------------------*/
  
      /* Set P3 multi-function pins for UART0 RXD and TXD */
      SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
      SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0);
  
      /* Set P1 multi-function pins for UART1 RXD and TXD */
      SYS->P1_MFP &= ~(SYS_MFP_P12_Msk | SYS_MFP_P13_Msk);
      SYS->P1_MFP |= (SYS_MFP_P12_RXD1 | SYS_MFP_P13_TXD1);
  
  }
  
  void UART0_Init()
  {
      /*---------------------------------------------------------------------------------------------------------*/
      /* Init UART                                                                                               */
      /*---------------------------------------------------------------------------------------------------------*/
      /* Reset UART0 module */
      SYS_ResetModule(UART0_RST);
  
      /* Configure UART0 and set UART0 Baudrate */
      UART_Open(UART0, 115200);
  }
  
  void UART1_Init()
  {
      /*---------------------------------------------------------------------------------------------------------*/
      /* Init UART                                                                                               */
      /*---------------------------------------------------------------------------------------------------------*/
      /* Reset UART1 module */
      SYS_ResetModule(UART1_RST);
  
      /* Configure UART1 and set UART1 Baudrate */
      UART_Open(UART1, 115200);
  }
  
  /*---------------------------------------------------------------------------------------------------------*/
  /* MAIN function                                                                                           */
  /*---------------------------------------------------------------------------------------------------------*/
  
  int32_t main(void)
  {
  
      /* Unlock protected registers */
      SYS_UnlockReg();
  
      /* Init System, peripheral clock and multi-function I/O */
      SYS_Init();
  
      /* Lock protected registers */
      SYS_LockReg();
  
      /* Init UART0 for printf */
      UART0_Init();
  
      /* Init UART1 for testing */
      UART1_Init();
  
      /*---------------------------------------------------------------------------------------------------------*/
      /* SAMPLE CODE                                                                                             */
      /*---------------------------------------------------------------------------------------------------------*/
  
      printf("\n\nCPU @ %dHz\n", SystemCoreClock);
  
      printf("\n\nUART Sample Program\n");
  
      /* UART sample IrDA Master function */
      IrDA_FunctionTxTest();
  
      while(1);
  
  }
  
  