/**************************************************************************//**
 * @file     W7500x.h
 * @brief    CMSIS Cortex-M0 Core Peripheral Access Layer Header File for
 *           Device W7500x
 * @version  V3.01
 * @date     06. March 2012
 *
 * @note
 * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
 *
 * @par
 * ARM Limited (ARM) is supplying this software for use with Cortex-M
 * processor based microcontrollers.  This file can be freely distributed
 * within development tools that are supporting such ARM based processors.
 *
 * @par
 * THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED
 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
 * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
 * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
 *
 ******************************************************************************/


#ifndef W7500x_H
#define W7500x_H

#ifdef __cplusplus
 extern "C" {
#endif

/** @addtogroup W7500x_Definitions W7500x Definitions
  This file defines all structures and symbols for W7500x:
    - registers and bitfields
    - peripheral base address
    - peripheral ID
    - Peripheral definitions
  @{
*/


/******************************************************************************/
/*                Processor and Core Peripherals                              */
/******************************************************************************/
/** @addtogroup W7500x_CMSIS Device CMSIS Definitions
  Configuration of the Cortex-M0 Processor and Core Peripherals
  @{
*/

/*
 * ==========================================================================
 * ---------- Interrupt Number Definition -----------------------------------
 * ==========================================================================
 */

typedef enum IRQn
{
/******  Cortex-M0 Processor Exceptions Numbers **************************************************/

/* ToDo: use this Cortex interrupt numbers if your device is a CORTEX-M0 device                  */
  NonMaskableInt_IRQn          = -14,      /*!<  2 Cortex-M0 Non Maskable Interrupt              */
  HardFault_IRQn               = -13,      /*!<  3 Cortex-M0 Hard Fault Interrupt                */
  SVCall_IRQn                  = -5,       /*!< 11 Cortex-M0 SV Call Interrupt                   */
  PendSV_IRQn                  = -2,       /*!< 14 Cortex-M0 Pend SV Interrupt                   */
  SysTick_IRQn                 = -1,       /*!< 15 Cortex-M0 System Tick Interrupt               */
/******  W7500x Specific Interrupt Numbers *********************************************************/
  SSP0_IRQn                    = 0,        /*!< SSP 0 Interrupt                                   */ 
  SSP1_IRQn                    = 1,        /*!< SSP 1 Interrupt                                   */ 
  UART0_IRQn                   = 2,        /*!< UART 0 Interrupt                                  */
  UART1_IRQn                   = 3,        /*!< UART 1 Interrupt                                  */
  UART2_IRQn                   = 4,        /*!< UART 2 Interrupt                                  */
  I2C0_IRQn                    = 5,        /*!< I2C 0 Interrupt                                   */ 
  I2C1_IRQn                    = 6,        /*!< I2C 1 Interrupt                                   */ 
  PORT0_IRQn                   = 7,        /*!< Port 1 combined Interrupt                         */  
  PORT1_IRQn                   = 8,        /*!< Port 2 combined Interrupt                         */  
  PORT2_IRQn                   = 9,        /*!< Port 2 combined Interrupt                         */  
  PORT3_IRQn                   = 10,       /*!< Port 2 combined Interrupt                         */  
  DMA_IRQn                     = 11,       /*!< DMA combined Interrupt                            */   
  DUALTIMER0_IRQn              = 12,       /*!< Dual Timer 0 Interrupt                            */
  DUALTIMER1_IRQn              = 13,       /*!< Dual Timer 1 Interrupt                            */
  PWM0_IRQn                    = 14,       /*!< PWM 0 Interrupt                                   */ 
  PWM1_IRQn                    = 15,       /*!< PWM 1 Interrupt                                   */ 
  PWM2_IRQn                    = 16,       /*!< PWM 2 Interrupt                                   */ 
  PWM3_IRQn                    = 17,       /*!< PWM 3 Interrupt                                   */ 
  PWM4_IRQn                    = 18,       /*!< PWM 4 Interrupt                                   */ 
  PWM5_IRQn                    = 19,       /*!< PWM 5 Interrupt                                   */ 
  PWM6_IRQn                    = 20,       /*!< PWM 6 Interrupt                                   */ 
  PWM7_IRQn                    = 21,       /*!< PWM 7 Interrupt                                   */ 
  RTC_IRQn                     = 22,       /*!< RTC Interrupt                                     */ 
  ADC_IRQn                     = 23,       /*!< ADC Interrupt                                     */ 
  WZTOE_IRQn                   = 24,       /*!< WZTOE Interrupt                                   */       
  EXTI_IRQn                    = 25        /*!< EXTI Interrupt                                   */       
} IRQn_Type;

/*
 * ==========================================================================
 * ----------- Processor and Core Peripheral Section ------------------------
 * ==========================================================================
 */

/* Configuration of the Cortex-M0 Processor and Core Peripherals */
#define __CM0_REV                 0x0000    /*!< Core Revision r0p0                               */
#define __NVIC_PRIO_BITS          2         /*!< Number of Bits used for Priority Levels          */
#define __Vendor_SysTickConfig    0         /*!< Set to 1 if different SysTick Config is used     */
#define __MPU_PRESENT             0         /*!< MPU present or not                               */

/*@}*/ /* end of group W7500x_CMSIS */


#include "core_cm0.h"                    /* Cortex-M0 processor and core peripherals           */
#include "system_W7500x.h"               /* W7500x System include file                          */


/** @addtogroup Exported_types
  * @{
  */  

typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))

typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;




/**
  * @}
  */




/** @addtogroup Peripheral_registers_structures
  * @{
  */   

/**
  * @brief Clock Reset Generator
  */
typedef struct
{
  __IO  uint32_t  OSC_PDR;            /*!< Oscillator power down register,               Address offset : 0x00 */
        uint32_t  RESERVED0[3];
  __IO  uint32_t  PLL_PDR;            /*!< PLL power down register,                      Address offset : 0x10 */
  __IO  uint32_t  PLL_FCR;            /*!< PLL frequency calculating register,           Address offset : 0x14 */
  __IO  uint32_t  PLL_OER;            /*!< PLL output enable register,                   Address offset : 0x18 */
  __IO  uint32_t  PLL_BPR;            /*!< PLL bypass register,                          Address offset : 0x1c */     
  __IO  uint32_t  PLL_IFSR;           /*!< PLL input frequency select register,          Address offset : 0x20 */     
        uint32_t  RESERVED1[3];
  __IO  uint32_t  FCLK_SSR;           /*!< FCLK source select register,                  Address offset : 0x30 */     
  __IO  uint32_t  FCLK_PVSR;          /*!< FCLK prescale value select register,          Address offset : 0x34 */     
        uint32_t  RESERVED2[2];
  __IO  uint32_t  SSPCLK_SSR;         /*!< SSPCLK source select register,                Address offset : 0x40 */     
  __IO  uint32_t  SSPCLK_PVSR;        /*!< SSPCLK prescale value select register,        Address offset : 0x44 */     
        uint32_t  RESERVED3[6];
  __IO  uint32_t  ADCCLK_SSR;         /*!< ADCCLK source select register,                Address offset : 0x60 */     
  __IO  uint32_t  ADCCLK_PVSR;        /*!< ADCCLK prescale value select register,        Address offset : 0x64 */     
        uint32_t  RESERVED4[2];
  __IO  uint32_t  TIMER0CLK_SSR;      /*!< TIMER0CLK source select register,             Address offset : 0x70 */     
  __IO  uint32_t  TIMER0CLK_PVSR;     /*!< TIMER0CLK prescale value select register,     Address offset : 0x74 */     
        uint32_t  RESERVED5[2];
  __IO  uint32_t  TIMER1CLK_SSR;      /*!< TIMER1CLK source select register,             Address offset : 0x80 */     
  __IO  uint32_t  TIMER1CLK_PVSR;     /*!< TIMER1CLK prescale value select register,     Address offset : 0x84 */     
        uint32_t  RESERVED6[10];
  __IO  uint32_t  PWM0CLK_SSR;        /*!< PWM0CLK source select register,               Address offset : 0xb0 */     
  __IO  uint32_t  PWM0CLK_PVSR;       /*!< PWM0CLK prescale value select register,       Address offset : 0xb4 */     
        uint32_t  RESERVED7[2];
  __IO  uint32_t  PWM1CLK_SSR;        /*!< PWM1CLK source select register,               Address offset : 0xc0 */     
  __IO  uint32_t  PWM1CLK_PVSR;       /*!< PWM1CLK prescale value select register,       Address offset : 0xc4 */     
        uint32_t  RESERVED8[2];
  __IO  uint32_t  PWM2CLK_SSR;        /*!< PWM2CLK source select register,               Address offset : 0xd0 */     
  __IO  uint32_t  PWM2CLK_PVSR;       /*!< PWM2CLK prescale value select register,       Address offset : 0xd4 */     
        uint32_t  RESERVED9[2];
  __IO  uint32_t  PWM3CLK_SSR;        /*!< PWM3CLK source select register,               Address offset : 0xe0 */     
  __IO  uint32_t  PWM3CLK_PVSR;       /*!< PWM3CLK prescale value select register,       Address offset : 0xe4 */     
        uint32_t  RESERVED10[2];
  __IO  uint32_t  PWM4CLK_SSR;        /*!< PWM4CLK source select register,               Address offset : 0xf0 */     
  __IO  uint32_t  PWM4CLK_PVSR;       /*!< PWM4CLK prescale value select register,       Address offset : 0xf4 */     
        uint32_t  RESERVED11[2];
  __IO  uint32_t  PWM5CLK_SSR;        /*!< PWM5CLK source select register,               Address offset : 0x100 */     
  __IO  uint32_t  PWM5LK_PVSR;        /*!< PWM5CLK prescale value select register,       Address offset : 0x104 */     
        uint32_t  RESERVED12[2];
  __IO  uint32_t  PWM6CLK_SSR;        /*!< PWM6CLK source select register,               Address offset : 0x110 */     
  __IO  uint32_t  PWM6CLK_PVSR;       /*!< PWM6CLK prescale value select register,       Address offset : 0x114 */     
        uint32_t  RESERVED13[2];
  __IO  uint32_t  PWM7CLK_SSR;        /*!< PWM7CLK source select register,               Address offset : 0x120 */     
  __IO  uint32_t  PWM7CLK_PVSR;       /*!< PWM7CLK prescale value select register,       Address offset : 0x124 */     
        uint32_t  RESERVED14[2];
  __IO  uint32_t  RTC_HS_SSR;         /*!< RTC High Speed source select register,             Address offset : 0x130 */     
  __IO  uint32_t  RTC_HS_PVSR;        /*!< RTC High Speed prescale value select register,     Address offset : 0x134 */     
        uint32_t  RESERVED15;
  __IO  uint32_t  RTC_SSR;            /*!< RTC source select register,                        Address offset : 0x13c */

  __IO  uint32_t  WDOGCLK_HS_SSR;     /*!< WDOGCLK High Speed source select register,         Address offset : 0x140 */     
  __IO  uint32_t  WDOGCLK_HS_PVSR;    /*!< WDOGCLK High Speed prescale value select register, Address offset : 0x144 */     
        uint32_t  RESERVED16;
  __IO  uint32_t  WDOGCLK_SSR;        /*!< WDOGCLK source select register,               Address offset : 0x14c */

  __IO  uint32_t  UARTCLK_SSR;        /*!< UARTCLK source select register,               Address offset : 0x150 */     
  __IO  uint32_t  UARTCLK_PVSR;       /*!< UARTCLK prescale value select register,       Address offset : 0x154 */     
        uint32_t  RESERVED17[2];
  __IO  uint32_t  MIICLK_ECR;         /*!< MII clock enable control register,            Address offset : 0x160 */     
        uint32_t  RESERVED18[3];
  __IO  uint32_t  MONCLK_SSR;         /*!< Monitoring clock source select I found Treasure was IoT Base Station in March.register,      Address offset : 0x170 */
}CRG_TypeDef;


/**
  * @brief UART
  */
typedef struct
{
  __IO uint32_t DR;             /*!< Data,                              Address offset : 0x00 */
 union {
  __I  uint32_t RSR;            /*!< Receive Status,                    Address offset : 0x04 */  
  __O  uint32_t ECR;            /*!< Error Clear,                       Address offset : 0x04 */
  } STATUS;
       uint32_t RESERVED0[4];
  __IO uint32_t FR;             /*!< Flags,                             Address offset : 0x18 */
       uint32_t RESERVED1;
  __IO uint32_t ILPR;           /*!< IrDA Low-power Counter,            Address offset : 0x20 */                              
  __IO uint32_t IBRD;           /*!< Integer Baud Rate,                 Address offset : 0x24 */
  __IO uint32_t FBRD;           /*!< Fractional Baud Rate,              Address offset : 0x28 */
  __IO uint32_t LCR_H;          /*!< Line Control,                      Address offset : 0x2C */
  __IO uint32_t CR;             /*!< Control,                           Address offset : 0x30 */
  __IO uint32_t IFLS;           /*!< Interrupt FIFO Level Select,       Address offset : 0x34 */
  __IO uint32_t IMSC;           /*!< Interrupt Mask Set / Clear,        Address offset : 0x38 */
  __IO uint32_t RIS;            /*!< Raw Interrupt Status ,             Address offset : 0x3C */
  __IO uint32_t MIS;            /*!< Masked Interrupt Status ,          Address offset : 0x40 */
  __O  uint32_t ICR;            /*!< Interrupt Clear,                   Address offset : 0x44 */
  __IO uint32_t DMACR;          /*!< DMA Control,                       Address offset : 0x48 */
} UART_TypeDef;


/**
  * @brief Simple UART
  */
typedef struct
{
  __IO   uint32_t  DATA;          /*!< Offset: 0x000 Data Register    (R/W) */
  __IO   uint32_t  STATE;         /*!< Offset: 0x004 Status Register  (R/W) */
  __IO   uint32_t  CTRL;          /*!< Offset: 0x008 Control Register (R/W) */
  union {
    __I    uint32_t  STATUS;   /*!< Offset: 0x00C Interrupt Status Register (R/ ) */
    __O    uint32_t  CLEAR;    /*!< Offset: 0x00C Interrupt Clear Register ( /W) */
    }INT;
  __IO   uint32_t  BAUDDIV;       /*!< Offset: 0x010 Baudrate Divider Register (R/W) */

} S_UART_TypeDef;

/**
  * @brief Analog Digital Converter
  */

typedef struct
{
  __IO  uint32_t  ADC_CTR;          /* ADC control register,                    Address offset : 0x000 */
  __IO  uint32_t  ADC_CHSEL;        /* ADC channel select register,             Address offset : 0x004 */
  __IO  uint32_t  ADC_START;        /* ADC start register,                      Address offset : 0x008 */
  __I   uint32_t  ADC_DATA;         /* ADC conversion data register,            Address offset : 0x00c */
  __IO  uint32_t  ADC_INT;          /* ADC interrupt register,                  Address offset : 0x010 */
        uint32_t  RESERVED0[2];
  __IO  uint32_t  ADC_INTCLR;       /* ADC interrupt clear register,            Address offset : 0x01c */
}ADC_TypeDef;

/**
  * @brief dualtimer
  */
typedef struct
{
  __IO uint32_t TimerLoad;    // <h> Timer Load </h>
  __I  uint32_t TimerValue;   // <h> Timer Counter Current Value <r></h>
  __IO uint32_t TimerControl; // <h> Timer Control
                              //   <o.7> TimerEn: Timer Enable
                              //   <o.6> TimerMode: Timer Mode
                              //     <0=> Freerunning-mode
                              //     <1=> Periodic mode
                              //   <o.5> IntEnable: Interrupt Enable
                              //   <o.2..3> TimerPre: Timer Prescale
                              //     <0=> / 1
                              //     <1=> / 16
                              //     <2=> / 256
                              //     <3=> Undefined!
                              //   <o.1> TimerSize: Timer Size
                              //     <0=> 16-bit counter
                              //     <1=> 32-bit counter
                              //   <o.0> OneShot: One-shoot mode
                              //     <0=> Wrapping mode
                              //     <1=> One-shot mode
                              // </h>
  __O  uint32_t TimerIntClr;  // <h> Timer Interrupt Clear <w></h>
  __I  uint32_t TimerRIS;     // <h> Timer Raw Interrupt Status <r></h>
  __I  uint32_t TimerMIS;     // <h> Timer Masked Interrupt Status <r></h>
  __IO uint32_t TimerBGLoad;  // <h> Background Load Register </h>
} DUALTIMER_TypeDef;

/**
  * @brief GPIO
  */
typedef struct
{
  __IO   uint32_t  DATA;            /* DATA Register (R/W),                        offset : 0x000 */
  __IO   uint32_t  DATAOUT;         /* Data Output Latch Register (R/W),           offset : 0x004 */
         uint32_t  RESERVED0[2];
  __IO   uint32_t  OUTENSET;        /* Output Enable Set Register  (R/W)           offset : 0x010 */
  __IO   uint32_t  OUTENCLR;        /* Output Enable Clear Register  (R/W)         offset : 0x014 */
  __IO   uint32_t  RESERVED1;       /* Alternate Function Set Register  (R/W)      offset : 0x018 */
  __IO   uint32_t  RESERVED2;       /* Alternate Function Clear Register  (R/W)    offset : 0x01C */
  __IO   uint32_t  INTENSET;        /* Interrupt Enable Set Register  (R/W)        offset : 0x020 */
  __IO   uint32_t  INTENCLR;        /* Interrupt Enable Clear Register  (R/W)      offset : 0x024 */
  __IO   uint32_t  INTTYPESET;      /* Interrupt Type Set Register  (R/W)          offset : 0x028 */
  __IO   uint32_t  INTTYPECLR;      /* Interrupt Type Clear Register  (R/W)        offset : 0x02C */
  __IO   uint32_t  INTPOLSET;       /* Interrupt Polarity Set Register  (R/W)      offset : 0x030 */
  __IO   uint32_t  INTPOLCLR;       /* Interrupt Polarity Clear Register  (R/W)    offset : 0x034 */
  union {
    __I    uint32_t  INTSTATUS;     /* Interrupt Status Register (R/ )             offset : 0x038 */
    __O    uint32_t  INTCLEAR;      /* Interrupt Clear Register ( /W)              offset : 0x038 */
    }Interrupt;
         uint32_t RESERVED3[241];
  __IO   uint32_t LB_MASKED[256];   /* Lower byte Masked Access Register (R/W)     offset : 0x400 - 0x7FC  */
  __IO   uint32_t UB_MASKED[256];   /* Upper byte Masked Access Register (R/W)     offset : 0x800 - 0xBFC  */
} GPIO_TypeDef;

typedef struct
{
  __IO  uint32_t  Port[16]; /* Port_00,      offset : 0x00 */
                            /* Port_01,      offset : 0x04 */
                            /* Port_02,      offset : 0x08 */
                            /* Port_03,      offset : 0x0C */
                            /* Port_04,      offset : 0x10 */
                            /* Port_05,      offset : 0x14 */
                            /* Port_06,      offset : 0x18 */
                            /* Port_07,      offset : 0x1C */
                            /* Port_08,      offset : 0x20 */
                            /* Port_09,      offset : 0x24 */
                            /* Port_10,      offset : 0x28 */
                            /* Port_11,      offset : 0x2C */
                            /* Port_12,      offset : 0x30 */
                            /* Port_13,      offset : 0x34 */
                            /* Port_14,      offset : 0x38 */
                            /* Port_15,      offset : 0x3C */
} P_Port_Def;

typedef struct
{
  __IO  uint32_t  Port[5];  /* Port_00,      offset : 0x00 */
                            /* Port_01,      offset : 0x04 */
                            /* Port_02,      offset : 0x08 */
                            /* Port_03,      offset : 0x0C */
                            /* Port_04,      offset : 0x10 */
} P_Port_D_Def;

/**
  * @brief  I2C Register structure definition
  */
typedef struct
{
    __IO uint32_t PRER;              //0x00
    __IO uint32_t CTR;              //0x04
    __IO uint32_t CMDR;              //0x08
    __I  uint32_t SR;               //0x0C
    __IO uint32_t TSR;               //0x10
    __IO uint32_t SADDR;            //0x14
    __IO uint32_t TXR;               //0x18
    __I  uint32_t RXR;               //0x1C
    __I  uint32_t ISR;              //0x20
    __IO uint32_t ISCR;             //0x24
    __IO uint32_t ISMR;             //0x28
}I2C_TypeDef;

/**
 * @brief PWM Register structure definition
 */
typedef struct
{
    __IO    uint32_t    IER;    //Interrupt enable register
                                //   <7>   IE7 : Channel 7 interrupt enable <R/W>
                                //   <6>   IE6 : Channel 6 interrupt enable <R/W>
                                //   <5>   IE5 : Channel 5 interrupt enable <R/W>
                                //   <4>   IE4 : Channel 4 interrupt enable <R/W>
                                //   <3>   IE3 : Channel 3 interrupt enable <R/W>
                                //   <2>   IE2 : Channel 2 interrupt enable <R/W>
                                //   <1>   IE1 : Channel 1 interrupt enable <R/W>
                                //   <0>   IE0 : Channel 0 interrupt enable <R/W>

    __IO    uint32_t    SSR;    //Start Stop register
                                //   <7>   SS7 : Channel 7 TC start or stop <R/W>
                                //   <6>   SS6 : Channel 6 TC start or stop <R/W>
                                //   <5>   SS5 : Channel 5 TC start or stop <R/W>
                                //   <4>   SS4 : Channel 4 TC start or stop <R/W>
                                //   <3>   SS3 : Channel 3 TC start or stop <R/W>
                                //   <2>   SS2 : Channel 2 TC start or stop <R/W>
                                //   <1>   SS1 : Channel 1 TC start or stop <R/W>
                                //   <0>   SS0 : Channel 0 TC start or stop <R/W>

    __IO    uint32_t    PSR;    //Pause register
                                //   <7>   PS7 : Channel 7 TC pasue <R/W>
                                //   <6>   PS6 : Channel 6 TC pasue <R/W>
                                //   <5>   PS5 : Channel 5 TC pasue <R/W>
                                //   <4>   PS4 : Channel 4 TC pasue <R/W>
                                //   <3>   PS3 : Channel 3 TC pasue <R/W>
                                //   <2>   PS2 : Channel 2 TC pasue <R/W>
                                //   <1>   PS1 : Channel 1 TC pasue <R/W>
                                //   <0>   PS0 : Channel 0 TC pasue <R/W>
} PWM_TypeDef;

typedef struct
{
    __I     uint32_t    IR;     //Interrupt register
                                //   <2>   CI : Capture interrupt <R>
                                //   <1>   OI : Overflow interrupt <R>
                                //   <0>   MI : Match interrupt <R>

    __IO    uint32_t    IER;    //Interrupt enable register
                                //   <2>   CIE : Capture interrupt enable <R/W>
                                //   <1>   OIE : Overflow interrupt enable <R/W>
                                //   <0>   MIE : Match interrupt enable <R/W>

    __O     uint32_t    ICR;    //Interrupt clear register
                                //   <2>   CIC : Capture interrupt clear <W>
                                //   <1>   OIC : Overflow interrupt clear <W>
                                //   <0>   MIC : Match interrupt clear <W>

    __I     uint32_t    TCR;    //Timer/Counter register
                                //   <0..31>   TCR : Timer/Counter register <R>

    __I     uint32_t    PCR;    //Prescale counter register
                                //   <0..5>   PCR : Prescale Counter register <R>

    __IO    uint32_t    PR;     //Prescale register
                                //   <0..5>   PR : prescale register <R/W>

    __IO    uint32_t    MR;     //Match register
                                //   <0..31>   MR : Match register <R/W>

    __IO    uint32_t    LR;     //Limit register
                                //   <0..31>   LR : Limit register <R/W>
    __IO    uint32_t    UDMR;   //Up-Down mode register
                                //   <0>   UDM : Up-down mode <R/W>

    __IO    uint32_t    TCMR;   //Timer/Counter mode register
                                //   <0>   TCM : Timer/Counter mode <R/W>

    __IO    uint32_t    PEEER;  //PWM output enable and external input enable register
                                //   <0..1>   PEEE : PWM output enable and external input enable <R/W>

    __IO    uint32_t    CMR;    //Capture mode register
                                //   <0>   CM : Capture mode <R/W>

    __IO    uint32_t    CR;     //Capture register
                                //   <0..31>   CR : Capture register <R>

    __IO    uint32_t    PDMR;   //Periodic mode register
                                //   <0>   PDM : Periodic mode <R/W>

    __IO    uint32_t    DZER;   //Dead-zone enable register
                                //   <0>   DZE : Dead-zone enable <R/W>

    __IO    uint32_t    DZCR;   //Dead-zone counter register
                                //   <0..9>   DZC : Dead-zone counter <R/W>
} PWM_CHn_TypeDef;

typedef struct
{
    __IO uint32_t    PWM_CHn_PR;   //Prescale register
                                   //   <0..5>   PR : prescale register <R/W>
    __IO uint32_t    PWM_CHn_MR;   //Match register
                                   //   <0..31>   MR : Match register <R/W>
    __IO uint32_t    PWM_CHn_LR;   //Limit register
                                   //   <0..31>   LR : Limit register <R/W>
    __IO uint32_t    PWM_CHn_UDMR; //Up-Down mode register
                                   //   <0>   UDM : Up-down mode <R/W>
    __IO uint32_t    PWM_CHn_PDMR; //Periodic mode register
                                   //   <0>   PDM : Periodic mode <R/W>
}PWM_TimerModeInitTypeDef;

typedef struct
{
    __IO uint32_t    PWM_CHn_PR;   //Prescale register
                                   //   <0..5>   PR : prescale register <R/W>
    __IO uint32_t    PWM_CHn_MR;   //Match register
                                   //   <0..31>   MR : Match register <R/W>
    __IO uint32_t    PWM_CHn_LR;   //Limit register
                                   //   <0..31>   LR : Limit register <R/W>
    __IO uint32_t    PWM_CHn_UDMR; //Up-Down mode register
                                   //   <0>   UDM : Up-down mode <R/W>
    __IO uint32_t    PWM_CHn_PDMR; //Periodic mode register
                                   //   <0>   PDM : Peiodic mode <R/W>
    __IO uint32_t    PWM_CHn_CMR;  //Capture mode register
                                   //   <0>   CM : Capture mode <R/W>
}PWM_CaptureModeInitTypeDef;

typedef struct
{
    __IO uint32_t    PWM_CHn_MR;
    __IO uint32_t    PWM_CHn_LR;
    __IO uint32_t    PWM_CHn_UDMR;
    __IO uint32_t    PWM_CHn_PDMR;
    __IO uint32_t    PWM_CHn_TCMR;
}PWM_CounterModeInitTypeDef;


/**
  * @brief Random Number generator
  */
typedef struct
{
  __IO  uint32_t  RNG_RUN;          /* RNG run register,                    Address offset : 0x000 */
  __IO  uint32_t  RNG_SEED;         /* RNG seed value register,             Address offset : 0x004 */
  __IO  uint32_t  RNG_CLKSEL;       /* RNG Clock source select register,    Address offset : 0x008 */
  __IO  uint32_t  RNG_MODE;         /* RNG MODE select register,            Address offset : 0x00c */
  __I   uint32_t  RNG_RN;           /* RNG random number value register,    Address offset : 0x010 */
  __IO  uint32_t  RNG_POLY;         /* RNG polynomial register,             Address offset : 0x014 */
}RNG_TypeDef;

/**
  * @brief Serial Peripheral Interface
  */
typedef struct
{
  __IO uint32_t CR0;
  __IO uint32_t CR1;
  __IO uint32_t DR;
  __IO uint32_t SR;
  __IO uint32_t CPSR;
  __IO uint32_t IMSC;
  __IO uint32_t RIS;
  __IO uint32_t MIS;
  __IO uint32_t ICR;
  __IO uint32_t DMACR;
} SSP_TypeDef;

typedef struct
{
    __IO    uint32_t  WatchdogLoad;         // <h> Watchdog Load Register </h>
    __I     uint32_t  WatchdogValue;        // <h> Watchdog Value Register </h>
    __IO    uint32_t  WatchdogControl;      // <h> Watchdog Control Register
                                            //   <o.1>    RESEN: Reset enable
                                            //   <o.0>    INTEN: Interrupt enable
                                            // </h>
    __O     uint32_t  WatchdogIntClr;       // <h> Watchdog Clear Interrupt Register </h>
    __I     uint32_t  WatchdogRIS;          // <h> Watchdog Raw Interrupt Status Register </h>
    __I     uint32_t  WatchdogMIS;          // <h> Watchdog Interrupt Status Register </h>
            uint32_t  RESERVED[762];
    __IO    uint32_t  WatchdogLock;         // <h> Watchdog Lock Register </h>
}WATCHDOG_TypeDef;

/** @addtogroup Peripheral_memory_map
  * @{
  */

/* Peripheral and SRAM base address */
#define W7500x_FLASH_BASE        (0x00000000UL)  /*!< (FLASH     ) Base Address */
#define W7500x_SRAM_BASE         (0x20000000UL)  /*!< (SRAM      ) Base Address */
#define W7500x_PERIPH_BASE       (0x40000000UL)  /*!< (Peripheral) Base Address */

#define W7500x_RAM_BASE          (0x20000000UL)
#define W7500x_APB1_BASE         (0x40000000UL)
#define W7500x_APB2_BASE         (0x41000000UL)
#define W7500x_AHB_BASE          (0x42000000UL)

#define W7500x_UART0_BASE        (W7500x_APB1_BASE + 0x0000C000UL)
#define W7500x_UART1_BASE        (W7500x_APB1_BASE + 0x0000D000UL)
#define W7500x_UART2_BASE        (W7500x_APB1_BASE + 0x00006000UL)

#define W7500x_CRG_BASE          (W7500x_APB2_BASE + 0x00001000UL)
#define W7500x_ADC_BASE          (W7500x_APB2_BASE + 0x00000000UL)

#define W7500x_INFO_BGT          (0x0003FDB8)
#define W7500x_INFO_OSC          (0x0003FDBC)

#define W7500x_TRIM_BGT          (0x41001210)
#define W7500x_TRIM_OSC          (0x41001004)

#define W7500x_DUALTIMER0_BASE   (W7500x_APB1_BASE + 0x00001000ul)
#define W7500x_DUALTIMER1_BASE   (W7500x_APB1_BASE + 0x00002000ul)

#define EXTI_Px_BASE            (W7500x_APB2_BASE + 0x00002200UL)

#define GPIOA_BASE              (W7500x_AHB_BASE + 0x00000000UL)    // W7500x_AHB_BASE : 0x42000000UL
#define GPIOB_BASE              (W7500x_AHB_BASE + 0x01000000UL)
#define GPIOC_BASE              (W7500x_AHB_BASE + 0x02000000UL)
#define GPIOD_BASE              (W7500x_AHB_BASE + 0x03000000UL)

#define P_AFSR_BASE             (W7500x_APB2_BASE + 0x00002000UL)

#define P_PCR_BASE              (W7500x_APB2_BASE + 0x00003000UL)

#define I2C0_BASE               (W7500x_APB1_BASE + 0x8000)
#define I2C1_BASE               (W7500x_APB1_BASE + 0x9000)

#define W7500x_PWM_BASE         (W7500x_APB1_BASE + 0x00005000UL)

#define W7500x_RNG_BASE         (W7500x_APB1_BASE + 0x00007000UL)

#define SSP0_BASE 	          (0x4000A000)
#define SSP1_BASE 	          (0x4000B000)

#define W7500x_WATCHDOG_BASE    (W7500x_APB1_BASE + 0x0000UL)

/**
  * @}
  */


/** @addtogroup Peripheral_declaration
  * @{
  */  
#define CRG               ((CRG_TypeDef *) W7500x_CRG_BASE)

#define UART0             ((UART_TypeDef  *)   W7500x_UART0_BASE)
#define UART1             ((UART_TypeDef  *)   W7500x_UART1_BASE)
#define UART2             ((S_UART_TypeDef *)  W7500x_UART2_BASE)

#define ADC               ((ADC_TypeDef *) W7500x_ADC_BASE)

#define DUALTIMER0_0      ((DUALTIMER_TypeDef  *) (W7500x_DUALTIMER0_BASE) )
#define DUALTIMER0_1      ((DUALTIMER_TypeDef  *) (W7500x_DUALTIMER0_BASE + 0x20ul))
#define DUALTIMER1_0      ((DUALTIMER_TypeDef  *) (W7500x_DUALTIMER1_BASE) )
#define DUALTIMER1_1      ((DUALTIMER_TypeDef  *) (W7500x_DUALTIMER1_BASE + 0x20ul))

#define EXTI_PA         ((P_Port_Def *)   (EXTI_Px_BASE + 0x00000000UL))  /* PA_XX External interrupt Enable Register */
#define EXTI_PB         ((P_Port_Def *)   (EXTI_Px_BASE + 0x00000040UL))  /* PB_XX External interrupt Enable Register */
#define EXTI_PC         ((P_Port_Def *)   (EXTI_Px_BASE + 0x00000080UL))  /* PC_XX External interrupt Enable Register */
#define EXTI_PD         ((P_Port_D_Def *) (EXTI_Px_BASE + 0x000000C0UL))  /* PD_XX External interrupt Enable Register */

#define GPIOA   ((GPIO_TypeDef *) (GPIOA_BASE) )
#define GPIOB   ((GPIO_TypeDef *) (GPIOB_BASE) )
#define GPIOC   ((GPIO_TypeDef *) (GPIOC_BASE) )
#define GPIOD   ((GPIO_TypeDef *) (GPIOD_BASE) )

#define PA_AFSR ((P_Port_Def *)   (P_AFSR_BASE + 0x00000000UL))  /* PA_XX Pad Alternate Function Select Register */
#define PB_AFSR ((P_Port_Def *)   (P_AFSR_BASE + 0x00000040UL))  /* PB_XX Pad Alternate Function Select Register */
#define PC_AFSR ((P_Port_Def *)   (P_AFSR_BASE + 0x00000080UL))  /* PC_XX Pad Alternate Function Select Register */
#define PD_AFSR ((P_Port_D_Def *) (P_AFSR_BASE + 0x000000C0UL))  /* PD_XX Pad Alternate Function Select Register */

#define PA_PCR  ((P_Port_Def *)   (P_PCR_BASE + 0x00000000UL))   /* PA_XX Pad Control Register */
#define PB_PCR  ((P_Port_Def *)   (P_PCR_BASE + 0x00000040UL))   /* PB_XX Pad Control Register */
#define PC_PCR  ((P_Port_Def *)   (P_PCR_BASE + 0x00000080UL))   /* PC_XX Pad Control Register */
#define PD_PCR  ((P_Port_D_Def *) (P_PCR_BASE + 0x000000C0UL))   /* PD_XX Pad Control Register */

#define I2C0    ((I2C_TypeDef      *)  I2C0_BASE)
#define I2C1    ((I2C_TypeDef      *)  I2C1_BASE)


#define TIMCLKEN0_0                         *(uint32_t *)(W7500x_DUALTIMER0_BASE + 0x80ul)
#define TIMCLKEN0_1                         *(uint32_t *)(W7500x_DUALTIMER0_BASE + 0xA0ul)
#define TIMCLKEN1_0                         *(uint32_t *)(W7500x_DUALTIMER1_BASE + 0x80ul)
#define TIMCLKEN1_1                         *(uint32_t *)(W7500x_DUALTIMER1_BASE + 0xA0ul)

#define PWM                             ((PWM_TypeDef *)         (W7500x_PWM_BASE + 0x800UL ))
#define PWM_CH0                         ((PWM_CHn_TypeDef *)     (W7500x_PWM_BASE))
#define PWM_CH1                         ((PWM_CHn_TypeDef *)     (W7500x_PWM_BASE + 0x100UL))
#define PWM_CH2                         ((PWM_CHn_TypeDef *)     (W7500x_PWM_BASE + 0x200UL))
#define PWM_CH3                         ((PWM_CHn_TypeDef *)     (W7500x_PWM_BASE + 0x300UL))
#define PWM_CH4                         ((PWM_CHn_TypeDef *)     (W7500x_PWM_BASE + 0x400UL))
#define PWM_CH5                         ((PWM_CHn_TypeDef *)     (W7500x_PWM_BASE + 0x500UL))
#define PWM_CH6                         ((PWM_CHn_TypeDef *)     (W7500x_PWM_BASE + 0x600UL))
#define PWM_CH7                         ((PWM_CHn_TypeDef *)     (W7500x_PWM_BASE + 0x700UL))

#define PWM_CH0_BASE                    (W7500x_PWM_BASE)
#define PWM_CH1_BASE                    (W7500x_PWM_BASE + 0x100UL)
#define PWM_CH2_BASE                    (W7500x_PWM_BASE + 0x200UL)
#define PWM_CH3_BASE                    (W7500x_PWM_BASE + 0x300UL)
#define PWM_CH4_BASE                    (W7500x_PWM_BASE + 0x400UL)
#define PWM_CH5_BASE                    (W7500x_PWM_BASE + 0x500UL)
#define PWM_CH6_BASE                    (W7500x_PWM_BASE + 0x600UL)
#define PWM_CH7_BASE                    (W7500x_PWM_BASE + 0x700UL)

#define RNG                               ((RNG_TypeDef *) W7500x_RNG_BASE)

#define SSP0    ((SSP_TypeDef*)   (SSP0_BASE))
#define SSP1    ((SSP_TypeDef*)   (SSP1_BASE))

#define WATCHDOG                ((WATCHDOG_TypeDef  *) W7500x_WATCHDOG_BASE)

/**
  * @}
  */



/******************************************************************************/
/*                                                                            */
/*                  Clock Reset Generator                                     */
/*                                                                            */
/******************************************************************************/
/****************   Bit definition for CRG_OSC_PDR   **************************/
#define CRG_OSC_PDR_NRMLOP      (0x0ul)             // Normal Operation
#define CRG_OSC_PDR_PD          (0x1ul)             // Power Down
/****************   Bit definition for CRG_PLL_PDR   **************************/
#define CRG_PLL_PDR_PD          (0x0ul)             // Power Down
#define CRG_PLL_PDR_NRMLOP      (0x1ul)             // Normal Operation
/****************   Bit definition for CRG_PLL_FCR   **************************/
//ToDo
/****************   Bit definition for CRG_PLL_OER   **************************/
#define CRG_PLL_OER_DIS         (0x0ul)             // Clock out is disable
#define CRG_PLL_OER_EN          (0x1ul)             // Clock out is enable
/****************   Bit definition for CRG_PLL_BPR   **************************/
#define CRG_PLL_BPR_DIS         (0x0ul)             // Bypass disable. Normal operation
#define CRG_PLL_BPR_EN          (0x1ul)             // Bypass enable. Clock will be set to external clock
/****************   Bit definition for CRG_PLL_IFSR  **************************/
#define CRG_PLL_IFSR_RCLK       (0x0ul)             // Internal 8MHz RC oscillator clock(RCLK)
#define CRG_PLL_IFSR_OCLK       (0x1ul)             // External oscillator clock (OCLK, 8MHz ~ 24MHz)
/****************   Bit definition for CRG_FCLK_SSR  **************************/
#define CRG_FCLK_SSR_MCLK       (0x01ul)            // 00,01 Output clock of PLL(MCLK)
#define CRG_FCLK_SSR_RCLK       (0x02ul)            // Internal 8MHz RC oscillator clock(RCLK)
#define CRG_FCLK_SSR_OCLK       (0x03ul)            // External oscillator clock(OCLK, 8MHz ~ 24MHz)
/****************   Bit definition for CRG_FCLK_PVSR   **************************/
#define CRG_FCLK_PVSR_DIV1      (0x00ul)            // 1/1 (bypass)
#define CRG_FCLK_PVSR_DIV2      (0x01ul)            // 1/2
#define CRG_FCLK_PVSR_DIV4      (0x02ul)            // 1/4
#define CRG_FCLK_PVSR_DIV8      (0x03ul)            // 1/8
/****************   Bit definition for CRG_SSPCLK_SSR   **************************/
#define CRG_SSPCLK_SSR_DIS      (0x00ul)            // Disable clock
#define CRG_SSPCLK_SSR_MCLK     (0x01ul)            // PLL output clock(MCLK)
#define CRG_SSPCLK_SSR_RCLK     (0x02ul)            // Internal 8MHz RC oscillator clock(RCLK)
#define CRG_SSPCLK_SSR_OCLK     (0x03ul)            // External oscillator clock(OCLK, 8MHz ~ 24MHz)
/****************   Bit definition for CRG_SSPCLK_PVSR   **************************/
#define CRG_SSPCLK_PVSR_DIV1    (0x00ul)            // 1/1 (bypass)
#define CRG_SSPCLK_PVSR_DIV2    (0x01ul)            // 1/2
#define CRG_SSPCLK_PVSR_DIV4    (0x02ul)            // 1/4
#define CRG_SSPCLK_PVSR_DIV8    (0x03ul)            // 1/8
/****************   Bit definition for CRG_ADCCLK_SSR   **************************/
#define CRG_ADCCLK_SSR_DIS      (0x00ul)            // Disable clock
#define CRG_ADCCLK_SSR_MCLK     (0x01ul)            // PLL output clock(MCLK)
#define CRG_ADCCLK_SSR_RCLK     (0x02ul)            // Internal 8MHz RC oscillator clock(RCLK)
#define CRG_ADCCLK_SSR_OCLK     (0x03ul)            // External oscillator clock(OCLK, 8MHz ~ 24MHz)
/****************   Bit definition for CRG_ADCCLK_PVSR   **************************/
#define CRG_ADCCLK_PVSR_DIV1    (0x00ul)            // 1/1 (bypass)
#define CRG_ADCCLK_PVSR_DIV2    (0x01ul)            // 1/2
#define CRG_ADCCLK_PVSR_DIV4    (0x02ul)            // 1/4
#define CRG_ADCCLK_PVSR_DIV8    (0x03ul)            // 1/8
/****************   Bit definition for CRG_TIMER0/1CLK_SSR   **************************/
#define CRG_TIMERCLK_SSR_DIS      (0x00ul)            // Disable clock
#define CRG_TIMERCLK_SSR_MCLK     (0x01ul)            // PLL output clock(MCLK)
#define CRG_TIMERCLK_SSR_RCLK     (0x02ul)            // Internal 8MHz RC oscillator clock(RCLK)
#define CRG_TIMERCLK_SSR_OCLK     (0x03ul)            // External oscillator clock(OCLK, 8MHz ~ 24MHz)
/****************   Bit definition for CRG_TIMER0/1CLK_PVSR   **************************/
#define CRG_TIMERCLK_PVSR_DIV1    (0x00ul)           // 1/1 (bypass)
#define CRG_TIMERCLK_PVSR_DIV2    (0x01ul)           // 1/2
#define CRG_TIMERCLK_PVSR_DIV4    (0x02ul)           // 1/4
#define CRG_TIMERCLK_PVSR_DIV8    (0x03ul)           // 1/8
#define CRG_TIMERCLK_PVSR_DIV16   (0x04ul)           // 1/16
#define CRG_TIMERCLK_PVSR_DIV32   (0x05ul)           // 1/32
#define CRG_TIMERCLK_PVSR_DIV64   (0x06ul)           // 1/64
#define CRG_TIMERCLK_PVSR_DIV128  (0x07ul)           // 1/128
/****************   Bit definition for CRG_PWMnCLK_SSR   **************************/
#define CRG_PWMCLK_SSR_DIS      (0x00ul)            // Disable clock
#define CRG_PWMCLK_SSR_MCLK     (0x01ul)            // PLL output clock(MCLK)
#define CRG_PWMCLK_SSR_RCLK     (0x02ul)            // Internal 8MHz RC oscillator clock(RCLK)
#define CRG_PWMCLK_SSR_OCLK     (0x03ul)            // External oscillator clock(OCLK, 8MHz ~ 24MHz)
/****************   Bit definition for CRG_PWMnCLK_PVSR   **************************/
#define CRG_PWMCLK_PVSR_DIV1    (0x00ul)           // 1/1 (bypass)
#define CRG_PWMCLK_PVSR_DIV2    (0x01ul)           // 1/2
#define CRG_PWMCLK_PVSR_DIV4    (0x02ul)           // 1/4
#define CRG_PWMCLK_PVSR_DIV8    (0x03ul)           // 1/8
#define CRG_PWMCLK_PVSR_DIV16   (0x04ul)           // 1/16
#define CRG_PWMCLK_PVSR_DIV32   (0x05ul)           // 1/32
#define CRG_PWMCLK_PVSR_DIV64   (0x06ul)           // 1/64
#define CRG_PWMCLK_PVSR_DIV128  (0x07ul)           // 1/128
/****************   Bit definition for CRG_RTC_HS_SSR   **************************/
#define CRG_RTC_HS_SSR_DIS      (0x00ul)            // Disable clock
#define CRG_RTC_HS_SSR_MCLK     (0x01ul)            // PLL output clock(MCLK)
#define CRG_RTC_HS_SSR_RCLK     (0x02ul)            // Internal 8MHz RC oscillator clock(RCLK)
#define CRG_RTC_HS_SSR_OCLK     (0x03ul)            // External oscillator clock(OCLK, 8MHz ~ 24MHz)
/****************   Bit definition for CRG_RTC_HS_PVSR   **************************/
#define CRG_RTC_HS_PVSR_DIV1    (0x00ul)           // 1/1 (bypass)
#define CRG_RTC_HS_PVSR_DIV2    (0x01ul)           // 1/2
#define CRG_RTC_HS_PVSR_DIV4    (0x02ul)           // 1/4
#define CRG_RTC_HS_PVSR_DIV8    (0x03ul)           // 1/8
#define CRG_RTC_HS_PVSR_DIV16   (0x04ul)           // 1/16
#define CRG_RTC_HS_PVSR_DIV32   (0x05ul)           // 1/32
#define CRG_RTC_HS_PVSR_DIV64   (0x06ul)           // 1/64
#define CRG_RTC_HS_PVSR_DIV128  (0x07ul)           // 1/128
/****************   Bit definition for CRG_RTC_SSR   **************************/
#define CRG_RTC_SSR_HS          (0x00ul)            // RTCCLK HS(High Speed clock) 
#define CRG_RTC_SSR_LW          (0x01ul)            // 32K_OSC_CLK(Low Speed external oscillator clock) 
/****************   Bit definition for CRG_WDOGCLK_HS_SSR   **************************/
#define CRG_WDOGCLK_HS_SSR_DIS      (0x00ul)        // Disable clock
#define CRG_WDOGCLK_HS_SSR_MCLK     (0x01ul)        // PLL output clock(MCLK)
#define CRG_WDOGCLK_HS_SSR_RCLK     (0x02ul)        // Internal 8MHz RC oscillator clock(RCLK)
#define CRG_WDOGCLK_HS_SSR_OCLK     (0x03ul)        // External oscillator clock(OCLK, 8MHz ~ 24MHz)
/****************   Bit definition for CRG_WDOGCLK_HS_PVSR   **************************/
#define CRG_WDOGCLK_HS_PVSR_DIV1    (0x00ul)       // 1/1 (bypass)
#define CRG_WDOGCLK_HS_PVSR_DIV2    (0x01ul)       // 1/2
#define CRG_WDOGCLK_HS_PVSR_DIV4    (0x02ul)       // 1/4
#define CRG_WDOGCLK_HS_PVSR_DIV8    (0x03ul)       // 1/8
#define CRG_WDOGCLK_HS_PVSR_DIV16   (0x04ul)       // 1/16
#define CRG_WDOGCLK_HS_PVSR_DIV32   (0x05ul)       // 1/32
#define CRG_WDOGCLK_HS_PVSR_DIV64   (0x06ul)       // 1/64
#define CRG_WDOGCLK_HS_PVSR_DIV128  (0x07ul)       // 1/128
/****************   Bit definition for CRG_WDOGCLK_SSR   **************************/
#define CRG_WDOGCLK_SSR_HS          (0x00ul)        // RTCCLK HS(High Speed clock) 
#define CRG_WDOGCLK_SSR_LW          (0x01ul)        // 32K_OSC_CLK(Low Speed external oscillator clock) 
/****************   Bit definition for CRG_UARTCLK_SSR   **************************/
#define CRG_UARTCLK_SSR_DIS      (0x00ul)           // Disable clock
#define CRG_UARTCLK_SSR_MCLK     (0x01ul)           // PLL output clock(MCLK)
#define CRG_UARTCLK_SSR_RCLK     (0x02ul)           // Internal 8MHz RC oscillator clock(RCLK)
#define CRG_UARTCLK_SSR_OCLK     (0x03ul)           // External oscillator clock(OCLK, 8MHz ~ 24MHz)
/****************   Bit definition for CRG_UARTCLK_PVSR   **************************/
#define CRG_UARTCLK_PVSR_DIV1    (0x00ul)           // 1/1 (bypass)
#define CRG_UARTCLK_PVSR_DIV2    (0x01ul)           // 1/2
#define CRG_UARTCLK_PVSR_DIV4    (0x02ul)           // 1/4
#define CRG_UARTCLK_PVSR_DIV8    (0x03ul)           // 1/8
/****************   Bit definition for CRG_MIICLK_ECR   **************************/
#define CRG_MIICLK_ECR_EN_RXCLK  (0x01ul << 0)      // Enable MII_RCK and MII_RCK_N
#define CRG_MIICLK_ECR_EN_TXCLK  (0x01ul << 1)      // Enable MII_TCK and MII_TCK_N
/****************   Bit definition for CRG_MONCLK_SSR   **************************/
#define CRG_MONCLK_SSR_MCLK      (0x00ul)        // PLL output clock (MCLK)
#define CRG_MONCLK_SSR_FCLK      (0x01ul)        // FCLK
#define CRG_MONCLK_SSR_RCLK      (0x02ul)        // Internal 8MHz RC oscillator clock(RCLK)
#define CRG_MONCLK_SSR_OCLK      (0x03ul)        // External oscillator clock(OCLK, 8MHz ~ 24MHz)
#define CRG_MONCLK_SSR_ADCCLK    (0x04ul)        // ADCCLK
#define CRG_MONCLK_SSR_SSPCLK    (0x05ul)        // SSPCLK
#define CRG_MONCLK_SSR_TIMCLK0   (0x06ul)        // TIMCLK0
#define CRG_MONCLK_SSR_TIMCLK1   (0x07ul)        // TIMCLK1
#define CRG_MONCLK_SSR_PWMCLK0   (0x08ul)        // PWMCLK0
#define CRG_MONCLK_SSR_PWMCLK1   (0x09ul)        // PWMCLK1
#define CRG_MONCLK_SSR_PWMCLK2   (0x0Aul)        // PWMCLK2
#define CRG_MONCLK_SSR_PWMCLK3   (0x0Bul)        // PWMCLK3
#define CRG_MONCLK_SSR_PWMCLK4   (0x0Cul)        // PWMCLK4
#define CRG_MONCLK_SSR_PWMCLK5   (0x0Dul)        // PWMCLK5
#define CRG_MONCLK_SSR_PWMCLK6   (0x0Eul)        // PWMCLK6
#define CRG_MONCLK_SSR_PWMCLK7   (0x0Ful)        // PWMCLK7
#define CRG_MONCLK_SSR_UARTCLK   (0x10ul)        // UARTCLK
#define CRG_MONCLK_SSR_MII_RXCLK (0x11ul)        // MII_RXCLK 
#define CRG_MONCLK_SSR_MII_TXCLK (0x12ul)        // MII_TXCLK
#define CRG_MONCLK_SSR_RTCCLK    (0x13ul)        // RTCCLK

/******************************************************************************/
/*                                                                            */
/*                                  UART                                      */
/*                                                                            */
/******************************************************************************/
/****************** Bit definition for UART Data(UARTDR) register *************************/
#define UART_DR_OE           (0x01ul << 11)      // Overrun Error
#define UART_DR_BE           (0x01ul << 10)      // Break Error
#define UART_DR_PE           (0x01ul <<  9)      // Parity Error
#define UART_DR_FE           (0x01ul <<  8)      // Framing Error
//#define UART_DR_DR                               // ToDo
/***************** Bit definition for UART Receive Status(UARTRSR) register ***************/
#define UARTR_SR_OE           (0x01ul << 3)      // Overrun Error
#define UARTR_SR_BE           (0x01ul << 2)      // Break Error
#define UARTR_SR_PE           (0x01ul << 1)      // Parity Error
#define UARTR_SR_FE           (0x01ul << 0)      // Framing Error
/***************** Bit definition for UART Error Clear(UARTECR) register ******************/
#define UARTE_CR_OE           (0x01ul << 3)      // Overrun Error
#define UARTE_CR_BE           (0x01ul << 2)      // Break Error
#define UARTE_CR_PE           (0x01ul << 1)      // Parity Error
#define UARTE_CR_FE           (0x01ul << 0)      // Framing Error
/****************** Bit definition for UART Flags(UARTFR) register ************************/
#define UART_FR_RI            (0x01ul << 8)      // Ring indicator
#define UART_FR_TXFE          (0x01ul << 7)      // Transmit FIFO empty
#define UART_FR_RXFF          (0x01ul << 6)      // Receive FIFO full
#define UART_FR_TXFF          (0x01ul << 5)      // Transmit FIFO full
#define UART_FR_RXFE          (0x01ul << 4)      // Receive FIFO empty
#define UART_FR_BUSY          (0x01ul << 3)      // UART busy
#define UART_FR_DCD           (0x01ul << 2)      // Data carrier detect
#define UART_FR_DSR           (0x01ul << 1)      // Data set ready
#define UART_FR_CTS           (0x01ul << 0)      // Clear to send
/********** Bit definition for UART Low-power Counter(UARTILPR) register *******************/
#define UARTILPR_COUNTER     (0xFFul << 0)      // 8-bit low-power divisor value (0..255)
/********************* Bit definition for Line Control(UARTLCR_H) register *****************/
#define UART_LCR_H_SPS        (0x1ul << 7)       // Stick parity select
#define UART_LCR_H_WLEN(n)    ((n & 0x3ul) << 5) // Word length ( 0=5bits, 1=6bits, 2=7bits, 3=8bits )
#define UART_LCR_H_FEN        (0x1ul << 4)       // Enable FIFOs
#define UART_LCR_H_STP2       (0x1ul << 3)       // Two stop bits select 
#define UART_LCR_H_EPS        (0x1ul << 2)       // Even parity select
#define UART_LCR_H_PEN        (0x1ul << 1)       // Parity enable
#define UART_LCR_H_BRK        (0x1ul << 0)       // Send break
/********************* Bit definition for Contro(UARTCR) register *************************/
#define UART_CR_CTSEn        (0x1ul << 15)    // CTS hardware flow control enable
#define UART_CR_RTSEn        (0x1ul << 14)    // RTS hardware flow control enable
#define UART_CR_Out2         (0x1ul << 13)    // Complement of Out2 modem status output
#define UART_CR_Out1         (0x1ul << 12)    // Complement of Out1 modem status output
#define UART_CR_RTS          (0x1ul << 11)    // Request to send
#define UART_CR_DTR          (0x1ul << 10)    // Data transmit ready
#define UART_CR_RXE          (0x1ul <<  9)    // Receive enable
#define UART_CR_TXE          (0x1ul <<  8)    // Transmit enable
#define UART_CR_LBE          (0x1ul <<  7)    // Loop-back enable
#define UART_CR_SIRLP        (0x1ul <<  2)    // IrDA SIR low power mode
#define UART_CR_SIREN        (0x1ul <<  1)    // SIR enable
#define UART_CR_UARTEN       (0x1ul <<  0)    // UART enable
/******* Bit definition for Interrupt FIFO Level Select(UARTIFLS) register *****************/
#define UART_IFLS_RXIFLSEL(n)    ((n & 0x7ul) << 3) // Receive interrupt FIFO level select(0=1/8 full, 1=1/4 full, 2=1/2 full, 3=3/4 full, 4=7/8 full)
#define UART_IFLS_TXIFLSEL(n)    ((n & 0x7ul) << 0) // Transmit interrupt FIFO level select(0=1/8 full, 1=1/4 full, 2=1/2 full, 3=3/4 full, 4=7/8 full)
/******* Bit definition for Interrupt Mask Set/Clear(UARTIMSC) register ********************/
#define UART_IMSC_OEIM       (0x1ul << 10)    // Overrun error interrupt mask
#define UART_IMSC_BEIM       (0x1ul <<  9)    // Break error interrupt mask
#define UART_IMSC_PEIM       (0x1ul <<  8)    // Parity error interrupt mask
#define UART_IMSC_FEIM       (0x1ul <<  7)    // Framing error interrupt mask
#define UART_IMSC_RTIM       (0x1ul <<  6)    // Receive interrupt mask
#define UART_IMSC_TXIM       (0x1ul <<  5)    // Transmit interrupt mask
#define UART_IMSC_RXIM       (0x1ul <<  4)    // Receive interrupt mask
#define UART_IMSC_DSRMIM     (0x1ul <<  3)    // nUARTDSR modem interrupt mask
#define UART_IMSC_DCDMIM     (0x1ul <<  2)    // nUARTDCD modem interrupt mask
#define UART_IMSC_CTSMIM     (0x1ul <<  1)    // nUARTCTS modem interrupt mask
#define UART_IMSC_RIMIM      (0x1ul <<  0)    // nUARTRI modem interrupt mask
/*************** Bit definition for Raw Interrupt Status(UARTRIS) register *****************/
#define UART_RIS_OEIM       (0x1ul << 10)    // Overrun error interrupt status
#define UART_RIS_BEIM       (0x1ul <<  9)    // Break error interrupt status
#define UART_RIS_PEIM       (0x1ul <<  8)    // Parity error interrupt status 
#define UART_RIS_FEIM       (0x1ul <<  7)    // Framing error interrupt status
#define UART_RIS_RTIM       (0x1ul <<  6)    // Receive interrupt status
#define UART_RIS_TXIM       (0x1ul <<  5)    // Transmit interrupt status
#define UART_RIS_RXIM       (0x1ul <<  4)    // Receive interrupt status
#define UART_RIS_DSRMIM     (0x1ul <<  3)    // nUARTDSR modem interrupt status
#define UART_RIS_DCDMIM     (0x1ul <<  2)    // nUARTDCD modem interrupt status
#define UART_RIS_CTSMIM     (0x1ul <<  1)    // nUARTCTS modem interrupt status
#define UART_RIS_RIMIM      (0x1ul <<  0)    // nUARTRI modem interrupt status
/************** Bit definition for Masked Interrupt Status(UARTMIS) register ****************/
#define UART_MIS_OEIM       (0x1ul << 10)    // Overrun error masked interrupt status
#define UART_MIS_BEIM       (0x1ul <<  9)    // Break error masked interrupt status
#define UART_MIS_PEIM       (0x1ul <<  8)    // Parity error masked interrupt status 
#define UART_MIS_FEIM       (0x1ul <<  7)    // Framing error masked interrupt status
#define UART_MIS_RTIM       (0x1ul <<  6)    // Receive masked interrupt status
#define UART_MIS_TXIM       (0x1ul <<  5)    // Transmit masked interrupt status
#define UART_MIS_RXIM       (0x1ul <<  4)    // Receive masked interrupt status
#define UART_MIS_DSRMIM     (0x1ul <<  3)    // nUARTDSR modem masked interrupt status
#define UART_MIS_DCDMIM     (0x1ul <<  2)    // nUARTDCD modem masked interrupt status
#define UART_MIS_CTSMIM     (0x1ul <<  1)    // nUARTCTS modem masked interrupt status
#define UART_MIS_RIMIM      (0x1ul <<  0)    // nUARTRI modem masked interrupt status
/*************** Bit definition for Interrupt Clear(UARTICR) register ************************/
#define UART_ICR_OEIM       (0x1ul << 10)    // Overrun error interrupt clear 
#define UART_ICR_BEIM       (0x1ul <<  9)    // Break error interrupt clear
#define UART_ICR_PEIM       (0x1ul <<  8)    // Parity error interrupt clear
#define UART_ICR_FEIM       (0x1ul <<  7)    // Framing error interrupt clear
#define UART_ICR_RTIM       (0x1ul <<  6)    // Receive interrupt clear
#define UART_ICR_TXIM       (0x1ul <<  5)    // Transmit interrupt clear
#define UART_ICR_RXIM       (0x1ul <<  4)    // Receive interrupt clear
#define UART_ICR_DSRMIM     (0x1ul <<  3)    // nUARTDSR modem interrupt clear
#define UART_ICR_DCDMIM     (0x1ul <<  2)    // nUARTDCD modem interrupt clear
#define UART_ICR_CTSMIM     (0x1ul <<  1)    // nUARTCTS modem interrupt clear
#define UART_ICR_RIMIM      (0x1ul <<  0)    // nUARTRI modem interrupt clear
/***************** Bit definition for DMA Control(UARTDMACR) register ************************/
#define UART_DMACR_DMAONERR (0x1ul <<  2)    // DMA on error
#define UART_DMACR_TXDMAE   (0x1ul <<  1)    // Transmit DMA enable
#define UART_DMACR_RXDMAE   (0x1ul <<  0)    // Receive DMA enable

/******************************************************************************/
/*                                                                            */
/*                           Simple UART                                      */
/*                                                                            */
/******************************************************************************/
/***************** Bit definition for S_UART Data () register ************************/
#define S_UART_DATA                  (0xFFul << 0)    
/***************** Bit definition for S_UART State() register ************************/
#define S_UART_STATE_TX_BUF_OVERRUN  (0x01ul << 2)       // TX buffer overrun, wirte 1 to clear.
#define S_UART_STATE_RX_BUF_FULL     (0x01ul << 1)       // RX buffer full, read only.
#define S_UART_STATE_TX_BUF_FULL     (0x01ul << 0)       // TX buffer full, read only.
/***************** Bit definition for S_UART Control() register ************************/
#define S_UART_CTRL_HIGH_SPEED_TEST  (0x01ul << 6)       // High-speed test mode for TX only.
#define S_UART_CTRL_RX_OVERRUN_EN    (0x01ul << 5)       // RX overrun interrupt enable.
#define S_UART_CTRL_TX_OVERRUN_EN    (0x01ul << 4)       // TX overrun interrupt enable.
#define S_UART_CTRL_RX_INT_EN        (0x01ul << 3)       // RX interrupt enable.
#define S_UART_CTRL_TX_INT_EN        (0x01ul << 2)       // TX interrupt enable.
#define S_UART_CTRL_RX_EN            (0x01ul << 1)       // RX enable.
#define S_UART_CTRL_TX_EN            (0x01ul << 0)       // TX enable.
/***************** Bit definition for S_UART Interrupt() register ************************/
#define S_UART_INT_RX_OVERRUN        (0x01ul << 3)       // RX overrun interrupt. Wirte 1 to clear
#define S_UART_INT_TX_OVERRUN        (0x01ul << 2)       // TX overrun interrupt. Write 1 to clear
#define S_UART_INT_RX                (0x01ul << 1)       // RX interrupt. Write 1 to clear
#define S_UART_INT_TX                (0x01ul << 0)       // TX interrupt. Write 1 to clear

/******************************************************************************/
/*                                                                            */
/*                          Analog Digital Register                           */
/*                                                                            */
/******************************************************************************/

/*********************** Bit definition for ADC_CTR     ***********************/
//#define ADC_CTR_SAMSEL_ABNORMAL           (0x0ul)	  // Abnormal Operation
//#define ADC_CTR_SAMSEL_NORMAL             (0x1ul)       // Normal Operation
#define ADC_CTR_PWD_NRMOP                 (0x1ul)  // Active Operation
#define ADC_CTR_PWD_PD                    (0x3ul)  // Power down
/*********************** Bit definition for ADC_CHSEL   ***********************/
#define ADC_CHSEL_CH0                     (0x0ul)       // Channel 0
#define ADC_CHSEL_CH1                     (0x1ul)       // Channel 1
#define ADC_CHSEL_CH2                     (0x2ul)       // Channel 2
#define ADC_CHSEL_CH3                     (0x3ul)       // Channel 3
#define ADC_CHSEL_CH4                     (0x4ul)       // Channel 4
#define ADC_CHSEL_CH5                     (0x5ul)       // Channel 5
#define ADC_CHSEL_CH6                     (0x6ul)       // Channel 6
#define ADC_CHSEL_CH7                     (0x7ul)       // Channel 7
#define ADC_CHSEL_CH15                   (0xful)        // LDO output(1.5V)
/*********************** Bit definition for ADC_START   ***********************/
#define ADC_START_START                   (0x1ul)       // ADC conversion start
/*********************** Bit definition for ADC_DATA    ***********************/
//ToDo (Readonly)

/*********************** Bit definition for ADC_INT     ***********************/
#define ADC_INT_MASK_DIS                  (0x0ul << 1)  // Interrupt disable
#define ADC_INT_MASK_ENA                  (0x1ul << 1)  // Interrupt enable
//ToDo (Readonly)

/*********************** Bit definition for ADC_INTCLR  ***********************/
#define ADC_INTCLEAR                      (0x1ul)       // ADC Interrupt clear

#define W7500x_ADC_BASE                   (W7500x_APB2_BASE + 0x00000000UL)
#define ADC                               ((ADC_TypeDef *) W7500x_ADC_BASE)

/******************************************************************************/
/*                                                                            */
/*                                  Dual Timer                                */
/*                                                                            */
/******************************************************************************/

/*********************** Bit definition for dualtimer   ***********************/
#define DUALTIMER_TimerControl_TimerDIsable     0x0ul
#define DUALTIMER_TimerControl_TimerEnable      0x1ul
#define DUALTIMER_TimerControl_TimerEnable_Pos  7

#define DUALTIMER_TimerControl_FreeRunning      0x0ul
#define DUALTIMER_TimerControl_Periodic         0x1ul
#define DUALTIMER_TimerControl_TimerMode_Pos    6

#define DUALTIMER_TimerControl_IntDisable       0x0ul
#define DUALTIMER_TimerControl_IntEnable        0x1ul
#define DUALTIMER_TimerControl_IntEnable_Pos    5

#define DUALTIMER_TimerControl_Pre_1            0x0ul
#define DUALTIMER_TimerControl_Pre_16           0x1ul
#define DUALTIMER_TimerControl_Pre_256          0x2ul
#define DUALTIMER_TimerControl_Pre_Pos          2

#define DUALTIMER_TimerControl_Size_16          0x0ul
#define DUALTIMER_TimerControl_Size_32          0x1ul
#define DUALTIMER_TimerControl_Size_Pos         1

#define DUALTIMER_TimerControl_Wrapping         0x0ul
#define DUALTIMER_TimerControl_OneShot          0x1ul
#define DUALTIMER_TimerControl_OneShot_Pos      0

/******************************************************************************/
/*                                                                            */
/*                              External Interrupt                            */
/*                                                                            */
/******************************************************************************/

/****************   Bit definition for Px_IER   **************************/
#define EXTI_Px_INTPOR_RISING_EDGE   (0x00ul << 0)
#define EXTI_Px_INTPOR_FALLING_EDGE  (0x01ul << 0)
#define EXTI_Px_INTEN_DISABLE        (0x00ul << 1)
#define EXTI_Px_INTEN_ENABLE         (0x01ul << 1)

/******************************************************************************/
/*                                                                            */
/*                             GPIO                                           */
/*                                                                            */
/******************************************************************************/

/****************   Bit definition for Px_AFSR   **************************/
#define Px_AFSR_AF0     (0x00ul)
#define Px_AFSR_AF1     (0x01ul)
#define Px_AFSR_AF2     (0x02ul)
#define Px_AFSR_AF3     (0x03ul)
/****************   Bit definition for Px_PCR   **************************/
#define Px_PCR_PUPD_DOWN    (0x01ul << 0)       // Pull Down
#define Px_PCR_PUPD_UP      (0x01ul << 1)       // Pull Up
#define Px_PCR_DS_HIGH      (0x01ul << 2)       // High Driving
#define Px_PCR_OD           (0x01ul << 3)       // Open Drain
#define Px_PCR_IE           (0x01ul << 5)       // Input Buffer Enable
#define Px_PCR_CS_SUMMIT    (0x01ul << 6)       // Use Summit Trigger Input Buffer

/******************************************************************************/
/*                                                                            */
/*                                   I2C                                      */
/*                                                                            */
/******************************************************************************/

/****************   Bit definition for I2C_CTR    **************************/
#define I2C_CTR_COREEN        (0x01ul  << 7 )   //  0x80
#define I2C_CTR_INTEREN       (0x01ul  << 6 )   //  0x40
#define I2C_CTR_MODE          (0x01ul  << 5 )   //  0x20
#define I2C_CTR_ADDR10        (0x01ul  << 4 )   //  0x10
#define I2C_CTR_CTRRWN        (0x01ul  << 3 )   //  0x08
#define I2C_CTR_CTEN          (0x01ul  << 2 )   //  0x04

/****************   Bit definition for I2C_CMDR   **************************/
#define I2C_CMDR_STA           (0x01ul  << 7 )    //    0x80
#define I2C_CMDR_STO           (0x01ul  << 6 )    //    0x40
#define I2C_CMDR_ACK           (0x01ul  << 5 )    //    0x20
#define I2C_CMDR_RESTA         (0x01ul  << 4 )    //    0x10

/****************   Bit definition for I2C_ISCR   **************************/
#define I2C_ISCR_RST          (0x01ul  << 1)    //     0x01

/****************   Bit definition for I2C_SR     **************************/
#define I2C_SR_TX             (0x01ul  << 9 )   //  0x200
#define I2C_SR_RX             (0x01ul  << 8 )   //  0x100
#define I2C_SR_ACKT           (0x01ul  << 7 )   //  0x080
#define I2C_SR_BT             (0x01ul  << 6 )   //  0x040
#define I2C_SR_SA             (0x01ul  << 5 )   //  0x020
#define I2C_SR_SB             (0x01ul  << 4 )   //  0x010
#define I2C_SR_AL             (0x01ul  << 3 )   //  0x008
#define I2C_SR_TO             (0x01ul  << 2 )   //  0x004
#define I2C_SR_SRW            (0x01ul  << 1 )   //  0x002
#define I2C_SR_ACKR           (0x01ul  << 0 )   //  0x001

/****************   Bit definition for I2C_ISR    **************************/
#define I2C_ISR_STAE            (0x01ul  << 4 )   //  0x010
#define I2C_ISR_STOE            (0x01ul  << 3 )   //  0x008
#define I2C_ISR_TOE             (0x01ul  << 2 )   //  0x004
#define I2C_ISR_ACK_RXE         (0x01ul  << 1 )   //  0x002
#define I2C_ISR_ACK_TXE         (0x01ul  << 0 )   //  0x001

/****************   Bit definition for I2C_ISMR   **************************/
#define I2C_ISR_STAEM            (0x01ul  << 4 )   //  0x010
#define I2C_ISR_STOEM            (0x01ul  << 3 )   //  0x008
#define I2C_ISR_TOEM             (0x01ul  << 2 )   //  0x004
#define I2C_ISR_ACK_RXEM         (0x01ul  << 1 )   //  0x002
#define I2C_ISR_ACK_TXEM         (0x01ul  << 0 )   //  0x001

/******************************************************************************/
/*                                                                            */
/*                                   PWM                                      */
/*                                                                            */
/******************************************************************************/

/******************************************************************************/
/*                                                                            */
/*                      Random number generator Register                      */
/*                                                                            */
/******************************************************************************/

/*********************** Bit definition for RNG_RUN     ***********************/
#define RNG_RUN_STOP                      (0x0ul)       // STOP RNG shift register
#define RNG_RUN_RUN                       (0x1ul)       // RUN RNG shift register
/*********************** Bit definition for RNG_SEED    ***********************/
//ToDo

/*********************** Bit definition for RNG_CLKSEL  ***********************/
#define RNG_CLKSEL_RNGCLK                 (0x0ul)       // RNGCLK is source clock for rng shift register
#define RNG_CLKSEL_APBCLK                 (0x1ul)       // APBCLK is source clock for rng shift register
/*********************** Bit definition for RNG_ENABLE  ***********************/
#define RNG_MANUAL_DISABLE                  (0x0ul)       // RNG disble
#define RNG_MANUAL_ENABLE                   (0x1ul)       // RNG enable
/*********************** Bit definition for RNG_RN      ***********************/
//ToDo

/*********************** Bit definition for RNG_POLY    ***********************/
//ToDo



typedef enum
{
    PAD_PA = 0,
    PAD_PB,
    PAD_PC,
    PAD_PD
}PAD_Type;

typedef enum
{
    PAD_AF0    = Px_AFSR_AF0,
    PAD_AF1    = Px_AFSR_AF1,
    PAD_AF2    = Px_AFSR_AF2,
    PAD_AF3    = Px_AFSR_AF3
}PAD_AF_TypeDef;


#if !defined  (USE_HAL_DRIVER)
#define USE_HAL_DRIVER
#endif /* USE_HAL_DRIVER */



#if defined (USE_HAL_DRIVER)
//    #include "system_W7500x.h"
//    #include "W7500x_conf.h"
#endif

#ifdef USE_FULL_ASSERT
    #define assert_param(expr)  ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__,__LINE__))
#else
    #define assert_param(expr)   ((void)0)
#endif /* USE_FULL_ASSERT */

#ifdef __cplusplus
}
#endif

#endif  /* W7500x_H */



/************************ (C) COPYRIGHT Wiznet *****END OF FILE****/
