From beaf559be98227d97ad382e097f410846ed1e2f7 Mon Sep 17 00:00:00 2001 From: GitWellBack <48095880+GitWellBack@users.noreply.github.com> Date: Thu, 2 May 2019 06:14:27 +1000 Subject: [PATCH 1/3] Nuvoton NUC123SD4AN0 MCU port, ready for Ducky One 2 Mini keyboard integration --- os/common/ext/CMSIS/Nuvoton/NUMICRO/NUC123.h | 8762 +++++++++++++++++ os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/adc.h | 342 + os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/clk.h | 409 + os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/crc.h | 165 + os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/fmc.h | 480 + .../ext/CMSIS/Nuvoton/NUMICRO/inc/gpio.h | 457 + os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/i2c.h | 211 + os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/i2s.h | 319 + .../ext/CMSIS/Nuvoton/NUMICRO/inc/pdma.h | 198 + os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/ps2.h | 254 + os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/pwm.h | 230 + os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/spi.h | 381 + os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/sys.h | 1368 +++ .../ext/CMSIS/Nuvoton/NUMICRO/inc/timer.h | 393 + .../ext/CMSIS/Nuvoton/NUMICRO/inc/uart.h | 427 + .../ext/CMSIS/Nuvoton/NUMICRO/inc/usbd.h | 663 ++ os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/wdt.h | 200 + .../ext/CMSIS/Nuvoton/NUMICRO/inc/wwdt.h | 144 + .../ext/CMSIS/Nuvoton/NUMICRO/system_NUC123.h | 65 + .../ARMCMx/compilers/GCC/ld/NUC123SD4AN0.ld | 85 + .../compilers/GCC/mk/startup_nuc123sd4an0.mk | 12 + .../ARMCMx/devices/NUC123SD4AN0/cmparams.h | 84 + os/hal/ports/NUMICRO/LLD/CLKv1/clk.c | 678 ++ os/hal/ports/NUMICRO/LLD/CLKv1/clk.h | 409 + os/hal/ports/NUMICRO/LLD/CLKv1/driver.mk | 2 + os/hal/ports/NUMICRO/LLD/GPIOv1/driver.mk | 10 + os/hal/ports/NUMICRO/LLD/GPIOv1/gpio.c | 115 + os/hal/ports/NUMICRO/LLD/GPIOv1/hal_pal_lld.c | 191 + os/hal/ports/NUMICRO/LLD/GPIOv1/hal_pal_lld.h | 466 + os/hal/ports/NUMICRO/LLD/PWMv1/driver.mk | 2 + os/hal/ports/NUMICRO/LLD/PWMv1/pwm.c | 677 ++ os/hal/ports/NUMICRO/LLD/TIMv1/driver.mk | 3 + os/hal/ports/NUMICRO/LLD/TIMv1/hal_st_lld.c | 351 + os/hal/ports/NUMICRO/LLD/TIMv1/hal_st_lld.h | 200 + os/hal/ports/NUMICRO/LLD/USBv1/driver.mk | 9 + os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c | 570 ++ os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.h | 425 + os/hal/ports/NUMICRO/NUC123SD4AN0/hal_lld.c | 257 + os/hal/ports/NUMICRO/NUC123SD4AN0/hal_lld.h | 815 ++ .../ports/NUMICRO/NUC123SD4AN0/nuc123_isr.h | 152 + .../NUMICRO/NUC123SD4AN0/nuc123_registry.h | 263 + os/hal/ports/NUMICRO/NUC123SD4AN0/platform.mk | 22 + .../NUMICRO/NUC123SD4AN0/system_NUC123.c | 79 + 43 files changed, 21345 insertions(+) create mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/NUC123.h create mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/adc.h create mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/clk.h create mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/crc.h create mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/fmc.h create mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/gpio.h create mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/i2c.h create mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/i2s.h create mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/pdma.h create mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/ps2.h create mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/pwm.h create mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/spi.h create mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/sys.h create mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/timer.h create mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/uart.h create mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/usbd.h create mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/wdt.h create mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/wwdt.h create mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/system_NUC123.h create mode 100644 os/common/startup/ARMCMx/compilers/GCC/ld/NUC123SD4AN0.ld create mode 100644 os/common/startup/ARMCMx/compilers/GCC/mk/startup_nuc123sd4an0.mk create mode 100644 os/common/startup/ARMCMx/devices/NUC123SD4AN0/cmparams.h create mode 100644 os/hal/ports/NUMICRO/LLD/CLKv1/clk.c create mode 100644 os/hal/ports/NUMICRO/LLD/CLKv1/clk.h create mode 100644 os/hal/ports/NUMICRO/LLD/CLKv1/driver.mk create mode 100644 os/hal/ports/NUMICRO/LLD/GPIOv1/driver.mk create mode 100644 os/hal/ports/NUMICRO/LLD/GPIOv1/gpio.c create mode 100644 os/hal/ports/NUMICRO/LLD/GPIOv1/hal_pal_lld.c create mode 100644 os/hal/ports/NUMICRO/LLD/GPIOv1/hal_pal_lld.h create mode 100644 os/hal/ports/NUMICRO/LLD/PWMv1/driver.mk create mode 100644 os/hal/ports/NUMICRO/LLD/PWMv1/pwm.c create mode 100644 os/hal/ports/NUMICRO/LLD/TIMv1/driver.mk create mode 100644 os/hal/ports/NUMICRO/LLD/TIMv1/hal_st_lld.c create mode 100644 os/hal/ports/NUMICRO/LLD/TIMv1/hal_st_lld.h create mode 100644 os/hal/ports/NUMICRO/LLD/USBv1/driver.mk create mode 100644 os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c create mode 100644 os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.h create mode 100644 os/hal/ports/NUMICRO/NUC123SD4AN0/hal_lld.c create mode 100644 os/hal/ports/NUMICRO/NUC123SD4AN0/hal_lld.h create mode 100644 os/hal/ports/NUMICRO/NUC123SD4AN0/nuc123_isr.h create mode 100644 os/hal/ports/NUMICRO/NUC123SD4AN0/nuc123_registry.h create mode 100644 os/hal/ports/NUMICRO/NUC123SD4AN0/platform.mk create mode 100644 os/hal/ports/NUMICRO/NUC123SD4AN0/system_NUC123.c diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/NUC123.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/NUC123.h new file mode 100644 index 00000000..e2de58bf --- /dev/null +++ b/os/common/ext/CMSIS/Nuvoton/NUMICRO/NUC123.h @@ -0,0 +1,8762 @@ +/**************************************************************************//** + * @file NUC123.h + * @version V3.0 + * $Revision: 84 $ + * $Date: 16/06/22 8:25p $ + * @brief NUC123 Series Peripheral Access Layer Header File + * + * @note + * Copyright (C) 2014~2016 Nuvoton Technology Corp. All rights reserved. + * + ******************************************************************************/ + +/** + \mainpage Introduction + * + * + * This user manual describes the usage of NUC123 Series MCU device driver + * + * Disclaimer + * + * The Software is furnished "AS IS", without warranty as to performance or results, and + * the entire risk as to performance or results is assumed by YOU. Nuvoton disclaims all + * warranties, express, implied or otherwise, with regard to the Software, its use, or + * operation, including without limitation any and all warranties of merchantability, fitness + * for a particular purpose, and non-infringement of intellectual property rights. + * + * Copyright Notice + * + * Copyright (C) 2014~2016 Nuvoton Technology Corp. All rights reserved. + */ + + +#ifndef __NUC123_H__ +#define __NUC123_H__ + +/* + * ========================================================================== + * ---------- Interrupt Number Definition ----------------------------------- + * ========================================================================== +*/ + +/** @addtogroup MCU_CMSIS Device Definitions for CMSIS + Interrupt Number Definition and Configurations for CMSIS + @{ +*/ + +/** + * @details Interrupt Number Definition. The maximum of 32 Specific Interrupts are possible. + */ + +typedef enum IRQn +{ + /****** Cortex-M0 Processor Exceptions Numbers ***************************************************/ + NonMaskableInt_IRQn = -14, /*!< 2 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 */ + + /****** ARMIKMCU Swift specific Interrupt Numbers ************************************************/ + BOD_IRQn = 0, /*!< Brown-Out Low Voltage Detected Interrupt */ + WDT_IRQn = 1, /*!< Watch Dog Timer Interrupt */ + EINT0_IRQn = 2, /*!< EINT0 Interrupt */ + EINT1_IRQn = 3, /*!< EINT1 Interrupt */ + GPAB_IRQn = 4, /*!< GPIO_PA/PB Interrupt */ + GPCDF_IRQn = 5, /*!< GPIO_PC/PD/PF Interrupt */ + PWMA_IRQn = 6, /*!< PWMA Interrupt */ + TMR0_IRQn = 8, /*!< TIMER0 Interrupt */ + TMR1_IRQn = 9, /*!< TIMER1 Interrupt */ + TMR2_IRQn = 10, /*!< TIMER2 Interrupt */ + TMR3_IRQn = 11, /*!< TIMER3 Interrupt */ + UART0_IRQn = 12, /*!< UART0 Interrupt */ + UART1_IRQn = 13, /*!< UART1 Interrupt */ + SPI0_IRQn = 14, /*!< SPI0 Interrupt */ + SPI1_IRQn = 15, /*!< SPI1 Interrupt */ + SPI2_IRQn = 16, /*!< SPI2 Interrupt */ + I2C0_IRQn = 18, /*!< I2C0 Interrupt */ + I2C1_IRQn = 19, /*!< I2C1 Interrupt */ + CAN0_IRQn = 20, /*!< CAN0 Interrupt */ + CAN1_IRQn = 21, /*!< CAN1 Interrupt */ + USBD_IRQn = 23, /*!< USB device Interrupt */ + PS2_IRQn = 24, /*!< PS/2 device Interrupt */ + PDMA_IRQn = 26, /*!< PDMA Interrupt */ + I2S_IRQn = 27, /*!< I2S Interrupt */ + PWRWU_IRQn = 28, /*!< Power Down Wake Up Interrupt */ + ADC_IRQn = 29, /*!< ADC Interrupt */ + IRC_IRQn = 30, /*!< IRC TRIM Interrupt */ +} IRQn_Type; + + +/* + * ========================================================================== + * ----------- Processor and Core Peripheral Section ------------------------ + * ========================================================================== + */ + +/* Configuration of the Cortex-M0 Processor and Core Peripherals */ +#define __MPU_PRESENT 0 /*!< armikcmu does not provide a MPU present or not */ +#define __NVIC_PRIO_BITS 2 /*!< armikcmu Supports 2 Bits for the Priority Levels */ +#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ + + +/*@}*/ /* end of group MCU_CMSIS */ + + +#include "core_cm0.h" /* Cortex-M0 processor and core peripherals */ +#include "system_NUC123.h" /* NUC123 System */ + +#if defined ( __CC_ARM ) +#pragma anon_unions +#endif + + +/*-------------------------------- Device Specific Peripheral registers structures ---------------------*/ +/** @addtogroup REGISTER Control Register + Peripheral Control Registers + @{ + */ + +/*----------------------------- ADC Controller -------------------------------*/ +/** @addtogroup REG_ADC Analog to Digital Converter (ADC) + Memory Mapped Structure for ADC Controller + @{ + */ + +typedef struct +{ + + + +/** + * @var ADC_T::ADDR + * Offset: 0x00-0x1C ADC Data Register x + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |RSLT |A/D Conversion Result + * | | |This field contains conversion result of ADC. + * |[16] |OVERRUN |Overrun Flag (Read Only) + * | | |If converted data in RSLT has not been read before new conversion result is loaded to this register, OVERRUN is set to 1 and previous conversion result is gone. + * | | |It is cleared by hardware after ADDR register is read. + * | | |0 = Data in RSLT (ADDRx[9:0], x=0~7) is recent conversion result. + * | | |1 = Data in RSLT (ADDRx[9:0], x=0~7) is overwritten. + * |[17] |VALID |Valid Flag (Read Only) + * | | |This bit is set to 1 when corresponding channel analog input conversion is completed and cleared by hardware after ADDR register is read. + * | | |0 = Data in RSLT bits (ADDRx[9:0], x=0~7) is not valid. + * | | |1 = Data in RSLT bits (ADDRx[9:0], x=0~7) is valid. + * @var ADC_T::ADCR + * Offset: 0x20 ADC Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ADEN |A/D Converter Enable Bit + * | | |Before starting A/D conversion function, this bit should be set to 1. + * | | |Clear it to 0 to disable A/D converter analog circuit for saving power consumption. + * | | |0 = A/D converter Disabled. + * | | |1 = A/D converter Enabled. + * |[1] |ADIE |A/D Interrupt Enable Bit + * | | |A/D conversion end interrupt request is generated if ADIE bit is set to 1. + * | | |0 = A/D interrupt function Disabled. + * | | |1 = A/D interrupt function Enabled. + * |[3:2] |ADMD |A/D Converter Operation Mode + * | | |00 = Single conversion. + * | | |01 = Reserved. + * | | |10 = Single-cycle scan. + * | | |11 = Continuous scan. + * | | |When changing the operation mode, software should disable ADST bit (ADCR[11]) firstly. + * |[5:4] |TRGS |Hardware Trigger Source + * | | |00 = A/D conversion is started by external STADC pin. + * | | |11 = A/D conversion is started by PWM Center-aligned trigger. + * | | |Others = Reserved. + * | | |Note: TRGEN (ADCR[8]) and ADST (ADCR[11]) shall be cleared to 0 before changing TRGS. + * |[7:6] |TRGCOND |External Trigger Condition + * | | |These two bits decide external pin STADC trigger event is level or edge. + * | | |The signal must be kept at stable state at least 8 PCLKs for level trigger and 4 PCLKs at high and low state for edge trigger. + * | | |00 = Low level. + * | | |01 = High level. + * | | |10 = Falling edge. + * | | |11 = Rising edge. + * |[8] |TRGEN |Hardware Trigger Enable Bit + * | | |Enable or disable triggering of A/D conversion by external STADC pin or by PWM trigger. + * | | |0 = External trigger Disabled. + * | | |1 = External trigger Enabled. + * | | |Note: ADC hardware trigger function is only supported in single-cycle scan mode. + * | | |If hardware trigger is enabled, the ADST bit can be set to 1 by the selected hardware trigger source. + * |[9] |PTEN |PDMA Transfer Enable Bit + * | | |When A/D conversion is completed, the converted data is loaded into ADDR 0~7, software can enable this bit to generate a PDMA data transfer request. + * | | |When PTEN=1, software must set ADIE=0 (ADCR[1]) to disable interrupt. + * | | |0 = PDMA data transfer Disabled. + * | | |1 = PDMA data transfer in ADDR 0~7 Enabled. + * |[11] |ADST |A/D Conversion Start + * | | |ADST bit can be set to 1 from three sources: software, STADC pin and PWM output. + * | | |ADST will be cleared to 0 by hardware automatically at the ends of single mode and single-cycle scan mode. + * | | |In continuous scan mode, A/D conversion is continuously performed until software writes 0 to this bit or chip reset. + * | | |0 = Conversion stopped and A/D converter entering idle state. + * | | |1 = Conversion started. + * | | |Note: when ADST is clear to 0 by hardware automatically in single mode, user need to wait one ADC_CLK cycle for next A/D conversion. + * @var ADC_T::ADCHER + * Offset: 0x24 ADC Channel Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |CHEN |Analog Input Channel Enable Bit + * | | |Set CHEN[7:0] to enable the corresponding analog input channel 7 ~ 0. + * | | |0 = Channel Disabled. + * | | |1 = Channel Enabled. + * |[8] |PRESEL |Analog Input Channel 7 Select + * | | |0 = External analog input. + * | | |1 = Internal band-gap voltage. + * | | |Note: + * | | |When software selects the band-gap voltage as the analog input source of ADC channel 7, ADC clock rate needs to be limited to slower than 300 kHz. + * @var ADC_T::ADCMPR + * Offset: 0x28-0x2C ADC Compare Register x + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CMPEN |Compare Enable Bit + * | | |Set this bit to 1 to enable ADC controller to compare CMPD (ADCMPRx[25:16]) with specified channel conversion result when converted data is loaded into ADDRx register. + * | | |0 = Compare function Disabled. + * | | |1 = Compare function Enabled. + * |[1] |CMPIE |Compare Interrupt Enable Bit + * | | |If the compare function is enabled and the compare condition matches the setting of + * | | |CMPCOND (ADCMPRx[2]) and CMPMATCNT (ADCMPRx[11:8]), CMPFx bit (ADSR[2:1]) + * | | |will be set, in the meanwhile, if CMPIE (ADCMPRx[1]) is set to 1, a compare interrupt + * | | |request is generated. + * | | |0 = Compare function interrupt Disabled. + * | | |1 = Compare function interrupt Enabled. + * |[2] |CMPCOND |Compare Condition + * | | |0 = Set the compare condition as that when a 10-bit A/D conversion result is less than the 10-bit CMPD (ADCMPRx[25:16]), the internal match counter will increase one. + * | | |1 = Set the compare condition as that when a 10-bit A/D conversion result is greater or equal to the 10-bit CMPD (ADCMPRx[25:16]), the internal match counter will increase one. + * | | |Note: When the internal counter reaches the value to (CMPMATCNT+1), the CMPFx bit will be set. + * |[5:3] |CMPCH |Compare Channel Selection + * | | |000 = Channel 0 conversion result is selected to be compared. + * | | |001 = Channel 1 conversion result is selected to be compared. + * | | |010 = Channel 2 conversion result is selected to be compared. + * | | |011 = Channel 3 conversion result is selected to be compared. + * | | |100 = Channel 4 conversion result is selected to be compared. + * | | |101 = Channel 5 conversion result is selected to be compared. + * | | |110 = Channel 6 conversion result is selected to be compared. + * | | |111 = Channel 7 conversion result is selected to be compared. + * |[11:8] |CMPMATCNT |Compare Match Count + * | | |When the specified A/D channel analog conversion result matches the compare condition defined by CMPCOND (ADCMPRx[2]), the internal match counter will increase 1, + * | | |otherwise, the compare match counter will be cleared to 0. + * | | |When the internal counter reaches the value to (CMPMATCNT+1), CMPFx bit (ADSR[2:1]) will be set. + * |[25:16] |CMPD |Comparison Data + * | | |The 10-bit data is used to compare with conversion result of specified channel. + * @var ADC_T::ADSR + * Offset: 0x30 ADC Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ADF |A/D Conversion End Flag + * | | |A status flag that indicates the end of A/D conversion. + * | | |ADF is set to 1 at these two conditions: + * | | |1. When A/D conversion ends in Single mode. + * | | |2. When A/D conversion ends on all specified channels in Scan mode. + * | | |This flag can be cleared by writing 1 to itself. + * |[1] |CMPF0 |Compare Flag + * | | |When the selected channel A/D conversion result meets setting condition in ADCMPR0 then this bit is set to 1. + * | | |And it is cleared by writing 1 to self. + * | | |0 = Conversion result in ADDR does not meet ADCMPR0 setting. + * | | |1 = Conversion result in ADDR meets ADCMPR0 setting. + * |[2] |CMPF1 |Compare Flag + * | | |When the selected channel A/D conversion result meets setting condition in ADCMPR1 then this bit is set to 1. + * | | |And it is cleared by writing 1 to self. + * | | |0 = Conversion result in ADDR does not meet ADCMPR1 setting. + * | | |1 = Conversion result in ADDR meets ADCMPR1 setting. + * |[3] |BUSY |BUSY/IDLE (Read Only) + * | | |0 = A/D converter is in idle state. + * | | |1 = A/D converter is busy at conversion. + * | | |This bit is a mirror of ADST bit in ADCR. + * |[6:4] |CHANNEL |Current Conversion Channel (Read Only) + * | | |This field reflects the current conversion channel when BUSY = 1 (ADSR[3]). + * | | |When BUSY(ADSR[3]) = 0, it shows the number of the next converted channel. + * |[15:8] |VALID |Data Valid Flag (Read Only) + * | | |VALID[7:0] is a mirror of the VALID bits in ADDR7[17] ~ ADDR0[17]. + * | | |It is read only. + * |[23:16] |OVERRUN |Overrun Flag (Read Only) + * | | |OVERRUN[7:0] is a mirror of the OVERRUN bits in ADDR7[16] ~ ADDR0[16]. + * @var ADC_T::ADPDMA + * Offset: 0x40 ADC PDMA Current Transfer Data Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |AD_PDMA |ADC PDMA Current Transfer Data Register (Read Only) + * | | |When transferring A/D conversion result with PDMA, software can read this register to monitor current PDMA transfer data. + */ + + __I uint32_t ADDR[8]; /* Offset: 0x00-0x1C ADC Data Register x */ + __IO uint32_t ADCR; /* Offset: 0x20 ADC Control Register */ + __IO uint32_t ADCHER; /* Offset: 0x24 ADC Channel Enable Register */ + __IO uint32_t ADCMPR[2]; /* Offset: 0x28-0x2C ADC Compare Register x */ + __IO uint32_t ADSR; /* Offset: 0x30 ADC Status Register */ + __I uint32_t RESERVE0[3]; + __I uint32_t ADPDMA; /* Offset: 0x40 ADC PDMA Current Transfer Data Register */ + +} ADC_T; + + + +/** @addtogroup REG_ADC_BITMASK ADC Bit Mask + @{ + */ + +/* ADDR Bit Field Definitions */ +#define ADC_ADDR_VALID_Pos 17 /*!< ADC_T::ADDR: VALID Position */ +#define ADC_ADDR_VALID_Msk (1ul << ADC_ADDR_VALID_Pos) /*!< ADC_T::ADDR: VALID Mask */ + +#define ADC_ADDR_OVERRUN_Pos 16 /*!< ADC_T::ADDR: OVERRUN Position */ +#define ADC_ADDR_OVERRUN_Msk (1ul << ADC_ADDR_OVERRUN_Pos) /*!< ADC_T::ADDR: OVERRUN Mask */ + +#define ADC_ADDR_RSLT_Pos 0 /*!< ADC_T::ADDR: RSLT Position */ +#define ADC_ADDR_RSLT_Msk (0x3FFul << ADC_ADDR_RSLT_Pos) /*!< ADC_T::ADDR: RSLT Mask */ + +/* ADCR Bit Field Definitions */ +#define ADC_ADCR_ADST_Pos 11 /*!< ADC_T::ADCR: ADST Position */ +#define ADC_ADCR_ADST_Msk (1ul << ADC_ADCR_ADST_Pos) /*!< ADC_T::ADCR: ADST Mask */ + +#define ADC_ADCR_PTEN_Pos 9 /*!< ADC_T::ADCR: PTEN Position */ +#define ADC_ADCR_PTEN_Msk (1ul << ADC_ADCR_PTEN_Pos) /*!< ADC_T::ADCR: PTEN Mask */ + +#define ADC_ADCR_TRGEN_Pos 8 /*!< ADC_T::ADCR: TRGEN Position */ +#define ADC_ADCR_TRGEN_Msk (1ul << ADC_ADCR_TRGEN_Pos) /*!< ADC_T::ADCR: TRGEN Mask */ + +#define ADC_ADCR_TRGCOND_Pos 6 /*!< ADC_T::ADCR: TRGCOND Position */ +#define ADC_ADCR_TRGCOND_Msk (3ul << ADC_ADCR_TRGCOND_Pos) /*!< ADC_T::ADCR: TRGCOND Mask */ + +#define ADC_ADCR_TRGS_Pos 4 /*!< ADC_T::ADCR: TRGS Position */ +#define ADC_ADCR_TRGS_Msk (3ul << ADC_ADCR_TRGS_Pos) /*!< ADC_T::ADCR: TRGS Mask */ + +#define ADC_ADCR_ADMD_Pos 2 /*!< ADC_T::ADCR: ADMD Position */ +#define ADC_ADCR_ADMD_Msk (3ul << ADC_ADCR_ADMD_Pos) /*!< ADC_T::ADCR: ADMD Mask */ + +#define ADC_ADCR_ADIE_Pos 1 /*!< ADC_T::ADCR: ADIE Position */ +#define ADC_ADCR_ADIE_Msk (1ul << ADC_ADCR_ADIE_Pos) /*!< ADC_T::ADCR: ADIE Mask */ + +#define ADC_ADCR_ADEN_Pos 0 /*!< ADC_T::ADCR: ADEN Position */ +#define ADC_ADCR_ADEN_Msk (1ul << ADC_ADCR_ADEN_Pos) /*!< ADC_T::ADCR: ADEN Mask */ + +/* ADCHER Bit Field Definitions */ +#define ADC_ADCHER_PRESEL_Pos 8 /*!< ADC_T::ADCHER: PRESEL Position */ +#define ADC_ADCHER_PRESEL_Msk (1ul << ADC_ADCHER_PRESEL_Pos) /*!< ADC_T::ADCHER: PRESEL Mask */ + +#define ADC_ADCHER_CHEN_Pos 0 /*!< ADC_T::ADCHER: CHEN Position */ +#define ADC_ADCHER_CHEN_Msk (0xFFul << ADC_ADCHER_CHEN_Pos) /*!< ADC_T::ADCHER: CHEN Mask */ + +/* ADCMPR Bit Field Definitions */ +#define ADC_ADCMPR_CMPD_Pos 16 /*!< ADC_T::ADCMPR: CMPD Position */ +#define ADC_ADCMPR_CMPD_Msk (0x3FFul << ADC_ADCMPR_CMPD_Pos) /*!< ADC_T::ADCMPR: CMPD Mask */ + +#define ADC_ADCMPR_CMPMATCNT_Pos 8 /*!< ADC_T::ADCMPR: CMPMATCNT Position */ +#define ADC_ADCMPR_CMPMATCNT_Msk (0xFul << ADC_ADCMPR_CMPMATCNT_Pos) /*!< ADC_T::ADCMPR: CMPMATCNT Mask */ + +#define ADC_ADCMPR_CMPCH_Pos 3 /*!< ADC_T::ADCMPR: CMPCH Position */ +#define ADC_ADCMPR_CMPCH_Msk (7ul << ADC_ADCMPR_CMPCH_Pos) /*!< ADC_T::ADCMPR: CMPCH Mask */ + +#define ADC_ADCMPR_CMPCOND_Pos 2 /*!< ADC_T::ADCMPR: CMPCOND Position */ +#define ADC_ADCMPR_CMPCOND_Msk (1ul << ADC_ADCMPR_CMPCOND_Pos) /*!< ADC_T::ADCMPR: CMPCOND Mask */ + +#define ADC_ADCMPR_CMPIE_Pos 1 /*!< ADC_T::ADCMPR: CMPIE Position */ +#define ADC_ADCMPR_CMPIE_Msk (1ul << ADC_ADCMPR_CMPIE_Pos) /*!< ADC_T::ADCMPR: CMPIE Mask */ + +#define ADC_ADCMPR_CMPEN_Pos 0 /*!< ADC_T::ADCMPR: CMPEN Position */ +#define ADC_ADCMPR_CMPEN_Msk (1ul << ADC_ADCMPR_CMPEN_Pos) /*!< ADC_T::ADCMPR: CMPEN Mask */ + +/* ADSR Bit Field Definitions */ +#define ADC_ADSR_OVERRUN_Pos 16 /*!< ADC_T::ADSR: OVERRUN Position */ +#define ADC_ADSR_OVERRUN_Msk (0xFFul << ADC_ADSR_OVERRUN_Pos) /*!< ADC_T::ADSR: OVERRUN Mask */ + +#define ADC_ADSR_VALID_Pos 8 /*!< ADC_T::ADSR: VALID Position */ +#define ADC_ADSR_VALID_Msk (0xFFul << ADC_ADSR_VALID_Pos) /*!< ADC_T::ADSR: VALID Mask */ + +#define ADC_ADSR_CHANNEL_Pos 4 /*!< ADC_T::ADSR: CHANNEL Position */ +#define ADC_ADSR_CHANNEL_Msk (7ul << ADC_ADSR_CHANNEL_Pos) /*!< ADC_T::ADSR: CHANNEL Mask */ + +#define ADC_ADSR_BUSY_Pos 3 /*!< ADC_T::ADSR: BUSY Position */ +#define ADC_ADSR_BUSY_Msk (1ul << ADC_ADSR_BUSY_Pos) /*!< ADC_T::ADSR: BUSY Mask */ + +#define ADC_ADSR_CMPF1_Pos 2 /*!< ADC_T::ADSR: CMPF1 Position */ +#define ADC_ADSR_CMPF1_Msk (1ul << ADC_ADSR_CMPF1_Pos) /*!< ADC_T::ADSR: CMPF1 Mask */ + +#define ADC_ADSR_CMPF0_Pos 1 /*!< ADC_T::ADSR: CMPF0 Position */ +#define ADC_ADSR_CMPF0_Msk (1ul << ADC_ADSR_CMPF0_Pos) /*!< ADC_T::ADSR: CMPF0 Mask */ + +#define ADC_ADSR_ADF_Pos 0 /*!< ADC_T::ADSR: ADF Position */ +#define ADC_ADSR_ADF_Msk (1ul << ADC_ADSR_ADF_Pos) /*!< ADC_T::ADSR: ADF Mask */ + +/* ADPDMA Bit Field Definitions */ +#define ADC_ADPDMA_AD_PDMA_Pos 0 /*!< ADC_T::ADPDMA: AD_PDMA Position */ +#define ADC_ADPDMA_AD_PDMA_Msk (0x3FFul << ADC_ADPDMA_AD_PDMA_Pos) /*!< ADC_T::ADPDMA: AD_PDMA Mask */ +/*@}*/ /* end of group REG_ADC_BITMASK */ +/*@}*/ /* end of group REG_ADC */ + + +/*---------------------------- Clock Controller ------------------------------*/ +/** @addtogroup REG_CLK System Clock Controller (CLK) + Memory Mapped Structure for System Clock Controller + @{ + */ + +typedef struct +{ + + + +/** + * @var CLK_T::PWRCON + * Offset: 0x00 System Power-down Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |XTL12M_EN |External 4~24 MHz High Speed Crystal Enable (HXT) Control (Write Protect) + * | | |The bit default value is set by flash controller user configuration register CFOSC (Config0[26:24]). + * | | |When the default clock source is from external 4~24 MHz high speed crystal, this bit is set to 1 automatically. + * | | |0 = External 4~24 MHz high speed crystal oscillator (HXT) Disabled. + * | | |1 = External 4~24 MHz high speed crystal oscillator (HXT) Enabled. + * | | |Note: This bit is write protected bit. Refer to the REGWRPROT register. + * |[2] |OSC22M_EN |Internal 22.1184 MHz High Speed Oscillator (HIRC) Enable Control (Write Protect) + * | | |0 = Internal 22.1184 MHz high speed oscillator (HIRC) Disabled. + * | | |1 = Internal 22.1184 MHz high speed oscillator (HIRC) Enabled. + * | | |Note: This bit is write protected bit. Refer to the REGWRPROT register. + * |[3] |OSC10K_EN |Internal 10 KHz Low Speed Oscillator (LIRC) Enable Control (Write Protect) + * | | |0 = Internal 10 kHz low speed oscillator (LIRC) Disabled. + * | | |1 = Internal 10 kHz low speed oscillator (LIRC) Enabled. + * | | |Note: This bit is write protected bit. Refer to the REGWRPROT register. + * |[4] |PD_WU_DLY |Wake-up Delay Counter Enable Control (Write Protect) + * | | |When the chip wakes up from Power-down mode, the clock control will delay certain clock cycles to wait system clock stable. + * | | |The delayed clock cycle is 4096 clock cycles when chip work at external 4~24 MHz high speed crystal, and 256 clock cycles when chip work at internal 22.1184 MHz high speed oscillator. + * | | |0 = Clock cycles delay Disabled. + * | | |1 = Clock cycles delay Enabled. + * | | |Note: This bit is write protected bit. Refer to the REGWRPROT register. + * |[5] |PD_WU_INT_EN|Power-Down Mode Wake-Up Interrupt Enable Control (Write Protect) + * | | |0 = Power-down mode wake-up interrupt Disabled. + * | | |1 = Power-down mode wake-up interrupt Enabled. + * | | |Note1: The interrupt will occur when both PD_WU_STS and PD_WU_INT_EN are high. + * | | |Note2: This bit is write protected bit. Refer to the REGWRPROT register. + * |[6] |PD_WU_STS |Power-down Mode Wake-Up Interrupt Status + * | | |Set by "Power-down wake-up event", it indicates that resume from Power-down mode. + * | | |The flag is set if the GPIO, USB, UART, WDT, TIMER, I2C or BOD wake-up occurred. + * | | |This bit can be cleared to 0 by software writing "1". + * | | |Note: This bit is working only if PD_WU_INT_EN (PWRCON[5]) set to 1. + * |[7] |PWR_DOWN_EN|System Power-down Enable Bit (Write Protect) + * | | |When this bit is set to 1, Power-down mode is enabled and chip Power-down behavior will depends on the PD_WAIT_CPU bit + * | | |(a) If the PD_WAIT_CPU is 0, then the chip enters Power-down mode immediately after the PWR_DOWN_EN bit set. + * | | |(b) if the PD_WAIT_CPU is 1, then the chip keeps active till the CPU sleep mode is also active and then the chip enters Power-down mode (recommend) + * | | |When chip wakes up from Power-down mode, this bit is cleared by hardware. + * | | |User needs to set this bit again for next Power-down. + * | | |In Power-down mode, 4~24 MHz external high speed crystal oscillator (HXT) and the 22.1184 MHz internal high speed RC oscillator (HIRC) will be disabled in this mode, but the 10 kHz internal low speed RC oscillator (LIRC) is not controlled by Power-down mode. + * | | |In Power- down mode, the PLL and system clock are disabled, and ignored the clock source selection. The clocks of peripheral are not controlled by Power-down mode, if the peripheral clock source is from the 10 kHz internal low speed RC oscillator (LIRC). + * | | |The clocks of peripheral are not controlled by Power-down mode, if the peripheral clock source is from the internal 10 kHz low speed oscillator. + * | | |0 = Chip operating normally or chip in Idle mode because of WFI command. + * | | |1 = Chip enters Power-down mode instantly or waits CPU sleep command WFI. + * | | |Note: This bit is write protected bit. Refer to the REGWRPROT register. + * |[8] |PD_WAIT_CPU|This Bit Control The Power-Down Entry Condition (Write Protect) + * | | |0 = Chip enters Power-down mode when the PWR_DOWN_EN bit is set to 1. + * | | |1 = Chip enters Power-down mode when the both PD_WAIT_CPU and PWR_DOWN_EN bits are set to 1 and CPU run WFI instruction. + * | | |Note: This bit is write protected bit. Refer to the REGWRPROT register. + * @var CLK_T::AHBCLK + * Offset: 0x04 AHB Devices Clock Enable Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1] |PDMA_EN |PDMA Controller Clock Enable Control + * | | |0 = PDMA peripheral clock Disabled. + * | | |1 = PDMA peripheral clock Enabled. + * |[2] |ISP_EN |Flash ISP Controller Clock Enable Control + * | | |0 = Flash ISP peripheral clock Disabled. + * | | |1 = Flash ISP peripheral clock Enabled. + * @var CLK_T::APBCLK + * Offset: 0x08 APB Devices Clock Enable Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |WDT_EN |Watchdog Timer Clock Enable Control (Write Protect) + * | | |0 = Watchdog Timer clock Disabled. + * | | |1 = Watchdog Timer clock Enabled. + * | | |Note: This bit is write protected bit. Refer to the REGWRPROT register. + * |[2] |TMR0_EN |Timer0 Clock Enable Control + * | | |0 = Timer0 clock Disabled. + * | | |1 = Timer0 clock Enabled. + * |[3] |TMR1_EN |Timer1 Clock Enable Control + * | | |0 = Timer1 clock Disabled. + * | | |1 = Timer1 clock Enabled. + * |[4] |TMR2_EN |Timer2 Clock Enable Control + * | | |0 = Timer2 clock Disabled. + * | | |1 = Timer2 clock Enabled. + * |[5] |TMR3_EN |Timer3 Clock Enable Control + * | | |0 = Timer3 clock Disabled. + * | | |1 = Timer3 clock Enabled. + * |[6] |FDIV_EN |Frequency Divider Output Clock Enable Control + * | | |0 = FDIV clock Disabled. + * | | |1 = FDIV clock Enabled. + * |[8] |I2C0_EN |I2C0 Clock Enable Control + * | | |0 = I2C0 clock Disabled. + * | | |1 = I2C0 clock Enabled. + * |[9] |I2C1_EN |I2C1 Clock Enable Control + * | | |0 = I2C1 clock Disabled. + * | | |1 = I2C1 clock Enabled. + * |[12] |SPI0_EN |SPI0 Clock Enable Control + * | | |0 = SPI0 clock Disabled. + * | | |1 = SPI0 clock Enabled. + * |[13] |SPI1_EN |SPI1 Clock Enable Control + * | | |0 = SPI1 clock Disabled. + * | | |1 = SPI1 clock Enabled. + * |[14] |SPI2_EN |SPI2 Clock Enable Control + * | | |0 = SPI2 clock Disabled. + * | | |1 = SPI2 clock Enabled. + * |[16] |UART0_EN |UART0 Clock Enable Control + * | | |0 = UART0 clock Disabled. + * | | |1 = UART0 clock Enabled. + * |[17] |UART1_EN |UART1 Clock Enable Control + * | | |0 = UART1 clock Disabled. + * | | |1 = UART1 clock Enabled. + * |[20] |PWM01_EN |PWM_01 Clock Enable Control + * | | |0 = PWM01 clock Disabled. + * | | |1 = PWM01 clock Enabled. + * |[21] |PWM23_EN |PWM_23 Clock Enable Control + * | | |0 = PWM23 clock Disabled. + * | | |1 = PWM23 clock Enabled. + * |[27] |USBD_EN |USB 2.0 FS Device Controller Clock Enable Control + * | | |0 = USB clock Disabled. + * | | |1 = USB clock Enabled. + * |[28] |ADC_EN |Analog-Digital-Converter (ADC) Clock Enable Control + * | | |0 = ADC clock Disabled. + * | | |1 = ADC clock Enabled. + * |[29] |I2S_EN |I2S Clock Enable Control + * | | |0 = I2S clock Disabled. + * | | |1 = I2S clock Enabled. + * |[31] |PS2_EN |PS/2 Clock Enable Control + * | | |0 = PS/2 clock Disabled. + * | | |1 = PS/2 clock Enabled. + * @var CLK_T::CLKSTATUS + * Offset: 0x0C Clock status monitor Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |XTL12M_STB|External 4~24 MHz High Speed Crystal (HXT) Clock Source Stable Flag (Read Only) + * | | |0 = External 4~24 MHz high speed crystal clock (HXT) is not stable or disabled. + * | | |1 = External 4~24 MHz high speed crystal clock (HXT) is stable and enabled. + * |[2] |PLL_STB |Internal PLL Clock Source Stable Flag (Read Only) + * | | |0 = Internal PLL clock is not stable or disabled. + * | | |1 = Internal PLL clock is stable in normal mode. + * |[3] |OSC10K_STB|Internal 10 KHz Low Speed Oscillator (LIRC) Clock Source Stable Flag (Read Only) + * | | |0 = Internal 10 kHz low speed oscillator clock (LIRC) is not stable or disabled. + * | | |1 = Internal 10 kHz low speed oscillator clock (LIRC) is stable and enabled. + * |[4] |OSC22M_STB|Internal 22.1184 MHz High Speed Oscillator (HIRC) Clock Source Stable Flag (Read Only) + * | | |0 = Internal 22.1184 MHz high speed oscillator (HIRC) clock is not stable or disabled. + * | | |1 = Internal 22.1184 MHz high speed oscillator (HIRC) clock is stable and enabled. + * |[7] |CLK_SW_FAIL|Clock Switching Fail Flag + * | | |This bit is updated when software switches system clock source. + * | | |If switch target clock is stable, this bit will be set to 0. + * | | |If switch target clock is not stable, this bit will be set to 1. + * | | |0 = Clock switching success. + * | | |1 = Clock switching failure. + * | | |Note1: On NUC123xxxANx, this bit can be cleared to 0 by software writing "1". + * | | |Note2: On NUC123xxxAEx, this bit is read only. After selected clock source is stable, hardware will switch system clock to selected clock automatically, and CLK_SW_FAIL will be cleared automatically by hardware. + * @var CLK_T::CLKSEL0 + * Offset: 0x10 Clock Source Select Control Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |HCLK_S |HCLK Clock Source Select (Write Protect) + * | | |The 3-bit default value is reloaded from the value of CFOSC (CONFIG0[26:24]) in user configuration register of Flash controller by any reset. + * | | |Therefore the default value is either 000b or 111b. + * | | |000 = Clock source from external 4~24 MHz high speed crystal oscillator clock. + * | | |001 = Clock source from PLL/2 clock. + * | | |010 = Clock source from PLL clock. + * | | |011 = Clock source from internal 10 kHz low speed oscillator clock. + * | | |111 = Clock source from internal 22.1184 MHz high speed oscillator clock. + * | | |Note1: Before clock switching, the related clock sources (both pre-select and new-select) must be turn on. + * | | |Note2: These bits are write protected bit. Refer to the REGWRPROT register. + * |[5:3] |STCLK_S |Cortex-M0 SysTick Clock Source Select (Write Protect) + * | | |If SYST_CSR[2] = 1, SysTick clock source is from HCLK. + * | | |If SYST_CSR[2] = 0, SysTick clock source is defined by STCLK_S(CLKSEL0[5:3]). + * | | |000 = Clock source from external 4~24 MHz high speed crystal clock. + * | | |010 = Clock source from external 4~24 MHz high speed crystal clock/2. + * | | |011 = Clock source from HCLK/2. + * | | |111 = Clock source from internal 22.1184 MHz high speed oscillator clock/2. + * | | |Note1: If SysTick clock source is not from HCLK (i.e. SYST_CSR[2] = 0), SysTick clock source must less than or equal to HCLK/2. + * | | |Note2: These bits are write protected bit. Refer to the REGWRPROT register. + * @var CLK_T::CLKSEL1 + * Offset: 0x14 Clock Source Select Control Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |WDT_S |Watchdog Timer Clock Source Select (Write Protect) + * | | |10 = Clock source from HCLK/2048 clock. + * | | |11 = Clock source from internal 10 kHz low speed oscillator clock. + * | | |Note: These bits are write protected bit. Refer to the REGWRPROT register. + * |[3:2] |ADC_S |ADC Clock Source Select + * | | |00 = Clock source from external 4~24 MHz high speed crystal oscillator clock. + * | | |01 = Clock source from PLL clock. + * | | |10 = Clock source from HCLK. + * | | |11 = Clock source from internal 22.1184 MHz high speed oscillator clock. + * |[4] |SPI0_S |SPI0 Clock Source Selection + * | | |0 = Clock source from PLL clock. + * | | |1 = Clock source from HCLK. + * |[5] |SPI1_S |SPI1 Clock Source Selection + * | | |0 = Clock source from PLL clock. + * | | |1 = Clock source from HCLK. + * |[6] |SPI2_S |SPI2 Clock Source Selection + * | | |0 = Clock source from PLL clock. + * | | |1 = Clock source from HCLK. + * |[10:8] |TMR0_S |TIMER0 Clock Source Selection + * | | |000 = Clock source from external 4~24 MHz high speed crystal clock. + * | | |010 = Clock source from HCLK. + * | | |011 = Clock source from external trigger. + * | | |101 = Clock source from internal 10 kHz low speed oscillator clock. + * | | |111 = Clock source from internal 22.1184 MHz high speed oscillator clock. + * | | |Others = Reserved. + * |[14:12] |TMR1_S |TIMER1 Clock Source Selection + * | | |000 = Clock source from external 4~24 MHz high speed crystal clock. + * | | |010 = Clock source from HCLK. + * | | |011 = Clock source from external trigger. + * | | |101 = Clock source from internal 10 kHz low speed oscillator clock. + * | | |111 = Clock source from internal 22.1184 MHz high speed oscillator clock. + * | | |Others = Reserved. + * |[18:16] |TMR2_S |TIMER2 Clock Source Selection + * | | |000 = Clock source from external 4~24 MHz high speed crystal clock. + * | | |010 = Clock source from HCLK. + * | | |011 = Clock source from external trigger. + * | | |101 = Clock source from internal 10 kHz low speed oscillator clock. + * | | |111 = Clock source from internal 22.1184 MHz high speed oscillator clock. + * | | |Others = Reserved. + * |[22:20] |TMR3_S |TIMER3 Clock Source Selection + * | | |000 = Clock source from external 4~24 MHz high speed crystal clock. + * | | |010 = Clock source from HCLK. + * | | |011 = Reserved. + * | | |101 = Clock source from internal 10 kHz low speed oscillator clock. + * | | |111 = Clock source from internal 22.1184 MHz high speed oscillator clock. + * | | |Others = Reserved. + * |[25:24] |UART_S |UART Clock Source Selection + * | | |00 = Clock source from external 4~24 MHz high speed crystal oscillator clock. + * | | |01 = Clock source from PLL clock. + * | | |11 = Clock source from internal 22.1184 MHz high speed oscillator clock. + * |[29:28] |PWM01_S |PWM0 and PWM1 Clock Source Selection + * | | |PWM0 and PWM1 used the same clock source; both of them used the same prescaler. + * | | |The clock source of PWM0 and PWM1 is defined by PWM01_S (CLKSEL1[29:28]) and PWM01_S_E (CLKSEL2[8]). + * | | |If PWM01_S_E = 0, the clock source of PWM0 and PWM1 defined by PWM01_S list below: + * | | |00 = Clock source from external 4~24 MHz high speed crystal oscillator clock. + * | | |10 = Clock source from HCLK. + * | | |11 = Clock source from internal 22.1184 MHz high speed oscillator clock. + * | | |If PWM01_S_E = 1, the clock source of PWM0 and PWM1 defined by PWM01_S list below: + * | | |00 = Reserved. + * | | |01 = Reserved. + * | | |10 = Reserved. + * | | |11 = Clock source from internal 10 kHz low speed oscillator clock. + * |[31:30] |PWM23_S |PWM2 and PWM3 Clock Source Selection + * | | |PWM2 and PWM3 used the same clock source; both of them used the same prescaler. + * | | |The clock source of PWM2 and PWM3 is defined by PWM23_S (CLKSEL1[31:30]) and PWM23_S_E (CLKSEL2[9]). + * | | |If PWM23_S_E = 0, theclock source of PWM2 and PWM3 defined by PWM23_S list below: + * | | |00 = Clock source from external 4~24 MHz high speed crystal oscillator clock. + * | | |10 = Clock source from HCLK. + * | | |11 = Clock source from internal 22.1184 MHz high speed oscillator clock. + * | | |If PWM23_S_E = 1, the clock source of PWM2 and PWM3 defined by PWM23_S list below: + * | | |00 = Reserved. + * | | |01 = Reserved. + * | | |10 = Reserved. + * | | |11 = Clock source from internal 10 kHz low speed oscillator clock. + * @var CLK_T::CLKDIV + * Offset: 0x18 Clock Divider Number Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |HCLK_N |HCLK Clock Divide Number From HCLK Clock Source + * | | |HCLK clock frequency = (HCLK clock source frequency) / (HCLK_N + 1). + * |[7:4] |USB_N |USB Clock Divide Number From PLL Clock + * | | |USB clock frequency = (PLL frequency) / (USB_N + 1). + * |[11:8] |UART_N |UART Clock Divide Number From UART Clock Source + * | | |UART clock frequency = (UART clock source frequency) / (UART_N + 1). + * |[23:16] |ADC_N |ADC Clock Divide Number From ADC Clock Source + * | | |ADC clock frequency = (ADC clock source frequency) / (ADC_N + 1). + * @var CLK_T::CLKSEL2 + * Offset: 0x1C Clock Source Select Control Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |I2S_S |I2S Clock Source Selection + * | | |00 = Clock source from external 4~24 MHz high speed crystal oscillator clock. + * | | |01 = Clock source from PLL clock. + * | | |10 = Clock source from HCLK. + * | | |11 = Clock source from internal 22.1184 MHz high speed oscillator clock. + * |[3:2] |FRQDIV_S |Clock Divider Clock Source Selection + * | | |00 = Clock source from external 4~24 MHz high speed crystal oscillator clock. + * | | |10 = Clock source from HCLK. + * | | |11 = Clock source from internal 22.1184 MHz high speed oscillator clock. + * |[8] |PWM01_S_E |PWM0 and PWM1 Clock Source Selection Extend + * | | |PWM0 and PWM1 used the same clock source; both of them used the same prescaler. + * | | |The clock source of PWM0 and PWM1 is defined by PWM01_S (CLKSEL1[29:28]) and PWM01_S_E (CLKSEL2[8]). + * | | |If PWM01_S_E = 0, the clock source of PWM0 and PWM1 defined by PWM01_S list below: + * | | |00 = Clock source from external 4~24 MHz high speed crystal oscillator clock. + * | | |10 = Clock source from HCLK. + * | | |11 = Clock source from internal 22.1184 MHz high speed oscillator clock. + * | | |If PWM01_S_E = 1, the clock source of PWM0 and PWM1 defined by PWM01_S list below: + * | | |00 = Reserved. + * | | |01 = Reserved. + * | | |10 = Reserved. + * | | |11 = Clock source from internal 10 kHz low speed oscillator clock. + * |[9] |PWM23_S_E |PWM2 and PWM3 Clock Source Selection Extend + * | | |PWM2 and PWM3 used the same clock source; both of them used the same prescaler. + * | | |The clock source of PWM2 and PWM3 is defined by PWM23_S (CLKSEL1[31:30]) and PWM23_S_E (CLKSEL2[9]). + * | | |If PWM23_S_E = 0, the clock source of PWM2 and PWM3 defined by PWM23_S list below: + * | | |00 = Clock source from external 4~24 MHz high speed crystal oscillator clock. + * | | |10 = Clock source from HCLK. + * | | |11 = Clock source from internal 22.1184 MHz high speed oscillator clock. + * | | |If PWM23_S_E = 1, the clock source of PWM2 and PWM3 defined by PWM23_S list below: + * | | |00 = Reserved. + * | | |01 = Reserved. + * | | |10 = Reserved. + * | | |11 = Clock source from internal 10 kHz low speed oscillator clock. + * |[17:16] |WWDT_S |Window Watchdog Timer Clock Source Selection + * | | |10 = Clock source from HCLK/2048 clock. + * | | |11 = Clock source from internal 10 kHz low speed oscillator clock. + * @var CLK_T::PLLCON + * Offset: 0x20 PLL Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[8:0] |FB_DV |PLL Feedback Divider Control Bits + * | | |Refer to the PLL formulas. + * |[13:9] |IN_DV |PLL Input Divider Control Bits + * | | |Refer to the PLL formulas. + * |[15:14] |OUT_DV |PLL Output Divider Control Bits + * | | |Refer to the PLL formulas. + * |[16] |PD |Power-down Mode + * | | |If the PWR_DOWN_EN bit is set to 1 in PWRCON register, the PLL will enter Power-down mode too. + * | | |0 = PLL is in Normal mode. + * | | |1 = PLL is in Power-down mode (default). + * |[17] |BP |PLL Bypass Control + * | | |0 = PLL is in Normal mode (default). + * | | |1 = PLL clock output is same as PLL source clock input. + * |[18] |OE |PLL OE (FOUT Enable) Control + * | | |0 = PLL FOUT Enabled. + * | | |1 = PLL FOUT is fixed low. + * |[19] |PLL_SRC |PLL Source Clock Selection + * | | |0 = PLL source clock from external 4~24 MHz high speed crystal. + * | | |1 = PLL source clock from internal 22.1184 MHz high speed oscillator. + * @var CLK_T::FRQDIV + * Offset: 0x24 Frequency Divider Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |FSEL |Divider Output Frequency Selection Bits + * | | |The formula of output frequency is Fout = Fin/2(N+1). + * | | |Fin is the input clock frequency. + * | | |Fout is the frequency of divider output clock. + * | | |N is the 4-bit value of FSEL[3:0]. + * |[4] |DIVIDER_EN|Frequency Divider Enable Bit + * | | |0 = Frequency Divider function Disabled. + * | | |1 = Frequency Divider function Enabled. + * @var CLK_T::APBDIV + * Offset: 0x2C APB Divider Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |APBDIV |APB Divider Enable Bit + * | | |0 = PCLK is HCLK. + * | | |1 = PCLK is HCLK/2. + */ + + __IO uint32_t PWRCON; /* Offset: 0x00 System Power-down Control Register */ + __IO uint32_t AHBCLK; /* Offset: 0x04 AHB Devices Clock Enable Control Register */ + __IO uint32_t APBCLK; /* Offset: 0x08 APB Devices Clock Enable Control Register */ + __IO uint32_t CLKSTATUS; /* Offset: 0x0C Clock status monitor Register */ + __IO uint32_t CLKSEL0; /* Offset: 0x10 Clock Source Select Control Register 0 */ + __IO uint32_t CLKSEL1; /* Offset: 0x14 Clock Source Select Control Register 1 */ + __IO uint32_t CLKDIV; /* Offset: 0x18 Clock Divider Number Register */ + __IO uint32_t CLKSEL2; /* Offset: 0x1C Clock Source Select Control Register 2 */ + __IO uint32_t PLLCON; /* Offset: 0x20 PLL Control Register */ + __IO uint32_t FRQDIV; /* Offset: 0x24 Frequency Divider Control Register */ + __I uint32_t RESERVE0; + __IO uint32_t APBDIV; /* Offset: 0x2C APB Divider Control Register */ + +} CLK_T; + + + +/** @addtogroup REG_CLK_BITMASK CLK Bit Mask + @{ + */ + +/* CLK PWRCON Bit Field Definitions */ +#define CLK_PWRCON_PD_WAIT_CPU_Pos 8 /*!< CLK_T::PWRCON: PD_WAIT_CPU Position */ +#define CLK_PWRCON_PD_WAIT_CPU_Msk (1ul << CLK_PWRCON_PD_WAIT_CPU_Pos) /*!< CLK_T::PWRCON: PD_WAIT_CPU Mask */ + +#define CLK_PWRCON_PWR_DOWN_EN_Pos 7 /*!< CLK_T::PWRCON: PWR_DOWN_EN Position */ +#define CLK_PWRCON_PWR_DOWN_EN_Msk (1ul << CLK_PWRCON_PWR_DOWN_EN_Pos) /*!< CLK_T::PWRCON: PWR_DOWN_EN Mask */ + +#define CLK_PWRCON_PD_WU_STS_Pos 6 /*!< CLK_T::PWRCON: PD_WU_STS Position */ +#define CLK_PWRCON_PD_WU_STS_Msk (1ul << CLK_PWRCON_PD_WU_STS_Pos) /*!< CLK_T::PWRCON: PD_WU_STS Mask */ + +#define CLK_PWRCON_PD_WU_INT_EN_Pos 5 /*!< CLK_T::PWRCON: PD_WU_INT_EN Position */ +#define CLK_PWRCON_PD_WU_INT_EN_Msk (1ul << CLK_PWRCON_PD_WU_INT_EN_Pos) /*!< CLK_T::PWRCON: PD_WU_INT_EN Mask */ + +#define CLK_PWRCON_PD_WU_DLY_Pos 4 /*!< CLK_T::PWRCON: PD_WU_DLY Position */ +#define CLK_PWRCON_PD_WU_DLY_Msk (1ul << CLK_PWRCON_PD_WU_DLY_Pos) /*!< CLK_T::PWRCON: PD_WU_DLY Mask */ + +#define CLK_PWRCON_OSC10K_EN_Pos 3 /*!< CLK_T::PWRCON: OSC10K_EN Position */ +#define CLK_PWRCON_OSC10K_EN_Msk (1ul << CLK_PWRCON_OSC10K_EN_Pos) /*!< CLK_T::PWRCON: OSC10K_EN Mask */ +#define CLK_PWRCON_IRC10K_EN_Pos 3 /*!< CLK_T::PWRCON: IRC10K_EN Position */ +#define CLK_PWRCON_IRC10K_EN_Msk (1ul << CLK_PWRCON_IRC10K_EN_Pos) /*!< CLK_T::PWRCON: IRC10K_EN Mask */ + +#define CLK_PWRCON_OSC22M_EN_Pos 2 /*!< CLK_T::PWRCON: OSC22M_EN Position */ +#define CLK_PWRCON_OSC22M_EN_Msk (1ul << CLK_PWRCON_OSC22M_EN_Pos) /*!< CLK_T::PWRCON: OSC22M_EN Mask */ +#define CLK_PWRCON_IRC22M_EN_Pos 2 /*!< CLK_T::PWRCON: IRC22M_EN Position */ +#define CLK_PWRCON_IRC22M_EN_Msk (1ul << CLK_PWRCON_IRC22M_EN_Pos) /*!< CLK_T::PWRCON: IRC22M_EN Mask */ + +#define CLK_PWRCON_XTL12M_EN_Pos 0 /*!< CLK_T::PWRCON: XTL12M_EN Position */ +#define CLK_PWRCON_XTL12M_EN_Msk (1ul << CLK_PWRCON_XTL12M_EN_Pos) /*!< CLK_T::PWRCON: XTL12M_EN Mask */ + +/* CLK AHBCLK Bit Field Definitions */ +#define CLK_AHBCLK_ISP_EN_Pos 2 /*!< CLK_T::AHBCLK: ISP_EN Position */ +#define CLK_AHBCLK_ISP_EN_Msk (1ul << CLK_AHBCLK_ISP_EN_Pos) /*!< CLK_T::AHBCLK: ISP_EN Mask */ + +#define CLK_AHBCLK_PDMA_EN_Pos 1 /*!< CLK_T::AHBCLK: PDMA_EN Position */ +#define CLK_AHBCLK_PDMA_EN_Msk (1ul << CLK_AHBCLK_PDMA_EN_Pos) /*!< CLK_T::AHBCLK: PDMA_EN Mask */ + + +/* CLK APBCLK Bit Field Definitions */ +#define CLK_APBCLK_PS2_EN_Pos 31 /*!< CLK_T::APBCLK: PS2_EN Position */ +#define CLK_APBCLK_PS2_EN_Msk (1ul << CLK_APBCLK_PS2_EN_Pos) /*!< CLK_T::APBCLK: PS2_EN Mask */ + +#define CLK_APBCLK_I2S_EN_Pos 29 /*!< CLK_T::APBCLK: I2S_EN Position */ +#define CLK_APBCLK_I2S_EN_Msk (1ul << CLK_APBCLK_I2S_EN_Pos) /*!< CLK_T::APBCLK: I2S_EN Mask */ + +#define CLK_APBCLK_ADC_EN_Pos 28 /*!< CLK_T::APBCLK: ADC_EN Position */ +#define CLK_APBCLK_ADC_EN_Msk (1ul << CLK_APBCLK_ADC_EN_Pos) /*!< CLK_T::APBCLK: ADC_EN Mask */ + +#define CLK_APBCLK_USBD_EN_Pos 27 /*!< CLK_T::APBCLK: USBD_EN Position */ +#define CLK_APBCLK_USBD_EN_Msk (1ul << CLK_APBCLK_USBD_EN_Pos) /*!< CLK_T::APBCLK: USBD_EN Mask */ + +#define CLK_APBCLK_PWM23_EN_Pos 21 /*!< CLK_T::APBCLK: PWM23_EN Position */ +#define CLK_APBCLK_PWM23_EN_Msk (1ul << CLK_APBCLK_PWM23_EN_Pos) /*!< CLK_T::APBCLK: PWM23_EN Mask */ + +#define CLK_APBCLK_PWM01_EN_Pos 20 /*!< CLK_T::APBCLK: PWM01_EN Position */ +#define CLK_APBCLK_PWM01_EN_Msk (1ul << CLK_APBCLK_PWM01_EN_Pos) /*!< CLK_T::APBCLK: PWM01_EN Mask */ + +#define CLK_APBCLK_UART1_EN_Pos 17 /*!< CLK_T::APBCLK: UART1_EN Position */ +#define CLK_APBCLK_UART1_EN_Msk (1ul << CLK_APBCLK_UART1_EN_Pos) /*!< CLK_T::APBCLK: UART1_EN Mask */ + +#define CLK_APBCLK_UART0_EN_Pos 16 /*!< CLK_T::APBCLK: UART0_EN Position */ +#define CLK_APBCLK_UART0_EN_Msk (1ul << CLK_APBCLK_UART0_EN_Pos) /*!< CLK_T::APBCLK: UART0_EN Mask */ + +#define CLK_APBCLK_SPI2_EN_Pos 14 /*!< CLK_T::APBCLK: SPI2_EN Position */ +#define CLK_APBCLK_SPI2_EN_Msk (1ul << CLK_APBCLK_SPI2_EN_Pos) /*!< CLK_T::APBCLK: SPI2_EN Mask */ + +#define CLK_APBCLK_SPI1_EN_Pos 13 /*!< CLK_T::APBCLK: SPI1_EN Position */ +#define CLK_APBCLK_SPI1_EN_Msk (1ul << CLK_APBCLK_SPI1_EN_Pos) /*!< CLK_T::APBCLK: SPI1_EN Mask */ + +#define CLK_APBCLK_SPI0_EN_Pos 12 /*!< CLK_T::APBCLK: SPI0_EN Position */ +#define CLK_APBCLK_SPI0_EN_Msk (1ul << CLK_APBCLK_SPI0_EN_Pos) /*!< CLK_T::APBCLK: SPI0_EN Mask */ + +#define CLK_APBCLK_I2C1_EN_Pos 9 /*!< CLK_T::APBCLK: I2C1_EN Position */ +#define CLK_APBCLK_I2C1_EN_Msk (1ul << CLK_APBCLK_I2C1_EN_Pos) /*!< CLK_T::APBCLK: I2C1_EN Mask */ + +#define CLK_APBCLK_I2C0_EN_Pos 8 /*!< CLK_T::APBCLK: I2C0_EN_ Position */ +#define CLK_APBCLK_I2C0_EN_Msk (1ul << CLK_APBCLK_I2C0_EN_Pos) /*!< CLK_T::APBCLK: I2C0_EN_ Mask */ + +#define CLK_APBCLK_FDIV_EN_Pos 6 /*!< CLK_T::APBCLK: FDIV_EN Position */ +#define CLK_APBCLK_FDIV_EN_Msk (1ul << CLK_APBCLK_FDIV_EN_Pos) /*!< CLK_T::APBCLK: FDIV_EN Mask */ + +#define CLK_APBCLK_TMR3_EN_Pos 5 /*!< CLK_T::APBCLK: TMR3_EN Position */ +#define CLK_APBCLK_TMR3_EN_Msk (1ul << CLK_APBCLK_TMR3_EN_Pos) /*!< CLK_T::APBCLK: TMR3_EN Mask */ + +#define CLK_APBCLK_TMR2_EN_Pos 4 /*!< CLK_T::APBCLK: TMR2_EN Position */ +#define CLK_APBCLK_TMR2_EN_Msk (1ul << CLK_APBCLK_TMR2_EN_Pos) /*!< CLK_T::APBCLK: TMR2_EN Mask */ + +#define CLK_APBCLK_TMR1_EN_Pos 3 /*!< CLK_T::APBCLK: TMR1_EN Position */ +#define CLK_APBCLK_TMR1_EN_Msk (1ul << CLK_APBCLK_TMR1_EN_Pos) /*!< CLK_T::APBCLK: TMR1_EN Mask */ + +#define CLK_APBCLK_TMR0_EN_Pos 2 /*!< CLK_T::APBCLK: TMR0_EN Position */ +#define CLK_APBCLK_TMR0_EN_Msk (1ul << CLK_APBCLK_TMR0_EN_Pos) /*!< CLK_T::APBCLK: TMR0_EN Mask */ + +#define CLK_APBCLK_WDT_EN_Pos 0 /*!< CLK_T::APBCLK: WDT_EN Position */ +#define CLK_APBCLK_WDT_EN_Msk (1ul << CLK_APBCLK_WDT_EN_Pos) /*!< CLK_T::APBCLK: WDT_EN Mask */ + + +/* CLK CLKSTATUS Bit Field Definitions */ +#define CLK_CLKSTATUS_CLK_SW_FAIL_Pos 7 /*!< CLK_T::CLKSTATUS: CLK_SW_FAIL Position */ +#define CLK_CLKSTATUS_CLK_SW_FAIL_Msk (1ul << CLK_CLKSTATUS_CLK_SW_FAIL_Pos) /*!< CLK_T::CLKSTATUS: CLK_SW_FAIL Mask */ + +#define CLK_CLKSTATUS_OSC22M_STB_Pos 4 /*!< CLK_T::CLKSTATUS: OSC22M_STB Position */ +#define CLK_CLKSTATUS_OSC22M_STB_Msk (1ul << CLK_CLKSTATUS_OSC22M_STB_Pos) /*!< CLK_T::CLKSTATUS: OSC22M_STB Mask */ +#define CLK_CLKSTATUS_IRC22M_STB_Pos 4 /*!< CLK_T::CLKSTATUS: IRC22M_STB Position */ +#define CLK_CLKSTATUS_IRC22M_STB_Msk (1ul << CLK_CLKSTATUS_IRC22M_STB_Pos) /*!< CLK_T::CLKSTATUS: IRC22M_STB Mask */ + +#define CLK_CLKSTATUS_OSC10K_STB_Pos 3 /*!< CLK_T::CLKSTATUS: OSC10K_STB Position */ +#define CLK_CLKSTATUS_OSC10K_STB_Msk (1ul << CLK_CLKSTATUS_OSC10K_STB_Pos) /*!< CLK_T::CLKSTATUS: OSC10K_STB Mask */ +#define CLK_CLKSTATUS_IRC10K_STB_Pos 3 /*!< CLK_T::CLKSTATUS: IRC10K_STB Position */ +#define CLK_CLKSTATUS_IRC10K_STB_Msk (1ul << CLK_CLKSTATUS_IRC10K_STB_Pos) /*!< CLK_T::CLKSTATUS: IRC10K_STB Mask */ + +#define CLK_CLKSTATUS_PLL_STB_Pos 2 /*!< CLK_T::CLKSTATUS: PLL_STB Position */ +#define CLK_CLKSTATUS_PLL_STB_Msk (1ul << CLK_CLKSTATUS_PLL_STB_Pos) /*!< CLK_T::CLKSTATUS: PLL_STB Mask */ + +#define CLK_CLKSTATUS_XTL12M_STB_Pos 0 /*!< CLK_T::CLKSTATUS: XTL12M_STB Position */ +#define CLK_CLKSTATUS_XTL12M_STB_Msk (1ul << CLK_CLKSTATUS_XTL12M_STB_Pos) /*!< CLK_T::CLKSTATUS: XTL12M_STB Mask */ + +/* CLK CLKSEL0 Bit Field Definitions */ +#define CLK_CLKSEL0_STCLK_S_Pos 3 /*!< CLK_T::CLKSEL0: STCLK_S Position */ +#define CLK_CLKSEL0_STCLK_S_Msk (7ul << CLK_CLKSEL0_STCLK_S_Pos) /*!< CLK_T::CLKSEL0: STCLK_S Mask */ + +#define CLK_CLKSEL0_HCLK_S_Pos 0 /*!< CLK_T::CLKSEL0: HCLK_S Position */ +#define CLK_CLKSEL0_HCLK_S_Msk (7ul << CLK_CLKSEL0_HCLK_S_Pos) /*!< CLK_T::CLKSEL0: HCLK_S Mask */ + +/* CLK CLKSEL1 Bit Field Definitions */ +#define CLK_CLKSEL1_PWM23_S_Pos 30 /*!< CLK_T::CLKSEL1: PWM23_S Position */ +#define CLK_CLKSEL1_PWM23_S_Msk (3ul << CLK_CLKSEL1_PWM23_S_Pos) /*!< CLK_T::CLKSEL1: PWM23_S Mask */ + +#define CLK_CLKSEL1_PWM01_S_Pos 28 /*!< CLK_T::CLKSEL1: PWM01_S Position */ +#define CLK_CLKSEL1_PWM01_S_Msk (3ul << CLK_CLKSEL1_PWM01_S_Pos) /*!< CLK_T::CLKSEL1: PWM01_S Mask */ + +#define CLK_CLKSEL1_UART_S_Pos 24 /*!< CLK_T::CLKSEL1: UART_S Position */ +#define CLK_CLKSEL1_UART_S_Msk (3ul << CLK_CLKSEL1_UART_S_Pos) /*!< CLK_T::CLKSEL1: UART_S Mask */ + +#define CLK_CLKSEL1_TMR3_S_Pos 20 /*!< CLK_T::CLKSEL1: TMR3_S Position */ +#define CLK_CLKSEL1_TMR3_S_Msk (7ul << CLK_CLKSEL1_TMR3_S_Pos) /*!< CLK_T::CLKSEL1: TMR3_S Mask */ + +#define CLK_CLKSEL1_TMR2_S_Pos 16 /*!< CLK_T::CLKSEL1: TMR2_S Position */ +#define CLK_CLKSEL1_TMR2_S_Msk (7ul << CLK_CLKSEL1_TMR2_S_Pos) /*!< CLK_T::CLKSEL1: TMR2_S Mask */ + +#define CLK_CLKSEL1_TMR1_S_Pos 12 /*!< CLK_T::CLKSEL1: TMR1_S Position */ +#define CLK_CLKSEL1_TMR1_S_Msk (7ul << CLK_CLKSEL1_TMR1_S_Pos) /*!< CLK_T::CLKSEL1: TMR1_S Mask */ + +#define CLK_CLKSEL1_TMR0_S_Pos 8 /*!< CLK_T::CLKSEL1: TMR0_S Position */ +#define CLK_CLKSEL1_TMR0_S_Msk (7ul << CLK_CLKSEL1_TMR0_S_Pos) /*!< CLK_T::CLKSEL1: TMR0_S Mask */ + +#define CLK_CLKSEL1_SPI2_S_Pos 6 /*!< CLK_T::CLKSEL1: SPI2_S Position */ +#define CLK_CLKSEL1_SPI2_S_Msk (1ul << CLK_CLKSEL1_SPI2_S_Pos) /*!< CLK_T::CLKSEL1: SPI2_S Mask */ + +#define CLK_CLKSEL1_SPI1_S_Pos 5 /*!< CLK_T::CLKSEL1: SPI1_S Position */ +#define CLK_CLKSEL1_SPI1_S_Msk (1ul << CLK_CLKSEL1_SPI1_S_Pos) /*!< CLK_T::CLKSEL1: SPI1_S Mask */ + +#define CLK_CLKSEL1_SPI0_S_Pos 4 /*!< CLK_T::CLKSEL1: SPI0_S Position */ +#define CLK_CLKSEL1_SPI0_S_Msk (1ul << CLK_CLKSEL1_SPI0_S_Pos) /*!< CLK_T::CLKSEL1: SPI0_S Mask */ + +#define CLK_CLKSEL1_ADC_S_Pos 2 /*!< CLK_T::CLKSEL1: ADC_S Position */ +#define CLK_CLKSEL1_ADC_S_Msk (3ul << CLK_CLKSEL1_ADC_S_Pos) /*!< CLK_T::CLKSEL1: ADC_S Mask */ + +#define CLK_CLKSEL1_WDT_S_Pos 0 /*!< CLK_T::CLKSEL1: WDT_S Position */ +#define CLK_CLKSEL1_WDT_S_Msk (3ul << CLK_CLKSEL1_WDT_S_Pos) /*!< CLK_T::CLKSEL1: WDT_S Mask */ + +/* CLK CLKSEL2 Bit Field Definitions */ +#define CLK_CLKSEL2_WWDT_S_Pos 16 /*!< CLK_T::CLKSEL2: WWDT_S Position */ +#define CLK_CLKSEL2_WWDT_S_Msk (3ul << CLK_CLKSEL2_WWDT_S_Pos) /*!< CLK_T::CLKSEL2: WWDT_S Mask */ + +#define CLK_CLKSEL2_PWM23_S_E_Pos 9 /*!< CLK_T::CLKSEL2: PWM23_S_E Position */ +#define CLK_CLKSEL2_PWM23_S_E_Msk (1ul << CLK_CLKSEL2_PWM23_S_E_Pos) /*!< CLK_T::CLKSEL2: PWM23_S_E Mask */ +#define CLK_CLKSEL2_PWM23_S_EXT_Pos 9 /*!< CLK_T::CLKSEL2: PWM23_S_EXT Position */ +#define CLK_CLKSEL2_PWM23_S_EXT_Msk (1ul << CLK_CLKSEL2_PWM23_S_EXT_Pos) /*!< CLK_T::CLKSEL2: PWM23_S_EXT Mask */ + +#define CLK_CLKSEL2_PWM01_S_E_Pos 8 /*!< CLK_T::CLKSEL2: PWM01_S_E Position */ +#define CLK_CLKSEL2_PWM01_S_E_Msk (1ul << CLK_CLKSEL2_PWM01_S_E_Pos) /*!< CLK_T::CLKSEL2: PWM01_S_E Mask */ +#define CLK_CLKSEL2_PWM01_S_EXT_Pos 8 /*!< CLK_T::CLKSEL2: PWM01_S_EXT Position */ +#define CLK_CLKSEL2_PWM01_S_EXT_Msk (1ul << CLK_CLKSEL2_PWM01_S_EXT_Pos) /*!< CLK_T::CLKSEL2: PWM01_S_EXT Mask */ + +#define CLK_CLKSEL2_FRQDIV_S_Pos 2 /*!< CLK_T::CLKSEL2: FRQDIV_S Position */ +#define CLK_CLKSEL2_FRQDIV_S_Msk (3ul << CLK_CLKSEL2_FRQDIV_S_Pos) /*!< CLK_T::CLKSEL2: FRQDIV_S Mask */ + +#define CLK_CLKSEL2_I2S_S_Pos 0 /*!< CLK_T::CLKSEL2: I2S_S Position */ +#define CLK_CLKSEL2_I2S_S_Msk (3ul << CLK_CLKSEL2_I2S_S_Pos) /*!< CLK_T::CLKSEL2: I2S_S Mask */ + +/* CLK CLKDIV Bit Field Definitions */ +#define CLK_CLKDIV_ADC_N_Pos 16 /*!< CLK_T::CLKDIV: ADC_N Position */ +#define CLK_CLKDIV_ADC_N_Msk (0xFFul << CLK_CLKDIV_ADC_N_Pos) /*!< CLK_T::CLKDIV: ADC_N Mask */ + +#define CLK_CLKDIV_UART_N_Pos 8 /*!< CLK_T::CLKDIV: UART_N Position */ +#define CLK_CLKDIV_UART_N_Msk (0xFul << CLK_CLKDIV_UART_N_Pos) /*!< CLK_T::CLKDIV: UART_N Mask */ + +#define CLK_CLKDIV_USB_N_Pos 4 /*!< CLK_T::CLKDIV: USB_N Position */ +#define CLK_CLKDIV_USB_N_Msk (0xFul << CLK_CLKDIV_USB_N_Pos) /*!< CLK_T::CLKDIV: USB_N Mask */ + +#define CLK_CLKDIV_HCLK_N_Pos 0 /*!< CLK_T::CLKDIV: HCLK_N Position */ +#define CLK_CLKDIV_HCLK_N_Msk (0xFul << CLK_CLKDIV_HCLK_N_Pos) /*!< CLK_T::CLKDIV: HCLK_N Mask */ + +/* CLK PLLCON Bit Field Definitions */ +#define CLK_PLLCON_PLL_SRC_Pos 19 /*!< CLK_T::PLLCON: PLL_SRC Position */ +#define CLK_PLLCON_PLL_SRC_Msk (1ul << CLK_PLLCON_PLL_SRC_Pos) /*!< CLK_T::PLLCON: PLL_SRC Mask */ + +#define CLK_PLLCON_OE_Pos 18 /*!< CLK_T::PLLCON: PLL_SRC Position */ +#define CLK_PLLCON_OE_Msk (1ul << CLK_PLLCON_OE_Pos) /*!< CLK_T::PLLCON: PLL_SRC Mask */ + +#define CLK_PLLCON_BP_Pos 17 /*!< CLK_T::PLLCON: OE Position */ +#define CLK_PLLCON_BP_Msk (1ul << CLK_PLLCON_BP_Pos) /*!< CLK_T::PLLCON: OE Mask */ + +#define CLK_PLLCON_PD_Pos 16 /*!< CLK_T::PLLCON: PD Position */ +#define CLK_PLLCON_PD_Msk (1ul << CLK_PLLCON_PD_Pos) /*!< CLK_T::PLLCON: PD Mask */ + +#define CLK_PLLCON_OUT_DV_Pos 14 /*!< CLK_T::PLLCON: OUT_DV Position */ +#define CLK_PLLCON_OUT_DV_Msk (3ul << CLK_PLLCON_OUT_DV_Pos) /*!< CLK_T::PLLCON: OUT_DV Mask */ + +#define CLK_PLLCON_IN_DV_Pos 9 /*!< CLK_T::PLLCON: IN_DV Position */ +#define CLK_PLLCON_IN_DV_Msk (0x1Ful << CLK_PLLCON_IN_DV_Pos) /*!< CLK_T::PLLCON: IN_DV Mask */ + +#define CLK_PLLCON_FB_DV_Pos 0 /*!< CLK_T::PLLCON: FB_DV Position */ +#define CLK_PLLCON_FB_DV_Msk (0x1FFul << CLK_PLLCON_FB_DV_Pos) /*!< CLK_T::PLLCON: FB_DV Mask */ + +/* CLK FRQDIV Bit Field Definitions */ +#define CLK_FRQDIV_DIVIDER_EN_Pos 4 /*!< CLK_T::FRQDIV: DIVIDER_EN Position */ +#define CLK_FRQDIV_DIVIDER_EN_Msk (1ul << CLK_FRQDIV_DIVIDER_EN_Pos) /*!< CLK_T::FRQDIV: DIVIDER_EN Mask */ + +#define CLK_FRQDIV_FSEL_Pos 0 /*!< CLK_T::FRQDIV: FRQDIV_FSEL Position */ +#define CLK_FRQDIV_FSEL_Msk (0xFul << CLK_FRQDIV_FSEL_Pos) /*!< CLK_T::FRQDIV: FRQDIV_FSEL Mask */ + +/* CLK APBDIV Bit Field Definitions */ +#define CLK_APBDIV_APBDIV_Pos 0 /*!< CLK_T::APBDIV: APBDIV Position */ +#define CLK_APBDIV_APBDIV_Msk (1ul << CLK_APBDIV_APBDIV_Pos) /*!< CLK_T::APBDIV: APBDIV Mask */ +/*@}*/ /* end of group REG_CLK_BITMASK */ +/*@}*/ /* end of group REG_CLK */ + + +/*----------------------------- Cyclic Redundancy Check (CRC) Controller -----------------------------*/ +/** @addtogroup REG_CRC Cyclic Redundancy Check Controller (CRC) + Memory Mapped Structure for Cyclic Redundancy Check + @{ + */ + +typedef struct +{ + + +/** + * @var CRC_T::CTL + * Offset: 0x00 CRC Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CRCCEN |CRC Channel Enable + * | | |0 = No effect. + * | | |1 = CRC operation Enabled. + * | | |Note1: When operating in CRC DMA mode (TRIG_EN (CRC_CTL[23]) = 1), if user clears this bit, the DMA operation will be continuous until all CRC DMA operation is done, and the TRIG_EN (CRC_CTL[23]) bit will keep 1until all CRC DMA operation done. + * | | |But in this case, the CRC_BLKD_IF (CRC_DMAISR[1])flag will inactive, user can read CRC checksum result only if TRIG_EN (CRC_CTL[23]) clears to 0. + * | | |Note2: When operating in CRC DMA mode (TRIG_EN (CRC_CTL[23]) = 1), if user wants to stop the transfer immediately, user can write 1 to CRC_RST (CRC_CTL [1]) bit to stop the transmission. + * |[1] |CRC_RST |CRC Engine Reset + * | | |0 = No effect. + * | | |1 = Reset the internal CRC state machine and internal buffer. + * | | |The others contents of CRC_CTL register will not be cleared. + * | | |This bit will be cleared automatically. + * | | |Note: When operated in CPU PIO mode, setting this bit will reload the initial seed value (CRC_SEED register). + * |[23] |TRIG_EN |Trigger Enable + * | | |This bit is used to trigger the CRC DMA transfer. + * | | |0 = No effect. + * | | |1 = CRC DMA data read or write transfer Enabled. + * | | |Note1: If this bit asserts which indicates the CRC engine operation in CRC DMA mode, do not fill in any data in CRC_WDATA register. + * | | |Note2: When CRC DMA transfer completed, this bit will be cleared automatically. + * | | |Note3: If the bus error occurs when CRC DMA transfer data, all CRC DMA transfer will be stopped. + * | | |Software must reset all DMA channel before trigger DMA again. + * |[24] |WDATA_RVS |Write Data Order Reverse + * | | |This bit is used to enable the bit order reverse function for write data value in CRC_WDATA register. + * | | |0 = Bit order reverse for CRC write data in Disabled. + * | | |1 = Bit order reverse for CRC write data in Enabled (per byre). + * | | |Note: If the write data is 0xAABBCCDD, the bit order reverse for CRC write data in is 0x55DD33BB + * |[25] |CHECKSUM_RVS|Checksum Reverse + * | | |This bit is used to enable the bit order reverse function for write data value in CRC_CHECKSUM register. + * | | |0 = Bit order reverse for CRC checksum Disabled. + * | | |1 = Bit order reverse for CRC checksum Enabled. + * | | |Note: If the checksum result is 0XDD7B0F2E, the bit order reverse for CRC checksum is 0x74F0DEBB + * |[26] |WDATA_COM |Write Data 1's Complement + * | | |This bit is used to enable the 1's complement function for write data value in CRC_WDATA register. + * | | |0 = 1's complement for CRC write data in Disabled. + * | | |1 = 1's complement for CRC write data in Enabled. + * |[27] |CHECKSUM_COM|Checksum 1's Complement + * | | |This bit is used to enable the 1's complement function for checksum result in CRC_CHECKSUM register. + * | | |0 = 1's complement for CRC checksum Disabled. + * | | |1 = 1's complement for CRC checksum Enabled. + * |[29:28] |CPU_WDLEN |CPU Write Data Length + * | | |This field indicates the CPU write data length only when operating in CPU PIO mode. + * | | |00 = The write data length is 8-bit mode. + * | | |01 = The write data length is 16-bit mode. + * | | |10 = The write data length is 32-bit mode. + * | | |11 = Reserved. + * | | |Note1: This field is only valid when operating in CPU PIO mode. + * | | |Note2: When the write data length is 8-bit mode, the valid data in CRC_WDATA register is only CRC_WDATA [7:0] bits; if the write data length is 16-bit mode, the valid data in CRC_WDATA register is only CRC_WDATA [15:0]. + * |[31:30] |CRC_MODE |CRC Polynomial Mode + * | | |This field indicates the CRC operation polynomial mode. + * | | |00 = CRC-CCITT Polynomial Mode. + * | | |01 = CRC-8 Polynomial Mode. + * | | |10 = CRC-16 Polynomial Mode. + * | | |11 = CRC-32 Polynomial Mode. + * @var CRC_T::DMASAR + * Offset: 0x04 CRC DMA Source Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CRC_DMASAR|CRC DMA Transfer Source Address Register + * | | |This field indicates a 32-bit source address of CRC DMA. + * | | |(CRC_DMASAR + CRC_DMABCR) = (CRC_DMACSAR + CRC_DMACBCR). + * | | |Note: The source address must be word alignment + * @var CRC_T::DMABCR + * Offset: 0x0C CRC DMA Transfer Byte Count Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CRC_DMABCR|CRC DMA Transfer Byte Count Register + * | | |This field indicates a 16-bit total transfer byte count number of CRC DMA + * | | |(CRC_DMASAR + CRC_DMABCR) = (CRC_DMACSAR + CRC_DMACBCR). + * @var CRC_T::DMACSAR + * Offset: 0x14 CRC DMA Current Source Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CRC_DMACSAR|CRC DMA Current Source Address Register (Read Only) + * | | |This field indicates the current source address where the CRC DMA transfer just occurs. + * | | |(CRC_DMASAR + CRC_DMABCR) = (CRC_DMACSAR + CRC_DMACBCR). + * @var CRC_T::DMACBCR + * Offset: 0x1C CRC DMA Current Transfer Byte Count Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CRC_DMACBCR|CRC DMA Current Remained Byte Count Register (Read Only) + * | | |This field indicates the current remained byte count of CRC DMA. + * | | |(CRC_DMASAR + CRC_DMABCR) = (CRC_DMACSAR + CRC_DMACBCR). + * | | |Note: Setting CRC_RST (CRC_CTL[1]) bit to 1 will clear this register value. + * @var CRC_T::DMAIER + * Offset: 0x20 CRC DMA Interrupt Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CRC_TABORT_IE|CRC DMA Read/Write Target Abort Interrupt Enable + * | | |Enable this bit will generate the CRC DMA Target Abort interrupt signal while CRC_TARBOT_IF (CRC_DMAISR[0]) bit is set to 1. + * | | |0 = Target abort interrupt generation Disabled during CRC DMA transfer. + * | | |1 = Target abort interrupt generation Enabled during CRC DMA transfer. + * |[1] |CRC_BLKD_IE|CRC DMA Block Transfer Done Interrupt Enable + * | | |Enable this bit will generate the CRC DMA Transfer Done interrupt signal while CRC_BLKD_IF (CRC_DMAISR[1]) bit is set to 1. + * | | |0 = Interrupt generator Disabled when CRC DMA transfer done. + * | | |1 = Interrupt generator Enabled when CRC DMA transfer done. + * @var CRC_T::DMAISR + * Offset: 0x24 CRC DMA Interrupt Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CRC_TABORT_IF|CRC DMA Read/Write Target Abort Interrupt Flag + * | | |This bit indicates that CRC bus has error or not during CRC DMA transfer. + * | | |0 = No bus error response received during CRC DMA transfer. + * | | |1 = Bus error response received during CRC DMA transfer. + * | | |It is cleared by writing 1 to it through software. + * | | |Note: The bit filed indicate bus master received error response or not. + * | | |If bus master received error response, it means that CRC transfer target abort is happened. + * | | |DMA will stop transfer and respond this event to software then CRC state machine goes to IDLE state. + * | | |When target abort occurred, software must reset DMA before transfer those data again. + * |[1] |CRC_BLKD_IF|CRC DMA Block Transfer Done Interrupt Flag + * | | |This bit indicates that CRC DMA transfer has finished or not. + * | | |0 = Not finished if TRIG_EN (CRC_CTL[23]) bit has enabled. + * | | |1 = CRC transfer done if TRIG_EN (CRC_CTL[23]) bit has enabled. + * | | |It is cleared by writing 1 to it through software. + * | | |(When CRC DMA transfer done, TRIG_EN (CRC_CTL[23]) bit will be cleared automatically) + * @var CRC_T::WDATA + * Offset: 0x80 CRC Write Data Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CRC_WDATA |CRC Write Data Register + * | | |When operating in CPU PIO mode, software can write data to this field to perform CRC operation. + * | | |When operating in DMA mode, this field indicates the DMA read data from memory and cannot be written. + * | | |Note: When the write data length is 8-bit mode, the valid data in CRC_WDATA register is only CRC_WDATA [7:0] bits; if the write data length is 16-bit mode, the valid data in CRC_WDATA register is only CRC_WDATA [15:0]. + * @var CRC_T::SEED + * Offset: 0x84 CRC Seed Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CRC_SEED |CRC Seed Register + * | | |This field indicates the CRC seed value. + * @var CRC_T::CHECKSUM + * Offset: 0x88 CRC Checksum Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CRC_CHECKSUM|CRC Checksum Register + * | | |This fields indicates the CRC checksum result + */ + + __IO uint32_t CTL; /* Offset: 0x00 CRC Control Register */ + __IO uint32_t DMASAR; /* Offset: 0x04 CRC DMA Source Address Register */ + __I uint32_t RESERVED0; + __IO uint32_t DMABCR; /* Offset: 0x0C CRC DMA Transfer Byte Count Register */ + __I uint32_t RESERVED1; + __I uint32_t DMACSAR; /* Offset: 0x14 CRC DMA Current Source Address Register */ + __I uint32_t RESERVED2; + __I uint32_t DMACBCR; /* Offset: 0x1C CRC DMA Current Transfer Byte Count Register */ + __IO uint32_t DMAIER; /* Offset: 0x20 CRC DMA Interrupt Enable Register */ + __IO uint32_t DMAISR; /* Offset: 0x24 CRC DMA Interrupt Status Register */ + __I uint32_t RESERVED3[22]; + __IO uint32_t WDATA; /* Offset: 0x80 CRC Write Data Register */ + __IO uint32_t SEED; /* Offset: 0x84 CRC Seed Register */ + __I uint32_t CHECKSUM; /* Offset: 0x88 CRC Checksum Register */ + +} CRC_T; + + + +/** @addtogroup REG_CRC_BITMASK CRC Bit Mask + @{ + */ + +/* CRC CTL Bit Field Definitions */ +#define CRC_CTL_CRC_MODE_Pos 30 /*!< CRC_T::CTL: CRC_MODE Position */ +#define CRC_CTL_CRC_MODE_Msk (0x3ul << CRC_CTL_CRC_MODE_Pos) /*!< CRC_T::CTL: CRC_MODE Mask */ + +#define CRC_CTL_CPU_WDLEN_Pos 28 /*!< CRC_T::CTL: CPU_WDLEN Position */ +#define CRC_CTL_CPU_WDLEN_Msk (0x3ul << CRC_CTL_CPU_WDLEN_Pos) /*!< CRC_T::CTL: CPU_WDLEN Mask */ + +#define CRC_CTL_CHECKSUM_COM_Pos 27 /*!< CRC_T::CTL: CHECKSUM_COM Position */ +#define CRC_CTL_CHECKSUM_COM_Msk (1ul << CRC_CTL_CHECKSUM_COM_Pos) /*!< CRC_T::CTL: CHECKSUM_COM Mask */ + +#define CRC_CTL_WDATA_COM_Pos 26 /*!< CRC_T::CTL: WDATA_COM Position */ +#define CRC_CTL_WDATA_COM_Msk (1ul << CRC_CTL_WDATA_COM_Pos) /*!< CRC_T::CTL: WDATA_COM Mask */ + +#define CRC_CTL_CHECKSUM_RVS_Pos 25 /*!< CRC_T::CTL: CHECKSUM_RVS Position */ +#define CRC_CTL_CHECKSUM_RVS_Msk (1ul << CRC_CTL_CHECKSUM_RVS_Pos) /*!< CRC_T::CTL: CHECKSUM_RVS Mask */ + +#define CRC_CTL_WDATA_RVS_Pos 24 /*!< CRC_T::CTL: WDATA_RVS Position */ +#define CRC_CTL_WDATA_RVS_Msk (1ul << CRC_CTL_WDATA_RVS_Pos) /*!< CRC_T::CTL: WDATA_RVS Mask */ + +#define CRC_CTL_TRIG_EN_Pos 23 /*!< CRC_T::CTL: TRIG_EN Position */ +#define CRC_CTL_TRIG_EN_Msk (1ul << CRC_CTL_TRIG_EN_Pos) /*!< CRC_T::CTL: TRIG_EN Mask */ + +#define CRC_CTL_CRC_RST_Pos 1 /*!< CRC_T::CTL: CRC_RST Position */ +#define CRC_CTL_CRC_RST_Msk (1ul << CRC_CTL_CRC_RST_Pos) /*!< CRC_T::CTL: CRC_RST Mask */ + +#define CRC_CTL_CRCCEN_Pos 0 /*!< CRC_T::CTL: CRCCEN Position */ +#define CRC_CTL_CRCCEN_Msk (1ul << CRC_CTL_CRCCEN_Pos) /*!< CRC_T::CTL: CRCCEN Mask */ + +/* CRC DMASAR Bit Field Definitions */ +#define CRC_DMASAR_CRC_DMASAR_Pos 0 /*!< CRC_T::DMASAR: CRC_DMASAR Position */ +#define CRC_DMASAR_CRC_DMASAR_Msk (0xFFFFFFFFul << CRC_DMASAR_CRC_DMASAR_Pos) /*!< CRC_T::DMASAR: CRC_DMASAR Mask */ + +/* CRC DMABCR Bit Field Definitions */ +#define CRC_DMABCR_CRC_DMABCR_Pos 0 /*!< CRC_T::DMABCR: CRC_DMABCR Position */ +#define CRC_DMABCR_CRC_DMABCR_Msk (0xFFFFul << CRC_DMABCR_CRC_DMABCR_Pos) /*!< CRC_T::DMABCR: CRC_DMABCR Mask */ + +/* CRC DMACSAR Bit Field Definitions */ +#define CRC_DMACSAR_CRC_DMACSAR_Pos 0 /*!< CRC_T::DMACSAR: CRC_DMACSAR Position */ +#define CRC_DMACSAR_CRC_DMACSAR_Msk (0xFFFFFFFFul << CRC_DMACSAR_CRC_DMACSAR_Pos) /*!< CRC_T::DMACSAR: CRC_DMACSAR Mask */ + +/* CRC DMACBCR Bit Field Definitions */ +#define CRC_DMACBCR_CRC_DMACBCR_Pos 0 /*!< CRC_T::DMACBCR: DMACBCR Position */ +#define CRC_DMACBCR_CRC_DMACBCR_Msk (0xFFFFul << CRC_DMACBCR_CRC_DMACBCR_Pos) /*!< CRC_T::DMACBCR: DMACBCR Mask */ + +/* CRC DMAIER Bit Field Definitions */ +#define CRC_DMAIER_CRC_BLKD_IE_Pos 1 /*!< CRC_T::DMAIER: CRC_BLKD_IE Position */ +#define CRC_DMAIER_CRC_BLKD_IE_Msk (1ul << CRC_DMAIER_CRC_BLKD_IE_Pos) /*!< CRC_T::DMAIER: CRC_BLKD_IE Mask */ + +#define CRC_DMAIER_CRC_TABORT_IE_Pos 0 /*!< CRC_T::DMAIER: CRC_TABORT_IE Position */ +#define CRC_DMAIER_CRC_TABORT_IE_Msk (1ul << CRC_DMAIER_CRC_TABORT_IE_Pos) /*!< CRC_T::DMAIER: CRC_TABORT_IE Mask */ + +/* CRC DMAISR Bit Field Definitions */ +#define CRC_DMAISR_CRC_BLKD_IF_Pos 1 /*!< CRC_T::DMAISR: CRC_BLKD_IF Position */ +#define CRC_DMAISR_CRC_BLKD_IF_Msk (1ul << CRC_DMAISR_CRC_BLKD_IF_Pos) /*!< CRC_T::DMAISR: CRC_BLKD_IF Mask */ + +#define CRC_DMAISR_CRC_TABORT_IF_Pos 0 /*!< CRC_T::DMAISR: CRC_TABORT_IF Position */ +#define CRC_DMAISR_CRC_TABORT_IF_Msk (1ul << CRC_DMAISR_CRC_TABORT_IF_Pos) /*!< CRC_T::DMAISR: CRC_TABORT_IF Mask */ + +/* CRC WDATA Bit Field Definitions */ +#define CRC_WDATA_CRC_WDATA_Pos 0 /*!< CRC_T::WDATA: CRC_WDATA Position */ +#define CRC_WDATA_CRC_WDATA_Msk (0xFFFFFFFFul << CRC_WDATA_CRC_WDATA_Pos) /*!< CRC_T::WDATA: CRC_WDATA Mask */ + +/* CRC SEED Bit Field Definitions */ +#define CRC_SEED_CRC_SEED_Pos 0 /*!< CRC_T::SEED: CRC_SEED Position */ +#define CRC_SEED_CRC_SEED_Msk (0xFFFFFFFFul << CRC_SEED_CRC_SEED_Pos) /*!< CRC_T::SEED: CRC_SEED Mask */ + +/* CRC CHECKSUM Bit Field Definitions */ +#define CRC_CHECKSUM_CRC_CHECKSUM_Pos 0 /*!< CRC_T::CHECKSUM: CRC_CHECKSUM Position */ +#define CRC_CHECKSUM_CRC_CHECKSUM_Msk (0xFFFFFFFFul << CRC_CHECKSUM_CRC_CHECKSUM_Pos) /*!< CRC_T::CHECKSUM: CRC_CHECKSUM Mask */ +/*@}*/ /* end of group REG_CRC_BITMASK */ +/*@}*/ /* end of group REG_CRC */ + +/*-------------------------- FLASH Memory Controller -------------------------*/ +/** @addtogroup REG_FMC Flash Memory Controller (FMC) + Memory Mapped Structure for Flash Memory Controller + @{ + */ + +typedef struct +{ + + +/** + * @var FMC_T::ISPCON + * Offset: 0x00 ISP Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ISPEN |ISP Enable + * | | |This bit is protected bit. ISP function enable bit. Set this bit to enable ISP function. + * | | |1 = Enable ISP function + * | | |0 = Disable ISP function + * |[1] |BS |Boot Select + * | | |This bit is protected bit. Set/clear this bit to select next booting from LDROM/APROM, + * | | |respectively. This bit also functions as MCU booting status flag, which can be used to check where + * | | |MCU booted from. This bit is initiated with the inverted value of CBS in Config0 after power- + * | | |on reset; It keeps the same value at other reset. + * | | |1 = boot from LDROM + * | | |0 = boot from APROM + * |[4] |CFGUEN |Config Update Enable + * | | |Writing this bit to 1 enables s/w to update Config value by ISP procedure regardless of program + * | | |code is running in APROM or LDROM. + * | | |1 = Config update enable + * | | |0 = Config update disable + * |[5] |LDUEN |LDROM Update Enable + * | | |LDROM update enable bit. + * | | |1 = LDROM can be updated when the MCU runs in APROM. + * | | |0 = LDROM cannot be updated + * |[6] |ISPFF |ISP Fail Flag + * | | |This bit is set by hardware when a triggered ISP meets any of the following conditions: + * | | |(1) APROM writes to itself. + * | | |(2) LDROM writes to itself. + * | | |(3) Destination address is illegal, such as over an available range. + * | | |Write 1 to clear. + * |[7] |SWRST |Software Reset + * | | |Writing 1 to this bit to start software reset. + * | | |It is cleared by hardware after reset is finished. + * @var FMC_T::ISPADR + * Offset: 0x04 ISP Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |ISPADR |ISP Address + * | | |it supports word program only. ISPARD[1:0] must be kept 2'b00 for ISP operation. + * @var FMC_T::ISPDAT + * Offset: 0x08 ISP Data Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |ISPDAT |ISP Data + * | | |Write data to this register before ISP program operation + * | | |Read data from this register after ISP read operation + * @var FMC_T::ISPCMD + * Offset: 0x0C ISP Command Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |ISPCMD |ISP Command + * | | |ISP command table is shown below: + * | | |0x00 = Read. + * | | |0x21 = Program. + * | | |0x22 = Page Erase. + * @var FMC_T::ISPTRG + * Offset: 0x10 ISP Trigger Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ISPGO |ISP start trigger + * | | |Write 1 to start ISP operation and this bit will be cleared to 0 by hardware automatically when ISP + * | | |operation is finish. + * | | |1 = ISP is on going + * | | |0 = ISP done + * @var FMC_T::DFBADR + * Offset: 0x14 Data Flash Base Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DFBA |Data Flash Base Address + * | | |This register indicates data flash start address. + * | | |It is a read only register. + * | | |For 8/16/32/64kB flash memory device, the data flash size is 4kB and it start address is fixed at + * | | |0x01F000 by hardware internally. + * @var FMC_T::FATCON + * Offset: 0x18 Flash Access Time Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |FPSEN |Flash Power Save Enable + * | | |If CPU clock is slower than 24 MHz, then s/w can enable flash power saving function. + * | | |1 = Enable flash power saving + * | | |0 = Disable flash power saving + * |[4] |L_SPEED |Flash Low Speed Mode Enable + * | | |1 = Flash access always no wait state (zero wait state) + * | | |0 = Insert wait state while Flash access discontinued address. + * | | |Note: Set this bit only when HCLK <= 25MHz. If HCLK > 25MHz, CPU will fetch wrong + * | | |code and cause fail result. + * @var FMC_T::ISPSTA + * Offset: 0x40 ISP Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ISPGO |ISP Start Trigger (Read Only) + * | | |Write 1 to start ISP operation and this bit will be cleared to 0 by hardware + * | | |automatically when ISP operation is finished. + * | | |0 = ISP operation finished. + * | | |1 = ISP operation progressed. + * | | |Note: This bit is the same as ISPTRG bit0 + * |[2:1] |CBS |Chip Boot Selection (Read Only) + * | | |This is a mirror of CBS in Config0. + * |[6] |ISPFF |ISP Fail Flag (Write-protection Bit) + * | | |This bit is set by hardware when a triggered ISP meets any of the following conditions: + * | | |(1) APROM writes to itself. + * | | |(2) LDROM writes to itself. + * | | |(3) CONFIG is erased/programmed when CFGUEN is set to 0 + * | | |(4) Destination address is illegal, such as over an available range. + * |[20:9] |VECMAP |Vector Page Mapping Address (Read Only) + * | | |The current flash address space 0x0000_0000~0x0000_01FF is mapping to the address + * | | |{VECMAP[11:0], 9'h000} ~ {VECMAP[11:0], 9'h1FF} + */ + + __IO uint32_t ISPCON; /* Offset: 0x00 ISP Control Register */ + __IO uint32_t ISPADR; /* Offset: 0x04 ISP Address Register */ + __IO uint32_t ISPDAT; /* Offset: 0x08 ISP Data Register */ + __IO uint32_t ISPCMD; /* Offset: 0x0C ISP Command Register */ + __IO uint32_t ISPTRG; /* Offset: 0x10 ISP Trigger Control Register */ + __I uint32_t DFBADR; /* Offset: 0x14 Data Flash Base Address Register */ + __IO uint32_t FATCON; /* Offset: 0x18 Flash Access Time Control Register */ + __I uint32_t RESERVED[9]; + __IO uint32_t ISPSTA; /* Offset: 0x40 ISP Status Register */ + +} FMC_T; + + + +/** @addtogroup REG_FMC_BITMASK FMC Bit Mask + @{ + */ + +/* FMC ISPCON Bit Field Definitions */ +#define FMC_ISPCON_ET_Pos 12 /*!< FMC_T::ISPCON: ET Position */ +#define FMC_ISPCON_ET_Msk (7ul << FMC_ISPCON_ET_Pos) /*!< FMC_T::ISPCON: ET Mask */ + +#define FMC_ISPCON_PT_Pos 8 /*!< FMC_T::ISPCON: PT Position */ +#define FMC_ISPCON_PT_Msk (7ul << FMC_ISPCON_PT_Pos) /*!< FMC_T::ISPCON: PT Mask */ + +#define FMC_ISPCON_ISPFF_Pos 6 /*!< FMC_T::ISPCON: ISPFF Position */ +#define FMC_ISPCON_ISPFF_Msk (1ul << FMC_ISPCON_ISPFF_Pos) /*!< FMC_T::ISPCON: ISPFF Mask */ + +#define FMC_ISPCON_LDUEN_Pos 5 /*!< FMC_T::ISPCON: LDUEN Position */ +#define FMC_ISPCON_LDUEN_Msk (1ul << FMC_ISPCON_LDUEN_Pos) /*!< FMC_T::ISPCON: LDUEN Mask */ + +#define FMC_ISPCON_CFGUEN_Pos 4 /*!< FMC_T::ISPCON: CFGUEN Position */ +#define FMC_ISPCON_CFGUEN_Msk (1ul << FMC_ISPCON_CFGUEN_Pos) /*!< FMC_T::ISPCON: CFGUEN Mask */ + +#define FMC_ISPCON_APUEN_Pos 3 /*!< FMC_T::ISPCON: APUEN Position */ +#define FMC_ISPCON_APUEN_Msk (1ul << FMC_ISPCON_APUEN_Pos) /*!< FMC_T::ISPCON: APUEN Mask */ + +#define FMC_ISPCON_BS_Pos 1 /*!< FMC_T::ISPCON: BS Position */ +#define FMC_ISPCON_BS_Msk (0x1ul << FMC_ISPCON_BS_Pos) /*!< FMC_T::ISPCON: BS Mask */ + +#define FMC_ISPCON_ISPEN_Pos 0 /*!< FMC_T::ISPCON: ISPEN Position */ +#define FMC_ISPCON_ISPEN_Msk (1ul << FMC_ISPCON_ISPEN_Pos) /*!< FMC_T::ISPCON: ISPEN Mask */ + +/* FMC ISPADR Bit Field Definitions */ +#define FMC_ISPADR_ISPADR_Pos 0 /*!< FMC_T::ISPADR: ISPADR Position */ +#define FMC_ISPADR_ISPADR_Msk (0xFFFFFFFFul << FMC_ISPADR_ISPADR_Pos) /*!< FMC_T::ISPADR: ISPADR Mask */ + +/* FMC ISPADR Bit Field Definitions */ +#define FMC_ISPDAT_ISPDAT_Pos 0 /*!< FMC_T::ISPDAT: ISPDAT Position */ +#define FMC_ISPDAT_ISPDAT_Msk (0xFFFFFFFFul << FMC_ISPDAT_ISPDAT_Pos) /*!< FMC_T::ISPDAT: ISPDAT Mask */ + +/* FMC ISPCMD Bit Field Definitions */ +#define FMC_ISPCMD_FOEN_Pos 5 /*!< FMC_T::ISPCMD: FOEN Position */ +#define FMC_ISPCMD_FOEN_Msk (1ul << FMC_ISPCMD_FOEN_Pos) /*!< FMC_T::ISPCMD: FOEN Mask */ + +#define FMC_ISPCMD_FCEN_Pos 4 /*!< FMC_T::ISPCMD: FCEN Position */ +#define FMC_ISPCMD_FCEN_Msk (1ul << FMC_ISPCMD_FCEN_Pos) /*!< FMC_T::ISPCMD: FCEN Mask */ + +#define FMC_ISPCMD_FCTRL_Pos 0 /*!< FMC_T::ISPCMD: FCTRL Position */ +#define FMC_ISPCMD_FCTRL_Msk (0xFul << FMC_ISPCMD_FCTRL_Pos) /*!< FMC_T::ISPCMD: FCTRL Mask */ + +/* FMC ISPTRG Bit Field Definitions */ +#define FMC_ISPTRG_ISPGO_Pos 0 /*!< FMC_T::ISPTRG: ISPGO Position */ +#define FMC_ISPTRG_ISPGO_Msk (1ul << FMC_ISPTRG_ISPGO_Pos) /*!< FMC_T::ISPTRG: ISPGO Mask */ + +/* FMC DFBADR Bit Field Definitions */ +#define FMC_DFBADR_DFBA_Pos 0 /*!< FMC_T::DFBADR: DFBA Position */ +#define FMC_DFBADR_DFBA_Msk (0xFFFFFFFFul << FMC_DFBADR_DFBA_Pos) /*!< FMC_T::DFBADR: DFBA Mask */ + +/* FMC FATCON Bit Field Definitions */ +#define FMC_FATCON_FOMSEL1_Pos 6 /*!< FMC_T::FATCON: FOMSEL1 Position */ +#define FMC_FATCON_FOMSEL1_Msk (1ul << FMC_FATCON_FOMSEL1_Pos) /*!< FMC_T::FATCON: FOMSEL1 Mask */ + +#define FMC_FATCON_FOMSEL0_Pos 4 /*!< FMC_T::FATCON: FOMSEL0 Position */ +#define FMC_FATCON_FOMSEL0_Msk (1ul << FMC_FATCON_FOMSEL0_Pos) /*!< FMC_T::FATCON: FOMSEL0 Mask */ + +#define FMC_FATCON_FATS_Pos 1 /*!< FMC_T::FATCON: FATS Position */ +#define FMC_FATCON_FATS_Msk (7ul << FMC_FATCON_FATS_Pos) /*!< FMC_T::FATCON: FATS Mask */ + +#define FMC_FATCON_FPSEN_Pos 0 /*!< FMC_T::FATCON: FPSEN Position */ +#define FMC_FATCON_FPSEN_Msk (1ul << FMC_FATCON_FPSEN_Pos) /*!< FMC_T::FATCON: FPSEN Mask */ + + +#define FMC_ISPSTA_ISPGO_Pos 0 /*!< FMC_T::ISPSTA: ISPGO Position */ +#define FMC_ISPSTA_ISPGO_Msk (1ul << FMC_ISPSTA_ISPGO_Pos) /*!< FMC_T::ISPSTA: ISPGO Mask */ + +#define FMC_ISPSTA_CBS_Pos 1 /*!< FMC_T::ISPSTA: CBS Position */ +#define FMC_ISPSTA_CBS_Msk (0x3ul << FMC_ISPSTA_CBS_Pos) /*!< FMC_T::ISPSTA: CBS Mask */ + +#define FMC_ISPSTA_ISPFF_Pos 6 /*!< FMC_T::ISPSTA: ISPFF Position */ +#define FMC_ISPSTA_ISPFF_Msk (0x3ul << FMC_ISPSTA_ISPFF_Pos) /*!< FMC_T::ISPSTA: ISPFF Mask */ + +#define FMC_ISPSTA_VECMAP_Pos 9 /*!< FMC_T::ISPSTA: VECMAP Position */ +#define FMC_ISPSTA_VECMAP_Msk (0xFFFul << FMC_ISPSTA_VECMAP_Pos) /*!< FMC_T::ISPSTA: VECMAP Mask */ + +/*@}*/ /* end of group REG_FMC_BITMASK */ +/*@}*/ /* end of group REG_FMC */ + + + +/*--------------------- General Purpose I/O (GPIO) ---------------------*/ +/** @addtogroup REG_GPIO General Purpose Input/Output Controller (GPIO) + Memory Mapped Structure for General Purpose I/O + @{ + */ + +typedef struct +{ + + +/** + * @var GPIO_T::PMD + * Offset: 0x00/0x40/0x80/0xC0/0x140 GPIO Port [A/B/C/D/F] Pin I/O Mode Control + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2n+1:2n]|PMDn |GPIOx I/O Pin[n] Mode Control + * | | |Determine each I/O mode of GPIOx pins. + * | | |00 = GPIO port [n] pin is in Input mode. + * | | |01 = GPIO port [n] pin is in Push-pull Output mode. + * | | |10 = GPIO port [n] pin is in Open-drain Output mode. + * | | |11 = GPIO port [n] pin is in Quasi-bidirectional mode. + * | | |Note: + * | | |n = 10~15 for port A. Others are reserved. + * | | |n = 0~10, 12~15 for port B. Others are reserved. + * | | |n = 0~5, 8~13 for port C. Others are reserved. + * | | |n = 0~5, 8~11 for port D. Others are reserved. + * | | |n = 0~3 for port F. Others are reserved. + * @var GPIO_T::OFFD + * Offset: 0x04/0x44/0x84/0xC4/0x144 GPIO Port [A/B/C/D/F] Pin Digital Input Path Disable Control + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[[n+16]]|OFFDn |GPIOx Pin[n] Digital Input Path Disable Control + * | | |Each of these bits is used to control if the digital input path of corresponding GPIO pin is disabled. + * | | |If input is analog signal, users can disable GPIO digital input path to avoid current leakage. + * | | |0 = I/O digital input path Enabled. + * | | |1 = I/O digital input path Disabled (digital input tied to low). + * | | |Note: + * | | |n = 10~15 for port A. Others are reserved. + * | | |n = 0~10, 12~15 for port B. Others are reserved. + * | | |n = 0~5, 8~13 for port C. Others are reserved. + * | | |n = 0~5, 8~11 for port D. Others are reserved. + * | | |n = 0~3 for port F. Others are reserved. + * @var GPIO_T::DOUT + * Offset: 0x08/0x48/0x88/0xC8/0x148 GPIO Port [A/B/C/D/F] Data Output Value + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[n] |DOUTn |GPIOx Pin[n] Output Value + * | | |Each of these bits controls the status of a Px.n pin when the Px.n is configured as Push-pull output, Open-drain output or Quasi-bidirectional mode. + * | | |0 = Px.n will drive Low if the Px.n pin is configured as Push-pull output, Open-drain output or Quasi-bidirectional mode. + * | | |1 = Px.n will drive High if the Px.n pin is configured as Push-pull output or Quasi-bidirectional mode. + * | | |Note: + * | | |n = 10~15 for port A. Others are reserved. + * | | |n = 0~10, 12~15 for port B. Others are reserved. + * | | |n = 0~5, 8~13 for port C. Others are reserved. + * | | |n = 0~5, 8~11 for port D. Others are reserved. + * | | |n = 0~3 for port F. Others are reserved. + * @var GPIO_T::DMASK + * Offset: 0x0C/0x4C/0x8C/0xCC/0x14C GPIO Port [A/B/C/D/F] Data Output Write Mask + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[n] |DMASKn |GPIOx Pin[n] Data Output Write Mask + * | | |These bits are used to protect the corresponding DOUT (GPIOx_DOUT[n]) bit. + * | | |When the DATMSK (GPIOx _DATMSK[n]) bit is set to 1, the corresponding DOUT (GPIOx _DOUT[n]) bit is protected. + * | | |If the write signal is masked, writing data to the protect bit is ignored. + * | | |0 = Corresponding DOUT (GPIOx_DOUT[n]) bit can be updated. + * | | |1 = Corresponding DOUT (GPIOx_DOUT[n]) bit protected. + * | | |Note1: This function only protect corresponding DOUT (GPIOx_DOUT[n]) bit, and will not protect corresponding bit control register GPIOxn_DOUT. + * | | |Note2: + * | | |n = 10~15 for port A. Others are reserved. + * | | |n = 0~10, 12~15 for port B. Others are reserved. + * | | |n = 0~5, 8~13 for port C. Others are reserved. + * | | |n = 0~5, 8~11 for port D. Others are reserved. + * | | |n = 0~3 for port F. Others are reserved. + * @var GPIO_T::PIN + * Offset: 0x10/0x50/0x90/0xD0/0x150 GPIO Port [A/B/C/D/F] Pin Value + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[n] |PINn |GPIOx Pin[n] Pin Values + * | | |Each bit of the register reflects the actual status of the respective GPIO pin. + * | | |If the bit is 1, it indicates the corresponding pin status is high, else the pin status is low. + * | | |Note: + * | | |n = 10~15 for port A. Others are reserved. + * | | |n = 0~10, 12~15 for port B. Others are reserved. + * | | |n = 0~5, 8~13 for port C. Others are reserved. + * | | |n = 0~5, 8~11 for port D. Others are reserved. + * | | |n = 0~3 for port F. Others are reserved. + * @var GPIO_T::DBEN + * Offset: 0x14/0x54/0x94/0xD4/0x154 GPIO Port [A/B/C/D/F] De-bounce Enable + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[n] |DBENn |GPIOx Pin[n] Input Signal De-Bounce Enable + * | | |The DBEN[n] bit is used to enable the de-bounce function for each corresponding bit. + * | | |If the input signal pulse width cannot be sampled by continuous two de-bounce sample cycle, the input signal transition is seen as the signal bounce and will not trigger the interrupt. + * | | |The de-bounce clock source is controlled by DBCLKSRC (DBNCECON [4]), one de-bounce sample cycle period is controlled by DBCLKSEL (DBNCECON [3:0]). + * | | |0 = Px.n de-bounce function Disabled. + * | | |1 = Px.n de-bounce function Enabled. + * | | |The de-bounce function is valid only for edge triggered interrupt. If the interrupt mode is level triggered, the de-bounce enable bit is ignored. + * | | |Note: + * | | |n = 10~15 for port A. Others are reserved. + * | | |n = 0~10, 12~15 for port B. Others are reserved. + * | | |n = 0~5, 8~13 for port C. Others are reserved. + * | | |n = 0~5, 8~11 for port D. Others are reserved. + * | | |n = 0~3 for port F. Others are reserved. + * @var GPIO_T::IMD + * Offset: 0x18/0x58/0x98/0xD8/0x158 GPIO Port [A/B/C/D/F] Interrupt Mode Control + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[n] |IMDn |GPIOx Pin[n] Edge Or Level Detection Interrupt Control + * | | |IMD[n] is used to control the interrupt is by level trigger or by edge trigger. + * | | |If the interrupt is by edge trigger, the trigger source can be controlled by de-bounce. + * | | |If the interrupt is by level trigger, the input source is sampled by one HCLK clock and generates the interrupt. + * | | |0 = Edge trigger interrupt. + * | | |1 = Level trigger interrupt. + * | | |If the pin is set as the level trigger interrupt, only one level can be set on the registers GPIOx_IEN. + * | | |If both levels to trigger interrupt are set, the setting is ignored and no interrupt will occur. + * | | |The de-bounce function is valid only for edge triggered interrupt. If the interrupt mode is level triggered, the de-bounce enable bit is ignored. + * | | |Note: + * | | |n = 10~15 for port A. Others are reserved. + * | | |n = 0~10, 12~15 for port B. Others are reserved. + * | | |n = 0~5, 8~13 for port C. Others are reserved. + * | | |n = 0~5, 8~11 for port D. Others are reserved. + * | | |n = 0~3 for port F. Others are reserved. + * @var GPIO_T::IEN + * Offset: 0x1C/0x5C/0x9C/0xDC/0x15C GPIO Port [A/B/C/D/F] Interrupt Enable + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[n] |IF_ENn |GPIOx Pin[n] Falling Edge or Low Level Interrupt Trigger Type Enable Bit + * | | |The IF_EN (GPIOx_IEN[n]) bit is used to enable the interrupt for each of the corresponding input Px.n pin. Set bit to 1 also enable the pin wake-up function. + * | | |When setting the IF_EN (Px_IEN[n]) bit to 1 : + * | | |If the interrupt is level trigger (IMD (GPIOx_IMD[n]) bit is set to 1), the input Px.n pin will generate the interrupt while this pin state is at low level. + * | | |If the interrupt is edge trigger(IMD (GPIOx_IMD[n]) bit is set to 0), the input Px.n pin will generate the interrupt while this pin state changed from high to low. + * | | |0 = Px.n level low or high to low interrupt Disabled. + * | | |1 = Px.n level low or high to low interrupt Enabled. + * | | |Note: + * | | |n = 10~15 for port A. Others are reserved. + * | | |n = 0~10, 12~15 for port B. Others are reserved. + * | | |n = 0~5, 8~13 for port C. Others are reserved. + * | | |n = 0~5, 8~11 for port D. Others are reserved. + * | | |n = 0~3 for port F. Others are reserved. + * |[n+16] |IR_ENn |GPIOx Pin[n] Rising Edge or High Level Interrupt Trigger Type Enable Bit + * | | |The IR_EN (GPIOx_IEN[n+16]) bit is used to enable the interrupt for each of the corresponding input Px.n pin. Set bit to 1 also enable the pin wake-up function. + * | | |When setting the IR_EN (GPIOx_IEN[n+16]) bit to 1 : + * | | |If the interrupt is level trigger (IMD (GPIOx_IMD[n]) bit is set to 1), the input Px.n pin will generate the interrupt while this pin state is at high level. + * | | |If the interrupt is edge trigger (IMD (Px_IMD[n]) bit is set to 0), the input Px.n pin will generate the interrupt while this pin state changed from low to high. + * | | |0 = Px.n level high or low to high interrupt Disabled. + * | | |1 = Px.n level high or low to high interrupt Enabled. + * | | |Note: + * | | |n = 10~15 for port A. Others are reserved. + * | | |n = 0~10, 12~15 for port B. Others are reserved. + * | | |n = 0~5, 8~13 for port C. Others are reserved. + * | | |n = 0~5, 8~11 for port D. Others are reserved. + * | | |n = 0~3 for port F. Others are reserved. + * @var GPIO_T::ISRC + * Offset: 0x20/0x60/0xA0/0xE0/0x160 GPIO Port [A/B/C/D/F] Interrupt Source Flag + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[n] |ISRCn |GPIOx Pin[n] Interrupt Source Flag + * | | |Read : + * | | |0 = No interrupt at Px.n. + * | | |1 = Px.n generates an interrupt. + * | | |Write : + * | | |0= No action. + * | | |1= Clear the corresponding pending interrupt. + * | | |Note: + * | | |n = 10~15 for port A. Others are reserved. + * | | |n = 0~10, 12~15 for port B. Others are reserved. + * | | |n = 0~5, 8~13 for port C. Others are reserved. + * | | |n = 0~5, 8~11 for port D. Others are reserved. + * | | |n = 0~3 for port F. Others are reserved. + */ + + __IO uint32_t PMD; /* Offset: 0x00/0x40/0x80/0xC0/0x140 GPIO Port [A/B/C/D/F] Pin I/O Mode Control */ + __IO uint32_t OFFD; /* Offset: 0x04/0x44/0x84/0xC4/0x144 GPIO Port [A/B/C/D/F] Pin Digital Input Path Disable Control */ + __IO uint32_t DOUT; /* Offset: 0x08/0x48/0x88/0xC8/0x148 GPIO Port [A/B/C/D/F] Data Output Value */ + __IO uint32_t DMASK; /* Offset: 0x0C/0x4C/0x8C/0xCC/0x14C GPIO Port [A/B/C/D/F] Data Output Write Mask */ + __I uint32_t PIN; /* Offset: 0x10/0x50/0x90/0xD0/0x150 GPIO Port [A/B/C/D/F] Pin Value */ + __IO uint32_t DBEN; /* Offset: 0x14/0x54/0x94/0xD4/0x154 GPIO Port [A/B/C/D/F] De-bounce Enable */ + __IO uint32_t IMD; /* Offset: 0x18/0x58/0x98/0xD8/0x158 GPIO Port [A/B/C/D/F] Interrupt Mode Control */ + __IO uint32_t IEN; /* Offset: 0x1C/0x5C/0x9C/0xDC/0x15C GPIO Port [A/B/C/D/F] Interrupt Enable */ + __IO uint32_t ISRC; /* Offset: 0x20/0x60/0xA0/0xE0/0x160 GPIO Port [A/B/C/D/F] Interrupt Source Flag */ + +} GPIO_T; + + + + +typedef struct +{ + + +/** + * @var GPIO_DBNCECON_T::DBNCECON + * Offset: 0x180 External Interrupt De-bounce Control + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |DBCLKSEL |De-Bounce Sampling Cycle Selection + * | | |0000 = Sample interrupt input once per 1 clocks. + * | | |0001 = Sample interrupt input once per 2 clocks. + * | | |0010 = Sample interrupt input once per 4 clocks. + * | | |0011 = Sample interrupt input once per 8 clocks. + * | | |0100 = Sample interrupt input once per 16 clocks. + * | | |0101 = Sample interrupt input once per 32 clocks. + * | | |0110 = Sample interrupt input once per 64 clocks. + * | | |0111 = Sample interrupt input once per 128 clocks. + * | | |1000 = Sample interrupt input once per 256 clocks. + * | | |1001 = Sample interrupt input once per 2*256 clocks. + * | | |1010 = Sample interrupt input once per 4*256clocks. + * | | |1011 = Sample interrupt input once per 8*256 clocks. + * | | |1100 = Sample interrupt input once per 16*256 clocks. + * | | |1101 = Sample interrupt input once per 32*256 clocks. + * | | |1110 = Sample interrupt input once per 64*256 clocks. + * | | |1111 = Sample interrupt input once per 128*256 clocks. + * |[4] |DBCLKSRC |De-Bounce Counter Clock Source Selection + * | | |0 = De-bounce counter clock source is the HCLK. + * | | |1 = De-bounce counter clock source is the internal 10 kHz low speed oscillator. + * |[5] |ICLK_ON |Interrupt Clock On Mode + * | | |0 = Edge detection circuit is active only if I/O pin corresponding GPIOx_IEN bit is set to 1. + * | | |1 = All I/O pins edge detection circuit is always active after reset. + * | | |It is recommended to turn off this bit to save system power if no special application concern. + */ + + __IO uint32_t DBNCECON; /* Offset: 0x180 External Interrupt De-bounce Control */ + +} GPIO_DBNCECON_T; + + + +/** @addtogroup REG_GPIO_BITMASK GPIO Bit Mask + @{ + */ + +/* GPIO PMD Bit Field Definitions */ +#define GPIO_PMD_PMD15_Pos 30 /*!< GPIO_T::PMD: PMD15 Position */ +#define GPIO_PMD_PMD15_Msk (0x3ul << GPIO_PMD_PMD15_Pos) /*!< GPIO_T::PMD: PMD15 Mask */ + +#define GPIO_PMD_PMD14_Pos 28 /*!< GPIO_T::PMD: PMD14 Position */ +#define GPIO_PMD_PMD14_Msk (0x3ul << GPIO_PMD_PMD14_Pos) /*!< GPIO_T::PMD: PMD14 Mask */ + +#define GPIO_PMD_PMD13_Pos 26 /*!< GPIO_T::PMD: PMD13 Position */ +#define GPIO_PMD_PMD13_Msk (0x3ul << GPIO_PMD_PMD13_Pos) /*!< GPIO_T::PMD: PMD13 Mask */ + +#define GPIO_PMD_PMD12_Pos 24 /*!< GPIO_T::PMD: PMD12 Position */ +#define GPIO_PMD_PMD12_Msk (0x3ul << GPIO_PMD_PMD12_Pos) /*!< GPIO_T::PMD: PMD12 Mask */ + +#define GPIO_PMD_PMD11_Pos 22 /*!< GPIO_T::PMD: PMD11 Position */ +#define GPIO_PMD_PMD11_Msk (0x3ul << GPIO_PMD_PMD11_Pos) /*!< GPIO_T::PMD: PMD11 Mask */ + +#define GPIO_PMD_PMD10_Pos 20 /*!< GPIO_T::PMD: PMD10 Position */ +#define GPIO_PMD_PMD10_Msk (0x3ul << GPIO_PMD_PMD10_Pos) /*!< GPIO_T::PMD: PMD10 Mask */ + +#define GPIO_PMD_PMD9_Pos 18 /*!< GPIO_T::PMD: PMD9 Position */ +#define GPIO_PMD_PMD9_Msk (0x3ul << GPIO_PMD_PMD9_Pos) /*!< GPIO_T::PMD: PMD9 Mask */ + +#define GPIO_PMD_PMD8_Pos 16 /*!< GPIO_T::PMD: PMD8 Position */ +#define GPIO_PMD_PMD8_Msk (0x3ul << GPIO_PMD_PMD8_Pos) /*!< GPIO_T::PMD: PMD8 Mask */ + +#define GPIO_PMD_PMD7_Pos 14 /*!< GPIO_T::PMD: PMD7 Position */ +#define GPIO_PMD_PMD7_Msk (0x3ul << GPIO_PMD_PMD7_Pos) /*!< GPIO_T::PMD: PMD7 Mask */ + +#define GPIO_PMD_PMD6_Pos 12 /*!< GPIO_T::PMD: PMD6 Position */ +#define GPIO_PMD_PMD6_Msk (0x3ul << GPIO_PMD_PMD6_Pos) /*!< GPIO_T::PMD: PMD6 Mask */ + +#define GPIO_PMD_PMD5_Pos 10 /*!< GPIO_T::PMD: PMD5 Position */ +#define GPIO_PMD_PMD5_Msk (0x3ul << GPIO_PMD_PMD5_Pos) /*!< GPIO_T::PMD: PMD5 Mask */ + +#define GPIO_PMD_PMD4_Pos 8 /*!< GPIO_T::PMD: PMD4 Position */ +#define GPIO_PMD_PMD4_Msk (0x3ul << GPIO_PMD_PMD4_Pos) /*!< GPIO_T::PMD: PMD4 Mask */ + +#define GPIO_PMD_PMD3_Pos 6 /*!< GPIO_T::PMD: PMD3 Position */ +#define GPIO_PMD_PMD3_Msk (0x3ul << GPIO_PMD_PMD3_Pos) /*!< GPIO_T::PMD: PMD3 Mask */ + +#define GPIO_PMD_PMD2_Pos 4 /*!< GPIO_T::PMD: PMD2 Position */ +#define GPIO_PMD_PMD2_Msk (0x3ul << GPIO_PMD_PMD2_Pos) /*!< GPIO_T::PMD: PMD2 Mask */ + +#define GPIO_PMD_PMD1_Pos 2 /*!< GPIO_T::PMD: PMD1 Position */ +#define GPIO_PMD_PMD1_Msk (0x3ul << GPIO_PMD_PMD1_Pos) /*!< GPIO_T::PMD: PMD1 Mask */ + +#define GPIO_PMD_PMD0_Pos 0 /*!< GPIO_T::PMD: PMD0 Position */ +#define GPIO_PMD_PMD0_Msk (0x3ul << GPIO_PMD_PMD0_Pos) /*!< GPIO_T::PMD: PMD0 Mask */ + +/* GPIO OFFD Bit Field Definitions */ +#define GPIO_OFFD_OFFD_Pos 16 /*!< GPIO_T::OFFD: OFFD Position */ +#define GPIO_OFFD_OFFD_Msk (0xFFFFul << GPIO_OFFD_OFFD_Pos) /*!< GPIO_T::OFFD: OFFD Mask */ + +/* GPIO DOUT Bit Field Definitions */ +#define GPIO_DOUT_DOUT_Pos 0 /*!< GPIO_T::DOUT: DOUT Position */ +#define GPIO_DOUT_DOUT_Msk (0xFFFFul << GPIO_DOUT_DOUT_Pos) /*!< GPIO_T::DOUT: DOUT Mask */ + +/* GPIO DMASK Bit Field Definitions */ +#define GPIO_DMASK_DMASK_Pos 0 /*!< GPIO_T::DMASK: DMASK Position */ +#define GPIO_DMASK_DMASK_Msk (0xFFFFul << GPIO_DMASK_DMASK_Pos) /*!< GPIO_T::DMASK: DMASK Mask */ + +/* GPIO PIN Bit Field Definitions */ +#define GPIO_PIN_PIN_Pos 0 /*!< GPIO_T::PIN: PIN Position */ +#define GPIO_PIN_PIN_Msk (0xFFFFul << GPIO_PIN_PIN_Pos) /*!< GPIO_T::PIN: PIN Mask */ + +/* GPIO DBEN Bit Field Definitions */ +#define GPIO_DBEN_DBEN_Pos 0 /*!< GPIO_T::DBEN: DBEN Position */ +#define GPIO_DBEN_DBEN_Msk (0xFFFFul << GPIO_DBEN_DBEN_Pos) /*!< GPIO_T::DBEN: DBEN Mask */ + +/* GPIO IMD Bit Field Definitions */ +#define GPIO_IMD_IMD_Pos 0 /*!< GPIO_T::IMD: IMD Position */ +#define GPIO_IMD_IMD_Msk (0xFFFFul << GPIO_IMD_IMD_Pos) /*!< GPIO_T::IMD: IMD Mask */ + +/* GPIO IEN Bit Field Definitions */ +#define GPIO_IEN_IR_EN_Pos 16 /*!< GPIO_T::IEN: IR_EN Position */ +#define GPIO_IEN_IR_EN_Msk (0xFFFFul << GPIO_IEN_IR_EN_Pos) /*!< GPIO_T::IEN: IR_EN Mask */ + +#define GPIO_IEN_IF_EN_Pos 0 /*!< GPIO_T::IEN: IF_EN Position */ +#define GPIO_IEN_IF_EN_Msk (0xFFFFul << GPIO_IEN_IF_EN_Pos) /*!< GPIO_T::IEN: IF_EN Mask */ + +/* GPIO ISRC Bit Field Definitions */ +#define GPIO_ISRC_ISRC_Pos 0 /*!< GPIO_T::ISRC: ISRC Position */ +#define GPIO_ISRC_ISRC_Msk (0xFFFFul << GPIO_ISRC_ISRC_Pos) /*!< GPIO_T::ISRC: ISRC Mask */ + +/* GPIO DBNCECON Bit Field Definitions */ +#define GPIO_DBNCECON_ICLK_ON_Pos 5 /*!< GPIO_DBNCECON_T::DBNCECON: ICLK_ON Position */ +#define GPIO_DBNCECON_ICLK_ON_Msk (1ul << GPIO_DBNCECON_ICLK_ON_Pos) /*!< GPIO_DBNCECON_T::DBNCECON: ICLK_ON Mask */ + +#define GPIO_DBNCECON_DBCLKSRC_Pos 4 /*!< GPIO_DBNCECON_T::DBNCECON: DBCLKSRC Position */ +#define GPIO_DBNCECON_DBCLKSRC_Msk (1ul << GPIO_DBNCECON_DBCLKSRC_Pos) /*!< GPIO_DBNCECON_T::DBNCECON: DBCLKSRC Mask */ + +#define GPIO_DBNCECON_DBCLKSEL_Pos 0 /*!< GPIO_DBNCECON_T::DBNCECON: DBCLKSEL Position */ +#define GPIO_DBNCECON_DBCLKSEL_Msk (0xFul << GPIO_DBNCECON_DBCLKSEL_Pos) /*!< GPIO_DBNCECON_T::DBNCECON: DBCLKSEL Mask */ +/*@}*/ /* end of group REG_GPIO_BITMASK */ +/*@}*/ /* end of group REG_GPIO */ + +/*------------------------------ I2C Controller ------------------------------*/ +/** @addtogroup REG_I2C Inter-IC Bus Controller (I2C) + Memory Mapped Structure for I2C Serial Interface Controller + @{ + */ + +typedef struct +{ + + +/** + * @var I2C_T::I2CON + * Offset: 0x00 I2C Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2] |AA |Assert Acknowledge Control + * | | |When AA =1 prior to address or data received, an acknowledged (low level to I2Cn_SDA) will be returned during the acknowledge clock pulse on the I2Cn_SCL line when 1.) A slave is acknowledging the address sent from master, 2.) The receiver devices are acknowledging the data sent by transmitter. + * | | |When AA=0 prior to address or data received, a Not acknowledged (high level to I2Cn_SDA) will be returned during the acknowledge clock pulse on the I2Cn_SCL line. + * |[3] |SI |I2C Interrupt Flag + * | | |When a new I2C state is present in the I2CSTATUS register, the SI flag is set by hardware, and if bit EI (I2CON [7]) is set, the I2C interrupt is requested. + * | | |SI must be cleared by software. + * | | |Clear SI by writing 1 to this bit. + * |[4] |STO |I2C STOP Control + * | | |In Master mode, setting STO to transmit a STOP condition to bus then I2C hardware will check the bus condition if a STOP condition is detected this bit will be cleared by hardware automatically. + * | | |In a slave mode, setting STO resets I2C hardware to the defined "not addressed" slave mode. + * | | |This means it is NO LONGER in the slave receiver mode to receive data from the master transmit device. + * |[5] |STA |I2C START Control + * | | |Setting STA to logic 1 to enter Master mode, the I2C hardware sends a START or repeat START condition to bus when the bus is free. + * |[6] |ENS1 |I2C Controller Enable + * | | |0 = Disabled. + * | | |1 = Enabled. + * | | |Set to enable I2C serial function controller. + * | | |When ENS1=1 the I2C serial function enables. + * | | |The multi-function pin function of I2Cn_SDA and I2Cn_SCL must set to I2C function first. + * |[7] |EI |Enable Interrupt + * | | |0 = I2C interrupt Disabled. + * | | |1 = I2C interrupt Enabled. + * @var I2C_T::I2CADDR0 + * Offset: 0x04 I2C Slave Address Register0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |GC |General Call Function + * | | |0 = General Call Function Disabled. + * | | |1 = General Call Function Enabled. + * |[7:1] |I2CADDR |I2C Address Register + * | | |The content of this register is irrelevant when I2C is in Master mode. + * | | |In the slave mode, the seven most significant bits must be loaded with the chip's own address. + * | | |The I2C hardware will react if either of the address is matched. + * @var I2C_T::I2CDAT + * Offset: 0x08 I2C Data Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |I2CDAT |I2C Data Register + * | | |Bit [7:0] is located with the 8-bit transferred data of I2C serial port. + * @var I2C_T::I2CSTATUS + * Offset: 0x0C I2C Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |I2CSTATUS |I2C Status Register + * | | |The status register of I2C: + * | | |The three least significant bits are always 0. + * | | |The five most significant bits contain the status code. + * | | |There are 26 possible status codes. + * | | |When I2CSTATUS contains F8H, no serial interrupt is requested. + * | | |All other I2CSTATUS values correspond to defined I2C states. + * | | |When each of these states is entered, a status interrupt is requested (SI = 1). + * | | |A valid status code is present in I2CSTATUS one cycle after SI is set by hardware and is still present one cycle after SI has been reset by software. + * | | |In addition, states 00H stands for a Bus Error. + * | | |A Bus Error occurs when a START or STOP condition is present at an illegal position in the formation frame. + * | | |Example of illegal position are during the serial transfer of an address byte, a data byte or an acknowledge bit. + * @var I2C_T::I2CLK + * Offset: 0x10 I2C Clock Divided Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |I2CLK |I2C clock divided Register + * | | |The I2C clock rate bits: Data Baud Rate of I2C = (system clock) / (4x (I2CLK+1)). + * | | |Note: The minimum value of I2CLK is 4. + * @var I2C_T::I2CTOC + * Offset: 0x14 I2C Time-out Counter Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |TIF |Time-out Flag + * | | |This bit is set by H/W when I2C time-out happened and it can interrupt CPU if I2C interrupt enable bit (EI) is set to 1. + * | | |Note: Write 1 to clear this bit. + * |[1] |DIV4 |Time-out Counter Input Clock Divided by 4 + * | | |0 = Disabled. + * | | |1 = Enabled. + * | | |When Enabled, The time-out period is extend 4 times. + * |[2] |ENTI |Time-out Counter Enable/Disable + * | | |0 = Disabled. + * | | |1 = Enabled. + * | | |When Enabled, the 14-bit time-out counter will start counting when SI is clear. + * | | |Setting flag SI to high will reset counter and re-start up counting after SI is cleared. + * @var I2C_T::I2CADDR1 + * Offset: 0x18 I2C Slave Address Register1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |GC |General Call Function + * | | |0 = General Call Function Disabled. + * | | |1 = General Call Function Enabled. + * |[7:1] |I2CADDR |I2C Address Register + * | | |The content of this register is irrelevant when I2C is in Master mode. + * | | |In the slave mode, the seven most significant bits must be loaded with the chip's own address. + * | | |The I2C hardware will react if either of the address is matched. + * @var I2C_T::I2CADDR2 + * Offset: 0x1C I2C Slave Address Register2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |GC |General Call Function + * | | |0 = General Call Function Disabled. + * | | |1 = General Call Function Enabled. + * |[7:1] |I2CADDR |I2C Address Register + * | | |The content of this register is irrelevant when I2C is in Master mode. + * | | |In the slave mode, the seven most significant bits must be loaded with the chip's own address. + * | | |The I2C hardware will react if either of the address is matched. + * @var I2C_T::I2CADDR3 + * Offset: 0x20 I2C Slave Address Register3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |GC |General Call Function + * | | |0 = General Call Function Disabled. + * | | |1 = General Call Function Enabled. + * |[7:1] |I2CADDR |I2C Address Register + * | | |The content of this register is irrelevant when I2C is in Master mode. + * | | |In the slave mode, the seven most significant bits must be loaded with the chip's own address. + * | | |The I2C hardware will react if either of the address is matched. + * @var I2C_T::I2CADM0 + * Offset: 0x24 I2C Slave Address Mask Register0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:1] |I2CADM |I2C Address Mask Register + * | | |0 = Mask Disabled (the received corresponding register bit should be exact the same as address register.). + * | | |1 = Mask Enabled (the received corresponding address bit is don't care.). + * | | |I2C bus controllers support multiple address recognition with four address mask register. + * | | |When the bit in the address mask register is set to one, it means the received corresponding address bit is don't-care. + * | | |If the bit is set to zero, that means the received corresponding register bit should be exact the same as address register. + * @var I2C_T::I2CADM1 + * Offset: 0x28 I2C Slave Address Mask Register1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:1] |I2CADM |I2C Address Mask Register + * | | |0 = Mask Disabled (the received corresponding register bit should be exact the same as address register.). + * | | |1 = Mask Enabled (the received corresponding address bit is don't care.). + * | | |I2C bus controllers support multiple address recognition with four address mask register. + * | | |When the bit in the address mask register is set to one, it means the received corresponding address bit is don't-care. + * | | |If the bit is set to zero, that means the received corresponding register bit should be exact the same as address register. + * @var I2C_T::I2CADM2 + * Offset: 0x2C I2C Slave Address Mask Register2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:1] |I2CADM |I2C Address Mask Register + * | | |0 = Mask Disabled (the received corresponding register bit should be exact the same as address register.). + * | | |1 = Mask Enabled (the received corresponding address bit is don't care.). + * | | |I2C bus controllers support multiple address recognition with four address mask register. + * | | |When the bit in the address mask register is set to one, it means the received corresponding address bit is don't-care. + * | | |If the bit is set to zero, that means the received corresponding register bit should be exact the same as address register. + * @var I2C_T::I2CADM3 + * Offset: 0x30 I2C Slave Address Mask Register3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:1] |I2CADM |I2C Address Mask Register + * | | |0 = Mask Disabled (the received corresponding register bit should be exact the same as address register.). + * | | |1 = Mask Enabled (the received corresponding address bit is don't care.). + * | | |I2C bus controllers support multiple address recognition with four address mask register. + * | | |When the bit in the address mask register is set to one, it means the received corresponding address bit is don't-care. + * | | |If the bit is set to zero, that means the received corresponding register bit should be exact the same as address register. + * @var I2C_T::I2CWKUPCON + * Offset: 0x3C I2C Wake-up Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |WKUPEN |I2C Wake-up Enable + * | | |0 = I2C wake-up function Disabled. + * | | |1= I2C wake-up function Enabled. + * @var I2C_T::I2CWKUPSTS + * Offset: 0x40 I2C Wake-up Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |WKUPIF |I2C Wake-up Flag + * | | |When chip is woken up from Power-down mode by I2C, this bit is set to 1. + * | | |Software can write 1 to clear this bit. + */ + + __IO uint32_t I2CON; /* Offset: 0x00 I2C Control Register */ + __IO uint32_t I2CADDR0; /* Offset: 0x04 I2C Slave Address Register0 */ + __IO uint32_t I2CDAT; /* Offset: 0x08 I2C Data Register */ + __I uint32_t I2CSTATUS; /* Offset: 0x0C I2C Status Register */ + __IO uint32_t I2CLK; /* Offset: 0x10 I2C Clock Divided Register */ + __IO uint32_t I2CTOC; /* Offset: 0x14 I2C Time-out Counter Register */ + __IO uint32_t I2CADDR1; /* Offset: 0x18 I2C Slave Address Register1 */ + __IO uint32_t I2CADDR2; /* Offset: 0x1C I2C Slave Address Register2 */ + __IO uint32_t I2CADDR3; /* Offset: 0x20 I2C Slave Address Register3 */ + __IO uint32_t I2CADM0; /* Offset: 0x24 I2C Slave Address Mask Register0 */ + __IO uint32_t I2CADM1; /* Offset: 0x28 I2C Slave Address Mask Register1 */ + __IO uint32_t I2CADM2; /* Offset: 0x2C I2C Slave Address Mask Register2 */ + __IO uint32_t I2CADM3; /* Offset: 0x30 I2C Slave Address Mask Register3 */ + __I uint32_t RESERVED[2]; + __IO uint32_t I2CWKUPCON; /* Offset: 0x3C I2C Wake-up Control Register */ + __IO uint32_t I2CWKUPSTS; /* Offset: 0x40 I2C Wake-up Status Register */ + +} I2C_T; + + + +/** @addtogroup REG_I2C_BITMASK I2C Bit Mask + @{ + */ + +/* I2C I2CON Bit Field Definitions */ +#define I2C_I2CON_EI_Pos 7 /*!< I2C_T::I2CON: EI Position */ +#define I2C_I2CON_EI_Msk (1ul << I2C_I2CON_EI_Pos) /*!< I2C_T::I2CON: EI Mask */ + +#define I2C_I2CON_ENS1_Pos 6 /*!< I2C_T::I2CON: ENS1 Position */ +#define I2C_I2CON_ENS1_Msk (1ul << I2C_I2CON_ENS1_Pos) /*!< I2C_T::I2CON: ENS1 Mask */ + +#define I2C_I2CON_STA_Pos 5 /*!< I2C_T::I2CON: STA Position */ +#define I2C_I2CON_STA_Msk (1ul << I2C_I2CON_STA_Pos) /*!< I2C_T::I2CON: STA Mask */ + +#define I2C_I2CON_STO_Pos 4 /*!< I2C_T::I2CON: STO Position */ +#define I2C_I2CON_STO_Msk (1ul << I2C_I2CON_STO_Pos) /*!< I2C_T::I2CON: STO Mask */ + +#define I2C_I2CON_SI_Pos 3 /*!< I2C_T::I2CON: SI Position */ +#define I2C_I2CON_SI_Msk (1ul << I2C_I2CON_SI_Pos) /*!< I2C_T::I2CON: SI Mask */ + +#define I2C_I2CON_AA_Pos 2 /*!< I2C_T::I2CON: AA Position */ +#define I2C_I2CON_AA_Msk (1ul << I2C_I2CON_AA_Pos) /*!< I2C_T::I2CON: AA Mask */ + +/* I2C I2CADDR Bit Field Definitions */ +#define I2C_I2CADDR_I2CADDR_Pos 1 /*!< I2C_T::I2CADDR1: I2CADDR Position */ +#define I2C_I2CADDR_I2CADDR_Msk (0x7Ful << I2C_I2CADDR_I2CADDR_Pos) /*!< I2C_T::I2CADDR1: I2CADDR Mask */ + +#define I2C_I2CADDR_GC_Pos 0 /*!< I2C_T::I2CADDR1: GC Position */ +#define I2C_I2CADDR_GC_Msk (1ul << I2C_I2CADDR_GC_Pos) /*!< I2C_T::I2CADDR1: GC Mask */ + +/* I2C I2CDAT Bit Field Definitions */ +#define I2C_I2CDAT_I2CDAT_Pos 0 /*!< I2C_T::I2CDAT: I2CDAT Position */ +#define I2C_I2CDAT_I2CDAT_Msk (0xFFul << I2C_I2CDAT_I2CDAT_Pos) /*!< I2C_T::I2CDAT: I2CDAT Mask */ + +/* I2C I2CSTATUS Bit Field Definitions */ +#define I2C_I2CSTATUS_I2CSTATUS_Pos 0 /*!< I2C_T::I2CSTATUS: I2CSTATUS Position */ +#define I2C_I2CSTATUS_I2CSTATUS_Msk (0xFFul << I2C_I2CSTATUS_I2CSTATUS_Pos) /*!< I2C_T::I2CSTATUS: I2CSTATUS Mask */ + +/* I2C I2CLK Bit Field Definitions */ +#define I2C_I2CLK_I2CLK_Pos 0 /*!< I2C_T::I2CLK: I2CLK Position */ +#define I2C_I2CLK_I2CLK_Msk (0xFFul << I2C_I2CLK_I2CLK_Pos) /*!< I2C_T::I2CLK: I2CLK Mask */ + +/* I2C I2CTOC Bit Field Definitions */ +#define I2C_I2CTOC_ENTI_Pos 2 /*!< I2C_T::I2CTOC: ENTI Position */ +#define I2C_I2CTOC_ENTI_Msk (1ul << I2C_I2CTOC_ENTI_Pos) /*!< I2C_T::I2CTOC: ENTI Mask */ + +#define I2C_I2CTOC_DIV4_Pos 1 /*!< I2C_T::I2CTOC: DIV4 Position */ +#define I2C_I2CTOC_DIV4_Msk (1ul << I2C_I2CTOC_DIV4_Pos) /*!< I2C_T::I2CTOC: DIV4 Mask */ + +#define I2C_I2CTOC_TIF_Pos 0 /*!< I2C_T::I2CTOC: TIF Position */ +#define I2C_I2CTOC_TIF_Msk (1ul << I2C_I2CTOC_TIF_Pos) /*!< I2C_T::I2CTOC: TIF Mask */ + +/* I2C I2CADM Bit Field Definitions */ +#define I2C_I2CADM_I2CADM_Pos 1 /*!< I2C_T::I2CADM0: I2CADM Position */ +#define I2C_I2CADM_I2CADM_Msk (0x7Ful << I2C_I2CADM_I2CADM_Pos) /*!< I2C_T::I2CADM0: I2CADM Mask */ + +/* I2C I2CWKUPCON Bit Field Definitions */ +#define I2C_I2CWKUPCON_WKUPEN_Pos 0 /*!< I2C_T::I2CWKUPCON: WKUPEN Position */ +#define I2C_I2CWKUPCON_WKUPEN_Msk (1ul << I2C_I2CWKUPCON_WKUPEN_Pos) /*!< I2C_T::I2CWKUPCON: WKUPEN Mask */ + +/* I2C I2CWKUPSTS Bit Field Definitions */ +#define I2C_I2CWKUPSTS_WKUPIF_Pos 0 /*!< I2C_T::I2CWKUPSTS: WKUPIF Position */ +#define I2C_I2CWKUPSTS_WKUPIF_Msk (1ul << I2C_I2CWKUPSTS_WKUPIF_Pos) /*!< I2C_T::I2CWKUPSTS: WKUPIF Mask */ +/*@}*/ /* end of group REG_I2C_BITMASK */ +/*@}*/ /* end of group REG_I2C */ + +/*----------------------------- I2S Controller -------------------------------*/ +/** @addtogroup REG_I2S Integrated Inter-chip Sound(I2S) + Memory Mapped Structure for I2S Interface Controller + @{ + */ + +typedef struct +{ + + +/** + * @var I2S_T::CON + * Offset: 0x00 I2S Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |I2SEN |I2S Controller Enable + * | | |0 = Disabled. + * | | |1 = Enabled. + * |[1] |TXEN |Transmit Enable + * | | |0 = Data transmit Disabled. + * | | |1 = Data transmit Enabled. + * |[2] |RXEN |Receive Enable + * | | |0 = Data receiving Disabled. + * | | |1 = Data receiving Enabled. + * |[3] |MUTE |Transmit Mute Enable + * | | |0 = Transmit data is shifted from buffer. + * | | |1 = Send zero on transmit channel. + * |[5:4] |WORDWIDTH |Word Width + * | | |00 = data is 8-bit word. + * | | |01 = data is 16-bit word. + * | | |10 = data is 24-bit word. + * | | |11 = data is 32-bit word. + * |[6] |MONO |Monaural Data + * | | |0 = Data is stereo format. + * | | |1 = Data is monaural format. + * |[7] |FORMAT |Data Format + * | | |0 = I2S data format. + * | | |1 = MSB justified data format. + * |[8] |SLAVE |Slave Mode + * | | |I2S can operate as master or slave. + * | | |For Master mode, I2SBCLK and I2SLRCLK pins are output mode and send bit clock from NuMicro NUC123 series to Audio CODEC chip. + * | | |In Slave mode, I2SBCLK and I2SLRCLK pins are input mode and I2SBCLK and I2SLRCLK signals are received from outer Audio CODEC chip. + * | | |0 = Master mode. + * | | |1 = Slave mode. + * |[11:9] |TXTH |Transmit FIFO Threshold Level + * | | |If the count of remaining data word (32 bits) in transmit FIFO is equal to or less than threshold level then TXTHF (I2SSTATUS[18]) is set. + * | | |000 = 0 word data in transmit FIFO. + * | | |001 = 1 word data in transmit FIFO. + * | | |010 = 2 words data in transmit FIFO. + * | | |011 = 3 words data in transmit FIFO. + * | | |100 = 4 words data in transmit FIFO. + * | | |101 = 5 words data in transmit FIFO. + * | | |110 = 6 words data in transmit FIFO. + * | | |111 = 7 words data in transmit FIFO. + * |[14:12] |RXTH |Receive FIFO Threshold Level + * | | |When the count of received data word(s) in buffer is equal to or higher than threshold level, RXTHF (I2SSTATUS[10]) will be set. + * | | |000 = 1 word data in receive FIFO. + * | | |001 = 2 word data in receive FIFO. + * | | |010 = 3 word data in receive FIFO. + * | | |011 = 4 word data in receive FIFO. + * | | |100 = 5 word data in receive FIFO. + * | | |101 = 6 word data in receive FIFO. + * | | |110 = 7 word data in receive FIFO. + * | | |111 = 8 word data in receive FIFO. + * |[15] |MCLKEN |Master Clock Enable + * | | |If MCLKEN is set to 1, I2S controller will generate master clock on I2S_MCLK pin for external audio devices. + * | | |0 = Master clock Disabled. + * | | |1 = Master clock Enabled. + * |[16] |RCHZCEN |Right Channel Zero Cross Detection Enable + * | | |If this bit is set to 1, when right channel data sign bit change or next shift data bits are all 0 then RZCF flag in I2SSTATUS register is set to 1. + * | | |This function is only available in transmit operation. + * | | |0 = Right channel zero cross detection Disabled. + * | | |1 = Right channel zero cross detection Enabled. + * |[17] |LCHZCEN |Left Channel Zero Cross Detection Enable + * | | |If this bit is set to 1, when left channel data sign bit changes or next shift data bits are all 0 then LZCF flag in I2SSTATUS register is set to 1. + * | | |This function is only available in transmit operation. + * | | |0 = Left channel zero cross detection Disabled. + * | | |1 = Left channel zero cross detection Enabled. + * |[18] |CLR_TXFIFO|Clear Transmit FIFO + * | | |Write 1 to clear transmit FIFO, internal pointer is reset to FIFO start point, and TX_LEVEL[3:0] returns to 0 and + * | | |transmit FIFO becomes empty but data in transmit FIFO is not changed. + * | | |This bit is cleared by hardware automatically. Returns 0 on read. + * |[19] |CLR_RXFIFO|Clear Receive FIFO + * | | |Write 1 to clear receive FIFO, internal pointer is reset to FIFO start point, and RX_LEVEL[3:0] returns 0 and receive FIFO becomes empty. + * | | |This bit is cleared by hardware automatically. Returns 0 on read. + * |[20] |TXDMA |Enable Transmit DMA + * | | |When TX DMA is enabled, I2S request DMA to transfer data from SRAM to transmit FIFO if FIFO is not full. + * | | |0 = TX DMA Disabled. + * | | |1 = TX DMA Enabled. + * |[21] |RXDMA |Enable Receive DMA + * | | |When RX DMA is enabled, I2S requests DMA to transfer data from receive FIFO to SRAM if FIFO is not empty. + * | | |0 = RX DMA Disabled. + * | | |1 = RX DMA Enabled. + * |[23] |RXLCH |Receive Left Channel Enable + * | | |When monaural format is selected (MONO = 1), I2S controller will receive right channel data if RXLCH is set to 0, + * | | |and receive left channel data if RXLCH is set to 1. + * | | |0 = Receive right channel data in Mono mode. + * | | |1 = Receive left channel data in Mono mode. + * @var I2S_T::CLKDIV + * Offset: 0x04 I2S Clock Divider Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |MCLK_DIV |Master Clock Divider + * | | |If MCLKEN is set to 1, I2S controller will generate master clock for external audio devices. + * | | |The master clock rate, F_MCLK, is determined by the following expressions. + * | | |If MCLK_DIV >= 1, F_MCLK = F_I2SCLK/(2x(MCLK_DIV)). + * | | |If MCLK_DIV = 0, F_MCLK = F_I2SCLK. + * | | |F_I2SCLK is the frequency of I2S peripheral clock. + * | | |In general, the master clock rate is 256 times sampling clock rate. + * |[15:8] |BCLK_DIV |Bit Clock Divider + * | | |The I2S controller will generate bit clock in Master mode. + * | | |The bit clock rate, F_BCLK, is determined by the following expression. + * | | |F_BCLK = F_I2SCLK /(2x(BCLK_DIV + 1)) , where F_I2SCLK is the frequency of I2S peripheral clock. + * @var I2S_T::IE + * Offset: 0x08 I2S Interrupt Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RXUDFIE |Receive FIFO Underflow Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[1] |RXOVFIE |Receive FIFO Overflow Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[2] |RXTHIE |Receive FIFO Threshold Level Interrupt Enable + * | | |When the count of data words in receive FIFO is equal to or higher than RXTH (I2SCON[14:12]) and + * | | |this bit is set to 1, receive FIFO threshold level interrupt will be asserted. + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[8] |TXUDFIE |Transmit FIFO Underflow Interrupt Enable + * | | |Interrupt occurs if this bit is set to 1 and the transmit FIFO underflow flag is set to 1. + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[9] |TXOVFIE |Transmit FIFO Overflow Interrupt Enable + * | | |Interrupt occurs if this bit is set to 1 and the transmit FIFO overflow flag is set to 1 + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[10] |TXTHIE |Transmit FIFO Threshold Level Interrupt Enable + * | | |Interrupt occurs if this bit is set to 1 and the count of data words in transmit FIFO is less than TXTH (I2SCON[11:9]). + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[11] |RZCIE |Right Channel Zero-Cross Interrupt Enable + * | | |Interrupt occurs if this bit is set to 1 and right channel zero-cross event is detected. + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[12] |LZCIE |Left Channel Zero-Cross Interrupt Enable + * | | |Interrupt occurs if this bit is set to 1 and left channel zero-cross event is detected. + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * @var I2S_T::STATUS + * Offset: 0x0C I2S Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |I2SINT |I2S Interrupt Flag + * | | |This bit is wire-OR of I2STXINT and I2SRXINT bits. + * | | |0 = No I2S interrupt. + * | | |1 = I2S interrupt. + * | | |Note: This bit is read only. + * |[1] |I2SRXINT |I2S Receive Interrupt + * | | |0 = No receive interrupt. + * | | |1 = Receive interrupt. + * | | |Note: This bit is read only. + * |[2] |I2STXINT |I2S Transmit Interrupt + * | | |0 = No transmit interrupt. + * | | |1 = Transmit interrupt. + * | | |Note: This bit is read only. + * |[3] |RIGHT |Right Channel + * | | |This bit indicates current transmit data is belong to which channel + * | | |0 = Left channel. + * | | |1 = Right channel. + * | | |Note: This bit is read only. + * |[8] |RXUDF |Receive FIFO Underflow Flag + * | | |Underflow event will occur if read the empty receive FIFO. + * | | |0 = No underflow event occurred. + * | | |1 = Underflow. + * | | |Note: Write 1 to clear this bit to 0. + * |[9] |RXOVF |Receive FIFO Overflow Flag + * | | |When receive FIFO is full and hardware attempt to write data to receive FIFO, this bit will be set to 1, data in 1st buffer will be overwrote. + * | | |0 = No overflow. + * | | |1 = Overflow. + * | | |Note: Write 1 to clear this bit to 0. + * |[10] |RXTHF |Receive FIFO Threshold Flag + * | | |When data word(s) in receive FIFO is equal to or larger than threshold value set in RXTH (I2SCON[14:12]). + * | | |The RXTHF bit becomes to 1. + * | | |It keeps at 1 till RX_LEVEL (I2SSTATUS[27:24]) is less than RXTH. + * | | |0 = Data word(s) in FIFO is less than threshold level. + * | | |1 = Data word(s) in FIFO is equal to or larger than threshold level. + * | | |Note: This bit is read only. + * |[11] |RXFULL |Receive FIFO Full + * | | |This bit reflects the count of data in receive FIFO is 8 + * | | |0 = Not full. + * | | |1 = Full. + * | | |Note: This bit is read only. + * |[12] |RXEMPTY |Receive FIFO Empty + * | | |This bit reflects the count of data in receive FIFO is 0 + * | | |0 = Not empty. + * | | |1 = Empty. + * | | |Note: This bit is read only. + * |[16] |TXUDF |Transmit FIFO Underflow Flag + * | | |If transmit FIFO is empty and hardware reads data from transmit FIFO. This bit will be set to 1. + * | | |0 = No underflow. + * | | |1 = Underflow. + * | | |Note: Software can write 1 to clear this bit to 0. + * |[17] |TXOVF |Transmit FIFO Overflow Flag + * | | |This bit will be set to 1 if writes data to transmit FIFO when transmit FIFO is full. + * | | |0 = No overflow. + * | | |1 = Overflow. + * | | |Note: Write 1 to clear this bit to 0. + * |[18] |TXTHF |Transmit FIFO Threshold Flag + * | | |When the count of data stored in transmit-FIFO is equal to or less than threshold value set in TXTH (I2SCON[11:9]). + * | | |The TXTHF bit becomes to 1. + * | | |It keeps at 1 till TX_LEVEL (I2SSTATUS[31:28]) is larger than TXTH. + * | | |0 = Data word(s) in FIFO is larger than threshold level. + * | | |1 = Data word(s) in FIFO is equal to or less than threshold level. + * | | |Note: This bit is read only. + * |[19] |TXFULL |Transmit FIFO Full + * | | |This bit reflects data word number in transmit FIFO is 8 + * | | |0 = Not full. + * | | |1 = Full. + * | | |Note: This bit is read only. + * |[20] |TXEMPTY |Transmit FIFO Empty + * | | |This bit reflects data word number in transmit FIFO is 0 + * | | |0 = Not empty. + * | | |1 = Empty. + * | | |Note: This bit is read only. + * |[21] |TXBUSY |Transmit Busy + * | | |This bit is cleared to 0 when all data in transmit FIFO and shift buffer is shifted out. + * | | |And set to 1 when 1st data is load to shift buffer. + * | | |0 = Transmit shift buffer is empty. + * | | |1 = Transmit shift buffer is not empty. + * | | |Note: This bit is read only. + * |[22] |RZCF |Right Channel Zero-Cross Flag + * | | |It indicates the sign bit of right channel sample data is changed or all data bits are 0. + * | | |0 = No zero-cross. + * | | |1 = Right channel zero-cross event is detected. + * | | |Note: Write 1 to clear this bit to 0. + * |[23] |LZCF |Left Channel Zero-Cross Flag + * | | |It indicates the sign bit of left channel sample data is changed or all data bits are 0. + * | | |0 = No zero-cross. + * | | |1 = Left channel zero-cross event is detected. + * | | |Note: Write 1 to clear this bit to 0. + * |[27:24] |RX_LEVEL |Receive FIFO Level + * | | |These bits indicate word number in receive FIFO + * | | |0000 = No data. + * | | |0001 = 1 word in receive FIFO. + * | | |.... + * | | |1000 = 8 words in receive FIFO. + * |[31:28] |TX_LEVEL |Transmit FIFO Level + * | | |These bits indicate word number in transmit FIFO + * | | |0000 = No data. + * | | |0001 = 1 word in transmit FIFO. + * | | |.... + * | | |1000 = 8 words in transmit FIFO. + * @var I2S_T::TXFIFO + * Offset: 0x10 I2S Transmit FIFO Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |TXFIFO |Transmit FIFO Register + * | | |I2S contains 8 words (8x32 bits) data buffer for data transmit. + * | | |Write data to this register to prepare data for transmission. + * | | |The remaining word number is indicated by TX_LEVEL (I2SSTATUS[31:28]). + * @var I2S_T::RXFIFO + * Offset: 0x14 I2S Receive FIFO Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |RXFIFO |Receive FIFO Register + * | | |I2S contains 8 words (8x32 bits) data buffer for data receive. + * | | |Read this register to get data of receive FIFO. + * | | |The remaining data word number is indicated by RX_LEVEL (I2SSTATUS[27:24]). + */ + + __IO uint32_t CON; /* Offset: 0x00 I2S Control Register */ + __IO uint32_t CLKDIV; /* Offset: 0x04 I2S Clock Divider Control Register */ + __IO uint32_t IE; /* Offset: 0x08 I2S Interrupt Enable Register */ + __IO uint32_t STATUS; /* Offset: 0x0C I2S Status Register */ + __O uint32_t TXFIFO; /* Offset: 0x10 I2S Transmit FIFO Register */ + __I uint32_t RXFIFO; /* Offset: 0x14 I2S Receive FIFO Register */ + +} I2S_T; + + + +/** @addtogroup REG_I2S_BITMASK I2S Bit Mask + @{ + */ + +/* I2S I2SCON Bit Field Definitions */ +#define I2S_CON_PCM_Pos 24 /*!< I2S_T::CON: PCM Position */ +#define I2S_CON_PCM_Msk (1ul << I2S_CON_PCM_Pos) /*!< I2S_T::CON: PCM Mask */ + +#define I2S_CON_RXLCH_Pos 23 /*!< I2S_T::CON: RXLCH Position */ +#define I2S_CON_RXLCH_Msk (1ul << I2S_CON_RXLCH_Pos) /*!< I2S_T::CON: RXLCH Mask */ + +#define I2S_CON_RXDMA_Pos 21 /*!< I2S_T::CON: RXDMA Position */ +#define I2S_CON_RXDMA_Msk (1ul << I2S_CON_RXDMA_Pos) /*!< I2S_T::CON: RXDMA Mask */ + +#define I2S_CON_TXDMA_Pos 20 /*!< I2S_T::CON: TXDMA Position */ +#define I2S_CON_TXDMA_Msk (1ul << I2S_CON_TXDMA_Pos) /*!< I2S_T::CON: TXDMA Mask */ + +#define I2S_CON_CLR_RXFIFO_Pos 19 /*!< I2S_T::CON: CLR_RXFIFO Position */ +#define I2S_CON_CLR_RXFIFO_Msk (1ul << I2S_CON_CLR_RXFIFO_Pos) /*!< I2S_T::CON: CLR_RXFIFO Mask */ + +#define I2S_CON_CLR_TXFIFO_Pos 18 /*!< I2S_T::CON: CLR_TXFIFO Position */ +#define I2S_CON_CLR_TXFIFO_Msk (1ul << I2S_CON_CLR_TXFIFO_Pos) /*!< I2S_T::CON: CLR_TXFIFO Mask */ + +#define I2S_CON_LCHZCEN_Pos 17 /*!< I2S_T::CON: LCHZCEN Position */ +#define I2S_CON_LCHZCEN_Msk (1ul << I2S_CON_LCHZCEN_Pos) /*!< I2S_T::CON: LCHZCEN Mask */ + +#define I2S_CON_RCHZCEN_Pos 16 /*!< I2S_T::CON: RCHZCEN Position */ +#define I2S_CON_RCHZCEN_Msk (1ul << I2S_CON_RCHZCEN_Pos) /*!< I2S_T::CON: RCHZCEN Mask */ + +#define I2S_CON_MCLKEN_Pos 15 /*!< I2S_T::CON: MCLKEN Position */ +#define I2S_CON_MCLKEN_Msk (1ul << I2S_CON_MCLKEN_Pos) /*!< I2S_T::CON: MCLKEN Mask */ + +#define I2S_CON_RXTH_Pos 12 /*!< I2S_T::CON: RXTH Position */ +#define I2S_CON_RXTH_Msk (7ul << I2S_CON_RXTH_Pos) /*!< I2S_T::CON: RXTH Mask */ + +#define I2S_CON_TXTH_Pos 9 /*!< I2S_T::CON: TXTH Position */ +#define I2S_CON_TXTH_Msk (7ul << I2S_CON_TXTH_Pos) /*!< I2S_T::CON: TXTH Mask */ + +#define I2S_CON_SLAVE_Pos 8 /*!< I2S_T::CON: SLAVE Position */ +#define I2S_CON_SLAVE_Msk (1ul << I2S_CON_SLAVE_Pos) /*!< I2S_T::CON: SLAVE Mask */ + +#define I2S_CON_FORMAT_Pos 7 /*!< I2S_T::CON: FORMAT Position */ +#define I2S_CON_FORMAT_Msk (1ul << I2S_CON_FORMAT_Pos) /*!< I2S_T::CON: FORMAT Mask */ + +#define I2S_CON_MONO_Pos 6 /*!< I2S_T::CON: MONO Position */ +#define I2S_CON_MONO_Msk (1ul << I2S_CON_MONO_Pos) /*!< I2S_T::CON: MONO Mask */ + +#define I2S_CON_WORDWIDTH_Pos 4 /*!< I2S_T::CON: WORDWIDTH Position */ +#define I2S_CON_WORDWIDTH_Msk (3ul << I2S_CON_WORDWIDTH_Pos) /*!< I2S_T::CON: WORDWIDTH Mask */ + +#define I2S_CON_MUTE_Pos 3 /*!< I2S_T::CON: MUTE Position */ +#define I2S_CON_MUTE_Msk (1ul << I2S_CON_MUTE_Pos) /*!< I2S_T::CON: MUTE Mask */ + +#define I2S_CON_RXEN_Pos 2 /*!< I2S_T::CON: RXEN Position */ +#define I2S_CON_RXEN_Msk (1ul << I2S_CON_RXEN_Pos) /*!< I2S_T::CON: RXEN Mask */ + +#define I2S_CON_TXEN_Pos 1 /*!< I2S_T::CON: TXEN Position */ +#define I2S_CON_TXEN_Msk (1ul << I2S_CON_TXEN_Pos) /*!< I2S_T::CON: TXEN Mask */ + +#define I2S_CON_I2SEN_Pos 0 /*!< I2S_T::CON: I2SEN Position */ +#define I2S_CON_I2SEN_Msk (1ul << I2S_CON_I2SEN_Pos) /*!< I2S_T::CON: I2SEN Mask */ + +/* I2S I2SCLKDIV Bit Field Definitions */ +#define I2S_CLKDIV_BCLK_DIV_Pos 8 /*!< I2S_T::CLKDIV: BCLK_DIV Position */ +#define I2S_CLKDIV_BCLK_DIV_Msk (0xFFul << I2S_CLKDIV_BCLK_DIV_Pos) /*!< I2S_T::CLKDIV: BCLK_DIV Mask */ + +#define I2S_CLKDIV_MCLK_DIV_Pos 0 /*!< I2S_T::CLKDIV: MCLK_DIV Position */ +#define I2S_CLKDIV_MCLK_DIV_Msk (7ul << I2S_CLKDIV_MCLK_DIV_Pos) /*!< I2S_T::CLKDIV: MCLK_DIV Mask */ + +/* I2S I2SIE Bit Field Definitions */ +#define I2S_IE_LZCIE_Pos 12 /*!< I2S_T::IE: LZCIE Position */ +#define I2S_IE_LZCIE_Msk (1ul << I2S_IE_LZCIE_Pos) /*!< I2S_T::IE: LZCIE Mask */ + +#define I2S_IE_RZCIE_Pos 11 /*!< I2S_T::IE: RZCIE Position */ +#define I2S_IE_RZCIE_Msk (1ul << I2S_IE_RZCIE_Pos) /*!< I2S_T::IE: RZCIE Mask */ + +#define I2S_IE_TXTHIE_Pos 10 /*!< I2S_T::IE: TXTHIE Position */ +#define I2S_IE_TXTHIE_Msk (1ul << I2S_IE_TXTHIE_Pos) /*!< I2S_T::IE: TXTHIE Mask */ + +#define I2S_IE_TXOVFIE_Pos 9 /*!< I2S_T::IE: TXOVFIE Position */ +#define I2S_IE_TXOVFIE_Msk (1ul << I2S_IE_TXOVFIE_Pos) /*!< I2S_T::IE: TXOVFIE Mask */ + +#define I2S_IE_TXUDFIE_Pos 8 /*!< I2S_T::IE: TXUDFIE Position */ +#define I2S_IE_TXUDFIE_Msk (1ul << I2S_IE_TXUDFIE_Pos) /*!< I2S_T::IE: TXUDFIE Mask */ + +#define I2S_IE_RXTHIE_Pos 2 /*!< I2S_T::IE: RXTHIE Position */ +#define I2S_IE_RXTHIE_Msk (1ul << I2S_IE_RXTHIE_Pos) /*!< I2S_T::IE: RXTHIE Mask */ + +#define I2S_IE_RXOVFIE_Pos 1 /*!< I2S_T::IE: RXOVFIE Position */ +#define I2S_IE_RXOVFIE_Msk (1ul << I2S_IE_RXOVFIE_Pos) /*!< I2S_T::IE: RXOVFIE Mask */ + +#define I2S_IE_RXUDFIE_Pos 0 /*!< I2S_T::IE: RXUDFIE Position */ +#define I2S_IE_RXUDFIE_Msk (1ul << I2S_IE_RXUDFIE_Pos) /*!< I2S_T::IE: RXUDFIE Mask */ + + +/* I2S I2SSTATUS Bit Field Definitions */ +#define I2S_STATUS_TX_LEVEL_Pos 28 /*!< I2S_T::STATUS: TX_LEVEL Position */ +#define I2S_STATUS_TX_LEVEL_Msk (0xFul << I2S_STATUS_TX_LEVEL_Pos) /*!< I2S_T::STATUS: TX_LEVEL Mask */ + +#define I2S_STATUS_RX_LEVEL_Pos 24 /*!< I2S_T::STATUS: RX_LEVEL Position */ +#define I2S_STATUS_RX_LEVEL_Msk (0xFul << I2S_STATUS_RX_LEVEL_Pos) /*!< I2S_T::STATUS: RX_LEVEL Mask */ + +#define I2S_STATUS_LZCF_Pos 23 /*!< I2S_T::STATUS: LZCF Position */ +#define I2S_STATUS_LZCF_Msk (1ul << I2S_STATUS_LZCF_Pos) /*!< I2S_T::STATUS: LZCF Mask */ + +#define I2S_STATUS_RZCF_Pos 22 /*!< I2S_T::STATUS: RZCF Position */ +#define I2S_STATUS_RZCF_Msk (1ul << I2S_STATUS_RZCF_Pos) /*!< I2S_T::STATUS: RZCF Mask */ + +#define I2S_STATUS_TXBUSY_Pos 21 /*!< I2S_T::STATUS: TXBUSY Position */ +#define I2S_STATUS_TXBUSY_Msk (1ul << I2S_STATUS_TXBUSY_Pos) /*!< I2S_T::STATUS: TXBUSY Mask */ + +#define I2S_STATUS_TXEMPTY_Pos 20 /*!< I2S_T::STATUS: TXEMPTY Position */ +#define I2S_STATUS_TXEMPTY_Msk (1ul << I2S_STATUS_TXEMPTY_Pos) /*!< I2S_T::STATUS: TXEMPTY Mask */ + +#define I2S_STATUS_TXFULL_Pos 19 /*!< I2S_T::STATUS: TXFULL Position */ +#define I2S_STATUS_TXFULL_Msk (1ul << I2S_STATUS_TXFULL_Pos) /*!< I2S_T::STATUS: TXFULL Mask */ + +#define I2S_STATUS_TXTHF_Pos 18 /*!< I2S_T::STATUS: TXTHF Position */ +#define I2S_STATUS_TXTHF_Msk (1ul << I2S_STATUS_TXTHF_Pos) /*!< I2S_T::STATUS: TXTHF Mask */ + +#define I2S_STATUS_TXOVF_Pos 17 /*!< I2S_T::STATUS: TXOVF Position */ +#define I2S_STATUS_TXOVF_Msk (1ul << I2S_STATUS_TXOVF_Pos) /*!< I2S_T::STATUS: TXOVF Mask */ + +#define I2S_STATUS_TXUDF_Pos 16 /*!< I2S_T::STATUS: TXUDF Position */ +#define I2S_STATUS_TXUDF_Msk (1ul << I2S_STATUS_TXUDF_Pos) /*!< I2S_T::STATUS: TXUDF Mask */ + +#define I2S_STATUS_RXEMPTY_Pos 12 /*!< I2S_T::STATUS: RXEMPTY Position */ +#define I2S_STATUS_RXEMPTY_Msk (1ul << I2S_STATUS_RXEMPTY_Pos) /*!< I2S_T::STATUS: RXEMPTY Mask */ + +#define I2S_STATUS_RXFULL_Pos 11 /*!< I2S_T::STATUS: RXFULL Position */ +#define I2S_STATUS_RXFULL_Msk (1ul << I2S_STATUS_RXFULL_Pos) /*!< I2S_T::STATUS: RXFULL Mask */ + +#define I2S_STATUS_RXTHF_Pos 10 /*!< I2S_T::STATUS: RXTHF Position */ +#define I2S_STATUS_RXTHF_Msk (1ul << I2S_STATUS_RXTHF_Pos) /*!< I2S_T::STATUS: RXTHF Mask */ + +#define I2S_STATUS_RXOVF_Pos 9 /*!< I2S_T::STATUS: RXOVF Position */ +#define I2S_STATUS_RXOVF_Msk (1ul << I2S_STATUS_RXOVF_Pos) /*!< I2S_T::STATUS: RXOVF Mask */ + +#define I2S_STATUS_RXUDF_Pos 8 /*!< I2S_T::STATUS: RXUDF Position */ +#define I2S_STATUS_RXUDF_Msk (1ul << I2S_STATUS_RXUDF_Pos) /*!< I2S_T::STATUS: RXUDF Mask */ + +#define I2S_STATUS_RIGHT_Pos 3 /*!< I2S_T::STATUS: RIGHT Position */ +#define I2S_STATUS_RIGHT_Msk (1ul << I2S_STATUS_RIGHT_Pos) /*!< I2S_T::STATUS: RIGHT Mask */ + +#define I2S_STATUS_I2STXINT_Pos 2 /*!< I2S_T::STATUS: I2STXINT Position */ +#define I2S_STATUS_I2STXINT_Msk (1ul << I2S_STATUS_I2STXINT_Pos) /*!< I2S_T::STATUS: I2STXINT Mask */ + +#define I2S_STATUS_I2SRXINT_Pos 1 /*!< I2S_T::STATUS: I2SRXINT Position */ +#define I2S_STATUS_I2SRXINT_Msk (1ul << I2S_STATUS_I2SRXINT_Pos) /*!< I2S_T::STATUS: I2SRXINT Mask */ + +#define I2S_STATUS_I2SINT_Pos 0 /*!< I2S_T::STATUS: I2SINT Position */ +#define I2S_STATUS_I2SINT_Msk (1ul << I2S_STATUS_I2SINT_Pos) /*!< I2S_T::STATUS: I2SINT Mask */ +/*@}*/ /* end of group REG_I2S_BITMASK */ +/*@}*/ /* end of group REG_I2S */ + +/*------------------------------ DMA Controller -----------------------------*/ +/** @addtogroup REG_PDMA Peripheral Direct Memory Access Controller (PDMA) + Memory Mapped Structure for PDMA Controller + @{ + */ + +typedef struct +{ + + +/** + * @var PDMA_T::CSR + * Offset: 0x00 PDMA Channel x Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PDMACEN |PDMA Channel Enable Bit + * | | |Setting this bit to 1 enables PDMA operation. + * | | |If this bit is cleared, PDMA will ignore all PDMA request and force Bus Master into IDLE state. + * |[1] |SW_RST |Software Engine Reset + * | | |0 = No effect. + * | | |1 = Reset the internal state machine, pointers and internal buffer. + * | | |The contents of control register will not be cleared. + * | | |This bit will be automatically cleared after one AHB clock cycle. + * |[3:2] |MODE_SEL |PDMA Mode Selection + * | | |00 = Memory to Memory mode (Memory-to-Memory). + * | | |01 = Peripheral to Memory mode (Peripheral-to-Memory). + * | | |10 = Memory to Peripheral mode (Memory-to-Peripheral). + * |[5:4] |SAD_SEL |Transfer Source Address Direction Selection + * | | |00 = Transfer source address is increasing successively. + * | | |01 = Reserved. + * | | |10 = Transfer source address is fixed (This feature can be used when data where transferred from a single source to multiple destinations). + * | | |11 = Reserved. + * |[7:6] |DAD_SEL |Transfer Destination Address Direction Selection + * | | |00 = Transfer destination address is increasing successively. + * | | |01 = Reserved. + * | | |10 = Transfer destination address is fixed. + * | | |(This feature can be used when data where transferred from multiple sources to a single destination). + * | | |11 = Reserved. + * |[20:19] |APB_TWS |Peripheral Transfer Width Selection + * | | |00 = One word (32-bit) is transferred for every PDMA operation. + * | | |01 = One byte (8-bit) is transferred for every PDMA operation. + * | | |10 = One half-word (16-bit) is transferred for every PDMA operation. + * | | |11 = Reserved. + * | | |Note: This field is meaningful only when MODE_SEL (PDMA_CSRx[3:2]) is Peripheral to Memory mode (Peripheral-to-Memory) or Memory to Peripheral mode (Memory-to-Peripheral). + * |[23] |TRIG_EN |Trigger Enable Bit + * | | |0 = No effect. + * | | |1 = PDMA data read or write transfer Enabled. + * | | |Note1: When PDMA transfer completed, this bit will be cleared automatically. + * | | |Note2: If the bus error occurs, all PDMA transfer will be stopped. + * | | |Software must reset all PDMA channel, and then trigger again. + * @var PDMA_T::SAR + * Offset: 0x04 PDMA Channel x Source Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |PDMA_SAR |PDMA Transfer Source Address Register + * | | |This field indicates a 32-bit source address of PDMA. + * | | |Note: The source address must be word alignment. + * @var PDMA_T::DAR + * Offset: 0x08 PDMA Channel x Destination Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |PDMA_DAR |PDMA Transfer Destination Address Register + * | | |This field indicates a 32-bit destination address of PDMA. + * | | |Note: The destination address must be word alignment + * @var PDMA_T::BCR + * Offset: 0x0C PDMA Channel x Transfer Byte Count Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PDMA_BCR |PDMA Transfer Byte Count Register + * | | |This field indicates a 16-bit transfer byte count number of PDMA; it must be word alignment. + * @var PDMA_T::POINT + * Offset: 0x10 PDMA Channel x Internal buffer pointer Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PDMA_POINT|PDMA Internal Buffer Pointer Register (Read Only) + * | | |This field indicates the internal buffer pointer. + * @var PDMA_T::CSAR + * Offset: 0x14 PDMA Channel x Current Source Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |PDMA_CSAR |PDMA Current Source Address Register (Read Only) + * | | |This field indicates the source address where the PDMA transfer just occurred. + * @var PDMA_T::CDAR + * Offset: 0x18 PDMA Channel x Current Destination Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |PDMA_CDAR |PDMA Current Destination Address Register (Read Only) + * | | |This field indicates the destination address where the PDMA transfer just occurred. + * @var PDMA_T::CBCR + * Offset: 0x1C PDMA Channel x Current Transfer Byte Count Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PDMA_CBCR |PDMA Current Byte Count Register (Read Only) + * | | |This field indicates the current remained byte count of PDMA. + * | | |Note: SW_RST will clear this register value. + * @var PDMA_T::IER + * Offset: 0x20 PDMA Channel x Interrupt Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |TABORT_IE |PDMA Read/Write Target Abort Interrupt Enable Bit + * | | |0 = Target abort interrupt generation Disabled during PDMA transfer. + * | | |1 = Target abort interrupt generation Enabled during PDMA transfer. + * |[1] |BLKD_IE |PDMA Block Transfer Done Interrupt Enable Bit + * | | |0 = Interrupt generator Disabled when PDMA transfer is done. + * | | |1 = Interrupt generator Enabled when PDMA transfer is done. + * @var PDMA_T::ISR + * Offset: 0x24 PDMA Channel x Interrupt Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |TABORT_IF |PDMA Read/Write Target Abort Interrupt Flag + * | | |This bit can be cleared to 0 by software writing '1'. + * | | |0 = No bus ERROR response received. + * | | |1 = Bus ERROR response received. + * | | |Note: This bit filed indicates bus master received ERROR response or not. + * | | |If bus master received ERROR response, it means that target abort is happened. + * | | |PDMA controller will stop transfer and respond this event to software then goes to IDLE state. + * | | |When target abort occurred, software must reset PDMA, and then transfer those data again. + * |[1] |BLKD_IF |PDMA Block Transfer Done Interrupt Flag + * | | |This bit indicates that PDMA has finished all transfers. This bit can be cleared to 0 by software writing '1' + * | | |0 = Not finished. + * | | |1 = Done. + * @var PDMA_T::SBUF + * Offset: 0x80 PDMA Channel x Shared Buffer FIFO x Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |PDMA_SBUF0|PDMA Shared Buffer FIFO 0 (Read Only) + * | | |Each channel has its own 1 word internal buffer. + */ + + __IO uint32_t CSR; /* Offset: 0x00 PDMA Channel x Control Register */ + __IO uint32_t SAR; /* Offset: 0x04 PDMA Channel x Source Address Register */ + __IO uint32_t DAR; /* Offset: 0x08 PDMA Channel x Destination Address Register */ + __IO uint32_t BCR; /* Offset: 0x0C PDMA Channel x Transfer Byte Count Register */ + __I uint32_t POINT; /* Offset: 0x10 PDMA Channel x Internal buffer pointer Register */ + __I uint32_t CSAR; /* Offset: 0x14 PDMA Channel x Current Source Address Register */ + __I uint32_t CDAR; /* Offset: 0x18 PDMA Channel x Current Destination Address Register */ + __I uint32_t CBCR; /* Offset: 0x1C PDMA Channel x Current Transfer Byte Count Register */ + __IO uint32_t IER; /* Offset: 0x20 PDMA Channel x Interrupt Enable Register */ + __IO uint32_t ISR; /* Offset: 0x24 PDMA Channel x Interrupt Status Register */ + __I uint32_t RESERVE[22]; + __I uint32_t SBUF; /* Offset: 0x80 PDMA Channel x Shared Buffer FIFO x Register */ + +} PDMA_T; + + + + +typedef struct +{ + + +/** + * @var PDMA_GCR_T::GCRCSR + * Offset: 0x00 PDMA Global Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[8] |CLK0_EN |PDMA Controller Channel 0 Clock Enable Control + * | | |0 = CRC controller clock Disabled. + * | | |1 = CRC controller clock Enabled. + * |[9] |CLK1_EN |PDMA Controller Channel 1 Clock Enable Control + * | | |0 = PDMA channel 1 clock Disabled. + * | | |1 = PDMA channel 1 clock Enabled. + * |[10] |CLK2_EN |PDMA Controller Channel 2 Clock Enable Control + * | | |0 = PDMA channel 2 clock Disabled. + * | | |1 = PDMA channel 2 clock Enabled. + * |[11] |CLK3_EN |PDMA Controller Channel 3 Clock Enable Control + * | | |0 = PDMA channel 3 clock Disabled. + * | | |1 = PDMA channel 3 clock Enabled. + * |[12] |CLK4_EN |PDMA Controller Channel 4 Clock Enable Control + * | | |0 = PDMA channel 4 clock Disabled. + * | | |1 = PDMA channel 4 clock Enabled. + * |[13] |CLK5_EN |PDMA Controller Channel 5 Clock Enable Control + * | | |0 = PDMA channel 5 clock Disabled. + * | | |1 = PDMA channel 5 clock Enabled. + * |[24] |CRC_CLK_EN|CRC Controller Clock Enable Control + * | | |0 = CRC controller clock Disabled. + * | | |1 = CRC controller clock Enabled. + * @var PDMA_GCR_T::PDSSR0 + * Offset: 0x04 PDMA Service Selection Control Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |SPI0_RXSEL|PDMA SPI0 RX Selection + * | | |This field defines which PDMA channel is connected to the on-chip peripheral SPI0 RX. + * | | |Software can change the channel RX setting by SPI0_RXSEL. + * | | |0000: CH0 + * | | |0001: CH1 + * | | |0010: CH2 + * | | |0011: CH3 + * | | |0100: CH4 + * | | |0101: CH5 + * | | |Others : Reserved + * | | |Note: For example, SPI0_RXSEL = 0100, that means SPI0_RX is connected to PDMA_CH4. + * |[7:4] |SPI0_TXSEL|PDMA SPI0 TX Selection + * | | |This field defines which PDMA channel is connected to the on-chip peripheral SPI0 TX. + * | | |Software can configure the TX channel setting by SPI0_TXSEL. + * | | |The channel configuration is the same as SPI0_RXSEL field. + * | | |Please refer to the explanation of SPI0_RXSEL. + * |[11:8] |SPI1_RXSEL|PDMA SPI1 RX Selection + * | | |This field defines which PDMA channel is connected to the on-chip peripheral SPI1 RX. + * | | |Software can configure the RX channel setting by SPI1_RXSEL. + * | | |The channel configuration is the same as SPI0_RXSEL field. + * | | |Please refer to the explanation of SPI0_RXSEL. + * |[15:12] |SPI1_TXSEL|PDMA SPI1 TX Selection + * | | |This field defines which PDMA channel is connected to the on-chip peripheral SPI1 TX. + * | | |Software can configure the TX channel setting by SPI1_TXSEL. + * | | |The channel configuration is the same as SPI0_RXSEL field. + * | | |Please refer to the explanation of SPI0_RXSEL. + * |[19:16] |SPI2_RXSEL|PDMA SPI2 RX Selection + * | | |This field defines which PDMA channel is connected to the on-chip peripheral SPI2 RX. + * | | |Software can configure the RX channel setting by SPI2_RXSEL. + * | | |The channel configuration is the same as SPI0_RXSEL field. + * | | |Please refer to the explanation of SPI0_RXSEL. + * |[23:20] |SPI2_TXSEL|PDMA SPI2 TX Selection + * | | |This field defines which PDMA channel is connected to the on-chip peripheral SPI2 TX. + * | | |Software can configure the TX channel setting by SPI2_TXSEL. + * | | |The channel configuration is the same as SPI0_RXSEL field. + * | | |Please refer to the explanation of SPI0_RXSEL. + * @var PDMA_GCR_T::PDSSR1 + * Offset: 0x08 PDMA Service Selection Control Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |UART0_RXSEL|PDMA UART0 RX Selection + * | | |This field defines which PDMA channel is connected to the on-chip peripheral UART0 RX. + * | | |Software can change the channel RX setting by UART0_RXSEL. + * | | |0000: CH0 + * | | |0001: CH1 + * | | |0010: CH2 + * | | |0011: CH3 + * | | |0100: CH4 + * | | |0101: CH5 + * | | |Others : Reserved + * | | |Note: For example, UART0_RXSEL = 0100, which means UART0_RX is connected to PDMA_CH4. + * |[7:4] |UART0_TXSEL|PDMA UART0 TX Selection + * | | |This field defines which PDMA channel is connected to the on-chip peripheral UART0 TX. + * | | |Software can configure the TX channel setting by UART0_TXSEL. + * | | |The channel configuration is the same as UART0_RXSEL field. + * | | |Please refer to the explanation of UART0_RXSEL. + * |[11:8] |UART1_RXSEL|PDMA UART1 RX Selection + * | | |This field defines which PDMA channel is connected to the on-chip peripheral UART1 RX. + * | | |Software can configure the RX channel setting by UART1_RXSEL. + * | | |The channel configuration is the same as UART0_RXSEL field. + * | | |Please refer to the explanation of UART0_RXSEL. + * |[15:12] |UART1_TXSEL|PDMA UART1 TX Selection + * | | |This field defines which PDMA channel is connected to the on-chip peripheral UART1 TX. + * | | |Software can configure the TX channel setting by UART1_TXSEL. + * | | |The channel configuration is the same as UART0_RXSEL field. + * | | |Please refer to the explanation of UART0_RXSEL. + * |[27:24] |ADC_RXSEL |PDMA ADC RX Selection + * | | |This field defines which PDMA channel is connected to the on-chip peripheral ADC RX. + * | | |Software can configure the RX channel setting by ADC_RXSEL. + * | | |The channel configuration is the same as UART0_RXSEL field. + * | | |Please refer to the explanation of UART0_RXSEL. + * @var PDMA_GCR_T::GCRISR + * Offset: 0x0C PDMA Global Interrupt Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |INTR0 |Interrupt Status Of Channel 0 + * | | |This bit is the interrupt status of PDMA channel 0. + * | | |Note: This bit is read only + * |[1] |INTR1 |Interrupt Status Of Channel 1 + * | | |This bit is the interrupt status of PDMA channel 1. + * | | |Note: This bit is read only + * |[2] |INTR2 |Interrupt Status Of Channel 2 + * | | |This bit is the interrupt status of PDMA channel 2. + * | | |Note: This bit is read only + * |[3] |INTR3 |Interrupt Status Of Channel 3 + * | | |This bit is the interrupt status of PDMA channel 3. + * | | |Note: This bit is read only + * |[4] |INTR4 |Interrupt Status Of Channel 4 + * | | |This bit is the interrupt status of PDMA channel 4. + * | | |Note: This bit is read only + * |[5] |INTR5 |Interrupt Status Of Channel 5 + * | | |This bit is the interrupt status of PDMA channel 5. + * | | |Note: This bit is read only + * |[16] |INTRCRC |Interrupt Status Of CRC Controller + * | | |This bit is the interrupt status of CRC controller + * | | |Note: This bit is read only + * |[31] |INTR |Interrupt Status + * | | |This bit is the interrupt status of PDMA controller. + * | | |Note: This bit is read only + * @var PDMA_GCR_T::PDSSR2 + * Offset: 0x10 PDMA Service Selection Control Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |I2S_RXSEL |PDMA I2S RX Selection + * | | |This field defines which PDMA channel is connected to the on-chip peripheral I2S RX. + * | | |Software can change the channel RX setting by I2S_RXSEL. + * | | |0000: CH0 + * | | |0001: CH1 + * | | |0010: CH2 + * | | |0011: CH3 + * | | |0100: CH4 + * | | |0101: CH5 + * | | |Others : Reserved + * | | |Note: For example: I2S_RXSEL (PDMA_PDSSR2[3:0]) = 0100, that means I2S_RX is connected to PDMA_CH4. + * |[7:4] |I2S_TXSEL |PDMA I2S TX Selection + * | | |This field defines which PDMA channel is connected to the on-chip peripheral I2S TX. + * | | |Software can configure the TX channel setting by I2S_TXSEL. + * | | |The channel configuration is the same as I2S_RXSEL field. + * | | |Please refer to the explanation of I2S_RXSEL. + * |[11:8] |PWM0_RXSEL|PDMA PWM0 RX Selection + * | | |This filed defines which PDMA channel is connected to the on-chip peripheral PWM0 RX. + * | | |Software can configure the RX channel setting by PWM0_RXSEL. + * | | |The channel configuration is the same as I2S_RXSEL field. + * | | |Please refer to the explanation of I2S_RXSEL. + * |[15:12] |PWM1_RXSEL|PDMA PWM1 RX Selection + * | | |This filed defines which PDMA channel is connected to the on-chip peripheral PWM1 RX. + * | | |Software can configure the RX channel setting by PWM1_RXSEL. + * | | |The channel configuration is the same as I2S_RXSEL field. + * | | |Please refer to the explanation of I2S_RXSEL. + * |[19:16] |PWM2_RXSEL|PDMA PWM2 RX Selection + * | | |This field defines which PDMA channel is connected to the on-chip peripheral PWM2 RX. + * | | |Software can configure the RX channel setting by PWM2_RXSEL. + * | | |The channel configuration is the same as I2S_RXSEL field. + * | | |Please refer to the explanation of I2S_RXSEL. + * |[23:20] |PWM3_RXSEL|PDMA PWM3 RX Selection + * | | |This field defines which PDMA channel is connected to the on-chip peripheral PWM3 RX. + * | | |Software can configure the RX channel setting by PWM3_RXSEL. + * | | |The channel configuration is the same as I2S_RXSEL field. + * | | |Please refer to the explanation of I2S_RXSEL. + */ + + __IO uint32_t GCRCSR; /* Offset: 0x00 PDMA Global Control Register */ + __IO uint32_t PDSSR0; /* Offset: 0x04 PDMA Service Selection Control Register 0 */ + __IO uint32_t PDSSR1; /* Offset: 0x08 PDMA Service Selection Control Register 1 */ + __IO uint32_t GCRISR; /* Offset: 0x0C PDMA Global Interrupt Status Register */ + __IO uint32_t PDSSR2; /* Offset: 0x10 PDMA Service Selection Control Register 2 */ + +} PDMA_GCR_T; + + + + +/** @addtogroup REG_PDMA_BITMASK PDMA Bit Mask + @{ + */ + +/* PDMA CSR Bit Field Definitions */ +#define PDMA_CSR_TRIG_EN_Pos 23 /*!< PDMA_T::CSR: TRIG_EN Position */ +#define PDMA_CSR_TRIG_EN_Msk (1ul << PDMA_CSR_TRIG_EN_Pos) /*!< PDMA_T::CSR: TRIG_EN Mask */ + +#define PDMA_CSR_APB_TWS_Pos 19 /*!< PDMA_T::CSR: APB_TWS Position */ +#define PDMA_CSR_APB_TWS_Msk (3ul << PDMA_CSR_APB_TWS_Pos) /*!< PDMA_T::CSR: APB_TWS Mask */ + +#define PDMA_CSR_DAD_SEL_Pos 6 /*!< PDMA_T::CSR: DAD_SEL Position */ +#define PDMA_CSR_DAD_SEL_Msk (3ul << PDMA_CSR_DAD_SEL_Pos) /*!< PDMA_T::CSR: DAD_SEL Mask */ + +#define PDMA_CSR_SAD_SEL_Pos 4 /*!< PDMA_T::CSR: SAD_SEL Position */ +#define PDMA_CSR_SAD_SEL_Msk (3ul << PDMA_CSR_SAD_SEL_Pos) /*!< PDMA_T::CSR: SAD_SEL Mask */ + +#define PDMA_CSR_MODE_SEL_Pos 2 /*!< PDMA_T::CSR: MODE_SEL Position */ +#define PDMA_CSR_MODE_SEL_Msk (3ul << PDMA_CSR_MODE_SEL_Pos) /*!< PDMA_T::CSR: MODE_SEL Mask */ + +#define PDMA_CSR_SW_RST_Pos 1 /*!< PDMA_T::CSR: SW_RST Position */ +#define PDMA_CSR_SW_RST_Msk (1ul << PDMA_CSR_SW_RST_Pos) /*!< PDMA_T::CSR: SW_RST Mask */ + +#define PDMA_CSR_PDMACEN_Pos 0 /*!< PDMA_T::CSR: PDMACEN Position */ +#define PDMA_CSR_PDMACEN_Msk (1ul << PDMA_CSR_PDMACEN_Pos) /*!< PDMA_T::CSR: PDMACEN Mask */ + +/* PDMA BCR Bit Field Definitions */ +#define PDMA_BCR_BCR_Pos 0 /*!< PDMA_T::BCR: BCR Position */ +#define PDMA_BCR_BCR_Msk (0xFFFFul << PDMA_BCR_BCR_Pos) /*!< PDMA_T::BCR: BCR Mask */ + +/* PDMA POINT Bit Field Definitions */ +#define PDMA_POINT_POINT_Pos 0 /*!< PDMA_T::POINT: POINT Position */ +#define PDMA_POINT_POINT_Msk (0xFul << PDMA_POINT_POINT_Pos) /*!< PDMA_T::POINT: POINT Mask */ + +/* PDMA CBCR Bit Field Definitions */ +#define PDMA_CBCR_CBCR_Pos 0 /*!< PDMA_T::CBCR: CBCR Position */ +#define PDMA_CBCR_CBCR_Msk (0xFFFFul << PDMA_CBCR_CBCR_Pos) /*!< PDMA_T::CBCR: CBCR Mask */ + +/* PDMA IER Bit Field Definitions */ +#define PDMA_IER_BLKD_IE_Pos 1 /*!< PDMA_T::IER: BLKD_IE Position */ +#define PDMA_IER_BLKD_IE_Msk (1ul << PDMA_IER_BLKD_IE_Pos) /*!< PDMA_T::IER: BLKD_IE Mask */ + +#define PDMA_IER_TABORT_IE_Pos 0 /*!< PDMA_T::IER: TABORT_IE Position */ +#define PDMA_IER_TABORT_IE_Msk (1ul << PDMA_IER_TABORT_IE_Pos) /*!< PDMA_T::IER: TABORT_IE Mask */ + +/* PDMA ISR Bit Field Definitions */ +#define PDMA_ISR_BLKD_IF_Pos 1 /*!< PDMA_T::ISR: BLKD_IF Position */ +#define PDMA_ISR_BLKD_IF_Msk (1ul << PDMA_ISR_BLKD_IF_Pos) /*!< PDMA_T::ISR: BLKD_IF Mask */ + +#define PDMA_ISR_TABORT_IF_Pos 0 /*!< PDMA_T::ISR: TABORT_IF Position */ +#define PDMA_ISR_TABORT_IF_Msk (1ul << PDMA_ISR_TABORT_IF_Pos) /*!< PDMA_T::ISR: TABORT_IF Mask */ + +/* PDMA GCRCSR Bit Field Definitions */ +#define PDMA_GCRCSR_CRC_CLK_EN_Pos 24 /*!< PDMA_GCR_T::GCRCSR: CRC_CLK_EN Position */ +#define PDMA_GCRCSR_CRC_CLK_EN_Msk (1ul << PDMA_GCRCSR_CRC_CLK_EN_Pos) /*!< PDMA_GCR_T::GCRCSR: CRC_CLK_EN Mask */ + +#define PDMA_GCRCSR_CLK5_EN_Pos 13 /*!< PDMA_GCR_T::GCRCSR: CLK5_EN Position */ +#define PDMA_GCRCSR_CLK5_EN_Msk (1ul << PDMA_GCRCSR_CLK5_EN_Pos) /*!< PDMA_GCR_T::GCRCSR: CLK5_EN Mask */ + +#define PDMA_GCRCSR_CLK4_EN_Pos 12 /*!< PDMA_GCR_T::GCRCSR: CLK4_EN Position */ +#define PDMA_GCRCSR_CLK4_EN_Msk (1ul << PDMA_GCRCSR_CLK4_EN_Pos) /*!< PDMA_GCR_T::GCRCSR: CLK4_EN Mask */ + +#define PDMA_GCRCSR_CLK3_EN_Pos 11 /*!< PDMA_GCR_T::GCRCSR: CLK3_EN Position */ +#define PDMA_GCRCSR_CLK3_EN_Msk (1ul << PDMA_GCRCSR_CLK3_EN_Pos) /*!< PDMA_GCR_T::GCRCSR: CLK3_EN Mask */ + +#define PDMA_GCRCSR_CLK2_EN_Pos 10 /*!< PDMA_GCR_T::GCRCSR: CLK2_EN Position */ +#define PDMA_GCRCSR_CLK2_EN_Msk (1ul << PDMA_GCRCSR_CLK2_EN_Pos) /*!< PDMA_GCR_T::GCRCSR: CLK2_EN Mask */ + +#define PDMA_GCRCSR_CLK1_EN_Pos 9 /*!< PDMA_GCR_T::GCRCSR: CLK1_EN Position */ +#define PDMA_GCRCSR_CLK1_EN_Msk (1ul << PDMA_GCRCSR_CLK1_EN_Pos) /*!< PDMA_GCR_T::GCRCSR: CLK1_EN Mask */ + +#define PDMA_GCRCSR_CLK0_EN_Pos 8 /*!< PDMA_GCR_T::GCRCSR: CLK0_EN Position */ +#define PDMA_GCRCSR_CLK0_EN_Msk (1ul << PDMA_GCRCSR_CLK0_EN_Pos) /*!< PDMA_GCR_T::GCRCSR: CLK0_EN Mask */ + +/* PDMA PDSSR0 Bit Field Definitions */ +#define PDMA_PDSSR0_SPI2_TXSEL_Pos 20 /*!< PDMA_GCR_T::PDSSR0: SPI2_TXSEL Position */ +#define PDMA_PDSSR0_SPI2_TXSEL_Msk (0xFul << PDMA_PDSSR0_SPI2_TXSEL_Pos) /*!< PDMA_GCR_T::PDSSR0: SPI2_TXSEL Mask */ + +#define PDMA_PDSSR0_SPI2_RXSEL_Pos 16 /*!< PDMA_GCR_T::PDSSR0: SPI2_RXSEL Position */ +#define PDMA_PDSSR0_SPI2_RXSEL_Msk (0xFul << PDMA_PDSSR0_SPI2_RXSEL_Pos) /*!< PDMA_GCR_T::PDSSR0: SPI2_RXSEL Mask */ + +#define PDMA_PDSSR0_SPI1_TXSEL_Pos 12 /*!< PDMA_GCR_T::PDSSR0: SPI1_TXSEL Position */ +#define PDMA_PDSSR0_SPI1_TXSEL_Msk (0xFul << PDMA_PDSSR0_SPI1_TXSEL_Pos) /*!< PDMA_GCR_T::PDSSR0: SPI1_TXSEL Mask */ + +#define PDMA_PDSSR0_SPI1_RXSEL_Pos 8 /*!< PDMA_GCR_T::PDSSR0: SPI1_RXSEL Position */ +#define PDMA_PDSSR0_SPI1_RXSEL_Msk (0xFul << PDMA_PDSSR0_SPI1_RXSEL_Pos) /*!< PDMA_GCR_T::PDSSR0: SPI1_RXSEL Mask */ + +#define PDMA_PDSSR0_SPI0_TXSEL_Pos 4 /*!< PDMA_GCR_T::PDSSR0: SPI0_TXSEL Position */ +#define PDMA_PDSSR0_SPI0_TXSEL_Msk (0xFul << PDMA_PDSSR0_SPI0_TXSEL_Pos) /*!< PDMA_GCR_T::PDSSR0: SPI0_TXSEL Mask */ + +#define PDMA_PDSSR0_SPI0_RXSEL_Pos 0 /*!< PDMA_GCR_T::PDSSR0: SPI0_RXSEL Position */ +#define PDMA_PDSSR0_SPI0_RXSEL_Msk (0xFul << PDMA_PDSSR0_SPI0_RXSEL_Pos) /*!< PDMA_GCR_T::PDSSR0: SPI0_RXSEL Mask */ + +/* PDMA PDSSR1 Bit Field Definitions */ +#define PDMA_PDSSR1_ADC_RXSEL_Pos 24 /*!< PDMA_GCR_T::PDSSR1: ADC_RXSEL Position */ +#define PDMA_PDSSR1_ADC_RXSEL_Msk (0xFul << PDMA_PDSSR1_ADC_RXSEL_Pos) /*!< PDMA_GCR_T::PDSSR1: ADC_RXSEL Mask */ + +#define PDMA_PDSSR1_UART1_TXSEL_Pos 12 /*!< PDMA_GCR_T::PDSSR1: UART1_TXSEL Position */ +#define PDMA_PDSSR1_UART1_TXSEL_Msk (0xFul << PDMA_PDSSR1_UART1_TXSEL_Pos) /*!< PDMA_GCR_T::PDSSR1: UART1_TXSEL Mask */ + +#define PDMA_PDSSR1_UART1_RXSEL_Pos 8 /*!< PDMA_GCR_T::PDSSR1: UART1_RXSEL Position */ +#define PDMA_PDSSR1_UART1_RXSEL_Msk (0xFul << PDMA_PDSSR1_UART1_RXSEL_Pos) /*!< PDMA_GCR_T::PDSSR1: UART1_RXSEL Mask */ + +#define PDMA_PDSSR1_UART0_TXSEL_Pos 4 /*!< PDMA_GCR_T::PDSSR1: UART0_TXSEL Position */ +#define PDMA_PDSSR1_UART0_TXSEL_Msk (0xFul << PDMA_PDSSR1_UART0_TXSEL_Pos) /*!< PDMA_GCR_T::PDSSR1: UART0_TXSEL Mask */ + +#define PDMA_PDSSR1_UART0_RXSEL_Pos 0 /*!< PDMA_GCR_T::PDSSR1: UART0_RXSEL Position */ +#define PDMA_PDSSR1_UART0_RXSEL_Msk (0xFul << PDMA_PDSSR1_UART0_RXSEL_Pos) /*!< PDMA_GCR_T::PDSSR1: UART0_RXSEL Mask */ + +/* PDMA GCRISR Bit Field Definitions */ +#define PDMA_GCRISR_INTR_Pos 31 /*!< PDMA_GCR_T::GCRISR: INTR Position */ +#define PDMA_GCRISR_INTR_Msk (1ul << PDMA_GCRISR_INTR_Pos) /*!< PDMA_GCR_T::GCRISR: INTR Mask */ + +#define PDMA_GCRISR_INTRCRC_Pos 16 /*!< PDMA_GCR_T::GCRISR: INTRCRC Position */ +#define PDMA_GCRISR_INTRCRC_Msk (1ul << PDMA_GCRISR_INTRCRC_Pos) /*!< PDMA_GCR_T::GCRISR: INTRCRC Mask */ + +#define PDMA_GCRISR_INTR5_Pos 5 /*!< PDMA_GCR_T::GCRISR: INTR5 Position */ +#define PDMA_GCRISR_INTR5_Msk (1ul << PDMA_GCRISR_INTR5_Pos) /*!< PDMA_GCR_T::GCRISR: INTR5 Mask */ + +#define PDMA_GCRISR_INTR4_Pos 4 /*!< PDMA_GCR_T::GCRISR: INTR4 Position */ +#define PDMA_GCRISR_INTR4_Msk (1ul << PDMA_GCRISR_INTR4_Pos) /*!< PDMA_GCR_T::GCRISR: INTR4 Mask */ + +#define PDMA_GCRISR_INTR3_Pos 3 /*!< PDMA_GCR_T::GCRISR: INTR3 Position */ +#define PDMA_GCRISR_INTR3_Msk (1ul << PDMA_GCRISR_INTR3_Pos) /*!< PDMA_GCR_T::GCRISR: INTR3 Mask */ + +#define PDMA_GCRISR_INTR2_Pos 2 /*!< PDMA_GCR_T::GCRISR: INTR2 Position */ +#define PDMA_GCRISR_INTR2_Msk (1ul << PDMA_GCRISR_INTR2_Pos) /*!< PDMA_GCR_T::GCRISR: INTR2 Mask */ + +#define PDMA_GCRISR_INTR1_Pos 1 /*!< PDMA_GCR_T::GCRISR: INTR1 Position */ +#define PDMA_GCRISR_INTR1_Msk (1ul << PDMA_GCRISR_INTR1_Pos) /*!< PDMA_GCR_T::GCRISR: INTR1 Mask */ + +#define PDMA_GCRISR_INTR0_Pos 0 /*!< PDMA_GCR_T::GCRISR: INTR0 Position */ +#define PDMA_GCRISR_INTR0_Msk (1ul << PDMA_GCRISR_INTR0_Pos) /*!< PDMA_GCR_T::GCRISR: INTR0 Mask */ + +/* PDMA PDSSR2 Bit Field Definitions */ +#define PDMA_PDSSR2_PWM3_RXSEL_Pos 20 /*!< PDMA_GCR_T::PDSSR2: PWM3_RXSEL Position */ +#define PDMA_PDSSR2_PWM3_RXSEL_Msk (0xFul << PDMA_PDSSR2_PWM3_RXSEL_Pos) /*!< PDMA_GCR_T::PDSSR2: PWM3_RXSEL Mask */ + +#define PDMA_PDSSR2_PWM2_RXSEL_Pos 16 /*!< PDMA_GCR_T::PDSSR2: PWM2_RXSEL Position */ +#define PDMA_PDSSR2_PWM2_RXSEL_Msk (0xFul << PDMA_PDSSR2_PWM2_RXSEL_Pos) /*!< PDMA_GCR_T::PDSSR2: PWM2_RXSEL Mask */ + +#define PDMA_PDSSR2_PWM1_RXSEL_Pos 12 /*!< PDMA_GCR_T::PDSSR2: PWM1_RXSEL Position */ +#define PDMA_PDSSR2_PWM1_RXSEL_Msk (0xFul << PDMA_PDSSR2_PWM1_RXSEL_Pos) /*!< PDMA_GCR_T::PDSSR2: PWM1_RXSEL Mask */ + +#define PDMA_PDSSR2_PWM0_RXSEL_Pos 8 /*!< PDMA_GCR_T::PDSSR2: PWM0_RXSEL Position */ +#define PDMA_PDSSR2_PWM0_RXSEL_Msk (0xFul << PDMA_PDSSR2_PWM0_RXSEL_Pos) /*!< PDMA_GCR_T::PDSSR2: PWM0_RXSEL Mask */ + +#define PDMA_PDSSR2_I2S_TXSEL_Pos 4 /*!< PDMA_GCR_T::PDSSR2: I2S_TXSEL Position */ +#define PDMA_PDSSR2_I2S_TXSEL_Msk (0xFul << PDMA_PDSSR2_I2S_TXSEL_Pos) /*!< PDMA_GCR_T::PDSSR2: I2S_TXSEL Mask */ + +#define PDMA_PDSSR2_I2S_RXSEL_Pos 0 /*!< PDMA_GCR_T::PDSSR2: I2S_RXSEL Position */ +#define PDMA_PDSSR2_I2S_RXSEL_Msk (0xFul << PDMA_PDSSR2_I2S_RXSEL_Pos) /*!< PDMA_GCR_T::PDSSR2: I2S_RXSEL Mask */ +/*@}*/ /* end of group REG_PDMA_BITMASK */ +/*@}*/ /* end of group REG_PDMA */ + + +/*------------------------------ PS2 Controller ------------------------------*/ +/** @addtogroup REG_PS2 PS2 Serial Interface (PS2) + Memory Mapped Structure for PS2 Serial Interface Controller + @{ + */ + +typedef struct +{ + + +/** + * @var PS2_T::PS2CON + * Offset: 0x00 PS/2 Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PS2EN |Enable PS/2 Device + * | | |Enable PS/2 device controller + * | | |0 = Disabled. + * | | |1 = Enabled. + * |[1] |TXINTEN |Enable Transmit Interrupt + * | | |0 = Data transmit complete interrupt Disabled. + * | | |1 = Data transmit complete interrupt Enabled. + * |[2] |RXINTEN |Enable Receive Interrupt + * | | |0 = Data receive complete interrupt Disabled. + * | | |1 = Data receive complete interrupt Enabled. + * |[6:3] |TXFIFO_DEPTH|Transmit Data FIFO Depth + * | | |There are 16 bytes buffer for data transmit. + * | | |Software can define the FIFO depth from 1 to 16 bytes depends on application needs. + * | | |0 = 1 byte. + * | | |1 = 2 bytes. + * | | |... + * | | |14 = 15 bytes. + * | | |15 = 16 bytes. + * |[7] |ACK |Acknowledge Enable + * | | |0 = Always send acknowledge to host at 12th clock for host to device communication. + * | | |1 = If parity bit error or stop bit is not received correctly, acknowledge bit will not be sent to host at 12th clock. + * |[8] |CLRFIFO |Clear TX FIFO + * | | |Write 1 to this bit to terminate device to host transmission. + * | | |The TXEMPTY(PS2STATUS[7]) bit will be set to 1 and pointer BYTEIDEX(PS2STATUS[11:8]) is reset to 0 regardless there is residue data in buffer or not. + * | | |The buffer content is not been cleared. + * | | |0 = Not active. + * | | |1 = Clear FIFO. + * |[9] |OVERRIDE |Software Override PS/2 CLK/DATA Pin State + * | | |0 = PS2_CLK and PS2_DATA pins are controlled by internal state machine. + * | | |1 = PS2_CLK and PS2_DATA pins are controlled by software. + * |[10] |FPS2CLK |Force PS2CLK Line + * | | |It forces PS2_CLK line high or low regardless of the internal state of the device controller if OVERRIDE(PS2CON[9]) is set to 1. + * | | |0 = Force PS2_CLK line low. + * | | |1 = Force PS2_CLK line high. + * |[11] |FPS2DAT |Force PS2DATA Line + * | | |It forces PS2_DATA high or low regardless of the internal state of the device controller if OVERRIDE (PS2CON[9]) is set to 1. + * | | |0 = Force PS2_DATA low. + * | | |1 = Force PS2_DATA high. + * @var PS2_T::PS2TXDATA0 + * Offset: 0x04 PS/2 Transmit Data Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |PS2TXDATAx|Transmit Data + * | | |Writing data to this register starts in device to host communication if bus is in IDLE state. + * | | |Software must enable PS2EN(PS2CON[0]) before writing data to TX buffer. + * @var PS2_T::PS2TXDATA1 + * Offset: 0x08 PS/2 Transmit Data Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |PS2TXDATAx|Transmit Data + * | | |Writing data to this register starts in device to host communication if bus is in IDLE state. + * | | |Software must enable PS2EN(PS2CON[0]) before writing data to TX buffer. + * @var PS2_T::PS2TXDATA2 + * Offset: 0x0C PS/2 Transmit Data Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |PS2TXDATAx|Transmit Data + * | | |Writing data to this register starts in device to host communication if bus is in IDLE state. + * | | |Software must enable PS2EN(PS2CON[0]) before writing data to TX buffer. + * @var PS2_T::PS2TXDATA3 + * Offset: 0x10 PS/2 Transmit Data Register 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |PS2TXDATAx|Transmit Data + * | | |Writing data to this register starts in device to host communication if bus is in IDLE state. + * | | |Software must enable PS2EN(PS2CON[0]) before writing data to TX buffer. + * @var PS2_T::PS2RXDATA + * Offset: 0x14 PS/2 Receive Data Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |RXDATA |Received Data + * | | |For host to device communication, after acknowledge bit is sent, the received data is copied from receive shift register to PS2RXDATA register. + * | | |CPU must read this register before next byte reception complete, otherwise the data will be overwritten and RXOVF(PS2STATUS[6]) bit will be set to 1. + * @var PS2_T::PS2STATUS + * Offset: 0x18 PS/2 Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PS2CLK |CLK Pin State + * | | |This bit reflects the status of the PS2_CLK line after synchronizing. + * |[1] |PS2DATA |DATA Pin State + * | | |This bit reflects the status of the PS2_DATA line after synchronizing and sampling. + * |[2] |FRAMERR |Frame Error + * | | |For host to device communication, this bit sets to 1 if STOP bit (logic 1) is not received. + * | | |If frame error occurs, the PS/2_DATA line may keep at low state after 12th clock. + * | | |At this moment, software overrides PS2_CLK to send clock till PS2_DATA release to high state. + * | | |After that, device sends a "Resend" command to host. + * | | |0 = No frame error. + * | | |1 = Frame error occur. + * | | |Write 1 to clear this bit. + * |[3] |RXPARITY |Received Parity + * | | |This bit reflects the parity bit for the last received data byte (odd parity). + * | | |This bit is read only. + * |[4] |RXBUSY |Receive Busy + * | | |This bit indicates that the PS/2 device is currently receiving data. + * | | |0 = Idle. + * | | |1 = Currently receiving data. + * | | |This bit is read only. + * |[5] |TXBUSY |Transmit Busy + * | | |This bit indicates that the PS/2 device is currently sending data. + * | | |0 = Idle. + * | | |1 = Currently sending data. + * | | |This bit is read only. + * |[6] |RXOVF |RX Buffer Overwrite + * | | |0 = No overwrite. + * | | |1 = Data in PS2RXDATA register is overwritten by new received data. + * | | |Write 1 to clear this bit. + * |[7] |TXEMPTY |TX FIFO Empty + * | | |When software writes data to PS2TXDATA0-3, the TXEMPTY bit is cleared to 0 immediately if PS2EN(PS2CON[0]) is enabled. + * | | |When transmitted data byte number is equal to FIFODEPTH(PS2CON[6:3]) then TXEMPTY bit is set to 1. + * | | |0 = There is data to be transmitted. + * | | |1 = FIFO is empty. + * | | |This bit is read only. + * |[11:8] |BYTEIDX |Byte Index + * | | |It indicates which data byte in transmit data shift register. + * | | |When all data in FIFO is transmitted and it will be cleared to 0. + * | | |This bit is read only. + * | | |BYTEIDX, DATA Transmit , BYTEIDX, DATA Transmit + * | | |0000 , PS2TXDATA0[ 7: 0], 1000 , PS2TXDATA2[ 7: 0], + * | | |0001 , PS2TXDATA0[15: 8], 1001 , PS2TXDATA2[15: 8], + * | | |0010 , PS2TXDATA0[23:16], 1010 , PS2TXDATA2[23:16], + * | | |0011 , PS2TXDATA0[31:24], 1011 , PS2TXDATA2[31:24], + * | | |0100 , PS2TXDATA1[ 7: 0], 1100 , PS2TXDATA3[ 7: 0], + * | | |0101 , PS2TXDATA1[15: 8], 1101 , PS2TXDATA3[15: 8], + * | | |0110 , PS2TXDATA1[23:16], 1110 , PS2TXDATA3[23:16], + * | | |0111 , PS2TXDATA1[31:24], 1111 , PS2TXDATA3[31:24], + * @var PS2_T::PS2INTID + * Offset: 0x1C PS/2 Interrupt Identification Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RXINT |Receive Interrupt + * | | |This bit is set to 1 when acknowledge bit is sent for Host to device communication. + * | | |Interrupt occurs if RXINTEN(PS2CON[2]) bit is set to 1. + * | | |0 = No interrupt. + * | | |1 = Receive interrupt occurs. + * | | |Write 1 to clear this bit to 0. + * |[1] |TXINT |Transmit Interrupt + * | | |This bit is set to 1 after STOP bit is transmitted. + * | | |Interrupt occur if TXINTEN(PS2CON[1]) bit is set to 1. + * | | |0 = No interrupt. + * | | |1 = Transmit interrupt occurs. + * | | |Write 1 to clear this bit to 0. + */ + + __IO uint32_t PS2CON; /* Offset: 0x00 PS/2 Control Register */ + __IO uint32_t PS2TXDATA0; /* Offset: 0x04 PS/2 Transmit Data Register 0 */ + __IO uint32_t PS2TXDATA1; /* Offset: 0x08 PS/2 Transmit Data Register 1 */ + __IO uint32_t PS2TXDATA2; /* Offset: 0x0C PS/2 Transmit Data Register 2 */ + __IO uint32_t PS2TXDATA3; /* Offset: 0x10 PS/2 Transmit Data Register 3 */ + __IO uint32_t PS2RXDATA; /* Offset: 0x14 PS/2 Receive Data Register */ + __IO uint32_t PS2STATUS; /* Offset: 0x18 PS/2 Status Register */ + __IO uint32_t PS2INTID; /* Offset: 0x1C PS/2 Interrupt Identification Register */ + +} PS2_T; + + + +/** @addtogroup REG_PS2_BITMASK PS2 Bit Mask + @{ + */ + +/* PS2 PS2CON Bit Field Definitions */ +#define PS2_PS2CON_PS2EN_Pos 0 /*!< PS2_T::PS2CON: PS2EN Position */ +#define PS2_PS2CON_PS2EN_Msk (1ul << PS2_PS2CON_PS2EN_Pos) /*!< PS2_T::PS2CON: PS2EN Mask */ + +#define PS2_PS2CON_TXINTEN_Pos 1 /*!< PS2_T::PS2CON: TXINTEN Position */ +#define PS2_PS2CON_TXINTEN_Msk (1ul << PS2_PS2CON_TXINTEN_Pos) /*!< PS2_T::PS2CON: TXINTEN Mask */ + +#define PS2_PS2CON_RXINTEN_Pos 2 /*!< PS2_T::PS2CON: RXINTEN Position */ +#define PS2_PS2CON_RXINTEN_Msk (1ul << PS2_PS2CON_RXINTEN_Pos) /*!< PS2_T::PS2CON: RXINTEN Mask */ + +#define PS2_PS2CON_TXFIFO_DEPTH_Pos 3 /*!< PS2_T::PS2CON: TXFIFO_DEPTH Position */ +#define PS2_PS2CON_TXFIFO_DEPTH_Msk (0xFul << PS2_PS2CON_TXFIFO_DEPTH_Pos) /*!< PS2_T::PS2CON: TXFIFO_DEPTH Mask */ + +#define PS2_PS2CON_ACK_Pos 7 /*!< PS2_T::PS2CON: ACK Position */ +#define PS2_PS2CON_ACK_Msk (1ul << PS2_PS2CON_ACK_Pos) /*!< PS2_T::PS2CON: ACK Mask */ + +#define PS2_PS2CON_CLRFIFO_Pos 8 /*!< PS2_T::PS2CON: CLRFIFO Position */ +#define PS2_PS2CON_CLRFIFO_Msk (1ul << PS2_PS2CON_CLRFIFO_Pos) /*!< PS2_T::PS2CON: CLRFIFO Mask */ + +#define PS2_PS2CON_OVERRIDE_Pos 9 /*!< PS2_T::PS2CON: OVERRIDE Position */ +#define PS2_PS2CON_OVERRIDE_Msk (1ul << PS2_PS2CON_OVERRIDE_Pos) /*!< PS2_T::PS2CON: OVERRIDE Mask */ + +#define PS2_PS2CON_FPS2CLK_Pos 10 /*!< PS2_T::PS2CON: FPS2CLK Position */ +#define PS2_PS2CON_FPS2CLK_Msk (1ul << PS2_PS2CON_FPS2CLK_Pos) /*!< PS2_T::PS2CON: FPS2CLK Mask */ + +#define PS2_PS2CON_FPS2DAT_Pos 11 /*!< PS2_T::PS2CON: FPS2DAT Position */ +#define PS2_PS2CON_FPS2DAT_Msk (1ul << PS2_PS2CON_FPS2DAT_Pos) /*!< PS2_T::PS2CON: FPS2DAT Mask */ + +/* PS/2 PS2RXDATA Bit Field Definitions */ +#define PS2_PS2RXDATA_RXDATA_Pos 0 /*!< PS2_T::PS2RXDATA: RXDATA Position */ +#define PS2_PS2RXDATA_RXDATA_Msk (0xFFul << PS2_PS2RXDATA_RXDATA_Pos) /*!< PS2_T::PS2RXDATA: RXDATA Mask */ + +/* PS/2 PS2STATUS Bit Field Definitions */ +#define PS2_PS2STATUS_PS2CLK_Pos 0 /*!< PS2_T::PS2STATUS: PS2CLK Position */ +#define PS2_PS2STATUS_PS2CLK_Msk (1ul << PS2_PS2STATUS_PS2CLK_Pos) /*!< PS2_T::PS2STATUS: PS2CLK Mask */ + +#define PS2_PS2STATUS_PS2DATA_Pos 1 /*!< PS2_T::PS2STATUS: PS2DATA Position */ +#define PS2_PS2STATUS_PS2DATA_Msk (1ul << PS2_PS2STATUS_PS2DATA_Pos) /*!< PS2_T::PS2STATUS: PS2DATA Mask */ + +#define PS2_PS2STATUS_FRAMERR_Pos 2 /*!< PS2_T::PS2STATUS: FRAMERR Position */ +#define PS2_PS2STATUS_FRAMERR_Msk (1ul << PS2_PS2STATUS_FRAMERR_Pos) /*!< PS2_T::PS2STATUS: FRAMERR Mask */ + +#define PS2_PS2STATUS_RXPARITY_Pos 3 /*!< PS2_T::PS2STATUS: RXPARITY Position */ +#define PS2_PS2STATUS_RXPARITY_Msk (1ul << PS2_PS2STATUS_RXPARITY_Pos) /*!< PS2_T::PS2STATUS: RXPARITY Mask */ + +#define PS2_PS2STATUS_RXBUSY_Pos 4 /*!< PS2_T::PS2STATUS: RXBUSY Position */ +#define PS2_PS2STATUS_RXBUSY_Msk (1ul << PS2_PS2STATUS_RXBUSY_Pos) /*!< PS2_T::PS2STATUS: RXBUSY Mask */ + +#define PS2_PS2STATUS_TXBUSY_Pos 5 /*!< PS2_T::PS2STATUS: TXBUSY Position */ +#define PS2_PS2STATUS_TXBUSY_Msk (1ul << PS2_PS2STATUS_TXBUSY_Pos) /*!< PS2_T::PS2STATUS: TXBUSY Mask */ + +#define PS2_PS2STATUS_RXOVF_Pos 6 /*!< PS2_T::PS2STATUS: RXOVF Position */ +#define PS2_PS2STATUS_RXOVF_Msk (1ul << PS2_PS2STATUS_RXOVF_Pos) /*!< PS2_T::PS2STATUS: RXOVF Mask */ + +#define PS2_PS2STATUS_TXEMPTY_Pos 7 /*!< PS2_T::PS2STATUS: TXEMPTY Position */ +#define PS2_PS2STATUS_TXEMPTY_Msk (1ul << PS2_PS2STATUS_TXEMPTY_Pos) /*!< PS2_T::PS2STATUS: TXEMPTY Mask */ + +#define PS2_PS2STATUS_BYTEIDX_Pos 8 /*!< PS2_T::PS2STATUS: BYTEIDX Position */ +#define PS2_PS2STATUS_BYTEIDX_Msk (0xFul << PS2_PS2STATUS_BYTEIDX_Pos) /*!< PS2_T::PS2STATUS: BYTEIDX Mask */ + +/* PS/2 PS2INTID Bit Field Definitions */ +#define PS2_PS2INTID_RXINT_Pos 0 /*!< PS2_T::PS2INTID: RXINT Position */ +#define PS2_PS2INTID_RXINT_Msk (1ul << PS2_PS2INTID_RXINT_Pos) /*!< PS2_T::PS2INTID: RXINT Mask */ + +#define PS2_PS2INTID_TXINT_Pos 1 /*!< PS2_T::PS2INTID: TXINT Position */ +#define PS2_PS2INTID_TXINT_Msk (1ul << PS2_PS2INTID_TXINT_Pos) /*!< PS2_T::PS2INTID: TXINT Mask */ +/*@}*/ /* end of group REG_PS2_BITMASK */ +/*@}*/ /* end of group REG_PS2 */ + +/*----------------------------- PWM Controller -------------------------------*/ +/** @addtogroup REG_PWM Pulse Width Modulation Controller (PWM) + Memory Mapped Structure for PWM Generator and Capture Timer + @{ + */ + +typedef struct +{ + + +/** + * @var PWM_T::PPR + * Offset: 0x00 PWM Prescaler Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |CP01 |Clock Prescaler 0 (PWM-Timer 0 / 1 For Group A) + * | | |Clock input is divided by (CP01 + 1) before it is fed to the corresponding PWM-timer + * | | |If CP01=0, then the clock prescaler 0 output clock will be stopped. + * | | |So corresponding PWM-timer will also be stopped. + * |[15:8] |CP23 |Clock Prescaler 2 (PWM-Timer2 / 3 For Group A) + * | | |Clock input is divided by (CP23 + 1) before it is fed to the corresponding PWM-timer + * | | |If CP23=0, then the clock prescaler 2 output clock will be stopped. + * | | |So corresponding PWM-timer will also be stopped. + * |[23:16] |DZI01 |Dead-Zone Interval For Pair Of Channel 0 And Channel 1 (PWM0 And PWM1 Pair For PWM Group A) + * | | |These 8-bit determine the Dead-zone length. + * | | |The unit time of dead-zone length is received from corresponding CSR bits. + * |[31:24] |DZI23 |Dead-Zone Interval For Pair Of Channel2 And Channel3 (PWM2 And PWM3 Pair For PWM Group A) + * | | |These 8-bit determine the Dead-zone length. + * | | |The unit time of dead-zone length is received from corresponding CSR bits. + * @var PWM_T::CSR + * Offset: 0x04 PWM Clock Source Divider Select Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |CSR0 |Timer 0 Clock Source Selection(PWM timer 0 for group A) + * | | |Select clock input for PWM timer, please refer to CSR3. + * |[6:4] |CSR1 |Timer 1 Clock Source Selection(PWM timer 1 for group A) + * | | |Select clock input for PWM timer, please refer to CSR3. + * |[10:8] |CSR2 |Timer 2 Clock Source Selection(PWM timer 2 for group A) + * | | |Select clock input for PWM timer, please refer to CSR3. + * |[14:12] |CSR3 |Timer 3 Clock Source Selection (PWM timer 3 for group A) + * | | |Select clock input for timer. + * | | |000 = Input clock divided by 2. + * | | |001 = Input clock divided by 4. + * | | |010 = Input clock divided by 8. + * | | |011 = Input clock divided by 16. + * | | |100 = Input clock divided by 1. + * @var PWM_T::PCR + * Offset: 0x08 PWM Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CH0EN |PWM-Timer 0 Enable Bit (PWM Timer 0 For Group A) + * | | |0 = Corresponding PWM-Timer running Stopped. + * | | |1 = Corresponding PWM-Timer start run Enabled. + * |[1] |CH0PINV |PWM-Timer 0 Output Polar Inverse Enable Bit (PWM Timer 0 For Group A) + * | | |0 = PWM0 output polar inverse Disabled. + * | | |1 = PWM0 output polar inverse Enabled. + * |[2] |CH0INV |PWM-Timer 0 Output Inverter Enable Bit (PWM Timer 0 For Group A) + * | | |0 = Inverter Disabled. + * | | |1 = Inverter Enabled. + * |[3] |CH0MOD |PWM-Timer 0 Auto-Reload/One-Shot Mode (PWM Timer 0 For Group A) + * | | |0 = One-shot mode. + * | | |1 = Auto-reload mode. + * | | |Note: If there is a transition at this bit, it will cause CNR0 and CMR0 be cleared. + * |[4] |DZEN01 |Dead-Zone 0 Generator Enable Bit (PWM0 And PWM1 Pair For PWM Group A) + * | | |0 = Disabled. + * | | |1 = Enabled. + * | | |Note: When Dead-zone generator is enabled, the pair of PWM0 and PWM1 becomes a complementary pair for PWM group A. + * |[5] |DZEN23 |Dead-Zone 2 Generator Enable Bit (PWM2 And PWM3 Pair For PWM Group A) + * | | |0 = Dead-zone 2 generator Disabled. + * | | |1 = Dead-zone 2 generator Enabled. + * | | |Note: When Dead-zone generator is enabled, the pair of PWM2 and PWM3 becomes a complementary pair for PWM group A. + * |[8] |CH1EN |PWM-Timer 1 Enable Bit (PWM Timer 1 For Group A) + * | | |0 = Corresponding PWM-Timer running Stopped. + * | | |1 = Corresponding PWM-Timer start run Enabled. + * |[9] |CH1PINV |PWM-Timer 1 Output Polar Inverse Enable Bit (PWM Timer 1 For Group A) + * | | |0 = PWM1 output polar inverse Disabled. + * | | |1 = PWM1 output polar inverse Enabled. + * |[10] |CH1INV |PWM-Timer 1 Output Inverter Enable Bit (PWM Timer 1 For Group A) + * | | |0 = Inverter Disable. + * | | |1 = Inverter Enable. + * |[11] |CH1MOD |PWM-Timer 1 Auto-Reload/One-Shot Mode (PWM Timer 1 For Group A) + * | | |0 = One-shot mode. + * | | |1 = Auto-reload mode. + * | | |Note: If there is a transition at this bit, it will cause CNR1 and CMR1 be cleared. + * |[16] |CH2EN |PWM-Timer 2 Enable Bit (PWM Timer 2 For Group A) + * | | |0 = Corresponding PWM-Timer running Stopped. + * | | |1 = Corresponding PWM-Timer start run Enabled. + * |[17] |CH2PINV |PWM-Timer 2 Output Polar Inverse Enable Bit (PWM Timer 2 For Group A) + * | | |0 = PWM2 output polar inverse Disabled. + * | | |1 = PWM2 output polar inverse Enabled. + * |[18] |CH2INV |PWM-Timer 2 Output Inverter Enable Bit (PWM Timer 2 For Group A) + * | | |0 = Inverter Disabled. + * | | |1 = Inverter Enabled. + * |[19] |CH2MOD |PWM-Timer 2 Auto-Reload/One-Shot Mode (PWM Timer 2 For Group A) + * | | |0 = One-shot mode. + * | | |1 = Auto-reload mode. + * | | |Note: If there is a transition at this bit, it will cause CNR2 and CMR2 be cleared. + * |[24] |CH3EN |PWM-Timer 3 Enable Bit (PWM Timer 3 For Group A) + * | | |0 = Corresponding PWM-Timer running Stopped. + * | | |1 = Corresponding PWM-Timer start run Enabled. + * |[25] |CH3PINV |PWM-Timer 3 Output Polar Inverse Enable (PWM Timer 3 For Group A) + * | | |0 = PWM3 output polar inverse Disable. + * | | |1 = PWM3 output polar inverse Enable. + * |[26] |CH3INV |PWM-Timer 3 Output Inverter Enable Bit (PWM Timer 3 For Group A) + * | | |0 = Inverter Disabled. + * | | |1 = Inverter Enabled. + * |[27] |CH3MOD |PWM-Timer 3 Auto-Reload/One-Shot Mode (PWM Timer 3 For Group A) + * | | |0 = One-shot mode. + * | | |1 = Auto-reload mode. + * | | |Note: If there is a transition at this bit, it will cause CNR3 and CMR3 be cleared. + * |[30] |PWM01TYPE |PWM01 Aligned Type Selection Bit (PWM0 And PWM1 Pair For PWM Group A) + * | | |0 = Edge-aligned type. + * | | |1 = Center-aligned type. + * |[31] |PWM23TYPE |PWM23 Aligned Type Selection Bit (PWM2 And PWM3 Pair For PWM Group A) + * | | |0 = Edge-aligned type. + * | | |1 = Center-aligned type. + * @var PWM_T::CNR0 + * Offset: 0x0C PWM Counter Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CNRx |PWM Timer Loaded Value + * | | |CNR determines the PWM period. + * | | |PWM frequency = PWMxy_CLK/[(prescale+1)*(clock divider)*(CNR+1)]; where xy, could be 01 or 23, depends on selected PWM channel. + * | | |For Edge-aligned type: + * | | | Duty ratio = (CMR+1)/(CNR+1). + * | | | CMR >= CNR: PWM output is always high. + * | | | CMR < CNR: PWM low width = (CNR-CMR) unit; PWM high width = (CMR+1) unit. + * | | | CMR = 0: PWM low width = (CNR) unit; PWM high width = 1 unit. + * | | |For Center-aligned type: + * | | | Duty ratio = [(2 x CMR) + 1]/[2 x (CNR+1)]. + * | | | CMR > CNR: PWM output is always high. + * | | | CMR <= CNR: PWM low width = 2 x (CNR-CMR) + 1 unit; PWM high width = (2 x CMR) + 1 unit. + * | | | CMR = 0: PWM low width = 2 x CNR + 1 unit; PWM high width = 1 unit. + * | | |(Unit = one PWM clock cycle). + * | | |Note: Any write to CNR will take effect in next PWM cycle. + * | | |Note: When PWM operating at Center-aligned type, CNR value should be set between 0x0000 to 0xFFFE. + * | | |If CNR equal to 0xFFFF, the PWM will work unpredictable. + * | | |Note: When CNR value is set to 0, PWM output is always high. + * @var PWM_T::CMR0 + * Offset: 0x10 PWM Comparator Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CMRx |PWM Comparator Register + * | | |CMR determines the PWM duty. + * | | |PWM frequency = PWMxy_CLK/[(prescale+1)*(clock divider)*(CNR+1)]; where xy, could be 01 or 23, depends on selected PWM channel. + * | | |For Edge-aligned type: + * | | | Duty ratio = (CMR+1)/(CNR+1). + * | | | CMR >= CNR: PWM output is always high. + * | | | CMR < CNR: PWM low width = (CNR-CMR) unit; PWM high width = (CMR+1) unit. + * | | | CMR = 0: PWM low width = (CNR) unit; PWM high width = 1 unit. + * | | |For Center-aligned type: + * | | | Duty ratio = [(2 x CMR) + 1]/[2 x (CNR+1)]. + * | | | CMR > CNR: PWM output is always high. + * | | | CMR <= CNR: PWM low width = 2 x (CNR-CMR) + 1 unit; PWM high width = (2 x CMR) + 1 unit. + * | | | CMR = 0: PWM low width = 2 x CNR + 1 unit; PWM high width = 1 unit. + * | | |(Unit = one PWM clock cycle). + * | | |Note: Any write to CMR will take effect in next PWM cycle. + * @var PWM_T::PDR0 + * Offset: 0x14 PWM Data Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PDRx |PWM Data Register + * | | |User can monitor PDR to know the current value in 16-bit counter. + * @var PWM_T::CNR1 + * Offset: 0x18 PWM Counter Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CNRx |PWM Timer Loaded Value + * | | |CNR determines the PWM period. + * | | |PWM frequency = PWMxy_CLK/[(prescale+1)*(clock divider)*(CNR+1)]; where xy, could be 01 or 23, depends on selected PWM channel. + * | | |For Edge-aligned type: + * | | | Duty ratio = (CMR+1)/(CNR+1). + * | | | CMR >= CNR: PWM output is always high. + * | | | CMR < CNR: PWM low width = (CNR-CMR) unit; PWM high width = (CMR+1) unit. + * | | | CMR = 0: PWM low width = (CNR) unit; PWM high width = 1 unit. + * | | |For Center-aligned type: + * | | | Duty ratio = [(2 x CMR) + 1]/[2 x (CNR+1)]. + * | | | CMR > CNR: PWM output is always high. + * | | | CMR <= CNR: PWM low width = 2 x (CNR-CMR) + 1 unit; PWM high width = (2 x CMR) + 1 unit. + * | | | CMR = 0: PWM low width = 2 x CNR + 1 unit; PWM high width = 1 unit. + * | | |(Unit = one PWM clock cycle). + * | | |Note: Any write to CNR will take effect in next PWM cycle. + * | | |Note: When PWM operating at Center-aligned type, CNR value should be set between 0x0000 to 0xFFFE. + * | | |If CNR equal to 0xFFFF, the PWM will work unpredictable. + * | | |Note: When CNR value is set to 0, PWM output is always high. + * @var PWM_T::CMR1 + * Offset: 0x1C PWM Comparator Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CMRx |PWM Comparator Register + * | | |CMR determines the PWM duty. + * | | |PWM frequency = PWMxy_CLK/[(prescale+1)*(clock divider)*(CNR+1)]; where xy, could be 01 or 23, depends on selected PWM channel. + * | | |For Edge-aligned type: + * | | | Duty ratio = (CMR+1)/(CNR+1). + * | | | CMR >= CNR: PWM output is always high. + * | | | CMR < CNR: PWM low width = (CNR-CMR) unit; PWM high width = (CMR+1) unit. + * | | | CMR = 0: PWM low width = (CNR) unit; PWM high width = 1 unit. + * | | |For Center-aligned type: + * | | | Duty ratio = [(2 x CMR) + 1]/[2 x (CNR+1)]. + * | | | CMR > CNR: PWM output is always high. + * | | | CMR <= CNR: PWM low width = 2 x (CNR-CMR) + 1 unit; PWM high width = (2 x CMR) + 1 unit. + * | | | CMR = 0: PWM low width = 2 x CNR + 1 unit; PWM high width = 1 unit. + * | | |(Unit = one PWM clock cycle). + * | | |Note: Any write to CMR will take effect in next PWM cycle. + * @var PWM_T::PDR1 + * Offset: 0x20 PWM Data Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PDRx |PWM Data Register + * | | |User can monitor PDR to know the current value in 16-bit counter. + * @var PWM_T::CNR2 + * Offset: 0x24 PWM Counter Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CNRx |PWM Timer Loaded Value + * | | |CNR determines the PWM period. + * | | |PWM frequency = PWMxy_CLK/[(prescale+1)*(clock divider)*(CNR+1)]; where xy, could be 01 or 23, depends on selected PWM channel. + * | | |For Edge-aligned type: + * | | | Duty ratio = (CMR+1)/(CNR+1). + * | | | CMR >= CNR: PWM output is always high. + * | | | CMR < CNR: PWM low width = (CNR-CMR) unit; PWM high width = (CMR+1) unit. + * | | | CMR = 0: PWM low width = (CNR) unit; PWM high width = 1 unit. + * | | |For Center-aligned type: + * | | | Duty ratio = [(2 x CMR) + 1]/[2 x (CNR+1)]. + * | | | CMR > CNR: PWM output is always high. + * | | | CMR <= CNR: PWM low width = 2 x (CNR-CMR) + 1 unit; PWM high width = (2 x CMR) + 1 unit. + * | | | CMR = 0: PWM low width = 2 x CNR + 1 unit; PWM high width = 1 unit. + * | | |(Unit = one PWM clock cycle). + * | | |Note: Any write to CNR will take effect in next PWM cycle. + * | | |Note: When PWM operating at Center-aligned type, CNR value should be set between 0x0000 to 0xFFFE. + * | | |If CNR equal to 0xFFFF, the PWM will work unpredictable. + * | | |Note: When CNR value is set to 0, PWM output is always high. + * @var PWM_T::CMR2 + * Offset: 0x28 PWM Comparator Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CMRx |PWM Comparator Register + * | | |CMR determines the PWM duty. + * | | |PWM frequency = PWMxy_CLK/[(prescale+1)*(clock divider)*(CNR+1)]; where xy, could be 01 or 23, depends on selected PWM channel. + * | | |For Edge-aligned type: + * | | | Duty ratio = (CMR+1)/(CNR+1). + * | | | CMR >= CNR: PWM output is always high. + * | | | CMR < CNR: PWM low width = (CNR-CMR) unit; PWM high width = (CMR+1) unit. + * | | | CMR = 0: PWM low width = (CNR) unit; PWM high width = 1 unit. + * | | |For Center-aligned type: + * | | | Duty ratio = [(2 x CMR) + 1]/[2 x (CNR+1)]. + * | | | CMR > CNR: PWM output is always high. + * | | | CMR <= CNR: PWM low width = 2 x (CNR-CMR) + 1 unit; PWM high width = (2 x CMR) + 1 unit. + * | | | CMR = 0: PWM low width = 2 x CNR + 1 unit; PWM high width = 1 unit. + * | | |(Unit = one PWM clock cycle). + * | | |Note: Any write to CMR will take effect in next PWM cycle. + * @var PWM_T::PDR2 + * Offset: 0x2C PWM Data Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PDRx |PWM Data Register + * | | |User can monitor PDR to know the current value in 16-bit counter. + * @var PWM_T::CNR3 + * Offset: 0x30 PWM Counter Register 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CNRx |PWM Timer Loaded Value + * | | |CNR determines the PWM period. + * | | |PWM frequency = PWMxy_CLK/[(prescale+1)*(clock divider)*(CNR+1)]; where xy, could be 01 or 23, depends on selected PWM channel. + * | | |For Edge-aligned type: + * | | | Duty ratio = (CMR+1)/(CNR+1). + * | | | CMR >= CNR: PWM output is always high. + * | | | CMR < CNR: PWM low width = (CNR-CMR) unit; PWM high width = (CMR+1) unit. + * | | | CMR = 0: PWM low width = (CNR) unit; PWM high width = 1 unit. + * | | |For Center-aligned type: + * | | | Duty ratio = [(2 x CMR) + 1]/[2 x (CNR+1)]. + * | | | CMR > CNR: PWM output is always high. + * | | | CMR <= CNR: PWM low width = 2 x (CNR-CMR) + 1 unit; PWM high width = (2 x CMR) + 1 unit. + * | | | CMR = 0: PWM low width = 2 x CNR + 1 unit; PWM high width = 1 unit. + * | | |(Unit = one PWM clock cycle). + * | | |Note: Any write to CNR will take effect in next PWM cycle. + * | | |Note: When PWM operating at Center-aligned type, CNR value should be set between 0x0000 to 0xFFFE. + * | | |If CNR equal to 0xFFFF, the PWM will work unpredictable. + * | | |Note: When CNR value is set to 0, PWM output is always high. + * @var PWM_T::CMR3 + * Offset: 0x34 PWM Comparator Register 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CMRx |PWM Comparator Register + * | | |CMR determines the PWM duty. + * | | |PWM frequency = PWMxy_CLK/[(prescale+1)*(clock divider)*(CNR+1)]; where xy, could be 01 or 23, depends on selected PWM channel. + * | | |For Edge-aligned type: + * | | | Duty ratio = (CMR+1)/(CNR+1). + * | | | CMR >= CNR: PWM output is always high. + * | | | CMR < CNR: PWM low width = (CNR-CMR) unit; PWM high width = (CMR+1) unit. + * | | | CMR = 0: PWM low width = (CNR) unit; PWM high width = 1 unit. + * | | |For Center-aligned type: + * | | | Duty ratio = [(2 x CMR) + 1]/[2 x (CNR+1)]. + * | | | CMR > CNR: PWM output is always high. + * | | | CMR <= CNR: PWM low width = 2 x (CNR-CMR) + 1 unit; PWM high width = (2 x CMR) + 1 unit. + * | | | CMR = 0: PWM low width = 2 x CNR + 1 unit; PWM high width = 1 unit. + * | | |(Unit = one PWM clock cycle). + * | | |Note: Any write to CMR will take effect in next PWM cycle. + * @var PWM_T::PDR3 + * Offset: 0x38 PWM Data Register 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PDRx |PWM Data Register + * | | |User can monitor PDR to know the current value in 16-bit counter. + * @var PWM_T::PIER + * Offset: 0x40 PWM Interrupt Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PWMIE0 |PWM Channel 0 Period Interrupt Enable Bit + * | | |0 = PWM channel 0 interrupt Disabled. + * | | |1 = PWM channel 0 interrupt Enabled. + * |[1] |PWMIE1 |PWM Channel 1 Period Interrupt Enable Bit + * | | |0 = PWM channel 1 interrupt Disabled. + * | | |1 = PWM channel 1 interrupt Enabled. + * |[2] |PWMIE2 |PWM Channel 2 Period Interrupt Enable Bit + * | | |0 = PWM channel 2 interrupt Disabled. + * | | |1 = PWM channel 2 interrupt Enabled. + * |[3] |PWMIE3 |PWM Channel 3 Period Interrupt Enable Bit + * | | |0 = PWM channel 3 interrupt Disabled. + * | | |1 = PWM channel 3 interrupt Enabled. + * |[8] |PWMDIE0 |PWM Channel 0 Duty Interrupt Enable Bit + * | | |0 = PWM channel 0 duty interrupt Disabled. + * | | |1 = PWM channel 0 duty interrupt Enabled. + * |[9] |PWMDIE1 |PWM Channel 1 Duty Interrupt Enable Bit + * | | |0 = PWM channel 1 duty interrupt Disabled. + * | | |1 = PWM channel 1 duty interrupt Enabled. + * |[10] |PWMDIE2 |PWM Channel 2 Duty Interrupt Enable Bit + * | | |0 = PWM channel 2 duty interrupt Disabled. + * | | |1 = PWM channel 2 duty interrupt Enabled. + * |[11] |PWMDIE3 |PWM Channel 3 Duty Interrupt Enable Bit + * | | |0 = PWM channel 3 duty interrupt Disabled. + * | | |1 = PWM channel 3 duty interrupt Enabled. + * |[16] |INT01TYPE |PWM01 Interrupt Period Type Selection Bit (PWM0 And PWM1 Pair For PWM Group A) + * | | |0 = PWMIFn will be set if PWM counter underflow. + * | | |1 = PWMIFn will be set if PWM counter matches CNRn register. + * | | |Note: This bit is effective when PWM in Center-aligned type only. + * |[17] |INT23TYPE |PWM23 Interrupt Period Type Selection Bit (PWM2 And PWM3 Pair For PWM Group A) + * | | |0 = PWMIFn will be set if PWM counter underflow. + * | | |1 = PWMIFn will be set if PWM counter matches CNRn register. + * | | |Note: This bit is effective when PWM in Center-aligned type only. + * @var PWM_T::PIIR + * Offset: 0x44 PWM Interrupt Indication Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PWMIF0 |PWM Channel 0 Period Interrupt Status + * | | |This bit is set by hardware when PWM0 counter reaches the requirement of interrupt (depend on INT01TYPE bit of PIER register) + * | | |if PWM0 interrupt enable bit (PWMIE0) is 1, This bit can be cleared to 0 by software writing '1'. + * |[1] |PWMIF1 |PWM Channel 1 Period Interrupt Status + * | | |This bit is set by hardware when PWM1 counter reaches the requirement of interrupt (depend on INT01TYPE bit of PIER register) + * | | |if PWM1 interrupt enable bit (PWMIE1) is 1, This bit can be cleared to 0 by software writing '1'. + * |[2] |PWMIF2 |PWM Channel 2 Period Interrupt Status + * | | |This bit is set by hardware when PWM2 counter reaches the requirement of interrupt (depend on INT23TYPE bit of PIER register) + * | | |if PWM2 interrupt enable bit (PWMIE2) is 1, This bit can be cleared to 0 by software writing '1'. + * |[3] |PWMIF3 |PWM Channel 3 Period Interrupt Status + * | | |This bit is set by hardware when PWM3 counter reaches the requirement of interrupt (depend on INT23TYPE bit of PIER register) + * | | |if PWM3 interrupt enable bit (PWMIE3) is 1, This bit can be cleared to 0 by software writing '1'. + * |[8] |PWMDIF0 |PWM Channel 0 Duty Interrupt Flag + * | | |Flag is set by hardware when channel 0 PWM counter down count and reaches CMR0, software can clear this bit by writing a one to it. + * | | |Note: If CMR equal to CNR, this flag is not working. + * |[9] |PWMDIF1 |PWM Channel 1 Duty Interrupt Flag + * | | |Flag is set by hardware when channel 1 PWM counter down count and reaches CMR1, software can clear this bit by writing a one to it. + * | | |Note: If CMR equal to CNR, this flag is not working. + * |[10] |PWMDIF2 |PWM Channel 2 Duty Interrupt Flag + * | | |Flag is set by hardware when channel 2 PWM counter down count and reaches CMR2, software can clear this bit by writing a one to it. + * | | |Note: If CMR equal to CNR, this flag is not working. + * |[11] |PWMDIF3 |PWM Channel 3 Duty Interrupt Flag + * | | |Flag is set by hardware when channel 3 PWM counter down count and reaches CMR3, software can clear this bit by writing a one to it. + * | | |Note: If CMR equal to CNR, this flag is not working. + * @var PWM_T::CCR0 + * Offset: 0x50 PWM Capture Control Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |INV0 |Channel 0 Inverter Enable Bit + * | | |0 = Inverter Disabled. + * | | |1 = Inverter Enabled. Reverse the input signal from GPIO before fed to Capture timer + * |[1] |CRL_IE0 |Channel 0 Rising Latch Interrupt Enable Bit + * | | |When Enabled, if Capture detects PWM group channel 0 has rising transition, Capture will issue an Interrupt. + * | | |0 = Rising latch interrupt Disabled. + * | | |1 = Rising latch interrupt Enabled. + * |[2] |CFL_IE0 |Channel 0 Falling Latch Interrupt Enable Bit + * | | |When Enabled, if Capture detects PWM group channel 0 has falling transition, Capture will issue an Interrupt. + * | | |0 = Falling latch interrupt Disabled. + * | | |1 = Falling latch interrupt Enabled. + * |[3] |CAPCH0EN |Channel 0 Capture Function Enable Bit + * | | |When Enabled, Capture latched the PWM-counter value and saved to CRLR (Rising latch) and CFLR (Falling latch). + * | | |When Disabled, Capture does not update CRLR and CFLR, and disable PWM group channel 0 Interrupt. + * | | |0 = Capture function on PWM group channel 0 Disabled. + * | | |1 = Capture function on PWM group channel 0 Enabled. + * |[4] |CAPIF0 |Channel 0 Capture Interrupt Indication Flag + * | | |If PWM group channel 0 rising latch interrupt is enabled (CRL_IE0 = 1), a rising transition + * | | |occurs at PWM group channel 0 will result in CAPIF0 to high; Similarly, a falling transition + * | | |will cause CAPIF0 to be set high if PWM group channel 0 falling latch interrupt is enabled (CFL_IE0 = 1). + * | | |This bit can be cleared to 0 by software writing '1'. + * |[6] |CRLRI0 |CRLR0 Latched Indicator Bit + * | | |When PWM group input channel 0 has a rising transition, CRLR0 was latched with the value of PWM down-counter and this bit is set by hardware. + * | | |This bit can be cleared to 0 by software writing '1'. + * |[7] |CFLRI0 |CFLR0 Latched Indicator Bit + * | | |When PWM group input channel 0 has a falling transition, CFLR0 was latched with the value of PWM down-counter and this bit is set by hardware. + * | | |This bit can be cleared to 0 by software writing '1'. + * |[16] |INV1 |Channel 1 Inverter Enable Bit + * | | |0 = Inverter Disabled. + * | | |1 = Inverter Enabled. Reverse the input signal from GPIO before fed to Capture timer + * |[17] |CRL_IE1 |Channel 1 Rising Latch Interrupt Enable Bit + * | | |When Enabled, if Capture detects PWM group channel 1 has rising transition, Capture will issue an Interrupt. + * | | |0 = Rising latch interrupt Disabled. + * | | |1 = Rising latch interrupt Enabled. + * |[18] |CFL_IE1 |Channel 1 Falling Latch Interrupt Enable Bit + * | | |When Enabled, if Capture detects PWM group channel 1 has falling transition, Capture will issue an Interrupt. + * | | |0 = Falling latch interrupt Disabled. + * | | |1 = Falling latch interrupt Enabled. + * |[19] |CAPCH1EN |Channel 1 Capture Function Enable Bit + * | | |When Enabled, Capture latched the PWM-counter and saved to CRLR (Rising latch) and CFLR (Falling latch). + * | | |When Disabled, Capture does not update CRLR and CFLR, and disable PWM group channel 1 Interrupt. + * | | |0 = Capture function on PWM group channel 1 Disabled. + * | | |1 = Capture function on PWM group channel 1 Enabled. + * |[20] |CAPIF1 |Channel 1 Capture Interrupt Indication Flag + * | | |If PWM group channel 1 rising latch interrupt is enabled (CRL_IE1 = 1), a rising transition + * | | |occurs at PWM group channel 1 will result in CAPIF1 to high; Similarly, a falling transition + * | | |will cause CAPIF1 to be set high if PWM group channel 1 falling latch interrupt is enabled (CFL_IE1 = 1). + * | | |This bit can be cleared to 0 by software writing '1'. + * |[22] |CRLRI1 |CRLR1 Latched Indicator Bit + * | | |When PWM group input channel 1 has a rising transition, CRLR1 was latched with the value of PWM down-counter and this bit is set by hardware. + * | | |This bit can be cleared to 0 by software writing '1'. + * |[23] |CFLRI1 |CFLR1 Latched Indicator Bit + * | | |When PWM group input channel 1 has a falling transition, CFLR1 was latched with the value of PWM down-counter and this bit is set by hardware. + * | | |This bit can be cleared to 0 by software writing '1'. + * @var PWM_T::CCR2 + * Offset: 0x54 PWM Capture Control Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |INV2 |Channel 2 Inverter Enable Bit + * | | |0 = Inverter Disabled. + * | | |1 = Inverter Enabled. Reverse the input signal from GPIO before fed to Capture timer + * |[1] |CRL_IE2 |Channel 2 Rising Latch Interrupt Enable Bit + * | | |When Enabled, if Capture detects PWM group channel 2 has rising transition, Capture will issue an Interrupt. + * | | |0 = Rising latch interrupt Disabled. + * | | |1 = Rising latch interrupt Enabled. + * |[2] |CFL_IE2 |Channel 2 Falling Latch Interrupt Enable Bit + * | | |When Enabled, if Capture detects PWM group channel 2 has falling transition, Capture will issue an Interrupt. + * | | |0 = Falling latch interrupt Disabled. + * | | |1 = Falling latch interrupt Enabled. + * |[3] |CAPCH2EN |Channel 2 Capture Function Enable Bit + * | | |When Enabled, Capture latched the PWM-counter value and saved to CRLR (Rising latch) and CFLR (Falling latch). + * | | |When Disabled, Capture does not update CRLR and CFLR, and disable PWM group channel 2 Interrupt. + * | | |0 = Capture function on PWM group channel 2 Disabled. + * | | |1 = Capture function on PWM group channel 2 Enabled. + * |[4] |CAPIF2 |Channel 2 Capture Interrupt Indication Flag + * | | |If PWM group channel 2 rising latch interrupt is enabled (CRL_IE2=1), a rising transition + * | | |occurs at PWM group channel 2 will result in CAPIF2 to high; Similarly, a falling transition + * | | |will cause CAPIF2 to be set high if PWM group channel 2 falling latch interrupt is enabled (CFL_IE2=1). + * | | |This bit can be cleared to 0 by software writing '1'. + * |[6] |CRLRI2 |CRLR2 Latched Indicator Bit + * | | |When PWM group input channel 2 has a rising transition, CRLR2 was latched with the value of PWM down-counter and this bit is set by hardware. + * | | |This bit can be cleared to 0 by software writing '1'. + * |[7] |CFLRI2 |CFLR2 Latched Indicator Bit + * | | |When PWM group input channel 2 has a falling transition, CFLR2 was latched with the value of PWM down-counter and this bit is set by hardware. + * | | |This bit can be cleared to 0 by software writing '1'. + * |[16] |INV3 |Channel 3 Inverter Enable Bit + * | | |0 = Inverter Disabled. + * | | |1 = Inverter Enabled. Reverse the input signal from GPIO before fed to Capture timer + * |[17] |CRL_IE3 |Channel 3 Rising Latch Interrupt Enable Bit + * | | |When Enabled, if Capture detects PWM group channel 3 has rising transition, Capture will issue an Interrupt. + * | | |0 = Rising latch interrupt Disabled. + * | | |1 = Rising latch interrupt Enabled. + * |[18] |CFL_IE3 |Channel 3 Falling Latch Interrupt Enable Bit + * | | |When Enabled, if Capture detects PWM group channel 3 has falling transition, Capture will issue an Interrupt. + * | | |0 = Falling latch interrupt Disabled. + * | | |1 = Falling latch interrupt Enabled. + * |[19] |CAPCH3EN |Channel 3 Capture Function Enable Bit + * | | |When Enabled, Capture latched the PWM-counter and saved to CRLR (Rising latch) and CFLR (Falling latch). + * | | |When Disabled, Capture does not update CRLR and CFLR, and disable PWM group channel 3 Interrupt. + * | | |0 = Capture function on PWM group channel 3 Disabled. + * | | |1 = Capture function on PWM group channel 3 Enabled. + * |[20] |CAPIF3 |Channel 3 Capture Interrupt Indication Flag + * | | |If PWM group channel 3 rising latch interrupt is enabled (CRL_IE3=1), a rising transition + * | | |occurs at PWM group channel 3 will result in CAPIF3 to high; Similarly, a falling transition + * | | |will cause CAPIF3 to be set high if PWM group channel 3 falling latch interrupt is enabled (CFL_IE3=1). + * | | |This bit can be cleared to 0 by software writing '1'. + * |[22] |CRLRI3 |CRLR3 Latched Indicator Bit + * | | |When PWM group input channel 3 has a rising transition, CRLR3 was latched with the value of PWM down-counter and this bit is set by hardware. + * | | |This bit can be cleared to 0 by software writing '1'. + * |[23] |CFLRI3 |CFLR3 Latched Indicator Bit + * | | |When PWM group input channel 3 has a falling transition, CFLR3 was latched with the value of PWM down-counter and this bit is set by hardware. + * | | |This bit can be cleared to 0 by software writing '1'. + * @var PWM_T::CRLR0 + * Offset: 0x58 PWM Capture Rising Latch Register (Channel 0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CRLRx |Capture Rising Latch Register + * | | |Latch the PWM counter when Channel 0/1/2/3 has rising transition. + * @var PWM_T::CFLR0 + * Offset: 0x5C PWM Capture Falling Latch Register (Channel 0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CFLRx |Capture Falling Latch Register + * | | |Latch the PWM counter when Channel 0/1/2/3 has falling transition. + * @var PWM_T::CRLR1 + * Offset: 0x60 PWM Capture Rising Latch Register (Channel 1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CRLRx |Capture Rising Latch Register + * | | |Latch the PWM counter when Channel 0/1/2/3 has rising transition. + * @var PWM_T::CFLR1 + * Offset: 0x64 PWM Capture Falling Latch Register (Channel 1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CFLRx |Capture Falling Latch Register + * | | |Latch the PWM counter when Channel 0/1/2/3 has falling transition. + * @var PWM_T::CRLR2 + * Offset: 0x68 PWM Capture Rising Latch Register (Channel 2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CRLRx |Capture Rising Latch Register + * | | |Latch the PWM counter when Channel 0/1/2/3 has rising transition. + * @var PWM_T::CFLR2 + * Offset: 0x6C PWM Capture Falling Latch Register (Channel 2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CFLRx |Capture Falling Latch Register + * | | |Latch the PWM counter when Channel 0/1/2/3 has falling transition. + * @var PWM_T::CRLR3 + * Offset: 0x70 PWM Capture Rising Latch Register (Channel 3) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CRLRx |Capture Rising Latch Register + * | | |Latch the PWM counter when Channel 0/1/2/3 has rising transition. + * @var PWM_T::CFLR3 + * Offset: 0x74 PWM Capture Falling Latch Register (Channel 3) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CFLRx |Capture Falling Latch Register + * | | |Latch the PWM counter when Channel 0/1/2/3 has falling transition. + * @var PWM_T::CAPENR + * Offset: 0x78 PWM Capture Input 0~3 Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |CAPENR |Capture Input Enable Register + * | | |There are four capture inputs from pad. Bit0~Bit3 are used to control each input enable or disable. + * | | |If enabled, PWMn multi-function pin input will affect its input capture function; + * | | |If Disabled, PWMn multi-function pin input does not affect input capture function. + * | | |xxx1 = Capture channel 0 is from pin PA.12. + * | | |xx1x = Capture channel 1 is from pin PA.13. + * | | |x1xx = Capture channel 2 is from pin PA.14. + * | | |1xxx = Capture channel 3 is from pin PA.15. + * @var PWM_T::POE + * Offset: 0x7C PWM Output Enable for Channel 0~3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PWM0 |Channel 0 Output Enable Register + * | | |0 = PWM channel 0 output to pin Disabled. + * | | |1 = PWM channel 0 output to pin Enabled. + * | | |Note: The corresponding GPIO pin must also be switched to PWM function + * |[1] |PWM1 |Channel 1 Output Enable Register + * | | |0 = PWM channel 1 output to pin Disabled. + * | | |1 = PWM channel 1 output to pin Enabled. + * | | |Note: The corresponding GPIO pin must also be switched to PWM function + * |[2] |PWM2 |Channel 2 Output Enable Register + * | | |0 = PWM channel 2 output to pin Disabled. + * | | |1 = PWM channel 2 output to pin Enabled. + * | | |Note: The corresponding GPIO pin must also be switched to PWM function + * |[3] |PWM3 |Channel 3 Output Enable Register + * | | |0 = Disable PWM channel 3 output to pin. + * | | |1 = Enable PWM channel 3 output to pin. + * | | |Note: The corresponding GPIO pin must also be switched to PWM function + * @var PWM_T::TCON + * Offset: 0x80 PWM Trigger Control for Channel 0~3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PWM0TEN |Channel 0 Center-Aligned Trigger Enable Register + * | | |PWM can trigger ADC to start conversion when PWM counter up count to CNR if this bit is set to 1. + * | | |0 = PWM channel 0 trigger ADC function Disabled. + * | | |1 = PWM channel 0 trigger ADC function Enabled. + * | | |Note: This function is only supported when PWM operating at Center-aligned type. + * |[1] |PWM1TEN |Channel 1 Center-Aligned Trigger Enable Register + * | | |PWM can trigger ADC to start conversion when PWM counter up count to CNR if this bit is set to 1. + * | | |0 = PWM channel 1 trigger ADC function Disabled. + * | | |1 = PWM channel 1 trigger ADC function Enabled. + * | | |Note: This function is only supported when PWM operating at Center-aligned type. + * |[2] |PWM2TEN |Channel 2 Center-Aligned Trigger Enable Register + * | | |PWM can trigger ADC to start conversion when PWM counter up count to CNR if this bit is set to 1. + * | | |0 = PWM channel 2 trigger ADC function Disabled. + * | | |1 = PWM channel 2 trigger ADC function Enabled. + * | | |Note: This function is only supported when PWM operating at Center-aligned type. + * |[3] |PWM3TEN |Channel 3 Center-Aligned Trigger Enable Register + * | | |PWM can trigger ADC to start conversion when PWM counter up count to CNR if this bit is set to 1. + * | | |0 = PWM channel 3 trigger ADC function Disabled. + * | | |1 = PWM channel 3 trigger ADC function Enabled. + * | | |Note: This function is only supported when PWM operating at Center-aligned type. + * @var PWM_T::TSTATUS + * Offset: 0x84 PWM Trigger Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PWM0TF |Channel 0 Center-Aligned Trigger Flag + * | | |For Center-aligned Operating mode, this bit is set to 1 by hardware when PWM counter up counts to CNR if PWM0TEN bit is set to 1. + * | | |After this bit is set to 1, ADC will start conversion if ADC triggered source is selected by PWM. + * | | |This bit can be cleared to 0 by software writing '1'. + * |[1] |PWM1TF |Channel 1 Center-Aligned Trigger Flag + * | | |For Center-aligned Operating mode, this bit is set to 1 by hardware when PWM counter up count to CNR if PWM1TEN bit is set to 1. + * | | |After this bit is set to 1, ADC will start conversion if ADC triggered source is selected by PWM. + * | | |This bit can be cleared to 0 by software writing '1'. + * |[2] |PWM2TF |Channel 2 Center-Aligned Trigger Flag + * | | |For Center-aligned Operating mode, this bit is set to 1 by hardware when PWM counter up count to CNR if PWM2TEN bit is set to 1. + * | | |After this bit is set to 1, ADC will start conversion if ADC triggered source is selected by PWM. + * | | |This bit can be cleared to 0 by software writing '1'. + * |[3] |PWM3TF |Channel 3 Center-Aligned Trigger Flag + * | | |For Center-aligned Operating mode, this bit is set to 1 by hardware when PWM counter up count to CNR if PWM3TEN bit is set to 1. + * | | |After this bit is set to 1, ADC will start conversion if ADC triggered source is selected by PWM. + * | | |This bit can be cleared to 0 by software writing '1'. + * @var PWM_T::SYNCBUSY0 + * Offset: 0x88 PWM0 Synchronous Busy Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |S_BUSY |PWM Synchronous Busy + * | | |When software writes CNR0/CMR0/PPR or switches PWM0 operation mode (PCR[3]), + * | | |PWM will have a busy time to update these values completely because + * | | |PWM clock may be different from system clock domain. + * | | |Software needs to check this busy status before writing CNR0/CMR0/PPR or + * | | |switching PWM0 operation mode (PCR[3]) to make sure previous setting has been updated completely. + * | | |This bit will be set when software writes CNR0/CMR0/PPR or switches PWM0 operation mode (PCR[3]) + * | | |and will be cleared by hardware automatically when PWM update these value completely. + * @var PWM_T::SYNCBUSY1 + * Offset: 0x8C PWM1 Synchronous Busy Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |S_BUSY |PWM Synchronous Busy + * | | |When Software writes CNR1/CMR1/PPR or switches PWM1 operation mode (PCR[11]), + * | | |PWM will have a busy time to update these values completely because + * | | |PWM clock may be different from system clock domain. + * | | |Software needs to check this busy status before writing CNR1/CMR1/PPR or + * | | |switching PWM1 operation mode (PCR[11]) to make sure previous setting has been updated completely. + * | | |This bit will be set when software writes CNR1/CMR1/PPR or switches PWM1 operation mode (PCR[11]) + * | | |and will be cleared by hardware automatically when PWM update these value completely. + * @var PWM_T::SYNCBUSY2 + * Offset: 0x90 PWM2 Synchronous Busy Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |S_BUSY |PWM Synchronous Busy + * | | |When Software writes CNR2/CMR2/PPR or switch PWM2 operation mode (PCR[19]), + * | | |PWM will have a busy time to update these values completely because + * | | |PWM clock may be different from system clock domain. + * | | |Software needs to check this busy status before writing CNR2/CMR2/PPR or + * | | |switching PWM2 operation mode (PCR[19]) to make sure previous setting has been updated completely. + * | | |This bit will be set when software writes CNR2/CMR2/PPR or switch PWM2 operation mode (PCR[19]) + * | | |and will be cleared by hardware automatically when PWM update these value completely. + * @var PWM_T::SYNCBUSY3 + * Offset: 0x94 PWM3 Synchronous Busy Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |S_BUSY |PWM Synchronous Busy + * | | |When Software writes CNR3/CMR3/PPR or switch PWM3 operation mode (PCR[27]), + * | | |PWM will have a busy time to update these values completely because + * | | |PWM clock may be different from system clock domain. + * | | |Software need to check this busy status before writing CNR3/CMR3/PPR or + * | | |switching PWM3 operation mode (PCR[27]) to make sure previous setting has been updated completely. + * | | |This bit will be set when Software writes CNR3/CMR3/PPR or switch PWM3 operation mode (PCR[27]) + * | | |and will be cleared by hardware automatically when PWM update these value completely. + * @var PWM_T::CAPPDMACTL + * Offset: 0xC0 PWM Group A Trigger Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CAP0PDMAEN |Channel 0 PDMA Enable Bit + * | | |0 = Channel 0 PDMA function Disabled. + * | | |1 = Channel 0 PDMA function Enabled for the channel 0 captured data and transfer to memory. + * |[2:1] |CAP0PDMAMOD |Select CRLR0 or CFLR0 to Transfer PDMA + * | | |00 = Reserved + * | | |01 = CRLR0 + * | | |10 = CFLR0 + * | | |11 = Both CRLR0 and CFLR0 + * |[3] |CAP0RFORDER |Capture channel 0 Rising/Falling Order + * | | |Set this bit to determine whether the CRLR0 or CFLR0 is the first captured data transferred to memory through PDMA when CAP0PDMAMOD =11 + * | | |0 = CFLR0 is the first captured data to memory. + * | | |1 = CRLR0 is the first captured data to memory. + * |[8] |CAP1PDMAEN |Channel 1 PDMA Enable Bit + * | | |0 = Channel 1 PDMA function Disabled. + * | | |1 = Channel 1 PDMA function Enabled for the channel 1 captured data and transfer to memory. + * |[10:9] |CAP1PDMAMOD |Select CRLR1 or CFLR1 to Transfer PDMA + * | | |00 = Reserved + * | | |01 = CRLR1 + * | | |10 = CFLR1 + * | | |11 = Both CRLR1 and CFLR1 + * |[11] |CAP1RFORDER |Capture channel 1 Rising/Falling Order + * | | |Set this bit to determine whether the CRLR1 or CFLR1 is the first captured data transferred to memory through PDMA when CAP1PDMAMOD =11 + * | | |0 = CFLR1 is the first captured data to memory. + * | | |1 = CRLR1 is the first captured data to memory. + * |[16] |CAP2PDMAEN |Channel 2 PDMA Enable Bit + * | | |0 = Channel 2 PDMA function Disabled. + * | | |1 = Channel 2 PDMA function Enabled for the channel 2 captured data and transfer to memory. + * |[18:17] |CAP2PDMAMOD |Select CRLR2 or CFLR2 to Transfer PDMA + * | | |00 = Reserved + * | | |01 = CRLR2 + * | | |10 = CFLR2 + * | | |11 = Both CRLR2 and CFLR2 + * |[19] |CAP2RFORDER |Capture channel 2 Rising/Falling Order + * | | |Set this bit to determine whether the CRLR2 or CFLR2 is the first captured data transferred to memory through PDMA when CAP2PDMAMOD =11 + * | | |0 = CFLR2 is the first captured data to memory. + * | | |1 = CRLR2 is the first captured data to memory. + * |[24] |CAP3PDMAEN |Channel 3 PDMA Enable Bit + * | | |0 = Channel 3 PDMA function Disabled. + * | | |1 = Channel 3 PDMA function Enabled for the channel 3 captured data and transfer to memory. + * |[26:25] |CAP3PDMAMOD |Select CRLR3 or CFLR3 to Transfer PDMA + * | | |00 = Reserved + * | | |01 = CRLR3 + * | | |10 = CFLR3 + * | | |11 = Both CRLR3 and CFLR3 + * |[27] |CAP3RFORDER |Capture channel 3 Rising/Falling Order + * | | |Set this bit to determine whether the CRLR1 or CFLR3 is the first captured data transferred to memory through PDMA when CAP3PDMAMOD =11 + * | | |0 = CFLR3 is the first captured data to memory. + * | | |1 = CRLR3 is the first captured data to memory. + * @var PWM_T::CAP0PDMA + * Offset: 0xC4 PWM Group A PDMA channel 0 DATA Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CAP0RFPDMA|PDMA data register for channel 0 + * | | |it is the capturing value(CFLR0/CRLR0) for channel 0. + * @var PWM_T::CAP1PDMA + * Offset: 0xC8 PWM Group A PDMA channel 1 DATA Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CAP1RFPDMA|PDMA data register for channel 1 + * | | |it is the capturing value(CFLR1/CRLR1) for channel 1. + * @var PWM_T::CAP2PDMA + * Offset: 0xCC PWM Group A PDMA channel 2 DATA Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CAP2RFPDMA|PDMA data register for channel 2 + * | | |it is the capturing value(CFLR2/CRLR2) for channel 2. + * @var PWM_T::CAP3PDMA + * Offset: 0xD0 PWM Group A PDMA channel 3 DATA Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CAP3RFPDMA|PDMA data register for channel 3 + * | | |it is the capturing value(CFLR3/CRLR3) for channel 3. + */ + + __IO uint32_t PPR; /* Offset: 0x00 PWM Prescaler Register */ + __IO uint32_t CSR; /* Offset: 0x04 PWM Clock Source Divider Select Register */ + __IO uint32_t PCR; /* Offset: 0x08 PWM Control Register */ + __IO uint32_t CNR0; /* Offset: 0x0C PWM Counter Register 0 */ + __IO uint32_t CMR0; /* Offset: 0x10 PWM Comparator Register 0 */ + __I uint32_t PDR0; /* Offset: 0x14 PWM Data Register 0 */ + __IO uint32_t CNR1; /* Offset: 0x18 PWM Counter Register 1 */ + __IO uint32_t CMR1; /* Offset: 0x1C PWM Comparator Register 1 */ + __I uint32_t PDR1; /* Offset: 0x20 PWM Data Register 1 */ + __IO uint32_t CNR2; /* Offset: 0x24 PWM Counter Register 2 */ + __IO uint32_t CMR2; /* Offset: 0x28 PWM Comparator Register 2 */ + __I uint32_t PDR2; /* Offset: 0x2C PWM Data Register 2 */ + __IO uint32_t CNR3; /* Offset: 0x30 PWM Counter Register 3 */ + __IO uint32_t CMR3; /* Offset: 0x34 PWM Comparator Register 3 */ + __I uint32_t PDR3; /* Offset: 0x38 PWM Data Register 3 */ + __I uint32_t RESERVED0[1]; + __IO uint32_t PIER; /* Offset: 0x40 PWM Interrupt Enable Register */ + __IO uint32_t PIIR; /* Offset: 0x44 PWM Interrupt Indication Register */ + __I uint32_t RESERVE1[2]; + __IO uint32_t CCR0; /* Offset: 0x50 PWM Capture Control Register 0 */ + __IO uint32_t CCR2; /* Offset: 0x54 PWM Capture Control Register 2 */ + __IO uint32_t CRLR0; /* Offset: 0x58 PWM Capture Rising Latch Register (Channel 0) */ + __IO uint32_t CFLR0; /* Offset: 0x5C PWM Capture Falling Latch Register (Channel 0) */ + __IO uint32_t CRLR1; /* Offset: 0x60 PWM Capture Rising Latch Register (Channel 1) */ + __IO uint32_t CFLR1; /* Offset: 0x64 PWM Capture Falling Latch Register (Channel 1) */ + __IO uint32_t CRLR2; /* Offset: 0x68 PWM Capture Rising Latch Register (Channel 2) */ + __IO uint32_t CFLR2; /* Offset: 0x6C PWM Capture Falling Latch Register (Channel 2) */ + __IO uint32_t CRLR3; /* Offset: 0x70 PWM Capture Rising Latch Register (Channel 3) */ + __IO uint32_t CFLR3; /* Offset: 0x74 PWM Capture Falling Latch Register (Channel 3) */ + __IO uint32_t CAPENR; /* Offset: 0x78 PWM Capture Input 0~3 Enable Register */ + __IO uint32_t POE; /* Offset: 0x7C PWM Output Enable for Channel 0~3 */ + __IO uint32_t TCON; /* Offset: 0x80 PWM Trigger Control for Channel 0~3 */ + __IO uint32_t TSTATUS; /* Offset: 0x84 PWM Trigger Status Register */ + __IO uint32_t SYNCBUSY0; /* Offset: 0x88 PWM0 Synchronous Busy Status Register */ + __IO uint32_t SYNCBUSY1; /* Offset: 0x8C PWM1 Synchronous Busy Status Register */ + __IO uint32_t SYNCBUSY2; /* Offset: 0x90 PWM2 Synchronous Busy Status Register */ + __IO uint32_t SYNCBUSY3; /* Offset: 0x94 PWM3 Synchronous Busy Status Register */ + __I uint32_t RESERVE2[10]; + __IO uint32_t CAPPDMACTL; /* Offset: 0xC0 PWM Group A Trigger Status Register */ + __IO uint32_t CAP0PDMA; /* Offset: 0xC4 PWM Group A PDMA channel 0 DATA Register */ + __IO uint32_t CAP1PDMA; /* Offset: 0xC8 PWM Group A PDMA channel 1 DATA Register */ + __IO uint32_t CAP2PDMA; /* Offset: 0xCC PWM Group A PDMA channel 2 DATA Register */ + __IO uint32_t CAP3PDMA; /* Offset: 0xD0 PWM Group A PDMA channel 3 DATA Register */ + +} PWM_T; + + + + +/** @addtogroup REG_PWM_BITMASK PWM Bit Mask + @{ + */ + +/* PWM PPR Bit Field Definitions */ +#define PWM_PPR_DZI23_Pos 24 /*!< PWM_T::PPR: DZI23 Position */ +#define PWM_PPR_DZI23_Msk (0xFFul << PWM_PPR_DZI23_Pos) /*!< PWM_T::PPR: DZI23 Mask */ + +#define PWM_PPR_DZI01_Pos 16 /*!< PWM_T::PPR: DZI01 Position */ +#define PWM_PPR_DZI01_Msk (0xFFul << PWM_PPR_DZI01_Pos) /*!< PWM_T::PPR: DZI01 Mask */ + +#define PWM_PPR_CP23_Pos 8 /*!< PWM_T::PPR: CP23 Position */ +#define PWM_PPR_CP23_Msk (0xFFul << PWM_PPR_CP23_Pos) /*!< PWM_T::PPR: CP23 Mask */ + +#define PWM_PPR_CP01_Pos 0 /*!< PWM_T::PPR: CP01 Position */ +#define PWM_PPR_CP01_Msk (0xFFul << PWM_PPR_CP01_Pos) /*!< PWM_T::PPR: CP01 Mask */ + +/* PWM CSR Bit Field Definitions */ +#define PWM_CSR_CSR3_Pos 12 /*!< PWM_T::CSR: CSR3 Position */ +#define PWM_CSR_CSR3_Msk (7ul << PWM_CSR_CSR3_Pos) /*!< PWM_T::CSR: CSR3 Mask */ + +#define PWM_CSR_CSR2_Pos 8 /*!< PWM_T::CSR: CSR2 Position */ +#define PWM_CSR_CSR2_Msk (7ul << PWM_CSR_CSR2_Pos) /*!< PWM_T::CSR: CSR2 Mask */ + +#define PWM_CSR_CSR1_Pos 4 /*!< PWM_T::CSR: CSR1 Position */ +#define PWM_CSR_CSR1_Msk (7ul << PWM_CSR_CSR1_Pos) /*!< PWM_T::CSR: CSR1 Mask */ + +#define PWM_CSR_CSR0_Pos 0 /*!< PWM_T::CSR: CSR0 Position */ +#define PWM_CSR_CSR0_Msk (7ul << PWM_CSR_CSR0_Pos) /*!< PWM_T::CSR: CSR0 Mask */ + +/* PWM PCR Bit Field Definitions */ +#define PWM_PCR_PWM23TYPE_Pos 31 /*!< PWM_T::PCR: PWM23TYPE Position */ +#define PWM_PCR_PWM23TYPE_Msk (1ul << PWM_PCR_PWM23TYPE_Pos) /*!< PWM_T::PCR: PWM23TYPE Mask */ + +#define PWM_PCR_PWM01TYPE_Pos 30 /*!< PWM_T::PCR: PWM01TYPE Position */ +#define PWM_PCR_PWM01TYPE_Msk (1ul << PWM_PCR_PWM01TYPE_Pos) /*!< PWM_T::PCR: PWM01TYPE Mask */ + +#define PWM_PCR_CH3MOD_Pos 27 /*!< PWM_T::PCR: CH3MOD Position */ +#define PWM_PCR_CH3MOD_Msk (1ul << PWM_PCR_CH3MOD_Pos) /*!< PWM_T::PCR: CH3MOD Mask */ + +#define PWM_PCR_CH3INV_Pos 26 /*!< PWM_T::PCR: CH3INV Position */ +#define PWM_PCR_CH3INV_Msk (1ul << PWM_PCR_CH3INV_Pos) /*!< PWM_T::PCR: CH3INV Mask */ + +#define PWM_PCR_CH3PINV_Pos 25 /*!< PWM_T::PCR: CH3PINV Position */ +#define PWM_PCR_CH3PINV_Msk (1ul << PWM_PCR_CH3PINV_Pos) /*!< PWM_T::PCR: CH3PINV Mask */ + +#define PWM_PCR_CH3EN_Pos 24 /*!< PWM_T::PCR: CH3EN Position */ +#define PWM_PCR_CH3EN_Msk (1ul << PWM_PCR_CH3EN_Pos) /*!< PWM_T::PCR: CH3EN Mask */ + +#define PWM_PCR_CH2MOD_Pos 19 /*!< PWM_T::PCR: CH2MOD Position */ +#define PWM_PCR_CH2MOD_Msk (1ul << PWM_PCR_CH2MOD_Pos) /*!< PWM_T::PCR: CH2MOD Mask */ + +#define PWM_PCR_CH2INV_Pos 18 /*!< PWM_T::PCR: CH2INV Position */ +#define PWM_PCR_CH2INV_Msk (1ul << PWM_PCR_CH2INV_Pos) /*!< PWM_T::PCR: CH2INV Mask */ + +#define PWM_PCR_CH2PINV_Pos 17 /*!< PWM_T::PCR: CH2PINV Position */ +#define PWM_PCR_CH2PINV_Msk (1ul << PWM_PCR_CH2PINV_Pos) /*!< PWM_T::PCR: CH2PINV Mask */ + +#define PWM_PCR_CH2EN_Pos 16 /*!< PWM_T::PCR: CH2EN Position */ +#define PWM_PCR_CH2EN_Msk (1ul << PWM_PCR_CH2EN_Pos) /*!< PWM_T::PCR: CH2EN Mask */ + +#define PWM_PCR_CH1MOD_Pos 11 /*!< PWM_T::PCR: CH1MOD Position */ +#define PWM_PCR_CH1MOD_Msk (1ul << PWM_PCR_CH1MOD_Pos) /*!< PWM_T::PCR: CH1MOD Mask */ + +#define PWM_PCR_CH1INV_Pos 10 /*!< PWM_T::PCR: CH1INV Position */ +#define PWM_PCR_CH1INV_Msk (1ul << PWM_PCR_CH1INV_Pos) /*!< PWM_T::PCR: CH1INV Mask */ + +#define PWM_PCR_CH1PINV_Pos 9 /*!< PWM_T::PCR: CH1PINV Position */ +#define PWM_PCR_CH1PINV_Msk (1ul << PWM_PCR_CH1PINV_Pos) /*!< PWM_T::PCR: CH1PINV Mask */ + +#define PWM_PCR_CH1EN_Pos 8 /*!< PWM_T::PCR: CH1EN Position */ +#define PWM_PCR_CH1EN_Msk (1ul << PWM_PCR_CH1EN_Pos) /*!< PWM_T::PCR: CH1EN Mask */ + +#define PWM_PCR_DZEN23_Pos 5 /*!< PWM_T::PCR: DZEN23 Position */ +#define PWM_PCR_DZEN23_Msk (1ul << PWM_PCR_DZEN23_Pos) /*!< PWM_T::PCR: DZEN23 Mask */ + +#define PWM_PCR_DZEN01_Pos 4 /*!< PWM_T::PCR: DZEN01 Position */ +#define PWM_PCR_DZEN01_Msk (1ul << PWM_PCR_DZEN01_Pos) /*!< PWM_T::PCR: DZEN01 Mask */ + +#define PWM_PCR_CH0MOD_Pos 3 /*!< PWM_T::PCR: CH0MOD Position */ +#define PWM_PCR_CH0MOD_Msk (1ul << PWM_PCR_CH0MOD_Pos) /*!< PWM_T::PCR: CH0MOD Mask */ + +#define PWM_PCR_CH0INV_Pos 2 /*!< PWM_T::PCR: CH0INV Position */ +#define PWM_PCR_CH0INV_Msk (1ul << PWM_PCR_CH0INV_Pos) /*!< PWM_T::PCR: CH0INV Mask */ + +#define PWM_PCR_CH0PINV_Pos 1 /*!< PWM_T::PCR: CH0PINV Position */ +#define PWM_PCR_CH0PINV_Msk (1ul << PWM_PCR_CH0PINV_Pos) /*!< PWM_T::PCR: CH0PINV Mask */ + +#define PWM_PCR_CH0EN_Pos 0 /*!< PWM_T::PCR: CH0EN Position */ +#define PWM_PCR_CH0EN_Msk (1ul << PWM_PCR_CH0EN_Pos) /*!< PWM_T::PCR: CH0EN Mask */ + +/* PWM CNR Bit Field Definitions */ +#define PWM_CNR_CNR_Pos 0 /*!< PWM_T::CNR0: CNR Position */ +#define PWM_CNR_CNR_Msk (0xFFFFul << PWM_CNR_CNR_Pos) /*!< PWM_T::CNR0: CNR Mask */ + +/* PWM CMR Bit Field Definitions */ +#define PWM_CMR_CMR_Pos 0 /*!< PWM_T::CMR0: CMR Position */ +#define PWM_CMR_CMR_Msk (0xFFFFul << PWM_CMR_CMR_Pos) /*!< PWM_T::CMR0: CMR Mask */ + +/* PWM PDR Bit Field Definitions */ +#define PWM_PDR_PDR_Pos 0 /*!< PWM_T::PDR0: PDR Position */ +#define PWM_PDR_PDR_Msk (0xFFFFul << PWM_PDR_PDR_Pos) /*!< PWM_T::PDR0: PDR Mask */ + +/* PWM PIER Bit Field Definitions */ + +#define PWM_PIER_INT23TYPE_Pos 17 /*!< PWM_T::PIER: INT23TYPE Position */ +#define PWM_PIER_INT23TYPE_Msk (1ul << PWM_PIER_INT23TYPE_Pos) /*!< PWM_T::PIER: INT23TYPE Mask */ + +#define PWM_PIER_INT01TYPE_Pos 16 /*!< PWM_T::PIER: INT01TYPE Position */ +#define PWM_PIER_INT01TYPE_Msk (1ul << PWM_PIER_INT01TYPE_Pos) /*!< PWM_T::PIER: INT01TYPE Mask */ + +#define PWM_PIER_PWMDIE3_Pos 11 /*!< PWM_T::PIER: PWMDIE3 Position */ +#define PWM_PIER_PWMDIE3_Msk (1ul << PWM_PIER_PWMDIE3_Pos) /*!< PWM_T::PIER: PWMDIE3 Mask */ + +#define PWM_PIER_PWMDIE2_Pos 10 /*!< PWM_T::PIER: PWMDIE2 Position */ +#define PWM_PIER_PWMDIE2_Msk (1ul << PWM_PIER_PWMDIE2_Pos) /*!< PWM_T::PIER: PWMDIE2 Mask */ + +#define PWM_PIER_PWMDIE1_Pos 9 /*!< PWM_T::PIER: PWMDIE1 Position */ +#define PWM_PIER_PWMDIE1_Msk (1ul << PWM_PIER_PWMDIE1_Pos) /*!< PWM_T::PIER: PWMDIE1 Mask */ + +#define PWM_PIER_PWMDIE0_Pos 8 /*!< PWM_T::PIER: PWMDIE0 Position */ +#define PWM_PIER_PWMDIE0_Msk (1ul << PWM_PIER_PWMDIE0_Pos) /*!< PWM_T::PIER: PWMDIE0 Mask */ + +#define PWM_PIER_PWMIE3_Pos 3 /*!< PWM_T::PIER: PWMIE3 Position */ +#define PWM_PIER_PWMIE3_Msk (1ul << PWM_PIER_PWMIE3_Pos) /*!< PWM_T::PIER: PWMIE3 Mask */ + +#define PWM_PIER_PWMIE2_Pos 2 /*!< PWM_T::PIER: PWMIE2 Position */ +#define PWM_PIER_PWMIE2_Msk (1ul << PWM_PIER_PWMIE2_Pos) /*!< PWM_T::PIER: PWMIE2 Mask */ + +#define PWM_PIER_PWMIE1_Pos 1 /*!< PWM_T::PIER: PWMIE1 Position */ +#define PWM_PIER_PWMIE1_Msk (1ul << PWM_PIER_PWMIE1_Pos) /*!< PWM_T::PIER: PWMIE1 Mask */ + +#define PWM_PIER_PWMIE0_Pos 0 /*!< PWM_T::PIER: PWMIE0 Position */ +#define PWM_PIER_PWMIE0_Msk (1ul << PWM_PIER_PWMIE0_Pos) /*!< PWM_T::PIER: PWMIE0 Mask */ + +/* PWM PIIR Bit Field Definitions */ +#define PWM_PIIR_PWMDIF3_Pos 11 /*!< PWM_T::PIIR: PWMDIF3 Position */ +#define PWM_PIIR_PWMDIF3_Msk (1ul << PWM_PIIR_PWMDIF3_Pos) /*!< PWM_T::PIIR: PWMDIF3 Mask */ + +#define PWM_PIIR_PWMDIF2_Pos 10 /*!< PWM_T::PIIR: PWMDIF2 Position */ +#define PWM_PIIR_PWMDIF2_Msk (1ul << PWM_PIIR_PWMDIF2_Pos) /*!< PWM_T::PIIR: PWMDIF2 Mask */ + +#define PWM_PIIR_PWMDIF1_Pos 9 /*!< PWM_T::PIIR: PWMDIF1 Position */ +#define PWM_PIIR_PWMDIF1_Msk (1ul << PWM_PIIR_PWMDIF1_Pos) /*!< PWM_T::PIIR: PWMDIF1 Mask */ + +#define PWM_PIIR_PWMDIF0_Pos 8 /*!< PWM_T::PIIR: PWMDIF0 Position */ +#define PWM_PIIR_PWMDIF0_Msk (1ul << PWM_PIIR_PWMDIF0_Pos) /*!< PWM_T::PIIR: PWMDIF0 Mask */ + +#define PWM_PIIR_PWMIF3_Pos 3 /*!< PWM_T::PIIR: PWMIF3 Position */ +#define PWM_PIIR_PWMIF3_Msk (1ul << PWM_PIIR_PWMIF3_Pos) /*!< PWM_T::PIIR: PWMIF3 Mask */ + +#define PWM_PIIR_PWMIF2_Pos 2 /*!< PWM_T::PIIR: PWMIF2 Position */ +#define PWM_PIIR_PWMIF2_Msk (1ul << PWM_PIIR_PWMIF2_Pos) /*!< PWM_T::PIIR: PWMIF2 Mask */ + +#define PWM_PIIR_PWMIF1_Pos 1 /*!< PWM_T::PIIR: PWMIF1 Position */ +#define PWM_PIIR_PWMIF1_Msk (1ul << PWM_PIIR_PWMIF1_Pos) /*!< PWM_T::PIIR: PWMIF1 Mask */ + +#define PWM_PIIR_PWMIF0_Pos 0 /*!< PWM_T::PIIR: PWMIF0 Position */ +#define PWM_PIIR_PWMIF0_Msk (1ul << PWM_PIIR_PWMIF0_Pos) /*!< PWM_T::PIIR: PWMIF0 Mask */ + +/* PWM CCR0 Bit Field Definitions */ +#define PWM_CCR0_CFLRI1_Pos 23 /*!< PWM_T::CCR0: CFLRI1 Position */ +#define PWM_CCR0_CFLRI1_Msk (1ul << PWM_CCR0_CFLRI1_Pos) /*!< PWM_T::CCR0: CFLRI1 Mask */ + +#define PWM_CCR0_CRLRI1_Pos 22 /*!< PWM_T::CCR0: CRLRI1 Position */ +#define PWM_CCR0_CRLRI1_Msk (1ul << PWM_CCR0_CRLRI1_Pos) /*!< PWM_T::CCR0: CRLRI1 Mask */ + +#define PWM_CCR0_CAPIF1_Pos 20 /*!< PWM_T::CCR0: CAPIF1 Position */ +#define PWM_CCR0_CAPIF1_Msk (1ul << PWM_CCR0_CAPIF1_Pos) /*!< PWM_T::CCR0: CAPIF1 Mask */ + +#define PWM_CCR0_CAPCH1EN_Pos 19 /*!< PWM_T::CCR0: CAPCH1EN Position */ +#define PWM_CCR0_CAPCH1EN_Msk (1ul << PWM_CCR0_CAPCH1EN_Pos) /*!< PWM_T::CCR0: CAPCH1EN Mask */ + +#define PWM_CCR0_CFL_IE1_Pos 18 /*!< PWM_T::CCR0: CFL_IE1 Position */ +#define PWM_CCR0_CFL_IE1_Msk (1ul << PWM_CCR0_CFL_IE1_Pos) /*!< PWM_T::CCR0: CFL_IE1 Mask */ + +#define PWM_CCR0_CRL_IE1_Pos 17 /*!< PWM_T::CCR0: CRL_IE1 Position */ +#define PWM_CCR0_CRL_IE1_Msk (1ul << PWM_CCR0_CRL_IE1_Pos) /*!< PWM_T::CCR0: CRL_IE1 Mask */ + +#define PWM_CCR0_INV1_Pos 16 /*!< PWM_T::CCR0: INV1 Position */ +#define PWM_CCR0_INV1_Msk (1ul << PWM_CCR0_INV1_Pos) /*!< PWM_T::CCR0: INV1 Mask */ + +#define PWM_CCR0_CFLRI0_Pos 7 /*!< PWM_T::CCR0: CFLRI0 Position */ +#define PWM_CCR0_CFLRI0_Msk (1ul << PWM_CCR0_CFLRI0_Pos) /*!< PWM_T::CCR0: CFLRI0 Mask */ + +#define PWM_CCR0_CRLRI0_Pos 6 /*!< PWM_T::CCR0: CRLRI0 Position */ +#define PWM_CCR0_CRLRI0_Msk (1ul << PWM_CCR0_CRLRI0_Pos) /*!< PWM_T::CCR0: CRLRI0 Mask */ + +#define PWM_CCR0_CAPIF0_Pos 4 /*!< PWM_T::CCR0: CAPIF0 Position */ +#define PWM_CCR0_CAPIF0_Msk (1ul << PWM_CCR0_CAPIF0_Pos) /*!< PWM_T::CCR0: CAPIF0 Mask */ + +#define PWM_CCR0_CAPCH0EN_Pos 3 /*!< PWM_T::CCR0: CAPCH0EN Position */ +#define PWM_CCR0_CAPCH0EN_Msk (1ul << PWM_CCR0_CAPCH0EN_Pos) /*!< PWM_T::CCR0: CAPCH0EN Mask */ + +#define PWM_CCR0_CFL_IE0_Pos 2 /*!< PWM_T::CCR0: CFL_IE0 Position */ +#define PWM_CCR0_CFL_IE0_Msk (1ul << PWM_CCR0_CFL_IE0_Pos) /*!< PWM_T::CCR0: CFL_IE0 Mask */ + +#define PWM_CCR0_CRL_IE0_Pos 1 /*!< PWM_T::CCR0: CRL_IE0 Position */ +#define PWM_CCR0_CRL_IE0_Msk (1ul << PWM_CCR0_CRL_IE0_Pos) /*!< PWM_T::CCR0: CRL_IE0 Mask */ + +#define PWM_CCR0_INV0_Pos 0 /*!< PWM_T::CCR0: INV0 Position */ +#define PWM_CCR0_INV0_Msk (1ul << PWM_CCR0_INV0_Pos) /*!< PWM_T::CCR0: INV0 Mask */ + +/* PWM CCR2 Bit Field Definitions */ +#define PWM_CCR2_CFLRI3_Pos 23 /*!< PWM_T::CCR2: CFLRI3 Position */ +#define PWM_CCR2_CFLRI3_Msk (1ul << PWM_CCR2_CFLRI3_Pos) /*!< PWM_T::CCR2: CFLRI3 Mask */ + +#define PWM_CCR2_CRLRI3_Pos 22 /*!< PWM_T::CCR2: CRLRI3 Position */ +#define PWM_CCR2_CRLRI3_Msk (1ul << PWM_CCR2_CRLRI3_Pos) /*!< PWM_T::CCR2: CRLRI3 Mask */ + +#define PWM_CCR2_CAPIF3_Pos 20 /*!< PWM_T::CCR2: CAPIF3 Position */ +#define PWM_CCR2_CAPIF3_Msk (1ul << PWM_CCR2_CAPIF3_Pos) /*!< PWM_T::CCR2: CAPIF3 Mask */ + +#define PWM_CCR2_CAPCH3EN_Pos 19 /*!< PWM_T::CCR2: CAPCH3EN Position */ +#define PWM_CCR2_CAPCH3EN_Msk (1ul << PWM_CCR2_CAPCH3EN_Pos) /*!< PWM_T::CCR2: CAPCH3EN Mask */ + +#define PWM_CCR2_CFL_IE3_Pos 18 /*!< PWM_T::CCR2: CFL_IE3 Position */ +#define PWM_CCR2_CFL_IE3_Msk (1ul << PWM_CCR2_CFL_IE3_Pos) /*!< PWM_T::CCR2: CFL_IE3 Mask */ + +#define PWM_CCR2_CRL_IE3_Pos 17 /*!< PWM_T::CCR2: CRL_IE3 Position */ +#define PWM_CCR2_CRL_IE3_Msk (1ul << PWM_CCR2_CRL_IE3_Pos) /*!< PWM_T::CCR2: CRL_IE3 Mask */ + +#define PWM_CCR2_INV3_Pos 16 /*!< PWM_T::CCR2: INV3 Position */ +#define PWM_CCR2_INV3_Msk (1ul << PWM_CCR2_INV3_Pos) /*!< PWM_T::CCR2: INV3 Mask */ + +#define PWM_CCR2_CFLRI2_Pos 7 /*!< PWM_T::CCR2: CFLRI2 Position */ +#define PWM_CCR2_CFLRI2_Msk (1ul << PWM_CCR2_CFLRI2_Pos) /*!< PWM_T::CCR2: CFLRI2 Mask */ + +#define PWM_CCR2_CRLRI2_Pos 6 /*!< PWM_T::CCR2: CRLRI2 Position */ +#define PWM_CCR2_CRLRI2_Msk (1ul << PWM_CCR2_CRLRI2_Pos) /*!< PWM_T::CCR2: CRLRI2 Mask */ + +#define PWM_CCR2_CAPIF2_Pos 4 /*!< PWM_T::CCR2: CAPIF2 Position */ +#define PWM_CCR2_CAPIF2_Msk (1ul << PWM_CCR2_CAPIF2_Pos) /*!< PWM_T::CCR2: CAPIF2 Mask */ + +#define PWM_CCR2_CAPCH2EN_Pos 3 /*!< PWM_T::CCR2: CAPCH2EN Position */ +#define PWM_CCR2_CAPCH2EN_Msk (1ul << PWM_CCR2_CAPCH2EN_Pos) /*!< PWM_T::CCR2: CAPCH2EN Mask */ + +#define PWM_CCR2_CFL_IE2_Pos 2 /*!< PWM_T::CCR2: CFL_IE2 Position */ +#define PWM_CCR2_CFL_IE2_Msk (1ul << PWM_CCR2_CFL_IE2_Pos) /*!< PWM_T::CCR2: CFL_IE2 Mask */ + +#define PWM_CCR2_CRL_IE2_Pos 1 /*!< PWM_T::CCR2: CRL_IE2 Position */ +#define PWM_CCR2_CRL_IE2_Msk (1ul << PWM_CCR2_CRL_IE2_Pos) /*!< PWM_T::CCR2: CRL_IE2 Mask */ + +#define PWM_CCR2_INV2_Pos 0 /*!< PWM_T::CCR2: INV2 Position */ +#define PWM_CCR2_INV2_Msk (1ul << PWM_CCR2_INV2_Pos) /*!< PWM_T::CCR2: INV2 Mask */ + +/* PWM CRLR Bit Field Definitions */ +#define PWM_CRLR_CRLR_Pos 0 /*!< PWM_T::CRLR0: CRLR Position */ +#define PWM_CRLR_CRLR_Msk (0xFFFFul << PWM_CRLR_CRLR_Pos) /*!< PWM_T::CRLR0: CRLR Mask */ + +/* PWM CFLR Bit Field Definitions */ +#define PWM_CFLR_CFLR_Pos 0 /*!< PWM_T::CFLR0: CFLR Position */ +#define PWM_CFLR_CFLR_Msk (0xFFFFul << PWM_CFLR_CFLR_Pos) /*!< PWM_T::CFLR0: CFLR Mask */ + +/* PWM CAPENR Bit Field Definitions */ +#define PWM_CAPENR_CAPENR_Pos 0 /*!< PWM_T::CAPENR: CAPENR Position */ +#define PWM_CAPENR_CAPENR_Msk (0xFul << PWM_CAPENR_CAPENR_Pos) /*!< PWM_T::CAPENR: CAPENR Mask */ + +/* PWM POE Bit Field Definitions */ +#define PWM_POE_PWM3_Pos 3 /*!< PWM_T::POE: PWM3 Position */ +#define PWM_POE_PWM3_Msk (1ul << PWM_POE_PWM3_Pos) /*!< PWM_T::POE: PWM3 Mask */ + +#define PWM_POE_PWM2_Pos 2 /*!< PWM_T::POE: PWM2 Position */ +#define PWM_POE_PWM2_Msk (1ul << PWM_POE_PWM2_Pos) /*!< PWM_T::POE: PWM2 Mask */ + +#define PWM_POE_PWM1_Pos 1 /*!< PWM_T::POE: PWM1 Position */ +#define PWM_POE_PWM1_Msk (1ul << PWM_POE_PWM1_Pos) /*!< PWM_T::POE: PWM1 Mask */ + +#define PWM_POE_PWM0_Pos 0 /*!< PWM_T::POE: PWM0 Position */ +#define PWM_POE_PWM0_Msk (1ul << PWM_POE_PWM0_Pos) /*!< PWM_T::POE: PWM0 Mask */ + +/* PWM TCON Bit Field Definitions */ + +#define PWM_TCON_PWM3TEN_Pos 3 /*!< PWM_T::TCON: PWM3TEN Position */ +#define PWM_TCON_PWM3TEN_Msk (1ul << PWM_TCON_PWM3TEN_Pos) /*!< PWM_T::TCON: PWM3TEN Mask */ + +#define PWM_TCON_PWM2TEN_Pos 2 /*!< PWM_T::TCON: PWM2TEN Position */ +#define PWM_TCON_PWM2TEN_Msk (1ul << PWM_TCON_PWM2TEN_Pos) /*!< PWM_T::TCON: PWM2TEN Mask */ + +#define PWM_TCON_PWM1TEN_Pos 1 /*!< PWM_T::TCON: PWM1TEN Position */ +#define PWM_TCON_PWM1TEN_Msk (1ul << PWM_TCON_PWM1TEN_Pos) /*!< PWM_T::TCON: PWM1TEN Mask */ + +#define PWM_TCON_PWM0TEN_Pos 0 /*!< PWM_T::TCON: PWM0TEN Position */ +#define PWM_TCON_PWM0TEN_Msk (1ul << PWM_TCON_PWM0TEN_Pos) /*!< PWM_T::TCON: PWM0TEN Mask */ + +/* PWM TSTATUS Bit Field Definitions */ + +#define PWM_TSTATUS_PWM3TF_Pos 3 /*!< PWM_T::TSTATUS: PWM3TF Position */ +#define PWM_TSTATUS_PWM3TF_Msk (1ul << PWM_TSTATUS_PWM3TF_Pos) /*!< PWM_T::TSTATUS: PWM3TF Mask */ + +#define PWM_TSTATUS_PWM2TF_Pos 2 /*!< PWM_T::TSTATUS: PWM2TF Position */ +#define PWM_TSTATUS_PWM2TF_Msk (1ul << PWM_TSTATUS_PWM2TF_Pos) /*!< PWM_T::TSTATUS: PWM2TF Mask */ + +#define PWM_TSTATUS_PWM1TF_Pos 1 /*!< PWM_T::TSTATUS: PWM1TF Position */ +#define PWM_TSTATUS_PWM1TF_Msk (1ul << PWM_TSTATUS_PWM1TF_Pos) /*!< PWM_T::TSTATUS: PWM1TF Mask */ + +#define PWM_TSTATUS_PWM0TF_Pos 0 /*!< PWM_T::TSTATUS: PWM0TF Position */ +#define PWM_TSTATUS_PWM0TF_Msk (1ul << PWM_TSTATUS_PWM0TF_Pos) /*!< PWM_T::TSTATUS: PWM0TF Mask */ + +/* PWM SYNCBUSY0 Bit Field Definitions */ +#define PWM_SYNCBUSY0_S_BUSY_Pos 0 /*!< PWM_T::SYNCBUSY0: S_BUSY Position */ +#define PWM_SYNCBUSY0_S_BUSY_Msk (1ul << PWM_SYNCBUSY0_S_BUSY_Pos) /*!< PWM_T::SYNCBUSY0: S_BUSY Mask */ + +/* PWM SYNCBUSY1 Bit Field Definitions */ +#define PWM_SYNCBUSY1_S_BUSY_Pos 0 /*!< PWM_T::SYNCBUSY1: S_BUSY Position */ +#define PWM_SYNCBUSY1_S_BUSY_Msk (1ul << PWM_SYNCBUSY1_S_BUSY_Pos) /*!< PWM_T::SYNCBUSY1: S_BUSY Mask */ + +/* PWM SYNCBUSY2 Bit Field Definitions */ +#define PWM_SYNCBUSY2_S_BUSY_Pos 0 /*!< PWM_T::SYNCBUSY2: S_BUSY Position */ +#define PWM_SYNCBUSY2_S_BUSY_Msk (1ul << PWM_SYNCBUSY2_S_BUSY_Pos) /*!< PWM_T::SYNCBUSY2: S_BUSY Mask */ + +/* PWM SYNCBUSY3 Bit Field Definitions */ +#define PWM_SYNCBUSY3_S_BUSY_Pos 0 /*!< PWM_T::SYNCBUSY3: S_BUSY Position */ +#define PWM_SYNCBUSY3_S_BUSY_Msk (1ul << PWM_SYNCBUSY3_S_BUSY_Pos) /*!< PWM_T::SYNCBUSY3: S_BUSY Mask */ + +/* PWM CAPPDMACTL Bit Field Definitions */ +#define PWM_CAPPDMACTL_CAP3RFORDER_Pos 27 /*!< PWM_T::CAPPDMACTL: CAP3RFORDER Position */ +#define PWM_CAPPDMACTL_CAP3RFORDER_Msk (1ul << PWM_CAPPDMACTL_CAP3RFORDER_Pos) /*!< PWM_T::CAPPDMACTL: CAP3RFORDER Mask */ + +#define PWM_CAPPDMACTL_CAP3PDMAMOD_Pos 25 /*!< PWM_T::CAPPDMACTL: CAP3PDMAMOD Position */ +#define PWM_CAPPDMACTL_CAP3PDMAMOD_Msk (3ul << PWM_CAPPDMACTL_CAP3PDMAMOD_Pos) /*!< PWM_T::CAPPDMACTL: CAP3PDMAMOD Mask */ + +#define PWM_CAPPDMACTL_CAP3PDMAEN_Pos 24 /*!< PWM_T::CAPPDMACTL: CAP3PDMAEN Position */ +#define PWM_CAPPDMACTL_CAP3PDMAEN_Msk (1ul << PWM_CAPPDMACTL_CAP3PDMAEN_Pos) /*!< PWM_T::CAPPDMACTL: CAP3PDMAEN Mask */ + +#define PWM_CAPPDMACTL_CAP2RFORDER_Pos 19 /*!< PWM_T::CAPPDMACTL: CAP2RFORDER Position */ +#define PWM_CAPPDMACTL_CAP2RFORDER_Msk (1ul << PWM_CAPPDMACTL_CAP2RFORDER_Pos) /*!< PWM_T::CAPPDMACTL: CAP2RFORDER Mask */ + +#define PWM_CAPPDMACTL_CAP2PDMAMOD_Pos 17 /*!< PWM_T::CAPPDMACTL: CAP2PDMAMOD Position */ +#define PWM_CAPPDMACTL_CAP2PDMAMOD_Msk (3ul << PWM_CAPPDMACTL_CAP2PDMAMOD_Pos) /*!< PWM_T::CAPPDMACTL: CAP2PDMAMOD Mask */ + +#define PWM_CAPPDMACTL_CAP2PDMAEN_Pos 16 /*!< PWM_T::CAPPDMACTL: CAP2PDMAEN Position */ +#define PWM_CAPPDMACTL_CAP2PDMAEN_Msk (1ul << PWM_CAPPDMACTL_CAP2PDMAEN_Pos) /*!< PWM_T::CAPPDMACTL: CAP2PDMAEN Mask */ + +#define PWM_CAPPDMACTL_CAP1RFORDER_Pos 11 /*!< PWM_T::CAPPDMACTL: CAP1RFORDER Position */ +#define PWM_CAPPDMACTL_CAP1RFORDER_Msk (1ul << PWM_CAPPDMACTL_CAP1RFORDER_Pos) /*!< PWM_T::CAPPDMACTL: CAP1RFORDER Mask */ + +#define PWM_CAPPDMACTL_CAP1PDMAMOD_Pos 9 /*!< PWM_T::CAPPDMACTL: CAP1PDMAMOD Position */ +#define PWM_CAPPDMACTL_CAP1PDMAMOD_Msk (3ul << PWM_CAPPDMACTL_CAP1PDMAMOD_Pos) /*!< PWM_T::CAPPDMACTL: CAP1PDMAMOD Mask */ + +#define PWM_CAPPDMACTL_CAP1PDMAEN_Pos 8 /*!< PWM_T::CAPPDMACTL: CAP1PDMAEN Position */ +#define PWM_CAPPDMACTL_CAP1PDMAEN_Msk (1ul << PWM_CAPPDMACTL_CAP1PDMAEN_Pos) /*!< PWM_T::CAPPDMACTL: CAP1PDMAEN Mask */ + +#define PWM_CAPPDMACTL_CAP0RFORDER_Pos 3 /*!< PWM_T::CAPPDMACTL: CAP0RFORDER Position */ +#define PWM_CAPPDMACTL_CAP0RFORDER_Msk (1ul << PWM_CAPPDMACTL_CAP0RFORDER_Pos) /*!< PWM_T::CAPPDMACTL: CAP0RFORDER Mask */ + +#define PWM_CAPPDMACTL_CAP0PDMAMOD_Pos 1 /*!< PWM_T::CAPPDMACTL: CAP0PDMAMOD Position */ +#define PWM_CAPPDMACTL_CAP0PDMAMOD_Msk (3ul << PWM_CAPPDMACTL_CAP0PDMAMOD_Pos) /*!< PWM_T::CAPPDMACTL: CAP0PDMAMOD Mask */ + +#define PWM_CAPPDMACTL_CAP0PDMAEN_Pos 0 /*!< PWM_T::CAPPDMACTL: CAP0PDMAEN Position */ +#define PWM_CAPPDMACTL_CAP0PDMAEN_Msk (1ul << PWM_CAPPDMACTL_CAP0PDMAEN_Pos) /*!< PWM_T::CAPPDMACTL: CAP0PDMAEN Mask */ + +/* PWM CAP0PDMA Bit Field Definitions */ +#define PWM_CAP0PDMA_CAP0RFPDMA_Pos 0 /*!< PWM_T::CAP0PDMA: CAP0RFPDMA Position */ +#define PWM_CAP0PDMA_CAP0RFPDMA_Msk (0xFFFFul << PWM_CAP0PDMA_CAP0RFPDMA_Pos) /*!< PWM_T::CAP0PDMA: CAP0RFPDMA Mask */ + +/* PWM CAP1PDMA Bit Field Definitions */ +#define PWM_CAP1PDMA_CAP1RFPDMA_Pos 0 /*!< PWM_T::CAP1PDMA: CAP1RFPDMA Position */ +#define PWM_CAP1PDMA_CAP1RFPDMA_Msk (0xFFFFul << PWM_CAP1PDMA_CAP1RFPDMA_Pos) /*!< PWM_T::CAP1PDMA: CAP1RFPDMA Mask */ + +/* PWM CAP2PDMA Bit Field Definitions */ +#define PWM_CAP2PDMA_CAP2RFPDMA_Pos 0 /*!< PWM_T::CAP2PDMA: CAP2RFPDMA Position */ +#define PWM_CAP2PDMA_CAP2RFPDMA_Msk (0xFFFFul << PWM_CAP2PDMA_CAP2RFPDMA_Pos) /*!< PWM_T::CAP2PDMA: CAP2RFPDMA Mask */ + +/* PWM CAP3PDMA Bit Field Definitions */ +#define PWM_CAP3PDMA_CAP3RFPDMA_Pos 0 /*!< PWM_T::CAP3PDMA: CAP3RFPDMA Position */ +#define PWM_CAP3PDMA_CAP3RFPDMA_Msk (0xFFFFul << PWM_CAP3PDMA_CAP3RFPDMA_Pos) /*!< PWM_T::CAP3PDMA: CAP3RFPDMA Mask */ +/*@}*/ /* end of group REG_PWM_BITMASK */ +/*@}*/ /* end of group REG_PWM */ + +/*------------------------- SPI Interface Controller -------------------------*/ +/** @addtogroup REG_SPI Peripheral Interface Controller (SPI) + Memory Mapped Structure for SPI Controller + @{ + */ + +typedef struct +{ + + +/** + * @var SPI_T::CNTRL + * Offset: 0x00 Control and Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |GO_BUSY |SPI Transfer Control Bit And Busy Status + * | | |0 = Data transfer stopped. + * | | |1 = In Master mode, writing 1 to this bit to start the SPI data transfer; in Slave mode, + * | | | writing 1 to this bit indicates that the slave is ready to communicate with a master. + * | | |If FIFO mode is disabled, during the data transfer, this bit keeps the value of 1. + * | | |As the transfer is finished, this bit will be cleared automatically. + * | | |Software can read this bit to check if the SPI is in busy status. + * | | |In FIFO mode, this bit will be controlled by hardware. + * | | |Software should not modify this bit. + * | | |In Slave mode, this bit always returns 1 when this register is read by software. + * | | |In Master mode, this bit reflects the busy or idle status of SPI. + * | | |Note: + * | | |1. When FIFO mode is disabled, all configurations should be set before writing 1 to this GO_BUSY bit. + * | | |2. When FIFO mode is disabled and the software uses TX or RX PDMA function to transfer data, this bit + * | | | will be cleared after the PDMA finishes the data transfer. + * |[1] |RX_NEG |Receive On Negative Edge + * | | |0 = Received data input signal is latched on the rising edge of SPI bus clock. + * | | |1 = Received data input signal is latched on the falling edge of SPI bus clock. + * |[2] |TX_NEG |Transmit On Negative Edge + * | | |0 = Transmitted data output signal is changed on the rising edge of SPI bus clock. + * | | |1 = Transmitted data output signal is changed on the falling edge of SPI bus clock. + * |[7:3] |TX_BIT_LEN|Transmit Bit Length + * | | |This field specifies how many bits can be transmitted / received in one transaction. + * | | |The minimum bit length is 8 bits and can up to 32 bits. + * | | |TX_BIT_LEN = 0x08 ... 8 bits. + * | | |TX_BIT_LEN = 0x09 ... 9 bits. + * | | |...... + * | | |TX_BIT_LEN = 0x1F ... 31 bits. + * | | |TX_BIT_LEN = 0x00 ... 32 bits. + * |[10] |LSB |Send LSB First + * | | |0 = The MSB, which bit of transmit/receive register depends on the setting of TX_BIT_LEN, is transmitted/received first. + * | | |1 = The LSB, bit 0 of the SPI TX0/1 register, is sent first to the SPI data output pin, and the first bit received from + * | | | the SPI data input pin will be put in the LSB position of the RX register (bit 0 of SPI_RX0/1). + * |[11] |CLKP |Clock Polarity + * | | |0 = SPI bus clock is idle low. + * | | |1 = SPI bus clock is idle high. + * |[15:12] |SP_CYCLE |Suspend Interval (Master Only) + * | | |The four bits provide configurable suspend interval between two successive transmit/receive transaction in a transfer. + * | | |The definition of the suspend interval is the interval between the last clock edge of the preceding transaction word + * | | |and the first clock edge of the following transaction word. + * | | |The default value is 0x3. + * | | |The period of the suspend interval is obtained according to the following equation. + * | | |(SP_CYCLE[3:0] + 0.5) * period of SPI bus clock cycle + * | | |Example: + * | | |SP_CYCLE = 0x0 ... 0.5 SPI bus clock cycle. + * | | |SP_CYCLE = 0x1 ... 1.5 SPI bus clock cycle. + * | | |...... + * | | |SP_CYCLE = 0xE ... 14.5 SPI bus clock cycle. + * | | |SP_CYCLE = 0xF ... 15.5 SPI bus clock cycle. + * | | |If the variable clock function is enabled and the transmit FIFO buffer is not empty, the minimum period of suspend + * | | |interval between the successive transactions is (6.5 + SP_CYCLE) * SPI bus clock cycle. + * |[16] |IF |Unit Transfer Interrupt Flag + * | | |0 = No transaction has been finished since this bit was cleared to 0. + * | | |1 = SPI controller has finished one unit transfer. + * | | |Note: This bit will be cleared by writing 1 to itself. + * |[17] |IE |Unit Transfer Interrupt Enable + * | | |0 = SPI unit transfer interrupt Disabled. + * | | |1 = SPI unit transfer interrupt Enabled. + * |[18] |SLAVE |Slave Mode Enable + * | | |0 = Master mode. + * | | |1 = Slave mode. + * |[19] |REORDER |Byte Reorder Function Enable + * | | |0 = Byte Reorder function Disabled. + * | | |1 = Byte Reorder function Enabled. + * | | |A byte suspend interval will be inserted among each byte. + * | | |The period of the byte suspend interval depends on the setting of SP_CYCLE. + * | | |Note: + * | | |1. Byte Reorder function is only available if TX_BIT_LEN is defined as 16, 24, and 32 bits. + * | | |2. In Slave mode with level-trigger configuration, the slave select pin must be kept at active state during the + * | | | byte suspend interval. + * | | |3. The Byte Reorder function is not supported when the variable bus clock function or Dual I/O mode is enabled. + * |[21] |FIFO |FIFO Mode Enable + * | | |0 = FIFO mode Disabled. + * | | |1 = FIFO mode Enabled. + * | | |Note: + * | | |1. Before enabling FIFO mode, the other related settings should be set in advance. + * | | |2. In Master mode, if the FIFO mode is enabled, the GO_BUSY bit will be set to 1 automatically after writing data + * | | | to the transmit FIFO buffer; the GO_BUSY bit will be cleared to 0 automatically when the SPI controller is in idle. + * | | | If all data stored at transmit FIFO buffer are sent out, the TX_EMPTY bit will be set to 1 and the GO_BUSY bit will be cleared to 0. + * | | |3. After clearing this bit to 0, user must wait for at least 2 peripheral clock periods before setting this bit to 1 again. + * |[22] |TWOB |2-Bit Transfer Mode Enable + * | | |0 = 2-bit Transfer mode Disabled. + * | | |1 = 2-bit Transfer mode Enabled. + * | | |Note: When 2-bit Transfer mode is enabled, the serial transmitted 2-bit data are from SPI_TX1/0, and the received 2-bit data input are put in SPI_RX1/0. + * |[23] |VARCLK_EN |Variable Clock Enable (Master Only) + * | | |0 = SPI clock output frequency is fixed and decided only by the value of DIVIDER. + * | | |1 = SPI clock output frequency is variable. + * | | |The output frequency is decided by the value of VARCLK, DIVIDER, and DIVIDER2. + * | | |Note: When this VARCLK_EN bit is set to 1, the setting of TX_BIT_LEN must be programmed as 0x10 (16-bit mode). + * |[24] |RX_EMPTY |Receive FIFO Buffer Empty Indicator (Read Only) + * | | |It is a mutual mirror bit of SPI_CNTRL[24]. + * | | |0 = Receive FIFO buffer is not empty. + * | | |1 = Receive FIFO buffer is empty. + * |[25] |RX_FULL |Receive FIFO Buffer Full Indicator (Read Only) + * | | |It is a mutual mirror bit of SPI_STATUS[25]. + * | | |0 = Receive FIFO buffer is not full. + * | | |1 = Receive FIFO buffer is full. + * |[26] |TX_EMPTY |Transmit FIFO Buffer Empty Indicator (Read Only) + * | | |It is a mutual mirror bit of SPI_STATUS[26]. + * | | |0 = Transmit FIFO buffer is not empty. + * | | |1 = Transmit FIFO buffer is empty. + * |[27] |TX_FULL |Transmit FIFO Buffer Full Indicator (Read Only) + * | | |It is a mutual mirror bit of SPI_STATUS[27]. + * | | |0 = Transmit FIFO buffer is not full. + * | | |1 = Transmit FIFO buffer is full. + * @var SPI_T::DIVIDER + * Offset: 0x04 Clock Divider Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |DIVIDER |Clock Divider 1 Register + * | | |The value in this field is the frequency divider for generating the SPI peripheral clock and the SPI bus clock of SPI master. + * | | |The frequency is obtained according to the following equation. + * | | |If the bit of BCn, SPI_CNTRL2[31], is set to 0, + * | | | SPI peripheral clock frequency = system clock frequency / (DIVIDER + 1) / 2 + * | | |else if BCn is set to 1, + * | | | SPI peripheral clock frequency = SPI peripheral clock source frequency / (DIVIDER + 1) + * | | |The SPI peripheral clock source is defined in the CLKSEL1 register. + * |[23:16] |DIVIDER2 |Clock Divider 2 Register (Master Only) + * | | |The value in this field is the 2nd frequency divider for generating the second clock of the variable clock function. + * | | |The frequency is obtained according to the following equation: + * | | | f_clk2 = SPI peripheral clock frequency / (DIVIDER2 + 1) / 2 + * | | |If the VARCLK_EN bit is cleared to 0, this setting is unmeaning. + * @var SPI_T::SSR + * Offset: 0x08 Slave Select Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |SSR |Slave Select Control Bits (Master Only) + * | | |If AUTOSS bit is cleared, writing 1 to any bit of this field sets the proper SPIn_SPISS0/1 + * | | |line to an active state and writing 0 sets the line back to inactive state. + * | | |If the AUTOSS bit is set, writing 0 to any bit location of this field will keep the corresponding + * | | |SPIn_SPISS0/1 line at inactive state; writing 1 to any bit location of this field will select + * | | |appropriate SPIn_SPISS0/1 line to be automatically driven to active state for the duration of the + * | | |transmit/receive, and will be driven to inactive state for the rest of the time. + * | | |The active state of SPIn_SPISS0/1 is specified in SS_LVL. + * | | |Note: SPIn_SPISS0 is defined as the slave select input in Slave mode. + * |[2] |SS_LVL |Slave Select Active Level + * | | |This bit defines the active status of slave select signal (SPIn_SPISS0/1). + * | | |0 = The slave select signal SPIn_SPISS0/1 is active on low-level/falling-edge. + * | | |1 = The slave select signal SPIn_SPISS0/1 is active on high-level/rising-edge. + * |[3] |AUTOSS |Automatic Slave Select Function Enable (Master Only) + * | | |0 = If this bit is cleared, slave select signals will be asserted/de-asserted by setting /clearing + * | | | the corresponding bits of SPI_SSR[1:0]. + * | | |1 = If this bit is set, SPIn_SPISS0/1 signals will be generated automatically. + * | | | It means that device/slave select signal, which is set in SPI_SSR[1:0], will be asserted by the + * | | | SPI controller when transmit/receive is started, and will be de-asserted after each transmit/receive is finished. + * |[4] |SS_LTRIG |Slave Select Level Trigger Enable (Slave Only) + * | | |0 = Slave select signal is edge-trigger. + * | | | This is the default value. + * | | | The SS_LVL bit decides the signal is active after a falling-edge or rising-edge. + * | | |1 = Slave select signal is level-trigger. + * | | | The SS_LVL bit decides the signal is active low or active high. + * |[5] |LTRIG_FLAG|Level Trigger Accomplish Flag + * | | |In Slave mode, this bit indicates whether the received bit number meets the requirement or not after the current transaction done. + * | | |0 = Transferred bit length of one transaction does not meet the specified requirement. + * | | |1 = Transferred bit length meets the specified requirement which defined in TX_BIT_LEN. + * | | |Note: This bit is READ only. + * | | |As the GO_BUSY bit is set to 1 by software, the LTRIG_FLAG will be cleared to 0 after 4 SPI peripheral clock periods plus 1 system clock period. + * | | |In FIFO mode, this bit has no meaning. + * @var SPI_T::RX + * Offset: 0x10/0x14 Data Receive Register 0/1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |RX |Data Receive Register + * | | |The data receive register holds the datum received from SPI data input pin. + * | | |If FIFO mode is disabled, the last received data can be accessed through software by reading this register. + * | | |If the FIFO bit is set as 1 and the RX_EMPTY bit, SPI_CNTRL[24] or SPI_STATUS[24], is not set to 1, the receive + * | | |FIFO buffer can be accessed through software by reading this register. This is a read-only register. + * @var SPI_T::TX + * Offset: 0x20/0x24 Data Transmit Register 0/1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |TX |Data Transmit Register + * | | |The data transmit registers hold the data to be transmitted in the next transfer. + * | | |The number of valid bits depends on the setting of transmit bit length field of the SPI_CNTRL register. + * | | |For example, if TX_BIT_LEN is set to 0x08, the bits TX[7:0] will be transmitted in next transfer. + * | | |If TX_BIT_LEN is set to 0x00, the SPI controller will perform a 32-bit transfer. + * | | |Note 1: When the SPI controller is configured as a slave device and FIFO mode is disabled, if the SPI + * | | | controller attempts to transmit data to a master, the transmit data register should be updated + * | | | by software before setting the GO_BUSY bit to 1. + * | | |Note 2: In Master mode, SPI controller will start to transfer after 5 peripheral clock cycles after user writes to this register. + * @var SPI_T::VARCLK + * Offset: 0x34 Variable Clock Pattern Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |VARCLK |Variable Clock Pattern + * | | |This register defines the clock pattern of the SPI transfer. + * | | |If the variable clock function is disabled, this setting is unmeaning. + * @var SPI_T::DMA + * Offset: 0x38 SPI DMA Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |TX_DMA_GO |Transmit DMA Start + * | | |Setting this bit to 1 will start the transmit PDMA process. + * | | |SPI controller will issue request to PDMA controller automatically. + * | | |Hardware will clear this bit to 0 automatically after PDMA transfer done. + * | | |If the SPI transmit PDMA function is used to transfer data, the GO_BUSY bit should not be set to 1 by software. + * | | |The PDMA control logic of SPI controller will set it automatically whenever necessary. + * | | |In Slave mode and when FIFO mode is disabled, the minimal suspend interval between two successive transactions + * | | |must be larger than (8 SPI clock periods + 14 APB clock periods) for edge-trigger mode or + * | | |(9.5 SPI clock periods + 14 APB clock periods) for level-trigger mode. + * | | |If the 2-bit Transfer mode is enabled, additional 18 APB clock periods for the above conditions is required. + * |[1] |RX_DMA_GO |Receive DMA Start + * | | |Setting this bit to 1 will start the receive PDMA process. + * | | |The SPI controller will issue request to PDMA controller automatically when the SPI receive buffer is not empty. + * | | |This bit will be cleared to 0 by hardware automatically after PDMA transfer is done. + * | | |If the software uses the receive PDMA function to access the received data of SPI and does not use the transmit + * | | |PDMA function, the GO_BUSY bit should be set by software. + * | | |Enabling FIFO mode is recommended if the software uses more than one PDMA channel to transfer data. + * | | |In Slave mode and when FIFO mode is disabled, if the software only uses one PDMA channel for SPI receive PDMA + * | | |function and the other PDMA channels are not in use, the minimal suspend interval between two successive + * | | |transactions must be larger than (9 SPI slave peripheral clock periods + 4 APB clock periods) for Edge-trigger + * | | |mode or (9.5 SPI slave peripheral clock periods + 4 APB clock periods) for Level-trigger mode. + * |[2] |PDMA_RST |PDMA Reset + * | | |0 = No effect. + * | | |1 = Reset the PDMA control logic of the SPI controller. This bit will be cleared to 0 automatically. + * @var SPI_T::CNTRL2 + * Offset: 0x3C Control and Status Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[8] |NOSLVSEL |Slave 3-Wire Mode Enable + * | | |This is used to ignore the slave select signal in Slave mode. + * | | |The SPI controller can work with 3-wire interface including SPIn_CLK, SPIn_MISO, and SPIn_MOSI. + * | | |0 = 4-wire bi-direction interface. + * | | |1 = 3-wire bi-direction interface. + * | | |Note: In Slave 3-wire mode, the SS_LTRIG, SPI_SSR[4] will be set as 1 automatically. + * |[9] |SLV_ABORT |Slave 3-Wire Mode Abort Control + * | | |In normal operation, there is an interrupt event when the received data meet the required bits which defined in TX_BIT_LEN. + * | | |If the received bits are less than the requirement and there is no more SPI clock input over the one transfer time in + * | | |Slave 3-wire mode, the user can set this bit to force the current transfer done and then the user can get a transfer done interrupt event. + * | | |Note: This bit will be cleared to 0 automatically by hardware after it is set to 1 by software. + * |[10] |SSTA_INTEN|Slave 3-Wire Mode Start Interrupt Enable + * | | |Used to enable interrupt when the transfer has started in Slave 3-wire mode. + * | | |If there is no transfer done interrupt over the time period which is defined by user after the transfer start, + * | | |the user can set the SLV_ABORT bit to force the transfer done. + * | | |0 = Transaction start interrupt Disabled. + * | | |1 = Transaction start interrupt Enabled. + * | | |It will be cleared to 0 as the current transfer is done or the SLV_START_INTSTS bit is cleared. + * |[11] |SLV_START_INTSTS|Slave 3-Wire Mode Start Interrupt Status + * | | |This bit indicates if a transaction has started in Slave 3-wire mode. + * | | |It is a mutual mirror bit of SPI_STATUS[11]. + * | | |0 = Slave has not detected any SPI clock transition since the SSTA_INTEN bit was set to 1. + * | | |1 = A transaction has started in Slave 3-wire mode. + * | | |It will be cleared automatically when a transaction is done or by writing 1 to this bit. + * |[12] |DUAL_IO_DIR|Dual I/O Mode Direction Control + * | | |0 = Dual Input mode. + * | | |1 = Dual Output mode. + * |[13] |DUAL_IO_EN|Dual I/O Mode Enable + * | | |0 = Dual I/O mode Disabled. + * | | |1 = Dual I/O mode Enabled. + * |[16] |SS_INT_OPT|Slave Select Inactive Interrupt Option + * | | |This setting is only available if the SPI controller is configured as level trigger slave device. + * | | |0 = As the slave select signal goes to inactive level, the IF bit will NOT be set to 1. + * | | |1 = As the slave select signal goes to inactive level, the IF bit will be set to 1. + * |[31] |BCn |SPI Peripheral Clock Backward Compatible Option + * | | |0 = Backward compatible clock configuration. + * | | |1 = Clock configuration is not backward compatible. + * | | |Refer to the description of SPI_DIVIDER register for details. + * @var SPI_T::FIFO_CTL + * Offset: 0x40 SPI FIFO Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RX_CLR |Clear Receive FIFO Buffer + * | | |0 = No effect. + * | | |1 = Clear receive FIFO buffer. + * | | |The RX_FULL flag will be cleared to 0 and the RX_EMPTY flag will be set to 1. + * | | |This bit will be cleared to 0 by hardware after it is set to 1 by software. + * |[1] |TX_CLR |Clear Transmit FIFO Buffer + * | | |0 = No effect. + * | | |1 = Clear transmit FIFO buffer. + * | | |The TX_FULL flag will be cleared to 0 and the TX_EMPTY flag will be set to 1. + * | | |This bit will be cleared to 0 by hardware after it is set to 1 by software. + * |[2] |RX_INTEN |Receive Threshold Interrupt Enable + * | | |0 = RX threshold interrupt Disabled. + * | | |1 = RX threshold interrupt Enabled. + * |[3] |TX_INTEN |Transmit Threshold Interrupt Enable + * | | |0 = TX threshold interrupt Disabled. + * | | |1 = TX threshold interrupt Enabled. + * |[6] |RXOV_INTEN|Receive FIFO Overrun Interrupt Enable + * | | |0 = Receive FIFO overrun interrupt Disabled. + * | | |1 = Receive FIFO overrun interrupt Enabled. + * |[21] |TIMEOUT_INTEN|Receive FIFO Time-Out Interrupt Enable + * | | |0 = Time-out interrupt Disabled. + * | | |1 = Time-out interrupt Enabled. + * |[26:24] |RX_THRESHOLD|Receive FIFO Threshold + * | | |If the valid data count of the receive FIFO buffer is larger than the RX_THRESHOLD setting, + * | | |the RX_INTSTS bit will be set to 1, else the RX_INTSTS bit will be cleared to 0. + * |[30:28] |TX_THRESHOLD|Transmit FIFO Threshold + * | | |If the valid data count of the transmit FIFO buffer is less than or equal to the TX_THRESHOLD + * | | |setting, the TX_INTSTS bit will be set to 1, else the TX_INTSTS bit will be cleared to 0. + * @var SPI_T::STATUS + * Offset: 0x44 SPI Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RX_INTSTS |Receive FIFO Threshold Interrupt Status (Read Only) + * | | |0 = The valid data count within the Rx FIFO buffer is smaller than or equal to the setting value of RX_THRESHOLD. + * | | |1 = The valid data count within the receive FIFO buffer is larger than the setting value of RX_THRESHOLD. + * | | |Note: If RX_INTEN = 1 and RX_INTSTS = 1, the SPI controller will generate a SPI interrupt request. + * |[2] |RX_OVERRUN|Receive FIFO Overrun Status + * | | |When the receive FIFO buffer is full, the follow-up data will be dropped and this bit will be set to 1. + * | | |Note: This bit will be cleared by writing 1 to itself. + * |[4] |TX_INTSTS |Transmit FIFO Threshold Interrupt Status (Read Only) + * | | |0 = The valid data count within the transmit FIFO buffer is larger than the setting value of TX_THRESHOLD. + * | | |1 = The valid data count within the transmit FIFO buffer is less than or equal to the setting value of TX_THRESHOLD. + * | | |Note: If TX_INTEN = 1 and TX_INTSTS = 1, the SPI controller will generate a SPI interrupt request. + * |[11] |SLV_START_INTSTS|Slave Start Interrupt Status + * | | |It is used to dedicate if a transaction has started in Slave 3-wire mode. + * | | |It is a mutual mirror bit of SPI_CNTRL2[11]. + * | | |0 = Slave has not detected any SPI clock transition since the SSTA_INTEN bit was set to 1. + * | | |1 = A transaction has started in Slave 3-wire mode. + * | | |It will be cleared as a transaction is done or by writing 1 to this bit. + * |[15:12] |RX_FIFO_COUNT|Receive FIFO Data Count (Read Only) + * | | |This bit field indicates the valid data count of receive FIFO buffer. + * |[16] |IF |SPI Unit Transfer Interrupt Flag + * | | |It is a mutual mirror bit of SPI_CNTRL[16]. + * | | |0 = No transaction has been finished since this bit was cleared to 0. + * | | |1 = SPI controller has finished one unit transfer. + * | | |Note: This bit will be cleared by writing 1 to itself. + * |[20] |TIMEOUT |Time-Out Interrupt Flag + * | | |0 = No receive FIFO time-out event. + * | | |1 = Receive FIFO buffer is not empty and no read operation on receive FIFO buffer over 64 SPI clock + * | | |period in Master mode or over 576 SPI peripheral clock period in Slave mode. + * | | |When the received FIFO buffer is read by software, the time-out status will be cleared automatically. + * | | |Note: This bit will be cleared by writing 1 to itself. + * |[24] |RX_EMPTY |Receive FIFO Buffer Empty Indicator (Read Only) + * | | |It is a mutual mirror bit of SPI_CNTRL[24]. + * | | |0 = Receive FIFO buffer is not empty. + * | | |1 = Receive FIFO buffer is empty. + * |[25] |RX_FULL |Receive FIFO Buffer Empty Indicator (Read Only) + * | | |It is a mutual mirror bit of SPI_CNTRL[24]. + * | | |0 = Receive FIFO buffer is not empty. + * | | |1 = Receive FIFO buffer is empty. + * |[26] |TX_EMPTY |Transmit FIFO Buffer Empty Indicator (Read Only) + * | | |It is a mutual mirror bit of SPI_CNTRL[26]. + * | | |0 = Transmit FIFO buffer is not empty. + * | | |1 = Transmit FIFO buffer is empty. + * |[27] |TX_FULL |Transmit FIFO Buffer Full Indicator (Read Only) + * | | |It is a mutual mirror bit of SPI_CNTRL[27]. + * | | |0 = Transmit FIFO buffer is not full. + * | | |1 = Transmit FIFO buffer is full. + * |[31:28] |TX_FIFO_COUNT|Transmit FIFO Data Count (Read Only) + * | | |This bit field indicates the valid data count of transmit FIFO buffer. + */ + + __IO uint32_t CNTRL; /* Offset: 0x00 Control and Status Register */ + __IO uint32_t DIVIDER; /* Offset: 0x04 Clock Divider Register */ + __IO uint32_t SSR; /* Offset: 0x08 Slave Select Register */ + __I uint32_t RESERVE0; + __I uint32_t RX[2]; /* Offset: 0x10/0x14 Data Receive Register 0/1 */ + __I uint32_t RESERVE1; + __I uint32_t RESERVE2; + __O uint32_t TX[2]; /* Offset: 0x20/0x24 Data Transmit Register 0/1 */ + __I uint32_t RESERVE3; + __I uint32_t RESERVE4; + __I uint32_t RESERVE5; + __IO uint32_t VARCLK; /* Offset: 0x34 Variable Clock Pattern Register */ + __IO uint32_t DMA; /* Offset: 0x38 SPI DMA Control Register */ + __IO uint32_t CNTRL2; /* Offset: 0x3C Control and Status Register 2 */ + __IO uint32_t FIFO_CTL; /* Offset: 0x40 SPI FIFO Control Register */ + __IO uint32_t STATUS; /* Offset: 0x44 SPI Status Register */ + +} SPI_T; + + + +/** @addtogroup REG_SPI_BITMASK SPI Bit Mask + @{ + */ + +/* SPI_CNTRL Bit Field Definitions */ +#define SPI_CNTRL_TX_FULL_Pos 27 /*!< SPI_T::CNTRL: TX_FULL Position */ +#define SPI_CNTRL_TX_FULL_Msk (1ul << SPI_CNTRL_TX_FULL_Pos) /*!< SPI_T::CNTRL: TX_FULL Mask */ + +#define SPI_CNTRL_TX_EMPTY_Pos 26 /*!< SPI_T::CNTRL: TX_EMPTY Position */ +#define SPI_CNTRL_TX_EMPTY_Msk (1ul << SPI_CNTRL_TX_EMPTY_Pos) /*!< SPI_T::CNTRL: TX_EMPTY Mask */ + +#define SPI_CNTRL_RX_FULL_Pos 25 /*!< SPI_T::CNTRL: RX_FULL Position */ +#define SPI_CNTRL_RX_FULL_Msk (1ul << SPI_CNTRL_RX_FULL_Pos) /*!< SPI_T::CNTRL: RX_FULL Mask */ + +#define SPI_CNTRL_RX_EMPTY_Pos 24 /*!< SPI_T::CNTRL: RX_EMPTY Position */ +#define SPI_CNTRL_RX_EMPTY_Msk (1ul << SPI_CNTRL_RX_EMPTY_Pos) /*!< SPI_T::CNTRL: RX_EMPTY Mask */ + +#define SPI_CNTRL_VARCLK_EN_Pos 23 /*!< SPI_T::CNTRL: VARCLK_EN Position */ +#define SPI_CNTRL_VARCLK_EN_Msk (1ul << SPI_CNTRL_VARCLK_EN_Pos) /*!< SPI_T::CNTRL: VARCLK_EN Mask */ + +#define SPI_CNTRL_TWOB_Pos 22 /*!< SPI_T::CNTRL: TWOB Position */ +#define SPI_CNTRL_TWOB_Msk (1ul << SPI_CNTRL_TWOB_Pos) /*!< SPI_T::CNTRL: TWOB Mask */ + +#define SPI_CNTRL_FIFO_Pos 21 /*!< SPI_T::CNTRL: FIFO Position */ +#define SPI_CNTRL_FIFO_Msk (1ul << SPI_CNTRL_FIFO_Pos) /*!< SPI_T::CNTRL: FIFO Mask */ + +#define SPI_CNTRL_REORDER_Pos 19 /*!< SPI_T::CNTRL: REORDER Position */ +#define SPI_CNTRL_REORDER_Msk (1ul << SPI_CNTRL_REORDER_Pos) /*!< SPI_T::CNTRL: REORDER Mask */ + +#define SPI_CNTRL_SLAVE_Pos 18 /*!< SPI_T::CNTRL: SLAVE Position */ +#define SPI_CNTRL_SLAVE_Msk (1ul << SPI_CNTRL_SLAVE_Pos) /*!< SPI_T::CNTRL: SLAVE Mask */ + +#define SPI_CNTRL_IE_Pos 17 /*!< SPI_T::CNTRL: IE Position */ +#define SPI_CNTRL_IE_Msk (1ul << SPI_CNTRL_IE_Pos) /*!< SPI_T::CNTRL: IE Mask */ + +#define SPI_CNTRL_IF_Pos 16 /*!< SPI_T::CNTRL: IF Position */ +#define SPI_CNTRL_IF_Msk (1ul << SPI_CNTRL_IF_Pos) /*!< SPI_T::CNTRL: IF Mask */ + +#define SPI_CNTRL_SP_CYCLE_Pos 12 /*!< SPI_T::CNTRL: SP_CYCLE Position */ +#define SPI_CNTRL_SP_CYCLE_Msk (0xFul << SPI_CNTRL_SP_CYCLE_Pos) /*!< SPI_T::CNTRL: SP_CYCLE Mask */ + +#define SPI_CNTRL_CLKP_Pos 11 /*!< SPI_T::CNTRL: CLKP Position */ +#define SPI_CNTRL_CLKP_Msk (1ul << SPI_CNTRL_CLKP_Pos) /*!< SPI_T::CNTRL: CLKP Mask */ + +#define SPI_CNTRL_LSB_Pos 10 /*!< SPI_T::CNTRL: LSB Position */ +#define SPI_CNTRL_LSB_Msk (1ul << SPI_CNTRL_LSB_Pos) /*!< SPI_T::CNTRL: LSB Mask */ + +#define SPI_CNTRL_TX_BIT_LEN_Pos 3 /*!< SPI_T::CNTRL: TX_BIT_LEN Position */ +#define SPI_CNTRL_TX_BIT_LEN_Msk (0x1Ful << SPI_CNTRL_TX_BIT_LEN_Pos) /*!< SPI_T::CNTRL: TX_BIT_LEN Mask */ + +#define SPI_CNTRL_TX_NEG_Pos 2 /*!< SPI_T::CNTRL: TX_NEG Position */ +#define SPI_CNTRL_TX_NEG_Msk (1ul << SPI_CNTRL_TX_NEG_Pos) /*!< SPI_T::CNTRL: TX_NEG Mask */ + +#define SPI_CNTRL_RX_NEG_Pos 1 /*!< SPI_T::CNTRL: RX_NEG Position */ +#define SPI_CNTRL_RX_NEG_Msk (1ul << SPI_CNTRL_RX_NEG_Pos) /*!< SPI_T::CNTRL: RX_NEG Mask */ + +#define SPI_CNTRL_GO_BUSY_Pos 0 /*!< SPI_T::CNTRL: GO_BUSY Position */ +#define SPI_CNTRL_GO_BUSY_Msk (1ul << SPI_CNTRL_GO_BUSY_Pos) /*!< SPI_T::CNTRL: GO_BUSY Mask */ + +/* SPI_DIVIDER Bit Field Definitions */ +#define SPI_DIVIDER_DIVIDER2_Pos 16 /*!< SPI_T::DIVIDER: DIVIDER2 Position */ +#define SPI_DIVIDER_DIVIDER2_Msk (0xFFul << SPI_DIVIDER_DIVIDER2_Pos) /*!< SPI_T::DIVIDER: DIVIDER2 Mask */ + +#define SPI_DIVIDER_DIVIDER_Pos 0 /*!< SPI_T::DIVIDER: DIVIDER Position */ +#define SPI_DIVIDER_DIVIDER_Msk (0xFFul << SPI_DIVIDER_DIVIDER_Pos) /*!< SPI_T::DIVIDER: DIVIDER Mask */ + +/* SPI_SSR Bit Field Definitions */ +#define SPI_SSR_LTRIG_FLAG_Pos 5 /*!< SPI_T::SSR: LTRIG_FLAG Position */ +#define SPI_SSR_LTRIG_FLAG_Msk (1ul << SPI_SSR_LTRIG_FLAG_Pos) /*!< SPI_T::SSR: LTRIG_FLAG Mask */ + +#define SPI_SSR_SS_LTRIG_Pos 4 /*!< SPI_T::SSR: SS_LTRIG Position */ +#define SPI_SSR_SS_LTRIG_Msk (1ul << SPI_SSR_SS_LTRIG_Pos) /*!< SPI_T::SSR: SS_LTRIG Mask */ + +#define SPI_SSR_AUTOSS_Pos 3 /*!< SPI_T::SSR: AUTOSS Position */ +#define SPI_SSR_AUTOSS_Msk (1ul << SPI_SSR_AUTOSS_Pos) /*!< SPI_T::SSR: AUTOSS Mask */ + +#define SPI_SSR_SS_LVL_Pos 2 /*!< SPI_T::SSR: SS_LVL Position */ +#define SPI_SSR_SS_LVL_Msk (1ul << SPI_SSR_SS_LVL_Pos) /*!< SPI_T::SSR: SS_LVL Mask */ + +#define SPI_SSR_SSR_Pos 0 /*!< SPI_T::SSR: SSR Position */ +#define SPI_SSR_SSR_Msk (3ul << SPI_SSR_SSR_Pos) /*!< SPI_T::SSR: SSR Mask */ + +/* SPI_DMA Bit Field Definitions */ +#define SPI_DMA_PDMA_RST_Pos 2 /*!< SPI_T::DMA: PDMA_RST Position */ +#define SPI_DMA_PDMA_RST_Msk (1ul << SPI_DMA_PDMA_RST_Pos) /*!< SPI_T::DMA: PDMA_RST Mask */ + +#define SPI_DMA_RX_DMA_GO_Pos 1 /*!< SPI_T::DMA: RX_DMA_GO Position */ +#define SPI_DMA_RX_DMA_GO_Msk (1ul << SPI_DMA_RX_DMA_GO_Pos) /*!< SPI_T::DMA: RX_DMA_GO Mask */ + +#define SPI_DMA_TX_DMA_GO_Pos 0 /*!< SPI_T::DMA: TX_DMA_GO Position */ +#define SPI_DMA_TX_DMA_GO_Msk (1ul << SPI_DMA_TX_DMA_GO_Pos) /*!< SPI_T::DMA: TX_DMA_GO Mask */ + +/* SPI_CNTRL2 Bit Field Definitions */ +#define SPI_CNTRL2_BCn_Pos 31 /*!< SPI_T::CNTRL2: BCn Position */ +#define SPI_CNTRL2_BCn_Msk (1ul << SPI_CNTRL2_BCn_Pos) /*!< SPI_T::CNTRL2: BCn Mask */ + +#define SPI_CNTRL2_SS_INT_OPT_Pos 16 /*!< SPI_T::CNTRL2: SS_INT_OPT Position */ +#define SPI_CNTRL2_SS_INT_OPT_Msk (1ul << SPI_CNTRL2_SS_INT_OPT_Pos) /*!< SPI_T::CNTRL2: SS_INT_OPT Mask */ + +#define SPI_CNTRL2_DUAL_IO_EN_Pos 13 /*!< SPI_T::CNTRL2: DUAL_IO_EN Position */ +#define SPI_CNTRL2_DUAL_IO_EN_Msk (1ul << SPI_CNTRL2_DUAL_IO_EN_Pos) /*!< SPI_T::CNTRL2: DUAL_IO_EN Mask */ + +#define SPI_CNTRL2_DUAL_IO_DIR_Pos 12 /*!< SPI_T::CNTRL2: DUAL_IO_DIR Position */ +#define SPI_CNTRL2_DUAL_IO_DIR_Msk (1ul << SPI_CNTRL2_DUAL_IO_DIR_Pos) /*!< SPI_T::CNTRL2: DUAL_IO_DIR Mask */ + +#define SPI_CNTRL2_SLV_START_INTSTS_Pos 11 /*!< SPI_T::CNTRL2: SLV_START_INTSTS Position */ +#define SPI_CNTRL2_SLV_START_INTSTS_Msk (1ul << SPI_CNTRL2_SLV_START_INTSTS_Pos) /*!< SPI_T::CNTRL2: SLV_START_INTSTS Mask */ + +#define SPI_CNTRL2_SSTA_INTEN_Pos 10 /*!< SPI_T::CNTRL2: SSTA_INTEN Position */ +#define SPI_CNTRL2_SSTA_INTEN_Msk (1ul << SPI_CNTRL2_SSTA_INTEN_Pos) /*!< SPI_T::CNTRL2: SSTA_INTEN Mask */ + +#define SPI_CNTRL2_SLV_ABORT_Pos 9 /*!< SPI_T::CNTRL2: SLV_ABORT Position */ +#define SPI_CNTRL2_SLV_ABORT_Msk (1ul << SPI_CNTRL2_SLV_ABORT_Pos) /*!< SPI_T::CNTRL2: SLV_ABORT Mask */ + +#define SPI_CNTRL2_NOSLVSEL_Pos 8 /*!< SPI_T::CNTRL2: NOSLVSEL Position */ +#define SPI_CNTRL2_NOSLVSEL_Msk (1ul << SPI_CNTRL2_NOSLVSEL_Pos) /*!< SPI_T::CNTRL2: NOSLVSEL Mask */ + +/* SPI_FIFO_CTL Bit Field Definitions */ +#define SPI_FIFO_CTL_TX_THRESHOLD_Pos 28 /*!< SPI_T::FIFO_CTL: TX_THRESHOLD Position */ +#define SPI_FIFO_CTL_TX_THRESHOLD_Msk (7ul << SPI_FIFO_CTL_TX_THRESHOLD_Pos) /*!< SPI_T::FIFO_CTL: TX_THRESHOLD Mask */ + +#define SPI_FIFO_CTL_RX_THRESHOLD_Pos 24 /*!< SPI_T::FIFO_CTL: RX_THRESHOLD Position */ +#define SPI_FIFO_CTL_RX_THRESHOLD_Msk (7ul << SPI_FIFO_CTL_RX_THRESHOLD_Pos) /*!< SPI_T::FIFO_CTL: RX_THRESHOLD Mask */ + +#define SPI_FIFO_CTL_TIMEOUT_INTEN_Pos 21 /*!< SPI_T::FIFO_CTL: TIMEOUT_INTEN Position */ +#define SPI_FIFO_CTL_TIMEOUT_INTEN_Msk (1ul << SPI_FIFO_CTL_TIMEOUT_INTEN_Pos) /*!< SPI_T::FIFO_CTL: TIMEOUT_INTEN Mask */ + +#define SPI_FIFO_CTL_RXOV_INTEN_Pos 6 /*!< SPI_T::FIFO_CTL: RXOV_INTEN Position */ +#define SPI_FIFO_CTL_RXOV_INTEN_Msk (1ul << SPI_FIFO_CTL_RXOV_INTEN_Pos) /*!< SPI_T::FIFO_CTL: RXOV_INTEN Mask */ + +#define SPI_FIFO_CTL_TX_INTEN_Pos 3 /*!< SPI_T::FIFO_CTL: TX_INTEN Position */ +#define SPI_FIFO_CTL_TX_INTEN_Msk (1ul << SPI_FIFO_CTL_TX_INTEN_Pos) /*!< SPI_T::FIFO_CTL: TX_INTEN Mask */ + +#define SPI_FIFO_CTL_RX_INTEN_Pos 2 /*!< SPI_T::FIFO_CTL: RX_INTEN Position */ +#define SPI_FIFO_CTL_RX_INTEN_Msk (1ul << SPI_FIFO_CTL_RX_INTEN_Pos) /*!< SPI_T::FIFO_CTL: RX_INTEN Mask */ + +#define SPI_FIFO_CTL_TX_CLR_Pos 1 /*!< SPI_T::FIFO_CTL: TX_CLR Position */ +#define SPI_FIFO_CTL_TX_CLR_Msk (1ul << SPI_FIFO_CTL_TX_CLR_Pos) /*!< SPI_T::FIFO_CTL: TX_CLR Mask */ + +#define SPI_FIFO_CTL_RX_CLR_Pos 0 /*!< SPI_T::FIFO_CTL: RX_CLR Position */ +#define SPI_FIFO_CTL_RX_CLR_Msk (1ul << SPI_FIFO_CTL_RX_CLR_Pos) /*!< SPI_T::FIFO_CTL: RX_CLR Mask */ + +/* SPI_STATUS Bit Field Definitions */ +#define SPI_STATUS_TX_FIFO_COUNT_Pos 28 /*!< SPI_T::STATUS: TX_FIFO_COUNT Position */ +#define SPI_STATUS_TX_FIFO_COUNT_Msk (0xFul << SPI_STATUS_TX_FIFO_COUNT_Pos) /*!< SPI_T::STATUS: TX_FIFO_COUNT Mask */ + +#define SPI_STATUS_TX_FULL_Pos 27 /*!< SPI_T::STATUS: TX_FULL Position */ +#define SPI_STATUS_TX_FULL_Msk (1ul << SPI_STATUS_TX_FULL_Pos) /*!< SPI_T::STATUS: TX_FULL Mask */ + +#define SPI_STATUS_TX_EMPTY_Pos 26 /*!< SPI_T::STATUS: TX_EMPTY Position */ +#define SPI_STATUS_TX_EMPTY_Msk (1ul << SPI_STATUS_TX_EMPTY_Pos) /*!< SPI_T::STATUS: TX_EMPTY Mask */ + +#define SPI_STATUS_RX_FULL_Pos 25 /*!< SPI_T::STATUS: RX_FULL Position */ +#define SPI_STATUS_RX_FULL_Msk (1ul << SPI_STATUS_RX_FULL_Pos) /*!< SPI_T::STATUS: RX_FULL Mask */ + +#define SPI_STATUS_RX_EMPTY_Pos 24 /*!< SPI_T::STATUS: RX_EMPTY Position */ +#define SPI_STATUS_RX_EMPTY_Msk (1ul << SPI_STATUS_RX_EMPTY_Pos) /*!< SPI_T::STATUS: RX_EMPTY Mask */ + +#define SPI_STATUS_TIMEOUT_Pos 20 /*!< SPI_T::STATUS: TIMEOUT Position */ +#define SPI_STATUS_TIMEOUT_Msk (1ul << SPI_STATUS_TIMEOUT_Pos) /*!< SPI_T::STATUS: TIMEOUT Mask */ + +#define SPI_STATUS_IF_Pos 16 /*!< SPI_T::STATUS: IF Position */ +#define SPI_STATUS_IF_Msk (1ul << SPI_STATUS_IF_Pos) /*!< SPI_T::STATUS: IF Mask */ + +#define SPI_STATUS_RX_FIFO_COUNT_Pos 12 /*!< SPI_T::STATUS: RX_FIFO_COUNT Position */ +#define SPI_STATUS_RX_FIFO_COUNT_Msk (0xFul << SPI_STATUS_RX_FIFO_COUNT_Pos) /*!< SPI_T::STATUS: RX_FIFO_COUNT Mask */ + +#define SPI_STATUS_SLV_START_INTSTS_Pos 11 /*!< SPI_T::STATUS: SLV_START_INTSTS Position */ +#define SPI_STATUS_SLV_START_INTSTS_Msk (1ul << SPI_STATUS_SLV_START_INTSTS_Pos) /*!< SPI_T::STATUS: SLV_START_INTSTS Mask */ + +#define SPI_STATUS_TX_INTSTS_Pos 4 /*!< SPI_T::STATUS: TX_INTSTS Position */ +#define SPI_STATUS_TX_INTSTS_Msk (1ul << SPI_STATUS_TX_INTSTS_Pos) /*!< SPI_T::STATUS: TX_INTSTS Mask */ + +#define SPI_STATUS_RX_OVERRUN_Pos 2 /*!< SPI_T::STATUS: RX_OVERRUN Position */ +#define SPI_STATUS_RX_OVERRUN_Msk (1ul << SPI_STATUS_RX_OVERRUN_Pos) /*!< SPI_T::STATUS: RX_OVERRUN Mask */ + +#define SPI_STATUS_RX_INTSTS_Pos 0 /*!< SPI_T::STATUS: RX_INTSTS Position */ +#define SPI_STATUS_RX_INTSTS_Msk (1ul << SPI_STATUS_RX_INTSTS_Pos) /*!< SPI_T::STATUS: RX_INTSTS Mask */ +/*@}*/ /* end of group REG_SPI_BITMASK */ +/*@}*/ /* end of group REG_SPI */ + + +/*---------------------------- Global Controller -----------------------------*/ +/** @addtogroup REG_SYS System Manger Controller (SYS) + Memory Mapped Structure for System Controller + @{ + */ + + +typedef struct +{ + + + +/** + * @var GCR_T::PDID + * Offset: 0x00 Part Device Identification Number Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |PDID |Part Device Identification Number + * | | |This register reflects device part number code. + * | | |Software can read this register to identify which device is used. + * @var GCR_T::RSTSRC + * Offset: 0x04 System Reset Source Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RSTS_POR |Power-on Reset Flag + * | | |The RSTS_POR flag is set by the "Reset Signal" from the Power-On Reset (POR) controller or bit CHIP_RST (IPRSTC1[0]) to indicate the previous reset source. + * | | |0 = No reset from POR or CHIP_RST (IPRSTC1[0]). + * | | |1 = Power-on Reset (POR) or CHIP_RST (IPRSTC1[0]) had issued the reset signal to reset the system. + * | | |Note: This bit can be cleared by writing "1" to it. + * |[1] |RSTS_RESET|Reset Pin Reset Flag + * | | |The RSTS_RESET flag is set by the "Reset Signal" from the nRESET Pin to indicate the previous reset source. + * | | |0 = No reset from nRESET pin. + * | | |1 = The Pin nRESET had issued the reset signal to reset the system. + * | | |Note: This bit can be cleared by writing "1" to it. + * |[2] |RSTS_WDT |Watchdog Reset Flag + * | | |The RSTS_WDT flag is set by the "Reset Signal" from the Watchdog Timer to indicate the previous reset source + * | | |0 = No reset from watchdog timer. + * | | |1 = The watchdog timer had issued the reset signal to reset the system. + * | | |Note1: This bit can be cleared by writing "1" to it. + * | | |Note2: + * | | |Watchdog Timer register WTRF (WTCR[2]) bit is set if the system has been reset by WDT time-out reset. + * | | |Window Watchdog Timer register WWDTRF (WWDTSR[1]) bit is set if the system has been reset by WWDT time-out reset. + * |[3] |RSTS_LVR |Low Voltage Reset Flag + * | | |The RSTS_LVR flag is set by the "Reset Signal" from the Low-Voltage-Reset controller to indicate the previous reset source. + * | | |0 = No reset from LVR. + * | | |1 = The LVR controller had issued the reset signal to reset the system. + * | | |Note: This bit can be cleared by writing "1" to it. + * |[4] |RSTS_BOD |Brown-out Detector Reset Flag + * | | |The RSTS_BOD flag is set by the "Reset Signal" from the Brown-out Detector to indicate the previous reset source. + * | | |0 = No reset from BOD. + * | | |1 = The BOD had issued the reset signal to reset the system. + * | | |Note: This bit can be cleared by writing "1" to it. + * |[5] |RSTS_SYS |SYS Reset Flag + * | | |The RSTS_SYS flag is set by the "Reset Signal" from the Cortex-M0 kernel to indicate the previous reset source. + * | | |0 = No reset from Cortex-M0. + * | | |1 = The Cortex-M0 had issued the reset signal to reset the system by writing 1 to bit SYSRESETREQ (AIRCR[2], Application Interrupt and Reset Control Register, address = 0xE000ED0C) in system control registers of Cortex-M0 kernel. + * | | |Note: This bit can be cleared by writing "1" to it. + * |[7] |RSTS_CPU |CPU Reset Flag + * | | |The RSTS_CPU flag is set by hardware if software writes CPU_RST (IPRSTC1[1]) 1 to reset Cortex-M0 CPU kernel and flash Memory Controller (FMC) + * | | |0 = No reset from CPU. + * | | |1 = Cortex-M0 CPU kernel and FMC are reset by software setting CPU_RST (IPRSTC1[1]) to 1. + * | | |Note: This bit can be cleared by writing "1" to it. + * @var GCR_T::IPRSTC1 + * Offset: 0x08 Peripheral Reset Control Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CHIP_RST |CHIP One-shot Reset (Write Protect) + * | | |Setting this bit will reset the whole chip, including CPU kernel and all peripherals, and this bit will automatically return to 0 after the 2 clock cycles. + * | | |The CHIP_RST is the same as the POR reset, all the chip controllers are reset and the chip setting from flash are also reload. + * | | |0 = CHIP normal operation. + * | | |1 = CHIP one-shot reset. + * | | |Note: This bit is write protected. Refer to the REGWRPROT register. + * |[1] |CPU_RST |CPU Kernel One-shot Reset (Write Protect) + * | | |Setting this bit will only reset the CPU kernel and Flash Memory Controller(FMC), and this bit will automatically return 0 after the two clock cycles + * | | |0 = CPU normal operation. + * | | |1 = CPU one-shot reset. + * | | |Note: This bit is write protected. Refer to the REGWRPROT register. + * |[2] |PDMA_RST |PDMA Controller Reset (Write Protect) + * | | |Setting this bit to 1 will generate a reset signal to the PDMA. User need to set this bit to 0 to release from reset state. + * | | |0 = PDMA controller normal operation. + * | | |1 = PDMA controller reset. + * | | |Note: This bit is write protected. Refer to the REGWRPROT register. + * @var GCR_T::IPRSTC2 + * Offset: 0x0C Peripheral Reset Control Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1] |GPIO_RST |GPIO Controller Reset + * | | |0 = GPIO controller normal operation. + * | | |1 = GPIO controller reset. + * |[2] |TMR0_RST |Timer0 Controller Reset + * | | |0 = Timer0 controller normal operation. + * | | |1 = Timer0 controller reset. + * |[3] |TMR1_RST |Timer1 Controller Reset + * | | |0 = Timer1 controller normal operation. + * | | |1 = Timer1 controller reset. + * |[4] |TMR2_RST |Timer2 Controller Reset + * | | |0 = Timer2 controller normal operation. + * | | |1 = Timer2 controller reset. + * |[5] |TMR3_RST |Timer3 Controller Reset + * | | |0 = Timer3 controller normal operation. + * | | |1 = Timer3 controller reset. + * |[8] |I2C0_RST |I2C0 Controller Reset + * | | |0 = I2C0 controller normal operation. + * | | |1 = I2C0 controller reset. + * |[9] |I2C1_RST |I2C1 Controller Reset + * | | |0 = I2C1 controller normal operation. + * | | |1 = I2C1 controller reset. + * |[12] |SPI0_RST |SPI0 Controller Reset + * | | |0 = SPI0 controller normal operation. + * | | |1 = SPI0 controller reset. + * |[13] |SPI1_RST |SPI1 Controller Reset + * | | |0 = SPI1 controller normal operation. + * | | |1 = SPI1 controller reset. + * |[14] |SPI2_RST |SPI2 Controller Reset + * | | |0 = SPI2 controller normal operation. + * | | |1 = SPI2 controller reset. + * |[16] |UART0_RST |UART0 Controller Reset + * | | |0 = UART0 controller normal operation. + * | | |1 = UART0 controller reset. + * |[17] |UART1_RST |UART1 Controller Reset + * | | |0 = UART1 controller normal operation. + * | | |1 = UART1 controller reset. + * |[20] |PWM03_RST |PWM03 Controller Reset + * | | |0 = PWM03 controller normal operation. + * | | |1 = PWM03 controller reset. + * |[23] |PS2_RST |PS/2 Controller Reset + * | | |0 = PS/2 controller normal operation. + * | | |1 = PS/2 controller reset. + * |[27] |USBD_RST |USB Device Controller Reset + * | | |0 = USB device controller normal operation. + * | | |1 = USB device controller reset. + * |[28] |ADC_RST |ADC Controller Reset + * | | |0 = ADC controller normal operation. + * | | |1 = ADC controller reset. + * |[29] |I2S_RST |I2S Controller Reset + * | | |0 = I2S controller normal operation. + * | | |1 = I2S controller reset. + * @var GCR_T::BODCR + * Offset: 0x18 Brown-out Detector Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |BOD_EN |Brown-out Detector Enable Bit (Write Protect) + * | | |The default value is set by flash controller user configuration register CBODEN (Config0[23]) bit. + * | | |0 = Brown-out Detector function Disabled. + * | | |1 = Brown-out Detector function Enabled. + * | | |Note: This bit is write protected. Refer to the REGWRPROT register. + * |[2:1] |BOD_VL |Brown-out Detector Threshold Voltage Selection (Write Protect) + * | | |The default value is set by flash memory controller user configuration register CBOV (Config0[22:21]) bits. + * | | |00 = Brown-out voltage is 2.2V. + * | | |01 = Brown-out voltage is 2.7V. + * | | |10 = Brown-out voltage is 3.7V. + * | | |11 = Brown-out voltage is 4.4V. + * | | |Note: This bit is write protected. Refer to the REGWRPROT register. + * |[3] |BOD_RSTEN |Brown-out Reset Enable Bit (Write Protect) + * | | |0 = Brown-out "INTERRUPT" function Enabled. + * | | |1 = Brown-out "RESET" function Enabled. + * | | |While the Brown-out Detector function is enabled (BOD_EN high) and BOD reset function is enabled (BOD_RSTEN high), BOD will assert a signal to reset chip when the detected voltage is lower than the threshold (BOD_OUT high). + * | | |Note1: While the BOD function is enabled (BOD_EN high) and BOD interrupt function is enabled (BOD_RSTEN low), BOD will assert an interrupt if BOD_OUT is high. + * | | |BOD interrupt will keep till to the BOD_EN set to 0. + * | | |BOD interrupt can be blocked by disabling the NVIC BOD interrupt or disabling BOD function (set BOD_EN low). + * | | |Note2: The default value is set by flash controller user configuration register CBORST (Config0[20]) bit. + * | | |Note3: This bit is write protected. Refer to the REGWRPROT register. + * |[4] |BOD_INTF |Brown-out Detector Interrupt Flag + * | | |0 = Brown-out Detector does not detect any voltage draft at VDD down through or up through the voltage of BOD_VL setting. + * | | |1 = When Brown-out Detector detects the VDD is dropped down through the voltage of BOD_VL setting or the VDD is raised up through the voltage of BOD_VL setting, this bit is set to 1 and the Brown-out interrupt is requested if Brown-out interrupt is enabled. + * | | |Note: This bit can be cleared to 0 by software writing "1". + * |[5] |BOD_LPM |Brown-out Detector Low Power Mode (Write Protect) + * | | |0 = BOD operated in Normal mode (default). + * | | |1 = BOD Low Power mode Enabled. + * | | |Note1: The BOD consumes about 100 uA in Normal mode, and the low power mode can reduce the current to about 1/10 but slow the BOD response. + * | | |Note2: This bit is write protected. Refer to the REGWRPROT register. + * |[6] |BOD_OUT |Brown-out Detector Output Status + * | | |0 = Brown-out Detector output status is 0. It means the detected voltage is higher than BOD_VL setting or BOD_EN is 0. + * | | |1 = Brown-out Detector output status is 1. It means the detected voltage is lower than BOD_VL setting. If the BOD_EN is 0, BOD function disabled , this bit always responds to 0. + * |[7] |LVR_EN |Low Voltage Reset Enable Bit (Write Protect) + * | | |The LVR function reset the chip when the input power voltage is lower than LVR circuit setting. + * | | |LVR function is enabled by default. + * | | |0 = Low Voltage Reset function Disabled. + * | | |1 = Low Voltage Reset function Enabled - After enabling the bit, the LVR function will be active with 100us delay for LVR output stable (default). + * | | |Note: This bit is write protected. Refer to the REGWRPROT register. + * @var GCR_T::PORCR + * Offset: 0x24 Power-on-Reset Controller Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |POR_DIS_CODE|Power-on-Reset Enable Bis (Write Protect) + * | | |When powered on, the POR circuit generates a reset signal to reset the whole chip function, but noise on the power may cause the POR active again. User can disable internal POR circuit to avoid unpredictable noise to cause chip reset by writing 0x5AA5 to this field. + * | | |The POR function will be active again when this field is set to another value or chip is reset by other reset source, including: nRESET, Watchdog, LVR reset, BOD reset, ICE reset command and the software-chip reset function. + * | | |Note: This bit is write protected. Refer to the REGWRPROT register. + * @var GCR_T::GPA_MFP + * Offset: 0x30 GPIOA Multiple Function and Input Type Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10] |GPA_MFP10 |PA.10 Pin Function Selection + * | | |Bits PA10_MFP1 (ALT_MFP[12]) and GPA_MFP[10] determine the PA.10 function. + * | | |(PA10_MFP1 (ALT_MFP[12]), GPA_MFP[10]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = I2C1_SDA function is selected. + * | | |(1, 0) = SPI1_MISO0 function is selected. + * | | |(1, 1) = SPI2_MISO0 function is selected. + * |[11] |GPA_MFP11 |PA.11 Pin Function Selection + * | | |Bits PA11_MFP1 (ALT_MFP[11]) and GPA_MFP[11] determine the PA.11 function. + * | | |(PA11_MFP1 (ALT_MFP[11]), GPA_MFP[11]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = I2C1_SCL function is selected. + * | | |(1, 0) = SPI1_CLK function is selected. + * | | |(1, 1) = SPI2_MOSI0 function is selected. + * |[12] |GPA_MFP12 |PA.12 Pin Function Selection + * | | |Bit GPA_MFP[12] determines the PA.12 function. + * | | |0 = GPIO function is selected. + * | | |1 = PWM0 function is selected. + * |[13] |GPA_MFP13 |PA.13 Pin Function Selection + * | | |Bit GPA_MFP[13] determines the PA.13 function. + * | | |0 = GPIO function is selected. + * | | |1 = PWM1 function is selected. + * |[14] |GPA_MFP14 |PA.14 Pin Function Selection + * | | |Bit GPA_MFP[14] determines the PA.14 function. + * | | |0 = GPIO function is selected. + * | | |1 = PWM2 function is selected. + * |[15] |GPA_MFP15 |PA.15 Pin Function Selection + * | | |Bits PA15_MFP1 (ALT_MFP[9]) and GPA_MFP[15] determine the PA.15 function. + * | | |(PA15_MFP1 (ALT_MFP[9]), GPA_MFP[15]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = PWM3 function is selected. + * | | |(1, 0) = CLKO function is selected. + * | | |(1, 1) = I2S_MCLK function is selected. + * |[31:16] |GPA_TYPEn |Schmitt Trigger Function Selection + * | | |0 = GPIOA[15:0] I/O input Schmitt Trigger function Disabled. + * | | |1 = GPIOA[15:0] I/O input Schmitt Trigger function Enabled. + * @var GCR_T::GPB_MFP + * Offset: 0x34 GPIOB Multiple Function and Input Type Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |GPB_MFP0 |PB.0 Pin Function Selection + * | | |Bit GPB_MFP[0] determines the PB.0 function. + * | | |0 = GPIO function is selected. + * | | |1 = UART0_RXD function is selected. + * |[1] |GPB_MFP1 |PB.1 Pin Function Selection + * | | |Bit GPB_MFP[1] determines the PB.1 function. + * | | |0 = GPIO function is selected. + * | | |1 = UART0_TXD0 function is selected. + * |[2] |GPB_MFP2 |PB.2 Pin Function Selection + * | | |Bits PB2_MFP1(ALT_MFP[26]) and GPB_MFP[2] determine the PB.2 function. + * | | |(PB2_MFP1 (ALT_MFP[26]), GPB_MFP[2]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = UART0_nRTS function is selected. + * | | |(1, 1) = TM2_EXT function is selected. + * |[3] |GPB_MFP3 |PB.3 Pin Function Selection + * | | |Bits PB3_MFP1 (ALT_MFP[27]) and GPB_MFP[3] determine the PB.3 function. + * | | |(PB3_MFP1 (ALT_MFP[27]), GPB_MFP[3]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = UART0_nCTS function is selected. + * | | |(1, 1) = TM3_EXT function is selected. + * |[4] |GPB_MFP4 |PB.4 Pin Function Selection + * | | |Bits PB4_MFP1 (ALT_MFP[15]) and GPB_MFP[4] determine the PB.4 function. + * | | |(PB4_MFP1 (ALT_MFP[15]), GPB_MFP[4]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = UART1_RXD function is selected. + * | | |(1, 0) = SPI2_SS0 function is selected. + * | | |(1, 1) = SPI1_SS1 function is selected. + * |[5] |GPB_MFP5 |PB. 5 Pin Function Selection + * | | |Bits PB5_MFP1 (ALT_MFP[18]) and GPB_MFP[5] determine the PB.5 function. + * | | |(PB5_MFP1 (ALT_MFP[18]), GPB_MFP[5]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = UART1_TXD function is selected. + * | | |(1, 1) = SPI2_CLK function is selected. + * |[6] |GPB_MFP6 |PB.6 Pin Function Selection + * | | |Bits PB6_MFP1 (ALT_MFP[17]) and GPB_MFP[6] determine the PB.6 function. + * | | |(PB6_MFP1 (ALT_MFP[17]), GPB_MFP[6]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = UART1_nRTS function is selected. + * | | |(1, 1) = SPI2_MOSI0 function is selected. + * |[7] |GPB_MFP7 |PB.7 Pin Function Selection + * | | |Bits PB7_MFP1 (ALT_MFP[16]) and GPB_MFP[7] determine the PB.7 function. + * | | |(PB7_MFP1 (ALT_MFP[16]), GPB_MFP[7]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = UART1_nCTS function is selected. + * | | |(1, 1) = SPI2_MISO0 function is selected. + * |[8] |GPB_MFP8 |PB.8 Pin Function Selection + * | | |Bit GPB_MFP[8] determines the PB.8 function. + * | | |0 = GPIO function is selected. + * | | |1 = TM0 function is selected. + * |[9] |GPB_MFP9 |PB.9 Pin Function Selection + * | | |Bits PB9_MFP1 (ALT_MFP[1]) and GPB_MFP[9] determine the PB.9 function. + * | | |(PB9_MFP1 (ALT_MFP[1]), GPB_MFP[9]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = TM1 function is selected. + * | | |(1, 0) = PWM1 function is selected. (NUC123xxxAEx Only) + * | | |(1, 1) = SPI1_SS1 function is selected. + * |[10] |GPB_MFP10 |PB.10 Pin Function Selection + * | | |Bit GPB_MFP[10] determines the PB.10 function. + * | | |(PB10_MFP1 (ALT_MFP[0]), GPB_MFP[10]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = TM2 function is selected. + * | | |(1, 1) = SPI0_SS1 function is selected. + * |[12] |GPB_MFP12 |PB.12 Pin Function Selection + * | | |Bits PB12_MFP1 (ALT_MFP[10]) and GPB_MFP[12] determine the PB.12 function. + * | | |(PB12_MFP1 (ALT_MFP[10]), GPB_MFP[12]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI1_SS0 function is selected. + * | | |(1, 1) = CLKO function is selected. + * |[13] |GPB_MFP13 |PB.13 Pin Function Selection + * | | |Bit GPB_MFP[13] determines the PB.13 function. + * | | |0 = GPIO function is selected. + * |[14] |GPB_MFP14 |PB.14 Pin Function Selection + * | | |Bit GPB_MFP[14] determines PB.14 function. + * | | |0 = GPIO function is selected. + * | | |1 = INT0 function is selected. + * |[15] |GPB_MFP15 |PB.15 Pin Function Selection + * | | |Bits PB15_MFP1 (ALT_MFP[24]) and GPB_MFP[15] determine the PB.15 function. + * | | |(PB15_MFP1 (ALT_MFP[24]), GPB_MFP[15]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = INT1 function is selected. + * | | |(1, 1) = TM0_EXT function is selected. + * |[31:16] |GPB_TYPEn |Schmitt Trigger Function Selection + * | | |0 = GPIOB[15:0] I/O input Schmitt Trigger function Disabled. + * | | |1 = GPIOB[15:0] I/O input Schmitt Trigger function Enabled. + * @var GCR_T::GPC_MFP + * Offset: 0x38 GPIOC Multiple Function and Input Type Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |GPC_MFP0 |PC.0 Pin Function Selection + * | | |Bits PC0_MFP1 (ALT_MFP[5]) and GPC_MFP[0] determine the PC.0 function. + * | | |(PC0_MFP1 (ALT_MFP[5]), GPC_MFP[0]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI0_SS0 function is selected. + * | | |(1, 1) = I2S_LRCLK function is selected. + * |[1] |GPC_MFP1 |PC.1 Pin Function Selection + * | | |Bits PC1_MFP1 (ALT_MFP[6]) and GPC_MFP[1] determine the PC.1 function. + * | | |(PC1_MFP1 (ALT_MFP[6]), GPC_MFP[1]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI0_CLK function is selected. + * | | |(1, 1) = I2S_BCLK function is selected. + * |[2] |GPC_MFP2 |PC.2 Pin Function Selection + * | | |Bits PC2_MFP1 (ALT_MFP[7]) and GPC_MFP[2] determine the PC.2 function. + * | | |(PC2_MFP1 (ALT_MFP[7]), GPC_MFP[2]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI0_MISO0 function is selected. + * | | |(1, 1) = I2S_DI function is selected. + * |[3] |GPC_MFP3 |PC.3 Pin Function Selection + * | | |Bits PC3_MFP1 (ALT_MFP[8]) and GPC_MFP[3] determine the PC.3 function. + * | | |(PC3_MFP1 (ALT_MFP[8]), GPC_MFP[3]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI0_MOSI0 function is selected. + * | | |(1, 1) = I2S_DO function is selected. + * |[4] |GPC_MFP4 |PC.4 Pin Function Selection + * | | |Bits PC4_MFP1 (ALT_MFP[29]) and GPC_MFP[4] determine the PC.4 function. + * | | |(PC4_MFP1 (ALT_MFP[29]), GPC_MFP[4]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI0_MISO1 function is selected. + * | | |(1, 1) = UART0_RXD function is selected. + * |[5] |GPC_MFP5 |PC.5 Pin Function Selection + * | | |Bits PC5_MFP1 (ALT_MFP[30]) and GPC_MFP[5] determine the PC.5 function. + * | | |(PC5_MFP1 (ALT_MFP[30]), GPC_MFP[5]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI0_MOSI1 function is selected. + * | | |(1, 1) = UART0_TXD function is selected. + * |[8] |GPC_MFP8 |PC.8 Pin Function Selection + * | | |Bits PC8_MFP1 (ALT_MFP1[23]) and GPC_MFP[8] determine the PC.8 function. + * | | |(PC8_MFP1 (ALT_MFP1[23]), GPC_MFP[8]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI1_SS0 function is selected. + * | | |(1, 1) = PWM0 function is selected. (NUC123xxxAEx Only) + * |[9] |GPC_MFP9 |PC.9 Pin Function Selection + * | | |Bit GPC_MFP[9] determines the PC.9 function. + * | | |0 = GPIO function is selected. + * | | |1 = SPI1_CLK function is selected. + * |[10] |GPC_MFP10 |PC.10 Pin Function Selection + * | | |Bit GPC_MFP[10] determines the PC.10 function. + * | | |0 = GPIO function is selected. + * | | |1 = SPI1_MISO0 function is selected. + * |[11] |GPC_MFP11 |PC.11 Pin Function Selection + * | | |Bit GPC_MFP[11] determines the PC.11 function. + * | | |0 = GPIO function is selected. + * | | |1 = SPI1_MOSI0 function is selected. + * |[12] |GPC_MFP12 |PC.12 Pin Function Selection + * | | |Bits PC12_MFP1 (ALT_MFP[20]) and GPC_MFP[12] determine the PC.12 function. + * | | |(PC12_MFP1 (ALT_MFP[20]), GPC_MFP[12]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI1_MISO1 function is selected. + * | | |(1, 0) = I2S_MCLK function is selected. + * | | |(1, 1) = PWM2 function is selected. + * |[13] |GPC_MFP13 |PC.13 Pin Function Selection + * | | |Bits PC13_MFP1 (ALT_MFP[21]) and GPC_MFP[13] determine the PC.13 function. + * | | |(PC13_MFP1 (ALT_MFP[21]), GPC_MFP[13]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI1_MOSI1 function is selected. + * | | |(1, 0) = CLKO function is selected. + * | | |(1, 1) = PWM3 function is selected. + * |[31:16] |GPC_TYPEn |Schmitt Trigger Function Selection + * | | |0 = GPIOC[15:0] I/O input Schmitt Trigger function Disabled. + * | | |1 = GPIOC[15:0] I/O input Schmitt Trigger function Enabled. + * @var GCR_T::GPD_MFP + * Offset: 0x3C GPIOD Multiple Function and Input Type Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |GPD_MFP0 |PD.0 Pin Function Selection + * | | |Bits PD0_MFP1 (ALT_MFP1[16]) and GPD_MFP[0] determine the PD.0 function. + * | | |(PD0_MFP1 (ALT_MFP1[16]), GPD_MFP[0]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(1, 0) = SPI2_SS0 function is selected. + * | | |(1, 1) = ADC0 function is selected. + * |[1] |GPD_MFP1 |PD.1 Pin Function Selection + * | | |Bits PD1_MFP1 (ALT_MFP1[17]) and GPD_MFP[1] determine the PD.1 function. + * | | |(PD1_MFP1 (ALT_MFP1[17]), GPD_MFP[1]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI0_SS1 function is selected. + * | | |(1, 0) = SPI2_CLK function is selected. + * | | |(1, 1) = ADC1 function is selected. + * |[2] |GPD_MFP2 |PD.2 Pin Function Selection + * | | |Bits PD2_MFP1 (ALT_MFP1[18]) and GPD_MFP[2] determine the PD.2 function. + * | | |(PD2_MFP1 (ALT_MFP1[18]), GPD_MFP[2]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI0_MISO1 function is selected. + * | | |(1, 0) = SPI2_MISO0 function is selected. + * | | |(1, 1) = ADC2 function is selected. + * |[3] |GPD_MFP3 |PD.3 Pin Function Selection + * | | |Bits PD3_MFP1 (ALT_MFP1[19]) and GPD_MFP[3] determine the PD.3 function. + * | | |(PD3_MPF1 (ALT_MFP1[19]), GPD_MFP[3]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI0_MOSI1 function is selected. + * | | |(1, 0) = SPI2_MOSI0 function is selected. + * | | |(1, 1) = ADC3 function is selected. + * |[4] |GPD_MFP4 |PD.4 Pin Function Selection + * | | |Bits PD4_MFP1 (ALT_MFP1[20]) and GPD_MFP[4] determine the PD.4 function. + * | | |(PD4_MFP1 (ALT_MFP1[20]), GPD_MFP[4]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(1, 0) = SPI2_MISO1 function is selected. + * | | |(1, 1) = ADC4 function is selected. + * |[5] |GPD_MFP5 |PD.5 Pin Function Selection + * | | |Bits PD5_MFP1 (ALT_MFP1[21]) and GPD_MFP[5] determine the PD.5 function. + * | | |(PD5_MFP1 (ALT_MFP1[21]), GPD_MFP[5]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(1, 0) = SPI2_MOSI1 function is selected. + * | | |(1, 1) = ADC5 function is selected. + * |[8] |GPD_MFP8 |PD.8 Pin Function Selection + * | | |Bit GPD_MFP[8] determines the PD.8 function. + * | | |0 = GPIO function is selected. + * | | |1 = SPI1_MOSI0 function is selected. + * |[9] |GPD_MFP9 |PD.9 Pin Function Selection + * | | |it GPD_MFP[9] determines the PD.9 function. + * | | |0 = GPIO function is selected. + * |[10] |GPD_MFP10 |PD.10 Pin Function Selection + * | | |Bit GPD_MFP[10] determines the PD.10 function. + * | | |0 = GPIO function is selected. + * | | |1 = CLKO function is selected. + * |[11] |GPD_MFP11 |PD.11 Pin Function Selection + * | | |Bit GPD_MFP[11] determines the PD.11 function. + * | | |0 = GPIO function is selected. + * | | |1 = INT1 function is selected. + * |[31:16] |GPD_TYPEn |Schmitt Trigger Function Selection + * | | |0 = GPIOD[15:0] I/O input Schmitt Trigger function Disabled. + * | | |1 = GPIOD[15:0] I/O input Schmitt Trigger function Enabled. + * @var GCR_T::GPF_MFP + * Offset: 0x44 GPIOF Multiple Function and Input Type Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |GPF_MFP0 |PF.0 Pin Function Selection + * | | |Bit GPF_MFP[0] determines the PF.0 function. + * | | |0 = GPIO function is selected. + * | | |1 = XT1_OUT function is selected. + * | | |Note1: For NUC123xxxANx, the value of this bit is controlled by CGPFMFP (Config0[27]) when power-up, user can write this bit after chip power-up. + * | | |Note2: For NUC123xxxAEx, the value of this bit is controlled by CGPFMFP (Config0[27]). + * |[1] |GPF_MFP1 |PF.1 Pin Function Selection + * | | |Bit GPF_MFP[1] determines the PF.1 function. + * | | |0 = GPIO function is selected. + * | | |1 = XT1_IN function is selected. + * | | |Note1: For NUC123xxxANx, the value of this bit is controlled by CGPFMFP (Config0[27]) when power-up, user can write this bit after chip power-up. + * | | |Note2: For NUC123xxxAEx, the value of this bit is controlled by CGPFMFP (Config0[27]). + * |[2] |GPF_MFP2 |PF.2 Pin Function Selection + * | | |Bits PF2_MFP1 (ALT_MFP1[25:24]) and GPF_MFP[2] determine the PF.2 function. + * | | |(PF2_MFP1 (ALT_MFP1[25:24]), GPF_MFP[2]) value and function mapping are as following list. + * | | |(00, 0) = GPIO function is selected. + * | | |(00, 1) = PS2_DAT function is selected. + * | | |(10, 1) = I2C0_SDA function is selected. + * | | |(11, 1) = ADC6 function is selected. + * | | |The reset value of this bit is 1. + * |[3] |GPF_MFP3 |PF.3 Pin Function Selection + * | | |Bits PF3_MFP1 (ALT_MFP1[27:26]) and GPF_MFP[3] determine the PF.3 function. + * | | |(PF3_MFP1 (ALT_MFP1[27:26]), GPF_MFP[3]) value and function mapping are as following list. + * | | |(00, 0) = GPIO function is selected. + * | | |(00, 1) = PS2_CLK function is selected. + * | | |(10, 1) = I2C0_SCL function is selected. + * | | |(11, 1) = ADC7 function is selected. + * | | |The reset value of this bit is 1. + * |[19:16] |GPF_TYPEn |Schmitt Trigger Function Selection + * | | |0 = GPIOF[3:0] I/O input Schmitt Trigger function Disabled. + * | | |1 = GPIOF[3:0] I/O input Schmitt Trigger function Enabled. + * @var GCR_T::ALT_MFP + * Offset: 0x50 Alternative Multiple Function Pin Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PB10_MFP1 |PB.10 Pin Alternate Function Selection + * | | |Bit GPB_MFP[10] determines the PB.10 function. + * | | |(PB10_MFP1 (ALT_MFP[0]), GPB_MFP[10]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = TM2 function is selected. + * | | |(1, 1) = SPI0_SS1 function is selected. + * |[1] |PB9_MFP1 |PB.9 Pin Alternate Function Selection + * | | |Bits PB9_MFP1 (ALT_MFP[1]) and GPB_MFP[9] determine the PB.9 function. + * | | |(PB9_MFP1 (ALT_MFP[1]), GPB_MFP[9]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = TM1 function is selected. + * | | |(1, 0) = PWM1 function is selected. (NUC123xxxAEx Only) + * | | |(1, 1) = SPI1_SS1 function is selected. + * |[5] |PC0_MFP1 |PC.0 Pin Alternate Function Selection + * | | |Bits PC0_MFP1 (ALT_MFP[5]) and GPC_MFP[0] determine the PC.0 function. + * | | |(PC0_MFP1 (ALT_MFP[5]), GPC_MFP[0]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI0_SS0 function is selected. + * | | |(1, 1) = I2S_LRCLK function is selected. + * |[6] |PC1_MFP1 |PC.1 Pin Alternate Function Selection + * | | |Bits PC1_MFP1 (ALT_MFP[6]) and GPC_MFP[1] determine the PC.1 function. + * | | |(PC1_MFP1 (ALT_MFP[6]), GPC_MFP[1]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI0_CLK function is selected. + * | | |(1, 1) = I2S_BCLK function is selected. + * |[7] |PC2_MFP1 |PC.2 Pin Alternate Function Selection + * | | |Bits PC2_MFP1 (ALT_MFP[7]) and GPC_MFP[2] determine the PC.2 function. + * | | |(PC2_MFP1 (ALT_MFP[7]), GPC_MFP[2]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI0_MISO0 function is selected. + * | | |(1, 1) = I2S_DI function is selected. + * |[8] |PC3_MFP1 |PC.3 Pin Alternate Function Selection + * | | |Bits PC3_MFP1 (ALT_MFP[8]) and GPC_MFP[3] determine the PC.3 function. + * | | |(PC3_MFP1 (ALT_MFP[8]), GPC_MFP[3]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI0_MOSI0 function is selected. + * | | |(1, 1) = I2S_DO function is selected. + * |[9] |PA15_MFP1 |PA.15 Pin Alternate Function Selection + * | | |Bits PA15_MFP1 (ALT_MFP[9]) and GPA_MFP[15] determine the PA.15 function. + * | | |(PA15_MFP1 (ALT_MFP[9]), GPA_MFP[15]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = PWM3 function is selected. + * | | |(1, 0) = CLKO function is selected. + * | | |(1, 1) = I2S_MCLK function is selected. + * |[10] |PB12_MFP1 |PB.12 Pin Alternate Function Selection + * | | |Bits PB12_MFP1 (ALT_MFP[10]) and GPB_MFP[12] determine the PB.12 function. + * | | |(PB12_MFP1 (ALT_MFP[10]), GPB_MFP[12]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI1_SS0 function is selected. + * | | |(1, 1) = CLKO function is selected. + * |[11] |PA11_MFP1 |PA.11 Pin Alternate Function Selection + * | | |Bits PA11_MFP1 (ALT_MFP[11]) and GPA_MFP[11] determine the PA.11 function. + * | | |(PA11_MFP1 (ALT_MFP[11]), GPA_MFP[11]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = I2C1_SCL function is selected. + * | | |(1, 0) = SPI1_CLK function is selected. + * | | |(1, 1) = SPI2_MOSI0 function is selected. + * |[12] |PA10_MFP1 |PA.10 Pin Alternate Function Selection + * | | |Bits PA10_MFP1 (ALT_MFP[12]) and GPA_MFP[10] determine the PA.10 function. + * | | |(PA10_MFP1 (ALT_MFP[12]), GPA_MFP[10]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = I2C1_SDA function is selected. + * | | |(1, 0) = SPI1_MISO0 function is selected. + * | | |(1, 1) = SPI2_MISO0 function is selected. + * |[15] |PB4_MFP1 |PB.4 Pin Alternate Function Selection + * | | |Bits PB4_MFP1 (ALT_MFP[15]) and GPB_MFP[4] determine the PB.4 function. + * | | |(PB4_MFP1 (ALT_MFP[15]), GPB_MFP[4]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = UART1_RXD function is selected. + * | | |(1, 0) = SPI2_SS0 function is selected. + * | | |(1, 1) = SPI1_SS1 function is selected. + * |[16] |PB7_MFP1 |PB.7 Pin Alternate Function Selection + * | | |Bits PB7_MFP1 (ALT_MFP[16]) and GPB_MFP[7] determine the PB.7 function. + * | | |(PB7_MFP1 (ALT_MFP[16]), GPB_MFP[7]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = UART1_nCTS function is selected. + * | | |(1, 1) = SPI2_MISO0 function is selected. + * |[17] |PB6_MFP1 |PB.6 Pin Alternate Function Selection + * | | |Bits PB6_MFP1 (ALT_MFP[17]) and GPB_MFP[6] determine the PB.6 function. + * | | |(PB6_MFP1 (ALT_MFP[17]), GPB_MFP[6]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = UART1_nRTS function is selected. + * | | |(1, 1) = SPI2_MOSI0 function is selected. + * |[18] |PB5_MFP1 |PB. 5 Pin Alternate Function Selection + * | | |Bits PB5_MFP1 (ALT_MFP[18]) and GPB_MFP[5] determine the PB.5 function. + * | | |(PB5_MFP1 (ALT_MFP[18]), GPB_MFP[5]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = UART1_TXD function is selected. + * | | |(1, 1) = SPI2_CLK function is selected. + * |[20] |PC12_MFP1 |PC.12 Pin Alternate Function Selection + * | | |Bits PC12_MFP1 (ALT_MFP[20]) and GPC_MFP[12] determine the PC.12 function. + * | | |(PC12_MFP1 (ALT_MFP[20]), GPC_MFP[12]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI1_MISO1 function is selected. + * | | |(1, 0) = I2S_MCLK function is selected. + * | | |(1, 1) = PWM2 function is selected. + * |[21] |PC13_MFP1 |PC.13 Pin Alternate Function Selection + * | | |Bits PC13_MFP1 (ALT_MFP[21]) and GPC_MFP[13] determine the PC.13 function. + * | | |(PC13_MFP1 (ALT_MFP[21]), GPC_MFP[13]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI1_MOSI1 function is selected. + * | | |(1, 0) = CLKO function is selected. + * | | |(1, 1) = PWM3 function is selected. + * |[24] |PB15_MFP1 |PB.15 Pin Alternate Function Selection + * | | |Bits PB15_MFP1 (ALT_MFP[24]) and GPB_MFP[15] determine the PB.15 function. + * | | |(PB15_MFP1 (ALT_MFP[24]), GPB_MFP[15]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = INT1 function is selected. + * | | |(1, 1) = TM0_EXT function is selected. + * |[26] |PB2_MFP1 |PB.2 Pin Alternate Function Selection + * | | |Bits PB2_MFP1 (ALT_MFP[26]) and GPB_MFP[2] determine the PB.2 function. + * | | |(PB2_MFP1 (ALT_MFP[26]), GPB_MFP[2]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = UART0_nRTS function is selected. + * | | |(1, 1) = TM2_EXT function is selected. + * |[27] |PB3_MFP1 |PB.3 Pin Alternate Function Selection + * | | |Bits PB3_MFP1 (ALT_MFP[27]) and GPB_MFP[3] determine the PB.3 function. + * | | |(PB3_MFP1 (ALT_MFP[27]), GPB_MFP[3]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = UART0_nCTS function is selected. + * | | |(1, 1) = TM3_EXT function is selected. + * |[29] |PC4_MFP1 |PC.4 Pin Alternate Function Selection + * | | |Bits PC4_MFP1 (ALT_MFP[29]) and GPC_MFP[4] determine the PC.4 function. + * | | |(PC4_MFP1 (ALT_MFP[29]), GPC_MFP[4]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI0_MISO1 function is selected. + * | | |(1, 1) = UART0_RXD function is selected. + * |[30] |PC5_MFP1 |PC.5 Pin Alternate Function Selection + * | | |Bits PC5_MFP1 (ALT_MFP[30]) and GPC_MFP[5] determine the PC.5 function. + * | | |(PC5_MFP1 (ALT_MFP[30]), GPC_MFP[5]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI0_MOSI1 function is selected. + * | | |(1, 1) = UART0_TXD function is selected. + * @var GCR_T::ALT_MFP1 + * Offset: 0x54 Alternative Multiple Function Pin Control Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[16] |PD0_MFP1 |PD.0 Pin Alternate Function Selection + * | | |Bits PD0_MFP1 (ALT_MFP1[16]) and GPD_MFP[0] determine the PD.0 function. + * | | |(PD0_MFP1 (ALT_MFP1[16]), GPD_MFP[0]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(1, 0) = SPI2_SS0 function is selected. + * | | |(1, 1) = ADC0 function is selected. + * |[17] |PD1_MFP1 |PD.1 Pin Alternate Function Selection + * | | |Bits PD1_MFP1 (ALT_MFP1[17]) and GPD_MFP[1] determine the PD.1 function. + * | | |(PD1_MFP1 (ALT_MFP1[17]), GPD_MFP[1]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI0_SS1 function is selected. + * | | |(1, 0) = SPI2_CLK function is selected. + * | | |(1, 1) = ADC1 function is selected. + * |[18] |PD2_MFP1 |PD.2 Pin Alternate Function Selection + * | | |Bits PD2_MFP1 (ALT_MFP1[18]) and GPD_MFP[2] determine the PD.2 function. + * | | |(PD2_MFP1 (ALT_MFP1[18]), GPD_MFP[2]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI0_MISO1 function is selected. + * | | |(1, 0) = SPI2_MISO0 function is selected. + * | | |(1, 1) = ADC2 function is selected. + * |[19] |PD3_MFP1 |PD.3 Pin Alternate Function Selection + * | | |Bits PD3_MFP1 (ALT_MFP1[19]) and GPD_MFP[3] determine the PD.3 function. + * | | |(PD3_MPF1 (ALT_MFP1[19]), GPD_MFP[3]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI0_MOSI1 function is selected. + * | | |(1, 0) = SPI2_MOSI0 function is selected. + * | | |(1, 1) = ADC3 function is selected. + * |[20] |PD4_MFP1 |PD.4 Pin Alternate Function Selection + * | | |Bits PD4_MFP1 (ALT_MFP1[20]) and GPD_MFP[4] determine the PD.4 function. + * | | |(PD4_MFP1 (ALT_MFP1[20]), GPD_MFP[4]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(1, 0) = SPI2_MISO1 function is selected. + * | | |(1, 1) = ADC4 function is selected. + * |[21] |PD5_MFP1 |PD.5 Pin Alternate Function Selection + * | | |Bits PD5_MFP1 (ALT_MFP1[21]) and GPD_MFP[5] determine the PD.5 function. + * | | |(PD5_MFP1 (ALT_MFP1[21]), GPD_MFP[5]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(1, 0) = SPI2_MOSI1 function is selected. + * | | |(1, 1) = ADC5 function is selected. + * |[23] |PC8_MFP1 |PC.8 Pin Alternate Function Selection + * | | |Bits PC8_MFP1 (ALT_MFP1[23]) and GPC_MFP[8] determine the PC.8 function. + * | | |(PC8_MFP1 (ALT_MFP1[23]), GPC_MFP[8]) value and function mapping are as following list. + * | | |(0, 0) = GPIO function is selected. + * | | |(0, 1) = SPI1_SS0 function is selected. + * | | |(1, 1) = PWM0 function is selected. (NUC123xxxAEx Only) + * |[25:24] |PF2_MFP1 |PF.2 Pin Alternate Function Selection + * | | |Bits PF2_MFP1 (ALT_MFP1[25:24]) and GPF_MFP[2] determine the PF.2 function. + * | | |(PF2_MFP1(ALT_MFP1 [25:24]), GPF_MFP[2]) value and function mapping are as following list. + * | | |(00, 0) = GPIO function is selected. + * | | |(00, 1) = PS2_DAT function is selected. + * | | |(10, 1) = I2C0_SDA function is selected. + * | | |(11, 1) = ADC6 function is selected. + * |[27:26] |PF3_MFP1 |PF.3 Pin Alternate Function Selection + * | | |Bits PF3_MFP1 (ALT_MFP1[27:26]) and GPF_MFP[3] determine the PF.3 function. + * | | |(PF3_MFP1 (ALT_MFP1[27:26]), GPF_MFP[3]) value and function mapping are as following list. + * | | |(00, 0) = GPIO function is selected. + * | | |(00, 1) = PS2_CLK function is selected. + * | | |(10, 1) = I2C0_SCL function is selected. + * | | |(11, 1) = ADC7 function is selected. + * @var GCR_T::GPA_IOCR + * Offset: 0xC0 GPIOA IO Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10] |GPA10_DS |PA.10 Pin Driving Strength Selection + * | | |0 = PA.10 strong driving strength mode Disabled. + * | | |1 = PA.10 strong driving strength mode Enabled. + * |[11] |GPA11_DS |PA.11 Pin Driving Strength Selection + * | | |0 = PA.11 strong driving strength mode Disabled. + * | | |1 = PA.11 strong driving strength mode Enabled. + * @var GCR_T::GPB_IOCR + * Offset: 0xC4 GPIOB IO Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4] |GPB4_DS |PB.4 Pin Driving Strength Selection + * | | |0 = PB.4 strong driving strength mode Disabled. + * | | |1 = PB.4 strong driving strength mode Enabled. + * |[5] |GPB5_DS |PB.5 Pin Driving Strength Selection + * | | |0 = PB.5 strong driving strength mode Disabled. + * | | |1 = PB.5 strong driving strength mode Enabled. + * |[6] |GPB6_DS |PB.6 Pin Driving Strength Selection + * | | |0 = PB.6 strong driving strength mode Disabled. + * | | |1 = PB.6 strong driving strength mode Enabled. + * |[7] |GPB7_DS |PB.7 Pin Driving Strength Selection + * | | |0 = PB.7 strong driving strength mode Disabled. + * | | |1 = PB.7 strong driving strength mode Enabled. + * |[8] |GPB8_DS |PB.8 Pin Driving Strength Selection + * | | |0 = PB.8 strong driving strength mode Disabled. + * | | |1 = PB.8 strong driving strength mode Enabled. + * |[12] |GPB12_DS |PB.12 Pin Driving Strength Selection + * | | |0 = PB.12 strong driving strength mode Disabled. + * | | |1 = PB.12 strong driving strength mode Enabled. + * |[13] |GPB13_DS |PB.13 Pin Driving Strength Selection + * | | |0 = PB.13 strong driving strength mode Disabled. + * | | |1 = PB.13 strong driving strength mode Enabled. + * |[14] |GPB14_DS |PB.14 Pin Driving Strength Selection + * | | |0 = PB.14 strong driving strength mode Disabled. + * | | |1 = PB.14 strong driving strength mode Enabled. + * @var GCR_T::GPD_IOCR + * Offset: 0xCC GPIOD IO Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[8] |GPD8_DS |PD.8 Pin Driving Strength Selection + * | | |0 = PD.8 strong driving strength mode Disabled. + * | | |1 = PD.8 strong driving strength mode Enabled. + * |[9] |GPD9_DS |PD.9 Pin Driving Strength Selection + * | | |0 = PD.9 strong driving strength mode Disabled. + * | | |1 = PD.9 strong driving strength mode Enabled. + * |[10] |GPD10_DS |PD.10 Pin Driving Strength Selection + * | | |0 = PD.10 strong driving strength mode Disabled. + * | | |1 = PD.10 strong driving strength mode Enabled. + * |[11] |GPD11_DS |PD.11 Pin Driving Strength Selection + * | | |0 = PD.11 strong driving strength mode Disabled. + * | | |1 = PD.11 strong driving strength mode Enabled. + * @var GCR_T::REGWRPROT + * Offset: 0x100 Register Write Protect register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |REGPROTDIS|Register Write-Protection Disable index (Read Only) + * | | |1 = Write-protection Disabled for writing protected registers. + * | | |0 = Write-protection Enabled for writing protected registers. + * | | |Any write to the protected register is ignored. + * | | |The Protected registers are: + * | | |IPRSTC1: address 0x5000_0008 + * | | |BODCR: address 0x5000_0018 + * | | |PORCR: address 0x5000_0024 + * | | |PWRCON: address 0x5000_0200 (bit[6] is not protected for power wake-up interrupt clear) + * | | |APBCLK bit[0]: address 0x5000_0208 (bit[0] is watchdog clock enabled) + * | | |CLKSEL0: address 0x5000_0210 (for HCLK and CPU STCLK clock source select) + * | | |CLKSEL1 bit[1:0]: address 0x5000_0214 (for watchdog clock source select) + * | | |ISPCON: address 0x5000_C000 (Flash ISP Control register) + * | | |WTCR: address 0x4000_4000 + * | | |FATCON: address 0x5000_C018 + * |[7:0] |REGWRPROT |Register Write-Protection Code (Write Only) + * | | |Some registers have write-protection function. Writing these registers has to disable the protected function by writing the sequence value "59h", "16h", "88h" to this field. + * | | |After this sequence is completed, the REGPROTDIS bit will be set to 1 and write-protection registers can be normal write. + * @var GCR_T::GPA_MFPH + * Offset: 0x134 GPIOA Multiple Function High Byte Control Register (NUC123xxxAEx Only) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:8] |GPA10_MFP |PA.10 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = I2C1_SDA function is selected. + * | | |010 = SPI1_MISO0 function is selected. + * | | |011 = SPI2_MISO0 function is selected. + * |[14:12] |GPA11_MFP |PA.11 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = I2C1_SCL function is selected. + * | | |010 = SPI1_CLK function is selected. + * | | |011 = SPI2_MOSI0 function is selected. + * |[18:16] |GPA12_MFP |PA.12 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = PWM0 function is selected. + * |[22:20] |GPA13_MFP |PA.13 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = PWM1 function is selected. + * |[26:24] |GPA14_MFP |PA.14 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = PWM2 function is selected. + * |[30:28] |GPA15_MFP |PA.15 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = PWM3 function is selected. + * | | |010 = CLKO function is selected. + * | | |011 = I2S_MCLK function is selected. + * @var GCR_T::GPB_MFPL + * Offset: 0x138 GPIOB Multiple Function Low Byte Control Register (NUC123xxxAEx Only) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |GPB0_MFP |PB.0 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = UART0_RXD function is selected. + * |[6:4] |GPB1_MFP |PB.1 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = UART0_TXD function is selected. + * |[10:8] |GPB2_MFP |PB.2 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = UART0_nRTS function is selected. + * | | |010 = TM2_EXT function is selected. + * |[14:12] |GPB3_MFP |PB.3 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = UART0_nCTS function is selected. + * | | |010 = TM3_EXT function is selected. + * |[18:16] |GPB4_MFP |PB.4 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = UART1_RXD function is selected. + * | | |010 = SPI2_SS0 function is selected. + * | | |010 = SPI1_SS1 function is selected. + * |[22:20] |GPB5_MFP |PB.5 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = UART1_TXD function is selected. + * | | |010 = SPI2_CLK function is selected. + * |[26:24] |GPB6_MFP |PB.6 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = UART1_nRTS function is selected. + * | | |010 = SPI2_MOSI0 function is selected. + * |[30:28] |GPB7_MFP |PB.7 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = UART1_nCTS function is selected. + * | | |010 = SPI2_MISO0 function is selected. + * @var GCR_T::GPB_MFPH + * Offset: 0x13C GPIOB Multiple Function High Byte Control Register (NUC123xxxAEx Only) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |GPB8_MFP |PB.8 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = TM0 function is selected. + * |[6:4] |GPB9_MFP |PB.9 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = TM1 function is selected. + * | | |010 = SPI1_SS1 function is selected. + * | | |011 = PWM1 function is selected. + * |[10:8] |GPB10_MFP |PB.10 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = TM2 function is selected. + * | | |010 = SPI0_SS1 function is selected. + * |[18:16] |GPB12_MFP |PB.12 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = SPI1_SS0 function is selected. + * | | |010 = CLKO function is selected. + * |[22:20] |GPB13_MFP |PB.13 Pin Function Selection + * | | |000 = GPIO function is selected. + * |[26:24] |GPB14_MFP |PB.14 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = INT0 function is selected. + * |[30:28] |GPB15_MFP |PB.15 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = INT1 function is selected. + * | | |010 = TM0_EXT function is selected. + * @var GCR_T::GPC_MFPL + * Offset: 0x140 GPIOC Multiple Function Low Byte Control Register (NUC123xxxAEx Only) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |GPC0_MFP |PC.0 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = SPI0_SS0 function is selected. + * | | |010 = I2S_LRCK function is selected. + * |[6:4] |GPC1_MFP |PC.1 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = SPI0_CLK function is selected. + * | | |001 = I2S_BCLK function is selected. + * |[10:8] |GPC2_MFP |PC.2 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = SPI0_MISO0 function is selected. + * | | |010 = I2S_DI function is selected. + * |[14:12] |GPC3_MFP |PC.3 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = SPI0_MIOSI0 function is selected. + * | | |010 = I2S_DO function is selected. + * |[18:16] |GPC4_MFP |PC.4 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = SPI0_MISO1 function is selected. + * | | |010 = UART0_RXD function is selected. + * |[22:20] |GPC5_MFP |PC.5 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = SPI0_MOSI1 function is selected. + * | | |010 = UART0_TXD function is selected. + * @var GCR_T::GPC_MFPH + * Offset: 0x144 GPIOC Multiple Function High Byte Control Register (NUC123xxxAEx Only) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |GPC8_MFP |PC.8 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = SPI1_SS0 function is selected. + * | | |010 = PWM0 function is selected. + * |[6:4] |GPC9_MFP |PC.9 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = SPI1_CLK function is selected. + * |[10:8] |GPC10_MFP |PC.10 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = SPI1_MISO0 function is selected. + * |[14:12] |GPC11_MFP |PC.11 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = SPI1_MOSI0 function is selected. + * |[18:16] |GPC12_MFP |PC.12 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = SPI1_MISO1 function is selected. + * | | |010 = I2S_MCLK function is selected. + * | | |011 = PWM2 function is selected. + * |[22:20] |GPC13_MFP |PC.13 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = SPI1_MOSI1 function is selected. + * | | |010 = CLKO function is selected. + * | | |011 = PWM3 function is selected. + * @var GCR_T::GPD_MFPL + * Offset: 0x148 GPIOD Multiple Function Low Byte Control Register (NUC123xxxAEx Only) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |GPD0_MFP |PD.0 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = SPI2_SS0 function is selected. + * | | |010 = ADC0 function is selected. + * |[6:4] |GPD1_MFP |PD.1 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = SPI0_SS1 function is selected. + * | | |010 = SPI2_CLK function is selected. + * | | |011 = ADC1 function is selected. + * |[10:8] |GPD2_MFP |PD.2 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = SPI0_MISO1 function is selected. + * | | |010 = SPI2_MISO0 function is selected. + * | | |010 = ADC2 function is selected. + * |[14:12] |GPD3_MFP |PD.3 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = SPI0_MOSI1 function is selected. + * | | |010 = SPI2_MOSI0 function is selected. + * | | |011 = ADC3 function is selected. + * |[18:16] |GPD4_MFP |PD.4 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = SPI2_MISO1 function is selected. + * | | |010 = ADC4 function is selected. + * |[22:20] |GPD5_MFP |PD.5 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = SPI2_MOSI1 function is selected. + * | | |010 = ADC5 function is selected. + * @var GCR_T::GPD_MFPH + * Offset: 0x14C GPIOD Multiple Function High Byte Control Register (NUC123xxxAEx Only) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |GPD8_MFP |PD.8 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = SPI1_MOSI0 function is selected. + * |[6:4] |GPD9_MFP |PD.9 Pin Function Selection + * | | |000 = GPIO function is selected. + * |[10:8] |GPD10_MFP |PD.10 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = CLKO function is selected. + * |[14:12] |GPD11_MFP |PD.11 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = INT1 function is selected. + * @var GCR_T::GPF_MFPL + * Offset: 0x158 GPIOF Multiple Function Low Byte Control Register (NUC123xxxAEx Only) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |GPF0_MFP |PF.0 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = XT1_OUT function is selected. + * |[6:4] |GPF1_MFP |PF.1 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = XT1_IN function is selected. + * |[10:8] |GPF2_MFP |PF.2 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = PS2_DAT function is selected. + * | | |010 = I2C0_SDA function is selected. + * | | |010 = ADC6 function is selected. + * |[14:12] |GPF3_MFP |PF.3 Pin Function Selection + * | | |000 = GPIO function is selected. + * | | |001 = PS2_CLK function is selected. + * | | |010 = I2C0_SCL function is selected. + * | | |011 = ADC7 function is selected. + */ + + __I uint32_t PDID; /* Offset: 0x00 Part Device Identification Number Register */ + __IO uint32_t RSTSRC; /* Offset: 0x04 System Reset Source Register */ + __IO uint32_t IPRSTC1; /* Offset: 0x08 Peripheral Reset Control Register 1 */ + __IO uint32_t IPRSTC2; /* Offset: 0x0C Peripheral Reset Control Register 2 */ + __I uint32_t RESERVE0[2]; + __IO uint32_t BODCR; /* Offset: 0x18 Brown-out Detector Control Register */ + __I uint32_t RESERVE1[2]; + __IO uint32_t PORCR; /* Offset: 0x24 Power-on-Reset Controller Register */ + __I uint32_t RESERVE2[2]; + __IO uint32_t GPA_MFP; /* Offset: 0x30 GPIOA Multiple Function and Input Type Control Register */ + __IO uint32_t GPB_MFP; /* Offset: 0x34 GPIOB Multiple Function and Input Type Control Register */ + __IO uint32_t GPC_MFP; /* Offset: 0x38 GPIOC Multiple Function and Input Type Control Register */ + __IO uint32_t GPD_MFP; /* Offset: 0x3C GPIOD Multiple Function and Input Type Control Register */ + __I uint32_t RESERVE3; + __IO uint32_t GPF_MFP; /* Offset: 0x44 GPIOF Multiple Function and Input Type Control Register */ + __I uint32_t RESERVE4[2]; + __IO uint32_t ALT_MFP; /* Offset: 0x50 Alternative Multiple Function Pin Control Register */ + __IO uint32_t ALT_MFP1; /* Offset: 0x54 Alternative Multiple Function Pin Control Register 1 */ + __I uint32_t RESERVE5[26]; + __IO uint32_t GPA_IOCR; /* Offset: 0xC0 GPIOA IO Control Register */ + __IO uint32_t GPB_IOCR; /* Offset: 0xC4 GPIOB IO Control Register */ + __I uint32_t RESERVE6; + __IO uint32_t GPD_IOCR; /* Offset: 0xCC GPIOD IO Control Register */ + __I uint32_t RESERVE7[12]; + __IO uint32_t REGWRPROT; /* Offset: 0x100 Register Write Protect register */ + __I uint32_t RESERVE8[12]; + __IO uint32_t GPA_MFPH; /* Offset: 0x134 GPIOA Multiple Function High Byte Control Register (NUC123xxxAEx Only) */ + __IO uint32_t GPB_MFPL; /* Offset: 0x138 GPIOB Multiple Function Low Byte Control Register (NUC123xxxAEx Only) */ + __IO uint32_t GPB_MFPH; /* Offset: 0x13C GPIOB Multiple Function High Byte Control Register (NUC123xxxAEx Only) */ + __IO uint32_t GPC_MFPL; /* Offset: 0x140 GPIOC Multiple Function Low Byte Control Register (NUC123xxxAEx Only) */ + __IO uint32_t GPC_MFPH; /* Offset: 0x144 GPIOC Multiple Function High Byte Control Register (NUC123xxxAEx Only) */ + __IO uint32_t GPD_MFPL; /* Offset: 0x148 GPIOD Multiple Function Low Byte Control Register (NUC123xxxAEx Only) */ + __IO uint32_t GPD_MFPH; /* Offset: 0x14C GPIOD Multiple Function High Byte Control Register (NUC123xxxAEx Only) */ + __I uint32_t RESERVE9[2]; + __IO uint32_t GPF_MFPL; /* Offset: 0x158 GPIOF Multiple Function Low Byte Control Register (NUC123xxxAEx Only) */ + +} GCR_T; + + + + +/** @addtogroup REG_SYS_BITMASK SYS Bit Mask + @{ + */ + +/* GCR RSTSRC Bit Field Definitions */ +#define SYS_RSTSRC_RSTS_CPU_Pos 7 /*!< GCR_T::RSTSRC: RSTS_CPU Position */ +#define SYS_RSTSRC_RSTS_CPU_Msk (1ul << SYS_RSTSRC_RSTS_CPU_Pos) /*!< GCR_T::RSTSRC: RSTS_CPU Mask */ + +#define SYS_RSTSRC_RSTS_SYS_Pos 5 /*!< GCR_T::RSTSRC: RSTS_SYS Position */ +#define SYS_RSTSRC_RSTS_SYS_Msk (1ul << SYS_RSTSRC_RSTS_SYS_Pos) /*!< GCR_T::RSTSRC: RSTS_SYS Mask */ + +#define SYS_RSTSRC_RSTS_BOD_Pos 4 /*!< GCR_T::RSTSRC: RSTS_BOD Position */ +#define SYS_RSTSRC_RSTS_BOD_Msk (1ul << SYS_RSTSRC_RSTS_BOD_Pos) /*!< GCR_T::RSTSRC: RSTS_BOD Mask */ + +#define SYS_RSTSRC_RSTS_LVR_Pos 3 /*!< GCR_T::RSTSRC: RSTS_LVR Position */ +#define SYS_RSTSRC_RSTS_LVR_Msk (1ul << SYS_RSTSRC_RSTS_LVR_Pos) /*!< GCR_T::RSTSRC: RSTS_LVR Mask */ + +#define SYS_RSTSRC_RSTS_WDT_Pos 2 /*!< GCR_T::RSTSRC: RSTS_WDT Position */ +#define SYS_RSTSRC_RSTS_WDT_Msk (1ul << SYS_RSTSRC_RSTS_WDT_Pos) /*!< GCR_T::RSTSRC: RSTS_WDT Mask */ + +#define SYS_RSTSRC_RSTS_RESET_Pos 1 /*!< GCR_T::RSTSRC: RSTS_RESET Position */ +#define SYS_RSTSRC_RSTS_RESET_Msk (1ul << SYS_RSTSRC_RSTS_RESET_Pos) /*!< GCR_T::RSTSRC: RSTS_RESET Mask */ + +#define SYS_RSTSRC_RSTS_POR_Pos 0 /*!< GCR_T::RSTSRC: RSTS_POR Position */ +#define SYS_RSTSRC_RSTS_POR_Msk (1ul << SYS_RSTSRC_RSTS_POR_Pos) /*!< GCR_T::RSTSRC: RSTS_POR Mask */ + +/* GCR IPRSTC1 Bit Field Definitions */ +#define SYS_IPRSTC1_PDMA_RST_Pos 2 /*!< GCR_T::IPRSTC1: PDMA_RST Position */ +#define SYS_IPRSTC1_PDMA_RST_Msk (1ul << SYS_IPRSTC1_PDMA_RST_Pos) /*!< GCR_T::IPRSTC1: PDMA_RST Mask */ + +#define SYS_IPRSTC1_CPU_RST_Pos 1 /*!< GCR_T::IPRSTC1: CPU_RST Position */ +#define SYS_IPRSTC1_CPU_RST_Msk (1ul << SYS_IPRSTC1_CPU_RST_Pos) /*!< GCR_T::IPRSTC1: CPU_RST Mask */ + +#define SYS_IPRSTC1_CHIP_RST_Pos 0 /*!< GCR_T::IPRSTC1: CHIP_RST Position */ +#define SYS_IPRSTC1_CHIP_RST_Msk (1ul << SYS_IPRSTC1_CHIP_RST_Pos) /*!< GCR_T::IPRSTC1: CHIP_RST Mask */ + +/* GCR IPRSTC2 Bit Field Definitions */ +#define SYS_IPRSTC2_I2S_RST_Pos 29 /*!< GCR_T::IPRSTC2: I2S_RST Position */ +#define SYS_IPRSTC2_I2S_RST_Msk (1ul << SYS_IPRSTC2_I2S_RST_Pos) /*!< GCR_T::IPRSTC2: I2S_RST Mask */ + +#define SYS_IPRSTC2_ADC_RST_Pos 28 /*!< GCR_T::IPRSTC2: ADC_RST Position */ +#define SYS_IPRSTC2_ADC_RST_Msk (1ul << SYS_IPRSTC2_ADC_RST_Pos) /*!< GCR_T::IPRSTC2: ADC_RST Mask */ + +#define SYS_IPRSTC2_USBD_RST_Pos 27 /*!< GCR_T::IPRSTC2: USBD_RST Position */ +#define SYS_IPRSTC2_USBD_RST_Msk (1ul << SYS_IPRSTC2_USBD_RST_Pos) /*!< GCR_T::IPRSTC2: USBD_RST Mask */ + +#define SYS_IPRSTC2_PS2_RST_Pos 23 /*!< GCR_T::IPRSTC2: PS2_RST Position */ +#define SYS_IPRSTC2_PS2_RST_Msk (1ul << SYS_IPRSTC2_PS2_RST_Pos) /*!< GCR_T::IPRSTC2: PS2_RST Mask */ + +#define SYS_IPRSTC2_PWM03_RST_Pos 20 /*!< GCR_T::IPRSTC2: PWM03_RST Position */ +#define SYS_IPRSTC2_PWM03_RST_Msk (1ul << SYS_IPRSTC2_PWM03_RST_Pos) /*!< GCR_T::IPRSTC2: PWM03_RST Mask */ + +#define SYS_IPRSTC2_UART1_RST_Pos 17 /*!< GCR_T::IPRSTC2: UART1_RST Position */ +#define SYS_IPRSTC2_UART1_RST_Msk (1ul << SYS_IPRSTC2_UART1_RST_Pos) /*!< GCR_T::IPRSTC2: UART1_RST Mask */ + +#define SYS_IPRSTC2_UART0_RST_Pos 16 /*!< GCR_T::IPRSTC2: UART0_RST Position */ +#define SYS_IPRSTC2_UART0_RST_Msk (1ul << SYS_IPRSTC2_UART0_RST_Pos) /*!< GCR_T::IPRSTC2: UART0_RST Mask */ + +#define SYS_IPRSTC2_SPI2_RST_Pos 14 /*!< GCR_T::IPRSTC2: SPI2_RST Position */ +#define SYS_IPRSTC2_SPI2_RST_Msk (1ul << SYS_IPRSTC2_SPI2_RST_Pos) /*!< GCR_T::IPRSTC2: SPI2_RST Mask */ + +#define SYS_IPRSTC2_SPI1_RST_Pos 13 /*!< GCR_T::IPRSTC2: SPI1_RST Position */ +#define SYS_IPRSTC2_SPI1_RST_Msk (1ul << SYS_IPRSTC2_SPI1_RST_Pos) /*!< GCR_T::IPRSTC2: SPI1_RST Mask */ + +#define SYS_IPRSTC2_SPI0_RST_Pos 12 /*!< GCR_T::IPRSTC2: SPI0_RST Position */ +#define SYS_IPRSTC2_SPI0_RST_Msk (1ul << SYS_IPRSTC2_SPI0_RST_Pos) /*!< GCR_T::IPRSTC2: SPI0_RST Mask */ + +#define SYS_IPRSTC2_I2C1_RST_Pos 9 /*!< GCR_T::IPRSTC2: I2C1_RST Position */ +#define SYS_IPRSTC2_I2C1_RST_Msk (1ul << SYS_IPRSTC2_I2C1_RST_Pos) /*!< GCR_T::IPRSTC2: I2C1_RST Mask */ + +#define SYS_IPRSTC2_I2C0_RST_Pos 8 /*!< GCR_T::IPRSTC2: I2C0_RST Position */ +#define SYS_IPRSTC2_I2C0_RST_Msk (1ul << SYS_IPRSTC2_I2C0_RST_Pos) /*!< GCR_T::IPRSTC2: I2C0_RST Mask */ + +#define SYS_IPRSTC2_TMR3_RST_Pos 5 /*!< GCR_T::IPRSTC2: TMR3_RST Position */ +#define SYS_IPRSTC2_TMR3_RST_Msk (1ul << SYS_IPRSTC2_TMR3_RST_Pos) /*!< GCR_T::IPRSTC2: TMR3_RST Mask */ + +#define SYS_IPRSTC2_TMR2_RST_Pos 4 /*!< GCR_T::IPRSTC2: TMR2_RST Position */ +#define SYS_IPRSTC2_TMR2_RST_Msk (1ul << SYS_IPRSTC2_TMR2_RST_Pos) /*!< GCR_T::IPRSTC2: TMR2_RST Mask */ + +#define SYS_IPRSTC2_TMR1_RST_Pos 3 /*!< GCR_T::IPRSTC2: TMR1_RST Position */ +#define SYS_IPRSTC2_TMR1_RST_Msk (1ul << SYS_IPRSTC2_TMR1_RST_Pos) /*!< GCR_T::IPRSTC2: TMR1_RST Mask */ + +#define SYS_IPRSTC2_TMR0_RST_Pos 2 /*!< GCR_T::IPRSTC2: TMR0_RST Position */ +#define SYS_IPRSTC2_TMR0_RST_Msk (1ul << SYS_IPRSTC2_TMR0_RST_Pos) /*!< GCR_T::IPRSTC2: TMR0_RST Mask */ + +#define SYS_IPRSTC2_GPIO_RST_Pos 1 /*!< GCR_T::IPRSTC2: GPIO_RST Position */ +#define SYS_IPRSTC2_GPIO_RST_Msk (1ul << SYS_IPRSTC2_GPIO_RST_Pos) /*!< GCR_T::IPRSTC2: GPIO_RST Mask */ + +/* GCR BODCR Bit Field Definitions */ +#define SYS_BODCR_LVR_EN_Pos 7 /*!< GCR_T::BODCR: LVR_EN Position */ +#define SYS_BODCR_LVR_EN_Msk (1ul << SYS_BODCR_LVR_EN_Pos) /*!< GCR_T::BODCR: LVR_EN Mask */ + +#define SYS_BODCR_BOD_OUT_Pos 6 /*!< GCR_T::BODCR: BOD_OUT Position */ +#define SYS_BODCR_BOD_OUT_Msk (1ul << SYS_BODCR_BOD_OUT_Pos) /*!< GCR_T::BODCR: BOD_OUT Mask */ + +#define SYS_BODCR_BOD_LPM_Pos 5 /*!< GCR_T::BODCR: BOD_LPM Position */ +#define SYS_BODCR_BOD_LPM_Msk (1ul << SYS_BODCR_BOD_LPM_Pos) /*!< GCR_T::BODCR: BOD_LPM Mask */ + +#define SYS_BODCR_BOD_INTF_Pos 4 /*!< GCR_T::BODCR: BOD_INTF Position */ +#define SYS_BODCR_BOD_INTF_Msk (1ul << SYS_BODCR_BOD_INTF_Pos) /*!< GCR_T::BODCR: BOD_INTF Mask */ + +#define SYS_BODCR_BOD_RSTEN_Pos 3 /*!< GCR_T::BODCR: BOD_RSTEN Position */ +#define SYS_BODCR_BOD_RSTEN_Msk (1ul << SYS_BODCR_BOD_RSTEN_Pos) /*!< GCR_T::BODCR: BOD_RSTEN Mask */ + +#define SYS_BODCR_BOD_VL_Pos 1 /*!< GCR_T::BODCR: BOD_VL Position */ +#define SYS_BODCR_BOD_VL_Msk (3ul << SYS_BODCR_BOD_VL_Pos) /*!< GCR_T::BODCR: BOD_VL Mask */ + +#define SYS_BODCR_BOD_EN_Pos 0 /*!< GCR_T::BODCR: BOD_EN Position */ +#define SYS_BODCR_BOD_EN_Msk (1ul << SYS_BODCR_BOD_EN_Pos) /*!< GCR_T::BODCR: BOD_EN Mask */ + +/* GCR PORCR Bit Field Definitions */ +#define SYS_PORCR_POR_DIS_CODE_Pos 0 /*!< GCR_T::PORCR: POR_DIS_CODE Position */ +#define SYS_PORCR_POR_DIS_CODE_Msk (0xFFFFul << SYS_PORCR_POR_DIS_CODE_Pos) /*!< GCR_T::PORCR: POR_DIS_CODE Mask */ + +/* GCR GPAMFP Bit Field Definitions */ +#define SYS_GPA_MFP_GPA_TYPE_Pos 16 /*!< GCR_T::GPA_MFP: GPA_TYPE Position */ +#define SYS_GPA_MFP_GPA_TYPE_Msk (0xFFFFul << SYS_GPA_MFP_GPA_TYPE_Pos) /*!< GCR_T::GPA_MFP: GPA_TYPE Mask */ + +#define SYS_GPA_MFP_GPA_MFP_Pos 0 /*!< GCR_T::GPA_MFP: GPA_MFP Position */ +#define SYS_GPA_MFP_GPA_MFP_Msk (0xFFFFul << SYS_GPA_MFP_GPA_MFP_Pos) /*!< GCR_T::GPA_MFP: GPA_MFP Mask */ + + +/* GCR GPBMFP Bit Field Definitions */ +#define SYS_GPB_MFP_GPB_TYPE_Pos 16 /*!< GCR_T::GPB_MFP: GPB_TYPE Position */ +#define SYS_GPB_MFP_GPB_TYPE_Msk (0xFFFFul << SYS_GPB_MFP_GPB_TYPE_Pos) /*!< GCR_T::GPB_MFP: GPB_TYPE Mask */ + +#define SYS_GPB_MFP_GPB_MFP_Pos 0 /*!< GCR_T::GPB_MFP: GPB_MFP Position */ +#define SYS_GPB_MFP_GPB_MFP_Msk (0xFFFFul << SYS_GPB_MFP_GPB_MFP_Pos) /*!< GCR_T::GPB_MFP: GPB_MFP Mask */ + +/* GCR GPCMFP Bit Field Definitions */ +#define SYS_GPC_MFP_GPC_TYPE_Pos 16 /*!< GCR_T::GPC_MFP: GPC_TYPE Position */ +#define SYS_GPC_MFP_GPC_TYPE_Msk (0xFFFFul << SYS_GPC_MFP_GPC_TYPE_Pos) /*!< GCR_T::GPC_MFP: GPC_TYPE Mask */ + +#define SYS_GPC_MFP_GPC_MFP_Pos 0 /*!< GCR_T::GPC_MFP: GPC_MFP Position */ +#define SYS_GPC_MFP_GPC_MFP_Msk (0xFFFFul << SYS_GPC_MFP_GPC_MFP_Pos) /*!< GCR_T::GPC_MFP: GPC_MFP Mask */ + +/* GCR GPDMFP Bit Field Definitions */ +#define SYS_GPD_MFP_GPD_TYPE_Pos 16 /*!< GCR_T::GPD_MFP: GPD_TYPE Position */ +#define SYS_GPD_MFP_GPD_TYPE_Msk (0xFFFFul << SYS_GPD_MFP_GPD_TYPE_Pos) /*!< GCR_T::GPD_MFP: GPD_TYPE Mask */ + +#define SYS_GPD_MFP_GPD_MFP_Pos 0 /*!< GCR_T::GPD_MFP: GPD_MFP Position */ +#define SYS_GPD_MFP_GPD_MFP_Msk (0xFFFFul << SYS_GPD_MFP_GPD_MFP_Pos) /*!< GCR_T::GPD_MFP: GPD_MFP Mask */ + +/* GCR GPFMFP Bit Field Definitions */ +#define SYS_GPF_MFP_GPF_TYPE_Pos 16 /*!< GCR_T::GPF_MFP: GPF_TYPE Position */ +#define SYS_GPF_MFP_GPF_TYPE_Msk (0xFul << SYS_GPF_MFP_GPF_TYPE_Pos) /*!< GCR_T::GPF_MFP: GPF_TYPE Mask */ + +#define SYS_GPF_MFP_GPF_MFP3_Pos 3 /*!< GCR_T::GPF_MFP: GPF_MFP3 Position */ +#define SYS_GPF_MFP_GPF_MFP3_Msk (1ul << SYS_GPF_MFP_GPF_MFP3_Pos) /*!< GCR_T::GPF_MFP: GPF_MFP3 Mask */ + +#define SYS_GPF_MFP_GPF_MFP2_Pos 2 /*!< GCR_T::GPF_MFP: GPF_MFP2 Position */ +#define SYS_GPF_MFP_GPF_MFP2_Msk (1ul << SYS_GPF_MFP_GPF_MFP2_Pos) /*!< GCR_T::GPF_MFP: GPF_MFP2 Mask */ + +#define SYS_GPF_MFP_GPF_MFP1_Pos 1 /*!< GCR_T::GPF_MFP: GPF_MFP1 Position */ +#define SYS_GPF_MFP_GPF_MFP1_Msk (1ul << SYS_GPF_MFP_GPF_MFP1_Pos) /*!< GCR_T::GPF_MFP: GPF_MFP1 Mask */ + +#define SYS_GPF_MFP_GPF_MFP0_Pos 0 /*!< GCR_T::GPF_MFP: GPF_MFP0 Position */ +#define SYS_GPF_MFP_GPF_MFP0_Msk (1ul << SYS_GPF_MFP_GPF_MFP0_Pos) /*!< GCR_T::GPF_MFP: GPF_MFP0 Mask */ + +/* GCR ALTMFP Bit Field Definitions */ +#define SYS_ALT_MFP_PC5_MFP1_Pos 30 /*!< GCR_T::ALT_MFP: PC5_MFP1 Position */ +#define SYS_ALT_MFP_PC5_MFP1_Msk (1ul << SYS_ALT_MFP_PC5_MFP1_Pos) /*!< GCR_T::ALT_MFP: PC5_MFP1 Mask */ + +#define SYS_ALT_MFP_PC4_MFP1_Pos 29 /*!< GCR_T::ALT_MFP: PC4_MFP1 Position */ +#define SYS_ALT_MFP_PC4_MFP1_Msk (1ul << SYS_ALT_MFP_PC4_MFP1_Pos) /*!< GCR_T::ALT_MFP: PC4_MFP1 Mask */ + +#define SYS_ALT_MFP_PB3_MFP1_Pos 27 /*!< GCR_T::ALT_MFP: PB3_MFP1 Position */ +#define SYS_ALT_MFP_PB3_MFP1_Msk (1ul << SYS_ALT_MFP_PB3_MFP1_Pos) /*!< GCR_T::ALT_MFP: PB3_MFP1 Mask */ + +#define SYS_ALT_MFP_PB2_MFP1_Pos 26 /*!< GCR_T::ALT_MFP: PB2_MFP1 Position */ +#define SYS_ALT_MFP_PB2_MFP1_Msk (1ul << SYS_ALT_MFP_PB2_MFP1_Pos) /*!< GCR_T::ALT_MFP: PB2_MFP1 Mask */ + +#define SYS_ALT_MFP_PB15_MFP1_Pos 24 /*!< GCR_T::ALT_MFP: PB15_MFP1 Position */ +#define SYS_ALT_MFP_PB15_MFP1_Msk (1ul << SYS_ALT_MFP_PB15_MFP1_Pos) /*!< GCR_T::ALT_MFP: PB15_MFP1 Mask */ + +#define SYS_ALT_MFP_PC13_MFP1_Pos 21 /*!< GCR_T::ALT_MFP: PC13_MFP1 Position */ +#define SYS_ALT_MFP_PC13_MFP1_Msk (1ul << SYS_ALT_MFP_PC13_MFP1_Pos) /*!< GCR_T::ALT_MFP: PC13_MFP1 Mask */ + +#define SYS_ALT_MFP_PC12_MFP1_Pos 20 /*!< GCR_T::ALT_MFP: PC12_MFP1 Position */ +#define SYS_ALT_MFP_PC12_MFP1_Msk (1ul << SYS_ALT_MFP_PC12_MFP1_Pos) /*!< GCR_T::ALT_MFP: PC12_MFP1 Mask */ + +#define SYS_ALT_MFP_PB5_MFP1_Pos 18 /*!< GCR_T::ALT_MFP: PB5_MFP1 Position */ +#define SYS_ALT_MFP_PB5_MFP1_Msk (1ul << SYS_ALT_MFP_PB5_MFP1_Pos) /*!< GCR_T::ALT_MFP: PB5_MFP1 Mask */ + +#define SYS_ALT_MFP_PB6_MFP1_Pos 17 /*!< GCR_T::ALT_MFP: PB6_MFP1 Position */ +#define SYS_ALT_MFP_PB6_MFP1_Msk (1ul << SYS_ALT_MFP_PB6_MFP1_Pos) /*!< GCR_T::ALT_MFP: PB6_MFP1 Mask */ + +#define SYS_ALT_MFP_PB7_MFP1_Pos 16 /*!< GCR_T::ALT_MFP: PB7_MFP1 Position */ +#define SYS_ALT_MFP_PB7_MFP1_Msk (1ul << SYS_ALT_MFP_PB7_MFP1_Pos) /*!< GCR_T::ALT_MFP: PB7_MFP1 Mask */ + +#define SYS_ALT_MFP_PB4_MFP1_Pos 15 /*!< GCR_T::ALT_MFP: PB4_MFP1 Position */ +#define SYS_ALT_MFP_PB4_MFP1_Msk (1ul << SYS_ALT_MFP_PB4_MFP1_Pos) /*!< GCR_T::ALT_MFP: PB4_MFP1 Mask */ + +#define SYS_ALT_MFP_PA10_MFP1_Pos 12 /*!< GCR_T::ALT_MFP: PA10_MFP1 Position */ +#define SYS_ALT_MFP_PA10_MFP1_Msk (1ul << SYS_ALT_MFP_PA10_MFP1_Pos) /*!< GCR_T::ALT_MFP: PA10_MFP1 Mask */ + +#define SYS_ALT_MFP_PA11_MFP1_Pos 11 /*!< GCR_T::ALT_MFP: PA11_MFP1 Position */ +#define SYS_ALT_MFP_PA11_MFP1_Msk (1ul << SYS_ALT_MFP_PA11_MFP1_Pos) /*!< GCR_T::ALT_MFP: PA11_MFP1 Mask */ + +#define SYS_ALT_MFP_PB12_MFP1_Pos 10 /*!< GCR_T::ALT_MFP: PB12_MFP1 Position */ +#define SYS_ALT_MFP_PB12_MFP1_Msk (1ul << SYS_ALT_MFP_PB12_MFP1_Pos) /*!< GCR_T::ALT_MFP: PB12_MFP1 Mask */ + +#define SYS_ALT_MFP_PA15_MFP1_Pos 9 /*!< GCR_T::ALT_MFP: A15_MFP1 Position */ +#define SYS_ALT_MFP_PA15_MFP1_Msk (1ul << SYS_ALT_MFP_PA15_MFP1_Pos) /*!< GCR_T::ALT_MFP: A15_MFP1 Mask */ + +#define SYS_ALT_MFP_PC3_MFP1_Pos 8 /*!< GCR_T::ALT_MFP: PC3_MFP1 Position */ +#define SYS_ALT_MFP_PC3_MFP1_Msk (1ul << SYS_ALT_MFP_PC3_MFP1_Pos) /*!< GCR_T::ALT_MFP: PC3_MFP1 Mask */ + +#define SYS_ALT_MFP_PC2_MFP1_Pos 7 /*!< GCR_T::ALT_MFP: PC2_MFP1 Position */ +#define SYS_ALT_MFP_PC2_MFP1_Msk (1ul << SYS_ALT_MFP_PC2_MFP1_Pos) /*!< GCR_T::ALT_MFP: PC2_MFP1 Mask */ + +#define SYS_ALT_MFP_PC1_MFP1_Pos 6 /*!< GCR_T::ALT_MFP: PC1_MFP1 Position */ +#define SYS_ALT_MFP_PC1_MFP1_Msk (1ul << SYS_ALT_MFP_PC1_MFP1_Pos) /*!< GCR_T::ALT_MFP: PC1_MFP1 Mask */ + +#define SYS_ALT_MFP_PC0_MFP1_Pos 5 /*!< GCR_T::ALT_MFP: PC0_MFP1 Position */ +#define SYS_ALT_MFP_PC0_MFP1_Msk (1ul << SYS_ALT_MFP_PC0_MFP1_Pos) /*!< GCR_T::ALT_MFP: PB0_MFP1 Mask */ + +#define SYS_ALT_MFP_PB9_MFP1_Pos 1 /*!< GCR_T::ALT_MFP: PB9_MFP1 Position */ +#define SYS_ALT_MFP_PB9_MFP1_Msk (1ul << SYS_ALT_MFP_PB9_MFP1_Pos) /*!< GCR_T::ALT_MFP: PB9_MFP1 Mask */ + +#define SYS_ALT_MFP_PB10_MFP1_Pos 0 /*!< GCR_T::ALT_MFP: PB10_MFP1 Position */ +#define SYS_ALT_MFP_PB10_MFP1_Msk (1ul << SYS_ALT_MFP_PB10_MFP1_Pos) /*!< GCR_T::ALT_MFP: PB10_MFP1 Mask */ + +/* GCR ALTMFP1 Bit Field Definitions */ +#define SYS_ALT_MFP1_PF3_MFP1_Pos 26 /*!< GCR_T::ALT_MFP1: PF3_MFP1 Position */ +#define SYS_ALT_MFP1_PF3_MFP1_Msk (0x3ul << SYS_ALT_MFP1_PF3_MFP1_Pos) /*!< GCR_T::ALT_MFP1: PF3_MFP1 Mask */ + +#define SYS_ALT_MFP1_PF2_MFP1_Pos 24 /*!< GCR_T::ALT_MFP1: PF2_MFP1 Position */ +#define SYS_ALT_MFP1_PF2_MFP1_Msk (0x3ul << SYS_ALT_MFP1_PF2_MFP1_Pos) /*!< GCR_T::ALT_MFP1: PF2_MFP1 Mask */ + +#define SYS_ALT_MFP1_PC8_MFP1_Pos 23 /*!< GCR_T::ALT_MFP1: PC8_MFP1 Position */ +#define SYS_ALT_MFP1_PC8_MFP1_Msk (1ul << SYS_ALT_MFP1_PC8_MFP1_Pos) /*!< GCR_T::ALT_MFP1: PC8_MFP1 Mask */ + +#define SYS_ALT_MFP1_PD5_MFP1_Pos 21 /*!< GCR_T::ALT_MFP1: PD5_MFP1 Position */ +#define SYS_ALT_MFP1_PD5_MFP1_Msk (1ul << SYS_ALT_MFP1_PD5_MFP1_Pos) /*!< GCR_T::ALT_MFP1: PD5_MFP1 Mask */ + +#define SYS_ALT_MFP1_PD4_MFP1_Pos 20 /*!< GCR_T::ALT_MFP1: PD4_MFP1 Position */ +#define SYS_ALT_MFP1_PD4_MFP1_Msk (1ul << SYS_ALT_MFP1_PD4_MFP1_Pos) /*!< GCR_T::ALT_MFP1: PD4_MFP1 Mask */ + +#define SYS_ALT_MFP1_PD3_MFP1_Pos 19 /*!< GCR_T::ALT_MFP1: PD3_MFP1 Position */ +#define SYS_ALT_MFP1_PD3_MFP1_Msk (1ul << SYS_ALT_MFP1_PD3_MFP1_Pos) /*!< GCR_T::ALT_MFP1: PD3_MFP1 Mask */ + +#define SYS_ALT_MFP1_PD2_MFP1_Pos 18 /*!< GCR_T::ALT_MFP1: PD2_MFP1 Position */ +#define SYS_ALT_MFP1_PD2_MFP1_Msk (1ul << SYS_ALT_MFP1_PD2_MFP1_Pos) /*!< GCR_T::ALT_MFP1: PD2_MFP1 Mask */ + +#define SYS_ALT_MFP1_PD1_MFP1_Pos 17 /*!< GCR_T::ALT_MFP1: PD1_MFP1 Position */ +#define SYS_ALT_MFP1_PD1_MFP1_Msk (1ul << SYS_ALT_MFP1_PD1_MFP1_Pos) /*!< GCR_T::ALT_MFP1: PD1_MFP1 Mask */ + +#define SYS_ALT_MFP1_PD0_MFP1_Pos 16 /*!< GCR_T::ALT_MFP1: PD0_MFP1 Position */ +#define SYS_ALT_MFP1_PD0_MFP1_Msk (1ul << SYS_ALT_MFP1_PD0_MFP1_Pos) /*!< GCR_T::ALT_MFP1: PD0_MFP1 Mask */ + +/* GCR GPA_IOCR Bit Field Definitions */ +#define SYS_GPA_IOCR_GPA11_DS_Pos 11 /*!< GCR_T::GPA_IOCR: GPA11_DS Position */ +#define SYS_GPA_IOCR_GPA11_DS_Msk (0x3ul << SYS_GPA_IOCR_GPA11_DS_Pos) /*!< GCR_T::GPA_IOCR: GPA11_DS Mask */ + +#define SYS_GPA_IOCR_GPA10_DS_Pos 10 /*!< GCR_T::GPA_IOCR: GPA10_DS Position */ +#define SYS_GPA_IOCR_GPA10_DS_Msk (0x3ul << SYS_GPA_IOCR_GPA10_DS_Pos) /*!< GCR_T::GPA_IOCR: GPA10_DS Mask */ + +/* GCR GPB_IOCR Bit Field Definitions */ +#define SYS_GPB_IOCR_GPB14_DS_Pos 14 /*!< GCR_T::GPB_IOCR: GPB14_DS Position */ +#define SYS_GPB_IOCR_GPB14_DS_Msk (0x3ul << SYS_GPB_IOCR_GPB14_DS_Pos) /*!< GCR_T::GPB_IOCR: GPB14_DS Mask */ + +#define SYS_GPB_IOCR_GPB13_DS_Pos 13 /*!< GCR_T::GPB_IOCR: GPB13_DS Position */ +#define SYS_GPB_IOCR_GPB13_DS_Msk (0x3ul << SYS_GPB_IOCR_GPB13_DS_Pos) /*!< GCR_T::GPB_IOCR: GPB13_DS Mask */ + +#define SYS_GPB_IOCR_GPB12_DS_Pos 12 /*!< GCR_T::GPB_IOCR: GPB12_DS Position */ +#define SYS_GPB_IOCR_GPB12_DS_Msk (0x3ul << SYS_GPB_IOCR_GPB12_DS_Pos) /*!< GCR_T::GPB_IOCR: GPB12_DS Mask */ + +#define SYS_GPB_IOCR_GPB8_DS_Pos 8 /*!< GCR_T::GPB_IOCR: GPB8_DS Position */ +#define SYS_GPB_IOCR_GPB8_DS_Msk (0x3ul << SYS_GPB_IOCR_GPB8_DS_Pos) /*!< GCR_T::GPB_IOCR: GPB8_DS Mask */ + +#define SYS_GPB_IOCR_GPB7_DS_Pos 7 /*!< GCR_T::GPB_IOCR: GPB7_DS Position */ +#define SYS_GPB_IOCR_GPB7_DS_Msk (0x3ul << SYS_GPB_IOCR_GPB7_DS_Pos) /*!< GCR_T::GPB_IOCR: GPB7_DS Mask */ + +#define SYS_GPB_IOCR_GPB6_DS_Pos 6 /*!< GCR_T::GPB_IOCR: GPB6_DS Position */ +#define SYS_GPB_IOCR_GPB6_DS_Msk (0x3ul << SYS_GPB_IOCR_GPB6_DS_Pos) /*!< GCR_T::GPB_IOCR: GPB6_DS Mask */ + +#define SYS_GPB_IOCR_GPB5_DS_Pos 5 /*!< GCR_T::GPB_IOCR: GPB5_DS Position */ +#define SYS_GPB_IOCR_GPB5_DS_Msk (0x3ul << SYS_GPB_IOCR_GPB5_DS_Pos) /*!< GCR_T::GPB_IOCR: GPB5_DS Mask */ + +#define SYS_GPB_IOCR_GPB4_DS_Pos 4 /*!< GCR_T::GPB_IOCR: GPB4_DS Position */ +#define SYS_GPB_IOCR_GPB4_DS_Msk (0x3ul << SYS_GPB_IOCR_GPB4_DS_Pos) /*!< GCR_T::GPB_IOCR: GPB4_DS Mask */ + +/* GCR GPD_IOCR Bit Field Definitions */ +#define SYS_GPD_IOCR_GPD11_DS_Pos 11 /*!< GCR_T::GPD_IOCR: GPD11_DS Position */ +#define SYS_GPD_IOCR_GPD11_DS_Msk (0x3ul << SYS_GPD_IOCR_GPD11_DS_Pos) /*!< GCR_T::GPD_IOCR: GPD11_DS Mask */ + +#define SYS_GPD_IOCR_GPD10_DS_Pos 10 /*!< GCR_T::GPD_IOCR: GPD10_DS Position */ +#define SYS_GPD_IOCR_GPD10_DS_Msk (0x3ul << SYS_GPD_IOCR_GPD10_DS_Pos) /*!< GCR_T::GPD_IOCR: GPD10_DS Mask */ + +#define SYS_GPD_IOCR_GPD9_DS_Pos 9 /*!< GCR_T::GPD_IOCR: GPD9_DS Position */ +#define SYS_GPD_IOCR_GPD9_DS_Msk (0x3ul << SYS_GPD_IOCR_GPD9_DS_Pos) /*!< GCR_T::GPD_IOCR: GPD9_DS Mask */ + +#define SYS_GPD_IOCR_GPD8_DS_Pos 8 /*!< GCR_T::GPD_IOCR: GPD8_DS Position */ +#define SYS_GPD_IOCR_GPD8_DS_Msk (0x3ul << SYS_GPD_IOCR_GPD8_DS_Pos) /*!< GCR_T::GPD_IOCR: GPD8_DS Mask */ + +/* GCR REGWRPROT Bit Field Definitions */ +#define SYS_REGWRPROT_REGWRPROT_Pos 0 /*!< GCR_T::REGWRPROT: REGWRPROT Position */ +#define SYS_REGWRPROT_REGWRPROT_Msk (0xFFul << SYS_REGWRPROT_REGWRPROT_Pos) /*!< GCR_T::REGWRPROT: REGWRPROT Mask */ + +#define SYS_REGWRPROT_REGPROTDIS_Pos 0 /*!< GCR_T::REGWRPROT: REGPROTDIS Position */ +#define SYS_REGWRPROT_REGPROTDIS_Msk (1ul << SYS_REGWRPROT_REGPROTDIS_Pos) /*!< GCR_T::REGWRPROT: REGPROTDIS Mask */ + +/* GCR GPA_MFPH Bit Field Definitions */ +#define SYS_GPA_MFPH_GPA15_MFP_Pos 28 /*!< GCR_T::GPA_MFPH: GPA15_MFP Position */ +#define SYS_GPA_MFPH_GPA15_MFP_Msk (0x7ul << SYS_GPA_MFPH_GPA15_MFP_Pos) /*!< GCR_T::GPA_MFPH: GPA15_MFP Mask */ + +#define SYS_GPA_MFPH_GPA14_MFP_Pos 24 /*!< GCR_T::GPA_MFPH: GPA14_MFP Position */ +#define SYS_GPA_MFPH_GPA14_MFP_Msk (0x7ul << SYS_GPA_MFPH_GPA14_MFP_Pos) /*!< GCR_T::GPA_MFPH: GPA14_MFP Mask */ + +#define SYS_GPA_MFPH_GPA13_MFP_Pos 20 /*!< GCR_T::GPA_MFPH: GPA13_MFP Position */ +#define SYS_GPA_MFPH_GPA13_MFP_Msk (0x7ul << SYS_GPA_MFPH_GPA13_MFP_Pos) /*!< GCR_T::GPA_MFPH: GPA13_MFP Mask */ + +#define SYS_GPA_MFPH_GPA12_MFP_Pos 16 /*!< GCR_T::GPA_MFPH: GPA12_MFP Position */ +#define SYS_GPA_MFPH_GPA12_MFP_Msk (0x7ul << SYS_GPA_MFPH_GPA12_MFP_Pos) /*!< GCR_T::GPA_MFPH: GPA12_MFP Mask */ + +#define SYS_GPA_MFPH_GPA11_MFP_Pos 12 /*!< GCR_T::GPA_MFPH: GPA11_MFP Position */ +#define SYS_GPA_MFPH_GPA11_MFP_Msk (0x7ul << SYS_GPA_MFPH_GPA11_MFP_Pos) /*!< GCR_T::GPA_MFPH: GPA11_MFP Mask */ + +#define SYS_GPA_MFPH_GPA10_MFP_Pos 8 /*!< GCR_T::GPA_MFPH: GPA10_MFP Position */ +#define SYS_GPA_MFPH_GPA10_MFP_Msk (0x7ul << SYS_GPA_MFPH_GPA10_MFP_Pos) /*!< GCR_T::GPA_MFPH: GPA10_MFP Mask */ + +/* GCR GPB_MFPL Bit Field Definitions */ +#define SYS_GPB_MFPL_GPB7_MFP_Pos 28 /*!< GCR_T::GPB_MFPL: GPB7_MFP Position */ +#define SYS_GPB_MFPL_GPB7_MFP_Msk (0x7ul << SYS_GPB_MFPL_GPB7_MFP_Pos) /*!< GCR_T::GPB_MFPL: GPB7_MFP Mask */ + +#define SYS_GPB_MFPL_GPB6_MFP_Pos 24 /*!< GCR_T::GPB_MFPL: GPB6_MFP Position */ +#define SYS_GPB_MFPL_GPB6_MFP_Msk (0x7ul << SYS_GPB_MFPL_GPB6_MFP_Pos) /*!< GCR_T::GPB_MFPL: GPB6_MFP Mask */ + +#define SYS_GPB_MFPL_GPB5_MFP_Pos 20 /*!< GCR_T::GPB_MFPL: GPB5_MFP Position */ +#define SYS_GPB_MFPL_GPB5_MFP_Msk (0x7ul << SYS_GPB_MFPL_GPB5_MFP_Pos) /*!< GCR_T::GPB_MFPL: GPB5_MFP Mask */ + +#define SYS_GPB_MFPL_GPB4_MFP_Pos 16 /*!< GCR_T::GPB_MFPL: GPB4_MFP Position */ +#define SYS_GPB_MFPL_GPB4_MFP_Msk (0x7ul << SYS_GPB_MFPL_GPB4_MFP_Pos) /*!< GCR_T::GPB_MFPL: GPB4_MFP Mask */ + +#define SYS_GPB_MFPL_GPB3_MFP_Pos 12 /*!< GCR_T::GPB_MFPL: GPB3_MFP Position */ +#define SYS_GPB_MFPL_GPB3_MFP_Msk (0x7ul << SYS_GPB_MFPL_GPB3_MFP_Pos) /*!< GCR_T::GPB_MFPL: GPB3_MFP Mask */ + +#define SYS_GPB_MFPL_GPB2_MFP_Pos 8 /*!< GCR_T::GPB_MFPL: GPB2_MFP Position */ +#define SYS_GPB_MFPL_GPB2_MFP_Msk (0x7ul << SYS_GPB_MFPL_GPB2_MFP_Pos) /*!< GCR_T::GPB_MFPL: GPB2_MFP Mask */ + +#define SYS_GPB_MFPL_GPB1_MFP_Pos 4 /*!< GCR_T::GPB_MFPL: GPB1_MFP Position */ +#define SYS_GPB_MFPL_GPB1_MFP_Msk (0x7ul << SYS_GPB_MFPL_GPB1_MFP_Pos) /*!< GCR_T::GPB_MFPL: GPB1_MFP Mask */ + +#define SYS_GPB_MFPL_GPB0_MFP_Pos 0 /*!< GCR_T::GPB_MFPL: GPB0_MFP Position */ +#define SYS_GPB_MFPL_GPB0_MFP_Msk (0x7ul << SYS_GPB_MFPL_GPB0_MFP_Pos) /*!< GCR_T::GPB_MFPL: GPB0_MFP Mask */ + +/* GCR GPB_MFPH Bit Field Definitions */ +#define SYS_GPB_MFPH_GPB15_MFP_Pos 28 /*!< GCR_T::GPB_MFPH: GPB15_MFP Position */ +#define SYS_GPB_MFPH_GPB15_MFP_Msk (0x7ul << SYS_GPB_MFPH_GPB15_MFP_Pos) /*!< GCR_T::GPB_MFPH: GPB15_MFP Mask */ + +#define SYS_GPB_MFPH_GPB14_MFP_Pos 24 /*!< GCR_T::GPB_MFPH: GPB14_MFP Position */ +#define SYS_GPB_MFPH_GPB14_MFP_Msk (0x7ul << SYS_GPB_MFPH_GPB14_MFP_Pos) /*!< GCR_T::GPB_MFPH: GPB14_MFP Mask */ + +#define SYS_GPB_MFPH_GPB13_MFP_Pos 20 /*!< GCR_T::GPB_MFPH: GPB13_MFP Position */ +#define SYS_GPB_MFPH_GPB13_MFP_Msk (0x7ul << SYS_GPB_MFPH_GPB13_MFP_Pos) /*!< GCR_T::GPB_MFPH: GPB13_MFP Mask */ + +#define SYS_GPB_MFPH_GPB12_MFP_Pos 16 /*!< GCR_T::GPB_MFPH: GPB12_MFP Position */ +#define SYS_GPB_MFPH_GPB12_MFP_Msk (0x7ul << SYS_GPB_MFPH_GPB12_MFP_Pos) /*!< GCR_T::GPB_MFPH: GPB12_MFP Mask */ + +#define SYS_GPB_MFPH_GPB10_MFP_Pos 8 /*!< GCR_T::GPB_MFPH: GPB10_MFP Position */ +#define SYS_GPB_MFPH_GPB10_MFP_Msk (0x7ul << SYS_GPB_MFPH_GPB10_MFP_Pos) /*!< GCR_T::GPB_MFPH: GPB10_MFP Mask */ + +#define SYS_GPB_MFPH_GPB9_MFP_Pos 4 /*!< GCR_T::GPB_MFPH: GPB9_MFP Position */ +#define SYS_GPB_MFPH_GPB9_MFP_Msk (0x7ul << SYS_GPB_MFPH_GPB9_MFP_Pos) /*!< GCR_T::GPB_MFPH: GPB9_MFP Mask */ + +#define SYS_GPB_MFPH_GPB8_MFP_Pos 0 /*!< GCR_T::GPB_MFPH: GPB8_MFP Position */ +#define SYS_GPB_MFPH_GPB8_MFP_Msk (0x7ul << SYS_GPB_MFPH_GPB8_MFP_Pos) /*!< GCR_T::GPB_MFPH: GPB8_MFP Mask */ + +/* GCR GPC_MFPL Bit Field Definitions */ +#define SYS_GPC_MFPL_GPC5_MFP_Pos 20 /*!< GCR_T::GPC_MFPL: GPC5_MFP Position */ +#define SYS_GPC_MFPL_GPC5_MFP_Msk (0x7ul << SYS_GPC_MFPL_GPC5_MFP_Pos) /*!< GCR_T::GPC_MFPL: GPC5_MFP Mask */ + +#define SYS_GPC_MFPL_GPC4_MFP_Pos 16 /*!< GCR_T::GPC_MFPL: GPC4_MFP Position */ +#define SYS_GPC_MFPL_GPC4_MFP_Msk (0x7ul << SYS_GPC_MFPL_GPC4_MFP_Pos) /*!< GCR_T::GPC_MFPL: GPC4_MFP Mask */ + +#define SYS_GPC_MFPL_GPC3_MFP_Pos 12 /*!< GCR_T::GPC_MFPL: GPC3_MFP Position */ +#define SYS_GPC_MFPL_GPC3_MFP_Msk (0x7ul << SYS_GPC_MFPL_GPC3_MFP_Pos) /*!< GCR_T::GPC_MFPL: GPC3_MFP Mask */ + +#define SYS_GPC_MFPL_GPC2_MFP_Pos 8 /*!< GCR_T::GPC_MFPL: GPC2_MFP Position */ +#define SYS_GPC_MFPL_GPC2_MFP_Msk (0x7ul << SYS_GPC_MFPL_GPC2_MFP_Pos) /*!< GCR_T::GPC_MFPL: GPC2_MFP Mask */ + +#define SYS_GPC_MFPL_GPC1_MFP_Pos 4 /*!< GCR_T::GPC_MFPL: GPC1_MFP Position */ +#define SYS_GPC_MFPL_GPC1_MFP_Msk (0x7ul << SYS_GPC_MFPL_GPC1_MFP_Pos) /*!< GCR_T::GPC_MFPL: GPC1_MFP Mask */ + +#define SYS_GPC_MFPL_GPC0_MFP_Pos 0 /*!< GCR_T::GPC_MFPL: GPC0_MFP Position */ +#define SYS_GPC_MFPL_GPC0_MFP_Msk (0x7ul << SYS_GPC_MFPL_GPC0_MFP_Pos) /*!< GCR_T::GPC_MFPL: GPC0_MFP Mask */ + +/* GCR GPC_MFPH Bit Field Definitions */ +#define SYS_GPC_MFPH_GPC13_MFP_Pos 20 /*!< GCR_T::GPC_MFPH: GPC13_MFP Position */ +#define SYS_GPC_MFPH_GPC13_MFP_Msk (0x7ul << SYS_GPC_MFPH_GPC13_MFP_Pos) /*!< GCR_T::GPC_MFPH: GPC13_MFP Mask */ + +#define SYS_GPC_MFPH_GPC12_MFP_Pos 16 /*!< GCR_T::GPC_MFPH: GPC12_MFP Position */ +#define SYS_GPC_MFPH_GPC12_MFP_Msk (0x7ul << SYS_GPC_MFPH_GPC12_MFP_Pos) /*!< GCR_T::GPC_MFPH: GPC12_MFP Mask */ + +#define SYS_GPC_MFPH_GPC11_MFP_Pos 12 /*!< GCR_T::GPC_MFPH: GPC11_MFP Position */ +#define SYS_GPC_MFPH_GPC11_MFP_Msk (0x7ul << SYS_GPC_MFPH_GPC11_MFP_Pos) /*!< GCR_T::GPC_MFPH: GPC11_MFP Mask */ + +#define SYS_GPC_MFPH_GPC10_MFP_Pos 8 /*!< GCR_T::GPC_MFPH: GPC11_MFP Position */ +#define SYS_GPC_MFPH_GPC10_MFP_Msk (0x7ul << SYS_GPC_MFPH_GPC10_MFP_Pos) /*!< GCR_T::GPC_MFPH: GPC11_MFP Mask */ + +#define SYS_GPC_MFPH_GPC9_MFP_Pos 4 /*!< GCR_T::GPC_MFPH: GPC9_MFP Position */ +#define SYS_GPC_MFPH_GPC9_MFP_Msk (0x7ul << SYS_GPC_MFPH_GPC9_MFP_Pos) /*!< GCR_T::GPC_MFPH: GPC9_MFP Mask */ + +#define SYS_GPC_MFPH_GPC8_MFP_Pos 0 /*!< GCR_T::GPC_MFPH: GPC8_MFP Position */ +#define SYS_GPC_MFPH_GPC8_MFP_Msk (0x7ul << SYS_GPC_MFPH_GPC8_MFP_Pos) /*!< GCR_T::GPC_MFPH: GPC8_MFP Mask */ + +/* GCR GPD_MFPL Bit Field Definitions */ +#define SYS_GPD_MFPL_GPD5_MFP_Pos 20 /*!< GCR_T::GPD_MFPL: GPD5_MFP Position */ +#define SYS_GPD_MFPL_GPD5_MFP_Msk (0x7ul << SYS_GPD_MFPL_GPD5_MFP_Pos) /*!< GCR_T::GPD_MFPL: GPD5_MFP Mask */ + +#define SYS_GPD_MFPL_GPD4_MFP_Pos 16 /*!< GCR_T::GPD_MFPL: GPD4_MFP Position */ +#define SYS_GPD_MFPL_GPD4_MFP_Msk (0x7ul << SYS_GPD_MFPL_GPD4_MFP_Pos) /*!< GCR_T::GPD_MFPL: GPD4_MFP Mask */ + +#define SYS_GPD_MFPL_GPD3_MFP_Pos 12 /*!< GCR_T::GPD_MFPL: GPD3_MFP Position */ +#define SYS_GPD_MFPL_GPD3_MFP_Msk (0x7ul << SYS_GPD_MFPL_GPD3_MFP_Pos) /*!< GCR_T::GPD_MFPL: GPD3_MFP Mask */ + +#define SYS_GPD_MFPL_GPD2_MFP_Pos 8 /*!< GCR_T::GPD_MFPL: GPD2_MFP Position */ +#define SYS_GPD_MFPL_GPD2_MFP_Msk (0x7ul << SYS_GPD_MFPL_GPD2_MFP_Pos) /*!< GCR_T::GPD_MFPL: GPD2_MFP Mask */ + +#define SYS_GPD_MFPL_GPD1_MFP_Pos 4 /*!< GCR_T::GPD_MFPL: GPD1_MFP Position */ +#define SYS_GPD_MFPL_GPD1_MFP_Msk (0x7ul << SYS_GPD_MFPL_GPD1_MFP_Pos) /*!< GCR_T::GPD_MFPL: GPD1_MFP Mask */ + +#define SYS_GPD_MFPL_GPD0_MFP_Pos 0 /*!< GCR_T::GPD_MFPL: GPD0_MFP Position */ +#define SYS_GPD_MFPL_GPD0_MFP_Msk (0x7ul << SYS_GPD_MFPL_GPD0_MFP_Pos) /*!< GCR_T::GPD_MFPL: GPD0_MFP Mask */ + +/* GCR GPD_MFPH Bit Field Definitions */ +#define SYS_GPD_MFPH_GPD11_MFP_Pos 12 /*!< GCR_T::GPD_MFPH: GPD11_MFP Position */ +#define SYS_GPD_MFPH_GPD11_MFP_Msk (0x7ul << SYS_GPD_MFPH_GPD11_MFP_Pos) /*!< GCR_T::GPD_MFPH: GPD11_MFP Mask */ + +#define SYS_GPD_MFPH_GPD10_MFP_Pos 8 /*!< GCR_T::GPD_MFPH: GPD10_MFP Position */ +#define SYS_GPD_MFPH_GPD10_MFP_Msk (0x7ul << SYS_GPD_MFPH_GPD10_MFP_Pos) /*!< GCR_T::GPD_MFPH: GPD10_MFP Mask */ + +#define SYS_GPD_MFPH_GPD9_MFP_Pos 4 /*!< GCR_T::GPD_MFPH: GPD9_MFP Position */ +#define SYS_GPD_MFPH_GPD9_MFP_Msk (0x7ul << SYS_GPD_MFPH_GPD9_MFP_Pos) /*!< GCR_T::GPD_MFPH: GPD9_MFP Mask */ + +#define SYS_GPD_MFPH_GPD8_MFP_Pos 0 /*!< GCR_T::GPD_MFPH: GPD8_MFP Position */ +#define SYS_GPD_MFPH_GPD8_MFP_Msk (0x7ul << SYS_GPD_MFPH_GPD8_MFP_Pos) /*!< GCR_T::GPD_MFPH: GPD8_MFP Mask */ + +/* GCR GPF_MFPL Bit Field Definitions */ +#define SYS_GPF_MFPL_GPF3_MFP_Pos 12 /*!< GCR_T::GPF_MFPL: GPF3_MFP Position */ +#define SYS_GPF_MFPL_GPF3_MFP_Msk (0x7ul << SYS_GPF_MFPL_GPF3_MFP_Pos) /*!< GCR_T::GPF_MFPL: GPF3_MFP Mask */ + +#define SYS_GPF_MFPL_GPF2_MFP_Pos 8 /*!< GCR_T::GPF_MFPL: GPF2_MFP Position */ +#define SYS_GPF_MFPL_GPF2_MFP_Msk (0x7ul << SYS_GPF_MFPL_GPF2_MFP_Pos) /*!< GCR_T::GPF_MFPL: GPF2_MFP Mask */ + +#define SYS_GPF_MFPL_GPF1_MFP_Pos 4 /*!< GCR_T::GPF_MFPL: GPF1_MFP Position */ +#define SYS_GPF_MFPL_GPF1_MFP_Msk (0x7ul << SYS_GPF_MFPL_GPF1_MFP_Pos) /*!< GCR_T::GPF_MFPL: GPF1_MFP Mask */ + +#define SYS_GPF_MFPL_GPF0_MFP_Pos 0 /*!< GCR_T::GPF_MFPL: GPF0_MFP Position */ +#define SYS_GPF_MFPL_GPF0_MFP_Msk (0x7ul << SYS_GPF_MFPL_GPF0_MFP_Pos) /*!< GCR_T::GPF_MFPL: GPF0_MFP Mask */ + + +/*@}*/ /* end of group REG_SYS_BITMASK */ + + + +typedef struct +{ + + +/** + * @var GCR_INT_T::IRQSRC + * Offset: 0x00~0x7C IRQ0~IRQ31 Interrupt Source Identity + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |INT_SRC |Interrupt Source + * | | |Define the interrupt sources for interrupt event. + * @var GCR_INT_T::NMISEL + * Offset: 0x80 NMI Source Interrupt Select Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4:0] |NMI_SEL |NMI Interrupt Source Selection + * | | |The NMI interrupt to Cortex-M0 can be selected from one of the peripheral interrupt by setting NMI_SEL with corresponding interrupt number. + * |[8] |NMI_EN |NMI Interrupt Enable Bit (Write Protect) + * | | |0 = NMI interrupt Disabled. + * | | |1 = NMI interrupt Enabled. + * | | |Note: This bit is write protected bit. Refer to the REGWRPROT register. + * @var GCR_INT_T::MCUIRQ + * Offset: 0x84 MCU Interrupt Request Source Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |MCU_IRQ |MCU IRQ Source Register + * | | |The MCU_IRQ collects all the interrupts from the peripherals and generates the synchronous interrupt to Cortex-M0. There are two modes to generate interrupt to Cortex-M0, Normal mode and Test mode. + * | | |The MCU_IRQ collects all interrupts from each peripheral and synchronizes them and then interrupts the Cortex-M0. + * | | |When the MCU_IRQ[n] is 0: Set MCU_IRQ[n] 1 will generate an interrupt to Cortex_M0 NVIC[n]. + * | | |When the MCU_IRQ[n] is 1 (mean an interrupt is assert), setting 1 to the MCU_IRQ[n] will clear the interrupt and setting MCU_IRQ[n] 0 has no effect. + */ + + __I uint32_t IRQSRC[32]; /* Offset: 0x00~0x7C IRQ0~IRQ31 Interrupt Source Identity */ + __IO uint32_t NMISEL; /* Offset: 0x80 NMI Source Interrupt Select Control Register */ + __IO uint32_t MCUIRQ; /* Offset: 0x84 MCU Interrupt Request Source Register */ + +} GCR_INT_T; + + + +/** @addtogroup REG_INT_BITMASK INT Bit Mask + @{ + */ + +/* INT IRQSRC Bit Field Definitions */ +#define INT_IRQSRC_INT_SRC_Pos 0 /*!< GCR_INT_T::IRQSRC: INT_SRC Position */ +#define INT_IRQSRC_INT_SRC_Msk (0xFul << INT_IRQSRC_INT_SRC_Pos) /*!< GCR_INT_T::IRQSRC: INT_SRC Mask */ + +/* INT NMI_SEL Bit Field Definitions */ +#define INT_NMI_SEL_NMI_EN_Pos 8 /*!< GCR_INT_T::NMISEL: NMI_EN Position */ +#define INT_NMI_SEL_NMI_EN_Msk (1ul << INT_NMI_SEL_NMI_EN_Pos) /*!< GCR_INT_T::NMISEL: NMI_EN Mask */ + +#define INT_NMI_SEL_NMI_SEL_Pos 0 /*!< GCR_INT_T::NMISEL: NMI_SEL Position */ +#define INT_NMI_SEL_NMI_SEL_Msk (0x1Ful << INT_NMI_SEL_NMI_SEL_Pos) /*!< GCR_INT_T::NMISEL: NMI_SEL Mask */ + +/* INT MCUIRQ Bit Field Definitions */ +#define INT_MCUIRQ_MCU_IRQ_Pos 0 /*!< GCR_INT_T::MCUIRQ: MCU_IRQ Position */ +#define INT_MCUIRQ_MCU_IRQ_Msk (0xFFFFFFFFul << INT_MCUIRQ_MCU_IRQ_Pos) /*!< GCR_INT_T::MCUIRQ: MCU_IRQ Mask */ + +/*@}*/ /* end of group REG_SYS_BITMASK */ +/*@}*/ /* end of group REG_SYS*/ + +/*----------------------------- Timer Controller (TMR) -----------------------------*/ +/** @addtogroup REG_TIMER Timer Controller (TIMER) + Memory Mapped Structure for Timer Controller + @{ + */ + +typedef struct +{ + + +/** + * @var TIMER_T::TCSR + * Offset: 0x00 Timer Control and Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |PRESCALE |Prescale Counter + * | | |Timer input clock source is divided by (PRESCALE+1) before it is fed to the Timer up counter. + * | | |If this field is 0 (PRESCALE = 0), then there is no scaling. + * |[16] |TDR_EN |Data Load Enable Control + * | | |When TDR_EN is set, TDR (Timer Data Register) will be updated continuously with the 24-bit up-timer value as the timer is counting. + * | | |0 = Timer Data Register update Disabled. + * | | |1 = Timer Data Register update Enabled while Timer counter is active. + * |[23] |WAKE_EN |Wake Up Function Enable Control + * | | |0 = Wake-up trigger event Disabled. + * | | |1 = Wake-up trigger event Enabled. + * |[24] |CTB |Counter Mode Enable Control + * | | |This bit is for external counting pin function enabled. + * | | |When timer is used as an event counter, this bit should be set to 1 and select HCLK as timer clock source. + * | | |0 = External counter mode Disabled. + * | | |1 = External counter mode Enabled. + * |[25] |CACT |Timer Active Status (Read Only) + * | | |This bit indicates the 24-bit up counter status. + * | | |0 = 24-bit up counter is not active. + * | | |1 = 24-bit up counter is active. + * |[26] |CRST |Timer Reset + * | | |0 = No effect. + * | | |1 = Reset 8-bit prescale counter, 24-bit up counter value and CEN bit if CACT is 1. + * |[28:27] |MODE |Timer Operating Mode + * | | |00 = The Timer controller is operated in One-shot mode. + * | | |01 = The Timer controller is operated in Periodic mode. + * | | |10 = The Timer controller is operated in Toggle-output mode. + * | | |11 = The Timer controller is operated in Continuous Counting mode. + * |[29] |IE |Interrupt Enable Control + * | | |0 = Timer Interrupt function Disabled. + * | | |1 = Timer Interrupt function Enabled. + * | | |If this bit is enabled, when the timer interrupt flag (TISR[0] TIF) is set to 1, the timer interrupt signal is generated and inform to CPU. + * |[30] |CEN |Timer Enable Control + * | | |0 = Stops/Suspends counting. + * | | |1 = Starts counting. + * | | |Note1: In stop status, and then set CEN to 1 will enable the 24-bit up counter to keep counting from the last stop counting value. + * | | |Note2: This bit is auto-cleared by hardware in one-shot mode (TCSR [28:27] = 00) when the timer interrupt flag (TISR[0] TIF) is generated. + * |[31] |DBGACK_TMR|ICE Debug Mode Acknowledge Disable (Write Protect) + * | | |0 = ICE debug mode acknowledgment effects TIMER counting. + * | | |TIMER counter will be held while CPU is held by ICE. + * | | |1 = ICE debug mode acknowledgment Disabled. + * | | |TIMER counter will keep going no matter CPU is held by ICE or not. + * @var TIMER_T::TCMPR + * Offset: 0x04 Timer Compare Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[23:0] |TCMP |Timer Compared Value + * | | |TCMP is a 24-bit compared value register. + * | | |When the internal 24-bit up counter value is equal to TCMP value, the TIF flag will set to 1. + * | | |Time-out period = (Period of Timer clock input) * (8-bit PRESCALE + 1) * (24-bit TCMP). + * | | |Note1: Never write 0x0 or 0x1 in TCMP field, or the core will run into unknown state. + * | | |Note2: When timer is operating at continuous counting mode, the 24-bit up counter will keep counting continuously even if user writes a new value into TCMP field. + * | | |But if timer is operating at other modes, the 24-bit up counter will restart counting and using newest TCMP value to be the timer compared value if user writes a new value into TCMP field. + * @var TIMER_T::TISR + * Offset: 0x08 Timer Interrupt Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |TIF |Timer Interrupt Flag + * | | |This bit indicates the interrupt flag status of Timer while TDR value reaches to TCMP value. + * | | |0 = No effect. + * | | |1 = TDR value matches the TCMP value. + * | | |Note: This bit is cleared by writing 1 to it. + * |[1] |TWF |Timer Wake-Up Flag + * | | |This bit indicates the interrupt wake-up flag status of Timer. + * | | |0 = Timer does not cause CPU wake-up. + * | | |1 = CPU wake-up from Idle or Power-down mode if Timer time-out interrupt signal generated. + * | | |Note: This bit is cleared by writing 1 to it. + * @var TIMER_T::TDR + * Offset: 0x0C Timer Data Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[23:0] |TDR |Timer Data Register + * | | |If TDR_EN (TCSR[16]) is set to 1, TDR register will be updated continuously to monitor 24-bit up counter value. + * @var TIMER_T::TCAP + * Offset: 0x10 Timer Capture Data Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[23:0] |TCAP |Timer Capture Data Register + * | | |When TEXIF flag is set to 1, the current TDR value will be auto-loaded into this TCAP filed immediately. + * @var TIMER_T::TEXCON + * Offset: 0x14 Timer External Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |TX_PHASE |Timer External Count Pin Phase Detect Selection + * | | |This bit indicates the detection phase of TMx pin. + * | | |0 = A falling edge of TMx pin will be counted. + * | | |1 = A rising edge of TMx pin will be counted. + * |[2:1] |TEX_EDGE |Timer External Capture Pin Edge Detect Selection + * | | |00 = A 1 to 0 transition on TMx_EXT pin will be detected. + * | | |01 = A 0 to 1 transition on TMx_EXT pin will be detected. + * | | |10 = Either 1 to 0 or 0 to 1 transition on TMx_EXT pin will be detected. + * | | |11 = Reserved. + * |[3] |TEXEN |Timer External Pin Function Enable + * | | |This bit enables the RSTCAPSEL function on the TxEX pin. + * | | |0 = RSTCAPSEL function of TxEX pin will be ignored. + * | | |1 = RSTCAPSEL function of TxEX pin is active. + * |[4] |RSTCAPSEL |Timer External Reset Counter / Timer External Capture Mode Selection + * | | |0 = Transition on TMx_EXT + * | | |pin is using to save the TDR value into TCAP value if TEXIF flag is set to 1. + * | | |1 = Transition on TMx_EXT pin is using to reset the 24-bit up counter. + * |[5] |TEXIEN |Timer External Capture Interrupt Enable Control + * | | |0 = TMx_EXT pin detection Interrupt Disabled. + * | | |1 = TMx_EXT pin detection Interrupt Enabled. + * | | |If TEXIEN enabled, Timer will raise an external capture interrupt signal and inform to CPU while TEXIF flag is set to 1. + * |[6] |TEXDB |Timer External Capture Input Pin De-Bounce Enable Control + * | | |0 = TMx_EXT pin de-bounce Disabled. + * | | |1 = TMx_EXT pin de-bounce Enabled. + * | | |If this bit is enabled, the edge detection of TMx_EXT pin is detected with de-bounce circuit. + * |[7] |TCDB |Timer External Counter Input Pin De-Bounce Enable Control + * | | |0 = TMx pin de-bounce Disabled. + * | | |1 = TMx pin de-bounce Enabled. + * | | |If this bit is enabled, the edge detection of TMx pin is detected with de-bounce circuit. + * @var TIMER_T::TEXISR + * Offset: 0x18 Timer External Interrupt Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |TEXIF |Timer External Capture Interrupt Flag + * | | |This bit indicates the external capture interrupt flag status. + * | | |When TEXEN enabled, TMx_EXT pin selected as external capture function, and a transition on TMx_EXT pin matched the TEX_EDGE setting, this flag will set to 1 by hardware. + * | | |1 = TMx_EXT + * | | |pin interrupt occurred. + * | | |0 = TMx_EXT + * | | |pin interrupt did not occur. + * | | |Note: This bit is cleared by writing 1 to it. + */ + + __IO uint32_t TCSR; /* Offset: 0x00 Timer Control and Status Register */ + __IO uint32_t TCMPR; /* Offset: 0x04 Timer Compare Register */ + __IO uint32_t TISR; /* Offset: 0x08 Timer Interrupt Status Register */ + __I uint32_t TDR; /* Offset: 0x0C Timer Data Register */ + __I uint32_t TCAP; /* Offset: 0x10 Timer Capture Data Register */ + __IO uint32_t TEXCON; /* Offset: 0x14 Timer External Control Register */ + __IO uint32_t TEXISR; /* Offset: 0x18 Timer External Interrupt Status Register */ + +} TIMER_T; + + + + +/** @addtogroup REG_TIMER_BITMASK TIMER Bit Mask + @{ + */ + + +/* TIMER TCSR Bit Field Definitions */ +#define TIMER_TCSR_DBGACK_TMR_Pos 31 /*!< TIMER_T::TCSR: DBGACK_TMR Position */ +#define TIMER_TCSR_DBGACK_TMR_Msk (1ul << TIMER_TCSR_DBGACK_TMR_Pos) /*!< TIMER_T::TCSR: DBGACK_TMR Mask */ + +#define TIMER_TCSR_CEN_Pos 30 /*!< TIMER_T::TCSR: CEN Position */ +#define TIMER_TCSR_CEN_Msk (1ul << TIMER_TCSR_CEN_Pos) /*!< TIMER_T::TCSR: CEN Mask */ + +#define TIMER_TCSR_IE_Pos 29 /*!< TIMER_T::TCSR: IE Position */ +#define TIMER_TCSR_IE_Msk (1ul << TIMER_TCSR_IE_Pos) /*!< TIMER_T::TCSR: IE Mask */ + +#define TIMER_TCSR_MODE_Pos 27 /*!< TIMER_T::TCSR: MODE Position */ +#define TIMER_TCSR_MODE_Msk (0x3ul << TIMER_TCSR_MODE_Pos) /*!< TIMER_T::TCSR: MODE Mask */ + +#define TIMER_TCSR_CRST_Pos 26 /*!< TIMER_T::TCSR: CRST Position */ +#define TIMER_TCSR_CRST_Msk (1ul << TIMER_TCSR_CRST_Pos) /*!< TIMER_T::TCSR: CRST Mask */ + +#define TIMER_TCSR_CACT_Pos 25 /*!< TIMER_T::TCSR: CACT Position */ +#define TIMER_TCSR_CACT_Msk (1ul << TIMER_TCSR_CACT_Pos) /*!< TIMER_T::TCSR: CACT Mask */ + +#define TIMER_TCSR_CTB_Pos 24 /*!< TIMER_T::TCSR: CTB Position */ +#define TIMER_TCSR_CTB_Msk (1ul << TIMER_TCSR_CTB_Pos) /*!< TIMER_T::TCSR: CTB Mask */ + +#define TIMER_TCSR_WAKE_EN_Pos 23 /*!< TIMER_T::TCSR: WAKE_EN Position */ +#define TIMER_TCSR_WAKE_EN_Msk (1ul << TIMER_TCSR_WAKE_EN_Pos) /*!< TIMER_T::TCSR: WAKE_EN Mask */ + +#define TIMER_TCSR_TDR_EN_Pos 16 /*!< TIMER_T::TCSR: TDR_EN Position */ +#define TIMER_TCSR_TDR_EN_Msk (1ul << TIMER_TCSR_TDR_EN_Pos) /*!< TIMER_T::TCSR: TDR_EN Mask */ + +#define TIMER_TCSR_PRESCALE_Pos 0 /*!< TIMER_T::TCSR: PRESCALE Position */ +#define TIMER_TCSR_PRESCALE_Msk (0xFFul << TIMER_TCSR_PRESCALE_Pos) /*!< TIMER_T::TCSR: PRESCALE Mask */ + +/* TIMER TCMPR Bit Field Definitions */ +#define TIMER_TCMP_TCMP_Pos 0 /*!< TIMER_T::TCMPR: TCMP Position */ +#define TIMER_TCMP_TCMP_Msk (0xFFFFFFul << TIMER_TCMP_TCMP_Pos) /*!< TIMER_T::TCMPR: TCMP Mask */ + +/* TIMER TISR Bit Field Definitions */ +#define TIMER_TISR_TWF_Pos 1 /*!< TIMER_T::TISR: TWF Position */ +#define TIMER_TISR_TWF_Msk (1ul << TIMER_TISR_TWF_Pos) /*!< TIMER_T::TISR: TWF Mask */ + +#define TIMER_TISR_TIF_Pos 0 /*!< TIMER_T::TISR: TIF Position */ +#define TIMER_TISR_TIF_Msk (1ul << TIMER_TISR_TIF_Pos) /*!< TIMER_T::TISR: TIF Mask */ + +/* TIMER TDR Bit Field Definitions */ +#define TIMER_TDR_TDR_Pos 0 /*!< TIMER_T::TDR: TDR Position */ +#define TIMER_TDR_TDR_Msk (0xFFFFFFul << TIMER_TDR_TDR_Pos) /*!< TIMER_T::TDR: TDR Mask */ + +/* TIMER TCAP Bit Field Definitions */ +#define TIMER_TCAP_TCAP_Pos 0 /*!< TIMER_T::TCAP: TCAP Position */ +#define TIMER_TCAP_TCAP_Msk (0xFFFFFFul << TIMER_TCAP_TCAP_Pos) /*!< TIMER_T::TCAP: TCAP Mask */ + +/* TIMER TEXCON Bit Field Definitions */ +#define TIMER_TEXCON_TCDB_Pos 7 /*!< TIMER_T::TEXCON: TCDB Position */ +#define TIMER_TEXCON_TCDB_Msk (1ul << TIMER_TEXCON_TCDB_Pos) /*!< TIMER_T::TEXCON: TCDB Mask */ + +#define TIMER_TEXCON_TEXDB_Pos 6 /*!< TIMER_T::TEXCON: TEXDB Position */ +#define TIMER_TEXCON_TEXDB_Msk (1ul << TIMER_TEXCON_TEXDB_Pos) /*!< TIMER_T::TEXCON: TEXDB Mask */ + +#define TIMER_TEXCON_TEXIEN_Pos 5 /*!< TIMER_T::TEXCON: TEXIEN Position */ +#define TIMER_TEXCON_TEXIEN_Msk (1ul << TIMER_TEXCON_TEXIEN_Pos) /*!< TIMER_T::TEXCON: TEXIEN Mask */ + +#define TIMER_TEXCON_RSTCAPSEL_Pos 4 /*!< TIMER_T::TEXCON: RSTCAPSEL Position */ +#define TIMER_TEXCON_RSTCAPSEL_Msk (1ul << TIMER_TEXCON_RSTCAPSEL_Pos) /*!< TIMER_T::TEXCON: RSTCAPSEL Mask */ + +#define TIMER_TEXCON_TEXEN_Pos 3 /*!< TIMER_T::TEXCON: TEXEN Position */ +#define TIMER_TEXCON_TEXEN_Msk (1ul << TIMER_TEXCON_TEXEN_Pos) /*!< TIMER_T::TEXCON: TEXEN Mask */ + +#define TIMER_TEXCON_TEX_EDGE_Pos 1 /*!< TIMER_T::TEXCON: TEX_EDGE Position */ +#define TIMER_TEXCON_TEX_EDGE_Msk (0x3ul << TIMER_TEXCON_TEX_EDGE_Pos) /*!< TIMER_T::TEXCON: TEX_EDGE Mask */ + +#define TIMER_TEXCON_TX_PHASE_Pos 0 /*!< TIMER_T::TEXCON: TX_PHASE Position */ +#define TIMER_TEXCON_TX_PHASE_Msk (1ul << TIMER_TEXCON_TX_PHASE_Pos) /*!< TIMER_T::TEXCON: TX_PHASE Mask */ + +/* TIMER TEXISR Bit Field Definitions */ +#define TIMER_TEXISR_TEXIF_Pos 0 /*!< TIMER_T::TEXISR: TEXIF Position */ +#define TIMER_TEXISR_TEXIF_Msk (1ul << TIMER_TEXISR_TEXIF_Pos) /*!< TIMER_T::TEXISR: TEXIF Mask */ +/*@}*/ /* end of group REG_TIMER_BITMASK */ +/*@}*/ /* end of group REG_TIMER */ + + +/*------------------------- UART Interface Controller ------------------------*/ + +/** @addtogroup REG_UART Universal Asynchronous Receiver/Transmitter Controller (UART) + Memory Mapped Structure for UART Serial Interface Controller + @{ + */ + +typedef struct +{ + + + /** + * @var UART_T::DATA + * Offset: 0x00 UART Data Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |DATA |Data Register + * | | |By writing to this register, the UART will send out an 8-bit data through the UART_TXD pin (LSB first). + * | | |By reading this register, the UART will return an 8-bit data received from UART_RXD pin (LSB first). + * @var UART_T::THR + * Offset: 0x00 UART Transmit Holding Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] | THR |Transmit Holding Register + * | | |By writing to this register, the UART will send out an 8-bit data through the UART_TXD pin (LSB first). + * @var UART_T::RBR + * Offset: 0x00 UART Receive Buffer Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |RBR |Receive Buffer Register (Read Only) + * | | |By reading this register, the UART will return the 8-bit data received from UART_RXD pin (LSB first). + * @var UART_T::IER + * Offset: 0x04 UART Interrupt Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RDA_IEN |Receive Data Available Interrupt Enable Bit + * | | |0 = Receive data available interrupt Disabled. + * | | |1 = Receive data available interrupt Enabled. + * |[1] |THRE_IEN |Transmit Holding Register Empty Interrupt Enable Bit + * | | |0 = Transmit holding register empty interrupt Disabled. + * | | |1 = Transmit holding register empt interrupt Enabled. + * |[2] |RLS_IEN |Receive Line Status Interrupt Enable Bit + * | | |0 = Receive Line Status interrupt Disabled. + * | | |1 = Receive Line Status interrupt Enabled. + * |[3] |MODEM_IEN |Modem Status Interrupt Enable Bit + * | | |0 = Modem status interrupt Disabled. + * | | |1 = Modem status interrupt Enabled. + * |[4] |RTO_IEN |RX Time-out Interrupt Enable Bit + * | | |0 = RX time-out interrupt Disabled. + * | | |1 = RX time-out interrupt Enabled. + * |[5] |BUF_ERR_IEN|Buffer Error Interrupt Enable Bit + * | | |0 = Buffer error interrupt Disabled. + * | | |1 = Buffer error interrupt Enabled. + * |[6] |WAKE_EN |UART Wake-up Function Enable Bit + * | | |0 = UART wake-up function Disabled. + * | | |1 = UART wake-up function Enabled, when chip is in Power-down mode, an external nCTS change will wake up chip from Power-down mode. + * |[11] |TIME_OUT_EN|Receive Buffer Time-out Counter Enable Bit + * | | |0 = Receive Buffer Time-out counter Disabled. + * | | |1 = Receive Buffer Time-out counter Enabled. + * |[12] |AUTO_RTS_EN|nRTS Auto Flow Control Enable Bit + * | | |0 = nRTS auto flow control Disabled. + * | | |1 = nRTS auto flow control Enabled. + * | | |Note: When nRTS auto-flow is enabled, if the number of bytes in the RX FIFO is equal to the RTS_TRI_LEV (UA_FCR [19:16]), the UART will de-assert nRTS signal. + * |[13] |AUTO_CTS_EN|nCTS Auto Flow Control Enable Bit + * | | |0 = nCTS auto flow control Disabled. + * | | |1 = nCTS auto flow control Enabled. + * | | |Note: When nCTS auto-flow is enabled, the UART will send data to external device when nCTS input assert (UART will not send data to device until nCTS is asserted). + * |[14] |DMA_TX_EN |TX DMA Enable Bit + * | | |This bit can enable or disable TX DMA service. + * | | |0 = TX DMA Disabled. + * | | |1 = TX DMA Enabled. + * | | |Note: If RLS_IEN (UA_IER[2]) is enabled and HW_RLS_INT(UA_ISR[26]) is set to 1, the RLS (Receive Line Status) Interrupt is caused. + * | | |If RLS interrupt is caused by Break Error Flag BIF(UA_FSR[6]), Frame Error Flag FEF(UA_FSR[5]) or Parity Error Flag PEF(UA_FSR[4]), UART PDMA transmit request operation is stop. + * | | |Clear Break Error Flag BIF or Frame Error Flag FEF or Parity Error Flag PEF by writing "1" to corresponding BIF, FEF and PEF to make UART PDMA transmit request operation continue. + * |[15] |DMA_RX_EN |RX DMA Enable Bit + * | | |This bit can enable or disable RX DMA service. + * | | |0 = RX DMA Disabled. + * | | |1 = RX DMA Enabled. + * | | |Note: If RLS_IEN (UA_IER[2]) is enabled and HW_RLS_INT(UA_ISR[26]) is set to 1, the RLS (Receive Line Status) Interrupt is caused. + * | | |If RLS interrupt is caused by Break Error Flag BIF(UA_FSR[6]), Frame Error Flag FEF(UA_FSR[5]) or Parity Error Flag PEF(UA_FSR[4]), UART PDMA receive request operation is stop. + * | | |Clear Break Error Flag BIF or Frame Error Flag FEF or Parity Error Flag PEF by writing "1" to corresponding BIF, FEF and PEF to make UART PDMA receive request operation continue. + * @var UART_T::FCR + * Offset: 0x08 UART FIFO Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1] |RFR |RX Field Software Reset + * | | |When RFR is set, all the byte in the receiver FIFO and RX internal state machine are cleared. + * | | |0 = No effect. + * | | |1 = Reset the RX internal state machine and pointers. + * | | |Note: This bit will automatically clear at least 3 UART peripheral clock cycles. + * |[2] |TFR |TX Field Software Reset + * | | |When TFR is set, all the byte in the transmit FIFO and TX internal state machine are cleared. + * | | |0 = No effect. + * | | |1 = Reset the TX internal state machine and pointers. + * | | |Note: This bit will automatically clear at least 3 UART peripheral clock cycles. + * |[7:4] |RFITL |RX FIFO Interrupt Trigger Level + * | | |When the number of bytes in the received FIFO is equal to the RFITL, the RDA_IF (UA_ISR[0]) will be set (if RDA_IEN(UA_IER [0]) enabled, an interrupt will be generated). + * | | |0000 = RX FIFO Interrupt Trigger Level is 1 byte. + * | | |0001 = RX FIFO Interrupt Trigger Level is 4 bytes. + * | | |0010 = RX FIFO Interrupt Trigger Level is 8 bytes. + * | | |0011 = RX FIFO Interrupt Trigger Level is 14 bytes. + * |[8] |RX_DIS |Receiver Disable + * | | |The receiver is disabled or not. + * | | |0 = Receiver Enabled. + * | | |1 = Receiver Disabled. + * | | |Note: This field is used for RS-485 Normal Multi-drop mode. It should be programmed before RS485_NMM (UA_ALT_CSR [8]) is programmed. + * |[19:16] |RTS_TRI_LEV|nRTS Trigger Level For Auto-flow Control Use + * | | |0000 = nRTS Trigger Level is 1 byte. + * | | |0001 = nRTS Trigger Level is 4 bytes. + * | | |0010 = nRTS Trigger Level is 8 bytes. + * | | |0011 = nRTS Trigger Level is 14 bytes. + * | | |Note: This field is used for nRTS auto-flow control. + * @var UART_T::LCR + * Offset: 0x0C UART Line Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |WLS |Word Length Selection + * | | |00 = Word length is 5-bit. + * | | |01 = Word length is 6-bit. + * | | |10 = Word length is 7-bit + * | | |11 = Word length is 8-bit + * |[2] |NSB |Number Of "STOP Bit" + * | | |0 = One " STOP bit" is generated in the transmitted data. + * | | |1 = When select 5-bit word length, 1.5 "STOP bit" is generated in the transmitted data. + * | | |When select 6-,7- and 8-bit word length, 2 "STOP bit" is generated in the transmitted data. + * |[3] |PBE |Parity Bit Enable Bit + * | | |0 = No parity bit. + * | | |1 = Parity bit is generated on each outgoing character and is checked on each incoming data. + * |[4] |EPE |Even Parity Enable Bit + * | | |0 = Odd number of logic 1's is transmitted and checked in each word. + * | | |1 = Even number of logic 1's is transmitted and checked in each word. + * | | |This bit has effect only when PBE (UA_LCR[3]) is set. + * |[5] |SPE |Stick Parity Enable Bit + * | | |0 = Stick parity Disabled. + * | | |1 = If PBE (UA_LCR[3]) and EBE (UA_LCR[4]) are logic 1, the parity bit is transmitted and checked as logic 0. + * | | |If PBE (UA_LCR[3]) is 1 and EBE (UA_LCR[4]) is 0 then the parity bit is transmitted and checked as 1. + * |[6] |BCB |Break Control Bit + * | | |When this bit is set to logic 1, the serial data output (TX) is forced to the Spacing State (logic 0). + * | | |This bit acts only on TX and has no effect on the transmitter logic. + * @var UART_T::MCR + * Offset: 0x10 UART Modem Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1] |RTS |nRTS (Request-To-Send) Signal Control + * | | |This bit is direct control internal nRTS signal active or not, and then drive the nRTS pin output with LEV_RTS bit configuration. + * | | |0 = nRTS signal is active. + * | | |1 = nRTS signal is inactive. + * | | |Note1: This nRTS signal control bit is not effective when RTS auto-flow control is enabled in UART function mode. + * | | |Note2: This nRTS signal control bit is not effective when RS-485 auto direction mode (AUD) is enabled in RS-485 function mode. + * |[9] |LEV_RTS |nRTS Pin Active Level + * | | |This bit defines the active level state of nRTS pin output. + * | | |0 = nRTS pin output is high level active. + * | | |1 = nRTS pin output is low level active. + * |[13] |RTS_ST |nRTS Pin State (Read Only) + * | | |This bit mirror from nRTS pin output of voltage logic status. + * | | |0 = nRTS pin output is low level voltage logic state. + * | | |1 = nRTS pin output is high level voltage logic state. + * @var UART_T::MSR + * Offset: 0x14 UART Modem Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DCTSF |Detect nCTS State Change Flag + * | | |This bit is set whenever nCTS input has change state, and it will generate Modem interrupt to CPU when MODEM_IEN (UA_IER [3]) is set to 1. + * | | |0 = nCTS input has not change state. + * | | |1 = nCTS input has change state. + * | | |Note: This bit can be cleared by writing "1" to it. + * |[4] |CTS_ST |nCTS Pin Status (Read Only) + * | | |This bit mirror from CTS pin input of voltage logic status. + * | | |0 = nCTS pin input is low level voltage logic state. + * | | |1 = nCTS pin input is high level voltage logic state. + * | | |Note: This bit echoes when UART Controller peripheral clock is enabled, and nCTS multi-function port is selected. + * |[8] |LEV_CTS |nCTS Pin Active Level + * | | |This bit defines the active level state of nCTS pin input. + * | | |0 = nCTS pin input is high level active. + * | | |1 = nCTS pin input is low level active. + * @var UART_T::FSR + * Offset: 0x18 UART FIFO Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RX_OVER_IF|RX Overflow Error Interrupt Flag + * | | |This bit is set when RX FIFO overflow. + * | | |If the number of bytes of received data is greater than RX_FIFO (UA_RBR) size, this bit will be set. + * | | |0 = RX FIFO is not overflow. + * | | |1 = RX FIFO is overflow. + * | | |Note: This bit can be cleared by writing "1" to it. + * |[3] |RS485_ADD_DETF|RS-485 Address Byte Detection Flag + * | | |0 = Receiver detects a data that is not an address bit (bit 9 ='1'). + * | | |1 = Receiver detects a data that is an address bit (bit 9 ='1'). + * | | |Note1: This field is used for RS-485 function mode and RS485_ADD_EN (UA_ALT_CSR[15]) is set to 1 to enable Address detection mode . + * | | |Note2: This bit can be cleared by writing "1" to it. + * |[4] |PEF |Parity Error Flag + * | | |This bit is set to logic 1 whenever the received character does not have a valid "parity bit". + * | | |0 = No parity error is generated. + * | | |1 = Parity error is generated. + * | | |Note: This bit can be cleared by writing "1" to it. + * |[5] |FEF |Framing Error Flag + * | | |This bit is set to logic 1 whenever the received character does not have a valid "stop bit" (that is, the stop bit following the last data bit or parity bit is detected as logic 0). + * | | |0 = No framing error is generated. + * | | |1 = Framing error is generated. + * | | |Note: This bit can be cleared by writing "1" to it. + * |[6] |BIF |Break Interrupt Flag + * | | |This bit is set to logic 1 whenever the received data input(RX) is held in the "spacing state" (logic 0) for longer than a full word transmission time (that is, the total time of "start bit" + data bits + parity + stop bits). + * | | |0 = No Break interrupt is generated. + * | | |1 = Break interrupt is generated. + * | | |Note: This bit can be cleared by writing "1" to it. + * |[13:8] |RX_POINTER|RX FIFO Pointer (Read Only) + * | | |This field indicates the RX FIFO Buffer Pointer. + * | | |When UART receives one byte from external device, RX_POINTER increases one. + * | | |When one byte of RX FIFO is read by CPU, RX_POINTER decreases one. + * | | |The Maximum value shown in RX_POINTER is 15. + * | | |When the using level of RX FIFO Buffer equal to 16, the RX_FULL bit is set to 1 and RX_POINTER will show 0. + * | | |As one byte of RX FIFO is read by CPU, the RX_FULL bit is cleared to 0 and RX_POINTER will show 15. + * |[14] |RX_EMPTY |Receiver FIFO Empty (Read Only) + * | | |This bit initiate RX FIFO empty or not. + * | | |0 = RX FIFO is not empty. + * | | |1 = RX FIFO is empty. + * | | |Note: When the last byte of RX FIFO has been read by CPU, hardware sets this bit high. It will be cleared when UART receives any new data. + * |[15] |RX_FULL |Receiver FIFO Full (Read Only) + * | | |This bit initiates RX FIFO is full or not. + * | | |0 = RX FIFO is not full. + * | | |1 = RX FIFO is full. + * | | |Note: This bit is set when the number of usage in RX FIFO Buffer is equal to 16, otherwise is cleared by hardware. + * |[21:16] |TX_POINTER|TX FIFO Pointer (Read Only) + * | | |This field indicates the TX FIFO Buffer Pointer. + * | | |When CPU writes one byte into UA_THR, TX_POINTER increases one. + * | | |When one byte of TX FIFO is transferred to Transmitter Shift Register, TX_POINTER decreases one. + * | | |The Maximum value shown in TX_POINTER is 15. + * | | |When the using level of TX FIFO Buffer equal to 16, the TX_FULL bit is set to 1 and TX_POINTER will show 0. + * | | |As one byte of TX FIFO is transferred to Transmitter Shift Register, the TX_FULL bit is cleared to 0 and TX_POINTER will show 15. + * |[22] |TX_EMPTY |Transmitter FIFO Empty (Read Only) + * | | |This bit indicates TX FIFO empty or not. + * | | |0 = TX FIFO is not empty. + * | | |1 = TX FIFO is empty. + * | | |Note: When the last byte of TX FIFO has been transferred to Transmitter Shift Register, hardware sets this bit high. + * | | |It will be cleared when writing data into THR (TX FIFO not empty). + * |[23] |TX_FULL |Transmitter FIFO Full (Read Only) + * | | |This bit indicates TX FIFO full or not. + * | | |0 = TX FIFO is not full. + * | | |1 = TX FIFO is full. + * | | |Note: This bit is set when the using level of TX FIFO Buffer equal to 16; otherwise, it is cleared by hardware. + * |[24] |TX_OVER_IF|TX Overflow Error Interrupt Flag + * | | |If TX FIFO (UA_THR) is full, an additional write to UA_THR will cause this bit to logic 1. + * | | |0 = TX FIFO is not overflow. + * | | |1 = TX FIFO is overflow. + * | | |Note: This bit can be cleared by writing "1" to it. + * |[28] |TE_FLAG |Transmitter Empty Flag (Read Only) + * | | |This bit is set by hardware when TX FIFO (UA_THR) is empty and the STOP bit of the last byte has been transmitted. + * | | |0 = TX FIFO is not empty or the STOP bit of the last byte has not been transmitted. + * | | |1 = TX FIFO is empty and the STOP bit of the last byte has been transmitted. + * | | |Note: This bit is cleared automatically when TX FIFO is not empty or the last byte transmission has not completed. + * @var UART_T::ISR + * Offset: 0x1C UART Interrupt Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RDA_IF |Receive Data Available Interrupt Flag (Read Only) + * | | |When the number of bytes in the RX FIFO equals the RFITL (UA_FCR[7:4]) then the RDA_IF (UA_ISR[0]) will be set. + * | | |If RDA_IEN (UA_IER [0]) is enabled, the RDA interrupt will be generated. + * | | |0 = No RDA interrupt flag is generated. + * | | |1 = RDA interrupt flag is generated. + * | | |Note: This bit is read only and it will be cleared when the number of unread bytes of RX FIFO drops below the threshold level RFITL(UA_FCR[7:4]). + * |[1] |THRE_IF |Transmit Holding Register Empty Interrupt Flag (Read Only) + * | | |This bit is set when the last data of TX FIFO is transferred to Transmitter Shift Register. + * | | |If THRE_IEN (UA_IER[1]) is enabled, the THRE interrupt will be generated. + * | | |0 = No THRE interrupt flag is generated. + * | | |1 = THRE interrupt flag is generated. + * | | |Note: This bit is read only and it will be cleared when writing data into THR (TX FIFO not empty). + * |[2] |RLS_IF |Receive Line Interrupt Flag (Read Only) + * | | |This bit is set when the RX receive data have parity error, frame error or break error (at least one of 3 bits, BIF(UA_FSR[6]), FEF(UA_FSR[5]) and PEF(UA_FSR[4]), is set). + * | | |If RLS_IEN (UA_IER[2]) is enabled, the RLS interrupt will be generated. + * | | |0 = No RLS interrupt flag is generated. + * | | |1 = RLS interrupt flag is generated. + * | | |Note1: In RS-485 function mode, this field is set include receiver detect and received address byte character (bit9 = '1') bit. At the same time, the bit of RS485_ADD_DETF (UA_FSR[3]) is also set. + * | | |Note2: This bit is read only and reset to 0 when all bits of BIF (UA_FSR[6]), FEF (UA_FSR[5]) and PEF (UA_FSR[4]) are cleared. + * | | |Note3: In RS-485 function mode, this bit is read only and reset to 0 when all bits of BIF (UA_FSR[6]) , FEF (UA_FSR[5]) and PEF (UA_FSR[4]) and RS485_ADD_DETF (UA_FSR[3]) are cleared. + * |[3] |MODEM_IF |MODEM Interrupt Flag (Read Only) + * | | |This bit is set when the nCTS pin has state change (DCTSF (UA_MSR[0]) = 1). + * | | |If MODEM_IEN (UA_IER[3]) is enabled, the Modem interrupt will be generated. + * | | |0 = No Modem interrupt flag is generated. + * | | |1 = Modem interrupt flag is generated. + * | | |Note: This bit is read only and reset to 0 when bit DCTSF is cleared by a write 1 on DCTSF(UA_MSR[0]). + * |[4] |TOUT_IF |Receive Buffer Time-out Interrupt Flag (Read Only) + * | | |This bit is set when the RX FIFO is not empty and no activities occurred in the RX FIFO and the time-out counter equal to TOIC (UA_TOR[7:0]). + * | | |If TOUT_IEN (UA_IER[4]) is enabled, the Tout interrupt will be generated. + * | | |0 = No Receive Buffer Time-out interrupt flag is generated. + * | | |1 = Receive Buffer Time-out interrupt flag is generated. + * | | |Note: This bit is read only and user can read UA_RBR (RX is in active) to clear it. + * |[5] |BUF_ERR_IF|Buffer Error Interrupt Flag (Read Only) + * | | |This bit is set when the TX FIFO or RX FIFO overflows (TX_OVER_IF (UA_FSR[24]) or RX_OVER_IF (UA_FSR[0]) is set). + * | | |When BUF_ERR_IF (UA_ISR[5])is set, the transfer is not correct. + * | | |If BUF_ERR_IEN (UA_IER[8]) is enabled, the buffer error interrupt will be generated. + * | | |0 = No buffer error interrupt flag is generated. + * | | |1 = Buffer error interrupt flag is generated. + * | | |Note: Note: This bit is cleared if both of RX_OVER_IF (UA_FSR[0]) and TX_OVER_IF (UA_FSR[24]) are cleared to 0 by writing 1 to RX_OVER_IF (UA_FSR[0]) and TX_OVER_IF (UA_FSR[24]). + * |[8] |RDA_INT |Receive Data Available Interrupt Indicator (Read Only) + * | | |This bit is set if RDA_IEN (UA_IER[0]) and RDA_IF (UA_ISR[0]) are both set to 1. + * | | |0 = No RDA interrupt is generated. + * | | |1 = RDA interrupt is generated. + * |[9] |THRE_INT |Transmit Holding Register Empty Interrupt Indicator (Read Only) + * | | |This bit is set if THRE_IEN (UA_IER[1]) and THRE_IF (UA_SR[1]) are both set to 1. + * | | |0 = No THRE interrupt is generated. + * | | |1 = THRE interrupt is generated. + * |[10] |RLS_INT |Receive Line Status Interrupt Indicator (Read Only) + * | | |This bit is set if RLS_IEN (UA_IER[2]) and RLS_IF (UA_ISR[2]) are both set to 1. + * | | |0 = No RLS interrupt is generated. + * | | |1 = RLS interrupt is generated + * |[11] |MODEM_INT |MODEM Status Interrupt Indicator (Read Only) + * | | |This bit is set if MODEM_IEN (UA_IER[3]) and MODEM_IF (UA_ISR[4]) are both set to 1 + * | | |0 = No Modem interrupt is generated. + * | | |1 = Modem interrupt is generated. + * |[12] |TOUT_INT |Receive Buffer Time-out Interrupt Indicator (Read Only) + * | | |This bit is set if TOUT_IEN (UA_IER[4]) and TOUT_IF (UA_ISR[4]) are both set to 1. + * | | |0 = No Receive Buffer Time-out interrupt is generated. + * | | |1 = Receive Buffer Time-out interrupt is generated. + * |[13] |BUF_ERR_INT|Buffer Error Interrupt Indicator (Read Only) + * | | |This bit is set if BUF_ERR_IEN (UA_IER[5]) and BUF_ERR_IF (UA_ISR[5]) are both set to 1. + * | | |0 = No buffer error interrupt is generated . + * | | |1 = Buffer error interrupt is generated. + * |[18] |HW_RLS_IF |In DMA Mode, Receive Line Status Flag (Read Only) + * | | |This bit is set when the RX receive data have parity error, frame error or break error (at least one of 3 bits, BIF (UA_FSR[6]), FEF (UA_FSR[5]) and PEF (UA_FSR[4]) is set). + * | | |If RLS_IEN (UA_IER[2]) is enabled, the RLS interrupt will be generated. + * | | |0 = No RLS interrupt flag is generated in DMA mode. + * | | |1 = RLS interrupt flag is generated in DMA mode. + * | | |Note1: In RS-485 function mode, this field include receiver detect any address byte received address byte character (bit9 = '1') bit. + * | | |Note2: In UART function mode, this bit is read only and reset to 0 when all bits of BIF (UA_FSR[6]) , FEF (UA_FSR[5]) and PEF (UA_FSR[4]) are cleared. + * | | |Note3: In RS-485 function mode, this bit is read only and reset to 0 when all bits of BIF (UA_FSR[6]) , FEF (UA_FSR[5]) and PEF (UA_FSR[4]) and RS485_ADD_DETF (UA_FSR[3]) are cleared. + * |[19] |HW_MODEM_IF|In DMA Mode, MODEM Interrupt Flag (Read Only) + * | | |This bit is set when the CTS pin has state change (DCTSF (US_MSR[0] = 1)). + * | | |If MODEM_IEN (UA_IER[3]) is enabled, the Modem interrupt will be generated. + * | | |0 = No Modem interrupt flag is generated in DMA mode. + * | | |1 = Modem interrupt flag is generated in DMA mode. + * | | |Note: This bit is read only and reset to 0 when the bit DCTSF (US_MSR[0]) is cleared by writing 1 on DCTSF (US_MSR[0]). + * |[20] |HW_TOUT_IF|In DMA Mode, Receive Buffer Time-out Interrupt Flag (Read Only) + * | | |This bit is set when the RX FIFO is not empty and no activities occurred in the RX FIFO and the time-out counter equal to TOIC (UA_TOR[7:0]). + * | | |If TOUT_IEN (UA_IER[4]) is enabled, the Tout interrupt will be generated. + * | | |0 = No Receive Buffer Time-out interrupt flag is generated in DMA mode. + * | | |1 = Receive Buffer Time-out interrupt flag is generated in DMA mode. + * | | |Note: This bit is read only and user can read UA_RBR (RX is in active) to clear it. + * |[21] |HW_BUF_ERR_IF|In DMA Mode, Buffer Error Interrupt Flag (Read Only) + * | | |This bit is set when the TX or RX FIFO overflows (TX_OVER_IF (UA__FSR[24]) or RX_OVER_IF (UA_FSR[0]) is set). + * | | |When BUF_ERR_IF (UA_ISR[5]) is set, the transfer maybe is not correct. + * | | |If BUF_ERR_IEN (UA_IER[5]) is enabled, the buffer error interrupt will be generated. + * | | |0 = No buffer error interrupt flag is generated in DMA mode. + * | | |1 = Buffer error interrupt flag is generated in DMA mode. + * | | |Note: This bit is cleared when both TX_OVER_IF (UA_FSR[24]) and RX_OVER_IF (UA_FSR[0]) are cleared. + * |[26] |HW_RLS_INT|In DMA Mode, Receive Line Status Interrupt Indicator (Read Only) + * | | |This bit is set if RLS_IEN (UA_IER[2]) and HW_RLS_IF (UA_ISR[18]) are both set to 1. + * | | |0 = No RLS interrupt is generated in DMA mode. + * | | |1 = RLS interrupt is generated in DMA mode. + * |[27] |HW_MODEM_INT|In DMA Mode, MODEM Status Interrupt Indicator (Read Only) + * | | |This bit is set if MODEM_IEN (UA_IER[3]) and HW_MODEM_IF (UA_ISR[19]) are both set to 1. + * | | |0 = No Modem interrupt is generated in DMA mode. + * | | |1 = Modem interrupt is generated in DMA mode. + * |[28] |HW_TOUT_INT|In DMA Mode, Receive Buffer Time-out Interrupt Indicator (Read Only) + * | | |This bit is set if TOUT_IEN (UA_IER[4])and HW_TOUT_IF (UA_ISR[20]) are both set to 1. + * | | |0 = No Receive Buffer Time-out interrupt is generated in DMA mode. + * | | |1 = Receive Buffer Time-out interrupt is generated in DMA mode. + * |[29] |HW_BUF_ERR_INT|In DMA Mode, Buffer Error Interrupt Indicator (Read Only) + * | | |This bit is set if BUF_ERR_IEN (UA_IER[5]) and HW_BUF_ERR_IF (UA_ISR[21] )are both set to 1. + * | | |0 = No buffer error interrupt is generated in DMA mode. + * | | |1 = Buffer error interrupt is generated in DMA mode. + * @var UART_T::TOR + * Offset: 0x20 UART Time-out Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |TOIC |Time-out Interrupt Comparator + * | | |The time-out counter resets and starts counting (counting clock = baud rate) whenever the RX FIFO receives a new data word if time-out counter is enabled by setting TIME_OUT_EN(UA_IER [11]). + * | | |Once the content of time-out counter is equal to that of time-out interrupt comparator (TOIC (UA_TOR[7:0])), a receiver time-out interrupt (TOUT_INT (UA_ISR[12])) is generated if RTO_IEN (UA_IER[4]). + * | | |A new incoming data word or RX FIFO empty clears TOUT_IF (UA_ISR[4]). + * | | |In order to avoid receiver time-out interrupt generation immediately during one character is being received, TOIC value should be set between 40 and 255. + * | | |Thus, for example, if TOIC is set as 40, the time-out interrupt is generated after four characters are not received when 1 stop bit and no parity check is set for UART transfer. + * |[15:8] |DLY |TX Delay Time Value + * | | |This field is used to programming the transfer delay time between the last stop bit and next start bit. + * @var UART_T::BAUD + * Offset: 0x24 UART Baud Rate Divisor Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |BRD |Baud Rate Divider + * | | |The field indicates the baud rate divider. + * |[27:24] |DIVIDER_X |Divider X + * | | |The baud rate divider M = X+1. + * |[28] |DIV_X_ONE |Divider X Equal to 1 + * | | |0 = Divider M is X +1. + * | | |1 = Divider M is 1. + * |[29] |DIV_X_EN |Divider X Enable + * | | |The BRD is Baud Rate Divider, and the baud rate equation is Baud Rate = Clock / [M * (BRD + 2)]; The default value of M is 16. + * | | |0 = Divider X Disabled (the equation of M = 16). + * | | |1 = Divider X Enabled (the equation of M = X+1, but DIVIDER_X [27:24] must >= 8). + * | | |Note: In IrDA mode, this bit must disable. + * @var UART_T::IRCR + * Offset: 0x28 UART IrDA Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1] |TX_SELECT |IrDA Receiver/Transmitter Selection Enable Bit + * | | |0 = IrDA Transmitter Disabled and Receiver Enabled. + * | | |1 = IrDA Transmitter Enabled and Receiver Disabled. + * |[5] |INV_TX |IrDA inverse Transmitting Output Signal Control + * | | |0 = None inverse transmitting signal. + * | | |1 = Inverse transmitting output signal. + * |[6] |INV_RX |IrDA inverse Receive Input Signal Control + * | | |0 = None inverse receiving input signal. + * | | |1 = Inverse receiving input signal. + * @var UART_T::ALT_CSR + * Offset: 0x2C UART Alternate Control/Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[8] |RS485_NMM |RS-485 Normal Multi-Drop Operation Mode (NMM) + * | | |0 = RS-485 Normal Multi-drop Operation mode (NMM) Disabled. + * | | |1 = RS-485 Normal Multi-drop Operation mode (NMM) Enabled. + * | | |Note: It cannot be active with RS-485_AAD operation mode. + * |[9] |RS485_AAD |RS-485 Auto Address Detection Operation Mode (AAD) + * | | |0 = RS-485 Auto Address Detection Operation mode (AAD) Disabled. + * | | |1 = RS-485 Auto Address Detection Operation mode (AAD) Enabled. + * | | |Note: It cannot be active with RS-485_NMM operation mode. + * |[10] |RS485_AUD |RS-485 Auto Direction Mode (AUD) + * | | |0 = RS-485 Auto Direction Operation mode (AUO) Disabled. + * | | |1 = RS-485 Auto Direction Operation mode (AUO) Enabled. + * | | |Note: It can be active with RS-485_AAD or RS-485_NMM operation mode. + * |[15] |RS485_ADD_EN|RS-485 Address Detection Enable Bit + * | | |This bit is used to enable RS-485 Address Detection mode. + * | | |0 = Address detection mode Disabled. + * | | |1 = Address detection mode Enabled. + * | | |Note: This bit is used for RS-485 any operation mode. + * |[31:24] |ADDR_MATCH|Address Match Value + * | | |This field contains the RS-485 address match values. + * | | |Note: This field is used for RS-485 auto address detection mode. + * @var UART_T::FUN_SEL + * Offset: 0x30 UART Function Select Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |FUN_SEL |Function Select Enable + * | | |00 = UART function Enabled. + * | | |10 = IrDA function Enabled. + * | | |11 = RS-485 function Enabled. + */ + + union { + __IO uint32_t DATA; /* Offset: 0x00 UART Data Register */ + __IO uint32_t THR; /* Offset: 0x00 UART Transmit Holding Register */ + __IO uint32_t RBR; /* Offset: 0x00 UART Receive Buffer Register */ + }; + __IO uint32_t IER; /* Offset: 0x04 UART Interrupt Enable Register */ + __IO uint32_t FCR; /* Offset: 0x08 UART FIFO Control Register */ + __IO uint32_t LCR; /* Offset: 0x0C UART Line Control Register */ + __IO uint32_t MCR; /* Offset: 0x10 UART Modem Control Register */ + __IO uint32_t MSR; /* Offset: 0x14 UART Modem Status Register */ + __IO uint32_t FSR; /* Offset: 0x18 UART FIFO Status Register */ + __IO uint32_t ISR; /* Offset: 0x1C UART Interrupt Status Register */ + __IO uint32_t TOR; /* Offset: 0x20 UART Time-out Register */ + __IO uint32_t BAUD; /* Offset: 0x24 UART Baud Rate Divisor Register */ + __IO uint32_t IRCR; /* Offset: 0x28 UART IrDA Control Register */ + __IO uint32_t ALT_CSR; /* Offset: 0x2C UART Alternate Control/Status Register */ + __IO uint32_t FUN_SEL; /* Offset: 0x30 UART Function Select Register */ + +} UART_T; + + + + +/** @addtogroup REG_UART_BITMASK UART Bit Mask + @{ + */ + +/* UART THR Bit Field Definitions */ +#define UART_THR_THR_Pos 0 /*!< UART_T::THR: THR Position */ +#define UART_THR_THR_Msk (0xFul << UART_THR_THR_Pos) /*!< UART_T::THR: THR Mask */ + +/* UART RBR Bit Field Definitions */ +#define UART_RBR_RBR_Pos 0 /*!< UART_T::RBR: RBR Position */ +#define UART_RBR_RBR_Msk (0xFul << UART_RBR_RBR_Pos) /*!< UART_T::RBR: RBR Mask */ + +/* UART IER Bit Field Definitions */ +#define UART_IER_DMA_RX_EN_Pos 15 /*!< UART_T::IER: RX DMA Enable Position */ +#define UART_IER_DMA_RX_EN_Msk (1ul << UART_IER_DMA_RX_EN_Pos) /*!< UART_T::IER: RX DMA Enable Mask */ + +#define UART_IER_DMA_TX_EN_Pos 14 /*!< UART_T::IER: TX DMA Enable Position */ +#define UART_IER_DMA_TX_EN_Msk (1ul << UART_IER_DMA_TX_EN_Pos) /*!< UART_T::IER: TX DMA Enable Mask */ + +#define UART_IER_AUTO_CTS_EN_Pos 13 /*!< UART_T::IER: AUTO_CTS_EN Position */ +#define UART_IER_AUTO_CTS_EN_Msk (1ul << UART_IER_AUTO_CTS_EN_Pos) /*!< UART_T::IER: AUTO_CTS_EN Mask */ + +#define UART_IER_AUTO_RTS_EN_Pos 12 /*!< UART_T::IER: AUTO_RTS_EN Position */ +#define UART_IER_AUTO_RTS_EN_Msk (1ul << UART_IER_AUTO_RTS_EN_Pos) /*!< UART_T::IER: AUTO_RTS_EN Mask */ + +#define UART_IER_TIME_OUT_EN_Pos 11 /*!< UART_T::IER: TIME_OUT_EN Position */ +#define UART_IER_TIME_OUT_EN_Msk (1ul << UART_IER_TIME_OUT_EN_Pos) /*!< UART_T::IER: TIME_OUT_EN Mask */ + +#define UART_IER_WAKE_EN_Pos 6 /*!< UART_T::IER: WAKE_EN Position */ +#define UART_IER_WAKE_EN_Msk (1ul << UART_IER_WAKE_EN_Pos) /*!< UART_T::IER: WAKE_EN Mask */ + +#define UART_IER_BUF_ERR_IEN_Pos 5 /*!< UART_T::IER: BUF_ERR_IEN Position */ +#define UART_IER_BUF_ERR_IEN_Msk (1ul << UART_IER_BUF_ERR_IEN_Pos) /*!< UART_T::IER: BUF_ERR_IEN Mask */ + +#define UART_IER_RTO_IEN_Pos 4 /*!< UART_T::IER: RTO_IEN Position */ +#define UART_IER_RTO_IEN_Msk (1ul << UART_IER_RTO_IEN_Pos) /*!< UART_T::IER: RTO_IEN Mask */ + +#define UART_IER_MODEM_IEN_Pos 3 /*!< UART_T::IER: MODEM_IEN Position */ +#define UART_IER_MODEM_IEN_Msk (1ul << UART_IER_MODEM_IEN_Pos) /*!< UART_T::IER: MODEM_IEN Mask */ + +#define UART_IER_RLS_IEN_Pos 2 /*!< UART_T::IER: RLS_IEN Position */ +#define UART_IER_RLS_IEN_Msk (1ul << UART_IER_RLS_IEN_Pos) /*!< UART_T::IER: RLS_IEN Mask */ + +#define UART_IER_THRE_IEN_Pos 1 /*!< UART_T::IER: THRE_IEN Position */ +#define UART_IER_THRE_IEN_Msk (1ul << UART_IER_THRE_IEN_Pos) /*!< UART_T::IER: THRE_IEN Mask */ + +#define UART_IER_RDA_IEN_Pos 0 /*!< UART_T::IER: RDA_IEN Position */ +#define UART_IER_RDA_IEN_Msk (1ul << UART_IER_RDA_IEN_Pos) /*!< UART_T::IER: RDA_IEN Mask */ + +/* UART FCR Bit Field Definitions */ +#define UART_FCR_RTS_TRI_LEV_Pos 16 /*!< UART_T::FCR: RTS_TRI_LEV Position */ +#define UART_FCR_RTS_TRI_LEV_Msk (0xFul << UART_FCR_RTS_TRI_LEV_Pos) /*!< UART_T::FCR: RTS_TRI_LEV Mask */ + +#define UART_FCR_RX_DIS_Pos 8 /*!< UART_T::FCR: RX_DIS Position */ +#define UART_FCR_RX_DIS_Msk (1ul << UART_FCR_RX_DIS_Pos) /*!< UART_T::FCR: RX_DIS Mask */ + +#define UART_FCR_RFITL_Pos 4 /*!< UART_T::FCR: RFITL Position */ +#define UART_FCR_RFITL_Msk (0xFul << UART_FCR_RFITL_Pos) /*!< UART_T::FCR: RFITL Mask */ + +#define UART_FCR_TFR_Pos 2 /*!< UART_T::FCR: TFR Position */ +#define UART_FCR_TFR_Msk (1ul << UART_FCR_TFR_Pos) /*!< UART_T::FCR: TFR Mask */ + +#define UART_FCR_RFR_Pos 1 /*!< UART_T::FCR: RFR Position */ +#define UART_FCR_RFR_Msk (1ul << UART_FCR_RFR_Pos) /*!< UART_T::FCR: RFR Mask */ + +/* UART LCR Bit Field Definitions */ +#define UART_LCR_BCB_Pos 6 /*!< UART_T::LCR: BCB Position */ +#define UART_LCR_BCB_Msk (1ul << UART_LCR_BCB_Pos) /*!< UART_T::LCR: BCB Mask */ + +#define UART_LCR_SPE_Pos 5 /*!< UART_T::LCR: SPE Position */ +#define UART_LCR_SPE_Msk (1ul << UART_LCR_SPE_Pos) /*!< UART_T::LCR: SPE Mask */ + +#define UART_LCR_EPE_Pos 4 /*!< UART_T::LCR: EPE Position */ +#define UART_LCR_EPE_Msk (1ul << UART_LCR_EPE_Pos) /*!< UART_T::LCR: EPE Mask */ + +#define UART_LCR_PBE_Pos 3 /*!< UART_T::LCR: PBE Position */ +#define UART_LCR_PBE_Msk (1ul << UART_LCR_PBE_Pos) /*!< UART_T::LCR: PBE Mask */ + +#define UART_LCR_NSB_Pos 2 /*!< UART_T::LCR: NSB Position */ +#define UART_LCR_NSB_Msk (1ul << UART_LCR_NSB_Pos) /*!< UART_T::LCR: NSB Mask */ + +#define UART_LCR_WLS_Pos 0 /*!< UART_T::LCR: WLS Position */ +#define UART_LCR_WLS_Msk (0x3ul << UART_LCR_WLS_Pos) /*!< UART_T::LCR: WLS Mask */ + +/* UART MCR Bit Field Definitions */ +#define UART_MCR_RTS_ST_Pos 13 /*!< UART_T::MCR: RTS_ST Position */ +#define UART_MCR_RTS_ST_Msk (1ul << UART_MCR_RTS_ST_Pos) /*!< UART_T::MCR: RTS_ST Mask */ + +#define UART_MCR_LEV_RTS_Pos 9 /*!< UART_T::MCR: LEV_RTS Position */ +#define UART_MCR_LEV_RTS_Msk (1ul << UART_MCR_LEV_RTS_Pos) /*!< UART_T::MCR: LEV_RTS Mask */ + +#define UART_MCR_RTS_Pos 1 /*!< UART_T::MCR: RTS Position */ +#define UART_MCR_RTS_Msk (1ul << UART_MCR_RTS_Pos) /*!< UART_T::MCR: RTS Mask */ + +/* UART MSR Bit Field Definitions */ +#define UART_MSR_LEV_CTS_Pos 8 /*!< UART_T::MSR: LEV_CTS Position */ +#define UART_MSR_LEV_CTS_Msk (1ul << UART_MSR_LEV_CTS_Pos) /*!< UART_T::MSR: LEV_CTS Mask */ + +#define UART_MSR_CTS_ST_Pos 4 /*!< UART_T::MSR: CTS_ST Position */ +#define UART_MSR_CTS_ST_Msk (1ul << UART_MSR_CTS_ST_Pos) /*!< UART_T::MSR: CTS_ST Mask */ + +#define UART_MSR_DCTSF_Pos 0 /*!< UART_T::MSR: DCTST Position */ +#define UART_MSR_DCTSF_Msk (1ul << UART_MSR_DCTSF_Pos) /*!< UART_T::MSR: DCTST Mask */ + + +/* UART FSR Bit Field Definitions */ +#define UART_FSR_TE_FLAG_Pos 28 /*!< UART_T::FSR: TE_FLAG Position */ +#define UART_FSR_TE_FLAG_Msk (1ul << UART_FSR_TE_FLAG_Pos) /*!< UART_T::FSR: TE_FLAG Mask */ + +#define UART_FSR_TX_OVER_IF_Pos 24 /*!< UART_T::FSR: TX_OVER_IF Position */ +#define UART_FSR_TX_OVER_IF_Msk (1ul << UART_FSR_TX_OVER_IF_Pos) /*!< UART_T::FSR: TX_OVER_IF Mask */ + +#define UART_FSR_TX_FULL_Pos 23 /*!< UART_T::FSR: TX_FULL Position */ +#define UART_FSR_TX_FULL_Msk (1ul << UART_FSR_TX_FULL_Pos) /*!< UART_T::FSR: TX_FULL Mask */ + +#define UART_FSR_TX_EMPTY_Pos 22 /*!< UART_T::FSR: TX_EMPTY Position */ +#define UART_FSR_TX_EMPTY_Msk (1ul << UART_FSR_TX_EMPTY_Pos) /*!< UART_T::FSR: TX_EMPTY Mask */ + +#define UART_FSR_TX_POINTER_Pos 16 /*!< UART_T::FSR: TX_POINTER Position */ +#define UART_FSR_TX_POINTER_Msk (0x3Ful << UART_FSR_TX_POINTER_Pos) /*!< UART_T::FSR: TX_POINTER Mask */ + +#define UART_FSR_RX_FULL_Pos 15 /*!< UART_T::FSR: RX_FULL Position */ +#define UART_FSR_RX_FULL_Msk (1ul << UART_FSR_RX_FULL_Pos) /*!< UART_T::FSR: RX_FULL Mask */ + +#define UART_FSR_RX_EMPTY_Pos 14 /*!< UART_T::FSR: RX_EMPTY Position */ +#define UART_FSR_RX_EMPTY_Msk (1ul << UART_FSR_RX_EMPTY_Pos) /*!< UART_T::FSR: RX_EMPTY Mask */ + +#define UART_FSR_RX_POINTER_Pos 8 /*!< UART_T::FSR: RX_POINTERS Position */ +#define UART_FSR_RX_POINTER_Msk (0x3Ful << UART_FSR_RX_POINTER_Pos) /*!< UART_T::FSR: RX_POINTER Mask */ + +#define UART_FSR_BIF_Pos 6 /*!< UART_T::FSR: BIF Position */ +#define UART_FSR_BIF_Msk (1ul << UART_FSR_BIF_Pos) /*!< UART_T::FSR: BIF Mask */ + +#define UART_FSR_FEF_Pos 5 /*!< UART_T::FSR: FEF Position */ +#define UART_FSR_FEF_Msk (1ul << UART_FSR_FEF_Pos) /*!< UART_T::FSR: FEF Mask */ + +#define UART_FSR_PEF_Pos 4 /*!< UART_T::FSR: PEF Position */ +#define UART_FSR_PEF_Msk (1ul << UART_FSR_PEF_Pos) /*!< UART_T::FSR: PEF Mask */ + +#define UART_FSR_RS485_ADD_DETF_Pos 3 /*!< UART_T::FSR: RS485_ADD_DETF Position */ +#define UART_FSR_RS485_ADD_DETF_Msk (1ul << UART_FSR_RS485_ADD_DETF_Pos) /*!< UART_T::FSR: RS485_ADD_DETF Mask */ + +#define UART_FSR_RX_OVER_IF_Pos 0 /*!< UART_T::FSR: RX_OVER_IF Position */ +#define UART_FSR_RX_OVER_IF_Msk (1ul << UART_FSR_RX_OVER_IF_Pos) /*!< UART_T::FSR: RX_OVER_IF Mask */ + +/* UART ISR Bit Field Definitions */ +#define UART_ISR_HW_BUF_ERR_INT_Pos 29 /*!< UART_T::ISR: HW BUF_ERR_INT Position */ +#define UART_ISR_HW_BUF_ERR_INT_Msk (1ul << UART_ISR_HW_BUF_ERR_INT_Pos) /*!< UART_T::ISR: HW BUF_ERR_INT Mask */ + +#define UART_ISR_HW_TOUT_INT_Pos 28 /*!< UART_T::ISR: HW TOUT_INT Position */ +#define UART_ISR_HW_TOUT_INT_Msk (1ul << UART_ISR_HW_TOUT_INT_Pos) /*!< UART_T::ISR: HW TOUT_INT Mask */ + +#define UART_ISR_HW_MODEM_INT_Pos 27 /*!< UART_T::ISR: HW MODEM_INT Position */ +#define UART_ISR_HW_MODEM_INT_Msk (1ul << UART_ISR_HW_MODEM_INT_Pos) /*!< UART_T::ISR: HW MODEM_INT Mask */ + +#define UART_ISR_HW_RLS_INT_Pos 26 /*!< UART_T::ISR: HW RLS_INT Position */ +#define UART_ISR_HW_RLS_INT_Msk (1ul << UART_ISR_HW_RLS_INT_Pos) /*!< UART_T::ISR: HW RLS_INT Position */ + +#define UART_ISR_HW_BUF_ERR_IF_Pos 21 /*!< UART_T::ISR: HW BUF_ERR_IF Position */ +#define UART_ISR_HW_BUF_ERR_IF_Msk (1ul << UART_ISR_HW_BUF_ERR_IF_Pos) /*!< UART_T::ISR: HW BUF_ERR_IF Mask */ + +#define UART_ISR_HW_TOUT_IF_Pos 20 /*!< UART_T::ISR: HW TOUT_IF Position */ +#define UART_ISR_HW_TOUT_IF_Msk (1ul << UART_ISR_HW_TOUT_IFF_Pos) /*!< UART_T::ISR: HW TOUT_IF Mask */ + +#define UART_ISR_HW_MODEM_IF_Pos 19 /*!< UART_T::ISR: HW MODEM_IF Position */ +#define UART_ISR_HW_MODEM_IF_Msk (1ul << UART_ISR_HW_MODEM_IF_Pos) /*!< UART_T::ISR: HW MODEM_IF Mask */ + +#define UART_ISR_HW_RLS_IF_Pos 18 /*!< UART_T::ISR: HW RLS_IF Position */ +#define UART_ISR_HW_RLS_IF_Msk (1ul << UART_ISR_HW_RLS_IF_Pos) /*!< UART_T::ISR: HW RLS_IF Mark */ + +#define UART_ISR_BUF_ERR_INT_Pos 13 /*!< UART_T::ISR: BUF_ERR_INT Position */ +#define UART_ISR_BUF_ERR_INT_Msk (1ul << UART_ISR_BUF_ERR_INT_Pos) /*!< UART_T::ISR: BUF_ERR_INT Mask */ + +#define UART_ISR_TOUT_INT_Pos 12 /*!< UART_T::ISR: TOUT_INT Position */ +#define UART_ISR_TOUT_INT_Msk (1ul << UART_ISR_TOUT_INT_Pos) /*!< UART_T::ISR: TOUT_INT Mask */ + +#define UART_ISR_MODEM_INT_Pos 11 /*!< UART_T::ISR: MODEM_INT Position */ +#define UART_ISR_MODEM_INT_Msk (1ul << UART_ISR_MODEM_INT_Pos) /*!< UART_T::ISR: MODEM_INT Mask */ + +#define UART_ISR_RLS_INT_Pos 10 /*!< UART_T::ISR: RLS_INT Position */ +#define UART_ISR_RLS_INT_Msk (1ul << UART_ISR_RLS_INT_Pos) /*!< UART_T::ISR: RLS_INT Mask */ + +#define UART_ISR_THRE_INT_Pos 9 /*!< UART_T::ISR: THRE_INT Position */ +#define UART_ISR_THRE_INT_Msk (1ul << UART_ISR_THRE_INT_Pos) /*!< UART_T::ISR: THRE_INT Mask */ + +#define UART_ISR_RDA_INT_Pos 8 /*!< UART_T::ISR: RDA_INT Position */ +#define UART_ISR_RDA_INT_Msk (1ul << UART_ISR_RDA_INT_Pos) /*!< UART_T::ISR: RDA_INT Mask */ + +#define UART_ISR_BUF_ERR_IF_Pos 5 /*!< UART_T::ISR: BUF_ERR_IF Position */ +#define UART_ISR_BUF_ERR_IF_Msk (1ul << UART_ISR_BUF_ERR_IF_Pos) /*!< UART_T::ISR: BUF_ERR_IF Mask */ + +#define UART_ISR_TOUT_IF_Pos 4 /*!< UART_T::ISR: TOUT_IF Position */ +#define UART_ISR_TOUT_IF_Msk (1ul << UART_ISR_TOUT_IF_Pos) /*!< UART_T::ISR: TOUT_IF Mask */ + +#define UART_ISR_MODEM_IF_Pos 3 /*!< UART_T::ISR: MODEM_IF Position */ +#define UART_ISR_MODEM_IF_Msk (1ul << UART_ISR_MODEM_IF_Pos) /*!< UART_T::ISR: MODEM_IF Mask */ + +#define UART_ISR_RLS_IF_Pos 2 /*!< UART_T::ISR: RLS_IF Position */ +#define UART_ISR_RLS_IF_Msk (1ul << UART_ISR_RLS_IF_Pos) /*!< UART_T::ISR: RLS_IF Mask */ + +#define UART_ISR_THRE_IF_Pos 1 /*!< UART_T::ISR: THRE_IF Position */ +#define UART_ISR_THRE_IF_Msk (1ul << UART_ISR_THRE_IF_Pos) /*!< UART_T::ISR: THRE_IF Mask */ + +#define UART_ISR_RDA_IF_Pos 0 /*!< UART_T::ISR: RDA_IF Position */ +#define UART_ISR_RDA_IF_Msk (1ul << UART_ISR_RDA_IF_Pos) /*!< UART_T::ISR: RDA_IF Mask */ + + +/* UART TOR Bit Field Definitions */ +#define UART_TOR_DLY_Pos 8 /*!< UART_T::TOR: DLY Position */ +#define UART_TOR_DLY_Msk (0xFFul << UART_TOR_DLY_Pos) /*!< UART_T::TOR: DLY Mask */ + +#define UART_TOR_TOIC_Pos 0 /*!< UART_T::TOR: TOIC Position */ +#define UART_TOR_TOIC_Msk (0xFFul << UART_TOR_TOIC_Pos) + +/* UART BAUD Bit Field Definitions */ +#define UART_BAUD_DIV_X_EN_Pos 29 /*!< UART_T::BAUD: DIV_X_EN Position */ +#define UART_BAUD_DIV_X_EN_Msk (1ul << UART_BAUD_DIV_X_EN_Pos) /*!< UART_T::BAUD: DIV_X_EN Mask */ + +#define UART_BAUD_DIV_X_ONE_Pos 28 /*!< UART_T::BAUD: DIV_X_ONE Position */ +#define UART_BAUD_DIV_X_ONE_Msk (1ul << UART_BAUD_DIV_X_ONE_Pos) /*!< UART_T::BAUD: DIV_X_ONE Mask */ + +#define UART_BAUD_DIVIDER_X_Pos 24 /*!< UART_T::BAUD: DIVIDER_X Position */ +#define UART_BAUD_DIVIDER_X_Msk (0xFul << UART_BAUD_DIVIDER_X_Pos) /*!< UART_T::BAUD: DIVIDER_X Mask */ + +#define UART_BAUD_BRD_Pos 0 /*!< UART_T::BAUD: BRD Position */ +#define UART_BAUD_BRD_Msk (0xFFFFul << UART_BAUD_BRD_Pos) /*!< UART_T::BAUD: BRD Mask */ + +/* UART IRCR Bit Field Definitions */ +#define UART_IRCR_INV_RX_Pos 6 /*!< UART_T::IRCR: INV_RX Position */ +#define UART_IRCR_INV_RX_Msk (1ul << UART_IRCR_INV_RX_Pos) /*!< UART_T::IRCR: INV_RX Mask */ + +#define UART_IRCR_INV_TX_Pos 5 /*!< UART_T::IRCR: INV_TX Position */ +#define UART_IRCR_INV_TX_Msk (1ul << UART_IRCR_INV_TX_Pos) /*!< UART_T::IRCR: INV_TX Mask */ + +#define UART_IRCR_TX_SELECT_Pos 1 /*!< UART_T::IRCR: TX_SELECT Position */ +#define UART_IRCR_TX_SELECT_Msk (1ul << UART_IRCR_TX_SELECT_Pos) /*!< UART_T::IRCR: TX_SELECT Mask */ + +/* UART ALT_CSR Bit Field Definitions */ +#define UART_ALT_CSR_ADDR_MATCH_Pos 24 /*!< UART_T::ALT_CSR: ADDR_MATCH Position */ +#define UART_ALT_CSR_ADDR_MATCH_Msk (0xFFul << UART_ALT_CSR_ADDR_MATCH_Pos) /*!< UART_T::ALT_CSR: ADDR_MATCH Mask */ + +#define UART_ALT_CSR_RS485_ADD_EN_Pos 15 /*!< UART_T::ALT_CSR: RS485_ADD_EN Position */ +#define UART_ALT_CSR_RS485_ADD_EN_Msk (1ul << UART_ALT_CSR_RS485_ADD_EN_Pos) /*!< UART_T::ALT_CSR: RS485_ADD_EN Mask */ + +#define UART_ALT_CSR_RS485_AUD_Pos 10 /*!< UART_T::ALT_CSR: RS485_AUD Position */ +#define UART_ALT_CSR_RS485_AUD_Msk (1ul << UART_ALT_CSR_RS485_AUD_Pos) /*!< UART_T::ALT_CSR: RS485_AUD Mask */ + +#define UART_ALT_CSR_RS485_AAD_Pos 9 /*!< UART_T::ALT_CSR: RS485_AAD Position */ +#define UART_ALT_CSR_RS485_AAD_Msk (1ul << UART_ALT_CSR_RS485_AAD_Pos) /*!< UART_T::ALT_CSR: RS485_AAD Mask */ + +#define UART_ALT_CSR_RS485_NMM_Pos 8 /*!< UART_T::ALT_CSR: RS485_NMM Position */ +#define UART_ALT_CSR_RS485_NMM_Msk (1ul << UART_ALT_CSR_RS485_NMM_Pos) /*!< UART_T::ALT_CSR: RS485_NMM Mask */ + +/* UART FUN_SEL Bit Field Definitions */ +#define UART_FUN_SEL_FUN_SEL_Pos 0 /*!< UART_T::FUN_SEL: FUN_SEL Position */ +#define UART_FUN_SEL_FUN_SEL_Msk (0x3ul << UART_FUN_SEL_FUN_SEL_Pos) /*!< UART_T::FUN_SEL: FUN_SEL Mask */ + +/*@}*/ /* end of group REG_UART_BITMASK */ +/*@}*/ /* end of group REG_UART */ + +/*--------------------------- USB Device Controller --------------------------*/ +/** @addtogroup REG_USBD Universal Serial Bus Device Controller (USBD) + Memory Mapped Structure for USB Device Controller + @{ + */ + + +typedef struct +{ + + +/** + * @var USBD_EP_T::BUFSEG + * Offset: 0x500/0x510/0x520/0x530/0x540/0x550/0x560/0x570 Endpoint 0~7 Buffer Segmentation Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[8:3] |BUFSEG |Endpoint Buffer Segmentation + * | | |It is used to indicate the offset address for each endpoint with the USB SRAM starting address The effective starting address of the endpoint is + * | | |USB_SRAM address + { BUFSEG[8:3], 3'b000} + * | | |Where the USB_SRAM address = USBD_BA+0x100h. + * @var USBD_EP_T::MXPLD + * Offset: 0x504/0x514/0x524/0x534/0x544/0x554/0x564/0x574 Endpoint 0~7 Maximal Payload Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[8:0] |MXPLD |Maximal Payload + * | | |Define the data length which is transmitted to host (IN token) or the actual data length which is received from the host (OUT token). + * | | |It also used to indicate that the endpoint is ready to be transmitted in IN token or received in OUT token. + * | | |(1) When the register is written by CPU, + * | | |For IN token, the value of MXPLD is used to define the data length to be transmitted and indicate the data buffer is ready. + * | | |For OUT token, it means that the controller is ready to receive data from the host and the value of MXPLD is the maximal data length comes from host. + * | | |(2) When the register is read by CPU, + * | | |For IN token, the value of MXPLD is indicated by the data length be transmitted to host + * | | |For OUT token, the value of MXPLD is indicated the actual data length receiving from host. + * | | |Note: Once MXPLD is written, the data packets will be transmitted/received immediately after IN/OUT token arrived. + * @var USBD_EP_T::CFG + * Offset: 0x508/0x518/0x528/0x538/0x548/0x558/0x568/0x578 Endpoint 0~7 Configuration Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |EP_NUM |Endpoint Number + * | | |These bits are used to define the endpoint number of the current endpoint. + * |[4] |ISOCH |Isochronous Endpoint + * | | |This bit is used to set the endpoint as Isochronous endpoint, no handshake. + * | | |0 = No Isochronous endpoint. + * | | |1 = Isochronous endpoint. + * |[6:5] |STATE |Endpoint STATE + * | | |00 = Endpoint is Disabled. + * | | |01 = Out endpoint. + * | | |10 = IN endpoint. + * | | |11 = Undefined. + * |[7] |DSQ_SYNC |Data Sequence Synchronization + * | | |0 = DATA0 PID. + * | | |1 = DATA1 PID. + * | | |Note: It is used to specify the DATA0 or DATA1 PID in the following IN token transaction. + * | | |Hardware will toggle automatically in IN token base on the bit. + * |[9] |CSTALL |Clear STALL Response + * | | |0 = Disable the device to clear the STALL handshake in setup stage. + * | | |1 = Clear the device to response STALL handshake in setup stage. + * @var USBD_EP_T::CFGP + * Offset: 0x50C/0x51C/0x52C/0x53C/0x54C/0x55C/0x56C/0x57C Endpoint 0~7 Set Stall and Clear In/Out Ready Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CLRRDY |Clear Ready + * | | |When the USB_MXPLD register is set by user, it means that the endpoint is ready to transmit or receive data. + * | | |If the user wants to turn off this transaction before the transaction start, users can set this bit to 1 to turn it off and it will be cleared to 0 automatically. + * | | |For IN token, write '1' to clear the IN token had ready to transmit the data to USB. + * | | |For OUT token, write '1' to clear the OUT token had ready to receive the data from USB. + * | | |This bit is write 1 only and is always 0 when it is read back. + * |[1] |SSTALL |Set STALL + * | | |0 = Disable the device to response STALL. + * | | |1 = Set the device to respond STALL automatically. + */ + + __IO uint32_t BUFSEG; /* Offset: 0x500/0x510/0x520/0x530/0x540/0x550/0x560/0x570 Endpoint 0~7 Buffer Segmentation Register */ + __IO uint32_t MXPLD; /* Offset: 0x504/0x514/0x524/0x534/0x544/0x554/0x564/0x574 Endpoint 0~7 Maximal Payload Register */ + __IO uint32_t CFG; /* Offset: 0x508/0x518/0x528/0x538/0x548/0x558/0x568/0x578 Endpoint 0~7 Configuration Register */ + __IO uint32_t CFGP; /* Offset: 0x50C/0x51C/0x52C/0x53C/0x54C/0x55C/0x56C/0x57C Endpoint 0~7 Set Stall and Clear In/Out Ready Control Register */ + +} USBD_EP_T; + + + + + +typedef struct +{ + + +/** + * @var USBD_T::INTEN + * Offset: 0x00 USB Interrupt Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |BUS_IE |Bus Event Interrupt Enable + * | | |0 = BUS event interrupt Disabled. + * | | |1 = BUS event interrupt Enabled. + * |[1] |USB_IE |USB Event Interrupt Enable + * | | |0 = USB event interrupt Disabled. + * | | |1 = USB event interrupt Enabled. + * |[2] |FLDET_IE |Floating Detection Interrupt Enable + * | | |0 = Floating detection Interrupt Disabled. + * | | |1 = Floating detection Interrupt Enabled. + * |[3] |WAKEUP_IE |USB Wake-Up Interrupt Enable + * | | |0 = Wake-up Interrupt Disabled. + * | | |1 = Wake-up Interrupt Enabled. + * |[8] |WAKEUP_EN |Wake-Up Function Enable + * | | |0 = USB wake-up function Disabled. + * | | |1 = USB wake-up function Enabled. + * |[15] |INNAK_EN |Active NAK Function And Its Status In IN Token + * | | |0 = When device responds NAK after receiving IN token, IN NAK status will not be + * | | | updated to USBD_EPSTS register, so that the USB interrupt event will not be asserted. + * | | |1 = IN NAK status will be updated to USBD_EPSTS register and the USB interrupt event + * | | | will be asserted, when the device responds NAK after receiving IN token. + * @var USBD_T::INTSTS + * Offset: 0x04 USB Interrupt Event Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |BUS_STS |BUS Interrupt Status + * | | |The BUS event means that there is one of the suspense or the resume function in the bus. + * | | |0 = No BUS event occurred. + * | | |1 = Bus event occurred; check USB_ATTR[3:0] to know which kind of bus event was occurred, cleared by write 1 to USB_INTSTS[0]. + * |[1] |USB_STS |USB Event Interrupt Status + * | | |The USB event includes the SETUP Token, IN Token, OUT ACK, ISO IN, or ISO OUT events in the bus. + * | | |0 = No USB event occurred. + * | | |1 = USB event occurred, check EPSTS0~7 to know which kind of USB event occurred. + * | | |Cleared by write 1 to USB_INTSTS[1] or EPEVT0~7 and SETUP (USB_INTSTS[31]). + * |[2] |FLDET_STS |Floating Detection Interrupt Status + * | | |0 = There is not attached/detached event in the USB. + * | | |1 = There is attached/detached event in the USB bus and it is cleared by write 1 to USB_INTSTS[2]. + * |[3] |WAKEUP_STS|Wake-Up Interrupt Status + * | | |0 = No Wake-up event occurred. + * | | |1 = Wake-up event occurred, cleared by write 1 to USB_INTSTS[3]. + * |[16] |EPEVT0 |Endpoint 0's USB Event Status + * | | |0 = No event occurred on endpoint 0. + * | | |1 = USB event occurred on Endpoint 0, check USB_EPSTS[10:8] to know which kind of USB event was occurred, cleared by write 1 to USB_INTSTS[16] or USB_INTSTS[1]. + * |[17] |EPEVT1 |Endpoint 1's USB Event Status + * | | |0 = No event occurred on endpoint 1. + * | | |1 = USB event occurred on Endpoint 1, check USB_EPSTS[13:11] to know which kind of USB event was occurred, cleared by write 1 to USB_INTSTS[17] or USB_INTSTS[1]. + * |[18] |EPEVT2 |Endpoint 2's USB Event Status + * | | |0 = No event occurred on endpoint 2. + * | | |1 = USB event occurred on Endpoint 2, check USB_EPSTS[16:14] to know which kind of USB event was occurred, cleared by write 1 to USB_INTSTS[18] or USB_INTSTS[1]. + * |[19] |EPEVT3 |Endpoint 3's USB Event Status + * | | |0 = No event occurred on endpoint 3. + * | | |1 = USB event occurred on Endpoint 3, check USB_EPSTS[19:17] to know which kind of USB event was occurred, cleared by write 1 to USB_INTSTS[19] or USB_INTSTS[1]. + * |[20] |EPEVT4 |Endpoint 4's USB Event Status + * | | |0 = No event occurred on endpoint 4. + * | | |1 = USB event occurred on Endpoint 4, check USB_EPSTS[22:20] to know which kind of USB event was occurred, cleared by write 1 to USB_INTSTS[20] or USB_INTSTS[1]. + * |[21] |EPEVT5 |Endpoint 5's USB Event Status + * | | |0 = No event occurred on endpoint 5. + * | | |1 = USB event occurred on Endpoint 5, check USB_EPSTS[25:23] to know which kind of USB event was occurred, cleared by write 1 to USB_INTSTS[21] or USB_INTSTS[1]. + * |[22] |EPEVT6 |Endpoint 6's USB Event Status + * | | |0 = No event occurred on endpoint 6. + * | | |1 = USB event occurred on Endpoint 6, check USB_EPSTS[28:26] to know which kind of USB event was occurred, cleared by write 1 to USB_INTSTS[22] or USB_INTSTS[1]. + * |[23] |EPEVT7 |Endpoint 7's USB Event Status + * | | |0 = No event occurred on endpoint 7. + * | | |1 = USB event occurred on Endpoint 7, check USB_EPSTS[31:29] to know which kind of USB event was occurred, cleared by write 1 to USB_INTSTS[23] or USB_INTSTS[1]. + * |[31] |SETUP |Setup Event Status + * | | |0 = No Setup event. + * | | |1 = SETUP event occurred, cleared by write 1 to USB_INTSTS[31]. + * @var USBD_T::FADDR + * Offset: 0x08 USB Device Function Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[6:0] |FADDR |USB Device Function Address + * @var USBD_T::EPSTS + * Offset: 0x0C USB Endpoint Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7] |OVERRUN |Overrun + * | | |It indicates that the received data is over the maximum payload number or not. + * | | |0 = No overrun. + * | | |1 = Out Data is more than the Max Payload in MXPLD register or the Setup Data is more than 8 Bytes. + * |[10:8] |EPSTS0 |Endpoint 0 Bus Status + * | | |These bits are used to indicate the current status of this endpoint + * | | |000 = In ACK. + * | | |001 = In NAK. + * | | |010 = Out Packet Data0 ACK. + * | | |110 = Out Packet Data1 ACK. + * | | |011 = Setup ACK. + * | | |111 = Isochronous transfer end. + * |[13:11] |EPSTS1 |Endpoint 1 Bus Status + * | | |These bits are used to indicate the current status of this endpoint + * | | |000 = In ACK. + * | | |001 = In NAK. + * | | |010 = Out Packet Data0 ACK. + * | | |110 = Out Packet Data1 ACK. + * | | |011 = Setup ACK. + * | | |111 = Isochronous transfer end. + * |[16:14] |EPSTS2 |Endpoint 2 Bus Status + * | | |These bits are used to indicate the current status of this endpoint + * | | |000 = In ACK. + * | | |001 = In NAK. + * | | |010 = Out Packet Data0 ACK. + * | | |110 = Out Packet Data1 ACK. + * | | |011 = Setup ACK. + * | | |111 = Isochronous transfer end. + * |[19:17] |EPSTS3 |Endpoint 3 Bus Status + * | | |These bits are used to indicate the current status of this endpoint + * | | |000 = In ACK. + * | | |001 = In NAK. + * | | |010 = Out Packet Data0 ACK. + * | | |110 = Out Packet Data1 ACK. + * | | |011 = Setup ACK. + * | | |111 = Isochronous transfer end. + * |[22:20] |EPSTS4 |Endpoint 4 Bus Status + * | | |These bits are used to indicate the current status of this endpoint + * | | |000 = In ACK. + * | | |001 = In NAK. + * | | |010 = Out Packet Data0 ACK. + * | | |110 = Out Packet Data1 ACK. + * | | |011 = Setup ACK. + * | | |111 = Isochronous transfer end. + * |[25:23] |EPSTS5 |Endpoint 5 Bus Status + * | | |These bits are used to indicate the current status of this endpoint + * | | |000 = In ACK. + * | | |001 = In NAK. + * | | |010 = Out Packet Data0 ACK. + * | | |110 = Out Packet Data1 ACK. + * | | |011 = Setup ACK. + * | | |111 = Isochronous transfer end. + * |[28:26] |EPSTS6 |Endpoint 6 Bus Status + * | | |These bits are used to indicate the current status of this endpoint + * | | |000 = In ACK. + * | | |001 = In NAK. + * | | |010 = Out Packet Data0 ACK. + * | | |110 = Out Packet Data1 ACK. + * | | |011 = Setup ACK. + * | | |111 = Isochronous transfer end. + * |[31:29] |EPSTS7 |Endpoint 7 Bus Status + * | | |These bits are used to indicate the current status of this endpoint + * | | |000 = In ACK. + * | | |001 = In NAK. + * | | |010 = Out Packet Data0 ACK. + * | | |110 = Out Packet Data1 ACK. + * | | |011 = Setup ACK. + * | | |111 = Isochronous transfer end. + * @var USBD_T::ATTR + * Offset: 0x10 USB Bus Status and Attribution Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |USBRST |USB Reset Status + * | | |0 = Bus no reset. + * | | |1 = Bus reset when SE0 (single-ended 0) is presented more than 2.5us. + * | | |Note: This bit is read only. + * |[1] |SUSPEND |Suspend Status + * | | |0 = Bus no suspend. + * | | |1 = Bus idle more than 3ms, either cable is plugged off or host is sleeping. + * | | |Note: This bit is read only. + * |[2] |RESUME |Resume Status + * | | |0 = No bus resume. + * | | |1 = Resume from suspend. + * | | |Note: This bit is read only. + * |[3] |TIMEOUT |Time-Out Status + * | | |0 = No time-out. + * | | |1 = No Bus response more than 18 bits time. + * | | |Note: This bit is read only. + * |[4] |PHY_EN |PHY Transceiver Function Enable + * | | |0 = PHY transceiver function Disabled. + * | | |1 = PHY transceiver function Enabled. + * |[5] |RWAKEUP |Remote Wake-Up + * | | |0 = Release the USB bus from K state. + * | | |1 = Force USB bus to K (USB_D+ low, USB_D- high) state, used for remote wake-up. + * |[7] |USB_EN |USB Controller Enable + * | | |0 = USB Controller Disabled. + * | | |1 = USB Controller Enabled. + * |[8] |DPPU_EN |Pull-Up Resistor On USB_D+ Enable + * | | |0 = Pull-up resistor in USB_D+ pin Disabled. + * | | |1 = Pull-up resistor in USB_D+ pin Enabled. + * |[9] |PWRDN |Power-Down PHY Transceiver, Low Active + * | | |0 = Power-down related circuit of PHY transceiver. + * | | |1 = Turn-on related circuit of PHY transceiver. + * |[10] |BYTEM |CPU Access USB SRAM Size Mode Selection + * | | |0 = Word mode: The size of the transfer from CPU to USB SRAM can be Word only. + * | | |1 = Byte mode: The size of the transfer from CPU to USB SRAM can be Byte only. + * @var USBD_T::FLDET + * Offset: 0x14 USB Floating Detection Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |FLDET |Device Floating Detected + * | | |0 = Controller is not attached into the USB host. + * | | |1 =Controller is attached into the BUS. + * @var USBD_T::STBUFSEG + * Offset: 0x18 Setup Token Buffer Segmentation Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[8:3] |STBUFSEG |Setup Token Buffer Segmentation + * | | |It is used to indicate the offset address for the SETUP token with the USB Device SRAM starting address The effective starting address is + * | | |USB_SRAM address + {STBUFSEG[8:3], 3'b000} + * | | |Where the USB_SRAM address = USBD_BA+0x100h. + * | | |Note: It is used for SETUP token only. + * @var USBD_T::DRVSE0 + * Offset: 0x90 USB Drive SE0 Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DRVSE0 |Drive Single Ended Zero In USB Bus + * | | |The Single Ended Zero (SE0) is when both lines (USB_D+ and USB_D-) are being pulled low. + * | | |0 = None. + * | | |1 = Force USB PHY transceiver to drive SE0. + */ + + __IO uint32_t INTEN; /* Offset: 0x00 USB Interrupt Enable Register */ + __IO uint32_t INTSTS; /* Offset: 0x04 USB Interrupt Event Status Register */ + __IO uint32_t FADDR; /* Offset: 0x08 USB Device Function Address Register */ + __I uint32_t EPSTS; /* Offset: 0x0C USB Endpoint Status Register */ + __IO uint32_t ATTR; /* Offset: 0x10 USB Bus Status and Attribution Register */ + __I uint32_t FLDET; /* Offset: 0x14 USB Floating Detection Register */ + __IO uint32_t STBUFSEG; /* Offset: 0x18 Setup Token Buffer Segmentation Register */ + __I uint32_t RESERVE0[29]; + __IO uint32_t DRVSE0; /* Offset: 0x90 USB Drive SE0 Control Register */ + __I uint32_t RESERVE2[283]; + USBD_EP_T EP[8]; /* Offset: 0x500 Endpoint 0~7 Control Registers */ + +} USBD_T; + + + + +/** @addtogroup REG_USBD_BITMASK USBD Bit Mask + @{ + */ + +/* USBD INTEN Bit Field Definitions */ +#define USBD_INTEN_INNAK_EN_Pos 15 /*!< USBD_T::INTEN: INNAK_EN Position */ +#define USBD_INTEN_INNAK_EN_Msk (1ul << USBD_INTEN_INNAK_EN_Pos) /*!< USBD_T::INTEN: INNAK_EN Mask */ + +#define USBD_INTEN_WAKEUP_EN_Pos 8 /*!< USBD_T::INTEN: RWAKEUP Position */ +#define USBD_INTEN_WAKEUP_EN_Msk (1ul << USBD_INTEN_WAKEUP_EN_Pos) /*!< USBD_T::INTEN: RWAKEUP Mask */ + +#define USBD_INTEN_WAKEUP_IE_Pos 3 /*!< USBD_T::INTEN: WAKEUP_IE Position */ +#define USBD_INTEN_WAKEUP_IE_Msk (1ul << USBD_INTEN_WAKEUP_IE_Pos) /*!< USBD_T::INTEN: WAKEUP_IE Mask */ + +#define USBD_INTEN_FLDET_IE_Pos 2 /*!< USBD_T::INTEN: FLDET_IE Position */ +#define USBD_INTEN_FLDET_IE_Msk (1ul << USBD_INTEN_FLDET_IE_Pos) /*!< USBD_T::INTEN: FLDET_IE Mask */ + +#define USBD_INTEN_USB_IE_Pos 1 /*!< USBD_T::INTEN: USB_IE Position */ +#define USBD_INTEN_USB_IE_Msk (1ul << USBD_INTEN_USB_IE_Pos) /*!< USBD_T::INTEN: USB_IE Mask */ + +#define USBD_INTEN_BUS_IE_Pos 0 /*!< USBD_T::INTEN: BUS_IE Position */ +#define USBD_INTEN_BUS_IE_Msk (1ul << USBD_INTEN_BUS_IE_Pos) /*!< USBD_T::INTEN: BUS_IE Mask */ + +/* USBD INTSTS Bit Field Definitions */ +#define USBD_INTSTS_SETUP_Pos 31 /*!< USBD_T::INTSTS: SETUP Position */ +#define USBD_INTSTS_SETUP_Msk (1ul << USBD_INTSTS_SETUP_Pos) /*!< USBD_T::INTSTS: SETUP Mask */ + +#define USBD_INTSTS_EPEVT7_Pos 23 /*!< USBD_T::INTSTS: EPEVT7 Position */ +#define USBD_INTSTS_EPEVT7_Msk (0x1ul << USBD_INTSTS_EPEVT7_Pos) /*!< USBD_T::INTSTS: EPEVT7 Mask */ + +#define USBD_INTSTS_EPEVT6_Pos 22 /*!< USBD_T::INTSTS: EPEVT6 Position */ +#define USBD_INTSTS_EPEVT6_Msk (0x1ul << USBD_INTSTS_EPEVT6_Pos) /*!< USBD_T::INTSTS: EPEVT6 Mask */ + +#define USBD_INTSTS_EPEVT5_Pos 21 /*!< USBD_T::INTSTS: EPEVT5 Position */ +#define USBD_INTSTS_EPEVT5_Msk (0x1ul << USBD_INTSTS_EPEVT5_Pos) /*!< USBD_T::INTSTS: EPEVT5 Mask */ + +#define USBD_INTSTS_EPEVT4_Pos 20 /*!< USBD_T::INTSTS: EPEVT4 Position */ +#define USBD_INTSTS_EPEVT4_Msk (0x1ul << USBD_INTSTS_EPEVT4_Pos) /*!< USBD_T::INTSTS: EPEVT4 Mask */ + +#define USBD_INTSTS_EPEVT3_Pos 19 /*!< USBD_T::INTSTS: EPEVT3 Position */ +#define USBD_INTSTS_EPEVT3_Msk (0x1ul << USBD_INTSTS_EPEVT3_Pos) /*!< USBD_T::INTSTS: EPEVT3 Mask */ + +#define USBD_INTSTS_EPEVT2_Pos 18 /*!< USBD_T::INTSTS: EPEVT2 Position */ +#define USBD_INTSTS_EPEVT2_Msk (0x1ul << USBD_INTSTS_EPEVT2_Pos) /*!< USBD_T::INTSTS: EPEVT2 Mask */ + +#define USBD_INTSTS_EPEVT1_Pos 17 /*!< USBD_T::INTSTS: EPEVT1 Position */ +#define USBD_INTSTS_EPEVT1_Msk (0x1ul << USBD_INTSTS_EPEVT1_Pos) /*!< USBD_T::INTSTS: EPEVT1 Mask */ + +#define USBD_INTSTS_EPEVT0_Pos 16 /*!< USBD_T::INTSTS: EPEVT0 Position */ +#define USBD_INTSTS_EPEVT0_Msk (0x1ul << USBD_INTSTS_EPEVT0_Pos) /*!< USBD_T::INTSTS: EPEVT0 Mask */ + +#define USBD_INTSTS_WAKEUP_STS_Pos 3 /*!< USBD_T::INTSTS: WAKEUP_STS Position */ +#define USBD_INTSTS_WAKEUP_STS_Msk (1ul << USBD_INTSTS_WAKEUP_STS_Pos) /*!< USBD_T::INTSTS: WAKEUP_STS Mask */ + +#define USBD_INTSTS_FLDET_STS_Pos 2 /*!< USBD_T::INTSTS: FLDET_STS Position */ +#define USBD_INTSTS_FLDET_STS_Msk (1ul << USBD_INTSTS_FLDET_STS_Pos) /*!< USBD_T::INTSTS: FLDET_STS Mask */ + +#define USBD_INTSTS_USB_STS_Pos 1 /*!< USBD_T::INTSTS: USB_STS Position */ +#define USBD_INTSTS_USB_STS_Msk (1ul << USBD_INTSTS_USB_STS_Pos) /*!< USBD_T::INTSTS: USB_STS Mask */ + +#define USBD_INTSTS_BUS_STS_Pos 0 /*!< USBD_T::INTSTS: BUS_STS Position */ +#define USBD_INTSTS_BUS_STS_Msk (1ul << USBD_INTSTS_BUS_STS_Pos) /*!< USBD_T::INTSTS: BUS_STS Mask */ + +/* USBD FADDR Bit Field Definitions */ +#define USBD_FADDR_FADDR_Pos 0 /*!< USBD_T::FADDR: FADDR Position */ +#define USBD_FADDR_FADDR_Msk (0x7Ful << USBD_FADDR_FADDR_Pos) /*!< USBD_T::FADDR: FADDR Mask */ + +/* USBD EPSTS Bit Field Definitions */ +#define USBD_EPSTS_EPSTS7_Pos 29 /*!< USBD_T::EPSTS: EPSTS7 Position */ +#define USBD_EPSTS_EPSTS7_Msk (7ul << USBD_EPSTS_EPSTS7_Pos) /*!< USBD_T::EPSTS: EPSTS7 Mask */ + +#define USBD_EPSTS_EPSTS6_Pos 26 /*!< USBD_T::EPSTS: EPSTS6 Position */ +#define USBD_EPSTS_EPSTS6_Msk (7ul << USBD_EPSTS_EPSTS6_Pos) /*!< USBD_T::EPSTS: EPSTS6 Mask */ + +#define USBD_EPSTS_EPSTS5_Pos 23 /*!< USBD_T::EPSTS: EPSTS5 Position */ +#define USBD_EPSTS_EPSTS5_Msk (7ul << USBD_EPSTS_EPSTS5_Pos) /*!< USBD_T::EPSTS: EPSTS5 Mask */ + +#define USBD_EPSTS_EPSTS4_Pos 20 /*!< USBD_T::EPSTS: EPSTS4 Position */ +#define USBD_EPSTS_EPSTS4_Msk (7ul << USBD_EPSTS_EPSTS4_Pos) /*!< USBD_T::EPSTS: EPSTS4 Mask */ + +#define USBD_EPSTS_EPSTS3_Pos 17 /*!< USBD_T::EPSTS: EPSTS3 Position */ +#define USBD_EPSTS_EPSTS3_Msk (7ul << USBD_EPSTS_EPSTS3_Pos) /*!< USBD_T::EPSTS: EPSTS3 Mask */ + +#define USBD_EPSTS_EPSTS2_Pos 14 /*!< USBD_T::EPSTS: EPSTS2 Position */ +#define USBD_EPSTS_EPSTS2_Msk (7ul << USBD_EPSTS_EPSTS2_Pos) /*!< USBD_T::EPSTS: EPSTS2 Mask */ + +#define USBD_EPSTS_EPSTS1_Pos 11 /*!< USBD_T::EPSTS: EPSTS1 Position */ +#define USBD_EPSTS_EPSTS1_Msk (7ul << USBD_EPSTS_EPSTS1_Pos) /*!< USBD_T::EPSTS: EPSTS1 Mask */ + +#define USBD_EPSTS_EPSTS0_Pos 8 /*!< USBD_T::EPSTS: EPSTS0 Position */ +#define USBD_EPSTS_EPSTS0_Msk (7ul << USBD_EPSTS_EPSTS0_Pos) /*!< USBD_T::EPSTS: EPSTS0 Mask */ + +#define USBD_EPSTS_OVERRUN_Pos 7 /*!< USBD_T::EPSTS: OVERRUN Position */ +#define USBD_EPSTS_OVERRUN_Msk (1ul << USBD_EPSTS_OVERRUN_Pos) /*!< USBD_T::EPSTS: OVERRUN Mask */ + +/* USBD ATTR Bit Field Definitions */ +#define USBD_ATTR_BYTEM_Pos 10 /*!< USBD_T::ATTR: BYTEM Position */ +#define USBD_ATTR_BYTEM_Msk (1ul << USBD_ATTR_BYTEM_Pos) /*!< USBD_T::ATTR: BYTEM Mask */ + +#define USBD_ATTR_PWRDN_Pos 9 /*!< USBD_T::ATTR: PWRDN Position */ +#define USBD_ATTR_PWRDN_Msk (1ul << USBD_ATTR_PWRDN_Pos) /*!< USBD_T::ATTR: PWRDN Mask */ + +#define USBD_ATTR_DPPU_EN_Pos 8 /*!< USBD_T::ATTR: DPPU_EN Position */ +#define USBD_ATTR_DPPU_EN_Msk (1ul << USBD_ATTR_DPPU_EN_Pos) /*!< USBD_T::ATTR: DPPU_EN Mask */ + +#define USBD_ATTR_USB_EN_Pos 7 /*!< USBD_T::ATTR: USB_EN Position */ +#define USBD_ATTR_USB_EN_Msk (1ul << USBD_ATTR_USB_EN_Pos) /*!< USBD_T::ATTR: USB_EN Mask */ + +#define USBD_ATTR_RWAKEUP_Pos 5 /*!< USBD_T::ATTR: RWAKEUP Position */ +#define USBD_ATTR_RWAKEUP_Msk (1ul << USBD_ATTR_RWAKEUP_Pos) /*!< USBD_T::ATTR: RWAKEUP Mask */ + +#define USBD_ATTR_PHY_EN_Pos 4 /*!< USBD_T::ATTR: PHY_EN Position */ +#define USBD_ATTR_PHY_EN_Msk (1ul << USBD_ATTR_PHY_EN_Pos) /*!< USBD_T::ATTR: PHY_EN Mask */ + +#define USBD_ATTR_TIMEOUT_Pos 3 /*!< USBD_T::ATTR: TIMEOUT Position */ +#define USBD_ATTR_TIMEOUT_Msk (1ul << USBD_ATTR_TIMEOUT_Pos) /*!< USBD_T::ATTR: TIMEOUT Mask */ + +#define USBD_ATTR_RESUME_Pos 2 /*!< USBD_T::ATTR: RESUME Position */ +#define USBD_ATTR_RESUME_Msk (1ul << USBD_ATTR_RESUME_Pos) /*!< USBD_T::ATTR: RESUME Mask */ + +#define USBD_ATTR_SUSPEND_Pos 1 /*!< USBD_T::ATTR: SUSPEND Position */ +#define USBD_ATTR_SUSPEND_Msk (1ul << USBD_ATTR_SUSPEND_Pos) /*!< USBD_T::ATTR: SUSPEND Mask */ + +#define USBD_ATTR_USBRST_Pos 0 /*!< USBD_T::ATTR: USBRST Position */ +#define USBD_ATTR_USBRST_Msk (1ul << USBD_ATTR_USBRST_Pos) /*!< USBD_T::ATTR: USBRST Mask */ + +/* USBD FLDET Bit Field Definitions */ +#define USBD_FLDET_FLDET_Pos 0 /*!< USBD_T::FLDET: FLDET Position */ +#define USBD_FLDET_FLDET_Msk (1ul << USBD_FLDET_FLDET_Pos) /*!< USBD_T::FLDET: FLDET Mask */ + +/* USBD STBUFSEG Bit Field Definitions */ +#define USBD_STBUFSEG_STBUFSEG_Pos 3 /*!< USBD_T::STBUFSEG: STBUFSEG Position */ +#define USBD_STBUFSEG_STBUFSEG_Msk (0x3Ful << USBD_STBUFSEG_STBUFSEG_Pos) /*!< USBD_T::STBUFSEG: STBUFSEG Mask */ + +/* USBD BUFSEG Bit Field Definitions */ +#define USBD_BUFSEG_BUFSEG_Pos 3 /*!< USBD_EP_T::BUFSEG: BUFSEG Position */ +#define USBD_BUFSEG_BUFSEG_Msk (0x3Ful << USBD_BUFSEG_BUFSEG_Pos) /*!< USBD_EP_T::BUFSEG: BUFSEG Mask */ + +/* USBD MXPLD Bit Field Definitions */ +#define USBD_MXPLD_MXPLD_Pos 0 /*!< USBD_EP_T::MXPLD: MXPLD Position */ +#define USBD_MXPLD_MXPLD_Msk (0x1FFul << USBD_MXPLD_MXPLD_Pos) /*!< USBD_EP_T::MXPLD: MXPLD Mask */ + +/* USBD CFG Bit Field Definitions */ +#define USBD_CFG_CSTALL_Pos 9 /*!< USBD_EP_T::CFG: CSTALL Position */ +#define USBD_CFG_CSTALL_Msk (1ul << USBD_CFG_CSTALL_Pos) /*!< USBD_EP_T::CFG: CSTALL Mask */ + +#define USBD_CFG_DSQ_SYNC_Pos 7 /*!< USBD_EP_T::CFG: DSQ_SYNC Position */ +#define USBD_CFG_DSQ_SYNC_Msk (1ul << USBD_CFG_DSQ_SYNC_Pos) /*!< USBD_EP_T::CFG: DSQ_SYNC Mask */ + +#define USBD_CFG_STATE_Pos 5 /*!< USBD_EP_T::CFG: STATE Position */ +#define USBD_CFG_STATE_Msk (3ul << USBD_CFG_STATE_Pos) /*!< USBD_EP_T::CFG: STATE Mask */ + +#define USBD_CFG_ISOCH_Pos 4 /*!< USBD_EP_T::CFG: ISOCH Position */ +#define USBD_CFG_ISOCH_Msk (1ul << USBD_CFG_ISOCH_Pos) /*!< USBD_EP_T::CFG: ISOCH Mask */ + +#define USBD_CFG_EP_NUM_Pos 0 /*!< USBD_EP_T::CFG: EP_NUM Position */ +#define USBD_CFG_EP_NUM_Msk (0xFul << USBD_CFG_EP_NUM_Pos) /*!< USBD_EP_T::CFG: EP_NUM Mask */ + +/* USBD CFGP Bit Field Definitions */ +#define USBD_CFGP_SSTALL_Pos 1 /*!< USBD_EP_T::CFGP: SSTALL Position */ +#define USBD_CFGP_SSTALL_Msk (1ul << USBD_CFGP_SSTALL_Pos) /*!< USBD_EP_T::CFGP: SSTALL Mask */ + +#define USBD_CFGP_CLRRDY_Pos 0 /*!< USBD_EP_T::CFGP: CLRRDY Position */ +#define USBD_CFGP_CLRRDY_Msk (1ul << USBD_CFGP_CLRRDY_Pos) /*!< USBD_EP_T::CFGP: CLRRDY Mask */ + +/* USBD DRVSE0 Bit Field Definitions */ +#define USBD_DRVSE0_DRVSE0_Pos 0 /*!< USBD_T::DRVSE0: DRVSE0 Position */ +#define USBD_DRVSE0_DRVSE0_Msk (1ul << USBD_DRVSE0_DRVSE0_Pos) /*!< USBD_T::DRVSE0: DRVSE0 Mask */ +/*@}*/ /* end of group REG_USBD_BITMASK */ +/*@}*/ /* end of group REG_USBD */ + + +/*----------------------------- Watchdog Timer (WDT) -----------------------------*/ +/** @addtogroup REG_WDT Watch Dog Timer Controller (WDT) + Memory Mapped Structure for Watchdog Timer + @{ + */ + +typedef struct +{ + + +/** + * @var WDT_T::WTCR + * Offset: 0x00 Watchdog Timer Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |WTR |Reset Watchdog Timer Up Counter (Write Protect) + * | | |0 = No effect. + * | | |1 = Reset the internal 18-bit WDT up counter value. + * | | |Note: This bit will be automatically cleared by hardware. + * |[1] |WTRE |Watchdog Timer Reset Enable (Write Protect) + * | | |Setting this bit will enable the WDT time-out reset function if the WDT up counter value has not been cleared after the specific WDT reset delay period expires. + * | | |0 = WDT time-out reset function Disabled. + * | | |1 = WDT time-out reset function Enabled. + * |[2] |WTRF |Watchdog Timer Time-out Reset Flag + * | | |This bit indicates the system has been reset by WDT time-out reset or not. + * | | |0 = WDT time-out reset did not occur. + * | | |1 = WDT time-out reset occurred. + * | | |Note: This bit is cleared by writing 1 to it. + * |[3] |WTIF |Watchdog Timer Time-out Interrupt Flag + * | | |This bit will set to 1 while WDT up counter value reaches the selected WDT time-out interval. + * | | |0 = WDT time-out interrupt did not occur. + * | | |1 = WDT time-out interrupt occurred. + * | | |Note: This bit is cleared by writing 1 to it. + * |[4] |WTWKE |Watchdog Timer Time-out Wake-Up Function Control + * | | |(Write Protect) + * | | |If this bit is set to 1, while WTIF is generated to 1 and WTIE enabled, the WDT time-out interrupt signal will generate a wake-up trigger event to chip. + * | | |0 = Wake-up trigger event Disabled if WDT time-out interrupt signal generated. + * | | |1 = Wake-up trigger event Enabled if WDT time-out interrupt signal generated. + * | | |Note: Chip can be woken-up by WDT time-out interrupt signal generated only if WDT clock source is selected to 10 kHz oscillator. + * |[5] |WTWKF |Watchdog Timer Time-out Wake-Up Flag + * | | |This bit indicates the interrupt wake-up flag status of WDT. + * | | |0 = WDT does not cause chip wake-up. + * | | |1 = Chip wake-up from Idle or Power-down mode if WDT time-out interrupt signal generated. + * | | |Note: This bit is cleared by writing 1 to it. + * |[6] |WTIE |Watchdog Timer Time-out Interrupt Enable Control (Write Protect) + * | | |If this bit is enabled, the WDT time-out interrupt signal is generated and inform to CPU. + * | | |0 = WDT time-out interrupt Disabled. + * | | |1 = WDT time-out interrupt Enabled. + * |[7] |WTE |Watchdog Timer Enable Control (Write Protect) + * | | |0 = WDT Disabled. (This action will reset the internal up counter value.) + * | | |1 = WDT Enabled. + * | | |Note: If CWDTEN (CONFIG0[31] Watchdog Enable) bit is set to 0, this bit is forced as 1 and + * | | | user cannot change this bit to 0. + * |[10:8] |WTIS |Watchdog Timer Time-out Interval Selection (Write Protect) + * | | |These three bits select the time-out interval period for the WDT. + * | | |000 = 24 *TWDT. + * | | |001 = 26 * TWDT. + * | | |010 = 28 * TWDT. + * | | |011 = 210 * TWDT. + * | | |100 = 212 * TWDT. + * | | |101 = 214 * TWDT. + * | | |110 = 216 * TWDT. + * | | |111 = 218 * TWDT. + * |[31] |DBGACK_WDT|ICE Debug Mode Acknowledge Disable Control (Write Protect) + * | | |0 = ICE debug mode acknowledgment effects WDT counting. + * | | |WDT up counter will be held while CPU is held by ICE. + * | | |1 = ICE debug mode acknowledgment Disabled. + * | | |WDT up counter will keep going no matter CPU is held by ICE or not. + * @var WDT_T::WTCRALT + * Offset: 0x04 Watchdog Timer Alternative Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |WTRDSEL |Watchdog Timer Reset Delay Selection (Write Protect) + * | | |When WDT time-out happened, user has a time named WDT Reset Delay Period to clear WDT counter to prevent WDT time-out reset happened. + * | | |User can select a suitable value of WDT Reset Delay Period for different WDT time-out period. + * | | |These bits are protected bit. + * | | |It means programming this bit needs to write "59h", "16h", "88h" to address 0x5000_0100 to disable register protection. + * | | |Reference the register REGWRPROT at address GCR_BA+0x100. + * | | |00 = Watchdog Timer Reset Delay Period is 1026 * WDT_CLK. + * | | |01 = Watchdog Timer Reset Delay Period is 130 * WDT_CLK. + * | | |10 = Watchdog Timer Reset Delay Period is 18 * WDT_CLK. + * | | |11 = Watchdog Timer Reset Delay Period is 3 * WDT_CLK. + * | | |Note: This register will be reset to 0 if WDT time-out reset happened. + */ + + __IO uint32_t WTCR; /* Offset: 0x00 Watchdog Timer Control Register */ + __IO uint32_t WTCRALT; /* Offset: 0x04 Watchdog Timer Alternative Control Register */ + +} WDT_T; + + + + +/** @addtogroup REG_WDT_BITMASK WDT Bit Mask + @{ + */ + +/* WDT WTCR Bit Field Definitions */ +#define WDT_WTCR_DBGACK_WDT_Pos 31 /*!< WDT_T::WTCR: DBGACK_WDT Position */ +#define WDT_WTCR_DBGACK_WDT_Msk (1ul << WDT_WTCR_DBGACK_WDT_Pos) /*!< WDT_T::WTCR: DBGACK_WDT Mask */ + +#define WDT_WTCR_WTIS_Pos 8 /*!< WDT_T::WTCR: WTIS Position */ +#define WDT_WTCR_WTIS_Msk (0x7ul << WDT_WTCR_WTIS_Pos) /*!< WDT_T::WTCR: WTIS Mask */ + +#define WDT_WTCR_WTE_Pos 7 /*!< WDT_T::WTCR: WTE Position */ +#define WDT_WTCR_WTE_Msk (1ul << WDT_WTCR_WTE_Pos) /*!< WDT_T::WTCR: WTE Mask */ + +#define WDT_WTCR_WTIE_Pos 6 /*!< WDT_T::WTCR: WTIE Position */ +#define WDT_WTCR_WTIE_Msk (1ul << WDT_WTCR_WTIE_Pos) /*!< WDT_T::WTCR: WTIE Mask */ + +#define WDT_WTCR_WTWKF_Pos 5 /*!< WDT_T::WTCR: WTWKF Position */ +#define WDT_WTCR_WTWKF_Msk (1ul << WDT_WTCR_WTWKF_Pos) /*!< WDT_T::WTCR: WTWKF Mask */ + +#define WDT_WTCR_WTWKE_Pos 4 /*!< WDT_T::WTCR: WTWKE Position */ +#define WDT_WTCR_WTWKE_Msk (1ul << WDT_WTCR_WTWKE_Pos) /*!< WDT_T::WTCR: WTWKE Mask */ + +#define WDT_WTCR_WTIF_Pos 3 /*!< WDT_T::WTCR: WTIF Position */ +#define WDT_WTCR_WTIF_Msk (1ul << WDT_WTCR_WTIF_Pos) /*!< WDT_T::WTCR: WTIF Mask */ + +#define WDT_WTCR_WTRF_Pos 2 /*!< WDT_T::WTCR: WTRF Position */ +#define WDT_WTCR_WTRF_Msk (1ul << WDT_WTCR_WTRF_Pos) /*!< WDT_T::WTCR: WTRF Mask */ + +#define WDT_WTCR_WTRE_Pos 1 /*!< WDT_T::WTCR: WTRE Position */ +#define WDT_WTCR_WTRE_Msk (1ul << WDT_WTCR_WTRE_Pos) /*!< WDT_T::WTCR: WTRE Mask */ + +#define WDT_WTCR_WTR_Pos 0 /*!< WDT_T::WTCR: WTR Position */ +#define WDT_WTCR_WTR_Msk (1ul << WDT_WTCR_WTR_Pos) /*!< WDT_T::WTCR: WTR Mask */ + +/* WDT WTCRALT Bit Field Definitions */ +#define WDT_WTCRALT_WTRDSEL_Pos 0 /*!< WDT_T::WTCRALT: WTRDSEL Position */ +#define WDT_WTCRALT_WTRDSEL_Msk (0x3ul << WDT_WTCRALT_WTRDSEL_Pos) /*!< WDT_T::WTCRALT: WTRDSEL Mask */ +/*@}*/ /* end of group REG_WDT_BITMASK */ +/*@}*/ /* end of group REG_WDT */ + + +/*----------------------------- Window Watchdog Timer (WWDT) -----------------------------*/ +/** @addtogroup REG_WWDT Window Watchdog Timer (WWDT) + Memory Mapped Structure for Window Watchdog Timer + @{ + */ + +typedef struct +{ + + +/** + * @var WWDT_T::WWDTRLD + * Offset: 0x00 Window Watchdog Timer Reload Counter Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |WWDTRLD |WWDT Reload Counter Register + * | | |Writing 0x00005AA5 to this register will reload the WWDT counter value to 0x3F. + * | | |Note: User can only write WWDTRLD to reload WWDT counter value when current WWDT + * | | | counter value between 0 and WINCMP. If user writes WWDTRLD when current WWDT + * | | | counter value is larger than WINCMP, WWDT reset signal will generate immediately. + * @var WWDT_T::WWDTCR + * Offset: 0x04 Window Watchdog Timer Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |WWDTEN |WWDT Enable Control + * | | |0 = WWDT counter is stopped. + * | | |1 = WWDT counter is starting counting. + * |[1] |WWDTIE |WWDT Interrupt Enable Control + * | | |If this bit is enabled, the WWDT counter compare match interrupt signal is generated and inform to CPU. + * | | |0 = WWDT counter compare match interrupt Disabled. + * | | |1 = WWDT counter compare match interrupt Enabled. + * |[11:8] |PERIODSEL |WWDT Counter Prescale Period Selection + * | | |0000 = Pre-scale is 1; Max time-out period is 1 * 64 * TWWDT. + * | | |0001 = Pre-scale is 2; Max time-out period is 2 * 64 * TWWDT. + * | | |0010 = Pre-scale is 4; Max time-out period is 4 * 64 * TWWDT. + * | | |0011 = Pre-scale is 8; Max time-out period is 8 * 64 * TWWDT. + * | | |0100 = Pre-scale is 16; Max time-out period is 16 * 64 * TWWDT. + * | | |0101 = Pre-scale is 32; Max time-out period is 32 * 64 * TWWDT. + * | | |0110 = Pre-scale is 64; Max time-out period is 64 * 64 * TWWDT. + * | | |0111 = Pre-scale is 128; Max time-out period is 128 * 64 * TWWDT. + * | | |1000 = Pre-scale is 192; Max time-out period is 192 * 64 * TWWDT. + * | | |1001 = Pre-scale is 256; Max time-out period is 256 * 64 * TWWDT. + * | | |1010 = Pre-scale is 384; Max time-out period is 384 * 64 * TWWDT. + * | | |1011 = Pre-scale is 512; Max time-out period is 512 * 64 * TWWDT. + * | | |1100 = Pre-scale is 768; Max time-out period is 768 * 64 * TWWDT. + * | | |1101 = Pre-scale is 1024; Max time-out period is 1024 * 64 * TWWDT. + * | | |1110 = Pre-scale is 1536; Max time-out period is 1536 * 64 * TWWDT. + * | | |1111 = Pre-scale is 2048; Max time-out period is 2048 * 64 * TWWDT. + * |[21:16] |WINCMP |WWDT Window Compare Register + * | | |Set this register to adjust the valid reload window. + * | | |Note: User can only write WWDTRLD to reload WWDT counter value when current WWDT counter value between 0 and WINCMP. + * | | |If user writes WWDTRLD when current WWDT counter value larger than WINCMP, WWDT reset signal will generate immediately. + * |[31] |DBGACK_WWDT|ICE Debug Mode Acknowledge Disable Control + * | | |0 = ICE debug mode acknowledgment effects WWDT counting. + * | | |WWDT down counter will be held while CPU is held by ICE. + * | | |1 = ICE debug mode acknowledgment Disabled. + * | | |WWDT down counter will keep going no matter CPU is held by ICE or not. + * @var WWDT_T::WWDTSR + * Offset: 0x08 Window Watchdog Timer Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |WWDTIF |WWDT Compare Match Interrupt Flag + * | | |This bit indicates the interrupt flag status of WWDT while WWDT counter value matches WINCMP value. + * | | |0 = No effect. + * | | |1 = WWDT counter value matches WINCMP value. + * | | |Note: This bit is cleared by writing 1 to it. + * |[1] |WWDTRF |WWDT Time-out Reset Flag + * | | |This bit indicates the system has been reset by WWDT time-out reset or not. + * | | |0 = WWDT time-out reset did not occur. + * | | |1 = WWDT time-out reset occurred. + * | | |Note: This bit is cleared by writing 1 to it. + * @var WWDT_T::WWDTCVR + * Offset: 0x0C Window Watchdog Timer Counter Value Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |WWDTCVAL |WWDT Counter Value + * | | |WWDTCVAL will be updated continuously to monitor 6-bit down counter value. + */ + + __IO uint32_t WWDTRLD; /* Offset: 0x00 Window Watchdog Timer Reload Counter Register */ + __IO uint32_t WWDTCR; /* Offset: 0x04 Window Watchdog Timer Control Register */ + __IO uint32_t WWDTSR; /* Offset: 0x08 Window Watchdog Timer Status Register */ + __I uint32_t WWDTCVR; /* Offset: 0x0C Window Watchdog Timer Counter Value Register */ + +} WWDT_T; + + + +/** @addtogroup REG_WWDT_BITMASK WWDT Bit Mask + @{ + */ + +/* WWDT WWDTRLD Bit Field Definitions */ +#define WWDT_WWDTRLD_WWDTRLD_Pos 0 /*!< WWDT_T::WWDTRLD: WWDTRLD Position */ +#define WWDT_WWDTRLD_WWDTRLD_Msk (0xFFFFFFFFul << WWDT_WWDTRLD_WWDTRLD_Pos) /*!< WWDT_T::WWDTRLD: WWDTRLD Mask */ + +/* WWDT WWDTCR Bit Field Definitions */ +#define WWDT_WWDTCR_DBGACK_WWDT_Pos 31 /*!< WWDT_T::WWDTCR: DBGACK_WWDT Position */ +#define WWDT_WWDTCR_DBGACK_WWDT_Msk (1ul << WWDT_WWDTCR_DBGACK_WWDT_Pos) /*!< WWDT_T::WWDTCR: DBGACK_WWDT Mask */ + +#define WWDT_WWDTCR_WINCMP_Pos 16 /*!< WWDT_T::WWDTCR: WINCMP Position */ +#define WWDT_WWDTCR_WINCMP_Msk (0x3Ful << WWDT_WWDTCR_WINCMP_Pos) /*!< WWDT_T::WWDTCR: WINCMP Mask */ + +#define WWDT_WWDTCR_PERIODSEL_Pos 8 /*!< WWDT_T::WWDTCR: PERIODSEL Position */ +#define WWDT_WWDTCR_PERIODSEL_Msk (0xFul << WWDT_WWDTCR_PERIODSEL_Pos) /*!< WWDT_T::WWDTCR: PERIODSEL Mask */ + +#define WWDT_WWDTCR_WWDTIE_Pos 1 /*!< WWDT_T::WWDTCR: WWDTIE Position */ +#define WWDT_WWDTCR_WWDTIE_Msk (1ul << WWDT_WWDTCR_WWDTIE_Pos) /*!< WWDT_T::WWDTCR: WWDTIE Mask */ + +#define WWDT_WWDTCR_WWDTEN_Pos 0 /*!< WWDT_T::WWDTCR: WWDTEN Position */ +#define WWDT_WWDTCR_WWDTEN_Msk (1ul << WWDT_WWDTCR_WWDTEN_Pos) /*!< WWDT_T::WWDTCR: WWDTEN Mask */ + +/* WWDT WWDTSR Bit Field Definitions */ +#define WWDT_WWDTSR_WWDTRF_Pos 1 /*!< WWDT_T::WWDTSR: WWDTRF Position */ +#define WWDT_WWDTSR_WWDTRF_Msk (1ul << WWDT_WWDTSR_WWDTRF_Pos) /*!< WWDT_T::WWDTSR: WWDTRF Mask */ + +#define WWDT_WWDTSR_WWDTIF_Pos 0 /*!< WWDT_T::WWDTSR: WWDTIF Position */ +#define WWDT_WWDTSR_WWDTIF_Msk (1ul << WWDT_WWDTSR_WWDTIF_Pos) /*!< WWDT_T::WWDTSR: WWDTIF Mask */ + +/* WWDT WWDTCVR Bit Field Definitions */ +#define WWDT_WWDTCVR_WWDTCVAL_Pos 0 /*!< WWDT_T::WWDTCVR: WWDTRF Position */ +#define WWDT_WWDTCVR_WWDTCVAL_Msk (0x3Ful << WWDT_WWDTCVR_WWDTCVAL_Pos) /*!< WWDT_T::WWDTCVR: WWDTRF Mask */ +/*@}*/ /* end of group REG_WWDT_BITMASK */ +/*@}*/ /* end of group REG_WWDT */ +/*@}*/ /* end of group REGISTER */ + + +/******************************************************************************/ +/* Peripheral memory map */ +/******************************************************************************/ +/** @addtogroup PERIPHERAL_MEM_MAP Peripheral Memory Map + Memory Mapped Structure for Series Peripheral + @{ + */ +/* Peripheral and SRAM base address */ +#define FLASH_BASE (( uint32_t)0x00000000) +#define SRAM_BASE (( uint32_t)0x20000000) +#define AHB_BASE (( uint32_t)0x50000000) +#define APB1_BASE (( uint32_t)0x40000000) +#define APB2_BASE (( uint32_t)0x40100000) + +/* Peripheral memory map */ +#define GPIO_BASE (AHB_BASE + 0x4000) /*!< GPIO Base Address */ +#define PA_BASE (GPIO_BASE ) /*!< GPIO PORTA Base Address */ +#define PB_BASE (GPIO_BASE + 0x0040) /*!< GPIO PORTB Base Address */ +#define PC_BASE (GPIO_BASE + 0x0080) /*!< GPIO PORTC Base Address */ +#define PD_BASE (GPIO_BASE + 0x00C0) /*!< GPIO PORTD Base Address */ +#define PE_BASE (GPIO_BASE + 0x0100) /*!< GPIO PORTE Base Address */ +#define PF_BASE (GPIO_BASE + 0x0140) /*!< GPIO PORTF Base Address */ +#define GPIO_DBNCECON_BASE (GPIO_BASE + 0x0180) /*!< GPIO De-bounce Cycle Control Base Address */ +#define GPIO_PIN_DATA_BASE (GPIO_BASE + 0x0200) /*!< GPIO Pin Data Input/Output Control Base Address */ + + +#define UART0_BASE (APB1_BASE + 0x50000) +#define UART1_BASE (APB2_BASE + 0x50000) +#define UART2_BASE (APB2_BASE + 0x54000) + + +#define TIMER0_BASE (APB1_BASE + 0x10000) /*!< Timer0 Base Address */ +#define TIMER1_BASE (APB1_BASE + 0x10020) /*!< Timer1 Base Address */ +#define TIMER2_BASE (APB2_BASE + 0x10000) /*!< Timer2 Base Address */ +#define TIMER3_BASE (APB2_BASE + 0x10020) /*!< Timer3 Base Address */ + +#define WDT_BASE (APB1_BASE + 0x4000) /*!< Watchdog Timer Base Address */ + +#define WWDT_BASE (APB1_BASE + 0x4100) /*!< Window Watchdog Timer Base Address */ + +#define SPI0_BASE (APB1_BASE + 0x30000) /*!< SPI0 Base Address */ +#define SPI1_BASE (APB1_BASE + 0x34000) /*!< SPI1 Base Address */ +#define SPI2_BASE (APB2_BASE + 0x30000) /*!< SPI2 Base Address */ + +#define I2C0_BASE (APB1_BASE + 0x20000) /*!< I2C0 Base Address */ +#define I2C1_BASE (APB2_BASE + 0x20000) /*!< I2C1 Base Address */ + +#define ADC_BASE (APB1_BASE + 0xE0000) /*!< ADC Base Address */ + +#define CLK_BASE (AHB_BASE + 0x00200) /*!< System Clock Controller Base Address */ + +#define GCR_BASE (AHB_BASE + 0x00000) /*!< System Global Controller Base Address */ + +#define INT_BASE (AHB_BASE + 0x00300) /*!< Interrupt Source Controller Base Address */ + +#define FMC_BASE (AHB_BASE + 0x0C000) + +#define PS2_BASE (APB2_BASE + 0x00000) /*!< PS/2 Base Address */ + +#define USBD_BASE (APB1_BASE + 0x60000) /*!< USBD Base Address */ + +#define PDMA0_BASE (AHB_BASE + 0x08000) /*!< PDMA0 Base Address */ +#define PDMA1_BASE (AHB_BASE + 0x08100) /*!< PDMA1 Base Address */ +#define PDMA2_BASE (AHB_BASE + 0x08200) /*!< PDMA2 Base Address */ +#define PDMA3_BASE (AHB_BASE + 0x08300) /*!< PDMA3 Base Address */ +#define PDMA4_BASE (AHB_BASE + 0x08400) /*!< PDMA4 Base Address */ +#define PDMA5_BASE (AHB_BASE + 0x08500) /*!< PDMA5 Base Address */ + +#define PDMA_GCR_BASE (AHB_BASE + 0x08F00) /*!< PDMA Global Base Address */ + +#define CRC_BASE (AHB_BASE + 0x08E00) /*!< CRC Base Address */ + +#define PWMA_BASE (APB1_BASE + 0x40000) /*!< PWMA Base Address */ + +#define I2S_BASE (APB2_BASE + 0xA0000) /*!< I2S Base Address */ + +/*@}*/ /* end of group PERIPHERAL_MEM_MAP */ + +/******************************************************************************/ +/* Peripheral Definitions */ +/******************************************************************************/ + +/** @addtogroup PERIPHERAL Peripheral Definitions + The Definitions of Peripheral + @{ + */ +#define PA ((GPIO_T *) PA_BASE) /*!< GPIO PORTA Configuration Struct */ +#define PB ((GPIO_T *) PB_BASE) /*!< GPIO PORTB Configuration Struct */ +#define PC ((GPIO_T *) PC_BASE) /*!< GPIO PORTC Configuration Struct */ +#define PD ((GPIO_T *) PD_BASE) /*!< GPIO PORTD Configuration Struct */ +#define PF ((GPIO_T *) PF_BASE) /*!< GPIO PORTF Configuration Struct */ +#define GPIO ((GPIO_DBNCECON_T *) GPIO_DBNCECON_BASE) /*!< Interrupt De-bounce Cycle Control Configuration Struct */ + +#define UART0 ((UART_T *) UART0_BASE) /*!< UART0 Configuration Struct */ +#define UART1 ((UART_T *) UART1_BASE) /*!< UART1 Configuration Struct */ + +#define TIMER0 ((TIMER_T *) TIMER0_BASE) /*!< Timer0 Configuration Struct */ +#define TIMER1 ((TIMER_T *) TIMER1_BASE) /*!< Timer1 Configuration Struct */ +#define TIMER2 ((TIMER_T *) TIMER2_BASE) /*!< Timer2 Configuration Struct */ +#define TIMER3 ((TIMER_T *) TIMER3_BASE) /*!< Timer3 Configuration Struct */ + +#define WDT ((WDT_T *) WDT_BASE) /*!< Watchdog Timer Configuration Struct */ + +#define WWDT ((WWDT_T *) WWDT_BASE) /*!< Window Watchdog Timer Configuration Struct */ + +#define SPI0 ((SPI_T *) SPI0_BASE) /*!< SPI0 Configuration Struct */ +#define SPI1 ((SPI_T *) SPI1_BASE) /*!< SPI1 Configuration Struct */ +#define SPI2 ((SPI_T *) SPI2_BASE) /*!< SPI2 Configuration Struct */ + +#define I2C0 ((I2C_T *) I2C0_BASE) /*!< I2C0 Configuration Struct */ +#define I2C1 ((I2C_T *) I2C1_BASE) /*!< I2C1 Configuration Struct */ + +#define I2S ((I2S_T *) I2S_BASE) /*!< I2S Configuration Struct */ + +#define ADC ((ADC_T *) ADC_BASE) /*!< ADC Configuration Struct */ + +#define CLK ((CLK_T *) CLK_BASE) /*!< System Clock Controller Configuration Struct */ + +#define SYS ((GCR_T *) GCR_BASE) /*!< System Global Controller Configuration Struct */ + +#define SYSINT ((GCR_INT_T *) INT_BASE) /*!< Interrupt Source Controller Configuration Struct */ + +#define FMC ((FMC_T *) FMC_BASE) + +#define PS2 ((PS2_T *) PS2_BASE) /*!< PS/2 Configuration Struct */ + +#define USBD ((USBD_T *) USBD_BASE) /*!< USBD Configuration Struct */ + +#define PDMA0 ((PDMA_T *) PDMA0_BASE) /*!< PDMA0 Configuration Struct */ +#define PDMA1 ((PDMA_T *) PDMA1_BASE) /*!< PDMA1 Configuration Struct */ +#define PDMA2 ((PDMA_T *) PDMA2_BASE) /*!< PDMA2 Configuration Struct */ +#define PDMA3 ((PDMA_T *) PDMA3_BASE) /*!< PDMA3 Configuration Struct */ +#define PDMA4 ((PDMA_T *) PDMA4_BASE) /*!< PDMA4 Configuration Struct */ +#define PDMA5 ((PDMA_T *) PDMA5_BASE) /*!< PDMA5 Configuration Struct */ + +#define PDMA_GCR ((PDMA_GCR_T *) PDMA_GCR_BASE) /*!< PDMA Global Configuration Struct */ + +#define CRC ((CRC_T *) CRC_BASE) /*!< CRC Configuration Struct */ + +#define PWMA ((PWM_T *) PWMA_BASE) /*!< PWMA Configuration Struct */ + +/*@}*/ /* end of group PERIPHERAL */ + +#define UNLOCKREG() do{*((__IO uint32_t *)(GCR_BASE + 0x100)) = 0x59;*((__IO uint32_t *)(GCR_BASE + 0x100)) = 0x16;*((__IO uint32_t *)(GCR_BASE + 0x100)) = 0x88;}while(*((__IO uint32_t *)(GCR_BASE + 0x100))==0) +#define LOCKREG() *((__IO uint32_t *)(GCR_BASE + 0x100)) = 0x00 + +#define REGCOPY(dest, src) *((uint32_t *)&(dest)) = *((uint32_t *)&(src)) +#define CLEAR(dest) *((uint32_t *)&(dest)) = 0 + +//============================================================================= +/** @addtogroup IO_ROUTINE I/O routines + The Declaration of I/O routines + @{ + */ + +typedef volatile unsigned char vu8; ///< Define 8-bit unsigned volatile data type +typedef volatile unsigned short vu16; ///< Define 16-bit unsigned volatile data type +typedef volatile unsigned long vu32; ///< Define 32-bit unsigned volatile data type + +/** + * @brief Get a 8-bit unsigned value from specified address + * @param[in] addr Address to get 8-bit data from + * @return 8-bit unsigned value stored in specified address + */ +#define M8(addr) (*((vu8 *) (addr))) + +/** + * @brief Get a 16-bit unsigned value from specified address + * @param[in] addr Address to get 16-bit data from + * @return 16-bit unsigned value stored in specified address + * @note The input address must be 16-bit aligned + */ +#define M16(addr) (*((vu16 *) (addr))) + +/** + * @brief Get a 32-bit unsigned value from specified address + * @param[in] addr Address to get 32-bit data from + * @return 32-bit unsigned value stored in specified address + * @note The input address must be 32-bit aligned + */ +#define M32(addr) (*((vu32 *) (addr))) + +/** + * @brief Set a 32-bit unsigned value to specified I/O port + * @param[in] port Port address to set 32-bit data + * @param[in] value Value to write to I/O port + * @return None + * @note The output port must be 32-bit aligned + */ +#define outpw(port,value) *((volatile unsigned int *)(port)) = (value) + +/** + * @brief Get a 32-bit unsigned value from specified I/O port + * @param[in] port Port address to get 32-bit data from + * @return 32-bit unsigned value stored in specified I/O port + * @note The input port must be 32-bit aligned + */ +#define inpw(port) (*((volatile unsigned int *)(port))) + +/** + * @brief Set a 16-bit unsigned value to specified I/O port + * @param[in] port Port address to set 16-bit data + * @param[in] value Value to write to I/O port + * @return None + * @note The output port must be 16-bit aligned + */ +#define outps(port,value) *((volatile unsigned short *)(port)) = (value) + +/** + * @brief Get a 16-bit unsigned value from specified I/O port + * @param[in] port Port address to get 16-bit data from + * @return 16-bit unsigned value stored in specified I/O port + * @note The input port must be 16-bit aligned + */ +#define inps(port) (*((volatile unsigned short *)(port))) + +/** + * @brief Set a 8-bit unsigned value to specified I/O port + * @param[in] port Port address to set 8-bit data + * @param[in] value Value to write to I/O port + * @return None + */ +#define outpb(port,value) *((volatile unsigned char *)(port)) = (value) + +/** + * @brief Get a 8-bit unsigned value from specified I/O port + * @param[in] port Port address to get 8-bit data from + * @return 8-bit unsigned value stored in specified I/O port + */ +#define inpb(port) (*((volatile unsigned char *)(port))) + +/** + * @brief Set a 32-bit unsigned value to specified I/O port + * @param[in] port Port address to set 32-bit data + * @param[in] value Value to write to I/O port + * @return None + * @note The output port must be 32-bit aligned + */ +#define outp32(port,value) *((volatile unsigned int *)(port)) = (value) + +/** + * @brief Get a 32-bit unsigned value from specified I/O port + * @param[in] port Port address to get 32-bit data from + * @return 32-bit unsigned value stored in specified I/O port + * @note The input port must be 32-bit aligned + */ +#define inp32(port) (*((volatile unsigned int *)(port))) + +/** + * @brief Set a 16-bit unsigned value to specified I/O port + * @param[in] port Port address to set 16-bit data + * @param[in] value Value to write to I/O port + * @return None + * @note The output port must be 16-bit aligned + */ +#define outp16(port,value) *((volatile unsigned short *)(port)) = (value) + +/** + * @brief Get a 16-bit unsigned value from specified I/O port + * @param[in] port Port address to get 16-bit data from + * @return 16-bit unsigned value stored in specified I/O port + * @note The input port must be 16-bit aligned + */ +#define inp16(port) (*((volatile unsigned short *)(port))) + +/** + * @brief Set a 8-bit unsigned value to specified I/O port + * @param[in] port Port address to set 8-bit data + * @param[in] value Value to write to I/O port + * @return None + */ +#define outp8(port,value) *((volatile unsigned char *)(port)) = (value) + +/** + * @brief Get a 8-bit unsigned value from specified I/O port + * @param[in] port Port address to get 8-bit data from + * @return 8-bit unsigned value stored in specified I/O port + */ +#define inp8(port) (*((volatile unsigned char *)(port))) + +/*@}*/ /* end of group IO_ROUTINE */ + + + + +/** @addtogroup legacy_Constants Legacy Constants + Legacy Constants + @{ +*/ + + +#define E_SUCCESS 0 +#ifndef NULL +#define NULL 0 +#endif + +#define TRUE 1 +#define FALSE 0 + +#define ENABLE 1 +#define DISABLE 0 + +/* Define one bit mask */ +#define BIT0 0x00000001 +#define BIT1 0x00000002 +#define BIT2 0x00000004 +#define BIT3 0x00000008 +#define BIT4 0x00000010 +#define BIT5 0x00000020 +#define BIT6 0x00000040 +#define BIT7 0x00000080 +#define BIT8 0x00000100 +#define BIT9 0x00000200 +#define BIT10 0x00000400 +#define BIT11 0x00000800 +#define BIT12 0x00001000 +#define BIT13 0x00002000 +#define BIT14 0x00004000 +#define BIT15 0x00008000 +#define BIT16 0x00010000 +#define BIT17 0x00020000 +#define BIT18 0x00040000 +#define BIT19 0x00080000 +#define BIT20 0x00100000 +#define BIT21 0x00200000 +#define BIT22 0x00400000 +#define BIT23 0x00800000 +#define BIT24 0x01000000 +#define BIT25 0x02000000 +#define BIT26 0x04000000 +#define BIT27 0x08000000 +#define BIT28 0x10000000 +#define BIT29 0x20000000 +#define BIT30 0x40000000 +#define BIT31 0x80000000 + +/* Byte Mask Definitions */ +#define BYTE0_Msk (0x000000FF) +#define BYTE1_Msk (0x0000FF00) +#define BYTE2_Msk (0x00FF0000) +#define BYTE3_Msk (0xFF000000) + +#define _GET_BYTE0(u32Param) (((u32Param) & BYTE0_Msk) ) /*!< Extract Byte 0 (Bit 0~ 7) from parameter u32Param */ +#define _GET_BYTE1(u32Param) (((u32Param) & BYTE1_Msk) >> 8) /*!< Extract Byte 1 (Bit 8~15) from parameter u32Param */ +#define _GET_BYTE2(u32Param) (((u32Param) & BYTE2_Msk) >> 16) /*!< Extract Byte 2 (Bit 16~23) from parameter u32Param */ +#define _GET_BYTE3(u32Param) (((u32Param) & BYTE3_Msk) >> 24) /*!< Extract Byte 3 (Bit 24~31) from parameter u32Param */ + +/*@}*/ /* end of group legacy_Constants */ + + +/******************************************************************************/ +/* Peripheral header files */ +/******************************************************************************/ +#include "inc\SYS.h" +#include "inc\ADC.h" +#include "inc\FMC.h" +#include "inc\GPIO.h" +#include "inc\I2C.h" +#include "inc\PWM.h" +#include "inc\SPI.h" +#include "inc\TIMER.h" +#include "inc\WDT.h" +#include "inc\WWDT.h" +#include "inc\UART.h" +#include "inc\I2S.h" +#include "inc\USBD.h" +#include "inc\PDMA.h" +#include "inc\PS2.h" +#include "inc\CLK.h" +#include "inc\CRC.h" +#endif + + + diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/adc.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/adc.h new file mode 100644 index 00000000..6412af75 --- /dev/null +++ b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/adc.h @@ -0,0 +1,342 @@ +/**************************************************************************//** + * @file adc.h + * @version V3.00 + * $Revision: 7 $ + * $Date: 15/07/02 11:21a $ + * @brief NUC123 Series ADC Driver Header File + * + * @note + * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. + * + ******************************************************************************/ +#ifndef __ADC_H__ +#define __ADC_H__ + +#include "NUC123.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup ADC_Driver ADC Driver + @{ +*/ + +/** @addtogroup ADC_EXPORTED_CONSTANTS ADC Exported Constants + @{ +*/ +/*---------------------------------------------------------------------------------------------------------*/ +/* ADCR Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define ADC_ADCR_ADEN_CONVERTER_DISABLE (0UL<ADCHER = ((adc)->ADCHER & ~ADC_ADCHER_PRESEL_Msk) | (u32Source)) + +/** + * @brief Enable PDMA transfer. + * @param[in] adc The pointer of the specified ADC module + * @return None + * @details Enable PDMA to transfer the conversion data. + * @note While enable PDMA transfer, software must set ADIE = 0 to disable interrupt. + */ +#define ADC_ENABLE_PDMA(adc) ((adc)->ADCR |= ADC_ADCR_PTEN_Msk) + +/** + * @brief Disable PDMA transfer. + * @param[in] adc The pointer of the specified ADC module + * @return None + * @details Disable PDMA to transfer the conversion data. + */ +#define ADC_DISABLE_PDMA(adc) ((adc)->ADCR &= ~ADC_ADCR_PTEN_Msk) + +/** + * @brief Get conversion data of specified channel. + * @param[in] adc The pointer of the specified ADC module. + * @param[in] u32ChNum ADC Channel, valid value are from 0 to 7. + * @return 16-bit data. + * @details Read RSLT bit field to get conversion data. + */ +#define ADC_GET_CONVERSION_DATA(adc, u32ChNum) ((adc)->ADDR[(u32ChNum)] & ADC_ADDR_RSLT_Msk) + +/** + * @brief Return the user-specified interrupt flags. + * @param[in] adc The pointer of the specified ADC module. + * @param[in] u32Mask The combination of following interrupt status bits. Each bit corresponds to a interrupt status. + * Valid values are: + * - \ref ADC_ADF_INT :Convert complete interrupt flag. + * - \ref ADC_CMP0_INT :Comparator 0 interrupt flag. + * - \ref ADC_CMP1_INT :Comparator 1 interrupt flag. + * @return User specified interrupt flags. + * @details Get the status of the ADC interrupt flag. + */ +#define ADC_GET_INT_FLAG(adc, u32Mask) ((adc)->ADSR & (u32Mask)) + +/** + * @brief This macro clear the selected interrupt status bits. + * @param[in] adc The pointer of the specified ADC module. + * @param[in] u32Mask The combination of following interrupt status bits. Each bit corresponds to a interrupt status. + * Valid values are: + * - \ref ADC_ADF_INT :Convert complete interrupt flag. + * - \ref ADC_CMP0_INT :Comparator 0 interrupt flag. + * - \ref ADC_CMP1_INT :Comparator 1 interrupt flag. + * @return None + * @details ADF (ADSR[0])/CMPF0 (ADSR[1])/CMPF0 (ADSR[2]) can be cleared by writing 1 to itself. + */ +#define ADC_CLR_INT_FLAG(adc, u32Mask) ((adc)->ADSR = (u32Mask)) + +/** + * @brief Get the busy state of ADC. + * @param[in] adc The pointer of the specified ADC module. + * @retval 0 ADC is not busy. + * @retval 1 ADC is busy. + * @details BUSY(ADSR[3])is mirror of as ADST bit (ADCR[11]). + */ +#define ADC_IS_BUSY(adc) ((adc)->ADSR & ADC_ADSR_BUSY_Msk ? 1 : 0) + +/** + * @brief Check if the ADC conversion data is over written or not. + * @param[in] adc The pointer of the specified ADC module. + * @param[in] u32ChNum ADC Channel, valid value are from 0 to 7. + * @retval 0 ADC data is not overrun. + * @retval 1 ADC data is overrun. + * @details OVERRUN (ADSR[23:16]) is a mirror to OVERRUN (ADDR0~7[16]). + */ +#define ADC_IS_DATA_OVERRUN(adc, u32ChNum) ((adc)->ADSR & (0x1 << (ADC_ADSR_OVERRUN_Pos + (u32ChNum))) ? 1 : 0) + +/** + * @brief Check if the ADC conversion data is valid or not. + * @param[in] adc The pointer of the specified ADC module. + * @param[in] u32ChNum ADC Channel, valid value are from 0 to 7. + * @retval 0 ADC data is not valid. + * @retval 1 ADC data is valid. + * @details VALID (ADDR0~7[17]) is set to 1 when corresponding channel analog input conversion is completed and cleared by hardware after ADDR register is read. + */ +#define ADC_IS_DATA_VALID(adc, u32ChNum) ((adc)->ADSR & (0x1 << (ADC_ADSR_VALID_Pos + (u32ChNum))) ? 1 : 0) + +/** + * @brief Power down ADC module. + * @param[in] adc The pointer of the specified ADC module. + * @return None + * @details Disable A/D converter analog circuit for saving power consumption. + * @note None + */ +#define ADC_POWER_DOWN(adc) ((adc)->ADCR &= ~ADC_ADCR_ADEN_Msk) + +/** + * @brief Power on ADC module. + * @param[in] adc The pointer of the specified ADC module. + * @return None + * @details Before starting A/D conversion function, ADEN bit (ADCR[0]) should be set to 1. + */ +#define ADC_POWER_ON(adc) ((adc)->ADCR |= ADC_ADCR_ADEN_Msk) + +/** + * @brief Configure the comparator 0 and enable it. + * @param[in] adc The pointer of the specified ADC module. + * @param[in] u32ChNum Specifies the source channel, valid value are from 0 to 7. + * @param[in] u32Condition Specifies the compare condition. Valid values are: + * - \ref ADC_ADCMPR_CMPCOND_LESS_THAN :The compare condition is "less than the compare value". + * - \ref ADC_ADCMPR_CMPCOND_GREATER_OR_EQUAL :The compare condition is "greater than or equal to the compare value. + * @param[in] u32Data Specifies the compare value, valid value are between 0 ~ 0x3FF. + * @param[in] u32MatchCount Specifies the match count setting, valid values are between 1~16. + * @return None + * @details For example, ADC_ENABLE_CMP0(ADC, 5, ADC_ADCMPR_CMPCOND_GREATER_OR_EQUAL, 0x200, 10); + * Means ADC will assert comparator 0 flag if channel 5 conversion result is greater or + * equal to 0x200 for 10 times continuously. + * \hideinitializer + */ +#define ADC_ENABLE_CMP0(adc, \ + u32ChNum, \ + u32Condition, \ + u32Data, \ + u32MatchCount) ((adc)->ADCMPR[0] = ((u32ChNum) << ADC_ADCMPR_CMPCH_Pos) | \ + (u32Condition) | \ + ((u32Data) << ADC_ADCMPR_CMPD_Pos) | \ + (((u32MatchCount) - 1) << ADC_ADCMPR_CMPMATCNT_Pos) |\ + ADC_ADCMPR_CMPEN_Msk) + +/** + * @brief Disable comparator 0. + * @param[in] adc The pointer of the specified ADC module. + * @return None + * @details Set CMPEN (ADCMPR0[0]) to 0 to disable ADC controller to compare CMPD (ADCMPR0[25:16]). + */ +#define ADC_DISABLE_CMP0(adc) ((adc)->ADCMPR[0] = 0) + +/** + * @brief Configure the comparator 1 and enable it. + * @param[in] adc The pointer of the specified ADC module. + * @param[in] u32ChNum Specifies the source channel, valid value are from 0 to 7. + * @param[in] u32Condition Specifies the compare condition. Valid values are: + * - \ref ADC_ADCMPR_CMPCOND_LESS_THAN :The compare condition is "less than the compare value". + * - \ref ADC_ADCMPR_CMPCOND_GREATER_OR_EQUAL :The compare condition is "greater than or equal to the compare value. + * @param[in] u32Data Specifies the compare value, valid value are between 0 ~ 0x3FF. + * @param[in] u32MatchCount Specifies the match count setting, valid values are between 1~16. + * @return None + * @details For example, ADC_ENABLE_CMP1(ADC, 5, ADC_ADCMPR_CMPCOND_GREATER_OR_EQUAL, 0x200, 10); + * Means ADC will assert comparator 1 flag if channel 5 conversion result is greater or + * equal to 0x200 for 10 times continuously. + * \hideinitializer + */ +#define ADC_ENABLE_CMP1(adc, \ + u32ChNum, \ + u32Condition, \ + u32Data, \ + u32MatchCount) ((adc)->ADCMPR[1] = ((u32ChNum) << ADC_ADCMPR_CMPCH_Pos) | \ + (u32Condition) | \ + ((u32Data) << ADC_ADCMPR_CMPD_Pos) | \ + (((u32MatchCount) - 1) << ADC_ADCMPR_CMPMATCNT_Pos) |\ + ADC_ADCMPR_CMPEN_Msk) + +/** + * @brief Disable comparator 1. + * @param[in] adc The pointer of the specified ADC module. + * @return None + * @details Set CMPEN (ADCMPR1[0]) to 0 to disable ADC controller to compare CMPD (ADCMPR1[25:16]). + */ +#define ADC_DISABLE_CMP1(adc) ((adc)->ADCMPR[1] = 0) + +/** + * @brief Set ADC input channel. + * @param[in] adc The pointer of the specified ADC module. + * @param[in] u32Mask Channel enable bit. Each bit corresponds to a input channel. Bit 0 is channel 0, bit 1 is channel 1..., bit 7 is channel 7. + * @return None + * @details Enabled channel will be converted while ADC starts. + * @note NUC123 series MCU ADC can only convert 1 channel at a time. If more than 1 channels are enabled, only channel + * with smallest number will be convert. + */ +#define ADC_SET_INPUT_CHANNEL(adc, u32Mask) ((adc)->ADCHER = ((adc)->ADCHER & ~ADC_ADCHER_CHEN_Msk) | (u32Mask)) + +/** + * @brief Start the A/D conversion. + * @param[in] adc The pointer of the specified ADC module. + * @return None + * @details ADST (ADCR[11]) can be set to 1 from three sources: software, PWM Center-aligned trigger and external pin STADC. + */ +#define ADC_START_CONV(adc) ((adc)->ADCR |= ADC_ADCR_ADST_Msk) + +/** + * @brief Stop the A/D conversion. + * @param[in] adc The pointer of the specified ADC module. + * @return None + * @details ADST (ADCR[11]) will be cleared to 0 by hardware automatically at the ends of single mode and single-cycle scan mode. + * In continuous scan mode, A/D conversion is continuously performed until software writes 0 to this bit or chip reset. + */ +#define ADC_STOP_CONV(adc) ((adc)->ADCR &= ~ADC_ADCR_ADST_Msk) + +void ADC_Open(ADC_T *adc, + uint32_t u32InputMode, + uint32_t u32OpMode, + uint32_t u32ChMask); +void ADC_Close(ADC_T *adc); +void ADC_EnableHWTrigger(ADC_T *adc, + uint32_t u32Source, + uint32_t u32Param); +void ADC_DisableHWTrigger(ADC_T *adc); +void ADC_EnableInt(ADC_T *adc, uint32_t u32Mask); +void ADC_DisableInt(ADC_T *adc, uint32_t u32Mask); + + + +/*@}*/ /* end of group ADC_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group ADC_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif //__ADC_H__ + +/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/clk.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/clk.h new file mode 100644 index 00000000..c66cdd26 --- /dev/null +++ b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/clk.h @@ -0,0 +1,409 @@ +/**************************************************************************//** + * @file clk.h + * @version V3.0 + * $Revision: 16 $ + * $Date: 15/07/02 11:21a $ + * @brief NUC123 Series Clock Control Driver Header File + * + * @note + * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. + * + ******************************************************************************/ +#ifndef __CLK_H__ +#define __CLK_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup CLK_Driver CLK Driver + @{ +*/ + +/** @addtogroup CLK_EXPORTED_CONSTANTS CLK Exported Constants + @{ +*/ + +#define FREQ_25MHZ 25000000 +#define FREQ_50MHZ 50000000 +#define FREQ_72MHZ 72000000 +#define FREQ_100MHZ 100000000 +#define FREQ_200MHZ 200000000 + + +/*---------------------------------------------------------------------------------------------------------*/ +/* CLKSEL0 constant definitions. */ +/*---------------------------------------------------------------------------------------------------------*/ +#define CLK_CLKSEL0_HCLK_S_HXT (0x0UL<>30) & 0x3) /*!< Calculate APBCLK offset on MODULE index, 0x0:AHBCLK, 0x1:APBCLK */ +#define MODULE_CLKSEL(x) (((x) >>28) & 0x3) /*!< Calculate CLKSEL offset on MODULE index, 0x0:CLKSEL0, 0x1:CLKSEL1, 0x2:CLKSEL2 */ +#define MODULE_CLKSEL_Msk(x) (((x) >>25) & 0x7) /*!< Calculate CLKSEL mask offset on MODULE index */ +#define MODULE_CLKSEL_Pos(x) (((x) >>20) & 0x1f) /*!< Calculate CLKSEL position offset on MODULE index */ +#define MODULE_CLKDIV(x) (((x) >>18) & 0x3) /*!< Calculate APBCLK CLKDIV on MODULE index, 0x0:CLKDIV */ +#define MODULE_CLKDIV_Msk(x) (((x) >>10) & 0xff) /*!< Calculate CLKDIV mask offset on MODULE index */ +#define MODULE_CLKDIV_Pos(x) (((x) >>5 ) & 0x1f) /*!< Calculate CLKDIV position offset on MODULE index */ +#define MODULE_IP_EN_Pos(x) (((x) >>0 ) & 0x1f) /*!< Calculate APBCLK offset on MODULE index */ +#define MODULE_NoMsk 0x0 /*!< Not mask on MODULE index */ +#define NA MODULE_NoMsk /*!< Not Available */ + +#define MODULE_APBCLK_ENC(x) (((x) & 0x03) << 30) /*!< MODULE index, 0x0:AHBCLK, 0x1:APBCLK */ +#define MODULE_CLKSEL_ENC(x) (((x) & 0x03) << 28) /*!< CLKSEL offset on MODULE index, 0x0:CLKSEL0, 0x1:CLKSEL1, 0x2:CLKSEL2 */ +#define MODULE_CLKSEL_Msk_ENC(x) (((x) & 0x07) << 25) /*!< CLKSEL mask offset on MODULE index */ +#define MODULE_CLKSEL_Pos_ENC(x) (((x) & 0x1f) << 20) /*!< CLKSEL position offset on MODULE index */ +#define MODULE_CLKDIV_ENC(x) (((x) & 0x03) << 18) /*!< APBCLK CLKDIV on MODULE index, 0x0:CLKDIV */ +#define MODULE_CLKDIV_Msk_ENC(x) (((x) & 0xff) << 10) /*!< CLKDIV mask offset on MODULE index */ +#define MODULE_CLKDIV_Pos_ENC(x) (((x) & 0x1f) << 5) /*!< CLKDIV position offset on MODULE index */ +#define MODULE_IP_EN_Pos_ENC(x) (((x) & 0x1f) << 0) /*!< APBCLK offset on MODULE index */ + + +#define PDMA_MODULE (MODULE_APBCLK_ENC( 0)|MODULE_IP_EN_Pos_ENC(CLK_AHBCLK_PDMA_EN_Pos) |\ + MODULE_CLKSEL_ENC(NA)|MODULE_CLKSEL_Msk_ENC(NA)|MODULE_CLKSEL_Pos_ENC(NA)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< PDMA Module */ +#define ISP_MODULE (MODULE_APBCLK_ENC( 0)|MODULE_IP_EN_Pos_ENC(CLK_AHBCLK_ISP_EN_Pos) |\ + MODULE_CLKSEL_ENC(NA)|MODULE_CLKSEL_Msk_ENC(NA)|MODULE_CLKSEL_Pos_ENC(NA)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< ISP Module */ + +#define WDT_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_WDT_EN_Pos) |\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC( 0)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< WDT Module */ +#define TMR0_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_TMR0_EN_Pos) |\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 7)|MODULE_CLKSEL_Pos_ENC( 8)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< TMR0 Module */ +#define TMR1_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_TMR1_EN_Pos) |\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 7)|MODULE_CLKSEL_Pos_ENC(12)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< TMR1 Module */ +#define TMR2_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_TMR2_EN_Pos) |\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 7)|MODULE_CLKSEL_Pos_ENC(16)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< TMR2 Module */ +#define TMR3_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_TMR3_EN_Pos) |\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 7)|MODULE_CLKSEL_Pos_ENC(20)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< TMR3 Module */ +#define FDIV_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_FDIV_EN_Pos) |\ + MODULE_CLKSEL_ENC( 2)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC( 2)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< FDIV Module */ + +#define I2C0_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_I2C0_EN_Pos) |\ + MODULE_CLKSEL_ENC(NA)|MODULE_CLKSEL_Msk_ENC(NA)|MODULE_CLKSEL_Pos_ENC(NA)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< I2C0 Module */ +#define I2C1_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_I2C1_EN_Pos) |\ + MODULE_CLKSEL_ENC(NA)|MODULE_CLKSEL_Msk_ENC(NA)|MODULE_CLKSEL_Pos_ENC(NA)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< I2C1 Module */ +#define SPI0_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_SPI0_EN_Pos) |\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 1)|MODULE_CLKSEL_Pos_ENC( 4)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< SPI0 Module */ +#define SPI1_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_SPI1_EN_Pos) |\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 1)|MODULE_CLKSEL_Pos_ENC( 5)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< SPI1 Module */ +#define SPI2_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_SPI2_EN_Pos) |\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 1)|MODULE_CLKSEL_Pos_ENC( 6)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< SPI2 Module */ + +#define UART0_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_UART0_EN_Pos)|\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC(24)|\ + MODULE_CLKDIV_ENC( 0)|MODULE_CLKDIV_Msk_ENC(0x0F)|MODULE_CLKDIV_Pos_ENC( 8)) /*!< UART0 Module */ +#define UART1_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_UART1_EN_Pos)|\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC(24)|\ + MODULE_CLKDIV_ENC( 0)|MODULE_CLKDIV_Msk_ENC(0x0F)|MODULE_CLKDIV_Pos_ENC( 8)) /*!< UART1 Module */ + +#define PWM01_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_PWM01_EN_Pos)|\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC(28)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< PWM01 Module */ +#define PWM23_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_PWM23_EN_Pos)|\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC(30)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< PWM23 Module */ +#define USBD_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_USBD_EN_Pos) |\ + MODULE_CLKSEL_ENC(NA)|MODULE_CLKSEL_Msk_ENC(NA)|MODULE_CLKSEL_Pos_ENC(NA)|\ + MODULE_CLKDIV_ENC( 0)|MODULE_CLKDIV_Msk_ENC(0x0F)|MODULE_CLKDIV_Pos_ENC(4)) /*!< USBD Module */ +#define ADC_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_ADC_EN_Pos) |\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC( 2)|\ + MODULE_CLKDIV_ENC( 0)|MODULE_CLKDIV_Msk_ENC(0xFF)|MODULE_CLKDIV_Pos_ENC(16)) /*!< ADC Module */ +#define I2S_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_I2S_EN_Pos) |\ + MODULE_CLKSEL_ENC( 2)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC( 0)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< I2S Module */ +#define PS2_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_PS2_EN_Pos) |\ + MODULE_CLKSEL_ENC(NA)|MODULE_CLKSEL_Msk_ENC(NA)|MODULE_CLKSEL_Pos_ENC(NA)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< PS2 Module */ + +#define WWDT_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_WDT_EN_Pos) |\ + MODULE_CLKSEL_ENC( 2)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC(16)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< WWDT Module */ + +/*@}*/ /* end of group CLK_EXPORTED_CONSTANTS */ + + +/** @addtogroup CLK_EXPORTED_FUNCTIONS CLK Exported Functions + @{ +*/ + + +/** + * @brief Get PLL clock frequency + * @param None + * @return PLL frequency + * @details This function get PLL frequency. The frequency unit is Hz. + */ +__STATIC_INLINE uint32_t CLK_GetPLLClockFreq(void) +{ + uint32_t u32PllFreq = 0, u32PllReg; + uint32_t u32FIN, u32NF, u32NR, u32NO; + uint8_t au8NoTbl[4] = {1, 2, 2, 4}; + + u32PllReg = CLK->PLLCON; + + if(u32PllReg & (CLK_PLLCON_PD_Msk | CLK_PLLCON_OE_Msk)) + return 0; /* PLL is in power down mode or fix low */ + + if(u32PllReg & CLK_PLLCON_PLL_SRC_HIRC) + u32FIN = __HIRC; /* PLL source clock from HIRC */ + else + u32FIN = __HXT; /* PLL source clock from HXT */ + + if(u32PllReg & CLK_PLLCON_BP_Msk) + return u32FIN; /* PLL is in bypass mode */ + + /* PLL is output enabled in normal work mode */ + u32NO = au8NoTbl[((u32PllReg & CLK_PLLCON_OUT_DV_Msk) >> CLK_PLLCON_OUT_DV_Pos)]; + u32NF = ((u32PllReg & CLK_PLLCON_FB_DV_Msk) >> CLK_PLLCON_FB_DV_Pos) + 2; + u32NR = ((u32PllReg & CLK_PLLCON_IN_DV_Msk) >> CLK_PLLCON_IN_DV_Pos) + 2; + + /* u32FIN is shifted 2 bits to avoid overflow */ + u32PllFreq = (((u32FIN >> 2) * u32NF) / (u32NR * u32NO) << 2); + + return u32PllFreq; +} + +/** + * @brief This function execute delay function. + * @param[in] us Delay time. The Max value is 2^24 / CPU Clock(MHz). Ex: + * 72MHz => 233016us, 50MHz => 335544us, + 48MHz => 349525us, 28MHz => 699050us ... + * @return None + * @details Use the SysTick to generate the delay time and the UNIT is in us. + * The SysTick clock source is from HCLK, i.e the same as system core clock. + * User can use SystemCoreClockUpdate() to calculate CyclesPerUs automatically before using this function. + */ +__STATIC_INLINE void CLK_SysTickDelay(uint32_t us) +{ + SysTick->LOAD = us * CyclesPerUs; + SysTick->VAL = (0x00); + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; + + /* Waiting for down-count to zero */ + while((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0); + + /* Disable SysTick counter */ + SysTick->CTRL = 0; +} + + +void CLK_DisableCKO(void); +void CLK_EnableCKO(uint32_t u32ClkSrc, uint32_t u32ClkDiv, uint32_t u32ClkDivBy1En); +void CLK_PowerDown(void); +void CLK_Idle(void); +uint32_t CLK_GetHXTFreq(void); +uint32_t CLK_GetHCLKFreq(void); +uint32_t CLK_GetPCLKFreq(void); +uint32_t CLK_GetCPUFreq(void); +uint32_t CLK_SetCoreClock(uint32_t u32Hclk); +void CLK_SetHCLK(uint32_t u32ClkSrc, uint32_t u32ClkDiv); +void CLK_SetModuleClock(uint32_t u32ModuleIdx, uint32_t u32ClkSrc, uint32_t u32ClkDiv); +void CLK_SetSysTickClockSrc(uint32_t u32ClkSrc); +void CLK_EnableXtalRC(uint32_t u32ClkMask); +void CLK_DisableXtalRC(uint32_t u32ClkMask); +void CLK_EnableModuleClock(uint32_t u32ModuleIdx); +void CLK_DisableModuleClock(uint32_t u32ModuleIdx); +uint32_t CLK_EnablePLL(uint32_t u32PllClkSrc, uint32_t u32PllFreq); +void CLK_DisablePLL(void); +uint32_t CLK_WaitClockReady(uint32_t u32ClkMask); +void CLK_EnableSysTick(uint32_t u32ClkSrc, uint32_t u32Count); +void CLK_DisableSysTick(void); + + +/*@}*/ /* end of group CLK_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group CLK_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + + + +#endif //__CLK_H__ + + + +/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/crc.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/crc.h new file mode 100644 index 00000000..8c78e63f --- /dev/null +++ b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/crc.h @@ -0,0 +1,165 @@ +/**************************************************************************//** + * @file crc.h + * @version V3.00 + * $Revision: 5 $ + * $Date: 15/07/02 11:21a $ + * @brief NUC123 series CRC driver header file + * + * @note + * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __CRC_H__ +#define __CRC_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup CRC_Driver CRC Driver + @{ +*/ + +/** @addtogroup CRC_EXPORTED_CONSTANTS CRC Exported Constants + @{ +*/ +/*---------------------------------------------------------------------------------------------------------*/ +/* CRC Polynomial Mode Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define CRC_CCITT 0x00000000UL /*!DMAIER |= (u32Mask)) + +/** + * @brief Disable CRC Interrupt + * + * @param[in] u32Mask Interrupt mask. Valid values are: + * - \ref CRC_DMAIER_CRC_BLKD_IE_Msk + * - \ref CRC_DMAIER_CRC_TABORT_IE_Msk + * + * @return None + * + * @details This macro disable the specify CRC interrupt function by u32Mask setting. + */ +#define CRC_DISABLE_INT(u32Mask) (CRC->DMAIER &= ~(u32Mask)) + +/** + * @brief Get CRC Interrupt Flag + * + * @param None + * + * @return Interrupt Flag Status + * + * @details This macro gets the CRC interrupt flags. + */ +#define CRC_GET_INT_FLAG() ((uint32_t)(CRC->DMAISR)) + +/** + * @brief Clear CRC Interrupt Flag + * + * @param[in] u32Mask Interrupt mask. Valid values are: + * - \ref CRC_DMAISR_CRC_BLKD_IF_Msk + * - \ref CRC_DMAISR_CRC_TABORT_IF_Msk + * + * @return None + * + * @details This macro clear the specify CRC interrupt flag by u32Mask setting. + */ +#define CRC_CLR_INT_FLAG(u32Mask) (CRC->DMAISR = (u32Mask)) + +/** + * @brief Set CRC seed value + * + * @param[in] u32Seed Seed value + * + * @return None + * + * @details This macro set CRC seed value. + * + * @note User must to setting CRC_RST (CRC_CTL[1] CRC Engine Reset) to reload the new seed value + * to CRC controller. + */ +#define CRC_SET_SEED(u32Seed) { CRC->SEED = (u32Seed); CRC->CTL |= CRC_CTL_CRC_RST_Msk; } + +/** + * @brief Get CRC Seed value + * + * @param None + * + * @return Seed Value + * + * @details This macro gets the current CRC seed value. + */ +#define CRC_GET_SEED() ((uint32_t)(CRC->SEED)) + +/** + * @brief CRC write data + * + * @param[in] u32Data write data + * + * @return None + * + * @details User can write data directly by this macro to perform CRC operation. + */ +#define CRC_WRITE_DATA(u32Data) (CRC->WDATA = (u32Data)) + + +/*********************************************************************/ +void CRC_Open(uint32_t u32Mode, uint32_t u32Attribute, uint32_t u32Seed, uint32_t u32DataLen); +void CRC_StartDMATransfer(uint32_t u32SrcAddr, uint32_t u32ByteCount); +uint32_t CRC_GetChecksum(void); + +/*@}*/ /* end of group CRC_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group CRC_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif //__CRC_H__ + +/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/fmc.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/fmc.h new file mode 100644 index 00000000..5592901f --- /dev/null +++ b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/fmc.h @@ -0,0 +1,480 @@ +/**************************************************************************//** + * @file FMC.h + * @version V3.0 + * $Revision: 10 $ + * $Date: 15/07/02 11:21a $ + * @brief NUC123 Series Flash Memory Controller Driver Header File + * + * @note + * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. + * + ******************************************************************************/ +#ifndef __FMC_H__ +#define __FMC_H__ + +#include "NUC123.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup FMC_Driver FMC Driver + @{ +*/ + +/** @addtogroup FMC_EXPORTED_CONSTANTS FMC Exported Constants + @{ +*/ + + +/*---------------------------------------------------------------------------------------------------------*/ +/* Define Base Address */ +/*---------------------------------------------------------------------------------------------------------*/ +#define FMC_APROM_BASE 0x00000000UL /*!< APROM Base Address */ +#define FMC_LDROM_BASE 0x00100000UL /*!< LDROM Base Address */ +#define FMC_CONFIG_BASE 0x00300000UL /*!< CONFIG Base Address */ + +#define FMC_FLASH_PAGE_SIZE 0x200 /*!< Flash Page Size (512 Bytes) */ +#define FMC_LDROM_SIZE 0x1000 /*!< LDROM Size (4K Bytes) */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* ISPCON constant definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define FMC_ISPCON_BS_LDROM 0x2 /*!< ISPCON setting to select to boot from LDROM */ +#define FMC_ISPCON_BS_APROM 0x0 /*!< ISPCON setting to select to boot from APROM */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* ISPCMD constant definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define FMC_ISPCMD_READ 0x00 /*!< ISP Command: Read Flash */ +#define FMC_ISPCMD_PROGRAM 0x21 /*!< ISP Command: Program Flash */ +#define FMC_ISPCMD_PAGE_ERASE 0x22 /*!< ISP Command: Page Erase Flash */ +#define FMC_ISPCMD_VECMAP 0x2e /*!< ISP Command: Set VECMAP */ +#define FMC_ISPCMD_READ_UID 0x04 /*!< ISP Command: Read Unique ID */ +#define FMC_ISPCMD_READ_CID 0x0B /*!< ISP Command: Read Company ID */ +#define FMC_ISPCMD_READ_DID 0x0C /*!< ISP Command: Read Device ID */ + + +/*@}*/ /* end of group FMC_EXPORTED_CONSTANTS */ + +/** @addtogroup FMC_EXPORTED_FUNCTIONS FMC Exported Functions + @{ +*/ + +/*---------------------------------------------------------------------------------------------------------*/ +/* FMC Macro Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +/** + * @brief Enable ISP Function + * + * @param None + * + * @return None + * + * @details This function will set ISPEN bit of ISPCON control register to enable ISP function. + * + */ +#define FMC_ENABLE_ISP() (FMC->ISPCON |= FMC_ISPCON_ISPEN_Msk) + + +/** + * @brief Disable ISP Function + * + * @param None + * + * @return None + * + * @details This function will clear ISPEN bit of ISPCON control register to disable ISP function. + * + */ +#define FMC_DISABLE_ISP() (FMC->ISPCON &= ~FMC_ISPCON_ISPEN_Msk) + + +/** + * @brief Enable LDROM Update Function + * + * @param None + * + * @return None + * + * @details This function will set LDUEN bit of ISPCON control register to enable LDROM update function. + * User needs to set LDUEN bit before they can update LDROM. + * + */ +#define FMC_ENABLE_LD_UPDATE() (FMC->ISPCON |= FMC_ISPCON_LDUEN_Msk) + + + +/** + * @brief Disable LDROM Update Function + * + * @param None + * + * @return None + * + * @details This function will set ISPEN bit of ISPCON control register to disable LDROM update function. + * + */ +#define FMC_DISABLE_LD_UPDATE() (FMC->ISPCON &= ~FMC_ISPCON_LDUEN_Msk) /*!< Disable LDROM Update Function */ + + + +/** + * @brief Enable User Configuration Update Function + * + * @param None + * + * @return None + * + * @details This function will set CFGUEN bit of ISPCON control register to enable User Configuration update function. + * User needs to set CFGUEN bit before they can update User Configuration area. + * + */ +#define FMC_ENABLE_CFG_UPDATE() (FMC->ISPCON |= FMC_ISPCON_CFGUEN_Msk) + +/** + * @brief Disable User Configuration Update Function + * + * @param None + * + * @return None + * + * @details This function will clear CFGUEN bit of ISPCON control register to disable User Configuration update function. + * + */ +#define FMC_DISABLE_CFG_UPDATE() (FMC->ISPCON &= ~FMC_ISPCON_CFGUEN_Msk) /*!< Disable CONFIG Update Function */ + + +/** + * @brief Enable APROM Update Function + * + * @param None + * + * @return None + * + * @details This function will set APUEN bit of ISPCON control register to enable APROM update function. + * User needs to set APUEN bit before they can update APROM in APROM boot mode. + * + */ +#define FMC_ENABLE_AP_UPDATE() (FMC->ISPCON |= FMC_ISPCON_APUEN_Msk) + + +/** + * @brief Disable APROM Update Function + * + * @param None + * + * @return None + * + * @details This function will clear APUEN bit of ISPCON control register to disable APROM update function. + * + */ +#define FMC_DISABLE_AP_UPDATE() (FMC->ISPCON &= ~FMC_ISPCON_APUEN_Msk) /*!< Disable APROM Update Function */ + +/** + * @brief Get ISP fail flag + * + * @param None + * + * @retval 0 Previous ISP command execution result is successful + * @retval 1 Previous ISP command execution result is fail + * + * @details ISPFF flag of ISPCON is used to indicate ISP command success or fail. + * This function will return the ISPFF flag to identify ISP command OK or fail. + * + */ +#define FMC_GET_FAIL_FLAG() ((FMC->ISPCON & FMC_ISPCON_ISPFF_Msk) ? 1 : 0) + + +/** + * @brief Select booting from APROM + * + * @param None + * + * @return None + * + * @details If MCU is working without IAP, user need to set BS bit of ISPCON and reset CPU to execute the code of LDROM/APROM. + * This function is used to set BS bit of ISPCON to boot to APROM. + * + * @note To valid new BS bit setting, user also need to trigger CPU reset or System Reset Request after setting BS bit. + * + */ +#define FMC_SET_APROM_BOOT() (FMC->ISPCON &= ~FMC_ISPCON_BS_Msk) + +/** + * @brief Select booting from APROM + * + * @param None + * + * @return None + * + * @details If MCU is working without IAP, user need to set/clear BS bit of ISPCON and reset CPU to execute the code of APROM/LDROM. + * This function is used to clear BS bit of ISPCON to boot to LDROM. + * + * @note To valid new BS bit setting, user also need to trigger CPU reset or System Reset Request after clear BS bit. + * + */ +#define FMC_SET_LDROM_BOOT() (FMC->ISPCON |= FMC_ISPCON_BS_Msk) + + +/*---------------------------------------------------------------------------------------------------------*/ +/* inline functions */ +/*---------------------------------------------------------------------------------------------------------*/ +/** + * @brief Program 32-bit data into specified address of flash + * + * @param[in] u32addr Flash address include APROM, LDROM, Data Flash, and CONFIG + * @param[in] u32data 32-bit Data to program + * + * @return None + * + * @details To program word data into Flash include APROM, LDROM, Data Flash, and CONFIG. + * The corresponding functions in CONFIG are listed in FMC section of Technical Reference Manual. + * + */ +static __INLINE void FMC_Write(uint32_t u32addr, uint32_t u32data) +{ + FMC->ISPCMD = FMC_ISPCMD_PROGRAM; /* Set ISP Command Code */ + FMC->ISPADR = u32addr; /* Set Target ROM Address. The address must be word alignment. */ + FMC->ISPDAT = u32data; /* Set Data to Program */ + FMC->ISPTRG = 0x1; /* Trigger to start ISP procedure */ + __ISB(); /* To make sure ISP/CPU be Synchronized */ + while(FMC->ISPTRG); /* Waiting for ISP Done */ +} + +/** + * @brief Read 32-bit Data from specified address of flash + * + * @param[in] u32addr Flash address include APROM, LDROM, Data Flash, and CONFIG + * + * @return The data of specified address + * + * @details To read word data from Flash include APROM, LDROM, Data Flash, and CONFIG. + * + */ +static __INLINE uint32_t FMC_Read(uint32_t u32addr) +{ + FMC->ISPCMD = FMC_ISPCMD_READ; /* Set ISP Command Code */ + FMC->ISPADR = u32addr; /* Set Target ROM Address. The address must be word alignment. */ + FMC->ISPTRG = 0x1; /* Trigger to start ISP procedure */ + __ISB(); /* To make sure ISP/CPU be Synchronized */ + while(FMC->ISPTRG); /* Waiting for ISP Done */ + + return FMC->ISPDAT; +} + + +/** + * @brief Flash page erase + * + * @param[in] u32addr Flash address including APROM, LDROM, Data Flash, and CONFIG + * + * @details To do flash page erase. The target address could be APROM, LDROM, Data Flash, or CONFIG. + * The page size is 512 bytes. + * + * @retval 0 Success + * @retval -1 Erase failed + * + */ +static __INLINE int32_t FMC_Erase(uint32_t u32addr) +{ + FMC->ISPCMD = FMC_ISPCMD_PAGE_ERASE; /* Set ISP Command Code */ + FMC->ISPADR = u32addr; /* Set Target ROM Address. The address must be page alignment. */ + FMC->ISPTRG = 0x1; /* Trigger to start ISP procedure */ + __ISB(); /* To make sure ISP/CPU be Synchronized */ + while(FMC->ISPTRG); /* Waiting for ISP Done */ + + /* Check ISPFF flag to know whether erase OK or fail. */ + if(FMC->ISPCON & FMC_ISPCON_ISPFF_Msk) + { + FMC->ISPCON |= FMC_ISPCON_ISPFF_Msk; + return -1; + } + return 0; +} + +/** + * @brief Read Unique ID + * + * @param[in] u8index UID index. 0 = UID[31:0], 1 = UID[63:32], 2 = UID[95:64] + * + * @return The 32-bit unique ID data of specified UID index. + * + * @details To read out 96-bit Unique ID. + * + */ +static __INLINE uint32_t FMC_ReadUID(uint8_t u8index) +{ + FMC->ISPCMD = FMC_ISPCMD_READ_UID; /* Set ISP Command Code */ + FMC->ISPADR = (u8index << 2); /* Set UID Address. It must be word alignment. */ + FMC->ISPTRG = 0x1; /* Trigger to start ISP procedure */ + __ISB(); /* To make sure ISP/CPU be Synchronized */ + while(FMC->ISPTRG); /* Waiting for ISP Done */ + + return FMC->ISPDAT; +} + + +/** + * @brief Read company ID + * + * @param None + * + * @return The company ID (32-bit) + * + * @details The company ID of Nuvoton is fixed to be 0xDA + * + */ +static __INLINE uint32_t FMC_ReadCID(void) +{ + FMC->ISPCMD = FMC_ISPCMD_READ_CID; /* Set ISP Command Code */ + FMC->ISPADR = 0x0; /* Must keep 0x0 when read CID */ + FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk; /* Trigger to start ISP procedure */ + __ISB(); /* To make sure ISP/CPU be Synchronized */ + while(FMC->ISPTRG & FMC_ISPTRG_ISPGO_Msk) ; /* Waiting for ISP Done */ + + return FMC->ISPDAT; +} + + +/** + * @brief Read device ID + * + * @param None + * + * @return The device ID (32-bit) + * + * @details This function is used to read device ID. + * + */ +static __INLINE uint32_t FMC_ReadDID(void) +{ + FMC->ISPCMD = FMC_ISPCMD_READ_DID; /* Set ISP Command Code */ + FMC->ISPADR = 0; /* Must keep 0x0 when read DID */ + FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk; /* Trigger to start ISP procedure */ + __ISB(); /* To make sure ISP/CPU be Synchronized */ + while(FMC->ISPTRG & FMC_ISPTRG_ISPGO_Msk); /* Waiting for ISP Done */ + + return FMC->ISPDAT; +} + + + +/** + * @brief Read product ID + * + * @param None + * + * @return The product ID (32-bit) + * + * @details This function is used to read product ID. + * + */ +static __INLINE uint32_t FMC_ReadPID(void) +{ + FMC->ISPCMD = FMC_ISPCMD_READ_DID; /* Set ISP Command Code */ + FMC->ISPADR = 0x04; /* Must keep 0x4 when read PID */ + FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk; /* Trigger to start ISP procedure */ + __ISB(); /* To make sure ISP/CPU be Synchronized */ + while(FMC->ISPTRG & FMC_ISPTRG_ISPGO_Msk); /* Waiting for ISP Done */ + + return FMC->ISPDAT; +} + +/** + * @brief To read UCID + * + * @param[in] u32Index Index of the UCID to read. u32Index must be 0, 1, 2, or 3. + * + * @return The UCID of specified index + * + * @details This function is used to read unique chip ID (UCID). + * + */ +static __INLINE uint32_t FMC_ReadUCID(uint32_t u32Index) +{ + FMC->ISPCMD = FMC_ISPCMD_READ_UID; /* Set ISP Command Code */ + FMC->ISPADR = (0x04 * u32Index) + 0x10; /* The UCID is at offset 0x10 with word alignment. */ + FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk; /* Trigger to start ISP procedure */ + __ISB(); /* To make sure ISP/CPU be Synchronized */ + while(FMC->ISPTRG & FMC_ISPTRG_ISPGO_Msk); /* Waiting for ISP Done */ + + return FMC->ISPDAT; +} + + + +/** + * @brief Set vector mapping address + * + * @param[in] u32PageAddr The page address to remap to address 0x0. The address must be page alignment. + * + * @return None + * + * @details This function is used to set VECMAP to map specified page to vector page (0x0). + * + * @note + * VECMAP only valid when new IAP function is enabled. (CBS = 10'b or 00'b) + * + */ +static __INLINE void FMC_SetVectorPageAddr(uint32_t u32PageAddr) +{ + FMC->ISPCMD = FMC_ISPCMD_VECMAP; /* Set ISP Command Code */ + FMC->ISPADR = u32PageAddr; /* The address of specified page which will be map to address 0x0. It must be page alignment. */ + FMC->ISPTRG = 0x1; /* Trigger to start ISP procedure */ + __ISB(); /* To make sure ISP/CPU be Synchronized */ + while(FMC->ISPTRG); /* Waiting for ISP Done */ +} + + +/** + * @brief Get current vector mapping address. + * + * @param None + * + * @return The current vector mapping address. + * + * @details To get VECMAP value which is the page address for remapping to vector page (0x0). + * + * @note + * VECMAP only valid when new IAP function is enabled. (CBS = 10'b or 00'b) + * + */ +static __INLINE uint32_t FMC_GetVECMAP(void) +{ + return (FMC->ISPSTA & FMC_ISPSTA_VECMAP_Msk); +} + +extern void FMC_Open(void); +extern void FMC_Close(void); +extern void FMC_EnableAPUpdate(void); +extern void FMC_DisableAPUpdate(void); +extern void FMC_EnableConfigUpdate(void); +extern void FMC_DisableConfigUpdate(void); +extern void FMC_EnableLDUpdate(void); +extern void FMC_DisableLDUpdate(void); +extern int32_t FMC_ReadConfig(uint32_t *u32Config, uint32_t u32Count); +extern int32_t FMC_WriteConfig(uint32_t *u32Config, uint32_t u32Count); +extern void FMC_SetBootSource(int32_t i32BootSrc); +extern int32_t FMC_GetBootSource(void); +extern uint32_t FMC_ReadDataFlashBaseAddr(void); + +/*@}*/ /* end of group FMC_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group FMC_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + + +#endif + diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/gpio.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/gpio.h new file mode 100644 index 00000000..ad34654b --- /dev/null +++ b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/gpio.h @@ -0,0 +1,457 @@ +/**************************************************************************//** + * @file GPIO.h + * @version V3.00 + * $Revision: 13 $ + * $Date: 15/07/02 11:21a $ + * @brief NUC123 Series General Purpose I/O Driver Header File + * + * @note + * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. + * + ******************************************************************************/ +#ifndef __GPIO_H__ +#define __GPIO_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup GPIO_Driver GPIO Driver + @{ +*/ + +/** @addtogroup GPIO_EXPORTED_CONSTANTS GPIO Exported Constants + @{ +*/ +#define GPIO_PIN_MAX 16 /*!< Specify Maximum Pins of Each GPIO Port */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* PMD Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define GPIO_PMD_INPUT 0x0UL /*!< Input Mode */ +#define GPIO_PMD_OUTPUT 0x1UL /*!< Output Mode */ +#define GPIO_PMD_OPEN_DRAIN 0x2UL /*!< Open-Drain Mode */ +#define GPIO_PMD_QUASI 0x3UL /*!< Quasi-bidirectional Mode */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* GPIO Interrupt Type Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define GPIO_INT_RISING 0x00010000UL /*!< Interrupt enable by Input Rising Edge */ +#define GPIO_INT_FALLING 0x00000001UL /*!< Interrupt enable by Input Falling Edge */ +#define GPIO_INT_BOTH_EDGE 0x00010001UL /*!< Interrupt enable by both Rising Edge and Falling Edge */ +#define GPIO_INT_HIGH 0x01010000UL /*!< Interrupt enable by Level-High */ +#define GPIO_INT_LOW 0x01000001UL /*!< Interrupt enable by Level-Level */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* IMD Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define GPIO_IMD_EDGE 0UL /*!< IMD Setting for Edge Trigger Mode */ +#define GPIO_IMD_LEVEL 1UL /*!< IMD Setting for Edge Level Mode */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* DBNCECON Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define GPIO_INT_CLK_ON 0x00000020UL /*!< DBNCECON setting for all IO pins edge detection circuit is always active after reset */ +#define GPIO_INT_CLK_OFF 0x00000000UL /*!< DBNCECON setting for edge detection circuit is active only if IO pin corresponding GPIOx_IEN bit is set to 1 */ + +#define GPIO_DBCLKSRC_LIRC 0x00000010UL /*!< DBNCECON setting for de-bounce counter clock source is the internal 10 kHz */ +#define GPIO_DBCLKSRC_HCLK 0x00000000UL /*!< DBNCECON setting for de-bounce counter clock source is the HCLK */ + +#define GPIO_DBCLKSEL_1 0x00000000UL /*!< DBNCECON setting for sampling cycle = 1 clocks */ +#define GPIO_DBCLKSEL_2 0x00000001UL /*!< DBNCECON setting for sampling cycle = 2 clocks */ +#define GPIO_DBCLKSEL_4 0x00000002UL /*!< DBNCECON setting for sampling cycle = 4 clocks */ +#define GPIO_DBCLKSEL_8 0x00000003UL /*!< DBNCECON setting for sampling cycle = 8 clocks */ +#define GPIO_DBCLKSEL_16 0x00000004UL /*!< DBNCECON setting for sampling cycle = 16 clocks */ +#define GPIO_DBCLKSEL_32 0x00000005UL /*!< DBNCECON setting for sampling cycle = 32 clocks */ +#define GPIO_DBCLKSEL_64 0x00000006UL /*!< DBNCECON setting for sampling cycle = 64 clocks */ +#define GPIO_DBCLKSEL_128 0x00000007UL /*!< DBNCECON setting for sampling cycle = 128 clocks */ +#define GPIO_DBCLKSEL_256 0x00000008UL /*!< DBNCECON setting for sampling cycle = 256 clocks */ +#define GPIO_DBCLKSEL_512 0x00000009UL /*!< DBNCECON setting for sampling cycle = 512 clocks */ +#define GPIO_DBCLKSEL_1024 0x0000000AUL /*!< DBNCECON setting for sampling cycle = 1024 clocks */ +#define GPIO_DBCLKSEL_2048 0x0000000BUL /*!< DBNCECON setting for sampling cycle = 2048 clocks */ +#define GPIO_DBCLKSEL_4096 0x0000000CUL /*!< DBNCECON setting for sampling cycle = 4096 clocks */ +#define GPIO_DBCLKSEL_8192 0x0000000DUL /*!< DBNCECON setting for sampling cycle = 8192 clocks */ +#define GPIO_DBCLKSEL_16384 0x0000000EUL /*!< DBNCECON setting for sampling cycle = 16384 clocks */ +#define GPIO_DBCLKSEL_32768 0x0000000FUL /*!< DBNCECON setting for sampling cycle = 32768 clocks */ + + +/* Define GPIO Pin Data Input/Output. It could be used to control each I/O pin by pin address mapping. + Example 1: + + PA10 = 1; + + It is used to set GPIO PA.10 to high; + + Example 2: + + if (PA10) + PA10 = 0; + + If GPIO PA.10 pin status is high, then set GPIO PA.10 data output to low. + */ +#define GPIO_PIN_DATA(port, pin) (*((volatile uint32_t *)((GPIO_PIN_DATA_BASE+(0x40*(port))) + ((pin)<<2)))) +#define PA10 GPIO_PIN_DATA(0, 10) /*!< Specify PA.10 Pin Data Input/Output */ +#define PA11 GPIO_PIN_DATA(0, 11) /*!< Specify PA.11 Pin Data Input/Output */ +#define PA12 GPIO_PIN_DATA(0, 12) /*!< Specify PA.12 Pin Data Input/Output */ +#define PA13 GPIO_PIN_DATA(0, 13) /*!< Specify PA.13 Pin Data Input/Output */ +#define PA14 GPIO_PIN_DATA(0, 14) /*!< Specify PA.14 Pin Data Input/Output */ +#define PA15 GPIO_PIN_DATA(0, 15) /*!< Specify PA.15 Pin Data Input/Output */ +#define PB0 GPIO_PIN_DATA(1, 0 ) /*!< Specify PB.0 Pin Data Input/Output */ +#define PB1 GPIO_PIN_DATA(1, 1 ) /*!< Specify PB.1 Pin Data Input/Output */ +#define PB2 GPIO_PIN_DATA(1, 2 ) /*!< Specify PB.2 Pin Data Input/Output */ +#define PB3 GPIO_PIN_DATA(1, 3 ) /*!< Specify PB.3 Pin Data Input/Output */ +#define PB4 GPIO_PIN_DATA(1, 4 ) /*!< Specify PB.4 Pin Data Input/Output */ +#define PB5 GPIO_PIN_DATA(1, 5 ) /*!< Specify PB.5 Pin Data Input/Output */ +#define PB6 GPIO_PIN_DATA(1, 6 ) /*!< Specify PB.6 Pin Data Input/Output */ +#define PB7 GPIO_PIN_DATA(1, 7 ) /*!< Specify PB.7 Pin Data Input/Output */ +#define PB8 GPIO_PIN_DATA(1, 8 ) /*!< Specify PB.8 Pin Data Input/Output */ +#define PB9 GPIO_PIN_DATA(1, 9 ) /*!< Specify PB.9 Pin Data Input/Output */ +#define PB10 GPIO_PIN_DATA(1, 10) /*!< Specify PB.10 Pin Data Input/Output */ +#define PB12 GPIO_PIN_DATA(1, 12) /*!< Specify PB.12 Pin Data Input/Output */ +#define PB13 GPIO_PIN_DATA(1, 13) /*!< Specify PB.13 Pin Data Input/Output */ +#define PB14 GPIO_PIN_DATA(1, 14) /*!< Specify PB.14 Pin Data Input/Output */ +#define PB15 GPIO_PIN_DATA(1, 15) /*!< Specify PB.15 Pin Data Input/Output */ +#define PC0 GPIO_PIN_DATA(2, 0 ) /*!< Specify PC.0 Pin Data Input/Output */ +#define PC1 GPIO_PIN_DATA(2, 1 ) /*!< Specify PC.1 Pin Data Input/Output */ +#define PC2 GPIO_PIN_DATA(2, 2 ) /*!< Specify PC.2 Pin Data Input/Output */ +#define PC3 GPIO_PIN_DATA(2, 3 ) /*!< Specify PC.3 Pin Data Input/Output */ +#define PC4 GPIO_PIN_DATA(2, 4 ) /*!< Specify PC.4 Pin Data Input/Output */ +#define PC5 GPIO_PIN_DATA(2, 5 ) /*!< Specify PC.5 Pin Data Input/Output */ +#define PC8 GPIO_PIN_DATA(2, 8 ) /*!< Specify PC.8 Pin Data Input/Output */ +#define PC9 GPIO_PIN_DATA(2, 9 ) /*!< Specify PC.9 Pin Data Input/Output */ +#define PC10 GPIO_PIN_DATA(2, 10) /*!< Specify PC.10 Pin Data Input/Output */ +#define PC11 GPIO_PIN_DATA(2, 11) /*!< Specify PC.11 Pin Data Input/Output */ +#define PC12 GPIO_PIN_DATA(2, 12) /*!< Specify PC.12 Pin Data Input/Output */ +#define PC13 GPIO_PIN_DATA(2, 13) /*!< Specify PC.13 Pin Data Input/Output */ +#define PD0 GPIO_PIN_DATA(3, 0 ) /*!< Specify PD.0 Pin Data Input/Output */ +#define PD1 GPIO_PIN_DATA(3, 1 ) /*!< Specify PD.1 Pin Data Input/Output */ +#define PD2 GPIO_PIN_DATA(3, 2 ) /*!< Specify PD.2 Pin Data Input/Output */ +#define PD3 GPIO_PIN_DATA(3, 3 ) /*!< Specify PD.3 Pin Data Input/Output */ +#define PD4 GPIO_PIN_DATA(3, 4 ) /*!< Specify PD.4 Pin Data Input/Output */ +#define PD5 GPIO_PIN_DATA(3, 5 ) /*!< Specify PD.5 Pin Data Input/Output */ +#define PD8 GPIO_PIN_DATA(3, 8 ) /*!< Specify PD.8 Pin Data Input/Output */ +#define PD9 GPIO_PIN_DATA(3, 9 ) /*!< Specify PD.9 Pin Data Input/Output */ +#define PD10 GPIO_PIN_DATA(3, 10) /*!< Specify PD.10 Pin Data Input/Output */ +#define PD11 GPIO_PIN_DATA(3, 11) /*!< Specify PD.11 Pin Data Input/Output */ +#define PF0 GPIO_PIN_DATA(5, 0 ) /*!< Specify PF.0 Pin Data Input/Output */ +#define PF1 GPIO_PIN_DATA(5, 1 ) /*!< Specify PF.1 Pin Data Input/Output */ +#define PF2 GPIO_PIN_DATA(5, 2 ) /*!< Specify PF.2 Pin Data Input/Output */ +#define PF3 GPIO_PIN_DATA(5, 3 ) /*!< Specify PF.3 Pin Data Input/Output */ + + +/*@}*/ /* end of group GPIO_EXPORTED_CONSTANTS */ + + +/** @addtogroup GPIO_EXPORTED_FUNCTIONS GPIO Exported Functions + @{ +*/ + +/** + * @brief Clear GPIO Pin Interrupt Flag + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. + * @param[in] u32PinMask The single or multiple pins of specified GPIO port. \n + * It could be BIT10 ~ BIT15 for PA GPIO port. \n + * It could be BIT0 ~ BIT10 and BIT12 ~ BIT15 for PB GPIO port. \n + * It could be BIT0 ~ BIT5 and BIT8 ~ BIT13 for PC GPIO port. \n + * It could be BIT0 ~ BIT5 and BIT8 ~ BIT11 for PD GPIO port. \n + * It could be BIT0 ~ BIT3 for PF GPIO port. + * + * @return None + * + * @details Clear the interrupt status of specified GPIO pin. + */ +#define GPIO_CLR_INT_FLAG(port, u32PinMask) ((port)->ISRC = (u32PinMask)) + +/** + * @brief Disable Pin De-bounce Function + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. + * @param[in] u32PinMask The single or multiple pins of specified GPIO port. \n + * It could be BIT10 ~ BIT15 for PA GPIO port. \n + * It could be BIT0 ~ BIT10 and BIT12 ~ BIT15 for PB GPIO port. \n + * It could be BIT0 ~ BIT5 and BIT8 ~ BIT13 for PC GPIO port. \n + * It could be BIT0 ~ BIT5 and BIT8 ~ BIT11 for PD GPIO port. \n + * It could be BIT0 ~ BIT3 for PF GPIO port. + * + * @return None + * + * @details Disable the interrupt de-bounce function of specified GPIO pin. + */ +#define GPIO_DISABLE_DEBOUNCE(port, u32PinMask) ((port)->DBEN &= ~(u32PinMask)) + +/** + * @brief Enable Pin De-bounce Function + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. + * @param[in] u32PinMask The single or multiple pins of specified GPIO port. \n + * It could be BIT10 ~ BIT15 for PA GPIO port. \n + * It could be BIT0 ~ BIT10 and BIT12 ~ BIT15 for PB GPIO port. \n + * It could be BIT0 ~ BIT5 and BIT8 ~ BIT13 for PC GPIO port. \n + * It could be BIT0 ~ BIT5 and BIT8 ~ BIT11 for PD GPIO port. \n + * It could be BIT0 ~ BIT3 for PF GPIO port. + * + * @return None + * + * @details Enable the interrupt de-bounce function of specified GPIO pin. + */ +#define GPIO_ENABLE_DEBOUNCE(port, u32PinMask) ((port)->DBEN |= (u32PinMask)) + +/** + * @brief Disable I/O Digital Input Path + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. + * @param[in] u32PinMask The single or multiple pins of specified GPIO port. \n + * It could be BIT10 ~ BIT15 for PA GPIO port. \n + * It could be BIT0 ~ BIT10 and BIT12 ~ BIT15 for PB GPIO port. \n + * It could be BIT0 ~ BIT5 and BIT8 ~ BIT13 for PC GPIO port. \n + * It could be BIT0 ~ BIT5 and BIT8 ~ BIT11 for PD GPIO port. \n + * It could be BIT0 ~ BIT3 for PF GPIO port. + * + * @return None + * + * @details Disable I/O digital input path of specified GPIO pin. + */ +#define GPIO_DISABLE_DIGITAL_PATH(port, u32PinMask) ((port)->OFFD |= ((u32PinMask)<<16)) + +/** + * @brief Enable I/O Digital Input Path + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. + * @param[in] u32PinMask The single or multiple pins of specified GPIO port \n. + * It could be BIT10 ~ BIT15 for PA GPIO port. \n + * It could be BIT0 ~ BIT10 and BIT12 ~ BIT15 for PB GPIO port. \n + * It could be BIT0 ~ BIT5 and BIT8 ~ BIT13 for PC GPIO port. \n + * It could be BIT0 ~ BIT5 and BIT8 ~ BIT11 for PD GPIO port. \n + * It could be BIT0 ~ BIT3 for PF GPIO port. + * + * @return None + * + * @details Enable I/O digital input path of specified GPIO pin. + */ +#define GPIO_ENABLE_DIGITAL_PATH(port, u32PinMask) ((port)->OFFD &= ~((u32PinMask)<<16)) + +/** + * @brief Disable I/O DOUT mask + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. + * @param[in] u32PinMask The single or multiple pins of specified GPIO port. \n + * It could be BIT10 ~ BIT15 for PA GPIO port. \n + * It could be BIT0 ~ BIT10 and BIT12 ~ BIT15 for PB GPIO port. \n + * It could be BIT0 ~ BIT5 and BIT8 ~ BIT13 for PC GPIO port. \n + * It could be BIT0 ~ BIT5 and BIT8 ~ BIT11 for PD GPIO port. \n + * It could be BIT0 ~ BIT3 for PF GPIO port. + * + * @return None + * + * @details Disable I/O DOUT mask of specified GPIO pin. + */ +#define GPIO_DISABLE_DOUT_MASK(port, u32PinMask) ((port)->DMASK &= ~(u32PinMask)) + +/** + * @brief Enable I/O DOUT mask + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. + * @param[in] u32PinMask The single or multiple pins of specified GPIO port. \n + * It could be BIT10 ~ BIT15 for PA GPIO port. \n + * It could be BIT0 ~ BIT10 and BIT12 ~ BIT15 for PB GPIO port. \n + * It could be BIT0 ~ BIT5 and BIT8 ~ BIT13 for PC GPIO port. \n + * It could be BIT0 ~ BIT5 and BIT8 ~ BIT11 for PD GPIO port. \n + * It could be BIT0 ~ BIT3 for PF GPIO port. + * + * @return None + * + * @details Enable I/O DOUT mask of specified GPIO pin. + */ +#define GPIO_ENABLE_DOUT_MASK(port, u32PinMask) ((port)->DMASK |= (u32PinMask)) + +/** + * @brief Get GPIO Pin Interrupt Flag + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. + * @param[in] u32PinMask The single or multiple pins of specified GPIO port. \n + * It could be BIT10 ~ BIT15 for PA GPIO port. \n + * It could be BIT0 ~ BIT10 and BIT12 ~ BIT15 for PB GPIO port. \n + * It could be BIT0 ~ BIT5 and BIT8 ~ BIT13 for PC GPIO port. \n + * It could be BIT0 ~ BIT5 and BIT8 ~ BIT11 for PD GPIO port. \n + * It could be BIT0 ~ BIT3 for PF GPIO port. + * + * @retval 0 No interrupt at specified GPIO pin + * @retval 1 The specified GPIO pin generate an interrupt + * + * @details Get the interrupt status of specified GPIO pin. + */ +#define GPIO_GET_INT_FLAG(port, u32PinMask) ((port)->ISRC & (u32PinMask)) + +/** + * @brief Set De-bounce Sampling Cycle Time + * + * @param[in] u32ClkSrc The de-bounce counter clock source. It could be : + * - \ref GPIO_DBCLKSRC_HCLK + * - \ref GPIO_DBCLKSRC_LIRC + * @param[in] u32ClkSel The de-bounce sampling cycle selection. It could be : + * - \ref GPIO_DBCLKSEL_1 + * - \ref GPIO_DBCLKSEL_2 + * - \ref GPIO_DBCLKSEL_4 + * - \ref GPIO_DBCLKSEL_8 + * - \ref GPIO_DBCLKSEL_16 + * - \ref GPIO_DBCLKSEL_32 + * - \ref GPIO_DBCLKSEL_64 + * - \ref GPIO_DBCLKSEL_128 + * - \ref GPIO_DBCLKSEL_256 + * - \ref GPIO_DBCLKSEL_512 + * - \ref GPIO_DBCLKSEL_1024 + * - \ref GPIO_DBCLKSEL_2048 + * - \ref GPIO_DBCLKSEL_4096 + * - \ref GPIO_DBCLKSEL_8192 + * - \ref GPIO_DBCLKSEL_16384 + * - \ref GPIO_DBCLKSEL_32768 + * + * @return None + * + * @details Set the interrupt de-bounce sampling cycle time based on the debounce counter clock source. \n + * Example: _GPIO_SET_DEBOUNCE_TIME(GPIO_DBNCECON_DBCLKSRC_LIRC, GPIO_DBCLKSEL_4). \n + * It's meaning the De-debounce counter clock source is internal 10 KHz and sampling cycle selection is 4. \n + * Then the target de-bounce sampling cycle time is (4)*(1/(10*1000)) s = 4*0.0001 s = 400 us, + * and system will sampling interrupt input once per 400 us. + */ +#define GPIO_SET_DEBOUNCE_TIME(u32ClkSrc, u32ClkSel) (GPIO->DBNCECON = (GPIO_DBNCECON_ICLK_ON_Msk | (u32ClkSrc) | (u32ClkSel))) + +/** + * @brief Get GPIO Port IN Data + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. + * + * @return The specified port data + * + * @details Get the PIN register of specified GPIO port. + */ +#define GPIO_GET_IN_DATA(port) ((port)->PIN) + +/** + * @brief Set GPIO Port OUT Data + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. + * @param[in] u32Data GPIO port data. + * + * @return None + * + * @details Set the Data into specified GPIO port. + */ +#define GPIO_SET_OUT_DATA(port, u32Data) ((port)->DOUT = (u32Data)) + +/** + * @brief Toggle Specified GPIO pin + * + * @param[in] u32Pin Pxy + * + * @return None + * + * @details Toggle the specified GPIO pint. + */ +#define GPIO_TOGGLE(u32Pin) ((u32Pin) ^= 1) + +/** + * @brief Enable External GPIO Interrupt 0 + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. + * @param[in] u32Pin The pin of specified GPIO port. \n + * It could be 10 ~ 15 for PA GPIO port. \n + * It could be 0 ~ 10 and 12 ~ 15 for PB GPIO port. \n + * It could be 0 ~ 5 and 8 ~ 13 for PC GPIO port. \n + * It could be 0 ~ 5 and 8 ~ 11 for PD GPIO port. \n + * It could be 0 ~ 3 for PF GPIO port. + * @param[in] u32IntAttribs The interrupt attribute of specified GPIO pin. It could be \n + * - \ref GPIO_INT_RISING + * - \ref GPIO_INT_FALLING + * - \ref GPIO_INT_BOTH_EDGE + * - \ref GPIO_INT_HIGH + * - \ref GPIO_INT_LOW + * + * @return None + * + * @details This function is used to enable specified GPIO pin interrupt. + */ +#define GPIO_EnableEINT0 GPIO_EnableInt + + +/** + * @brief Disable External GPIO Interrupt 0 + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. + * @param[in] u32Pin The pin of specified GPIO port. \n + * It could be 10 ~ 15 for PA GPIO port. \n + * It could be 0 ~ 10 and 12 ~ 15 for PB GPIO port. \n + * It could be 0 ~ 5 and 8 ~ 13 for PC GPIO port. \n + * It could be 0 ~ 5 and 8 ~ 11 for PD GPIO port. \n + * It could be 0 ~ 3 for PF GPIO port. + * + * @return None + * + * @details This function is used to enable specified GPIO pin interrupt. + */ +#define GPIO_DisableEINT0 GPIO_DisableInt + + +/** + * @brief Enable External GPIO Interrupt 1 + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. + * @param[in] u32Pin The pin of specified GPIO port. \n + * It could be 10 ~ 15 for PA GPIO port. \n + * It could be 0 ~ 10 and 12 ~ 15 for PB GPIO port. \n + * It could be 0 ~ 5 and 8 ~ 13 for PC GPIO port. \n + * It could be 0 ~ 5 and 8 ~ 11 for PD GPIO port. \n + * It could be 0 ~ 3 for PF GPIO port. + * @param[in] u32IntAttribs The interrupt attribute of specified GPIO pin. It could be \n + * GPIO_INT_RISING, GPIO_INT_FALLING, GPIO_INT_BOTH_EDGE, GPIO_INT_HIGH, GPIO_INT_LOW. + * + * @return None + * + * @details This function is used to enable specified GPIO pin interrupt. + */ +#define GPIO_EnableEINT1 GPIO_EnableInt + + +/** + * @brief Disable External GPIO Interrupt 1 + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. + * @param[in] u32Pin The pin of specified GPIO port. \n + * It could be 10 ~ 15 for PA GPIO port. \n + * It could be 0 ~ 10 and 12 ~ 15 for PB GPIO port. \n + * It could be 0 ~ 5 and 8 ~ 13 for PC GPIO port. \n + * It could be 0 ~ 5 and 8 ~ 11 for PD GPIO port. \n + * It could be 0 ~ 3 for PF GPIO port. + * + * @return None + * + * @details This function is used to enable specified GPIO pin interrupt. + */ +#define GPIO_DisableEINT1 GPIO_DisableInt + + +void GPIO_SetMode(GPIO_T *port, uint32_t u32PinMask, uint32_t u32Mode); +void GPIO_EnableInt(GPIO_T *port, uint32_t u32Pin, uint32_t u32IntAttribs); +void GPIO_DisableInt(GPIO_T *port, uint32_t u32Pin); + + +/*@}*/ /* end of group GPIO_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group GPIO_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif //__GPIO_H__ + +/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/i2c.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/i2c.h new file mode 100644 index 00000000..36e04b7b --- /dev/null +++ b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/i2c.h @@ -0,0 +1,211 @@ +/**************************************************************************//** + * @file I2C.h + * @version V3.0 + * $Revision: 10 $ + * $Date: 16/06/22 11:46a $ + * @brief NUC123 Series I2C Driver Header File + * + * @note + * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. + * + ******************************************************************************/ +#ifndef __I2C_H__ +#define __I2C_H__ + +#include "NUC123.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup I2C_Driver I2C Driver + @{ +*/ + +/** @addtogroup I2C_EXPORTED_CONSTANTS I2C Exported Constants + @{ +*/ + +/*---------------------------------------------------------------------------------------------------------*/ +/* I2CON constant definitions. */ +/*---------------------------------------------------------------------------------------------------------*/ +#define I2C_I2CON_STA_STO_SI 0x38UL /*!< I2CON setting for I2C control bits. It would set STA, STO and SI bits */ +#define I2C_I2CON_STA_STO_SI_AA 0x3CUL /*!< I2CON setting for I2C control bits. It would set STA, STO, SI and AA bits */ +#define I2C_I2CON_STA_SI 0x28UL /*!< I2CON setting for I2C control bits. It would set STA and SI bits */ +#define I2C_I2CON_STA_SI_AA 0x2CUL /*!< I2CON setting for I2C control bits. It would set STA, SI and AA bits */ +#define I2C_I2CON_STO_SI 0x18UL /*!< I2CON setting for I2C control bits. It would set STO and SI bits */ +#define I2C_I2CON_STO_SI_AA 0x1CUL /*!< I2CON setting for I2C control bits. It would set STO, SI and AA bits */ +#define I2C_I2CON_SI 0x08UL /*!< I2CON setting for I2C control bits. It would set SI bit */ +#define I2C_I2CON_SI_AA 0x0CUL /*!< I2CON setting for I2C control bits. It would set SI and AA bits */ +#define I2C_I2CON_STA 0x20UL /*!< I2CON setting for I2C control bits. It would set STA bit */ +#define I2C_I2CON_STO 0x10UL /*!< I2CON setting for I2C control bits. It would set STO bit */ +#define I2C_I2CON_AA 0x04UL /*!< I2CON setting for I2C control bits. It would set AA bit */ + +#define I2C_GCMODE_ENABLE 1 /*!< Enable I2C GC Mode */ +#define I2C_GCMODE_DISABLE 0 /*!< Disable I2C GC Mode */ + +/*@}*/ /* end of group I2C_EXPORTED_CONSTANTS */ + +/** @addtogroup I2C_EXPORTED_FUNCTIONS I2C Exported Functions + @{ +*/ +/** + * @brief The macro is used to set I2C bus condition at One Time + * + * @param[in] i2c Specify I2C port + * @param[in] u8Ctrl A byte writes to I2C control register + * + * @return None + * + * @details Set I2CON register to control I2C bus conditions of START, STOP, SI, ACK. + */ +#define I2C_SET_CONTROL_REG(i2c, u8Ctrl) ((i2c)->I2CON = ((i2c)->I2CON & ~0x3c) | (u8Ctrl)) + +/** + * @brief The macro is used to set START condition of I2C Bus + * + * @param[in] i2c Specify I2C port + * + * @return None + * + * @details Set the I2C bus START condition in I2CON register. + */ +#define I2C_START(i2c) ((i2c)->I2CON = ((i2c)->I2CON | I2C_I2CON_SI_Msk) | I2C_I2CON_STA_Msk) + +/** + * @brief The macro is used to set STOP condition of I2C Bus + * + * @param[in] i2c Specify I2C port + * + * @return None + * + * @details Set the I2C bus STOP condition in I2CON register. + */ +#define I2C_STOP(i2c) ((i2c)->I2CON = ((i2c)->I2CON | I2C_I2CON_SI_Msk) | I2C_I2CON_STO_Msk) + +/** + * @brief The macro is used to wait I2C bus status get ready + * + * @param[in] i2c Specify I2C port + * + * @return None + * + * @details When a new status is presented of I2C bus, the SI flag will be set in I2CON register. + */ +#define I2C_WAIT_READY(i2c) while(!((i2c)->I2CON & I2C_I2CON_SI_Msk)) + +/** + * @brief The macro is used to Read I2C Bus Data Register + * + * @param[in] i2c Specify I2C port + * + * @return A byte of I2C data register + * + * @details I2C controller read data from bus and save it in I2CDAT register. + */ +#define I2C_GET_DATA(i2c) ((i2c)->I2CDAT) + +/** + * @brief Write a Data to I2C Data Register + * + * @param[in] i2c Specify I2C port + * @param[in] u8Data A byte that writes to data register + * + * @return None + * + * @details When write a data to I2CDAT register, the I2C controller will shift it to I2C bus. + */ +#define I2C_SET_DATA(i2c, u8Data) ((i2c)->I2CDAT = (u8Data)) + +/** + * @brief Get I2C Bus status code + * + * @param[in] i2c Specify I2C port + * + * @return I2C status code + * + * @details To get this status code to monitor I2C bus event. + */ +#define I2C_GET_STATUS(i2c) ((i2c)->I2CSTATUS) + +/** + * @brief Get Time-out flag from I2C Bus + * + * @param[in] i2c Specify I2C port + * + * @retval 0 I2C Bus time-out is not happened + * @retval 1 I2C Bus time-out is happened + * + * @details When I2C bus occurs time-out event, the time-out flag will be set. + */ +#define I2C_GET_TIMEOUT_FLAG(i2c) ( ((i2c)->I2CTOC & I2C_I2CTOC_TIF_Msk) == I2C_I2CTOC_TIF_Msk ? 1:0 ) + +/** + * @brief To get wake-up flag from I2C Bus + * + * @param[in] i2c Specify I2C port + * + * @retval 0 Chip is not woken-up from power-down mode + * @retval 1 Chip is woken-up from power-down mode + * + * @details I2C bus occurs wake-up event, wake-up flag will be set. + */ +#define I2C_GET_WAKEUP_FLAG(i2c) ( ((i2c)->I2CWKUPSTS & I2C_I2CWKUPSTS_WKUPIF_Msk) == I2C_I2CWKUPSTS_WKUPIF_Msk ? 1:0 ) + +/** + * @brief To clear wake-up flag + * + * @param[in] i2c Specify I2C port + * + * @return None + * + * @details If wake-up flag is set, use this macro to clear it. + */ +#define I2C_CLEAR_WAKEUP_FLAG(i2c) ((i2c)->I2CWKUPSTS |= I2C_I2CWKUPSTS_WKUPIF_Msk) + +void I2C_ClearTimeoutFlag(I2C_T *i2c); +void I2C_Close(I2C_T *i2c); +void I2C_Trigger(I2C_T *i2c, uint8_t u8Start, uint8_t u8Stop, uint8_t u8Si, uint8_t u8Ack); +void I2C_DisableInt(I2C_T *i2c); +void I2C_EnableInt(I2C_T *i2c); +uint32_t I2C_GetBusClockFreq(I2C_T *i2c); +uint32_t I2C_SetBusClockFreq(I2C_T *i2c, uint32_t u32BusClock); +uint32_t I2C_GetIntFlag(I2C_T *i2c); +uint32_t I2C_GetStatus(I2C_T *i2c); +uint32_t I2C_Open(I2C_T *i2c, uint32_t u32BusClock); +uint8_t I2C_GetData(I2C_T *i2c); +void I2C_SetSlaveAddr(I2C_T *i2c, uint8_t u8SlaveNo, uint8_t u8SlaveAddr, uint8_t u8GCMode); +void I2C_SetSlaveAddrMask(I2C_T *i2c, uint8_t u8SlaveNo, uint8_t u8SlaveAddrMask); +void I2C_EnableTimeout(I2C_T *i2c, uint8_t u8LongTimeout); +void I2C_DisableTimeout(I2C_T *i2c); +void I2C_EnableWakeup(I2C_T *i2c); +void I2C_DisableWakeup(I2C_T *i2c); +void I2C_SetData(I2C_T *i2c, uint8_t u8Data); +uint8_t I2C_WriteByte(I2C_T *i2c, uint8_t u8SlaveAddr, const uint8_t data); +uint32_t I2C_WriteMultiBytes(I2C_T *i2c, uint8_t u8SlaveAddr, const uint8_t *data, uint32_t u32wLen); +uint8_t I2C_WriteByteOneReg(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, const uint8_t data); +uint32_t I2C_WriteMultiBytesOneReg(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, const uint8_t *data, uint32_t u32wLen); +uint8_t I2C_WriteByteTwoRegs(I2C_T *i2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr, const uint8_t data); +uint32_t I2C_WriteMultiBytesTwoRegs(I2C_T *i2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr, const uint8_t *data, uint32_t u32wLen); +uint8_t I2C_ReadByte(I2C_T *i2c, uint8_t u8SlaveAddr); +uint32_t I2C_ReadMultiBytes(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t *rdata, uint32_t u32rLen); +uint8_t I2C_ReadByteOneReg(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr); +uint32_t I2C_ReadMultiBytesOneReg(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, uint8_t *rdata, uint32_t u32rLen); +uint8_t I2C_ReadByteTwoRegs(I2C_T *i2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr); +uint32_t I2C_ReadMultiBytesTwoRegs(I2C_T *i2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr, uint8_t *rdata, uint32_t u32rLen); +/*@}*/ /* end of group I2C_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group I2C_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif +#endif //__I2C_H__ diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/i2s.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/i2s.h new file mode 100644 index 00000000..1daf3bbd --- /dev/null +++ b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/i2s.h @@ -0,0 +1,319 @@ +/**************************************************************************//** + * @file i2s.h + * @version V3.0 + * $Revision: 6 $ + * $Date: 15/07/02 11:21a $ + * @brief NUC123 series I2S driver header file + * + * @note + * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. + ******************************************************************************/ +#ifndef __I2S_H__ +#define __I2S_H__ + +#include "NUC123.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup I2S_Driver I2S Driver + @{ +*/ + +/** @addtogroup I2S_EXPORTED_CONSTANTS I2S Exported Constants + @{ +*/ +#define I2S_DATABIT_8 (0 << I2S_CON_WORDWIDTH_Pos) /*!< I2S data width is 8-bit */ +#define I2S_DATABIT_16 (1 << I2S_CON_WORDWIDTH_Pos) /*!< I2S data width is 16-bit */ +#define I2S_DATABIT_24 (2 << I2S_CON_WORDWIDTH_Pos) /*!< I2S data width is 24-bit */ +#define I2S_DATABIT_32 (3 << I2S_CON_WORDWIDTH_Pos) /*!< I2S data width is 32-bit */ + +/* Audio Format */ +#define I2S_MONO I2S_CON_MONO_Msk /*!< Mono channel */ +#define I2S_STEREO 0 /*!< Stereo channel */ + +/* I2S Data Format */ +#define I2S_FORMAT_MSB I2S_CON_FORMAT_Msk /*!< MSB data format */ +#define I2S_FORMAT_I2S 0 /*!< I2S data format */ +#define I2S_FORMAT_PCM_A I2S_CON_PCM_Msk /*!< PCM mode A data format */ +#define I2S_FORMAT_PCM_B (I2S_CON_PCM_Msk|I2S_CON_FORMAT_Msk) /*!< PCM mode B data format */ + +/* I2S Operation mode */ +#define I2S_MODE_SLAVE I2S_CON_SLAVE_Msk /*!< As slave mode */ +#define I2S_MODE_MASTER 0 /*!< As master mode */ + +/* I2S FIFO Threshold */ +#define I2S_FIFO_TX_LEVEL_WORD_0 0 /*!< TX threshold is 0 word */ +#define I2S_FIFO_TX_LEVEL_WORD_1 (1 << I2S_CON_TXTH_Pos) /*!< TX threshold is 1 word */ +#define I2S_FIFO_TX_LEVEL_WORD_2 (2 << I2S_CON_TXTH_Pos) /*!< TX threshold is 2 words */ +#define I2S_FIFO_TX_LEVEL_WORD_3 (3 << I2S_CON_TXTH_Pos) /*!< TX threshold is 3 words */ +#define I2S_FIFO_TX_LEVEL_WORD_4 (4 << I2S_CON_TXTH_Pos) /*!< TX threshold is 4 words */ +#define I2S_FIFO_TX_LEVEL_WORD_5 (5 << I2S_CON_TXTH_Pos) /*!< TX threshold is 5 words */ +#define I2S_FIFO_TX_LEVEL_WORD_6 (6 << I2S_CON_TXTH_Pos) /*!< TX threshold is 6 words */ +#define I2S_FIFO_TX_LEVEL_WORD_7 (7 << I2S_CON_TXTH_Pos) /*!< TX threshold is 7 words */ + +#define I2S_FIFO_RX_LEVEL_WORD_1 0 /*!< RX threshold is 1 word */ +#define I2S_FIFO_RX_LEVEL_WORD_2 (1 << I2S_CON_RXTH_Pos) /*!< RX threshold is 2 words */ +#define I2S_FIFO_RX_LEVEL_WORD_3 (2 << I2S_CON_RXTH_Pos) /*!< RX threshold is 3 words */ +#define I2S_FIFO_RX_LEVEL_WORD_4 (3 << I2S_CON_RXTH_Pos) /*!< RX threshold is 4 words */ +#define I2S_FIFO_RX_LEVEL_WORD_5 (4 << I2S_CON_RXTH_Pos) /*!< RX threshold is 5 words */ +#define I2S_FIFO_RX_LEVEL_WORD_6 (5 << I2S_CON_RXTH_Pos) /*!< RX threshold is 6 words */ +#define I2S_FIFO_RX_LEVEL_WORD_7 (6 << I2S_CON_RXTH_Pos) /*!< RX threshold is 7 words */ +#define I2S_FIFO_RX_LEVEL_WORD_8 (7 << I2S_CON_RXTH_Pos) /*!< RX threshold is 8 words */ + +/* I2S Record Channel */ +#define I2S_MONO_RIGHT 0 /*!< Record mono right channel */ +#define I2S_MONO_LEFT I2S_CON_RXLCH_Msk /*!< Record mono left channel */ + +/* I2S Channel */ +#define I2S_RIGHT 0 /*!< Select right channel */ +#define I2S_LEFT 1 /*!< Select left channel */ + +/*@}*/ /* end of group I2S_EXPORTED_CONSTANTS */ + +/** @addtogroup I2S_EXPORTED_FUNCTIONS I2S Exported Functions + @{ +*/ +/*---------------------------------------------------------------------------------------------------------*/ +/* inline functions */ +/*---------------------------------------------------------------------------------------------------------*/ +/** + * @brief Enable zero cross detection function. + * @param[in] i2s The pointer of the specified I2S module. + * @param[in] u32ChMask The mask for left or right channel. Valid values are: + * - \ref I2S_RIGHT + * - \ref I2S_LEFT + * @return None + * @details This function will set RCHZCEN or LCHZCEN bit of I2SCON register to enable zero cross detection function. + */ +static __INLINE void I2S_ENABLE_TX_ZCD(I2S_T *i2s, uint32_t u32ChMask) +{ + if(u32ChMask == I2S_RIGHT) + i2s->CON |= I2S_CON_RCHZCEN_Msk; + else + i2s->CON |= I2S_CON_LCHZCEN_Msk; +} + +/** + * @brief Disable zero cross detection function. + * @param[in] i2s The pointer of the specified I2S module. + * @param[in] u32ChMask The mask for left or right channel. Valid values are: + * - \ref I2S_RIGHT + * - \ref I2S_LEFT + * @return None + * @details This function will clear RCHZCEN or LCHZCEN bit of I2SCON register to disable zero cross detection function. + */ +static __INLINE void I2S_DISABLE_TX_ZCD(I2S_T *i2s, uint32_t u32ChMask) +{ + if(u32ChMask == I2S_RIGHT) + i2s->CON &= ~I2S_CON_RCHZCEN_Msk; + else + i2s->CON &= ~I2S_CON_LCHZCEN_Msk; +} + +/** + * @brief Enable I2S TX DMA function. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details This macro will set TXDMA bit of I2SCON register to transmit data with PDMA. + */ +#define I2S_ENABLE_TXDMA(i2s) ( (i2s)->CON |= I2S_CON_TXDMA_Msk ) + +/** + * @brief Disable I2S TX DMA function. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details This macro will clear TXDMA bit of I2SCON register to disable TX DMA function. + */ +#define I2S_DISABLE_TXDMA(i2s) ( (i2s)->CON &= ~I2S_CON_TXDMA_Msk ) + +/** + * @brief Enable I2S RX DMA function. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details This macro will set RXDMA bit of I2SCON register to receive data with PDMA. + */ +#define I2S_ENABLE_RXDMA(i2s) ( (i2s)->CON |= I2S_CON_RXDMA_Msk ) + +/** + * @brief Disable I2S RX DMA function. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details This macro will clear RXDMA bit of I2SCON register to disable RX DMA function. + */ +#define I2S_DISABLE_RXDMA(i2s) ( (i2s)->CON &= ~I2S_CON_RXDMA_Msk ) + +/** + * @brief Enable I2S TX function. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details This macro will set TXEN bit of I2SCON register to enable I2S TX function. + */ +#define I2S_ENABLE_TX(i2s) ( (i2s)->CON |= I2S_CON_TXEN_Msk ) + +/** + * @brief Disable I2S TX function. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details This macro will clear TXEN bit of I2SCON register to disable I2S TX function. + */ +#define I2S_DISABLE_TX(i2s) ( (i2s)->CON &= ~I2S_CON_TXEN_Msk ) + +/** + * @brief Enable I2S RX function. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details This macro will set RXEN bit of I2SCON register to enable I2S RX function. + */ +#define I2S_ENABLE_RX(i2s) ( (i2s)->CON |= I2S_CON_RXEN_Msk ) + +/** + * @brief Disable I2S RX function. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details This macro will clear RXEN bit of I2SCON register to disable I2S RX function. + */ +#define I2S_DISABLE_RX(i2s) ( (i2s)->CON &= ~I2S_CON_RXEN_Msk ) + +/** + * @brief Enable TX Mute function. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details This macro will set MUTE bit of I2SCON register to enable I2S TX mute function. + */ +#define I2S_ENABLE_TX_MUTE(i2s) ( (i2s)->CON |= I2S_CON_MUTE_Msk ) + +/** + * @brief Disable TX Mute function. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details This macro will clear MUTE bit of I2SCON register to disable I2S TX mute function. + */ +#define I2S_DISABLE_TX_MUTE(i2s) ( (i2s)->CON &= ~I2S_CON_MUTE_Msk ) + +/** + * @brief Clear TX FIFO. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details This macro will clear TX FIFO. The internal TX FIFO pointer will be reset to FIFO start point. + */ +#define I2S_CLR_TX_FIFO(i2s) ( (i2s)->CON |= I2S_CON_CLR_TXFIFO_Msk ) + +/** + * @brief Clear RX FIFO. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details This macro will clear RX FIFO. The internal RX FIFO pointer will be reset to FIFO start point. + */ +#define I2S_CLR_RX_FIFO(i2s) ( (i2s)->CON |= I2S_CON_CLR_RXFIFO_Msk ) + +/** + * @brief This function sets the recording source channel when mono mode is used. + * @param[in] i2s The pointer of the specified I2S module. + * @param[in] u32Ch Left or right channel. Valid values are: + * - \ref I2S_MONO_LEFT + * - \ref I2S_MONO_RIGHT + * @return None + * @details This function selects the recording source channel of monaural mode. + */ +static __INLINE void I2S_SET_MONO_RX_CHANNEL(I2S_T *i2s, uint32_t u32Ch) +{ + u32Ch == I2S_MONO_LEFT ? + (i2s->CON |= I2S_CON_RXLCH_Msk) : + (i2s->CON &= ~I2S_CON_RXLCH_Msk); +} + +/** + * @brief Write data to I2S TX FIFO. + * @param[in] i2s The pointer of the specified I2S module. + * @param[in] u32Data The value written to TX FIFO. + * @return None + * @details This macro will write a value to TX FIFO. + */ +#define I2S_WRITE_TX_FIFO(i2s, u32Data) ( (i2s)->TXFIFO = (u32Data) ) + +/** + * @brief Read RX FIFO. + * @param[in] i2s The pointer of the specified I2S module. + * @return The value read from RX FIFO. + * @details This function will return a value read from RX FIFO. + */ +#define I2S_READ_RX_FIFO(i2s) ( (i2s)->RXFIFO ) + +/** + * @brief Get the interrupt flag. + * @param[in] i2s The pointer of the specified I2S module. + * @param[in] u32Mask The mask value for all interrupt flags. Valid values are: + * - \ref I2S_STATUS_LZCF_Msk + * - \ref I2S_STATUS_RZCF_Msk + * - \ref I2S_STATUS_TXTHF_Msk + * - \ref I2S_STATUS_TXOVF_Msk + * - \ref I2S_STATUS_TXUDF_Msk + * - \ref I2S_STATUS_RXTHF_Msk + * - \ref I2S_STATUS_RXOVF_Msk + * - \ref I2S_STATUS_RXUDF_Msk + * - \ref I2S_STATUS_I2STXINT_Msk + * - \ref I2S_STATUS_I2SRXINT_Msk + * - \ref I2S_STATUS_I2SINT_Msk + * @return The interrupt flags specified by the u32mask parameter. + * @details This macro will return the combination flags of I2SSTATUS register. The flags are specified by the u32mask parameter. + */ +#define I2S_GET_INT_FLAG(i2s, u32Mask) ( (i2s)->STATUS & (u32Mask) ) + +/** + * @brief Clear the interrupt flag. + * @param[in] i2s The pointer of the specified I2S module. + * @param[in] u32Mask The mask value for all interrupt flags. Valid values are: + * - \ref I2S_STATUS_LZCF_Msk + * - \ref I2S_STATUS_RZCF_Msk + * - \ref I2S_STATUS_TXOVF_Msk + * - \ref I2S_STATUS_TXUDF_Msk + * - \ref I2S_STATUS_RXOVF_Msk + * - \ref I2S_STATUS_RXUDF_Msk + * @return None + * @details This macro will clear the interrupt flags specified by the u32mask parameter. + */ +#define I2S_CLR_INT_FLAG(i2s, u32Mask) ( (i2s)->STATUS = (u32Mask) ) + +/** + * @brief Get transmit FIFO level + * @param[in] i2s The pointer of the specified I2S module. + * @return TX FIFO level + * @details This macro will return the number of available words in TX FIFO. + */ +#define I2S_GET_TX_FIFO_LEVEL(i2s) ( (((i2s)->STATUS & I2S_STATUS_TX_LEVEL_Msk) >> I2S_STATUS_TX_LEVEL_Pos) & 0xF ) + +/** + * @brief Get receive FIFO level + * @param[in] i2s The pointer of the specified I2S module. + * @return RX FIFO level + * @details This macro will return the number of available words in RX FIFO. + */ +#define I2S_GET_RX_FIFO_LEVEL(i2s) ( (((i2s)->STATUS & I2S_STATUS_RX_LEVEL_Msk) >> I2S_STATUS_RX_LEVEL_Pos) & 0xF ) + + +/* Function prototype declaration */ +uint32_t I2S_Open(I2S_T *i2s, uint32_t u32MasterSlave, uint32_t u32SampleRate, uint32_t u32WordWidth, uint32_t u32Channels, uint32_t u32DataFormat); +void I2S_Close(I2S_T *i2s); +void I2S_EnableInt(I2S_T *i2s, uint32_t u32Mask); +void I2S_DisableInt(I2S_T *i2s, uint32_t u32Mask); +uint32_t I2S_EnableMCLK(I2S_T *i2s, uint32_t u32BusClock); +void I2S_DisableMCLK(I2S_T *i2s); + +/*@}*/ /* end of group I2S_EXPORTED_FUNCTIONS */ + + +/*@}*/ /* end of group I2S_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#endif + +/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ + diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/pdma.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/pdma.h new file mode 100644 index 00000000..58ba5156 --- /dev/null +++ b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/pdma.h @@ -0,0 +1,198 @@ +/**************************************************************************//** + * @file PDMA.h + * @version V1.00 + * $Revision: 6 $ + * $Date: 15/07/02 11:21a $ + * @brief NUC123 Series PDMA Controller Driver Header File + * + * @note + * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. + * + ******************************************************************************/ +#ifndef __PDMA_H__ +#define __PDMA_H__ + +#include "NUC123.h" + + +/** @addtogroup Standard_Driver Standard Driver + * @{ + */ + +/** @addtogroup PDMA_Driver PDMA Driver + * @{ + */ + +/** @addtogroup PDMA_EXPORTED_CONSTANTS PDMA Exported Constants + @{ +*/ + +/*---------------------------------------------------------------------------------------------------------*/ +/* Data Width Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define PDMA_WIDTH_8 0x00080000UL /*!GCRISR)) + +/** + * @brief Get PDMA Channel Interrupt Status + * + * @param[in] u32Ch Selected DMA channel + * + * @return Interrupt Status + * + * @details This macro gets the channel interrupt status. + */ +#define PDMA_GET_CH_INT_STS(u32Ch) (*((__IO uint32_t *)((uint32_t)&PDMA0->ISR + (uint32_t)((u32Ch)*0x100)))) + +/** + * @brief Clear PDMA Channel Interrupt Flag + * + * @param[in] u32Ch Selected DMA channel + * @param[in] u32Mask Interrupt Mask + * + * @return None + * + * @details This macro clear the channel interrupt flag. + */ +#define PDMA_CLR_CH_INT_FLAG(u32Ch, u32Mask) (*((__IO uint32_t *)((uint32_t)&PDMA0->ISR + (uint32_t)((u32Ch)*0x100))) = (u32Mask)) + +/** + * @brief Check Channel Status + * + * @param[in] u32Ch The selected channel + * + * @retval 0 The selected channel is idle + * @retval 1 The selected channel is busy + * + * @details Check the selected channel is busy or not. + */ +#define PDMA_IS_CH_BUSY(u32Ch) ((*((__IO uint32_t *)((uint32_t)&PDMA0->CSR +(uint32_t)((u32Ch)*0x100)))&PDMA_CSR_TRIG_EN_Msk)? 1 : 0) + +/** + * @brief Set Source Address + * + * @param[in] u32Ch The selected channel + * @param[in] u32Addr The selected address + * + * @return None + * + * @details This macro set the selected channel source address. + */ +#define PDMA_SET_SRC_ADDR(u32Ch, u32Addr) (*((__IO uint32_t *)((uint32_t)&PDMA0->SAR + (uint32_t)((u32Ch)*0x100))) = (u32Addr)) + +/** + * @brief Set Destination Address + * + * @param[in] u32Ch The selected channel + * @param[in] u32Addr The selected address + * + * @return None + * + * @details This macro set the selected channel destination address. + */ +#define PDMA_SET_DST_ADDR(u32Ch, u32Addr) (*((__IO uint32_t *)((uint32_t)&PDMA0->DAR + (uint32_t)((u32Ch)*0x100))) = (u32Addr)) + +/** + * @brief Set Transfer Count + * + * @param[in] u32Ch The selected channel + * @param[in] u32Count Transfer Count + * + * @return None + * + * @details This macro set the selected channel transfer count. + * \hideinitializer + */ +#define PDMA_SET_TRANS_CNT(u32Ch, u32Count) { \ + if (((uint32_t)*((__IO uint32_t *)((uint32_t)&PDMA0->CSR + (uint32_t)((u32Ch)*0x100))) & PDMA_CSR_APB_TWS_Msk) == PDMA_WIDTH_32) \ + *((__IO uint32_t *)((uint32_t)&PDMA0->BCR + (uint32_t)((u32Ch)*0x100))) = ((u32Count) << 2); \ + else if (((uint32_t)*((__IO uint32_t *)((uint32_t)&PDMA0->CSR + (uint32_t)((u32Ch)*0x100))) & PDMA_CSR_APB_TWS_Msk) == PDMA_WIDTH_8) \ + *((__IO uint32_t *)((uint32_t)&PDMA0->BCR + (uint32_t)((u32Ch)*0x100))) = (u32Count); \ + else if (((uint32_t)*((__IO uint32_t *)((uint32_t)&PDMA0->CSR + (uint32_t)((u32Ch)*0x100))) & PDMA_CSR_APB_TWS_Msk) == PDMA_WIDTH_16) \ + *((__IO uint32_t *)((uint32_t)&PDMA0->BCR + (uint32_t)((u32Ch)*0x100))) = ((u32Count) << 1); \ +} + +/** + * @brief Stop the channel + * + * @param[in] u32Ch The selected channel + * + * @return None + * + * @details This macro stop the selected channel. + */ +#define PDMA_STOP(u32Ch) (*((__IO uint32_t *)((uint32_t)&PDMA0->CSR + (uint32_t)((u32Ch)*0x100))) &= ~PDMA_CSR_PDMACEN_Msk) + +void PDMA_Open(uint32_t u32Mask); +void PDMA_Close(void); +void PDMA_SetTransferCnt(uint32_t u32Ch, uint32_t u32Width, uint32_t u32TransCount); +void PDMA_SetTransferAddr(uint32_t u32Ch, uint32_t u32SrcAddr, uint32_t u32SrcCtrl, uint32_t u32DstAddr, uint32_t u32DstCtrl); +void PDMA_SetTransferMode(uint32_t u32Ch, uint32_t u32Periphral, uint32_t u32ScatterEn, uint32_t u32DescAddr); +void PDMA_Trigger(uint32_t u32Ch); +void PDMA_EnableInt(uint32_t u32Ch, uint32_t u32Mask); +void PDMA_DisableInt(uint32_t u32Ch, uint32_t u32Mask); + + +/** + * @} End of PDMA Device Function Interface + */ + +/** + * @} End of Function Interface + */ + +/** + * @} End of PDMA_Driver + */ + + +#endif // __PDMA_H__ diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/ps2.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/ps2.h new file mode 100644 index 00000000..af43c2a2 --- /dev/null +++ b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/ps2.h @@ -0,0 +1,254 @@ +/**************************************************************************//** + * @file PS2.h + * @version V3.00 + * $Revision: 5 $ + * $Date: 15/07/02 11:21a $ + * @brief NUC123 Series PS/2 Driver Header File + * + * @note + * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. + ******************************************************************************/ +#ifndef __PS2_H__ +#define __PS2_H__ + +/*---------------------------------------------------------------------------------------------------------*/ +/* Include related headers */ +/*---------------------------------------------------------------------------------------------------------*/ +#include "NUC123.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup PS2_Driver PS2 Driver + @{ +*/ + + +/** @addtogroup PS2_EXPORTED_FUNCTIONS PS2 Exported Functions + @{ +*/ + +/*---------------------------------------------------------------------------------------------------------*/ +/* Define Macros and functions */ +/*---------------------------------------------------------------------------------------------------------*/ + +/** + * @brief To Set PS/2 Tx FIFO length + * + * @param[in] u32Count Tx FIFO length + * + * @return None + * + * @details Before PS/2 data transmit, program needs to set the FIFO depth. + * \hideinitializer + */ +#define PS2_SET_TX_BYTE_CNT(u32Count) (PS2->PS2CON = (PS2->PS2CON & ~PS2_PS2CON_TXFIFO_DEPTH_Msk) \ + | (((u32Count)-1) << PS2_PS2CON_TXFIFO_DEPTH_Pos)) + +/** + * @brief This function use to Get PS/2 Status + * + * @param None + * + * @return PS/2 bus status + * + * @details To get PS/2 bus status which are about Byte index, Tx/Rx status, Error status and PS/2 line status. + */ +#define PS2_GET_STATUS() (PS2->PS2STATUS) + +/** + * @brief This function is used to Clear PS/2 Status + * + * @param[in] u32Mask Clear the specified status of PS/2 module: + * 1. PS2D_PS2STATUS_FRAMERR_Msk 2. PS2D_PS2STATUS_RXOVF_Msk + * + * @return None + * + * @details To clear PS/2 bus status which are about Byte index, TX/RX status, Error status, PS/2 line status. + */ +#define PS2_CLR_STATUS(u32Mask) (PS2->PS2STATUS = (u32Mask)) + +/** + * @brief This function is used to Clear PS/2 Tx FIFO + * + * @param None + * + * @return None + * + * @details Write 1 to terminate PS/2 device to host transmission. + * + * @note Write 1 is always clear Tx FIFO, and need write 0 to STOP the clear action. + */ +__STATIC_INLINE void PS2_CLEAR_TX_FIFO(void) +{ + PS2->PS2CON |= PS2_PS2CON_CLRFIFO_Msk; + PS2->PS2CON &= ~PS2_PS2CON_CLRFIFO_Msk; +} + +/** + * @brief This function is used to Clear PS2 Rx interrupt + * + * @param None + * + * @return None + * + * @details To disable PS/2 receive interrupt occurs. + */ +#define PS2_CLR_RX_INT_FLAG() (PS2->PS2INTID = PS2_PS2INTID_RXINT_Msk) + +/** + * @brief This function is used to Clear PS/2 Tx Interrupt + * + * @param None + * + * @return None + * + * @details To disable PS/2 transmit interrupt occurs. + */ +#define PS2_CLR_TX_INT_FLAG() (PS2->PS2INTID = PS2_PS2INTID_TXINT_Msk) + +/** + * @brief This function is used to Get PS/2 Interrupt + * + * @param[in] u32IntFlag Interrupt flag of PS2D_PS2INTID_TXINT_Msk, PS2D_PS2INTID_RXINT_Msk + * + * @retval 1 Interrupt occurs + * @retval 0 Interrupt not occurs + * + * @details To check PS/2 bus interrupt occur from TX or RX + */ +#define PS2_GET_INT_FLAG(u32IntFlag) ((PS2->PS2INTID & (u32IntFlag))?1:0) + +/** + * @brief Disable PS2CLK and PS2DATA pins override. + * + * @param None + * + * @return None + * + * @details To disable the override control of PS2CLK and PS2DATA pins. + */ +#define PS2_DISABLE_OVERRIDE() (PS2->PS2CON &= ~PS2_PS2CON_OVERRIDE_Msk) + +/** + * @brief Enable PS2CLK and PS2DATA pins Override. + * + * @param None + * + * @return None + * + * @details TO enable the override control of PS2CLK and PS2DATA pins. + */ +#define PS2_ENABLE_OVERRIDE() (PS2->PS2CON |= PS2_PS2CON_OVERRIDE_Msk) + +/** + * @brief This function is used to Get Indicates which data byte in transmit data shift register + * + * @param None + * + * @return The indicates which data byte in transmit data shift register. + * + * @details To get a indication which a data byte in the data shift register. + */ +#define PS2_GET_TX_BYTE_INDEX() ((PS2->PS2STATUS & PS2_PS2STATUS_BYTEIDX_Msk) >> PS2_PS2STATUS_BYTEIDX_Pos) + +/** + * @brief This function is used to set PS2DATA Pin low. + * + * @param None + * + * @return None + * + * @details To control the PS2DATA pin state to low. + */ +#define PS2_SET_DATA_LOW() (PS2->PS2CON &= ~PS2_PS2CON_FPS2DAT_Msk) + +/** + * @brief This function is used to set PS2DATA Pin high + * + * @param None + * + * @return None + * + * @details To control the PS2DATA pin state to high. + */ +#define PS2_SET_DATA_HIGH() (PS2->PS2CON |= PS2_PS2CON_FPS2DAT_Msk) + +/** + * @brief This function is used to set PS2CLK Pin low. + * + * @param None + * + * @return None + * + * @details To control the PS2CLK pin state to low. + */ +#define PS2_SET_CLK_LOW() (PS2->PS2CON &= ~PS2_PS2CON_FPS2CLK_Msk) + +/** + * @brief This function is used to set PS2CLK Pin high. + * + * @param None + * + * @return None + * + * @details To control the PS2CLK pin state to high. + */ +#define PS2_SET_CLK_HIGH() (PS2->PS2CON |= PS2_PS2CON_FPS2CLK_Msk) + +/** + * @brief Disable always sends acknowledge + * + * @param None + * + * @return None + * + * @details If parity error or Stop bit is not received correctly, acknowledge will not be sent to host at 12th clock. + */ +#define PS2_DISABLE_ACK_ALWAYS() (PS2->PS2CON |= PS2_PS2CON_ACK_Msk) + +/** + * @brief Always sends acknowledge + * + * @param None + * + * @return None + * + * @details Always send acknowledge to host at 12th clock for host to device communication. + */ +#define PS2_ENABLE_ACK_ALWAYS() (PS2->PS2CON &= ~PS2_PS2CON_ACK_Msk) + + +/*---------------------------------------------------------------------------------------------------------*/ +/* Define Function Prototypes */ +/*---------------------------------------------------------------------------------------------------------*/ + +void PS2_Open(void); +void PS2_Close(void); +uint8_t PS2_Read(void); +int32_t PS2_Write(uint32_t *pu32Buf, uint32_t u32ByteCount); +void PS2_EnableInt(uint32_t u32Mask); +void PS2_DisableInt(uint32_t u32Mask); + + +/*@}*/ /* end of group PS2_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group PS2_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif //__PS2_H__ + +/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ + diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/pwm.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/pwm.h new file mode 100644 index 00000000..74120bc7 --- /dev/null +++ b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/pwm.h @@ -0,0 +1,230 @@ +/**************************************************************************//** + * @file pwm.h + * @version V3.00 + * $Revision: 5 $ + * $Date: 15/07/02 11:21a $ + * @brief NUC123 series PWM driver header file + * + * @note + * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __PWM_H__ +#define __PWM_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup PWM_Driver PWM Driver + @{ +*/ + +/** @addtogroup PWM_EXPORTED_CONSTANTS PWM Exported Constants + @{ +*/ +#define PWM_CHANNEL_NUM (4) /*!< PWM channel number */ +#define PWM_CLK_DIV_1 (4UL) /*!< PWM clock divide by 1 */ +#define PWM_CLK_DIV_2 (0UL) /*!< PWM clock divide by 2 */ +#define PWM_CLK_DIV_4 (1UL) /*!< PWM clock divide by 4 */ +#define PWM_CLK_DIV_8 (2UL) /*!< PWM clock divide by 8 */ +#define PWM_CLK_DIV_16 (3UL) /*!< PWM clock divide by 16 */ +#define PWM_EDGE_ALIGNED (0UL) /*!< PWM working in edge aligned type */ +#define PWM_CENTER_ALIGNED (1UL) /*!< PWM working in center aligned type */ +#define PWM_PERIOD_INT_UNDERFLOW (0) /*!< PWM period interrupt triggered if counter underflow */ +#define PWM_PERIOD_INT_MATCH_CNR (PWM_PIER_INT01TYPE_Msk) /*!< PWM period interrupt triggered if counter match CNR */ +#define PWM_CAPTURE_INT_RISING_LATCH (PWM_CCR0_CRL_IE0_Msk) /*!< PWM capture interrupt if channel has rising transition */ +#define PWM_CAPTURE_INT_FALLING_LATCH (PWM_CCR0_CFL_IE0_Msk) /*!< PWM capture interrupt if channel has falling transition */ +/*---------------------------------------------------------------------------------------------------------*/ +/* PWM Group channel number constants definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define PWM_CH0 0x0 /*!< PWM Group A channel 0 */ +#define PWM_CH1 0x1 /*!< PWM Group A channel 1 */ +#define PWM_CH2 0x2 /*!< PWM Group A channel 2 */ +#define PWM_CH3 0x3 /*!< PWM Group A channel 3 */ +#define PWM_CCR_MASK 0x000F000F /*!< PWM CCR0/CCR2 bit0~3 and bit16~19 mask */ + +/*@}*/ /* end of group PWM_EXPORTED_CONSTANTS */ + + +/** @addtogroup PWM_EXPORTED_FUNCTIONS PWM Exported Functions + @{ +*/ + +/** + * @brief Enable output inverter of specified channel(s) + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel + * Bit 0 represents channel 0, bit 1 represents channel 1... + * @return None + * @details This macro is used to enable capture input inverter for specified channel(s). + * \hideinitializer + */ +#define PWM_ENABLE_OUTPUT_INVERTER(pwm, u32ChannelMask) \ + do{ \ + int i;\ + (pwm)->PCR &= ~(PWM_PCR_CH0INV_Msk|PWM_PCR_CH1INV_Msk|PWM_PCR_CH2INV_Msk|PWM_PCR_CH3INV_Msk);\ + for(i = 0; i < 4; i++) { \ + if((u32ChannelMask) & (1 << i)) \ + (pwm)->PCR |= (PWM_PCR_CH0INV_Msk << (PWM_PCR_CH0INV_Pos * (i * 4))); \ + } \ + }while(0) + +/** + * @brief Get captured rising data of specified channel + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @return The timer counter, 0~0xFFFF + * @details This macro is used to get captured rising data for specified channel. + */ +#define PWM_GET_CAPTURE_RISING_DATA(pwm, u32ChannelNum) (*((__IO uint32_t *) ((((uint32_t)&((pwm)->CRLR0)) + (u32ChannelNum) * 8)))) + +/** + * @brief Get captured falling data of specified channel + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @return The timer counter, 0~0xFFFF + * @details This macro is used to get captured falling data for specified channel. + */ +#define PWM_GET_CAPTURE_FALLING_DATA(pwm, u32ChannelNum) (*((__IO uint32_t *) ((((uint32_t)&((pwm)->CFLR0)) + (u32ChannelNum) * 8)))) + +/** + * @brief Set the prescaler of the selected channel + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @param[in] u32Prescaler Clock prescaler of specified channel. Valid values are between 1 ~ 0xFF + * @return None + * @details This macro is used to set timer pre-scale for specified channel. + * @note If u32Prescaler = 0, corresponding PWM-timer will be stopped. + * @note If u32Prescaler = x (x not equal to 0), it means Clock input is divided by (x + 1) before it is fed to the corresponding PWM counter. + */ +#define PWM_SET_PRESCALER(pwm, u32ChannelNum, u32Prescaler) \ + ((pwm)->PPR = ((pwm)->PPR & ~(PWM_PPR_CP01_Msk << (((u32ChannelNum) >> 1) * 8))) | ((u32Prescaler) << (((u32ChannelNum) >> 1) * 8))) + +/** + * @brief Set the divider of the selected channel + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @param[in] u32Divider Clock divider of specified channel. Valid values are + * - \ref PWM_CLK_DIV_1 + * - \ref PWM_CLK_DIV_2 + * - \ref PWM_CLK_DIV_4 + * - \ref PWM_CLK_DIV_8 + * - \ref PWM_CLK_DIV_16 + * @return None + * @details This macro is used to set Timer clock source divider selection for specified channel. + */ +#define PWM_SET_DIVIDER(pwm, u32ChannelNum, u32Divider) \ + ((pwm)->CSR = ((pwm)->CSR & ~(PWM_CSR_CSR0_Msk << ((u32ChannelNum) * 4))) | ((u32Divider) << ((u32ChannelNum) * 4))) + +/** + * @brief Set the duty of the selected channel + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @param[in] u32CMR Duty of specified channel. Valid values are between 0~0xFFFF + * @return None + * @details This macro is used to set PWM Comparator value for specified channel. + * @note This new setting will take effect on next PWM period. + */ +#define PWM_SET_CMR(pwm, u32ChannelNum, u32CMR) (*((__IO uint32_t *) ((((uint32_t)&((pwm)->CMR0)) + (u32ChannelNum) * 12))) = (u32CMR)) + +/** + * @brief Set the period of the selected channel + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @param[in] u32CNR Period of specified channel. Valid values are between 0~0xFFFF + * @return None + * @details This macro is used to set timer loaded value(CNR) for specified channel.\n + * Loaded value determines the PWM period. + * @note This new setting will take effect on next PWM period. + * @note PWM counter will stop if period length set to 0. + */ +#define PWM_SET_CNR(pwm, u32ChannelNum, u32CNR) (*((__IO uint32_t *) ((((uint32_t)&((pwm)->CNR0)) + (u32ChannelNum) * 12))) = (u32CNR)) + +/** + * @brief Set the PWM aligned type + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel + * Bit 0 represents channel 0, bit 1 represents channel 1... + * @param[in] u32AlignedType PWM aligned type, valid values are: + * - \ref PWM_EDGE_ALIGNED + * - \ref PWM_CENTER_ALIGNED + * @return None + * @details This macro is used to set the PWM aligned type. + * @note PWM trigger ADC function is only supported when PWM operating at Center-aligned type. + * \hideinitializer + */ +#define PWM_SET_ALIGNED_TYPE(pwm, u32ChannelMask, u32AlignedType) \ + do{ \ + int i; \ + for(i = 0; i < 4; i++) { \ + if((u32ChannelMask) & (1 << i)) \ + (pwm)->PCR = ((pwm)->PCR & ~(PWM_PCR_PWM01TYPE_Msk << (i >> 1))) | ((u32AlignedType) << (PWM_PCR_PWM01TYPE_Pos + (i >> 1))); \ + } \ + }while(0) + + +uint32_t PWM_ConfigCaptureChannel(PWM_T *pwm, + uint32_t u32ChannelNum, + uint32_t u32UnitTimeNsec, + uint32_t u32CaptureEdge); +uint32_t PWM_ConfigOutputChannel(PWM_T *pwm, + uint32_t u32ChannelNum, + uint32_t u32Frequncy, + uint32_t u32DutyCycle); +void PWM_Start(PWM_T *pwm, uint32_t u32ChannelMask); +void PWM_Stop(PWM_T *pwm, uint32_t u32ChannelMask); +void PWM_ForceStop(PWM_T *pwm, uint32_t u32ChannelMask); +void PWM_EnableADCTrigger(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Condition); +void PWM_DisableADCTrigger(PWM_T *pwm, uint32_t u32ChannelNum); +void PWM_ClearADCTriggerFlag(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Condition); +uint32_t PWM_GetADCTriggerFlag(PWM_T *pwm, uint32_t u32ChannelNum); +void PWM_EnableCapture(PWM_T *pwm, uint32_t u32ChannelMask); +void PWM_DisableCapture(PWM_T *pwm, uint32_t u32ChannelMask); +void PWM_EnableOutput(PWM_T *pwm, uint32_t u32ChannelMask); +void PWM_DisableOutput(PWM_T *pwm, uint32_t u32ChannelMask); +void PWM_EnablePDMA(PWM_T *pwm, uint32_t u32ChannelMask, uint32_t u32RisingFirst); +void PWM_DisablePDMA(PWM_T *pwm, uint32_t u32ChannelMask); +void PWM_EnableDeadZone(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Duration); +void PWM_DisableDeadZone(PWM_T *pwm, uint32_t u32ChannelNum); +void PWM_EnableCaptureInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Edge); +void PWM_DisableCaptureInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Edge); +void PWM_ClearCaptureIntFlag(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Edge); +uint32_t PWM_GetCaptureIntFlag(PWM_T *pwm, uint32_t u32ChannelNum); +void PWM_EnableDutyInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32IntDutyType); +void PWM_DisableDutyInt(PWM_T *pwm, uint32_t u32ChannelNum); +void PWM_ClearDutyIntFlag(PWM_T *pwm, uint32_t u32ChannelNum); +uint32_t PWM_GetDutyIntFlag(PWM_T *pwm, uint32_t u32ChannelNum); +void PWM_EnablePeriodInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32IntPeriodType); +void PWM_DisablePeriodInt(PWM_T *pwm, uint32_t u32ChannelNum); +void PWM_ClearPeriodIntFlag(PWM_T *pwm, uint32_t u32ChannelNum); +uint32_t PWM_GetPeriodIntFlag(PWM_T *pwm, uint32_t u32ChannelNum); + + + +/*@}*/ /* end of group PWM_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group PWM_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif //__PWM_H__ + +/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/spi.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/spi.h new file mode 100644 index 00000000..02bfe30b --- /dev/null +++ b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/spi.h @@ -0,0 +1,381 @@ +/**************************************************************************//** + * @file spi.h + * @version V3.0 + * $Revision: 11 $ + * $Date: 15/07/02 3:18p $ + * @brief NUC123 Series SPI Driver Header File + * + * @note + * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. + * + ******************************************************************************/ +#ifndef __SPI_H__ +#define __SPI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup SPI_Driver SPI Driver + @{ +*/ + +/** @addtogroup SPI_EXPORTED_CONSTANTS SPI Exported Constants + @{ +*/ + +#define SPI_MODE_0 (SPI_CNTRL_TX_NEG_Msk) /*!< CLKP=0; RX_NEG=0; TX_NEG=1 */ +#define SPI_MODE_1 (SPI_CNTRL_RX_NEG_Msk) /*!< CLKP=0; RX_NEG=1; TX_NEG=0 */ +#define SPI_MODE_2 (SPI_CNTRL_CLKP_Msk | SPI_CNTRL_RX_NEG_Msk) /*!< CLKP=1; RX_NEG=1; TX_NEG=0 */ +#define SPI_MODE_3 (SPI_CNTRL_CLKP_Msk | SPI_CNTRL_TX_NEG_Msk) /*!< CLKP=1; RX_NEG=0; TX_NEG=1 */ + +#define SPI_SLAVE (SPI_CNTRL_SLAVE_Msk) /*!< Set as slave */ +#define SPI_MASTER (0x0) /*!< Set as master */ + +#define SPI_SS0 (1<CNTRL2 |= SPI_CNTRL2_SLV_ABORT_Msk) + +/** + * @brief Clear the Slave 3-wire mode start interrupt flag. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Write 1 to SLV_START_INTSTS bit of SPI_STATUS register to clear the Slave 3-wire mode start interrupt flag. + */ +#define SPI_CLR_3WIRE_START_INT_FLAG(spi) ((spi)->STATUS = SPI_STATUS_SLV_START_INTSTS_Msk) + +/** + * @brief Clear the unit transfer interrupt flag. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Write 1 to IF bit of SPI_STATUS register to clear the unit transfer interrupt flag. + */ +#define SPI_CLR_UNIT_TRANS_INT_FLAG(spi) ((spi)->STATUS = SPI_STATUS_IF_Msk) + +/** + * @brief Disable 2-bit Transfer mode. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Clear TWOB bit of SPI_CNTRL register to disable 2-bit Transfer mode. + */ +#define SPI_DISABLE_2BIT_MODE(spi) ((spi)->CNTRL &= ~SPI_CNTRL_TWOB_Msk) + +/** + * @brief Disable Slave 3-wire mode. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Clear NOSLVSEL bit of SPI_CNTRL2 register to disable Slave 3-wire mode. + */ +#define SPI_DISABLE_3WIRE_MODE(spi) ((spi)->CNTRL2 &= ~SPI_CNTRL2_NOSLVSEL_Msk) + +/** + * @brief Disable Dual I/O mode. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Clear DUAL_IO_EN bit of SPI_CNTRL2 register to disable Dual I/O mode. + */ +#define SPI_DISABLE_DUAL_MODE(spi) ((spi)->CNTRL2 &= ~SPI_CNTRL2_DUAL_IO_EN_Msk) + +/** + * @brief Enable 2-bit Transfer mode. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Set TWOB bit of SPI_CNTRL register to enable 2-bit Transfer mode. + */ +#define SPI_ENABLE_2BIT_MODE(spi) ((spi)->CNTRL |= SPI_CNTRL_TWOB_Msk) + +/** + * @brief Enable Slave 3-wire mode. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Set NOSLVSEL bit of SPI_CNTRL2 register to enable Slave 3-wire mode. + * Only available in Slave mode. + */ +#define SPI_ENABLE_3WIRE_MODE(spi) ((spi)->CNTRL2 |= SPI_CNTRL2_NOSLVSEL_Msk) + +/** + * @brief Enable Dual input mode. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Clear DUAL_IO_DIR bit and set DUAL_IO_EN bit of SPI_CNTRL2 register to enable Dual input mode. + */ +#define SPI_ENABLE_DUAL_INPUT_MODE(spi) ((spi)->CNTRL2 = ((spi)->CNTRL2 & (~SPI_CNTRL2_DUAL_IO_DIR_Msk)) | SPI_CNTRL2_DUAL_IO_EN_Msk) + +/** + * @brief Enable Dual output mode. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Set DUAL_IO_DIR bit and DUAL_IO_EN bit of SPI_CNTRL2 register to enable Dual output mode. + */ +#define SPI_ENABLE_DUAL_OUTPUT_MODE(spi) ((spi)->CNTRL2 |= (SPI_CNTRL2_DUAL_IO_EN_Msk | SPI_CNTRL2_DUAL_IO_DIR_Msk)) + +/** + * @brief Trigger RX PDMA function. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Set RX_DMA_GO bit of SPI_DMA register to enable RX PDMA transfer function. + */ +#define SPI_TRIGGER_RX_PDMA(spi) ((spi)->DMA |= SPI_DMA_RX_DMA_GO_Msk) + +/** + * @brief Trigger TX PDMA function. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Set TX_DMA_GO bit of SPI_DMA register to enable TX PDMA transfer function. + */ +#define SPI_TRIGGER_TX_PDMA(spi) ((spi)->DMA |= SPI_DMA_TX_DMA_GO_Msk) + +/** + * @brief Get the count of available data in RX FIFO. + * @param[in] spi The pointer of the specified SPI module. + * @return The count of available data in RX FIFO. + * @details Read RX_FIFO_COUNT (SPI_STATUS[15:12]) to get the count of available data in RX FIFO. + */ +#define SPI_GET_RX_FIFO_COUNT(spi) (((spi)->STATUS & SPI_STATUS_RX_FIFO_COUNT_Msk) >> SPI_STATUS_RX_FIFO_COUNT_Pos) + +/** + * @brief Get the RX FIFO empty flag. + * @param[in] spi The pointer of the specified SPI module. + * @retval 0 RX FIFO is not empty. + * @retval 1 RX FIFO is empty. + * @details Read RX_EMPTY bit of SPI_STATUS register to get the RX FIFO empty flag. + */ +#define SPI_GET_RX_FIFO_EMPTY_FLAG(spi) (((spi)->STATUS & SPI_STATUS_RX_EMPTY_Msk)>>SPI_STATUS_RX_EMPTY_Pos) + +/** + * @brief Get the TX FIFO empty flag. + * @param[in] spi The pointer of the specified SPI module. + * @retval 0 TX FIFO is not empty. + * @retval 1 TX FIFO is empty. + * @details Read TX_EMPTY bit of SPI_STATUS register to get the TX FIFO empty flag. + */ +#define SPI_GET_TX_FIFO_EMPTY_FLAG(spi) (((spi)->STATUS & SPI_STATUS_TX_EMPTY_Msk)>>SPI_STATUS_TX_EMPTY_Pos) + +/** + * @brief Get the TX FIFO full flag. + * @param[in] spi The pointer of the specified SPI module. + * @retval 0 TX FIFO is not full. + * @retval 1 TX FIFO is full. + * @details Read TX_FULL bit of SPI_STATUS register to get the TX FIFO full flag. + */ +#define SPI_GET_TX_FIFO_FULL_FLAG(spi) (((spi)->STATUS & SPI_STATUS_TX_FULL_Msk)>>SPI_STATUS_TX_FULL_Pos) + +/** + * @brief Get the datum read from RX0 register. + * @param[in] spi The pointer of the specified SPI module. + * @return Data in RX0 register. + * @details Read SPI_RX0 register to get the received datum. + */ +#define SPI_READ_RX0(spi) ((spi)->RX[0]) + +/** + * @brief Get the datum read from RX1 register. + * @param[in] spi The pointer of the specified SPI module. + * @return Data in RX1 register. + * @details Read SPI_RX1 register to get the received datum. + */ +#define SPI_READ_RX1(spi) ((spi)->RX[1]) + +/** + * @brief Write datum to TX0 register. + * @param[in] spi The pointer of the specified SPI module. + * @param[in] u32TxData The datum which user attempt to transfer through SPI bus. + * @return None. + * @details Write u32TxData to TX0 register. + */ +#define SPI_WRITE_TX0(spi, u32TxData) ((spi)->TX[0] = (u32TxData)) + +/** + * @brief Write datum to TX1 register. + * @param[in] spi The pointer of the specified SPI module. + * @param[in] u32TxData The datum which user attempt to transfer through SPI bus. + * @return None. + * @details Write u32TxData to TX1 register. + */ +#define SPI_WRITE_TX1(spi, u32TxData) ((spi)->TX[1] = (u32TxData)) + +/** + * @brief Set SPIn_SS0, SPIn_SS1 pin to high or low state. + * @param[in] spi The pointer of the specified SPI module. + * @param[in] ss0 0 = Set SPIn_SS0 to low. 1 = Set SPIn_SS0 to high. + * @param[in] ss1 0 = Set SPIn_SS1 to low. 1 = Set SPIn_SS1 to high. + * @return None. + * @details Disable automatic slave selection function and set SPIn_SS0/SPIn_SS1 pin to specified high/low state. + * Only available in Master mode. + */ +#define SPI_SET_SS_LEVEL(spi, ss0, ss1) ((spi)->SSR = ((spi)->SSR & ~(SPI_SSR_AUTOSS_Msk|SPI_SSR_SS_LVL_Msk|SPI_SSR_SSR_Msk)) | (((ss1)^1) << 1) | ((ss0)^1)) + +/** + * @brief Set SPIn_SS0 pin to high state. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Disable automatic slave selection function and set SPIn_SS0 pin to high state. Only available in Master mode. + */ +#define SPI_SET_SS0_HIGH(spi) ((spi)->SSR = ((spi)->SSR & ~(SPI_SSR_AUTOSS_Msk|SPI_SSR_SS_LVL_Msk|SPI_SS0))) + +/** + * @brief Set SPIn_SS1 pin to high state. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Disable automatic slave selection function and set SPIn_SS1 pin to high state. Only available in Master mode. + */ +#define SPI_SET_SS1_HIGH(spi) ((spi)->SSR = ((spi)->SSR & ~(SPI_SSR_AUTOSS_Msk|SPI_SSR_SS_LVL_Msk|SPI_SS1))) + +/** + * @brief Set SPIn_SS0 pin to low state. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Disable automatic slave selection function and set SPIn_SS0 pin to low state. Only available in Master mode. + */ +#define SPI_SET_SS0_LOW(spi) ((spi)->SSR = ((spi)->SSR & ~(SPI_SSR_AUTOSS_Msk|SPI_SSR_SS_LVL_Msk|SPI_SS0)) | SPI_SS0) + +/** + * @brief Set SPIn_SS1 pin to low state. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Disable automatic slave selection function and set SPIn_SS1 pin to low state. Only available in Master mode. + */ +#define SPI_SET_SS1_LOW(spi) ((spi)->SSR = ((spi)->SSR & ~(SPI_SSR_AUTOSS_Msk|SPI_SSR_SS_LVL_Msk|SPI_SS1)) | SPI_SS1) + +/** + * @brief Enable Byte Reorder function. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Set REORDER bit of SPI_CNTRL register to enable Byte Reorder function. + */ +#define SPI_ENABLE_BYTE_REORDER(spi) ((spi)->CNTRL |= SPI_CNTRL_REORDER_Msk) + +/** + * @brief Disable Byte Reorder function. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Clear REORDER bit of SPI_CNTRL register to disable Byte Reorder function. + */ +#define SPI_DISABLE_BYTE_REORDER(spi) ((spi)->CNTRL &= ~SPI_CNTRL_REORDER_Msk) + +/** + * @brief Set the length of suspend interval. + * @param[in] spi The pointer of the specified SPI module. + * @param[in] u32SuspCycle Decides the length of suspend interval. It could be 0 ~ 15. + * @return None. + * @details Set the length of suspend interval according to u32SuspCycle. + * The length of suspend interval is ((u32SuspCycle + 0.5) * the length of one SPI bus clock cycle). + * Only available in Master mode. + */ +#define SPI_SET_SUSPEND_CYCLE(spi, u32SuspCycle) ((spi)->CNTRL = ((spi)->CNTRL & ~SPI_CNTRL_SP_CYCLE_Msk) | ((u32SuspCycle) << SPI_CNTRL_SP_CYCLE_Pos)) + +/** + * @brief Set the SPI transfer sequence with LSB first. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Set LSB bit of SPI_CNTRL register to set the SPI transfer sequence with LSB first. + */ +#define SPI_SET_LSB_FIRST(spi) ((spi)->CNTRL |= SPI_CNTRL_LSB_Msk) + +/** + * @brief Set the SPI transfer sequence with MSB first. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Clear LSB bit of SPI_CNTRL register to set the SPI transfer sequence with MSB first. + */ +#define SPI_SET_MSB_FIRST(spi) ((spi)->CNTRL &= ~SPI_CNTRL_LSB_Msk) + +/** + * @brief Set the data width of a SPI transaction. + * @param[in] spi The pointer of the specified SPI module. + * @param[in] u32Width The bit width of transfer data. + * @return None. + * @details The data width can be 8 ~ 32 bits. + */ +#define SPI_SET_DATA_WIDTH(spi, u32Width) ((spi)->CNTRL = ((spi)->CNTRL & ~SPI_CNTRL_TX_BIT_LEN_Msk) | (((u32Width)&0x1F) << SPI_CNTRL_TX_BIT_LEN_Pos)) + +/** + * @brief Get the SPI busy state. + * @param[in] spi The pointer of the specified SPI module. + * @retval 0 SPI controller is not busy. + * @retval 1 SPI controller is busy. + * @details This macro will return the busy state of SPI controller. + */ +#define SPI_IS_BUSY(spi) ( ((spi)->CNTRL & SPI_CNTRL_GO_BUSY_Msk)>>SPI_CNTRL_GO_BUSY_Pos ) + +/** + * @brief Set the GO_BUSY bit to trigger SPI transfer. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details If FIFO mode is disabled, user can use this macro to trigger the data transfer after all configuration is ready. + * If FIFO mode is enabled, user should not use this macro to trigger the data transfer. SPI controller will trigger the data transfer + * automatically after user write to SPI_TX0/1 register. + */ +#define SPI_TRIGGER(spi) ((spi)->CNTRL |= SPI_CNTRL_GO_BUSY_Msk) + + + +/* Function prototype declaration */ +uint32_t SPI_Open(SPI_T *spi, uint32_t u32MasterSlave, uint32_t u32SPIMode, uint32_t u32DataWidth, uint32_t u32BusClock); +void SPI_Close(SPI_T *spi); +void SPI_ClearRxFIFO(SPI_T *spi); +void SPI_ClearTxFIFO(SPI_T *spi); +void SPI_DisableAutoSS(SPI_T *spi); +void SPI_EnableAutoSS(SPI_T *spi, uint32_t u32SSPinMask, uint32_t u32ActiveLevel); +uint32_t SPI_SetBusClock(SPI_T *spi, uint32_t u32BusClock); +void SPI_EnableFIFO(SPI_T *spi, uint32_t u32TxThreshold, uint32_t u32RxThreshold); +void SPI_DisableFIFO(SPI_T *spi); +uint32_t SPI_GetBusClock(SPI_T *spi); +void SPI_EnableInt(SPI_T *spi, uint32_t u32Mask); +void SPI_DisableInt(SPI_T *spi, uint32_t u32Mask); +uint32_t SPI_GetIntFlag(SPI_T *spi, uint32_t u32Mask); +void SPI_ClearIntFlag(SPI_T *spi, uint32_t u32Mask); +uint32_t SPI_GetStatus(SPI_T *spi, uint32_t u32Mask); + + + +/** + * @} End of SPI Device Function Interface + */ + +/** + * @} End of NUC123 Function Interface + */ + +/** + * @} End of Standard_Driver + */ + + +#endif + diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/sys.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/sys.h new file mode 100644 index 00000000..22778f2b --- /dev/null +++ b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/sys.h @@ -0,0 +1,1368 @@ +/**************************************************************************//** + * @file sys.h + * @version V3.00 + * $Revision: 41 $ + * $Date: 15/07/02 11:21a $ + * @brief NUC123 Series SYS Driver Header File + * + * @note + * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. + * + ******************************************************************************/ +#ifndef __SYS_H__ +#define __SYS_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup SYS_Driver SYS Driver + @{ +*/ + +/** @addtogroup SYS_EXPORTED_CONSTANTS SYS Exported Constants + @{ +*/ + + +/*---------------------------------------------------------------------------------------------------------*/ +/* Module Reset Control Resister constant definitions. */ +/*---------------------------------------------------------------------------------------------------------*/ +#define PDMA_RST ((0x0<<24) | SYS_IPRSTC1_PDMA_RST_Pos ) /*!< PDMA reset is one of the SYS_ResetModule parameter */ +#define GPIO_RST ((0x4<<24) | SYS_IPRSTC2_GPIO_RST_Pos ) /*!< GPIO reset is one of the SYS_ResetModule parameter */ +#define TMR0_RST ((0x4<<24) | SYS_IPRSTC2_TMR0_RST_Pos ) /*!< TMR0 reset is one of the SYS_ResetModule parameter */ +#define TMR1_RST ((0x4<<24) | SYS_IPRSTC2_TMR1_RST_Pos ) /*!< TMR1 reset is one of the SYS_ResetModule parameter */ +#define TMR2_RST ((0x4<<24) | SYS_IPRSTC2_TMR2_RST_Pos ) /*!< TMR2 reset is one of the SYS_ResetModule parameter */ +#define TMR3_RST ((0x4<<24) | SYS_IPRSTC2_TMR3_RST_Pos ) /*!< TMR3 reset is one of the SYS_ResetModule parameter */ +#define I2C0_RST ((0x4<<24) | SYS_IPRSTC2_I2C0_RST_Pos ) /*!< I2C0 reset is one of the SYS_ResetModule parameter */ +#define I2C1_RST ((0x4<<24) | SYS_IPRSTC2_I2C1_RST_Pos ) /*!< I2C1 reset is one of the SYS_ResetModule parameter */ +#define SPI0_RST ((0x4<<24) | SYS_IPRSTC2_SPI0_RST_Pos ) /*!< SPI0 reset is one of the SYS_ResetModule parameter */ +#define SPI1_RST ((0x4<<24) | SYS_IPRSTC2_SPI1_RST_Pos ) /*!< SPI1 reset is one of the SYS_ResetModule parameter */ +#define SPI2_RST ((0x4<<24) | SYS_IPRSTC2_SPI2_RST_Pos ) /*!< SPI2 reset is one of the SYS_ResetModule parameter */ +#define UART0_RST ((0x4<<24) | SYS_IPRSTC2_UART0_RST_Pos ) /*!< UART0 reset is one of the SYS_ResetModule parameter */ +#define UART1_RST ((0x4<<24) | SYS_IPRSTC2_UART1_RST_Pos ) /*!< UART1 reset is one of the SYS_ResetModule parameter */ +#define PWM03_RST ((0x4<<24) | SYS_IPRSTC2_PWM03_RST_Pos ) /*!< PWM03 reset is one of the SYS_ResetModule parameter */ +#define PS2_RST ((0x4<<24) | SYS_IPRSTC2_PS2_RST_Pos ) /*!< PS2 reset is one of the SYS_ResetModule parameter */ +#define USBD_RST ((0x4<<24) | SYS_IPRSTC2_USBD_RST_Pos ) /*!< USBD reset is one of the SYS_ResetModule parameter */ +#define ADC_RST ((0x4<<24) | SYS_IPRSTC2_ADC_RST_Pos ) /*!< ADC reset is one of the SYS_ResetModule parameter */ +#define I2S_RST ((0x4<<24) | SYS_IPRSTC2_I2S_RST_Pos ) /*!< I2S reset is one of the SYS_ResetModule parameter */ + + +/*---------------------------------------------------------------------------------------------------------*/ +/* Brown Out Detector Threshold Voltage Selection constant definitions. */ +/*---------------------------------------------------------------------------------------------------------*/ +#define SYS_BODCR_BOD_RST_EN (1UL<GPA_MFP &= ~(SYS_GPA_MFP_PA10_Msk | SYS_GPA_MFP_PA11_Msk); + SYS->ALT_MFP &= ~(SYS_ALT_MFP_PA10_Msk | SYS_ALT_MFP_PA11_Msk); + + SYS->GPA_MFP |= (SYS_GPA_MFP_PA10_I2C1_SDA | SYS_GPA_MFP_PA11_I2C1_SCL); + SYS->ALT_MFP |= (SYS_ALT_MFP_PA10_I2C1_SDA | SYS_ALT_MFP_PA11_I2C1_SCL); +*/ + +//PA.10 +#define SYS_GPA_MFP_PA10_GPIO 0x00000000UL /*!< GPA_MFP PA.10 setting for GPIO */ +#define SYS_ALT_MFP_PA10_GPIO 0x00000000UL /*!< ALT_MFP PA.10 setting for GPIO */ +#define SYS_ALT_MFP1_PA10_GPIO NULL /*!< No ALT_MFP1 setting for PA.10 */ + +#define SYS_GPA_MFP_PA10_I2C1_SDA (1UL<<10) /*!< GPA_MFP PA.10 setting for I2C1_SDA */ +#define SYS_ALT_MFP_PA10_I2C1_SDA 0x00000000UL /*!< ALT_MFP PA.10 setting for I2C1_SDA */ +#define SYS_ALT_MFP1_PA10_I2C1_SDA NULL /*!< No ALT_MFP1 setting for PA.10 */ + +#define SYS_GPA_MFP_PA10_SPI1_MISO0 0x00000000UL /*!< GPA_MFP PA.10 setting for SPI1_MISO0 */ +#define SYS_ALT_MFP_PA10_SPI1_MISO0 (1UL<<12) /*!< ALT_MFP PA.10 setting for SPI1_MISO0 */ +#define SYS_ALT_MFP1_PA10_SPI1_MISO0 NULL /*!< No ALT_MFP1 setting for PA.10 */ + +#define SYS_GPA_MFP_PA10_SPI2_MISO0 (1UL<<10) /*!< GPA_MFP PA.10 setting for SPI2_MISO0 */ +#define SYS_ALT_MFP_PA10_SPI2_MISO0 (1UL<<12) /*!< ALT_MFP PA.10 setting for SPI2_MISO0 */ +#define SYS_ALT_MFP1_PA10_SPI2_MISO0 NULL /*!< No ALT_MFP1 setting for PA.10 */ + +#define SYS_GPA_MFP_PA10_Msk (1UL<<10) /*!< GPA_MFP PA.10 mask */ +#define SYS_ALT_MFP_PA10_Msk (1UL<<12) /*!< ALT_MFP PA.10 mask */ +#define SYS_ALT_MFP1_PA10_Msk NULL /*!< No ALT_MFP1 PA.10 mask */ + +//PA.11 +#define SYS_GPA_MFP_PA11_GPIO 0x00000000UL /*!< GPA_MFP PA.11 setting for GPIO */ +#define SYS_ALT_MFP_PA11_GPIO 0x00000000UL /*!< ALT_MFP PA.11 setting for GPIO */ +#define SYS_ALT_MFP1_PA11_GPIO NULL /*!< No ALT_MFP1 setting for PA.11 */ + +#define SYS_GPA_MFP_PA11_I2C1_SCL (1UL<<11) /*!< GPA_MFP PA.11 setting for I2C1_SCL */ +#define SYS_ALT_MFP_PA11_I2C1_SCL 0x00000000UL /*!< ALT_MFP PA.11 setting for I2C1_SCL */ +#define SYS_ALT_MFP1_PA11_I2C1_SCL NULL /*!< No ALT_MFP1 setting for PA.11 */ + +#define SYS_GPA_MFP_PA11_SPI1_CLK 0x00000000UL /*!< GPA_MFP PA.11 setting for SPI1_CLK */ +#define SYS_ALT_MFP_PA11_SPI1_CLK (1UL<<11) /*!< ALT_MFP PA.11 setting for SPI1_CLK */ +#define SYS_ALT_MFP1_PA11_SPI1_CLK NULL /*!< No ALT_MFP1 setting for PA.11 */ + +#define SYS_GPA_MFP_PA11_SPI2_MOSI0 (1UL<<11) /*!< GPA_MFP PA.11 setting for MOSI20 */ +#define SYS_ALT_MFP_PA11_SPI2_MOSI0 (1UL<<11) /*!< ALT_MFP PA.11 setting for MOSI20 */ +#define SYS_ALT_MFP1_PA11_SPI2_MOSI0 NULL /*!< No ALT_MFP1 setting for PA.11 */ + +#define SYS_GPA_MFP_PA11_Msk (1UL<<11) /*!< GPA_MFP PA.11 mask */ +#define SYS_ALT_MFP_PA11_Msk (1UL<<11) /*!< ALT_MFP PA.11 mask */ +#define SYS_ALT_MFP1_PA11_Msk NULL /*!< No ALT_MFP1 PA.11 mask */ + +//PA.12 +#define SYS_GPA_MFP_PA12_GPIO 0x00000000UL /*!< GPA_MFP PA.12 setting for GPIO */ +#define SYS_ALT_MFP_PA12_GPIO NULL /*!< No ALT_MFP setting for PA.12 */ +#define SYS_ALT_MFP1_PA12_GPIO NULL /*!< No ALT_MFP1 setting for PA.12 */ + +#define SYS_GPA_MFP_PA12_PWM0 (1UL<<12) /*!< GPA_MFP PA.12 setting for PWM0 */ +#define SYS_ALT_MFP_PA12_PWM0 NULL /*!< No ALT_MFP setting for PA.12 */ +#define SYS_ALT_MFP1_PA12_PWM0 NULL /*!< No ALT_MFP1 setting for PA.12 */ + +#define SYS_GPA_MFP_PA12_Msk (1UL<<12) /*!< GPA_MFP PA.12 mask */ +#define SYS_ALT_MFP_PA12_Msk NULL /*!< No ALT_MFP PA.12 mask */ +#define SYS_ALT_MFP1_PA12_Msk NULL /*!< No ALT_MFP1 PA.12 mask */ + +//PA.13 +#define SYS_GPA_MFP_PA13_GPIO 0x00000000UL /*!< GPA_MFP PA.13 setting for GPIO */ +#define SYS_ALT_MFP_PA13_GPIO NULL /*!< no ALT_MFP setting for PA.13 */ +#define SYS_ALT_MFP1_PA13_GPIO NULL /*!< No ALT_MFP1 setting for PA.13 */ + +#define SYS_GPA_MFP_PA13_PWM1 (1UL<<13) /*!< GPA_MFP PA.13 setting for PWM1 */ +#define SYS_ALT_MFP_PA13_PWM1 NULL /*!< no ALT_MFP setting for PA.13 */ +#define SYS_ALT_MFP1_PA13_PWM1 NULL /*!< No ALT_MFP1 setting for PA.13 */ + +#define SYS_GPA_MFP_PA13_Msk (1UL<<13) /*!< GPA_MFP PA.13 mask */ +#define SYS_ALT_MFP_PA13_Msk NULL /*!< no ALT_MFP PA.13 mask */ +#define SYS_ALT_MFP1_PA13_Msk NULL /*!< No ALT_MFP1 PA.13 mask */ + +//PA.14 +#define SYS_GPA_MFP_PA14_GPIO 0x00000000UL /*!< GPA_MFP PA.14 setting for GPIO */ +#define SYS_ALT_MFP_PA14_GPIO NULL /*!< No ALT_MFP setting for PA.14 */ +#define SYS_ALT_MFP1_PA14_GPIO NULL /*!< No ALT_MFP1 setting for PA.14 */ + +#define SYS_GPA_MFP_PA14_PWM2 (1UL<<14) /*!< GPA_MFP PA.14 setting for PWM2 */ +#define SYS_ALT_MFP_PA14_PWM2 NULL /*!< No ALT_MFP setting for PA.14 */ +#define SYS_ALT_MFP1_PA14_PWM2 NULL /*!< No ALT_MFP1 setting for PA.14 */ + +#define SYS_GPA_MFP_PA14_Msk (1UL<<14) /*!< GPA_MFP PA.14 mask */ +#define SYS_ALT_MFP_PA14_Msk NULL /*!< No ALT_MFP PA.14 mask */ +#define SYS_ALT_MFP1_PA14_Msk NULL /*!< No ALT_MFP1 PA.14 mask */ + +//PA.15 +#define SYS_GPA_MFP_PA15_GPIO 0x00000000UL /*!< GPA_MFP PA.15 setting for GPIO */ +#define SYS_ALT_MFP_PA15_GPIO 0x00000000UL /*!< ALT_MFP PA.15 setting for GPIO */ +#define SYS_ALT_MFP1_PA15_GPIO NULL /*!< No ALT_MFP1 setting for PA.15 */ + +#define SYS_GPA_MFP_PA15_PWM3 (1UL<<15) /*!< GPA_MFP PA.15 setting for PWM3 */ +#define SYS_ALT_MFP_PA15_PWM3 0x00000000UL /*!< ALT_MFP PA.15 setting for PWM3 */ +#define SYS_ALT_MFP1_PA15_PWM3 NULL /*!< No ALT_MFP1 setting for PA.15 */ + +#define SYS_GPA_MFP_PA15_CLKO 0x00000000UL /*!< GPA_MFP PA.15 setting for CLKO */ +#define SYS_ALT_MFP_PA15_CLKO (1UL<<9) /*!< ALT_MFP PA.15 setting for CLKO */ +#define SYS_ALT_MFP1_PA15_CLKO NULL /*!< No ALT_MFP1 setting for PA.15 */ + +#define SYS_GPA_MFP_PA15_I2S_MCLK (1UL<<15) /*!< GPA_MFP PA.15 setting for I2S_MCLK */ +#define SYS_ALT_MFP_PA15_I2S_MCLK (1UL<<9) /*!< ALT_MFP PA.15 setting for I2S_MCLK */ +#define SYS_ALT_MFP1_PA15_I2S_MCLK NULL /*!< No ALT_MFP1 setting for PA.15 */ + +#define SYS_GPA_MFP_PA15_Msk (1UL<<15) /*!< GPA_MFP PA.15 mask */ +#define SYS_ALT_MFP_PA15_Msk (1UL<<9) /*!< ALT_MFP PA.15 mask */ +#define SYS_ALT_MFP1_PA15_Msk NULL /*!< No ALT_MFP1 PA.15 mask */ + +//PB.0 +#define SYS_GPB_MFP_PB0_GPIO 0x00000000UL /*!< GPB_MFP PB.0 setting for GPIO */ +#define SYS_ALT_MFP_PB0_GPIO NULL /*!< No ALT_MFP setting for PB.0 */ +#define SYS_ALT_MFP1_PB0_GPIO NULL /*!< No ALT_MFP1 setting for PB.0 */ + +#define SYS_GPB_MFP_PB0_UART0_RXD (1UL<<0) /*!< GPB_MFP PB.0 setting for UART0_RXD */ +#define SYS_ALT_MFP_PB0_UART0_RXD NULL /*!< No ALT_MFP setting for PB.0 */ +#define SYS_ALT_MFP1_PB0_UART0_RXD NULL /*!< No ALT_MFP1 setting for PB.0 */ + +#define SYS_GPB_MFP_PB0_Msk (1UL<<0) /*!< GPB_MFP PB.0 mask */ +#define SYS_ALT_MFP_PB0_Msk NULL /*!< No ALT_MFP PB.0 mask */ +#define SYS_ALT_MFP1_PB0_Msk NULL /*!< No ALT_MFP1 PB.0 mask */ + +//PB.1 +#define SYS_GPB_MFP_PB1_GPIO 0x00000000UL /*!< GPB_MFP PB.1 setting for GPIO */ +#define SYS_ALT_MFP_PB1_GPIO NULL /*!< No ALT_MFP setting for PB.1 */ +#define SYS_ALT_MFP1_PB1_GPIO NULL /*!< No ALT_MFP1 setting for PB.1 */ + +#define SYS_GPB_MFP_PB1_UART0_TXD (1UL<<1) /*!< GPB_MFP PB.1 setting for UART0_TXD */ +#define SYS_ALT_MFP_PB1_UART0_TXD NULL /*!< No ALT_MFP setting for PB.1 */ +#define SYS_ALT_MFP1_PB1_UART0_TXD NULL /*!< No ALT_MFP1 setting for PB.1 */ + +#define SYS_GPB_MFP_PB1_Msk (1UL<<1) /*!< GPB_MFP PB.1 mask */ +#define SYS_ALT_MFP_PB1_Msk NULL /*!< No ALT_MFP PB.1 mask */ +#define SYS_ALT_MFP1_PB1_Msk NULL /*!< No ALT_MFP1 PB.1 mask */ + +//PB.2 +#define SYS_GPB_MFP_PB2_GPIO 0x00000000UL /*!< GPB_MFP PB.2 setting for GPIO */ +#define SYS_ALT_MFP_PB2_GPIO 0x00000000UL /*!< ALT_MFP PB.2 setting for GPIO */ +#define SYS_ALT_MFP1_PB2_GPIO NULL /*!< No ALT_MFP1 setting for PB.2 */ + +#define SYS_GPB_MFP_PB2_UART0_nRTS (1UL<<2) /*!< GPB_MFP PB.2 setting for UART0_nRTS */ +#define SYS_ALT_MFP_PB2_UART0_nRTS 0x00000000UL /*!< ALT_MFP PB.2 setting for UART0_nRTS */ +#define SYS_ALT_MFP1_PB2_UART0_nRTS NULL /*!< No ALT_MFP1 setting for PB.2 */ + +#define SYS_GPB_MFP_PB2_TM2_EXT (1UL<<2) /*!< GPB_MFP PB.2 setting for TM2_EXT */ +#define SYS_ALT_MFP_PB2_TM2_EXT (1UL<<26) /*!< ALT_MFP PB.2 setting for TM2_EXT */ +#define SYS_ALT_MFP1_PB2_TM2_EXT NULL /*!< No ALT_MFP1 setting for PB.2 */ + +#define SYS_GPB_MFP_PB2_Msk (1UL<<2) /*!< GPB_MFP PB.2 mask */ +#define SYS_ALT_MFP_PB2_Msk (1UL<<26) /*!< ALT_MFP PB.2 mask */ +#define SYS_ALT_MFP1_PB2_Msk NULL /*!< No ALT_MFP1 PB.2 mask */ + +//PB.3 +#define SYS_GPB_MFP_PB3_GPIO 0x00000000UL /*!< GPB_MFP PB.3 setting for GPIO */ +#define SYS_ALT_MFP_PB3_GPIO 0x00000000UL /*!< ALT_MFP PB.3 setting for GPIO */ +#define SYS_ALT_MFP1_PB3_GPIO NULL /*!< No ALT_MFP1 setting for PB.3 */ + +#define SYS_GPB_MFP_PB3_UART0_nCTS (1UL<<3) /*!< GPB_MFP PB.3 setting for UART0_nCTS */ +#define SYS_ALT_MFP_PB3_UART0_nCTS 0x00000000UL /*!< ALT_MFP PB.3 setting for UART0_nCTS */ +#define SYS_ALT_MFP1_PB3_UART0_nCTS NULL /*!< No ALT_MFP1 setting for PB.3 */ + +#define SYS_GPB_MFP_PB3_TM3_EXT (1UL<<3) /*!< GPB_MFP PB.3 setting for TM3_EXT */ +#define SYS_ALT_MFP_PB3_TM3_EXT (1UL<<27) /*!< ALT_MFP PB.3 setting for TM3_EXT */ +#define SYS_ALT_MFP1_PB3_TM3_EXT NULL /*!< No ALT_MFP1 setting for PB.3 */ + +#define SYS_GPB_MFP_PB3_Msk (1UL<<3) /*!< GPB_MFP PB.3 mask */ +#define SYS_ALT_MFP_PB3_Msk (1UL<<27) /*!< ALT_MFP PB.3 mask */ +#define SYS_ALT_MFP1_PB3_Msk NULL /*!< No ALT_MFP1 PB.3 mask */ + +//PB.4 +#define SYS_GPB_MFP_PB4_GPIO 0x00000000UL /*!< GPB_MFP PB.4 setting for GPIO */ +#define SYS_ALT_MFP_PB4_GPIO 0x00000000UL /*!< ALT_MFP PB.4 setting for GPIO */ +#define SYS_ALT_MFP1_PB4_GPIO NULL /*!< No ALT_MFP1 setting for PB.4 */ + +#define SYS_GPB_MFP_PB4_UART1_RXD (1UL<<4) /*!< GPB_MFP PB.4 setting for UART1_RXD */ +#define SYS_ALT_MFP_PB4_UART1_RXD 0x00000000UL /*!< ALT_MFP PB.4 setting for UART1_RXD */ +#define SYS_ALT_MFP1_PB4_UART1_RXD NULL /*!< No ALT_MFP1 setting for PB.4 */ + +#define SYS_GPB_MFP_PB4_SPI2_SS0 0x00000000UL /*!< GPB_MFP PB.4 setting for SPI2_SS0 */ +#define SYS_ALT_MFP_PB4_SPI2_SS0 (1UL<<15) /*!< ALT_MFP PB.4 setting for SPI2_SS0 */ +#define SYS_ALT_MFP1_PB4_SPI2_SS0 NULL /*!< No ALT_MFP1 setting for PB.4 */ + +#define SYS_GPB_MFP_PB4_SPI1_SS1 (1UL<<4) /*!< GPB_MFP PB.4 setting for SPI1_SS1 */ +#define SYS_ALT_MFP_PB4_SPI1_SS1 (1UL<<15) /*!< ALT_MFP PB.4 setting for SPI1_SS1 */ +#define SYS_ALT_MFP1_PB4_SPI1_SS1 NULL /*!< No ALT_MFP1 setting for PB.4 */ + +#define SYS_GPB_MFP_PB4_Msk (1UL<<4) /*!< GPB_MFP PB.4 mask */ +#define SYS_ALT_MFP_PB4_Msk (1UL<<15) /*!< ALT_MFP PB.4 mask */ +#define SYS_ALT_MFP1_PB4_Msk NULL /*!< No ALT_MFP1 PB.4 mask */ + +//PB.5 +#define SYS_GPB_MFP_PB5_GPIO 0x00000000UL /*!< GPB_MFP PB.5 setting for GPIO */ +#define SYS_ALT_MFP_PB5_GPIO 0x00000000UL /*!< ALT_MFP PB.5 setting for GPIO */ +#define SYS_ALT_MFP1_PB5_GPIO NULL /*!< No ALT_MFP1 setting for PB.5 */ + +#define SYS_GPB_MFP_PB5_UART1_TXD (1UL<<5) /*!< GPB_MFP PB.5 setting for UART1_TXD */ +#define SYS_ALT_MFP_PB5_UART1_TXD 0x00000000UL /*!< ALT_MFP PB.5 setting for UART1_TXD */ +#define SYS_ALT_MFP1_PB5_UART1_TXD NULL /*!< No ALT_MFP1 setting for PB.5 */ + +#define SYS_GPB_MFP_PB5_SPI2_CLK (1UL<<5) /*!< GPB_MFP PB.5 setting for SPI2_CLK */ +#define SYS_ALT_MFP_PB5_SPI2_CLK (1UL<<18) /*!< ALT_MFP PB.5 setting for SPI2_CLK */ +#define SYS_ALT_MFP1_PB5_SPI2_CLK NULL /*!< No ALT_MFP1 setting for PB.5 */ + +#define SYS_GPB_MFP_PB5_Msk (1UL<<5) /*!< GPB_MFP PB.5 mask */ +#define SYS_ALT_MFP_PB5_Msk (1UL<<18) /*!< ALT_MFP PB.5 mask */ +#define SYS_ALT_MFP1_PB5_Msk NULL /*!< No ALT_MFP1 PB.5 mask */ + +//PB.6 +#define SYS_GPB_MFP_PB6_GPIO 0x00000000UL /*!< GPB_MFP PB.6 setting for GPIO */ +#define SYS_ALT_MFP_PB6_GPIO 0x00000000UL /*!< ALT_MFP PB.6 setting for GPIO */ +#define SYS_ALT_MFP1_PB6_GPIO NULL /*!< No ALT_MFP1 setting for PB.6 */ + +#define SYS_GPB_MFP_PB6_UART1_nRTS (1UL<<6) /*!< GPB_MFP PB.6 setting for UART1_nRTS */ +#define SYS_ALT_MFP_PB6_UART1_nRTS 0x00000000UL /*!< ALT_MFP PB.6 setting for UART1_nRTS */ +#define SYS_ALT_MFP1_PB6_UART1_nRTS NULL /*!< No ALT_MFP1 setting for PB.6 */ + +#define SYS_GPB_MFP_PB6_SPI2_MOSI0 (1UL<<6) /*!< GPB_MFP PB.6 setting for SPI2_MOSI0 */ +#define SYS_ALT_MFP_PB6_SPI2_MOSI0 (1UL<<17) /*!< ALT_MFP PB.6 setting for SPI2_MOSI0 */ +#define SYS_ALT_MFP1_PB6_SPI2_MOSI0 NULL /*!< No ALT_MFP1 setting for PB.6 */ + +#define SYS_GPB_MFP_PB6_Msk (1UL<<6) /*!< GPB_MFP PB.6 mask */ +#define SYS_ALT_MFP_PB6_Msk (1UL<<17) /*!< ALT_MFP PB.6 mask */ +#define SYS_ALT_MFP1_PB6_Msk NULL /*!< No ALT_MFP1 PB.6 mask */ + +//PB.7 +#define SYS_GPB_MFP_PB7_GPIO 0x00000000UL /*!< GPB_MFP PB.7 setting for GPIO */ +#define SYS_ALT_MFP_PB7_GPIO 0x00000000UL /*!< ALT_MFP PB.7 setting for GPIO */ +#define SYS_ALT_MFP1_PB7_GPIO NULL /*!< No ALT_MFP1 setting for PB.7 */ + +#define SYS_GPB_MFP_PB7_UART1_nCTS (1UL<<7) /*!< GPB_MFP PB.7 setting for UART1_nCTS */ +#define SYS_ALT_MFP_PB7_UART1_nCTS 0x00000000UL /*!< ALT_MFP PB.7 setting for UART1_nCTS */ +#define SYS_ALT_MFP1_PB7_UART1_nCTS NULL /*!< No ALT_MFP1 setting for PB.7 */ + +#define SYS_GPB_MFP_PB7_SPI2_MISO0 (1UL<<7) /*!< GPB_MFP PB.7 setting for SPI2_MISO0 */ +#define SYS_ALT_MFP_PB7_SPI2_MISO0 (1UL<<16) /*!< ALT_MFP PB.7 setting for SPI2_MISO0 */ +#define SYS_ALT_MFP1_PB7_SPI2_MISO0 NULL /*!< No ALT_MFP1 setting for PB.7 */ + +#define SYS_GPB_MFP_PB7_Msk (1UL<<7) /*!< GPB_MFP PB.7 mask */ +#define SYS_ALT_MFP_PB7_Msk (1UL<<16) /*!< ALT_MFP PB.7 mask */ +#define SYS_ALT_MFP1_PB7_Msk NULL /*!< No ALT_MFP1 PB.7 mask */ + +//PB.8 +#define SYS_GPB_MFP_PB8_GPIO 0x00000000UL /*!< GPB_MFP PB.8 setting for GPIO */ +#define SYS_ALT_MFP_PB8_GPIO NULL /*!< No ALT_MFP setting for PB.8 */ +#define SYS_ALT_MFP1_PB8_GPIO NULL /*!< No ALT_MFP1 setting for PB.8 */ + +#define SYS_GPB_MFP_PB8_TM0 (1UL<<8) /*!< GPB_MFP PB.8 setting for TM0 */ +#define SYS_ALT_MFP_PB8_TM0 NULL /*!< No ALT_MFP setting for PB.8 */ +#define SYS_ALT_MFP1_PB8_TM0 NULL /*!< No ALT_MFP1 setting for PB.8 */ + +#define SYS_GPB_MFP_PB8_Msk (1UL<<8) /*!< GPB_MFP PB.8 mask */ +#define SYS_ALT_MFP_PB8_Msk NULL /*!< No ALT_MFP PB.8 mask */ +#define SYS_ALT_MFP1_PB8_Msk NULL /*!< No ALT_MFP1 PB.8 mask */ + +//PB.9 +#define SYS_GPB_MFP_PB9_GPIO 0x00000000UL /*!< GPB_MFP PB.9 setting for GPIO */ +#define SYS_ALT_MFP_PB9_GPIO 0x00000000UL /*!< ALT_MFP PB.9 setting for GPIO */ +#define SYS_ALT_MFP1_PB9_GPIO NULL /*!< No ALT_MFP1 setting for PB.9 */ + +#define SYS_GPB_MFP_PB9_TM1 (1UL<<9) /*!< GPB_MFP PB.9 setting for TM1 */ +#define SYS_ALT_MFP_PB9_TM1 0x00000000UL /*!< ALT_MFP PB.9 setting for TM1 */ +#define SYS_ALT_MFP1_PB9_TM1 NULL /*!< No ALT_MFP1 setting for PB.9 */ + +#define SYS_GPB_MFP_PB9_SPI1_SS1 (1UL<<9) /*!< GPB_MFP PB.9 setting for SPI1_SS1 */ +#define SYS_ALT_MFP_PB9_SPI1_SS1 (1UL<<1) /*!< ALT_MFP PB.9 setting for SPI1_SS1 */ +#define SYS_ALT_MFP1_PB9_SPI1_SS1 NULL /*!< No ALT_MFP1 setting for PB.9 */ + +#define SYS_GPB_MFP_PB9_PWM1 0x00000000UL /*!< GPB_MFP PB.9 setting for PWM1 (NUC123xxxAEx only) */ +#define SYS_ALT_MFP_PB9_PWM1 (1UL<<1) /*!< ALT_MFP PB.9 setting for PWM1 (NUC123xxxAEx only) */ +#define SYS_ALT_MFP1_PB9_PWM1 NULL /*!< No ALT_MFP1 setting for PB.9 */ + +#define SYS_GPB_MFP_PB9_Msk (1UL<<9) /*!< GPB_MFP PB.9 mask */ +#define SYS_ALT_MFP_PB9_Msk (1UL<<1) /*!< ALT_MFP PB.9 mask */ +#define SYS_ALT_MFP1_PB9_Msk NULL /*!< No ALT_MFP1 PB.9 mask */ + +//PB.10 +#define SYS_GPB_MFP_PB10_GPIO 0x00000000UL /*!< GPB_MFP PB.10 setting for GPIO */ +#define SYS_ALT_MFP_PB10_GPIO 0x00000000UL /*!< ALT_MFP PB.10 setting for GPIO */ +#define SYS_ALT_MFP1_PB10_GPIO NULL /*!< No ALT_MFP1 setting for PB.10 */ + +#define SYS_GPB_MFP_PB10_TM2 (1UL<<10) /*!< GPB_MFP PB.10 setting for TM2 */ +#define SYS_ALT_MFP_PB10_TM2 0x00000000UL /*!< ALT_MFP PB.10 setting for TM2 */ +#define SYS_ALT_MFP1_PB10_TM2 NULL /*!< No ALT_MFP1 setting for PB.10 */ + +#define SYS_GPB_MFP_PB10_SPI0_SS1 (1UL<<10) /*!< GPB_MFP PB.10 setting for SPI0_SS1 */ +#define SYS_ALT_MFP_PB10_SPI0_SS1 (1UL<<0) /*!< ALT_MFP PB.10 setting for SPI0_SS1 */ +#define SYS_ALT_MFP1_PB10_SPI0_SS1 NULL /*!< No ALT_MFP1 setting for PB.10 */ + +#define SYS_GPB_MFP_PB10_Msk (1UL<<10) /*!< GPB_MFP PB.10 mask */ +#define SYS_ALT_MFP_PB10_Msk (1UL<<0) /*!< ALT_MFP PB.10 mask */ +#define SYS_ALT_MFP1_PB10_Msk NULL /*!< No ALT_MFP1 PB.10 mask */ + +//PB.12 +#define SYS_GPB_MFP_PB12_GPIO 0x00000000UL /*!< GPB_MFP PB.12 setting for GPIO */ +#define SYS_ALT_MFP_PB12_GPIO 0x00000000UL /*!< ALT_MFP PB.12 setting for GPIO */ +#define SYS_ALT_MFP1_PB12_GPIO NULL /*!< No ALT_MFP1 setting for PB.12 */ + +#define SYS_GPB_MFP_PB12_SPI1_SS0 (1UL<<12) /*!< GPB_MFP PB.12 setting for SPI1_SS0 */ +#define SYS_ALT_MFP_PB12_SPI1_SS0 0x00000000UL /*!< ALT_MFP PB.12 setting for SPI1_SS0 */ +#define SYS_ALT_MFP1_PB12_SPI1_SS0 NULL /*!< No ALT_MFP1 setting for PB.12 */ + +#define SYS_GPB_MFP_PB12_CLKO (1UL<<12) /*!< GPB_MFP PB.12 setting for CLKO */ +#define SYS_ALT_MFP_PB12_CLKO (1UL<<10) /*!< ALT_MFP PB.12 setting for CLKO */ +#define SYS_ALT_MFP1_PB12_CLKO NULL /*!< No ALT_MFP1 setting for PB.12 */ + +#define SYS_GPB_MFP_PB12_Msk (1UL<<12) /*!< GPB_MFP PB.12 mask */ +#define SYS_ALT_MFP_PB12_Msk (1UL<<10) /*!< ALT_MFP PB.12 mask */ +#define SYS_ALT_MFP1_PB12_Msk NULL /*!< No ALT_MFP1 PB.12 mask */ + +//PB.13 +#define SYS_GPB_MFP_PB13_GPIO 0x00000000UL /*!< GPB_MFP PB.13 setting for GPIO */ +#define SYS_ALT_MFP_PB13_GPIO NULL /*!< No ALT_MFP setting for PB.13 */ +#define SYS_ALT_MFP1_PB13_GPIO NULL /*!< No ALT_MFP1 setting for PB.13 */ + +#define SYS_GPB_MFP_PB13_Msk (1UL<<13) /*!< GPB_MFP PB.13 mask */ +#define SYS_ALT_MFP_PB13_Msk NULL /*!< No ALT_MFP PB.13 mask */ +#define SYS_ALT_MFP1_PB13_Msk NULL /*!< No ALT_MFP1 PB.13 mask */ + +//PB.14 +#define SYS_GPB_MFP_PB14_GPIO 0x00000000UL /*!< GPB_MFP PB.14 setting for GPIO */ +#define SYS_ALT_MFP_PB14_GPIO NULL /*!< No ALT_MFP setting for PB.14 */ +#define SYS_ALT_MFP1_PB14_GPIO NULL /*!< No ALT_MFP1 setting for PB.14 */ + +#define SYS_GPB_MFP_PB14_INT0 (1UL<<14) /*!< GPB_MFP PB.14 setting for INT0 */ +#define SYS_ALT_MFP_PB14_INT0 NULL /*!< No ALT_MFP setting for PB.14 */ +#define SYS_ALT_MFP1_PB14_INT0 NULL /*!< No ALT_MFP1 setting for PB.14 */ + +#define SYS_GPB_MFP_PB14_Msk (1UL<<14) /*!< GPB_MFP PB.14 mask */ +#define SYS_ALT_MFP_PB14_Msk NULL /*!< No ALT_MFP PB.14 mask */ +#define SYS_ALT_MFP1_PB14_Msk NULL /*!< No ALT_MFP1 PB.14 mask */ + +//PB.15 +#define SYS_GPB_MFP_PB15_GPIO 0x00000000UL /*!< GPB_MFP PB.15 setting for GPIO */ +#define SYS_ALT_MFP_PB15_GPIO 0x00000000UL /*!< ALT_MFP PB.15 setting for GPIO */ +#define SYS_ALT_MFP1_PB15_GPIO NULL /*!< No ALT_MFP1 setting for PB.15 */ + +#define SYS_GPB_MFP_PB15_INT1 (1UL<<15) /*!< GPB_MFP PB.15 setting for INT1 */ +#define SYS_ALT_MFP_PB15_INT1 0x00000000UL /*!< ALT_MFP PB.15 setting for INT1 */ +#define SYS_ALT_MFP1_PB15_INT1 NULL /*!< No ALT_MFP1 setting for PB.15 */ + +#define SYS_GPB_MFP_PB15_TM0_EXT (1UL<<15) /*!< GPB_MFP PB.15 setting for TM0_EXT */ +#define SYS_ALT_MFP_PB15_TM0_EXT (1UL<<24) /*!< ALT_MFP PB.15 setting for TM0_EXT */ +#define SYS_ALT_MFP1_PB15_TM0_EXT NULL /*!< No ALT_MFP1 setting for PB.15 */ + +#define SYS_GPB_MFP_PB15_Msk (1UL<<15) /*!< GPB_MFP PB.15 mask */ +#define SYS_ALT_MFP_PB15_Msk (1UL<<24) /*!< ALT_MFP PB.15 mask */ +#define SYS_ALT_MFP1_PB15_Msk NULL /*!< No ALT_MFP1 PB.15 mask */ + +//PC.0 +#define SYS_GPC_MFP_PC0_GPIO 0x00000000UL /*!< GPB_MFP PC.0 setting for GPIO */ +#define SYS_ALT_MFP_PC0_GPIO 0x00000000UL /*!< ALT_MFP PC.0 setting for GPIO */ +#define SYS_ALT_MFP1_PC0_GPIO NULL /*!< No ALT_MFP1 setting for PC.0 */ + +#define SYS_GPC_MFP_PC0_SPI0_SS0 (1UL<<0) /*!< GPB_MFP PC.0 setting for SPI0_SS0 */ +#define SYS_ALT_MFP_PC0_SPI0_SS0 0x00000000UL /*!< ALT_MFP PC.0 setting for SPI0_SS0 */ +#define SYS_ALT_MFP1_PC0_SPI0_SS0 NULL /*!< No ALT_MFP1 setting for PC.0 */ + +#define SYS_GPC_MFP_PC0_I2S_LRCLK (1UL<<0) /*!< GPB_MFP PC.0 setting for I2S_LRCLK */ +#define SYS_ALT_MFP_PC0_I2S_LRCLK (1UL<<5) /*!< ALT_MFP PC.0 setting for I2S_LRCLK */ +#define SYS_ALT_MFP1_PC0_I2S_LRCLK NULL /*!< No ALT_MFP1 setting for PC.0 */ + +#define SYS_GPC_MFP_PC0_Msk (1UL<<0) /*!< GPC_MFP PC.0 mask */ +#define SYS_ALT_MFP_PC0_Msk (1UL<<5) /*!< ALT_MFP PC.0 mask */ +#define SYS_ALT_MFP1_PC0_Msk NULL /*!< No ALT_MFP1 PC.0 mask */ + +//PC.1 +#define SYS_GPC_MFP_PC1_GPIO 0x00000000UL /*!< GPC_MFP PC.1 setting for GPIO */ +#define SYS_ALT_MFP_PC1_GPIO 0x00000000UL /*!< ALT_MFP PC.1 setting for GPIO */ +#define SYS_ALT_MFP1_PC1_GPIO NULL /*!< No ALT_MFP1 setting for PC.1 */ + +#define SYS_GPC_MFP_PC1_SPI0_CLK (1UL<<1) /*!< GPC_MFP PC.1 setting for SPI0_CLK */ +#define SYS_ALT_MFP_PC1_SPI0_CLK 0x00000000UL /*!< ALT_MFP PC.1 setting for SPI0_CLK */ +#define SYS_ALT_MFP1_PC1_SPI0_CLK NULL /*!< No ALT_MFP1 setting for PC.1 */ + +#define SYS_GPC_MFP_PC1_I2S_BCLK (1UL<<1) /*!< GPC_MFP PC.1 setting for I2S_BCLK */ +#define SYS_ALT_MFP_PC1_I2S_BCLK (1UL<<6) /*!< ALT_MFP PC.1 setting for I2S_BCLK */ +#define SYS_ALT_MFP1_PC1_I2S_BCLK NULL /*!< No ALT_MFP1 setting for PC.1 */ + +#define SYS_GPC_MFP_PC1_Msk (1UL<<1) /*!< GPC_MFP PC.1 mask */ +#define SYS_ALT_MFP_PC1_Msk (1UL<<6) /*!< ALT_MFP PC.1 mask */ +#define SYS_ALT_MFP1_PC1_Msk NULL /*!< No ALT_MFP1 PC.1 mask */ + +//PC.2 +#define SYS_GPC_MFP_PC2_GPIO 0x00000000UL /*!< GPC_MFP PC.2 setting for GPIO */ +#define SYS_ALT_MFP_PC2_GPIO 0x00000000UL /*!< ALT_MFP PC.2 setting for GPIO */ +#define SYS_ALT_MFP1_PC2_GPIO NULL /*!< No ALT_MFP1 setting for PC.2 */ + +#define SYS_GPC_MFP_PC2_SPI0_MISO0 (1UL<<2) /*!< GPC_MFP PC.2 setting for SPI0_MISO0 */ +#define SYS_ALT_MFP_PC2_SPI0_MISO0 0x00000000UL /*!< ALT_MFP PC.2 setting for SPI0_MISO0 */ +#define SYS_ALT_MFP1_PC2_SPI0_MISO0 NULL /*!< No ALT_MFP1 setting for PC.2 */ + +#define SYS_GPC_MFP_PC2_I2S_DI (1UL<<2) /*!< GPC_MFP PC.2 setting for I2S_DI */ +#define SYS_ALT_MFP_PC2_I2S_DI (1UL<<7) /*!< ALT_MFP PC.2 setting for I2S_DI */ +#define SYS_ALT_MFP1_PC2_I2S_DI NULL /*!< No ALT_MFP1 setting for PC.2 */ + +#define SYS_GPC_MFP_PC2_Msk (1UL<<2) /*!< GPC_MFP PC.2 mask */ +#define SYS_ALT_MFP_PC2_Msk (1UL<<7) /*!< ALT_MFP PC.2 mask */ +#define SYS_ALT_MFP1_PC2_Msk NULL /*!< No ALT_MFP1 PC.2 mask */ + +//PC.3 +#define SYS_GPC_MFP_PC3_GPIO 0x00000000UL /*!< GPC_MFP PC.3 setting for GPIO */ +#define SYS_ALT_MFP_PC3_GPIO 0x00000000UL /*!< ALT_MFP PC.3 setting for GPIO */ +#define SYS_ALT_MFP1_PC3_GPIO NULL /*!< No ALT_MFP1 setting for PC.3 */ + +#define SYS_GPC_MFP_PC3_SPI0_MOSI0 (1UL<<3) /*!< GPC_MFP PC.3 setting for SPI0_MOSI0 */ +#define SYS_ALT_MFP_PC3_SPI0_MOSI0 0x00000000UL /*!< ALT_MFP PC.3 setting for SPI0_MOSI0 */ +#define SYS_ALT_MFP1_PC3_SPI0_MOSI0 NULL /*!< No ALT_MFP1 setting for PC.3 */ + +#define SYS_GPC_MFP_PC3_I2S_DO (1UL<<3) /*!< GPC_MFP PC.3 setting for I2S_DO */ +#define SYS_ALT_MFP_PC3_I2S_DO (1UL<<8) /*!< ALT_MFP PC.3 setting for I2S_DO */ +#define SYS_ALT_MFP1_PC3_I2S_DO NULL /*!< No ALT_MFP1 setting for PC.3 */ + +#define SYS_GPC_MFP_PC3_Msk (1UL<<3) /*!< GPC_MFP PC.3 mask */ +#define SYS_ALT_MFP_PC3_Msk (1UL<<8) /*!< ALT_MFP PC.3 mask */ +#define SYS_ALT_MFP1_PC3_Msk NULL /*!< No ALT_MFP1 PC.3 mask */ + +//PC.4 +#define SYS_GPC_MFP_PC4_GPIO 0x00000000UL /*!< GPC_MFP PC.4 setting for GPIO */ +#define SYS_ALT_MFP_PC4_GPIO 0x00000000UL /*!< ALT_MFP PC.4 setting for GPIO */ +#define SYS_ALT_MFP1_PC4_GPIO NULL /*!< No ALT_MFP1 setting for PC.4 */ + +#define SYS_GPC_MFP_PC4_SPI0_MISO1 (1UL<<4) /*!< GPC_MFP PC.4 setting for SPI0_MISO1 */ +#define SYS_ALT_MFP_PC4_SPI0_MISO1 0x00000000UL /*!< ALT_MFP PC.4 setting for SPI0_MISO1 */ +#define SYS_ALT_MFP1_PC4_SPI0_MISO1 NULL /*!< No ALT_MFP1 setting for PC.4 */ + +#define SYS_GPC_MFP_PC4_UART0_RXD (1UL<<4) /*!< GPC_MFP PC.4 setting for UART0_RXD */ +#define SYS_ALT_MFP_PC4_UART0_RXD (1UL<<29) /*!< ALT_MFP PC.4 setting for UART0_RXD */ +#define SYS_ALT_MFP1_PC4_UART0_RXD NULL /*!< No ALT_MFP1 setting for PC.4 */ + +#define SYS_GPC_MFP_PC4_Msk (1UL<<4) /*!< GPC_MFP PC.4 mask */ +#define SYS_ALT_MFP_PC4_Msk (1UL<<29) /*!< ALT_MFP PC.4 mask */ +#define SYS_ALT_MFP1_PC4_Msk NULL /*!< No ALT_MFP1 PC.4 mask */ + +//PC.5 +#define SYS_GPC_MFP_PC5_GPIO 0x00000000UL /*!< GPC_MFP PC.5 setting for GPIO */ +#define SYS_ALT_MFP_PC5_GPIO 0x00000000UL /*!< ALT_MFP PC.5 setting for GPIO */ +#define SYS_ALT_MFP1_PC5_GPIO NULL /*!< No ALT_MFP1 setting for PC.5 */ + +#define SYS_GPC_MFP_PC5_SPI0_MOSI1 (1UL<<5) /*!< GPC_MFP PC.5 setting for SPI0_MOSI1 */ +#define SYS_ALT_MFP_PC5_SPI0_MOSI1 0x00000000UL /*!< ALT_MFP PC.5 setting for SPI0_MOSI1 */ +#define SYS_ALT_MFP1_PC5_SPI0_MOSI1 NULL /*!< No ALT_MFP1 setting for PC.5 */ + +#define SYS_GPC_MFP_PC5_UART0_TXD (1UL<<5) /*!< GPC_MFP PC.5 setting for UART0_TXD */ +#define SYS_ALT_MFP_PC5_UART0_TXD (1UL<<30) /*!< ALT_MFP PC.5 setting for UART0_TXD */ +#define SYS_ALT_MFP1_PC5_UART0_TXD NULL /*!< No ALT_MFP1 setting for PC.5 */ + +#define SYS_GPC_MFP_PC5_Msk (1UL<<5) /*!< GPC_MFP PC.5 mask */ +#define SYS_ALT_MFP_PC5_Msk (1UL<<30) /*!< ALT_MFP PC.5 mask */ +#define SYS_ALT_MFP1_PC5_Msk NULL /*!< No ALT_MFP1 PC.5 mask */ + +//PC.8 +#define SYS_GPC_MFP_PC8_GPIO 0x00000000UL /*!< GPC_MFP PC.8 setting for GPIO */ +#define SYS_ALT_MFP_PC8_GPIO NULL /*!< No ALT_MFP setting for PC.8 */ +#define SYS_ALT_MFP1_PC8_GPIO 0x00000000UL /*!< ALT_MFP1 PC.8 setting for GPIO */ + +#define SYS_GPC_MFP_PC8_SPI1_SS0 (1UL<<8) /*!< GPC_MFP PC.8 setting for SPI1_SS0 */ +#define SYS_ALT_MFP_PC8_SPI1_SS0 NULL /*!< No ALT_MFP setting for PC.8 */ +#define SYS_ALT_MFP1_PC8_SPI1_SS0 0x00000000UL /*!< ALT_MFP1 PC.8 setting for SPI1_SS0 */ + +#define SYS_GPC_MFP_PC8_PWM0 (1UL<<8) /*!< GPC_MFP PC.8 setting for PWM0 (NUC123xxxAEx only) */ +#define SYS_ALT_MFP_PC8_PWM0 NULL /*!< No ALT_MFP setting for PC.8 */ +#define SYS_ALT_MFP1_PC8_PWM0 (1UL<<23) /*!< ALT_MFP1 PC.8 setting for PWM0 (NUC123xxxAEx only) */ + +#define SYS_GPC_MFP_PC8_Msk (1UL<<8) /*!< GPC_MFP PC.8 mask */ +#define SYS_ALT_MFP_PC8_Msk NULL /*!< No ALT_MFP PC.8 mask */ +#define SYS_ALT_MFP1_PC8_Msk (1UL<<23) /*!< ALT_MFP1 PC.8 mask */ + +//PC.9 +#define SYS_GPC_MFP_PC9_GPIO 0x00000000UL /*!< GPC_MFP PC.9 setting for GPIO */ +#define SYS_ALT_MFP_PC9_GPIO NULL /*!< No ALT_MFP setting for PC.9 */ +#define SYS_ALT_MFP1_PC9_GPIO NULL /*!< No ALT_MFP1 setting for PC.9 */ + +#define SYS_GPC_MFP_PC9_SPI1_CLK (1UL<<9) /*!< GPC_MFP PC.9 setting for SPI1_CLK */ +#define SYS_ALT_MFP_PC9_SPI1_CLK NULL /*!< No ALT_MFP setting for PC.9 */ +#define SYS_ALT_MFP1_PC9_SPI1_CLK NULL /*!< No ALT_MFP1 setting for PC.9 */ + +#define SYS_GPC_MFP_PC9_Msk (1UL<<9) /*!< GPC_MFP PC.9 mask */ +#define SYS_ALT_MFP_PC9_Msk NULL /*!< No ALT_MFP PC.9 mask */ +#define SYS_ALT_MFP1_PC9_Msk NULL /*!< No ALT_MFP1 PC.9 mask */ + +//PC.10 +#define SYS_GPC_MFP_PC10_GPIO 0x00000000UL /*!< GPC_MFP PC.10 setting for GPIO */ +#define SYS_ALT_MFP_PC10_GPIO NULL /*!< No ALT_MFP setting for PC.10 */ +#define SYS_ALT_MFP1_PC10_GPIO NULL /*!< No ALT_MFP1 setting for PC.10 */ + +#define SYS_GPC_MFP_PC10_SPI1_MISO0 (1UL<<10) /*!< GPC_MFP PC.10 setting for SPI1_MISO0 */ +#define SYS_ALT_MFP_PC10_SPI1_MISO0 NULL /*!< No ALT_MFP setting for PC.10 */ +#define SYS_ALT_MFP1_PC10_SPI1_MISO0 NULL /*!< No ALT_MFP1 setting for PC.10 */ + +#define SYS_GPC_MFP_PC10_Msk (1UL<<10) /*!< GPC_MFP PC.10 mask */ +#define SYS_ALT_MFP_PC10_Msk NULL /*!< No ALT_MFP PC.10 mask */ +#define SYS_ALT_MFP1_PC10_Msk NULL /*!< No ALT_MFP1 PC.10 mask */ + +//PC.11 +#define SYS_GPC_MFP_PC11_GPIO 0x00000000UL /*!< GPC_MFP PC.11 setting for GPIO */ +#define SYS_ALT_MFP_PC11_GPIO NULL /*!< No ALT_MFP setting for PC.11 */ +#define SYS_ALT_MFP1_PC11_GPIO NULL /*!< No ALT_MFP1 setting for PC.11 */ + +#define SYS_GPC_MFP_PC11_SPI1_MOSI0 (1UL<<11) /*!< GPC_MFP PC.11 setting for SPI1_MOSI0 */ +#define SYS_ALT_MFP_PC11_SPI1_MOSI0 NULL /*!< No ALT_MFP setting for PC.11 */ +#define SYS_ALT_MFP1_PC11_SPI1_MOSI0 NULL /*!< No ALT_MFP1 setting for PC.11 */ + +#define SYS_GPC_MFP_PC11_Msk (1UL<<11) /*!< GPC_MFP PC.11 mask */ +#define SYS_ALT_MFP_PC11_Msk NULL /*!< No ALT_MFP PC.11 mask */ +#define SYS_ALT_MFP1_PC11_Msk NULL /*!< No ALT_MFP1 PC.11 mask */ + +//PC.12 +#define SYS_GPC_MFP_PC12_GPIO 0x00000000UL /*!< GPC_MFP PC.12 setting for GPIO */ +#define SYS_ALT_MFP_PC12_GPIO 0x00000000UL /*!< ALT_MFP PC.12 setting for GPIO */ +#define SYS_ALT_MFP1_PC12_GPIO NULL /*!< No ALT_MFP1 setting for PC.12 */ + +#define SYS_GPC_MFP_PC12_SPI1_MISO1 (1UL<<12) /*!< GPC_MFP PC.12 setting for SPI1_MISO1 */ +#define SYS_ALT_MFP_PC12_SPI1_MISO1 0x00000000UL /*!< ALT_MFP PC.12 setting for SPI1_MISO1 */ +#define SYS_ALT_MFP1_PC12_SPI1_MISO1 NULL /*!< No ALT_MFP1 setting for PC.12 */ + +#define SYS_GPC_MFP_PC12_I2S_MCLK 0x00000000UL /*!< GPC_MFP PC.12 setting for I2S_MCLK */ +#define SYS_ALT_MFP_PC12_I2S_MCLK (1UL<<20) /*!< ALT_MFP PC.12 setting for I2S_MCLK */ +#define SYS_ALT_MFP1_PC12_I2S_MCLK NULL /*!< No ALT_MFP1 setting for PC.12 */ + +#define SYS_GPC_MFP_PC12_PWM2 (1UL<<12) /*!< GPC_MFP PC.12 setting for PWM2 */ +#define SYS_ALT_MFP_PC12_PWM2 (1UL<<20) /*!< ALT_MFP PC.12 setting for PWM2 */ +#define SYS_ALT_MFP1_PC12_PWM2 NULL /*!< No ALT_MFP1 setting for PC.12 */ + +#define SYS_GPC_MFP_PC12_Msk (1UL<<12) /*!< GPC_MFP PC.12 mask */ +#define SYS_ALT_MFP_PC12_Msk (1UL<<20) /*!< ALT_MFP PC.12 mask */ +#define SYS_ALT_MFP1_PC12_Msk NULL /*!< No ALT_MFP1 PC.12 mask */ + +//PC.13 +#define SYS_GPC_MFP_PC13_GPIO 0x00000000UL /*!< GPC_MFP PC.13 setting for GPIO */ +#define SYS_ALT_MFP_PC13_GPIO 0x00000000UL /*!< ALT_MFP PC.13 setting for GPIO */ +#define SYS_ALT_MFP1_PC13_GPIO NULL /*!< No ALT_MFP1 setting for PC.13 */ + +#define SYS_GPC_MFP_PC13_SPI1_MOSI1 (1UL<<13) /*!< GPC_MFP PC.13 setting for SPI1_MOSI1 */ +#define SYS_ALT_MFP_PC13_SPI1_MOSI1 0x00000000UL /*!< ALT_MFP PC.13 setting for SPI1_MOSI1 */ +#define SYS_ALT_MFP1_PC13_SPI1_MOSI1 NULL /*!< No ALT_MFP1 setting for PC.13 */ + +#define SYS_GPC_MFP_PC13_CLKO 0x00000000UL /*!< GPC_MFP PC.13 setting for CLKO */ +#define SYS_ALT_MFP_PC13_CLKO (1UL<<21) /*!< ALT_MFP PC.13 setting for CLKO */ +#define SYS_ALT_MFP1_PC13_CLKO NULL /*!< No ALT_MFP1 setting for PC.13 */ + +#define SYS_GPC_MFP_PC13_PWM3 (1UL<<13) /*!< GPC_MFP PC.13 setting for PWM3 */ +#define SYS_ALT_MFP_PC13_PWM3 (1UL<<21) /*!< ALT_MFP PC.13 setting for PWM3 */ +#define SYS_ALT_MFP1_PC13_PWM3 NULL /*!< No ALT_MFP1 setting for PC.13 */ + +#define SYS_GPC_MFP_PC13_Msk (1UL<<13) /*!< GPC_MFP PC.13 mask */ +#define SYS_ALT_MFP_PC13_Msk (1UL<<21) /*!< ALT_MFP PC.13 mask */ +#define SYS_ALT_MFP1_PC13_Msk NULL /*!< No ALT_MFP1 PC.13 mask */ + +//PD.0 +#define SYS_GPD_MFP_PD0_GPIO 0x00000000UL /*!< GPD_MFP PD.0 setting for GPIO */ +#define SYS_ALT_MFP_PD0_GPIO NULL /*!< No ALT_MFP setting for PD.0 */ +#define SYS_ALT_MFP1_PD0_GPIO 0x00000000UL /*!< ALT_MFP1 PD.0 setting for GPIO */ + +#define SYS_GPD_MFP_PD0_SPI2_SS0 0x00000000UL /*!< GPD_MFP PD.0 setting for SPI2_SS0 */ +#define SYS_ALT_MFP_PD0_SPI2_SS0 NULL /*!< No ALT_MFP setting for PD.0 */ +#define SYS_ALT_MFP1_PD0_SPI2_SS0 (1UL<<16) /*!< ALT_MFP1 PD.0 setting for SPI2_SS0 */ + +#define SYS_GPD_MFP_PD0_ADC0 (1UL<<0) /*!< GPD_MFP PD.0 setting for ADC0 */ +#define SYS_ALT_MFP_PD0_ADC0 NULL /*!< No ALT_MFP setting for PD.0 */ +#define SYS_ALT_MFP1_PD0_ADC0 (1UL<<16) /*!< ALT_MFP1 PD.0 setting for ADC0 */ + +#define SYS_GPD_MFP_PD0_Msk (1UL<<0) /*!< GPD_MFP PD.0 mask */ +#define SYS_ALT_MFP_PD0_Msk NULL /*!< No ALT_MFP PD.0 mask */ +#define SYS_ALT_MFP1_PD0_Msk (1UL<<16) /*!< ALT_MFP1 PD.0 mask */ + +//PD.1 +#define SYS_GPD_MFP_PD1_GPIO 0x00000000UL /*!< GPD_MFP PD.1 setting for GPIO */ +#define SYS_ALT_MFP_PD1_GPIO NULL /*!< No ALT_MFP setting for PD.1 */ +#define SYS_ALT_MFP1_PD1_GPIO 0x00000000UL /*!< ALT_MFP1 PD.1 setting for GPIO */ + +#define SYS_GPD_MFP_PD1_SPI0_SS1 (1UL<<1) /*!< GPD_MFP PD.1 setting for SPI0_SS1 */ +#define SYS_ALT_MFP_PD1_SPI0_SS1 NULL /*!< No ALT_MFP setting for PD.1 */ +#define SYS_ALT_MFP1_PD1_SPI0_SS1 0x00000000UL /*!< ALT_MFP1 PD.1 setting for SPI0_SS1 */ + +#define SYS_GPD_MFP_PD1_SPI2_CLK 0x00000000UL /*!< GPD_MFP PD.1 setting for SPI2_CLK */ +#define SYS_ALT_MFP_PD1_SPI2_CLK NULL /*!< No ALT_MFP setting for PD.1 */ +#define SYS_ALT_MFP1_PD1_SPI2_CLK (1UL<<17) /*!< ALT_MFP1 PD.1 setting for SPI2_CLK */ + +#define SYS_GPD_MFP_PD1_ADC1 (1UL<<1) /*!< GPD_MFP PD.1 setting for ADC1 */ +#define SYS_ALT_MFP_PD1_ADC1 NULL /*!< No ALT_MFP setting for PD.1 */ +#define SYS_ALT_MFP1_PD1_ADC1 (1UL<<17) /*!< ALT_MFP1 PD.1 setting for ADC1 */ + +#define SYS_GPD_MFP_PD1_Msk (1UL<<1) /*!< GPD_MFP PD.1 mask */ +#define SYS_ALT_MFP_PD1_Msk NULL /*!< No ALT_MFP PD.1 mask */ +#define SYS_ALT_MFP1_PD1_Msk (1UL<<17) /*!< ALT_MFP1 PD.1 mask */ + +//PD.2 +#define SYS_GPD_MFP_PD2_GPIO 0x00000000UL /*!< GPD_MFP PD.2 setting for GPIO */ +#define SYS_ALT_MFP_PD2_GPIO NULL /*!< No ALT_MFP setting for PD.2 */ +#define SYS_ALT_MFP1_PD2_GPIO 0x00000000UL /*!< ALT_MFP1 PD.2 setting for GPIO */ + +#define SYS_GPD_MFP_PD2_SPI0_MISO1 (1UL<<2) /*!< GPD_MFP PD.2 setting for SPI0_MISO1 */ +#define SYS_ALT_MFP_PD2_SPI0_MISO1 NULL /*!< No ALT_MFP setting for PD.2 */ +#define SYS_ALT_MFP1_PD2_SPI0_MISO1 0x00000000UL /*!< ALT_MFP1 PD.2 setting for SPI0_MISO1 */ + +#define SYS_GPD_MFP_PD2_SPI2_MISO0 0x00000000UL /*!< GPD_MFP PD.2 setting for SPI2_MISO0 */ +#define SYS_ALT_MFP_PD2_SPI2_MISO0 NULL /*!< No ALT_MFP setting for PD.2 */ +#define SYS_ALT_MFP1_PD2_SPI2_MISO0 (1UL<<18) /*!< ALT_MFP1 PD.2 setting for SPI2_MISO0 */ + +#define SYS_GPD_MFP_PD2_ADC2 (1UL<<2) /*!< GPD_MFP PD.2 setting for ADC2 */ +#define SYS_ALT_MFP_PD2_ADC2 NULL /*!< No ALT_MFP setting for PD.2 */ +#define SYS_ALT_MFP1_PD2_ADC2 (1UL<<18) /*!< ALT_MFP1 PD.2 setting for ADC2 */ + +#define SYS_GPD_MFP_PD2_Msk (1UL<<2) /*!< GPD_MFP PD.2 mask */ +#define SYS_ALT_MFP_PD2_Msk NULL /*!< No ALT_MFP PD.2 mask */ +#define SYS_ALT_MFP1_PD2_Msk (1UL<<18) /*!< ALT_MFP1 PD.2 mask */ + +//PD.3 +#define SYS_GPD_MFP_PD3_GPIO 0x00000000UL /*!< GPD_MFP PD.3 setting for GPIO */ +#define SYS_ALT_MFP_PD3_GPIO NULL /*!< No ALT_MFP setting for PD.3 */ +#define SYS_ALT_MFP1_PD3_GPIO 0x00000000UL /*!< ALT_MFP1 PD.3 setting for GPIO */ + +#define SYS_GPD_MFP_PD3_SPI0_MOSI1 (1UL<<3) /*!< GPD_MFP PD.3 setting for SPI0_MOSI1 */ +#define SYS_ALT_MFP_PD3_SPI0_MOSI1 NULL /*!< No ALT_MFP setting for PD.3 */ +#define SYS_ALT_MFP1_PD3_SPI0_MOSI1 0x00000000UL /*!< ALT_MFP1 PD.3 setting for SPI0_MOSI1 */ + +#define SYS_GPD_MFP_PD3_SPI2_MOSI0 0x00000000UL /*!< GPD_MFP PD.3 setting for SPI2_MOSI0 */ +#define SYS_ALT_MFP_PD3_SPI2_MOSI0 NULL /*!< No ALT_MFP setting for PD.3 */ +#define SYS_ALT_MFP1_PD3_SPI2_MOSI0 (1UL<<19) /*!< ALT_MFP1 PD.3 setting for SPI2_MOSI0 */ + +#define SYS_GPD_MFP_PD3_ADC3 (1UL<<3) /*!< GPD_MFP PD.3 setting for ADC3 */ +#define SYS_ALT_MFP_PD3_ADC3 NULL /*!< No ALT_MFP setting for PD.3 */ +#define SYS_ALT_MFP1_PD3_ADC3 (1UL<<19) /*!< ALT_MFP1 PD.3 setting for ADC3 */ + +#define SYS_GPD_MFP_PD3_Msk (1UL<<3) /*!< GPD_MFP PD.3 mask */ +#define SYS_ALT_MFP_PD3_Msk NULL /*!< No ALT_MFP PD.3 mask */ +#define SYS_ALT_MFP1_PD3_Msk (1UL<<19) /*!< ALT_MFP1 PD.3 mask */ + +//PD.4 +#define SYS_GPD_MFP_PD4_GPIO 0x00000000UL /*!< GPD_MFP PD.4 setting for GPIO */ +#define SYS_ALT_MFP_PD4_GPIO NULL /*!< No ALT_MFP setting for PD.4 */ +#define SYS_ALT_MFP1_PD4_GPIO 0x00000000UL /*!< ALT_MFP1 PD.4 setting for GPIO */ + +#define SYS_GPD_MFP_PD4_SPI2_MISO1 0x00000000UL /*!< GPD_MFP PD.4 setting for SPI2_MISO1 */ +#define SYS_ALT_MFP_PD4_SPI2_MISO1 NULL /*!< No ALT_MFP setting for PD.4 */ +#define SYS_ALT_MFP1_PD4_SPI2_MISO1 (1UL<<20) /*!< ALT_MFP1 PD.4 setting for SPI2_MISO1 */ + +#define SYS_GPD_MFP_PD4_ADC4 (1UL<<4) /*!< GPD_MFP PD.4 setting for ADC4 */ +#define SYS_ALT_MFP_PD4_ADC4 NULL /*!< No ALT_MFP setting for PD.4 */ +#define SYS_ALT_MFP1_PD4_ADC4 (1UL<<20) /*!< ALT_MFP1 PD.4 setting for ADC4 */ + +#define SYS_GPD_MFP_PD4_Msk (1UL<<4) /*!< GPD_MFP PD.4 mask */ +#define SYS_ALT_MFP_PD4_Msk NULL /*!< No ALT_MFP PD.4 mask */ +#define SYS_ALT_MFP1_PD4_Msk (1UL<<20) /*!< ALT_MFP1 PD.4 mask */ + +//PD.5 +#define SYS_GPD_MFP_PD5_GPIO 0x00000000UL /*!< GPD_MFP PD.5 setting for GPIO */ +#define SYS_ALT_MFP_PD5_GPIO NULL /*!< No ALT_MFP setting for PD.5 */ +#define SYS_ALT_MFP1_PD5_GPIO 0x00000000UL /*!< ALT_MFP1 PD.5 setting for GPIO */ + +#define SYS_GPD_MFP_PD5_SPI2_MOSI1 0x00000000UL /*!< GPD_MFP PD.5 setting for SPI2_MOSI1 */ +#define SYS_ALT_MFP_PD5_SPI2_MOSI1 NULL /*!< No ALT_MFP setting for PD.5 */ +#define SYS_ALT_MFP1_PD5_SPI2_MOSI1 (1UL<<21) /*!< ALT_MFP1 PD.5 setting for SPI2_MOSI1 */ + +#define SYS_GPD_MFP_PD5_ADC5 (1UL<<5) /*!< GPD_MFP PD.5 setting for ADC5 */ +#define SYS_ALT_MFP_PD5_ADC5 NULL /*!< No ALT_MFP setting for PD.5 */ +#define SYS_ALT_MFP1_PD5_ADC5 (1UL<<21) /*!< ALT_MFP1 PD.5 setting for ADC5 */ + +#define SYS_GPD_MFP_PD5_Msk (1UL<<5) /*!< GPD_MFP PD.5 mask */ +#define SYS_ALT_MFP_PD5_Msk NULL /*!< No ALT_MFP PD.5 mask */ +#define SYS_ALT_MFP1_PD5_Msk (1UL<<21) /*!< ALT_MFP1 PD.5 mask */ + +//PD.8 +#define SYS_GPD_MFP_PD8_GPIO 0x00000000UL /*!< GPD_MFP PD.8 setting for GPIO */ +#define SYS_ALT_MFP_PD8_GPIO NULL /*!< No ALT_MFP setting for PD.8 */ +#define SYS_ALT_MFP1_PD8_GPIO NULL /*!< No ALT_MFP1 setting for PD.8 */ + +#define SYS_GPD_MFP_PD8_SPI1_MOSI0 (1UL<<8) /*!< GPD_MFP PD.8 setting for SPI1_MOSI0 */ +#define SYS_ALT_MFP_PD8_SPI1_MOSI0 NULL /*!< No ALT_MFP setting for PD.8 */ +#define SYS_ALT_MFP1_PD8_SPI1_MOSI0 NULL /*!< No ALT_MFP1 setting for PD.8 */ + +#define SYS_GPD_MFP_PD8_Msk (1UL<<8) /*!< GPD_MFP PD.8 mask */ +#define SYS_ALT_MFP_PD8_Msk NULL /*!< No ALT_MFP PD.8 mask */ +#define SYS_ALT_MFP1_PD8_Msk NULL /*!< No ALT_MFP1 PD.8 mask */ + +//PD.9 +#define SYS_GPD_MFP_PD9_GPIO 0x00000000UL /*!< GPD_MFP PD.9 setting for GPIO */ +#define SYS_ALT_MFP_PD9_GPIO NULL /*!< No ALT_MFP setting for PD.9 */ +#define SYS_ALT_MFP1_PD9_GPIO NULL /*!< No ALT_MFP1 setting for PD.9 */ + +#define SYS_GPD_MFP_PD9_Msk (1UL<<9) /*!< GPD_MFP PD.9 mask */ +#define SYS_ALT_MFP_PD9_Msk NULL /*!< No ALT_MFP PD.9 mask */ +#define SYS_ALT_MFP1_PD9_Msk NULL /*!< No ALT_MFP1 PD.9 mask */ + +//PD.10 +#define SYS_GPD_MFP_PD10_GPIO 0x00000000UL /*!< GPD_MFP PD.10 setting for GPIO */ +#define SYS_ALT_MFP_PD10_GPIO NULL /*!< No ALT_MFP setting for PD.10 */ +#define SYS_ALT_MFP1_PD10_GPIO NULL /*!< No ALT_MFP1 setting for PD.10 */ + +#define SYS_GPD_MFP_PD10_CLKO (1UL<<10) /*!< GPD_MFP PD.10 setting for CLKO */ +#define SYS_ALT_MFP_PD10_CLKO NULL /*!< No ALT_MFP setting for PD.10 */ +#define SYS_ALT_MFP1_PD10_CLKO NULL /*!< No ALT_MFP1 setting for PD.10 */ + +#define SYS_GPD_MFP_PD10_Msk (1UL<<10) /*!< GPD_MFP PD.10 mask */ +#define SYS_ALT_MFP_PD10_Msk NULL /*!< No ALT_MFP PD.10 mask */ +#define SYS_ALT_MFP1_PD10_Msk NULL /*!< No ALT_MFP1 PD.10 mask */ + +//PD.11 +#define SYS_GPD_MFP_PD11_GPIO 0x00000000UL /*!< GPD_MFP PD.11 setting for GPIO */ +#define SYS_ALT_MFP_PD11_GPIO NULL /*!< No ALT_MFP setting for PD.11 */ +#define SYS_ALT_MFP1_PD11_GPIO NULL /*!< No ALT_MFP1 setting for PD.11 */ + +#define SYS_GPD_MFP_PD11_INT1 (1UL<<11) /*!< GPD_MFP PD.11 setting for INT1 */ +#define SYS_ALT_MFP_PD11_INT1 NULL /*!< No ALT_MFP setting for PD.11 */ +#define SYS_ALT_MFP1_PD11_INT1 NULL /*!< No ALT_MFP1 setting for PD.11 */ + +#define SYS_GPD_MFP_PD11_Msk (1UL<<11) /*!< GPD_MFP PD.11 mask */ +#define SYS_ALT_MFP_PD11_Msk NULL /*!< No ALT_MFP PD.11 mask */ +#define SYS_ALT_MFP1_PD11_Msk NULL /*!< No ALT_MFP1 PD.11 mask */ + +//PF.0 +#define SYS_GPF_MFP_PF0_GPIO 0x00000000UL /*!< GPF_MFP PF.0 setting for GPIO */ +#define SYS_ALT_MFP_PF0_GPIO NULL /*!< No ALT_MFP setting for PF.0 */ +#define SYS_ALT_MFP1_PF0_GPIO NULL /*!< No ALT_MFP1 setting for PF.0 */ + +#define SYS_GPF_MFP_PF0_XT1_OUT (1UL<<0) /*!< GPF_MFP PF.0 setting for XT1_OUT */ +#define SYS_ALT_MFP_PF0_XT1_OUT NULL /*!< No ALT_MFP setting for PF.0 */ +#define SYS_ALT_MFP1_PF0_XT1_OUT NULL /*!< No ALT_MFP1 setting for PF.0 */ + +#define SYS_GPF_MFP_PF0_Msk (1UL<<0) /*!< GPF_MFP PF.0 mask */ +#define SYS_ALT_MFP_PF0_Msk NULL /*!< No ALT_MFP PF.0 mask */ +#define SYS_ALT_MFP1_PF0_Msk NULL /*!< No ALT_MFP1 PF.0 mask */ + +//PF.1 +#define SYS_GPF_MFP_PF1_GPIO 0x00000000UL /*!< GPF_MFP PF.1 setting for GPIO */ +#define SYS_ALT_MFP_PF1_GPIO NULL /*!< No ALT_MFP setting for PF.1 */ +#define SYS_ALT_MFP1_PF1_GPIO NULL /*!< No ALT_MFP1 setting for PF.1 */ + +#define SYS_GPF_MFP_PF1_XT1_IN (1UL<<1) /*!< GPF_MFP PF.1 setting for XT1_IN */ +#define SYS_ALT_MFP_PF1_XT1_IN NULL /*!< No ALT_MFP setting for PF.1 */ +#define SYS_ALT_MFP1_PF1_XT1_IN NULL /*!< No ALT_MFP1 setting for PF.1 */ + +#define SYS_GPF_MFP_PF1_Msk (1UL<<1) /*!< GPF_MFP PF.1 mask */ +#define SYS_ALT_MFP_PF1_Msk NULL /*!< No ALT_MFP PF.1 mask */ +#define SYS_ALT_MFP1_PF1_Msk NULL /*!< No ALT_MFP1 PF.1 mask */ + +//PF.2 +#define SYS_GPF_MFP_PF2_GPIO 0x00000000UL /*!< GPF_MFP PF.2 setting for GPIO */ +#define SYS_ALT_MFP_PF2_GPIO NULL /*!< No ALT_MFP setting for PF.2 */ +#define SYS_ALT_MFP1_PF2_GPIO 0x00000000UL /*!< ALT_MFP1 PF.2 setting for GPIO */ + +#define SYS_GPF_MFP_PF2_PS2_DAT (1UL<<2) /*!< GPF_MFP PF.2 setting for PS2_DAT */ +#define SYS_ALT_MFP_PF2_PS2_DAT NULL /*!< No ALT_MFP setting for PF.2 */ +#define SYS_ALT_MFP1_PF2_PS2_DAT 0x00000000UL /*!< ALT_MFP1 PF.2 setting for PS2_DAT */ + +#define SYS_GPF_MFP_PF2_I2C0_SDA (1UL<<2) /*!< GPF_MFP PF.2 setting for I2C0_SDA */ +#define SYS_ALT_MFP_PF2_I2C0_SDA NULL /*!< No ALT_MFP setting for PF.2 */ +#define SYS_ALT_MFP1_PF2_I2C0_SDA (0x2UL<<24) /*!< ALT_MFP1 PF.2 setting for I2C0_SDA */ + +#define SYS_GPF_MFP_PF2_ADC6 (1UL<<2) /*!< GPF_MFP PF.2 setting for ADC6 */ +#define SYS_ALT_MFP_PF2_ADC6 NULL /*!< No ALT_MFP setting for PF.2 */ +#define SYS_ALT_MFP1_PF2_ADC6 (0x3UL<<24) /*!< ALT_MFP1 PF.2 setting for ADC6 */ + +#define SYS_GPF_MFP_PF2_Msk (1UL<<2) /*!< GPF_MFP PF.2 mask */ +#define SYS_ALT_MFP_PF2_Msk NULL /*!< No ALT_MFP PF.2 mask */ +#define SYS_ALT_MFP1_PF2_Msk (0x3UL<<24) /*!< ALT_MFP1 PF.2 mask */ + +//PF.3 +#define SYS_GPF_MFP_PF3_GPIO 0x00000000UL /*!< GPF_MFP PF.3 setting for GPIO */ +#define SYS_ALT_MFP_PF3_GPIO NULL /*!< No ALT_MFP setting for PF.3 */ +#define SYS_ALT_MFP1_PF3_GPIO 0x00000000UL /*!< ALT_MFP1 PF.3 setting for GPIO */ + +#define SYS_GPF_MFP_PF3_PS2_CLK (1UL<<3) /*!< GPF_MFP PF.3 setting for PS2_CLK */ +#define SYS_ALT_MFP_PF3_PS2_CLK NULL /*!< No ALT_MFP setting for PF.3 */ +#define SYS_ALT_MFP1_PF3_PS2_CLK 0x00000000UL /*!< ALT_MFP1 PF.3 setting for PS2_CLK */ + +#define SYS_GPF_MFP_PF3_I2C0_SCL (1UL<<3) /*!< GPF_MFP PF.3 setting for I2C0_SCL */ +#define SYS_ALT_MFP_PF3_I2C0_SCL NULL /*!< No ALT_MFP setting for PF.3 */ +#define SYS_ALT_MFP1_PF3_I2C0_SCL (0x2UL<<26) /*!< ALT_MFP1 PF.3 setting for I2C0_SCL */ + +#define SYS_GPF_MFP_PF3_ADC7 (1UL<<3) /*!< GPF_MFP PF.3 setting for ADC7 */ +#define SYS_ALT_MFP_PF3_ADC7 NULL /*!< No ALT_MFP setting for PF.3 */ +#define SYS_ALT_MFP1_PF3_ADC7 (0x3UL<<26) /*!< ALT_MFP1 PF.3 setting for ADC7 */ + +#define SYS_GPF_MFP_PF3_Msk (1UL<<3) /*!< GPF_MFP PF.3 mask */ +#define SYS_ALT_MFP_PF3_Msk NULL /*!< No ALT_MFP PF.3 mask */ +#define SYS_ALT_MFP1_PF3_Msk (0x3UL<<26) /*!< ALT_MFP1 PF.3 mask */ + + +/*---------------------------------------------------------------------------------------------------------*/ +/* New Multi-Function constant definitions. (NUC123xxxAEx only) */ +/*---------------------------------------------------------------------------------------------------------*/ + +/* How to use below #define? +Example: If user want to set PA.10 as I2C1_SDA and PA.11 as I2C1_SCL in initial function, + user can issue following command to achieve it. + + SYS->GPA_MFPH &= ~(SYS_GPA_MFPH_GPA10_MFP_Msk | SYS_GPA_MFPH_GPA11_MFP_Msk); + SYS->GPA_MFPH |= (SYS_GPA_MFPH_GPA10_MFP_I2C1_SDA | SYS_GPA_MFPH_GPA11_MFP_I2C1_SCL); +*/ + +//GPA10_MFP +#define SYS_GPA_MFPH_GPA10_MFP_GPIO (0x0UL<BODCR |= SYS_BODCR_BOD_INTF_Msk) + +/** + * @brief Set Brown-out detector function to normal mode + * @param None + * @return None + * @details This macro set Brown-out detector to normal mode. + * The register write-protection function should be disabled before using this macro. + */ +#define SYS_CLEAR_BOD_LPM() (SYS->BODCR &= ~SYS_BODCR_BOD_LPM_Msk) + +/** + * @brief Disable Brown-out detector function + * @param None + * @return None + * @details This macro disable Brown-out detector function. + * The register write-protection function should be disabled before using this macro. + */ +#define SYS_DISABLE_BOD() (SYS->BODCR &= ~SYS_BODCR_BOD_EN_Msk) + +/** + * @brief Enable Brown-out detector function + * @param None + * @return None + * @details This macro enable Brown-out detector function. + * The register write-protection function should be disabled before using this macro. + */ +#define SYS_ENABLE_BOD() (SYS->BODCR |= SYS_BODCR_BOD_EN_Msk) + +/** + * @brief Get Brown-out detector interrupt flag + * @param None + * @retval 0 Brown-out detect interrupt flag is not set. + * @retval >=1 Brown-out detect interrupt flag is set. + * @details This macro get Brown-out detector interrupt flag. + */ +#define SYS_GET_BOD_INT_FLAG() (SYS->BODCR & SYS_BODCR_BOD_INTF_Msk) + +/** + * @brief Get Brown-out detector status + * @param None + * @retval 0 System voltage is higher than BOD threshold voltage setting or BOD function is disabled. + * @retval >=1 System voltage is lower than BOD threshold voltage setting. + * @details This macro get Brown-out detector output status. + * If the BOD function is disabled, this function always return 0. + */ +#define SYS_GET_BOD_OUTPUT() (SYS->BODCR & SYS_BODCR_BOD_OUT_Msk) + +/** + * @brief Enable Brown-out detector interrupt function + * @param None + * @return None + * @details This macro enable Brown-out detector interrupt function. + * The register write-protection function should be disabled before using this macro. + */ +#define SYS_DISABLE_BOD_RST() (SYS->BODCR &= ~SYS_BODCR_BOD_RSTEN_Msk) + +/** + * @brief Enable Brown-out detector reset function + * @param None + * @return None + * @details This macro enable Brown-out detect reset function. + * The register write-protection function should be disabled before using this macro. + */ +#define SYS_ENABLE_BOD_RST() (SYS->BODCR |= SYS_BODCR_BOD_RSTEN_Msk) + +/** + * @brief Set Brown-out detector function low power mode + * @param None + * @return None + * @details This macro set Brown-out detector to low power mode. + * The register write-protection function should be disabled before using this macro. + */ +#define SYS_SET_BOD_LPM() (SYS->BODCR |= SYS_BODCR_BOD_LPM_Msk) + +/** + * @brief Set Brown-out detector voltage level + * @param[in] u32Level is Brown-out voltage level. Including : + * - \ref SYS_BODCR_BOD_VL_4_5V + * - \ref SYS_BODCR_BOD_VL_3_8V + * - \ref SYS_BODCR_BOD_VL_2_7V + * - \ref SYS_BODCR_BOD_VL_2_2V + * @return None + * @details This macro set Brown-out detector voltage level. + * The write-protection function should be disabled before using this macro. + */ +#define SYS_SET_BOD_LEVEL(u32Level) (SYS->BODCR = (SYS->BODCR & ~SYS_BODCR_BOD_VL_Msk) | (u32Level)) + +/** + * @brief Get reset source is from Brown-out detector reset + * @param None + * @retval 0 Previous reset source is not from Brown-out detector reset + * @retval >=1 Previous reset source is from Brown-out detector reset + * @details This macro get previous reset source is from Brown-out detect reset or not. + */ +#define SYS_IS_BOD_RST() (SYS->RSTSRC & SYS_RSTSRC_RSTS_BOD_Msk) + +/** + * @brief Get reset source is from CPU reset + * @param None + * @retval 0 Previous reset source is not from CPU reset + * @retval >=1 Previous reset source is from CPU reset + * @details This macro get previous reset source is from CPU reset. + */ +#define SYS_IS_CPU_RST() (SYS->RSTSRC & SYS_RSTSRC_RSTS_CPU_Msk) + +/** + * @brief Get reset source is from Low-Voltage-Reset + * @param None + * @retval 0 Previous reset source is not from Low-Voltage-Reset + * @retval >=1 Previous reset source is from Low-Voltage-Reset + * @details This macro get previous reset source is from Low-Voltage-Reset. + */ +#define SYS_IS_LVR_RST() (SYS->RSTSRC & SYS_RSTSRC_RSTS_LVR_Msk) + +/** + * @brief Get reset source is from Power-on Reset + * @param None + * @retval 0 Previous reset source is not from Power-on Reset + * @retval >=1 Previous reset source is from Power-on Reset + * @details This macro get previous reset source is from Power-on Reset. + */ +#define SYS_IS_POR_RST() (SYS->RSTSRC & SYS_RSTSRC_RSTS_POR_Msk) + +/** + * @brief Get reset source is from reset pin reset + * @param None + * @retval 0 Previous reset source is not from reset pin reset + * @retval >=1 Previous reset source is from reset pin reset + * @details This macro get previous reset source is from reset pin reset. + */ +#define SYS_IS_RSTPIN_RST() (SYS->RSTSRC & SYS_RSTSRC_RSTS_RESET_Msk) + +/** + * @brief Get reset source is from system reset + * @param None + * @retval 0 Previous reset source is not from system reset + * @retval >=1 Previous reset source is from system reset + * @details This macro get previous reset source is from system reset. + */ +#define SYS_IS_SYSTEM_RST() (SYS->RSTSRC & SYS_RSTSRC_RSTS_SYS_Msk) + +/** + * @brief Get reset source is from window watch dog reset + * @param None + * @retval 0 Previous reset source is not from window watch dog reset + * @retval >=1 Previous reset source is from window watch dog reset + * @details This macro get previous reset source is from window watch dog reset. + */ +#define SYS_IS_WDT_RST() (SYS->RSTSRC & SYS_RSTSRC_RSTS_WDT_Msk) + +/** + * @brief Disable Low-Voltage-Reset function + * @param None + * @return None + * @details This macro disable Low-Voltage-Reset function. + * The register write-protection function should be disabled before using this macro. + */ +#define SYS_DISABLE_LVR() (SYS->BODCR &= ~SYS_BODCR_LVR_EN_Msk) + +/** + * @brief Enable Low-Voltage-Reset function + * @param None + * @return None + * @details This macro enable Low-Voltage-Reset function. + * The register write-protection function should be disabled before using this macro. + */ +#define SYS_ENABLE_LVR() (SYS->BODCR |= SYS_BODCR_LVR_EN_Msk) + +/** + * @brief Disable Power-on Reset function + * @param None + * @return None + * @details This macro disable Power-on Reset function. + * The register write-protection function should be disabled before using this macro. + */ +#define SYS_DISABLE_POR() (SYS->PORCR = 0x5AA5) + +/** + * @brief Enable Power-on Reset function + * @param None + * @return None + * @details This macro enable Power-on Reset function. + * The register write-protection function should be disabled before using this macro. + */ +#define SYS_ENABLE_POR() (SYS->PORCR = 0) + +/** + * @brief Clear reset source flag + * @param[in] u32RstSrc is reset source. Including: + * - \ref SYS_RSTSRC_RSTS_CPU_Msk + * - \ref SYS_RSTSRC_RSTS_SYS_Msk + * - \ref SYS_RSTSRC_RSTS_BOD_Msk + * - \ref SYS_RSTSRC_RSTS_LVR_Msk + * - \ref SYS_RSTSRC_RSTS_WDT_Msk + * - \ref SYS_RSTSRC_RSTS_RESET_Msk + * - \ref SYS_RSTSRC_RSTS_POR_Msk + * @return None + * @details This macro clear reset source flag. + */ +#define SYS_CLEAR_RST_SOURCE(u32RstSrc) (SYS->RSTSRC = (u32RstSrc) ) + + +/** + * @brief Enable register write-protection function + * @param None + * @return None + * @details This function enable register write-protection function. + * To lock the protected register to forbid write access. + */ +static __INLINE void SYS_LockReg(void) +{ + SYS->REGWRPROT = 0; +} + +/** + * @brief Disable register write-protection function + * @param None + * @return None + * @details This function disable register write-protection function. + * To unlock the protected register to allow write access. + * + */ +static __INLINE void SYS_UnlockReg(void) +{ + while(SYS->REGWRPROT != SYS_REGWRPROT_REGPROTDIS_Msk) + { + SYS->REGWRPROT = 0x59; + SYS->REGWRPROT = 0x16; + SYS->REGWRPROT = 0x88; + } +} + + +void SYS_ClearResetSrc(uint32_t u32Src); +uint32_t SYS_GetBODStatus(void); +uint32_t SYS_GetResetSrc(void); +uint32_t SYS_IsRegLocked(void); +uint32_t SYS_ReadPDID(void); +void SYS_ResetChip(void); +void SYS_ResetCPU(void); +void SYS_ResetModule(uint32_t u32ModuleIndex); +void SYS_EnableBOD(int32_t i32Mode, uint32_t u32BODLevel); +void SYS_DisableBOD(void); + + +/*@}*/ /* end of group SYS_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group SYS_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + + +#ifdef __cplusplus +} +#endif + +#endif //__SYS_H__ + +/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/timer.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/timer.h new file mode 100644 index 00000000..20bf954c --- /dev/null +++ b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/timer.h @@ -0,0 +1,393 @@ +/**************************************************************************//** + * @file timer.h + * @version V3.00 + * $Revision: 7 $ + * $Date: 15/07/02 11:21a $ + * @brief NUC123 series Timer driver header file + * + * @note + * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __TIMER_H__ +#define __TIMER_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup TIMER_Driver TIMER Driver + @{ +*/ + +/** @addtogroup TIMER_EXPORTED_CONSTANTS TIMER Exported Constants + @{ +*/ + +#define TIMER_ONESHOT_MODE (0UL << TIMER_TCSR_MODE_Pos) /*!< Timer working in one-shot mode */ +#define TIMER_PERIODIC_MODE (1UL << TIMER_TCSR_MODE_Pos) /*!< Timer working in periodic mode */ +#define TIMER_TOGGLE_MODE (2UL << TIMER_TCSR_MODE_Pos) /*!< Timer working in toggle-output mode */ +#define TIMER_CONTINUOUS_MODE (3UL << TIMER_TCSR_MODE_Pos) /*!< Timer working in continuous counting mode */ +#define TIMER_CAPTURE_FREE_COUNTING_MODE (0UL << TIMER_TEXCON_RSTCAPSEL_Pos) /*!< Timer capture event to get timer counter value */ +#define TIMER_CAPTURE_COUNTER_RESET_MODE (1UL << TIMER_TEXCON_RSTCAPSEL_Pos) /*!< Timer capture event to reset timer counter */ +#define TIMER_CAPTURE_FALLING_EDGE (0UL << TIMER_TEXCON_TEX_EDGE_Pos) /*!< Falling edge trigger timer capture */ +#define TIMER_CAPTURE_RISING_EDGE (1UL << TIMER_TEXCON_TEX_EDGE_Pos) /*!< Rising edge trigger timer capture */ +#define TIMER_CAPTURE_FALLING_AND_RISING_EDGE (2UL << TIMER_TEXCON_TEX_EDGE_Pos) /*!< Both falling and rising edge trigger timer capture */ +#define TIMER_COUNTER_FALLING_EDGE (0UL << TIMER_TEXCON_TX_PHASE_Pos) /*!< Counter increase on falling edge */ +#define TIMER_COUNTER_RISING_EDGE (1UL << TIMER_TEXCON_TX_PHASE_Pos) /*!< Counter increase on rising edge */ + +/*@}*/ /* end of group TIMER_EXPORTED_CONSTANTS */ + + +/** @addtogroup TIMER_EXPORTED_FUNCTIONS TIMER Exported Functions + @{ +*/ + +/** + * @brief Set Timer Compare Value + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * @param[in] u32Value Timer compare value. Valid values are between 2 to 0xFFFFFF. + * + * @return None + * + * @details This macro is used to set new Timer compared value. + */ +#define TIMER_SET_CMP_VALUE(timer, u32Value) ((timer)->TCMPR = (u32Value)) + +/** + * @brief Set Timer Prescale Value + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * @param[in] u32Value Timer prescale value. Valid values are between 0 to 0xFF. + * + * @return None + * + * @details This macro is used to set new Timer prescale value. + * @note Clock input is divided by (prescale + 1) before it is fed into timer. + */ +#define TIMER_SET_PRESCALE_VALUE(timer, u32Value) ((timer)->TCSR = ((timer)->TCSR & ~TIMER_TCSR_PRESCALE_Msk) | (u32Value)) + +/** + * @brief Check specify Timer Status + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @retval 0 Timer 24-bit up counter is inactive + * @retval 1 Timer 24-bit up counter is active + * + * @details This macro is used to check if specify Timer channel is inactive or active. + */ +#define TIMER_IS_ACTIVE(timer) ((timer)->TCSR & TIMER_TCSR_CACT_Msk ? 1 : 0) + +/** + * @brief Start Timer Counting + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to start Timer counting. + */ +static __INLINE void TIMER_Start(TIMER_T *timer) +{ + timer->TCSR |= TIMER_TCSR_CEN_Msk; +} + +/** + * @brief Stop Timer Counting + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to stop/suspend Timer counting. + */ +static __INLINE void TIMER_Stop(TIMER_T *timer) +{ + timer->TCSR &= ~TIMER_TCSR_CEN_Msk; +} + +/** + * @brief Enable Timer Interrupt Wakeup Function + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to enable the Timer interrupt wake-up function. + * @note To wake the system from Power-down mode, timer clock source must be ether LXT or LIRC. + */ +static __INLINE void TIMER_EnableWakeup(TIMER_T *timer) +{ + timer->TCSR |= TIMER_TCSR_WAKE_EN_Msk; +} + +/** + * @brief Disable Timer Wakeup Function + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to disable the Timer interrupt wake-up function. + */ +static __INLINE void TIMER_DisableWakeup(TIMER_T *timer) +{ + timer->TCSR &= ~TIMER_TCSR_WAKE_EN_Msk; +} + +/** + * @brief Enable Capture Pin De-bounce + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to enable the capture pin detection de-bounce function. + */ +static __INLINE void TIMER_EnableCaptureDebounce(TIMER_T *timer) +{ + timer->TEXCON |= TIMER_TEXCON_TEXDB_Msk; +} + +/** + * @brief Disable Capture Pin De-bounce + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to disable the capture pin detection de-bounce function. + */ +static __INLINE void TIMER_DisableCaptureDebounce(TIMER_T *timer) +{ + timer->TEXCON &= ~TIMER_TEXCON_TEXDB_Msk; +} + +/** + * @brief Enable Counter Pin De-bounce + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to enable the counter pin detection de-bounce function. + */ +static __INLINE void TIMER_EnableEventCounterDebounce(TIMER_T *timer) +{ + timer->TEXCON |= TIMER_TEXCON_TCDB_Msk; +} + +/** + * @brief Disable Counter Pin De-bounce + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to disable the counter pin detection de-bounce function. + */ +static __INLINE void TIMER_DisableEventCounterDebounce(TIMER_T *timer) +{ + timer->TEXCON &= ~TIMER_TEXCON_TCDB_Msk; +} + +/** + * @brief Enable Timer Time-out Interrupt + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to enable the Timer time-out interrupt function. + */ +static __INLINE void TIMER_EnableInt(TIMER_T *timer) +{ + timer->TCSR |= TIMER_TCSR_IE_Msk; +} + +/** + * @brief Disable Timer Time-out Interrupt + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to disable the Timer time-out interrupt function. + */ +static __INLINE void TIMER_DisableInt(TIMER_T *timer) +{ + timer->TCSR &= ~TIMER_TCSR_IE_Msk; +} + +/** + * @brief Enable Capture Interrupt + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to enable the Timer capture trigger interrupt function. + */ +static __INLINE void TIMER_EnableCaptureInt(TIMER_T *timer) +{ + timer->TEXCON |= TIMER_TEXCON_TEXIEN_Msk; +} + +/** + * @brief Disable Capture Interrupt + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to disable the Timer capture trigger interrupt function. + */ +static __INLINE void TIMER_DisableCaptureInt(TIMER_T *timer) +{ + timer->TEXCON &= ~TIMER_TEXCON_TEXIEN_Msk; +} + +/** + * @brief Get Timer Time-out Interrupt Flag + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @retval 0 Timer time-out interrupt did not occur + * @retval 1 Timer time-out interrupt occurred + * + * @details This function indicates Timer time-out interrupt occurred or not. + */ +static __INLINE uint32_t TIMER_GetIntFlag(TIMER_T *timer) +{ + return (timer->TISR & TIMER_TISR_TIF_Msk ? 1 : 0); +} + +/** + * @brief Clear Timer time-out Interrupt Flag + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function clears Timer time-out interrupt flag. + */ +static __INLINE void TIMER_ClearIntFlag(TIMER_T *timer) +{ + timer->TISR = TIMER_TISR_TIF_Msk; +} + +/** + * @brief Get Timer Capture Interrupt Flag + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @retval 0 Timer capture interrupt did not occur + * @retval 1 Timer capture interrupt occurred + * + * @details This function indicates Timer capture interrupt occurred or not. + */ +static __INLINE uint32_t TIMER_GetCaptureIntFlag(TIMER_T *timer) +{ + return timer->TEXISR; +} + +/** + * @brief Clear Timer capture Interrupt Flag + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function clears Timer capture interrupt flag. + */ +static __INLINE void TIMER_ClearCaptureIntFlag(TIMER_T *timer) +{ + timer->TEXISR = TIMER_TEXISR_TEXIF_Msk; +} + +/** + * @brief Get Timer Wakeup Flag + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @retval 0 Timer did not wake up system + * @retval 1 Timer Timer wake up system + * + * @details This function indicates Timer has waked up system or not. + */ +static __INLINE uint32_t TIMER_GetWakeupFlag(TIMER_T *timer) +{ + return (timer->TISR & TIMER_TISR_TWF_Msk ? 1 : 0); +} + +/** + * @brief Clear Timer Wake-up Flag + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function clears the Timer wake-up system flag. + */ +static __INLINE void TIMER_ClearWakeupFlag(TIMER_T *timer) +{ + timer->TISR = TIMER_TISR_TWF_Msk; +} + +/** + * @brief Get Capture value + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return Capture Value + * + * @details This function reports the current timer capture data value. + */ +static __INLINE uint32_t TIMER_GetCaptureData(TIMER_T *timer) +{ + return timer->TCAP; +} + +/** + * @brief Get Counter value + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return Counter Value + * + * @details This function reports the current 24-bit timer counter value. + */ +static __INLINE uint32_t TIMER_GetCounter(TIMER_T *timer) +{ + return timer->TDR; +} + +uint32_t TIMER_Open(TIMER_T *timer, uint32_t u32Mode, uint32_t u32Freq); +void TIMER_Close(TIMER_T *timer); +void TIMER_Delay(TIMER_T *timer, uint32_t u32Usec); +void TIMER_EnableCapture(TIMER_T *timer, uint32_t u32CapMode, uint32_t u32Edge); +void TIMER_DisableCapture(TIMER_T *timer); +void TIMER_EnableEventCounter(TIMER_T *timer, uint32_t u32Edge); +void TIMER_DisableEventCounter(TIMER_T *timer); +uint32_t TIMER_GetModuleClock(TIMER_T *timer); + +/*@}*/ /* end of group TIMER_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group TIMER_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif //__TIMER_H__ + +/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/uart.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/uart.h new file mode 100644 index 00000000..fb6a7f35 --- /dev/null +++ b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/uart.h @@ -0,0 +1,427 @@ +/**************************************************************************//** + * @file UART.h + * @version V3.0 + * $Revision: 15 $ + * $Date: 15/07/02 11:21a $ + * @brief NUC123 Series UART Interface Controller Driver Header File + * + * @note + * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. + * + ******************************************************************************/ +#ifndef __UART_H__ +#define __UART_H__ + + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup UART_Driver UART Driver + @{ +*/ + +/** @addtogroup UART_EXPORTED_CONSTANTS UART Exported Constants + @{ +*/ + +/*---------------------------------------------------------------------------------------------------------*/ +/* UART FIFO size constants definitions */ +/*---------------------------------------------------------------------------------------------------------*/ + +#define UART0_FIFO_SIZE 16 /*!< UART0 supports separated receive/transmit 16/16 bytes entry FIFO */ +#define UART1_FIFO_SIZE 16 /*!< UART1 supports separated receive/transmit 16/16 bytes entry FIFO */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* UA_FCR constants definitions */ +/*---------------------------------------------------------------------------------------------------------*/ + +#define UART_FCR_RFITL_1BYTE (0x0 << UART_FCR_RFITL_Pos) /*!< UA_FCR setting to set RX FIFO Trigger Level to 1 byte */ +#define UART_FCR_RFITL_4BYTES (0x1 << UART_FCR_RFITL_Pos) /*!< UA_FCR setting to set RX FIFO Trigger Level to 4 bytes */ +#define UART_FCR_RFITL_8BYTES (0x2 << UART_FCR_RFITL_Pos) /*!< UA_FCR setting to set RX FIFO Trigger Level to 8 bytes */ +#define UART_FCR_RFITL_14BYTES (0x3 << UART_FCR_RFITL_Pos) /*!< UA_FCR setting to set RX FIFO Trigger Level to 14 bytes */ + +#define UART_FCR_RTS_TRI_LEV_1BYTE (0x0 << UART_FCR_RTS_TRI_LEV_Pos) /*!< UA_FCR setting to set RTS Trigger Level to 1 byte */ +#define UART_FCR_RTS_TRI_LEV_4BYTES (0x1 << UART_FCR_RTS_TRI_LEV_Pos) /*!< UA_FCR setting to set RTS Trigger Level to 4 bytes */ +#define UART_FCR_RTS_TRI_LEV_8BYTES (0x2 << UART_FCR_RTS_TRI_LEV_Pos) /*!< UA_FCR setting to set RTS Trigger Level to 8 bytes */ +#define UART_FCR_RTS_TRI_LEV_14BYTES (0x3 << UART_FCR_RTS_TRI_LEV_Pos) /*!< UA_FCR setting to set RTS Trigger Level to 14 bytes */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* UA_LCR constants definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define UART_WORD_LEN_5 (0) /*!< UA_LCR setting to set UART word length to 5 bits */ +#define UART_WORD_LEN_6 (1) /*!< UA_LCR setting to set UART word length to 6 bits */ +#define UART_WORD_LEN_7 (2) /*!< UA_LCR setting to set UART word length to 7 bits */ +#define UART_WORD_LEN_8 (3) /*!< UA_LCR setting to set UART word length to 8 bits */ + +#define UART_PARITY_NONE (0x0 << UART_LCR_PBE_Pos) /*!< UA_LCR setting to set UART as no parity */ +#define UART_PARITY_ODD (0x1 << UART_LCR_PBE_Pos) /*!< UA_LCR setting to set UART as odd parity */ +#define UART_PARITY_EVEN (0x3 << UART_LCR_PBE_Pos) /*!< UA_LCR setting to set UART as even parity */ +#define UART_PARITY_MARK (0x5 << UART_LCR_PBE_Pos) /*!< UA_LCR setting to keep parity bit as '1' */ +#define UART_PARITY_SPACE (0x7 << UART_LCR_PBE_Pos) /*!< UA_LCR setting to keep parity bit as '0' */ + +#define UART_STOP_BIT_1 (0x0 << UART_LCR_NSB_Pos) /*!< UA_LCR setting for one stop bit */ +#define UART_STOP_BIT_1_5 (0x1 << UART_LCR_NSB_Pos) /*!< UA_LCR setting for 1.5 stop bit when 5-bit word length */ +#define UART_STOP_BIT_2 (0x1 << UART_LCR_NSB_Pos) /*!< UA_LCR setting for two stop bit when 6, 7, 8-bit word length */ + + +/*---------------------------------------------------------------------------------------------------------*/ +/* UART RTS LEVEL TRIGGER constants definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define UART_RTS_IS_LOW_LEV_ACTIVE (0x1 << UART_MCR_LEV_RTS_Pos) /*!< Set RTS is Low Level Active */ +#define UART_RTS_IS_HIGH_LEV_ACTIVE (0x0 << UART_MCR_LEV_RTS_Pos) /*!< Set RTS is High Level Active */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* UA_IRCR constants definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define UART_IRCR_TX_SELECT (0x1 << UART_IRCR_TX_SELECT_Pos) /*!< Set IrDA function Tx mode */ +#define UART_IRCR_RX_SELECT (0x0 << UART_IRCR_TX_SELECT_Pos) /*!< Set IrDA function Rx mode */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* UA_FUNC_SEL constants definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define UART_FUNC_SEL_UART (0x0 << UART_FUN_SEL_FUN_SEL_Pos) /*!< UA_FUNC_SEL setting to set UART Function (Default) */ +#define UART_FUNC_SEL_IrDA (0x2 << UART_FUN_SEL_FUN_SEL_Pos) /*!< UA_FUNC_SEL setting to set IrDA Function */ +#define UART_FUNC_SEL_RS485 (0x3 << UART_FUN_SEL_FUN_SEL_Pos) /*!< UA_FUNC_SEL setting to set RS485 Function */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* UART BAUDRATE MODE constants definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define UART_BAUD_MODE0 (0) /*!< Set UART Baudrate Mode is Mode0 */ +#define UART_BAUD_MODE2 (UART_BAUD_DIV_X_EN_Msk | UART_BAUD_DIV_X_ONE_Msk) /*!< Set UART Baudrate Mode is Mode2 */ + + +/*@}*/ /* end of group UART_EXPORTED_CONSTANTS */ + + +/** @addtogroup UART_EXPORTED_FUNCTIONS UART Exported Functions + @{ +*/ + + +/** + * @brief Calculate UART baudrate mode0 divider + * + * @param[in] u32SrcFreq UART clock frequency + * @param[in] u32BaudRate Baudrate of UART module + * + * @return UART baudrate mode0 divider + * + * @details This macro calculate UART baudrate mode0 divider. + */ +#define UART_BAUD_MODE0_DIVIDER(u32SrcFreq, u32BaudRate) ((((u32SrcFreq) + ((u32BaudRate)*8)) / (u32BaudRate) >> 4)-2) + +/** + * @brief Calculate UART baudrate mode2 divider + * + * @param[in] u32SrcFreq UART clock frequency + * @param[in] u32BaudRate Baudrate of UART module + * + * @return UART baudrate mode2 divider + * + * @details This macro calculate UART baudrate mode2 divider. + */ +#define UART_BAUD_MODE2_DIVIDER(u32SrcFreq, u32BaudRate) ((((u32SrcFreq) + ((u32BaudRate)/2)) / (u32BaudRate))-2) + + +/** + * @brief Write data + * + * @param[in] uart The pointer of the specified UART module + * @param[in] u8Data Data byte to transmit + * + * @return None + * + * @details This macro write Data to Tx data register. + */ +#define UART_WRITE(uart, u8Data) ((uart)->THR = (u8Data)) + +/** + * @brief Read data + * + * @param[in] uart The pointer of the specified UART module + * + * @return The oldest data byte in RX FIFO + * + * @details This macro read Rx data register. + */ +#define UART_READ(uart) ((uart)->RBR) + + +/** + * @brief Get Tx empty + * + * @param[in] uart The pointer of the specified UART module + * + * @retval 0 Tx FIFO is not empty + * @retval >=1 Tx FIFO is empty + * + * @details This macro get Tx empty register value. + */ +#define UART_GET_TX_EMPTY(uart) ((uart)->FSR & UART_FSR_TX_EMPTY_Msk) + + +/** + * @brief Get Rx empty + * + * @param[in] uart The pointer of the specified UART module + * + * @retval 0 Rx FIFO is not empty + * @retval >=1 Rx FIFO is empty + * + * @details This macro get Rx empty register value. + */ +#define UART_GET_RX_EMPTY(uart) ((uart)->FSR & UART_FSR_RX_EMPTY_Msk) + +/** + * @brief Check specified uart port transmission is over. + * + * @param[in] uart The pointer of the specified UART module + * + * @retval 0 Transmission is not over. + * @retval 1 Transmission is over. + * + * @details This macro return if Tx FIFO is empty and specified uart port transmission is over nor not. + */ +#define UART_IS_TX_EMPTY(uart) (((uart)->FSR & UART_FSR_TE_FLAG_Msk) >> UART_FSR_TE_FLAG_Pos) + + +/** + * @brief Wait specified uart port transmission is over + * + * @param[in] uart The pointer of the specified UART module + * + * @return None + * + * @details This macro wait specified uart port transmission is over. + */ +#define UART_WAIT_TX_EMPTY(uart) while(!((((uart)->FSR) & UART_FSR_TE_FLAG_Msk) >> UART_FSR_TE_FLAG_Pos)) + +/** + * @brief Check RX is ready or not + * + * @param[in] uart The pointer of the specified UART module + * + * @retval 0 The number of bytes in the RX FIFO is less than the RFITL + * @retval 1 The number of bytes in the RX FIFO equals or larger than RFITL + * + * @details This macro check receive data available interrupt flag is set or not. + */ +#define UART_IS_RX_READY(uart) (((uart)->ISR & UART_ISR_RDA_IF_Msk)>>UART_ISR_RDA_IF_Pos) + + +/** + * @brief Check TX FIFO is full or not + * + * @param[in] uart The pointer of the specified UART module + * + * @retval 1 TX FIFO is full + * @retval 0 TX FIFO is not full + * + * @details This macro check TX FIFO is full or not. + */ +#define UART_IS_TX_FULL(uart) (((uart)->FSR & UART_FSR_TX_FULL_Msk)>>UART_FSR_TX_FULL_Pos) + +/** + * @brief Check RX FIFO is full or not + * + * @param[in] uart The pointer of the specified UART module + * + * @retval 1 RX FIFO is full + * @retval 0 RX FIFO is not full + * + * @details This macro check RX FIFO is full or not. + */ +#define UART_IS_RX_FULL(uart) (((uart)->FSR & UART_FSR_RX_FULL_Msk)>>UART_FSR_RX_FULL_Pos) + + +/** + * @brief Get Tx full register value + * + * @param[in] uart The pointer of the specified UART module + * + * @retval 0 Tx FIFO is not full. + * @retval >=1 Tx FIFO is full. + * + * @details This macro get Tx full register value. + */ +#define UART_GET_TX_FULL(uart) ((uart)->FSR & UART_FSR_TX_FULL_Msk) + + +/** + * @brief Get Rx full register value + * + * @param[in] uart The pointer of the specified UART module + * + * @retval 0 Rx FIFO is not full. + * @retval >=1 Rx FIFO is full. + * + * @details This macro get Rx full register value. + */ +#define UART_GET_RX_FULL(uart) ((uart)->FSR & UART_FSR_RX_FULL_Msk) + + +/** + * @brief Enable specified UART interrupt + * + * @param[in] uart The pointer of the specified UART module + * @param[in] u32eIntSel Interrupt type select + * - UART_IER_WAKE_EN_Msk : Wakeup interrupt + * - UART_IER_BUF_ERR_IEN_Msk : Buffer Error interrupt + * - UART_IER_TOUT_IEN_Msk : Rx time-out interrupt + * - UART_IER_MODEM_IEN_Msk : Modem interrupt + * - UART_IER_RLS_IEN_Msk : Rx Line status interrupt + * - UART_IER_THRE_IEN_Msk : Tx empty interrupt + * - UART_IER_RDA_IEN_Msk : Rx ready interrupt + * + * @return None + * + * @details This macro enable specified UART interrupt. + */ +#define UART_ENABLE_INT(uart, u32eIntSel) ((uart)->IER |= (u32eIntSel)) + + +/** + * @brief Disable specified UART interrupt + * + * @param[in] uart The pointer of the specified UART module + * @param[in] u32eIntSel Interrupt type select + * - UART_IER_WAKE_EN_Msk : Wakeup interrupt + * - UART_IER_BUF_ERR_IEN_Msk : Buffer Error interrupt + * - UART_IER_TOUT_IEN_Msk : Rx time-out interrupt + * - UART_IER_MODEM_IEN_Msk : Modem interrupt + * - UART_IER_RLS_IEN_Msk : Rx Line status interrupt + * - UART_IER_THRE_IEN_Msk : Tx empty interrupt + * - UART_IER_RDA_IEN_Msk : Rx ready interrupt + * @return None + * + * @details This macro enable specified UART interrupt. + */ +#define UART_DISABLE_INT(uart, u32eIntSel) ((uart)->IER &= ~ (u32eIntSel)) + + +/** + * @brief Get specified interrupt indicator status + * + * @param[in] uart The pointer of the specified UART module. + * @param[in] u32eIntTypeFlag Interrupt Type Flag, should be + * - UART_ISR_HW_BUF_ERR_INT_Msk : In DMA Mode, Buffer Error Interrupt Indicator + * - UART_ISR_HW_TOUT_INT_Msk : In DMA Mode, Rx Time-out Interrupt Indicator + * - UART_ISR_HW_MODEM_INT_Msk : In DMA Mode, MODEM Status Interrupt Indicator + * - UART_ISR_HW_RLS_INT_Msk : In DMA Mode, Rx Line Status Interrupt Indicator + * - UART_ISR_HW_BUF_ERR_IF_Msk : In DMA Mode, Buffer Error Interrupt Flag + * - UART_ISR_HW_TOUT_IF_Msk : In DMA Mode, Rx Time-out Interrupt Flag + * - UART_ISR_HW_MODEM_IF_Msk : In DMA Mode, MODEM Status Interrupt Flag + * - UART_ISR_HW_RLS_IF_Msk : In DMA Mode, Rx Line Status Interrupt Flag + * - UART_ISR_LIN_INT_Msk : LIN Bus Interrupt Indicator + * - UART_ISR_BUF_ERR_INT_Msk : Buffer Error Interrupt Indicator + * - UART_ISR_TOUT_INT_Msk : Rx Time-out Interrupt Indicator + * - UART_ISR_MODEM_INT_Msk : MODEM Status Interrupt Indicator + * - UART_ISR_RLS_INT_Msk : Rx Line Status Interrupt Indicator + * - UART_ISR_THRE_INT_Msk : Tx Empty Interrupt Indicator + * - UART_ISR_RDA_INT_Msk : Rx Ready Interrupt Indicator + * - UART_ISR_LIN_IF_Msk : LIN Bus Interrupt Flag + * - UART_ISR_BUF_ERR_IF_Msk : Buffer Error Interrupt Flag + * - UART_ISR_TOUT_IF_Msk : Rx Time-out Interrupt Flag + * - UART_ISR_MODEM_IF_Msk : MODEM Status Interrupt Flag + * - UART_ISR_RLS_IF_Msk : Rx Line Status Interrupt Flag + * - UART_ISR_THRE_IF_Msk : Tx Empty Interrupt Flag + * - UART_ISR_RDA_IF_Msk : Rx Ready Interrupt Flag + * + * @retval 0 The specified interrupt is not happened. + * 1 The specified interrupt is happened. + * + * @details This macro get specified interrupt flag or interrupt indicator status. + */ +#define UART_GET_INT_FLAG(uart,u32eIntTypeFlag) (((uart)->ISR & (u32eIntTypeFlag))?1:0) + + +/** + * @brief Set RTS pin to low + * + * @param[in] uart The pointer of the specified UART module + * + * @return None + * + * @details This macro set RTS pin to low. + */ +__STATIC_INLINE void UART_CLEAR_RTS(UART_T* uart) +{ + (uart)->MCR |= UART_MCR_LEV_RTS_Msk; + (uart)->MCR &= ~UART_MCR_RTS_Msk; +} + +/** + * @brief Set RTS pin to high + * + * @param[in] uart The pointer of the specified UART module + * @return None + * + * @details This macro set RTS pin to high. + */ +__STATIC_INLINE void UART_SET_RTS(UART_T* uart) +{ + (uart)->MCR |= UART_MCR_LEV_RTS_Msk | UART_MCR_RTS_Msk; +} + + +/** + * @brief Clear RS-485 Address Byte Detection Flag + * + * @param[in] uart The pointer of the specified UART module + * + * @return None + * + * @details This macro clear RS-485 address byte detection flag. + */ +#define UART_RS485_CLEAR_ADDR_FLAG(uart) ((uart)->FSR = UART_FSR_RS485_ADD_DETF_Msk) + + +/** + * @brief Get RS-485 Address Byte Detection Flag + * + * @param[in] uart The pointer of the specified UART module + * + * @retval 0 Receiver detects a data that is not an address bit. + * @retval 1 Receiver detects a data that is an address bit. + * + * @details This macro get RS-485 address byte detection flag. + */ +#define UART_RS485_GET_ADDR_FLAG(uart) (((uart)->FSR & UART_FSR_RS485_ADD_DETF_Msk) >> UART_FSR_RS485_ADD_DETF_Pos) + + +void UART_ClearIntFlag(UART_T* uart , uint32_t u32InterruptFlag); +void UART_Close(UART_T* uart); +void UART_DisableFlowCtrl(UART_T* uart); +void UART_DisableInt(UART_T* uart, uint32_t u32InterruptFlag); +void UART_EnableFlowCtrl(UART_T* uart); +void UART_EnableInt(UART_T* uart, uint32_t u32InterruptFlag); +void UART_Open(UART_T* uart, uint32_t u32baudrate); +uint32_t UART_Read(UART_T* uart, uint8_t *pu8RxBuf, uint32_t u32ReadBytes); +void UART_SetLine_Config(UART_T* uart, uint32_t u32baudrate, uint32_t u32data_width, uint32_t u32parity, uint32_t u32stop_bits); +void UART_SetTimeoutCnt(UART_T* uart, uint32_t u32TOC); +void UART_SelectIrDAMode(UART_T* uart, uint32_t u32Buadrate, uint32_t u32Direction); +void UART_SelectRS485Mode(UART_T* uart, uint32_t u32Mode, uint32_t u32Addr); +uint32_t UART_Write(UART_T* uart, uint8_t *pu8TxBuf, uint32_t u32WriteBytes); + + +/*@}*/ /* end of group UART_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group UART_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif //__UART_H__ + +/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ + diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/usbd.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/usbd.h new file mode 100644 index 00000000..1b5d0a88 --- /dev/null +++ b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/usbd.h @@ -0,0 +1,663 @@ +/**************************************************************************//** + * @file usbd.h + * @version V3.0 + * $Revision: 18 $ + * $Date: 15/09/03 11:15a $ + * @brief NUC123 series USB driver header file + * + * @note + * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. + * + ******************************************************************************/ + +#ifndef __USBD_H__ +#define __USBD_H__ + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup USBD_Driver USBD Driver + @{ +*/ + +/** @addtogroup USBD_EXPORTED_STRUCTS USBD Exported Structs + @{ +*/ + + +typedef struct s_usbd_info +{ + const uint8_t *gu8DevDesc; /*!< Pointer for USB Device Descriptor */ + const uint8_t *gu8ConfigDesc; /*!< Pointer for USB Configuration Descriptor */ + const uint8_t **gu8StringDesc; /*!< Pointer for USB String Descriptor pointers */ + const uint8_t **gu8HidReportDesc; /*!< Pointer for USB HID Report Descriptor */ + const uint32_t *gu32HidReportSize; /*!< Pointer for HID Report descriptor Size */ + const uint32_t *gu32ConfigHidDescIdx; /*!< Pointer for HID Descriptor start index */ + +} S_USBD_INFO_T; + +extern const S_USBD_INFO_T gsInfo; + +/*@}*/ /* end of group USBD_EXPORTED_STRUCTS */ + + + +/** @addtogroup USBD_EXPORTED_CONSTANTS USBD Exported Constants + @{ +*/ + +#define USBD_BUF_BASE (USBD_BASE+0x100) + + + +#define USBD_MAX_EP 8 + +#define EP0 0 /*!< Endpoint 0 */ +#define EP1 1 /*!< Endpoint 1 */ +#define EP2 2 /*!< Endpoint 2 */ +#define EP3 3 /*!< Endpoint 3 */ +#define EP4 4 /*!< Endpoint 4 */ +#define EP5 5 /*!< Endpoint 5 */ +#define EP6 6 /*!< Endpoint 6 */ +#define EP7 7 /*!< Endpoint 7 */ + + +/*! b, then return a. Otherwise, return b. + */ +#define Maximum(a,b) ((a)>(b) ? (a) : (b)) + + +/** + * @brief Compare two input numbers and return minimum one + * + * @param[in] a First number to be compared + * @param[in] b Second number to be compared + * + * @return Minimum value between a and b + * + * @details If a < b, then return a. Otherwise, return b. + */ +#define Minimum(a,b) ((a)<(b) ? (a) : (b)) + + +/** + * @brief Enable USB + * + * @param None + * + * @return None + * + * @details To set USB ATTR control register to enable USB and PHY. + * + */ +#define USBD_ENABLE_USB() ((uint32_t)(USBD->ATTR |= (USBD_USB_EN|USBD_PHY_EN))) + +/** + * @brief Disable USB + * + * @param None + * + * @return None + * + * @details To set USB ATTR control register to disable USB. + * + */ +#define USBD_DISABLE_USB() ((uint32_t)(USBD->ATTR &= ~USBD_USB_EN)) + +/** + * @brief Enable USB PHY + * + * @param None + * + * @return None + * + * @details To set USB ATTR control register to enable USB PHY. + * + */ +#define USBD_ENABLE_PHY() ((uint32_t)(USBD->ATTR |= USBD_PHY_EN)) + +/** + * @brief Disable USB PHY + * + * @param None + * + * @return None + * + * @details To set USB ATTR control register to disable USB PHY. + * + */ +#define USBD_DISABLE_PHY() ((uint32_t)(USBD->ATTR &= ~USBD_PHY_EN)) + +/** + * @brief Enable SE0. Force USB PHY transceiver to drive SE0. + * + * @param None + * + * @return None + * + * @details Set DRVSE0 bit of USB_DRVSE0 register to enable software-disconnect function. Force USB PHY transceiver to drive SE0 to bus. + * + */ +#define USBD_SET_SE0() ((uint32_t)(USBD->DRVSE0 |= USBD_DRVSE0)) + +/** + * @brief Disable SE0 + * + * @param None + * + * @return None + * + * @details Clear DRVSE0 bit of USB_DRVSE0 register to disable software-disconnect function. + * + */ +#define USBD_CLR_SE0() ((uint32_t)(USBD->DRVSE0 &= ~USBD_DRVSE0)) + +/** + * @brief Set USB device address + * + * @param[in] addr The USB device address. + * + * @return None + * + * @details Write USB device address to USB_FADDR register. + * + */ +#define USBD_SET_ADDR(addr) (USBD->FADDR = (addr)) + +/** + * @brief Get USB device address + * + * @param None + * + * @return USB device address + * + * @details Read USB_FADDR register to get USB device address. + * + */ +#define USBD_GET_ADDR() ((uint32_t)(USBD->FADDR)) + +/** + * @brief Enable USB interrupt function + * + * @param[in] intr The combination of the specified interrupt enable bits. + * Each bit corresponds to a interrupt enable bit. + * This parameter decides which interrupts will be enabled. + * (USBD_INT_WAKEUP, USBD_INT_FLDET, USBD_INT_USB, USBD_INT_BUS) + * + * @return None + * + * @details Enable USB related interrupt functions specified by intr parameter. + * + */ +#define USBD_ENABLE_INT(intr) (USBD->INTEN |= (intr)) + +/** + * @brief Get interrupt status + * + * @param None + * + * @return The value of USB_INTSTS register + * + * @details Return all interrupt flags of USB_INTSTS register. + * + */ +#define USBD_GET_INT_FLAG() ((uint32_t)(USBD->INTSTS)) + +/** + * @brief Clear USB interrupt flag + * + * @param[in] flag The combination of the specified interrupt flags. + * Each bit corresponds to a interrupt source. + * This parameter decides which interrupt flags will be cleared. + * (USBD_INTSTS_WAKEUP, USBD_INTSTS_FLDET, USBD_INTSTS_BUS, USBD_INTSTS_USB) + * + * @return None + * + * @details Clear USB related interrupt flags specified by flag parameter. + * + */ +#define USBD_CLR_INT_FLAG(flag) (USBD->INTSTS = (flag)) + +/** + * @brief Get endpoint status + * + * @param None + * + * @return The value of USB_EPSTS register. + * + * @details Return all endpoint status. + * + */ +#define USBD_GET_EP_FLAG() ((uint32_t)(USBD->EPSTS)) + +/** + * @brief Get USB bus state + * + * @param None + * + * @return The value of USB_ATTR[3:0]. + * Bit 0 indicates USB bus reset status. + * Bit 1 indicates USB bus suspend status. + * Bit 2 indicates USB bus resume status. + * Bit 3 indicates USB bus time-out status. + * + * @details Return USB_ATTR[3:0] for USB bus events. + * + */ +#define USBD_GET_BUS_STATE() ((uint32_t)(USBD->ATTR & 0xf)) + +/** + * @brief Check cable connection state + * + * @param None + * + * @retval 0 USB cable is not attached. + * @retval 1 USB cable is attached. + * + * @details Check the connection state by FLDET bit of USB_FLDET register. + * + */ +#define USBD_IS_ATTACHED() ((uint32_t)(USBD->FLDET & USBD_FLDET_FLDET_Msk)) + +/** + * @brief Stop USB transaction of the specified endpoint ID + * + * @param[in] ep The USB endpoint ID. NUC123 supports 8 hardware endpoint ID. This parameter could be 0 ~ 7. + * + * @return None + * + * @details Write 1 to CLRRDY bit of USB_CFGPx register to stop USB transaction of the specified endpoint ID. + * + */ +#define USBD_STOP_TRANSACTION(ep) (*((__IO uint32_t *) ((uint32_t)&USBD->EP[0].CFGP + (uint32_t)((ep) << 4))) |= USBD_CFGP_CLRRDY_Msk) + +/** + * @brief Set USB DATA1 PID for the specified endpoint ID + * + * @param[in] ep The USB endpoint ID. NUC123 supports 8 hardware endpoint ID. This parameter could be 0 ~ 7. + * + * @return None + * + * @details Set DSQ_SYNC bit of USB_CFGx register to specify the DATA1 PID for the following IN token transaction. + * Base on this setting, hardware will toggle PID between DATA0 and DATA1 automatically for IN token transactions. + * + */ +#define USBD_SET_DATA1(ep) (*((__IO uint32_t *) ((uint32_t)&USBD->EP[0].CFG + (uint32_t)((ep) << 4))) |= USBD_CFG_DSQ_SYNC_Msk) + +/** + * @brief Set USB DATA0 PID for the specified endpoint ID + * + * @param[in] ep The USB endpoint ID. NUC123 supports 8 hardware endpoint ID. This parameter could be 0 ~ 7. + * + * @return None + * + * @details Clear DSQ_SYNC bit of USB_CFGx register to specify the DATA0 PID for the following IN token transaction. + * Base on this setting, hardware will toggle PID between DATA0 and DATA1 automatically for IN token transactions. + * + */ +#define USBD_SET_DATA0(ep) (*((__IO uint32_t *) ((uint32_t)&USBD->EP[0].CFG + (uint32_t)((ep) << 4))) &= (~USBD_CFG_DSQ_SYNC_Msk)) + +/** + * @brief Set USB payload size (IN data) + * + * @param[in] ep The USB endpoint ID. NUC123 supports 8 hardware endpoint ID. This parameter could be 0 ~ 7. + * + * @param[in] size The transfer length. + * + * @return None + * + * @details This macro will write the transfer length to USB_MXPLDx register for IN data transaction. + * + */ +#define USBD_SET_PAYLOAD_LEN(ep, size) (*((__IO uint32_t *) ((uint32_t)&USBD->EP[0].MXPLD + (uint32_t)((ep) << 4))) = (size)) + +/** + * @brief Get USB payload size (OUT data) + * + * @param[in] ep The USB endpoint ID. NUC123 supports 8 hardware endpoint ID. This parameter could be 0 ~ 7. + * + * @return The value of USB_MXPLDx register. + * + * @details Get the data length of OUT data transaction by reading USB_MXPLDx register. + * + */ +#define USBD_GET_PAYLOAD_LEN(ep) ((uint32_t)*((__IO uint32_t *) ((uint32_t)&USBD->EP[0].MXPLD + (uint32_t)((ep) << 4)))) + +/** + * @brief Configure endpoint + * + * @param[in] ep The USB endpoint ID. NUC123 supports 8 hardware endpoint ID. This parameter could be 0 ~ 7. + * + * @param[in] config The USB configuration. + * + * @return None + * + * @details This macro will write config parameter to USB_CFGx register of specified endpoint ID. + * + */ +#define USBD_CONFIG_EP(ep, config) (*((__IO uint32_t *) ((uint32_t)&USBD->EP[0].CFG + (uint32_t)((ep) << 4))) = (config)) + +/** + * @brief Set USB endpoint buffer + * + * @param[in] ep The USB endpoint ID. NUC123 supports 8 hardware endpoint ID. This parameter could be 0 ~ 7. + * + * @param[in] offset The SRAM offset. + * + * @return None + * + * @details This macro will set the SRAM offset for the specified endpoint ID. + * + */ +#define USBD_SET_EP_BUF_ADDR(ep, offset) (*((__IO uint32_t *) ((uint32_t)&USBD->EP[0].BUFSEG + (uint32_t)((ep) << 4))) = (offset)) + +/** + * @brief Get the offset of the specified USB endpoint buffer + * + * @param[in] ep The USB endpoint ID. NUC123 supports 8 hardware endpoint ID. This parameter could be 0 ~ 7. + * + * @return The offset of the specified endpoint buffer. + * + * @details This macro will return the SRAM offset of the specified endpoint ID. + * + */ +#define USBD_GET_EP_BUF_ADDR(ep) ((uint32_t)*((__IO uint32_t *) ((uint32_t)&USBD->EP[0].BUFSEG + (uint32_t)((ep) << 4)))) + +/** + * @brief Set USB endpoint stall state + * + * @param[in] ep The USB endpoint ID. NUC123 supports 8 hardware endpoint ID. This parameter could be 0 ~ 7. + * + * @return None + * + * @details Set USB endpoint stall state for the specified endpoint ID. Endpoint will respond STALL token automatically. + * + */ +#define USBD_SET_EP_STALL(ep) (*((__IO uint32_t *) ((uint32_t)&USBD->EP[0].CFGP + (uint32_t)((ep) << 4))) |= USBD_CFGP_SSTALL_Msk) + +/** + * @brief Clear USB endpoint stall state + * + * @param[in] ep The USB endpoint ID. NUC123 supports 8 hardware endpoint ID. This parameter could be 0 ~ 7. + * + * @return None + * + * @details Clear USB endpoint stall state for the specified endpoint ID. Endpoint will respond ACK/NAK token. + */ +#define USBD_CLR_EP_STALL(ep) (*((__IO uint32_t *) ((uint32_t)&USBD->EP[0].CFGP + (uint32_t)((ep) << 4))) &= ~USBD_CFGP_SSTALL_Msk) + +/** + * @brief Get USB endpoint stall state + * + * @param[in] ep The USB endpoint ID. NUC123 supports 8 hardware endpoint ID. This parameter could be 0 ~ 7. + * + * @retval 0 USB endpoint is not stalled. + * @retval Others USB endpoint is stalled. + * + * @details Get USB endpoint stall state of the specified endpoint ID. + * + */ +#define USBD_GET_EP_STALL(ep) (*((__IO uint32_t *) ((uint32_t)&USBD->EP[0].CFGP + (uint32_t)((ep) << 4))) & USBD_CFGP_SSTALL_Msk) + +/** + * @brief To support byte access between USB SRAM and system SRAM + * + * @param[in] dest Destination pointer. + * + * @param[in] src Source pointer. + * + * @param[in] size Byte count. + * + * @return None + * + * @details This function will copy the number of data specified by size and src parameters to the address specified by dest parameter. + * + */ +static __INLINE void USBD_MemCopy(uint8_t *dest, uint8_t *src, int32_t size) +{ + while(size--) *dest++ = *src++; +} + + +/** + * @brief Set USB endpoint stall state + * + * @param[in] epnum USB endpoint number + * + * @return None + * + * @details Set USB endpoint stall state. Endpoint will respond STALL token automatically. + * + */ +static __INLINE void USBD_SetStall(uint8_t epnum) +{ + uint32_t u32CfgAddr; + uint32_t u32Cfg; + int i; + + for(i = 0; i < USBD_MAX_EP; i++) + { + u32CfgAddr = (uint32_t)(i << 4) + (uint32_t)&USBD->EP[0].CFG; /* USBD_CFG0 */ + u32Cfg = *((__IO uint32_t *)(u32CfgAddr)); + + if((u32Cfg & 0xf) == epnum) + { + u32CfgAddr = (uint32_t)(i << 4) + (uint32_t)&USBD->EP[0].CFGP; /* USBD_CFGP0 */ + u32Cfg = *((__IO uint32_t *)(u32CfgAddr)); + + *((__IO uint32_t *)(u32CfgAddr)) = (u32Cfg | USBD_CFGP_SSTALL); + break; + } + } +} + +/** + * @brief Clear USB endpoint stall state + * + * @param[in] epnum USB endpoint number + * + * @return None + * + * @details Clear USB endpoint stall state. Endpoint will respond ACK/NAK token. + */ +static __INLINE void USBD_ClearStall(uint8_t epnum) +{ + uint32_t u32CfgAddr; + uint32_t u32Cfg; + int i; + + for(i = 0; i < USBD_MAX_EP; i++) + { + u32CfgAddr = (uint32_t)(i << 4) + (uint32_t)&USBD->EP[0].CFG; /* USBD_CFG0 */ + u32Cfg = *((__IO uint32_t *)(u32CfgAddr)); + + if((u32Cfg & 0xf) == epnum) + { + u32CfgAddr = (uint32_t)(i << 4) + (uint32_t)&USBD->EP[0].CFGP; /* USBD_CFGP0 */ + u32Cfg = *((__IO uint32_t *)(u32CfgAddr)); + + *((__IO uint32_t *)(u32CfgAddr)) = (u32Cfg & ~USBD_CFGP_SSTALL); + break; + } + } +} + +/** + * @brief Get USB endpoint stall state + * + * @param[in] epnum USB endpoint number + * + * @retval 0 USB endpoint is not stalled. + * @retval Others USB endpoint is stalled. + * + * @details Get USB endpoint stall state. + * + */ +static __INLINE uint32_t USBD_GetStall(uint8_t epnum) +{ + uint32_t u32CfgAddr; + uint32_t u32Cfg; + int i; + + for(i = 0; i < USBD_MAX_EP; i++) + { + u32CfgAddr = (uint32_t)(i << 4) + (uint32_t)&USBD->EP[0].CFG; /* USBD_CFG0 */ + u32Cfg = *((__IO uint32_t *)(u32CfgAddr)); + + if((u32Cfg & 0xf) == epnum) + { + u32CfgAddr = (uint32_t)(i << 4) + (uint32_t)&USBD->EP[0].CFGP; /* USBD_CFGP0 */ + break; + } + } + + return ((*((__IO uint32_t *)(u32CfgAddr))) & USBD_CFGP_SSTALL); +} + + +extern volatile uint8_t g_usbd_RemoteWakeupEn; + +typedef void (*VENDOR_REQ)(void); /*!< Functional pointer type declaration for Vendor class */ +typedef void (*CLASS_REQ)(void); /*!< Functional pointer type declaration for USB class request callback handler */ +typedef void (*SET_INTERFACE_REQ)(void); /*!< Functional pointer type declaration for USB set interface request callback handler */ +typedef void (*SET_CONFIG_CB)(void); /*!< Functional pointer type declaration for USB set configuration request callback handler */ + +/*--------------------------------------------------------------------*/ +void USBD_Open(const S_USBD_INFO_T *param, CLASS_REQ pfnClassReq, SET_INTERFACE_REQ pfnSetInterface); +void USBD_Start(void); +void USBD_GetSetupPacket(uint8_t *buf); +void USBD_ProcessSetupPacket(void); +void USBD_StandardRequest(void); +void USBD_PrepareCtrlIn(uint8_t *pu8Buf, uint32_t u32Size); +void USBD_CtrlIn(void); +void USBD_PrepareCtrlOut(uint8_t *pu8Buf, uint32_t u32Size); +void USBD_CtrlOut(void); +void USBD_SwReset(void); +void USBD_SetVendorRequest(VENDOR_REQ pfnVendorReq); +void USBD_SetConfigCallback(SET_CONFIG_CB pfnSetConfigCallback); +void USBD_LockEpStall(uint32_t u32EpBitmap); + +/*@}*/ /* end of group USBD_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group USBD_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + + +#endif //__USBD_H__ + +/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/wdt.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/wdt.h new file mode 100644 index 00000000..a7e04a81 --- /dev/null +++ b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/wdt.h @@ -0,0 +1,200 @@ +/**************************************************************************//** + * @file wdt.h + * @version V3.00 + * $Revision: 3 $ + * $Date: 15/07/02 11:21a $ + * @brief NUC123 series WDT driver header file + * + * @note + * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __WDT_H__ +#define __WDT_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup WDT_Driver WDT Driver + @{ +*/ + +/** @addtogroup WDT_EXPORTED_CONSTANTS WDT Exported Constants + @{ +*/ +/*---------------------------------------------------------------------------------------------------------*/ +/* WTCR Constants Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define WDT_TIMEOUT_2POW4 (0UL << WDT_WTCR_WTIS_Pos) /*!< Setting WDT time-out interval to 2^4 * WDT clocks */ +#define WDT_TIMEOUT_2POW6 (1UL << WDT_WTCR_WTIS_Pos) /*!< Setting WDT time-out interval to 2^6 * WDT clocks */ +#define WDT_TIMEOUT_2POW8 (2UL << WDT_WTCR_WTIS_Pos) /*!< Setting WDT time-out interval to 2^8 * WDT clocks */ +#define WDT_TIMEOUT_2POW10 (3UL << WDT_WTCR_WTIS_Pos) /*!< Setting WDT time-out interval to 2^10 * WDT clocks */ +#define WDT_TIMEOUT_2POW12 (4UL << WDT_WTCR_WTIS_Pos) /*!< Setting WDT time-out interval to 2^12 * WDT clocks */ +#define WDT_TIMEOUT_2POW14 (5UL << WDT_WTCR_WTIS_Pos) /*!< Setting WDT time-out interval to 2^14 * WDT clocks */ +#define WDT_TIMEOUT_2POW16 (6UL << WDT_WTCR_WTIS_Pos) /*!< Setting WDT time-out interval to 2^16 * WDT clocks */ +#define WDT_TIMEOUT_2POW18 (7UL << WDT_WTCR_WTIS_Pos) /*!< Setting WDT time-out interval to 2^18 * WDT clocks */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* WTCRALT Constants Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define WDT_RESET_DELAY_1026CLK (0UL << WDT_WTCRALT_WTRDSEL_Pos) /*!< Setting WDT reset delay period to 1026 * WDT clocks */ +#define WDT_RESET_DELAY_130CLK (1UL << WDT_WTCRALT_WTRDSEL_Pos) /*!< Setting WDT reset delay period to 130 * WDT clocks */ +#define WDT_RESET_DELAY_18CLK (2UL << WDT_WTCRALT_WTRDSEL_Pos) /*!< Setting WDT reset delay period to 18 * WDT clocks */ +#define WDT_RESET_DELAY_3CLK (3UL << WDT_WTCRALT_WTRDSEL_Pos) /*!< Setting WDT reset delay period to 3 * WDT clocks */ + +/*@}*/ /* end of group WDT_EXPORTED_CONSTANTS */ + + +/** @addtogroup WDT_EXPORTED_FUNCTIONS WDT Exported Functions + @{ +*/ + +/** + * @brief Clear WDT Reset System Flag + * + * @param None + * + * @return None + * + * @details This macro clear WDT time-out reset system flag. + */ +#define WDT_CLEAR_RESET_FLAG() (WDT->WTCR = (WDT->WTCR & ~(WDT_WTCR_WTIF_Msk | WDT_WTCR_WTWKF_Msk)) | WDT_WTCR_WTRF_Msk) + +/** + * @brief Clear WDT Time-out Interrupt Flag + * + * @param None + * + * @return None + * + * @details This macro clear WDT time-out interrupt flag. + */ +#define WDT_CLEAR_TIMEOUT_INT_FLAG() (WDT->WTCR = (WDT->WTCR & ~(WDT_WTCR_WTRF_Msk | WDT_WTCR_WTWKF_Msk)) | WDT_WTCR_WTIF_Msk) + +/** + * @brief Clear WDT Wake-up Flag + * + * @param None + * + * @return None + * + * @details This macro clear WDT time-out wake-up system flag. + */ +#define WDT_CLEAR_TIMEOUT_WAKEUP_FLAG() (WDT->WTCR = (WDT->WTCR & ~(WDT_WTCR_WTRF_Msk | WDT_WTCR_WTIF_Msk)) | WDT_WTCR_WTWKF_Msk) + +/** + * @brief Get WDT Time-out Reset Flag + * + * @param None + * + * @retval 0 WDT did not cause system reset + * @retval 1 WDT caused system reset + * + * @details This macro indicate WDT time-out to reset system or not. + */ +#define WDT_GET_RESET_FLAG() ((WDT->WTCR & WDT_WTCR_WTRF_Msk)? 1 : 0) + +/** + * @brief Get WDT Time-out Interrupt Flag + * + * @param None + * + * @retval 0 WDT time-out interrupt did not occur + * @retval 1 WDT time-out interrupt occurred + * + * @details This macro indicate WDT time-out interrupt occurred or not. + */ +#define WDT_GET_TIMEOUT_INT_FLAG() ((WDT->WTCR & WDT_WTCR_WTIF_Msk)? 1 : 0) + +/** + * @brief Get WDT Time-out Wake-up Flag + * + * @param None + * + * @retval 0 WDT did not wake up system + * @retval 1 WDT waked up system + * + * @details This macro indicate WDT time-out waked system up or not + */ +#define WDT_GET_TIMEOUT_WAKEUP_FLAG() ((WDT->WTCR & WDT_WTCR_WTWKF_Msk)? 1 : 0) + +/** + * @brief Reset WDT Counter + * + * @param None + * + * @return None + * + * @details This macro is used to reset 18-bit WDT counter. + * @note If WDT is activated and enabled to reset system, user must reset WDT counter \n + * before WDT time-out plus reset delay reached. Or WDT generate a reset signal. + */ +#define WDT_RESET_COUNTER() (WDT->WTCR = (WDT->WTCR & ~(WDT_WTCR_WTIF_Msk | WDT_WTCR_WTWKF_Msk | WDT_WTCR_WTRF_Msk)) | WDT_WTCR_WTR_Msk) + +/** + * @brief Stop WDT Counting + * + * @param None + * + * @return None + * + * @details This function stops WDT counting and disable WDT module. + */ +static __INLINE void WDT_Close(void) +{ + WDT->WTCR = 0; + return; +} + +/** + * @brief Enable WDT Time-out Interrupt + * + * @param None + * + * @return None + * + * @details This function enable the WDT time-out interrupt. + */ +static __INLINE void WDT_EnableInt(void) +{ + WDT->WTCR |= WDT_WTCR_WTIE_Msk; + return; +} + +/** + * @brief Disable WDT Time-out Interrupt + * + * @param None + * + * @return None + * + * @details This function disables the WDT time-out interrupt. + */ +static __INLINE void WDT_DisableInt(void) +{ + // Do not touch write 1 clear bits + WDT->WTCR &= ~(WDT_WTCR_WTIE_Msk | WDT_WTCR_WTRF_Msk | WDT_WTCR_WTIF_Msk | WDT_WTCR_WTWKF_Msk); + return; +} + +void WDT_Open(uint32_t u32TimeoutInterval, uint32_t u32ResetDelay, uint32_t u32EnableReset, uint32_t u32EnableWakeup); + +/*@}*/ /* end of group WDT_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group WDT_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif //__WDT_H__ + +/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/wwdt.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/wwdt.h new file mode 100644 index 00000000..7ef7814e --- /dev/null +++ b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/wwdt.h @@ -0,0 +1,144 @@ +/**************************************************************************//** + * @file wwdt.h + * @version V3.00 + * $Revision: 3 $ + * $Date: 15/07/02 11:21a $ + * @brief WWDT driver header file + * + * @note + * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __WWDT_H__ +#define __WWDT_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup WWDT_Driver WWDT Driver + @{ +*/ + +/** @addtogroup WWDT_EXPORTED_CONSTANTS WWDT Exported Constants + @{ +*/ +/*---------------------------------------------------------------------------------------------------------*/ +/* WWDTCR Constants Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define WWDT_PRESCALER_1 (0 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 1 * (64*WWDT_CLK) */ +#define WWDT_PRESCALER_2 (1 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 2 * (64*WWDT_CLK) */ +#define WWDT_PRESCALER_4 (2 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 4 * (64*WWDT_CLK) */ +#define WWDT_PRESCALER_8 (3 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 8 * (64*WWDT_CLK) */ +#define WWDT_PRESCALER_16 (4 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 16 * (64*WWDT_CLK) */ +#define WWDT_PRESCALER_32 (5 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 32 * (64*WWDT_CLK) */ +#define WWDT_PRESCALER_64 (6 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 64 * (64*WWDT_CLK) */ +#define WWDT_PRESCALER_128 (7 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 128 * (64*WWDT_CLK) */ +#define WWDT_PRESCALER_192 (8 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 192 * (64*WWDT_CLK) */ +#define WWDT_PRESCALER_256 (9 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 256 * (64*WWDT_CLK) */ +#define WWDT_PRESCALER_384 (10 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 384 * (64*WWDT_CLK) */ +#define WWDT_PRESCALER_512 (11 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 512 * (64*WWDT_CLK) */ +#define WWDT_PRESCALER_768 (12 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 768 * (64*WWDT_CLK) */ +#define WWDT_PRESCALER_1024 (13 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 1024 * (64*WWDT_CLK) */ +#define WWDT_PRESCALER_1536 (14 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 1536 * (64*WWDT_CLK) */ +#define WWDT_PRESCALER_2048 (15 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 2048 * (64*WWDT_CLK) */ + +#define WWDT_RELOAD_WORD (0x00005AA5) /*!< Fill this value to WWDTRLD register to reload WWDT counter */ + +/*@}*/ /* end of group WWDT_EXPORTED_CONSTANTS */ + + +/** @addtogroup WWDT_EXPORTED_FUNCTIONS WWDT Exported Functions + @{ +*/ + +/** + * @brief Clear WWDT Reset System Flag + * + * @param None + * + * @return None + * + * @details This macro is used to clear WWDT counter time-out reset system flag. + */ +#define WWDT_CLEAR_RESET_FLAG() (WWDT->WWDTSR = WWDT_WWDTSR_WWDTRF_Msk) + +/** + * @brief Clear WWDT Compared Match Interrupt Flag + * + * @param None + * + * @return None + * + * @details This macro is used to clear WWDT counter compare match interrupt flag. + */ +#define WWDT_CLEAR_INT_FLAG() (WWDT->WWDTSR = WWDT_WWDTSR_WWDTIF_Msk) + +/** + * @brief Get WWDT Reset Flag + * + * @param None + * + * @retval 0 WWDT did not cause system reset + * @retval 1 WWDT counter time-out caused system reset + * + * @details This macro is used to indicate WWDT counter time-out reset system flag. + */ +#define WWDT_GET_RESET_FLAG() ((WWDT->WWDTSR & WWDT_WWDTSR_WWDTRF_Msk)? 1:0) + +/** + * @brief Get WWDT Compared Match Interrupt Flag + * + * @param None + * + * @retval 0 WWDT counter compare match interrupt did not occur + * @retval 1 WWDT counter compare match interrupt occurred + * + * @details This macro is used to indicate WWDT counter compare match interrupt occurred or not. + */ +#define WWDT_GET_INT_FLAG() ((WWDT->WWDTSR & WWDT_WWDTSR_WWDTIF_Msk)? 1:0) + +/** + * @brief Get WWDT Counter value + * + * @param None + * + * @return WWDT Counter Value + * + * @details This macro to reflects the current WWDT counter value. + */ +#define WWDT_GET_COUNTER() (WWDT->WWDTCVR) + +/** + * @brief Reload WWDT Counter + * + * @param None + * + * @return None + * + * @details This macro is used to reload the WWDT counter value to 0x3F. + * @note After WWDT enabled, user must reload WWDT counter while current counter is less than compare value \n + * and larger than 0, otherwise WWDT will cause system reset immediately. + */ +#define WWDT_RELOAD_COUNTER() (WWDT->WWDTRLD = WWDT_RELOAD_WORD) + +void WWDT_Open(uint32_t u32PreScale, uint32_t u32CmpValue, uint32_t u32EnableInt); + +/*@}*/ /* end of group WWDT_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group WWDT_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif //__WWDT_H__ + +/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/system_NUC123.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/system_NUC123.h new file mode 100644 index 00000000..2d1b4562 --- /dev/null +++ b/os/common/ext/CMSIS/Nuvoton/NUMICRO/system_NUC123.h @@ -0,0 +1,65 @@ +/**************************************************************************//** + * @file system_NUC123.h + * @version V3.0 + * $Revision: 5 $ + * $Date: 15/07/02 11:21a $ + * @brief NUC123 Series CMSIS System Header File + * + * @note + * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. + * + ******************************************************************************/ +#ifndef __SYSTEM_NUC123_H +#define __SYSTEM_NUC123_H + +#ifdef __cplusplus +extern "C" { +#endif +/*---------------------------------------------------------------------------------------------------------*/ +/* Macro Definition */ +/*---------------------------------------------------------------------------------------------------------*/ +#ifndef DEBUG_PORT +# define DEBUG_PORT UART0 /*!< Select Debug Port which is used for retarget.c to output debug message to UART */ +#endif + +/*---------------------------------------------------------------------------- + Define SYSCLK + *----------------------------------------------------------------------------*/ +#define __HXT (12000000UL) /*!< External Crystal Clock Frequency */ +#define __LXT (32768UL) /*!< External Crystal Clock Frequency 32.768KHz */ +#define __HIRC (22118400UL) /*!< Internal 22M RC Oscillator Frequency */ +#define __LIRC (10000UL) /*!< Internal 10K RC Oscillator Frequency */ +#define __HSI (50000000UL) /*!< PLL default output is 50MHz */ + +extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ +extern uint32_t CyclesPerUs; /*!< Cycles per micro second */ +extern uint32_t PllClock; /*!< PLL Output Clock Frequency */ + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system + * Initialize GPIO directions and values + */ +extern void SystemInit(void); + + +/** + * Update SystemCoreClock variable + * + * @param none + * @return none + * + * @brief Updates the SystemCoreClock with current core Clock + * retrieved from CPU registers. + */ +extern void SystemCoreClockUpdate(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/os/common/startup/ARMCMx/compilers/GCC/ld/NUC123SD4AN0.ld b/os/common/startup/ARMCMx/compilers/GCC/ld/NUC123SD4AN0.ld new file mode 100644 index 00000000..853ebff2 --- /dev/null +++ b/os/common/startup/ARMCMx/compilers/GCC/ld/NUC123SD4AN0.ld @@ -0,0 +1,85 @@ +/* + ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/* + * NUC123SD4AN0 memory setup. + */ +MEMORY +{ + flash0 : org = 0x00000000, len = 64k + flash1 : org = 0x00000000, len = 0 + flash2 : org = 0x00000000, len = 0 + flash3 : org = 0x00000000, len = 0 + flash4 : org = 0x00000000, len = 0 + flash5 : org = 0x00000000, len = 0 + flash6 : org = 0x00000000, len = 0 + flash7 : org = 0x00000000, len = 0 + ram0 : org = 0x20000000, len = 20k + ram1 : org = 0x00000000, len = 0 + ram2 : org = 0x00000000, len = 0 + ram3 : org = 0x00000000, len = 0 + ram4 : org = 0x00000000, len = 0 + ram5 : org = 0x00000000, len = 0 + ram6 : org = 0x00000000, len = 0 + ram7 : org = 0x00000000, len = 0 +} + +/* For each data/text section two region are defined, a virtual region + and a load region (_LMA suffix).*/ + +/* Flash region to be used for exception vectors.*/ +REGION_ALIAS("VECTORS_FLASH", flash0); +REGION_ALIAS("VECTORS_FLASH_LMA", flash0); + +/* Flash region to be used for constructors and destructors.*/ +REGION_ALIAS("XTORS_FLASH", flash0); +REGION_ALIAS("XTORS_FLASH_LMA", flash0); + +/* Flash region to be used for code text.*/ +REGION_ALIAS("TEXT_FLASH", flash0); +REGION_ALIAS("TEXT_FLASH_LMA", flash0); + +/* Flash region to be used for read only data.*/ +REGION_ALIAS("RODATA_FLASH", flash0); +REGION_ALIAS("RODATA_FLASH_LMA", flash0); + +/* Flash region to be used for various.*/ +REGION_ALIAS("VARIOUS_FLASH", flash0); +REGION_ALIAS("VARIOUS_FLASH_LMA", flash0); + +/* Flash region to be used for RAM(n) initialization data.*/ +REGION_ALIAS("RAM_INIT_FLASH_LMA", flash0); + +/* RAM region to be used for Main stack. This stack accommodates the processing + of all exceptions and interrupts.*/ +REGION_ALIAS("MAIN_STACK_RAM", ram0); + +/* RAM region to be used for the process stack. This is the stack used by + the main() function.*/ +REGION_ALIAS("PROCESS_STACK_RAM", ram0); + +/* RAM region to be used for data segment.*/ +REGION_ALIAS("DATA_RAM", ram0); +REGION_ALIAS("DATA_RAM_LMA", flash0); + +/* RAM region to be used for BSS segment.*/ +REGION_ALIAS("BSS_RAM", ram0); + +/* RAM region to be used for the default heap.*/ +REGION_ALIAS("HEAP_RAM", ram0); + +/* Generic rules inclusion.*/ +INCLUDE rules.ld diff --git a/os/common/startup/ARMCMx/compilers/GCC/mk/startup_nuc123sd4an0.mk b/os/common/startup/ARMCMx/compilers/GCC/mk/startup_nuc123sd4an0.mk new file mode 100644 index 00000000..927befaf --- /dev/null +++ b/os/common/startup/ARMCMx/compilers/GCC/mk/startup_nuc123sd4an0.mk @@ -0,0 +1,12 @@ +# List of the ChibiOS generic NUC123SD4AN0 startup and CMSIS files. +STARTUPSRC = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/crt1.c \ + $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/vectors.c + +STARTUPASM = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/crt0_v6m.S + +STARTUPINC = $(CHIBIOS_CONTRIB)/os/common/startup/ARMCMx/compilers/GCC \ + $(CHIBIOS_CONTRIB)/os/common/startup/ARMCMx/devices/NUC123SD4AN0 \ + $(CHIBIOS)/os/common/ext/CMSIS/include \ + $(CHIBIOS_CONTRIB)/os/common/ext/CMSIS/Nuvoton/NUMICRO + +STARTUPLD = $(CHIBIOS_CONTRIB)/os/common/startup/ARMCMx/compilers/GCC/ld diff --git a/os/common/startup/ARMCMx/devices/NUC123SD4AN0/cmparams.h b/os/common/startup/ARMCMx/devices/NUC123SD4AN0/cmparams.h new file mode 100644 index 00000000..0af36474 --- /dev/null +++ b/os/common/startup/ARMCMx/devices/NUC123SD4AN0/cmparams.h @@ -0,0 +1,84 @@ +/* + ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file NUC123SD4AN0/cmparams.h + * @brief ARM Cortex-M0 parameters for the NUC123SD4AN0. + * + * @defgroup ARMCMx_NUC123 NUC123SD4AN0 Specific Parameters + * @ingroup ARMCMx_SPECIFIC + * @details This file contains the Cortex-M0 specific parameters for the + * NUC123SD4AN0 platform. + * @{ + */ + +#ifndef CMPARAMS_H +#define CMPARAMS_H + +/** + * @brief Cortex core model. + */ +#define CORTEX_MODEL 0 + +/** + * @brief Floating Point unit presence. + */ +#define CORTEX_HAS_FPU 0 + +/** + * @brief Number of bits in priority masks. + */ +#define CORTEX_PRIORITY_BITS 2 + +/** + * @brief Number of interrupt vectors. + * @note This number does not include the 16 system vectors and must be + * rounded to a multiple of 8. + */ +#define CORTEX_NUM_VECTORS 32 + +/* The following code is not processed when the file is included from an + asm module.*/ +#if !defined(_FROM_ASM_) + +/* If the device type is not externally defined, for example from the Makefile, + then a file named board.h is included. This file must contain a device + definition compatible with the vendor include file.*/ +#if !defined (NUC123SD4AN0) +#include "board.h" +#endif + +/* Including the device CMSIS header. Note, we are not using the definitions + from this header because we need this file to be usable also from + assembler source files. We verify that the info matches instead.*/ +#include "NUC123.h" + +/*lint -save -e9029 [10.4] Signedness comes from external files, it is + unpredictable but gives no problems.*/ +#if CORTEX_MODEL != __CORTEX_M +#error "CMSIS __CORTEX_M mismatch" +#endif + +#if CORTEX_PRIORITY_BITS != __NVIC_PRIO_BITS +#error "CMSIS __NVIC_PRIO_BITS mismatch" +#endif +/*lint -restore*/ + +#endif /* !defined(_FROM_ASM_) */ + +#endif /* CMPARAMS_H */ + +/** @} */ diff --git a/os/hal/ports/NUMICRO/LLD/CLKv1/clk.c b/os/hal/ports/NUMICRO/LLD/CLKv1/clk.c new file mode 100644 index 00000000..c199a9cb --- /dev/null +++ b/os/hal/ports/NUMICRO/LLD/CLKv1/clk.c @@ -0,0 +1,678 @@ +/**************************************************************************//** + * @file clk.c + * @version V3.00 + * $Revision: 26 $ + * $Date: 15/10/30 8:44a $ + * @brief NUC123 series CLK driver source file + * + * @note + * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ + +#include "NUC123.h" + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup CLK_Driver CLK Driver + @{ +*/ + +/** @addtogroup CLK_EXPORTED_FUNCTIONS CLK Exported Functions + @{ +*/ + +/** + * @brief Disable frequency output function + * @param None + * @return None + * @details This function disable frequency output function. + */ +void CLK_DisableCKO(void) +{ + /* Disable CKO clock source */ + CLK_DisableModuleClock(FDIV_MODULE); +} + +/** + * @brief This function enable frequency divider module clock. + * enable frequency divider clock function and configure frequency divider. + * @param[in] u32ClkSrc is frequency divider function clock source. Including : + * - \ref CLK_CLKSEL2_FRQDIV_S_HXT + * - \ref CLK_CLKSEL2_FRQDIV_S_HCLK + * - \ref CLK_CLKSEL2_FRQDIV_S_HIRC + * @param[in] u32ClkDiv is divider output frequency selection. + * @param[in] u32ClkDivBy1En is not supported. + * @return None + * + * @details Output selected clock to CKO. The output clock frequency is divided by u32ClkDiv. + * The formula is: + * CKO frequency = (Clock source frequency) / 2^(u32ClkDiv + 1) + * This function is just used to set CKO clock. + * User must enable I/O for CKO clock output pin by themselves. + */ +void CLK_EnableCKO(uint32_t u32ClkSrc, uint32_t u32ClkDiv, uint32_t u32ClkDivBy1En) +{ + /* CKO = clock source / 2^(u32ClkDiv + 1) */ + CLK->FRQDIV = (CLK_FRQDIV_DIVIDER_EN_Msk | u32ClkDiv) ; + + /* Enable CKO clock source */ + CLK_EnableModuleClock(FDIV_MODULE); + + /* Select CKO clock source */ + CLK_SetModuleClock(FDIV_MODULE, u32ClkSrc, 0); +} + +/** + * @brief Enter to Power-down mode + * @param None + * @return None + * @details This function is used to let system enter to Power-down mode. + * The register write-protection function should be disabled before using this function. + */ +void CLK_PowerDown(void) +{ + /* Set the processor uses deep sleep as its low power mode */ + SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; + + /* Set system Power-down enabled and Power-down entry condition */ + CLK->PWRCON |= (CLK_PWRCON_PWR_DOWN_EN_Msk | CLK_PWRCON_PD_WAIT_CPU_Msk); + + /* Chip enter Power-down mode after CPU run WFI instruction */ + __WFI(); +} + +/** + * @brief Enter to Idle mode + * @param None + * @return None + * @details This function let system enter to Idle mode. + * The register write-protection function should be disabled before using this function. + */ +void CLK_Idle(void) +{ + /* Set the processor uses sleep as its low power mode */ + //SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk; + + /* Set chip in idle mode because of WFI command */ + //CLK->PWRCON &= ~CLK_PWRCON_PWR_DOWN_EN_Msk; + + /* Chip enter idle mode after CPU run WFI instruction */ + //__WFI(); +} + +/** + * @brief Get external high speed crystal clock frequency + * @param None + * @return External high frequency crystal frequency + * @details This function get external high frequency crystal frequency. The frequency unit is Hz. + */ +uint32_t CLK_GetHXTFreq(void) +{ + if(CLK->PWRCON & CLK_PWRCON_XTL12M_EN_Msk) + return __HXT; + else + return 0; +} + +/** + * @brief Get HCLK frequency + * @param None + * @return HCLK frequency + * @details This function get HCLK frequency. The frequency unit is Hz. + */ +uint32_t CLK_GetHCLKFreq(void) +{ + SystemCoreClockUpdate(); + return SystemCoreClock; +} + +/** + * @brief Get PCLK frequency + * @param None + * @return PCLK frequency + * @details This function get PCLK frequency. The frequency unit is Hz. + */ +uint32_t CLK_GetPCLKFreq(void) +{ + SystemCoreClockUpdate(); + if(CLK->APBDIV & CLK_APBDIV_APBDIV_Msk) + return SystemCoreClock / 2; + else + return SystemCoreClock; +} + +/** + * @brief Get CPU frequency + * @param None + * @return CPU frequency + * @details This function get CPU frequency. The frequency unit is Hz. + */ +uint32_t CLK_GetCPUFreq(void) +{ + SystemCoreClockUpdate(); + return SystemCoreClock; +} + +/** + * @brief Set HCLK frequency + * @param[in] u32Hclk is HCLK frequency. The range of u32Hclk is 25 MHz ~ 72 MHz. + * @return HCLK frequency + * @details This function is used to set HCLK frequency. The frequency unit is Hz. + * It would configure PLL frequency to 50MHz ~ 144MHz, + * set HCLK clock divider as 2 and switch HCLK clock source to PLL. + * The register write-protection function should be disabled before using this function. + */ +uint32_t CLK_SetCoreClock(uint32_t u32Hclk) +{ + uint32_t u32HIRCSTB; + + /* Read HIRC clock source stable flag */ + u32HIRCSTB = CLK->CLKSTATUS & CLK_CLKSTATUS_OSC22M_STB_Msk; + + /* The range of u32Hclk is 25 MHz ~ 72 MHz */ + if(u32Hclk > FREQ_72MHZ) + u32Hclk = FREQ_72MHZ; + if(u32Hclk < FREQ_25MHZ) + u32Hclk = FREQ_25MHZ; + + /* Switch HCLK clock source to HIRC clock for safe */ + CLK->PWRCON |= CLK_PWRCON_OSC22M_EN_Msk; + CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk); + CLK->CLKSEL0 |= CLK_CLKSEL0_HCLK_S_Msk; + CLK->CLKDIV &= (~CLK_CLKDIV_HCLK_N_Msk); + + /* Configure PLL setting if HXT clock is stable */ + if(CLK->CLKSTATUS & CLK_CLKSTATUS_XTL12M_STB_Msk) + u32Hclk = CLK_EnablePLL(CLK_PLLCON_PLL_SRC_HXT, (u32Hclk << 1)); + + /* Configure PLL setting if HXT clock is not stable */ + else + { + u32Hclk = CLK_EnablePLL(CLK_PLLCON_PLL_SRC_HIRC, (u32Hclk << 1)); + + /* Read HIRC clock source stable flag */ + u32HIRCSTB = CLK->CLKSTATUS & CLK_CLKSTATUS_OSC22M_STB_Msk; + } + + /* Select HCLK clock source to PLL, + Select HCLK clock source divider as 2 + and update system core clock + */ + CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_PLL, CLK_CLKDIV_HCLK(2)); + + /* Disable HIRC if HIRC is disabled before setting core clock */ + if( u32HIRCSTB == 0 ) + CLK->PWRCON &= ~CLK_PWRCON_OSC22M_EN_Msk; + + /* Return actually HCLK frequency is PLL frequency divide 2 */ + return u32Hclk >> 1; +} + +/** + * @brief Set HCLK clock source and HCLK clock divider + * @param[in] u32ClkSrc is HCLK clock source. Including : + * - \ref CLK_CLKSEL0_HCLK_S_HXT + * - \ref CLK_CLKSEL0_HCLK_S_PLL_DIV2 + * - \ref CLK_CLKSEL0_HCLK_S_PLL + * - \ref CLK_CLKSEL0_HCLK_S_LIRC + * - \ref CLK_CLKSEL0_HCLK_S_HIRC + * @param[in] u32ClkDiv is HCLK clock divider. Including : + * - \ref CLK_CLKDIV_HCLK(x) + * @return None + * @details This function set HCLK clock source and HCLK clock divider. + * The register write-protection function should be disabled before using this function. + */ +void CLK_SetHCLK(uint32_t u32ClkSrc, uint32_t u32ClkDiv) +{ + uint32_t u32HIRCSTB; + + /* Read HIRC clock source stable flag */ + u32HIRCSTB = CLK->CLKSTATUS & CLK_CLKSTATUS_OSC22M_STB_Msk; + + /* Switch to HIRC for Safe. Avoid HCLK too high when applying new divider. */ + CLK->PWRCON |= CLK_CLKSTATUS_OSC22M_STB_Msk; + CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk); + CLK->CLKSEL0 = (CLK->CLKSEL0 & (~CLK_CLKSEL0_HCLK_S_Msk)) | CLK_CLKSEL0_HCLK_S_HIRC; + + /* Apply new Divider */ + CLK->CLKDIV = (CLK->CLKDIV & (~CLK_CLKDIV_HCLK_N_Msk)) | u32ClkDiv; + + /* Switch HCLK to new HCLK source */ + CLK->CLKSEL0 = (CLK->CLKSEL0 & (~CLK_CLKSEL0_HCLK_S_Msk)) | u32ClkSrc; + + /* Update System Core Clock */ + SystemCoreClockUpdate(); + + /* Disable HIRC if HIRC is disabled before switching HCLK source */ + if( u32HIRCSTB == 0 ) + CLK->PWRCON &= ~CLK_CLKSTATUS_OSC22M_STB_Msk; +} + +/** + * @brief This function set selected module clock source and module clock divider + * @param[in] u32ModuleIdx is module index. + * @param[in] u32ClkSrc is module clock source. + * @param[in] u32ClkDiv is module clock divider. + * @return None + * @details Valid parameter combinations listed in following table: + * + * |Module index |Clock source |Divider | + * | :---------------- | :------------------------------------| :--------------------- | + * |\ref WDT_MODULE |\ref CLK_CLKSEL1_WDT_S_LIRC | x | + * |\ref WDT_MODULE |\ref CLK_CLKSEL1_WDT_S_HCLK_DIV2048 | x | + * |\ref ADC_MODULE |\ref CLK_CLKSEL1_ADC_S_HXT |\ref CLK_CLKDIV_ADC(x) | + * |\ref ADC_MODULE |\ref CLK_CLKSEL1_ADC_S_PLL |\ref CLK_CLKDIV_ADC(x) | + * |\ref ADC_MODULE |\ref CLK_CLKSEL1_ADC_S_HCLK |\ref CLK_CLKDIV_ADC(x) | + * |\ref ADC_MODULE |\ref CLK_CLKSEL1_ADC_S_HIRC |\ref CLK_CLKDIV_ADC(x) | + * |\ref SPI0_MODULE |\ref CLK_CLKSEL1_SPI0_S_HCLK | x | + * |\ref SPI0_MODULE |\ref CLK_CLKSEL1_SPI0_S_PLL | x | + * |\ref SPI1_MODULE |\ref CLK_CLKSEL1_SPI1_S_HCLK | x | + * |\ref SPI1_MODULE |\ref CLK_CLKSEL1_SPI1_S_PLL | x | + * |\ref SPI2_MODULE |\ref CLK_CLKSEL1_SPI2_S_HCLK | x | + * |\ref SPI2_MODULE |\ref CLK_CLKSEL1_SPI2_S_PLL | x | + * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0_S_HXT | x | + * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0_S_HCLK | x | + * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0_S_EXT_TRG | x | + * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0_S_LIRC | x | + * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0_S_HIRC | x | + * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1_S_HXT | x | + * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1_S_HCLK | x | + * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1_S_EXT_TRG | x | + * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1_S_LIRC | x | + * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1_S_HIRC | x | + * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2_S_HXT | x | + * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2_S_HCLK | x | + * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2_S_EXT_TRG | x | + * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2_S_LIRC | x | + * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2_S_HIRC | x | + * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3_S_HXT | x | + * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3_S_HCLK | x | + * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3_S_EXT_TRG | x | + * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3_S_LIRC | x | + * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3_S_HIRC | x | + * |\ref UART0_MODULE |\ref CLK_CLKSEL1_UART_S_HXT |\ref CLK_CLKDIV_UART(x) | + * |\ref UART0_MODULE |\ref CLK_CLKSEL1_UART_S_PLL |\ref CLK_CLKDIV_UART(x) | + * |\ref UART0_MODULE |\ref CLK_CLKSEL1_UART_S_HIRC |\ref CLK_CLKDIV_UART(x) | + * |\ref UART1_MODULE |\ref CLK_CLKSEL1_UART_S_HXT |\ref CLK_CLKDIV_UART(x) | + * |\ref UART1_MODULE |\ref CLK_CLKSEL1_UART_S_PLL |\ref CLK_CLKDIV_UART(x) | + * |\ref UART1_MODULE |\ref CLK_CLKSEL1_UART_S_HIRC |\ref CLK_CLKDIV_UART(x) | + * |\ref PWM01_MODULE |\ref CLK_CLKSEL12_PWM01_S_HXT | x | + * |\ref PWM01_MODULE |\ref CLK_CLKSEL12_PWM01_S_HCLK | x | + * |\ref PWM01_MODULE |\ref CLK_CLKSEL12_PWM01_S_HIRC | x | + * |\ref PWM01_MODULE |\ref CLK_CLKSEL12_PWM01_S_LIRC | x | + * |\ref PWM23_MODULE |\ref CLK_CLKSEL12_PWM23_S_HXT | x | + * |\ref PWM23_MODULE |\ref CLK_CLKSEL12_PWM23_S_HCLK | x | + * |\ref PWM23_MODULE |\ref CLK_CLKSEL12_PWM23_S_HIRC | x | + * |\ref PWM23_MODULE |\ref CLK_CLKSEL12_PWM23_S_LIRC | x | + * |\ref I2S_MODULE |\ref CLK_CLKSEL2_I2S_S_HXT | x | + * |\ref I2S_MODULE |\ref CLK_CLKSEL2_I2S_S_PLL | x | + * |\ref I2S_MODULE |\ref CLK_CLKSEL2_I2S_S_HCLK | x | + * |\ref I2S_MODULE |\ref CLK_CLKSEL2_I2S_S_HIRC | x | + * |\ref FDIV_MODULE |\ref CLK_CLKSEL2_FRQDIV_S_HXT | x | + * |\ref FDIV_MODULE |\ref CLK_CLKSEL2_FRQDIV_S_HCLK | x | + * |\ref FDIV_MODULE |\ref CLK_CLKSEL2_FRQDIV_S_HIRC | x | + * |\ref WWDT_MODULE |\ref CLK_CLKSEL2_WWDT_S_HCLK_DIV2048 | x | + * |\ref WWDT_MODULE |\ref CLK_CLKSEL2_WWDT_S_LIRC | x | + * |\ref USBD_MODULE | x |\ref CLK_CLKDIV_USB(x) | + */ + +void CLK_SetModuleClock(uint32_t u32ModuleIdx, uint32_t u32ClkSrc, uint32_t u32ClkDiv) +{ + uint32_t u32sel = 0, u32div = 0; + uint32_t u32SelTbl[3] = {0x0, 0x4, 0xC}; + + if(MODULE_CLKSEL_Msk(u32ModuleIdx) != MODULE_NoMsk) + { + /* Get clock select control register address */ + u32sel = (uint32_t)&CLK->CLKSEL0 + (u32SelTbl[MODULE_CLKSEL(u32ModuleIdx)]); + /* Set new clock selection setting */ + M32(u32sel) = (M32(u32sel) & (~(MODULE_CLKSEL_Msk(u32ModuleIdx) << MODULE_CLKSEL_Pos(u32ModuleIdx)))) | u32ClkSrc; + + /* We need to set CLKSEL2 ext control bit for PWM */ + if(u32ModuleIdx == PWM01_MODULE) + CLK->CLKSEL2 = (CLK->CLKSEL2 & (~CLK_CLKSEL2_PWM01_S_E_Msk)) | (u32ClkSrc & CLK_CLKSEL2_PWM01_S_E_Msk); + else if(u32ModuleIdx == PWM23_MODULE) + CLK->CLKSEL2 = (CLK->CLKSEL2 & (~CLK_CLKSEL2_PWM23_S_E_Msk)) | (u32ClkSrc & CLK_CLKSEL2_PWM23_S_E_Msk); + } + + if(MODULE_CLKDIV_Msk(u32ModuleIdx) != MODULE_NoMsk) + { + /* Get clock divider control register address */ + u32div = (uint32_t)&CLK->CLKDIV + ((MODULE_CLKDIV(u32ModuleIdx)) * 4); + /* Apply new divider */ + M32(u32div) = (M32(u32div) & (~(MODULE_CLKDIV_Msk(u32ModuleIdx) << MODULE_CLKDIV_Pos(u32ModuleIdx)))) | u32ClkDiv; + } +} + +/** + * @brief Set SysTick clock source + * @param[in] u32ClkSrc is module clock source. Including: + * - \ref CLK_CLKSEL0_STCLK_S_HXT + * - \ref CLK_CLKSEL0_STCLK_S_HXT_DIV2 + * - \ref CLK_CLKSEL0_STCLK_S_HCLK_DIV2 + * - \ref CLK_CLKSEL0_STCLK_S_HIRC_DIV2 + * @return None + * @details This function set SysTick clock source. + * The register write-protection function should be disabled before using this function. + */ +void CLK_SetSysTickClockSrc(uint32_t u32ClkSrc) +{ + CLK->CLKSEL0 = (CLK->CLKSEL0 & ~CLK_CLKSEL0_STCLK_S_Msk) | u32ClkSrc; +} + +/** + * @brief Enable clock source + * @param[in] u32ClkMask is clock source mask. Including : + * - \ref CLK_PWRCON_XTL12M_EN_Msk + * - \ref CLK_PWRCON_OSC22M_EN_Msk + * - \ref CLK_PWRCON_OSC10K_EN_Msk + * @return None + * @details This function enable clock source. + * The register write-protection function should be disabled before using this function. + */ +void CLK_EnableXtalRC(uint32_t u32ClkMask) +{ + CLK->PWRCON |= u32ClkMask; +} + +/** + * @brief Disable clock source + * @param[in] u32ClkMask is clock source mask. Including : + * - \ref CLK_PWRCON_XTL12M_EN_Msk + * - \ref CLK_PWRCON_OSC22M_EN_Msk + * - \ref CLK_PWRCON_OSC10K_EN_Msk + * @return None + * @details This function disable clock source. + * The register write-protection function should be disabled before using this function. + */ +void CLK_DisableXtalRC(uint32_t u32ClkMask) +{ + CLK->PWRCON &= ~u32ClkMask; +} + +/** + * @brief Enable module clock + * @param[in] u32ModuleIdx is module index. Including : + * - \ref PDMA_MODULE + * - \ref ISP_MODULE + * - \ref WDT_MODULE + * - \ref TMR0_MODULE + * - \ref TMR1_MODULE + * - \ref TMR2_MODULE + * - \ref TMR3_MODULE + * - \ref FDIV_MODULE + * - \ref I2C0_MODULE + * - \ref I2C1_MODULE + * - \ref SPI0_MODULE + * - \ref SPI1_MODULE + * - \ref SPI2_MODULE + * - \ref UART0_MODULE + * - \ref UART1_MODULE + * - \ref PWM01_MODULE + * - \ref PWM23_MODULE + * - \ref USBD_MODULE + * - \ref ADC_MODULE + * - \ref I2S_MODULE + * - \ref PS2_MODULE + * @return None + * @details This function enable module clock. + */ +void CLK_EnableModuleClock(uint32_t u32ModuleIdx) +{ + *(volatile uint32_t *)((uint32_t)&CLK->AHBCLK + ((MODULE_APBCLK(u32ModuleIdx)) * 4)) |= 1 << MODULE_IP_EN_Pos(u32ModuleIdx); +} + +/** + * @brief Disable module clock + * @param[in] u32ModuleIdx is module index. Including : + * - \ref PDMA_MODULE + * - \ref ISP_MODULE + * - \ref WDT_MODULE + * - \ref TMR0_MODULE + * - \ref TMR1_MODULE + * - \ref TMR2_MODULE + * - \ref TMR3_MODULE + * - \ref FDIV_MODULE + * - \ref I2C0_MODULE + * - \ref I2C1_MODULE + * - \ref SPI0_MODULE + * - \ref SPI1_MODULE + * - \ref SPI2_MODULE + * - \ref UART0_MODULE + * - \ref UART1_MODULE + * - \ref PWM01_MODULE + * - \ref PWM23_MODULE + * - \ref USBD_MODULE + * - \ref ADC_MODULE + * - \ref I2S_MODULE + * - \ref PS2_MODULE + * @return None + * @details This function disable module clock. + */ +void CLK_DisableModuleClock(uint32_t u32ModuleIdx) +{ + *(volatile uint32_t *)((uint32_t)&CLK->AHBCLK + ((MODULE_APBCLK(u32ModuleIdx)) * 4)) &= ~(1 << MODULE_IP_EN_Pos(u32ModuleIdx)); +} + + +/** + * @brief Set PLL frequency + * @param[in] u32PllClkSrc is PLL clock source. Including : + * - \ref CLK_PLLCON_PLL_SRC_HXT + * - \ref CLK_PLLCON_PLL_SRC_HIRC + * @param[in] u32PllFreq is PLL frequency + * @return PLL frequency + * @details This function is used to configure PLLCON register to set specified PLL frequency. + * The register write-protection function should be disabled before using this function. + */ +uint32_t CLK_EnablePLL(uint32_t u32PllClkSrc, uint32_t u32PllFreq) +{ + uint32_t u32PllSrcClk, u32NR, u32NF, u32NO, u32CLK_SRC; + uint32_t u32Tmp, u32Tmp2, u32Tmp3, u32Min, u32MinNF, u32MinNR; + + /* Disable PLL first to avoid unstable when setting PLL. */ + CLK->PLLCON = CLK_PLLCON_PD_Msk; + + /* PLL source clock is from HXT */ + if(u32PllClkSrc == CLK_PLLCON_PLL_SRC_HXT) + { + /* Enable HXT clock */ + CLK->PWRCON |= CLK_PWRCON_XTL12M_EN_Msk; + + /* Wait for HXT clock ready */ + CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk); + + /* Select PLL source clock from HXT */ + u32CLK_SRC = CLK_PLLCON_PLL_SRC_HXT; + u32PllSrcClk = __HXT; + + /* u32NR start from 2 */ + u32NR = 2; + } + + /* PLL source clock is from HIRC */ + else + { + /* Enable HIRC clock */ + CLK->PWRCON |= CLK_PWRCON_OSC22M_EN_Msk; + + /* Wait for HIRC clock ready */ + CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk); + + /* Select PLL source clock from HIRC */ + u32CLK_SRC = CLK_PLLCON_PLL_SRC_HIRC; + u32PllSrcClk = __HIRC; + + /* u32NR start from 4 when FIN = 22.1184MHz to avoid calculation overflow */ + u32NR = 4; + } + + /* Select "NO" according to request frequency */ + if((u32PllFreq <= FREQ_200MHZ) && (u32PllFreq > FREQ_100MHZ)) + { + u32NO = 0; + } + else if((u32PllFreq <= FREQ_100MHZ) && (u32PllFreq > FREQ_50MHZ)) + { + u32NO = 1; + u32PllFreq = u32PllFreq << 1; + } + else if((u32PllFreq <= FREQ_50MHZ) && (u32PllFreq >= FREQ_25MHZ)) + { + u32NO = 3; + u32PllFreq = u32PllFreq << 2; + } + else + { + /* Wrong frequency request. Just return default setting. */ + goto lexit; + } + + /* Find best solution */ + u32Min = (uint32_t) - 1; + u32MinNR = 0; + u32MinNF = 0; + for(; u32NR <= 33; u32NR++) + { + u32Tmp = u32PllSrcClk / u32NR; + if((u32Tmp > 1600000) && (u32Tmp < 16000000)) + { + for(u32NF = 2; u32NF <= 513; u32NF++) + { + u32Tmp2 = u32Tmp * u32NF; + if((u32Tmp2 >= 100000000) && (u32Tmp2 <= 200000000)) + { + u32Tmp3 = (u32Tmp2 > u32PllFreq) ? u32Tmp2 - u32PllFreq : u32PllFreq - u32Tmp2; + if(u32Tmp3 < u32Min) + { + u32Min = u32Tmp3; + u32MinNR = u32NR; + u32MinNF = u32NF; + + /* Break when get good results */ + if(u32Min == 0) + break; + } + } + } + } + } + + /* Enable and apply new PLL setting. */ + CLK->PLLCON = u32CLK_SRC | (u32NO << 14) | ((u32MinNR - 2) << 9) | (u32MinNF - 2); + + /* Waiting for PLL clock stable */ + CLK_WaitClockReady(CLK_CLKSTATUS_PLL_STB_Msk); + + /* Return actual PLL output clock frequency */ + return u32PllSrcClk / ((u32NO + 1) * u32MinNR) * u32MinNF; + +lexit: + + /* Apply default PLL setting and return */ + if(u32PllClkSrc == CLK_PLLCON_PLL_SRC_HXT) + CLK->PLLCON = 0xC22E; /* 48MHz */ + else + CLK->PLLCON = 0xD66F; /* 48.06498462MHz */ + + CLK_WaitClockReady(CLK_CLKSTATUS_PLL_STB_Msk); + return CLK_GetPLLClockFreq(); + + +} + + +/** + * @brief Disable PLL + * @param None + * @return None + * @details This function disable PLL. + */ +void CLK_DisablePLL(void) +{ + CLK->PLLCON |= CLK_PLLCON_PD_Msk; +} + +/** + * @brief This function check selected clock source status + * @param[in] u32ClkMask is selected clock source. Including : + * - \ref CLK_CLKSTATUS_XTL12M_STB_Msk + * - \ref CLK_CLKSTATUS_OSC22M_STB_Msk + * - \ref CLK_CLKSTATUS_OSC10K_STB_Msk + * - \ref CLK_CLKSTATUS_PLL_STB_Msk + * + * @retval 0 clock is not stable + * @retval 1 clock is stable + * + * @details To wait for clock ready by specified CLKSTATUS bit or timeout (~300ms) + */ +uint32_t CLK_WaitClockReady(uint32_t u32ClkMask) +{ + int32_t i32TimeOutCnt = 2160000; + + while((CLK->CLKSTATUS & u32ClkMask) != u32ClkMask) + { + if(i32TimeOutCnt-- <= 0) + return 0; + } + + return 1; +} + +/** + * @brief Enable System Tick counter + * @param[in] u32ClkSrc is System Tick clock source. Including: + * - \ref CLK_CLKSEL0_STCLK_S_HXT + * - \ref CLK_CLKSEL0_STCLK_S_HXT_DIV2 + * - \ref CLK_CLKSEL0_STCLK_S_HCLK_DIV2 + * - \ref CLK_CLKSEL0_STCLK_S_HIRC_DIV2 + * - \ref CLK_CLKSEL0_STCLK_S_HCLK + * @param[in] u32Count is System Tick reload value. It could be 0~0xFFFFFF. + * @return None + * @details This function set System Tick clock source, reload value, enable System Tick counter and interrupt. + * The register write-protection function should be disabled before using this function. + */ +void CLK_EnableSysTick(uint32_t u32ClkSrc, uint32_t u32Count) +{ + /* Set System Tick counter disabled */ + SysTick->CTRL = 0; + + /* Set System Tick clock source */ + if( u32ClkSrc == CLK_CLKSEL0_STCLK_S_HCLK ) + SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk; + else + CLK->CLKSEL0 = (CLK->CLKSEL0 & ~CLK_CLKSEL0_STCLK_S_Msk) | u32ClkSrc; + + /* Set System Tick reload value */ + SysTick->LOAD = u32Count; + + /* Clear System Tick current value and counter flag */ + SysTick->VAL = 0; + + /* Set System Tick interrupt enabled and counter enabled */ + SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; +} + +/** + * @brief Disable System Tick counter + * @param None + * @return None + * @details This function disable System Tick counter. + */ +void CLK_DisableSysTick(void) +{ + /* Set System Tick counter disabled */ + SysTick->CTRL = 0; +} + + + +/*@}*/ /* end of group CLK_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group CLK_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/hal/ports/NUMICRO/LLD/CLKv1/clk.h b/os/hal/ports/NUMICRO/LLD/CLKv1/clk.h new file mode 100644 index 00000000..c66cdd26 --- /dev/null +++ b/os/hal/ports/NUMICRO/LLD/CLKv1/clk.h @@ -0,0 +1,409 @@ +/**************************************************************************//** + * @file clk.h + * @version V3.0 + * $Revision: 16 $ + * $Date: 15/07/02 11:21a $ + * @brief NUC123 Series Clock Control Driver Header File + * + * @note + * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. + * + ******************************************************************************/ +#ifndef __CLK_H__ +#define __CLK_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup CLK_Driver CLK Driver + @{ +*/ + +/** @addtogroup CLK_EXPORTED_CONSTANTS CLK Exported Constants + @{ +*/ + +#define FREQ_25MHZ 25000000 +#define FREQ_50MHZ 50000000 +#define FREQ_72MHZ 72000000 +#define FREQ_100MHZ 100000000 +#define FREQ_200MHZ 200000000 + + +/*---------------------------------------------------------------------------------------------------------*/ +/* CLKSEL0 constant definitions. */ +/*---------------------------------------------------------------------------------------------------------*/ +#define CLK_CLKSEL0_HCLK_S_HXT (0x0UL<>30) & 0x3) /*!< Calculate APBCLK offset on MODULE index, 0x0:AHBCLK, 0x1:APBCLK */ +#define MODULE_CLKSEL(x) (((x) >>28) & 0x3) /*!< Calculate CLKSEL offset on MODULE index, 0x0:CLKSEL0, 0x1:CLKSEL1, 0x2:CLKSEL2 */ +#define MODULE_CLKSEL_Msk(x) (((x) >>25) & 0x7) /*!< Calculate CLKSEL mask offset on MODULE index */ +#define MODULE_CLKSEL_Pos(x) (((x) >>20) & 0x1f) /*!< Calculate CLKSEL position offset on MODULE index */ +#define MODULE_CLKDIV(x) (((x) >>18) & 0x3) /*!< Calculate APBCLK CLKDIV on MODULE index, 0x0:CLKDIV */ +#define MODULE_CLKDIV_Msk(x) (((x) >>10) & 0xff) /*!< Calculate CLKDIV mask offset on MODULE index */ +#define MODULE_CLKDIV_Pos(x) (((x) >>5 ) & 0x1f) /*!< Calculate CLKDIV position offset on MODULE index */ +#define MODULE_IP_EN_Pos(x) (((x) >>0 ) & 0x1f) /*!< Calculate APBCLK offset on MODULE index */ +#define MODULE_NoMsk 0x0 /*!< Not mask on MODULE index */ +#define NA MODULE_NoMsk /*!< Not Available */ + +#define MODULE_APBCLK_ENC(x) (((x) & 0x03) << 30) /*!< MODULE index, 0x0:AHBCLK, 0x1:APBCLK */ +#define MODULE_CLKSEL_ENC(x) (((x) & 0x03) << 28) /*!< CLKSEL offset on MODULE index, 0x0:CLKSEL0, 0x1:CLKSEL1, 0x2:CLKSEL2 */ +#define MODULE_CLKSEL_Msk_ENC(x) (((x) & 0x07) << 25) /*!< CLKSEL mask offset on MODULE index */ +#define MODULE_CLKSEL_Pos_ENC(x) (((x) & 0x1f) << 20) /*!< CLKSEL position offset on MODULE index */ +#define MODULE_CLKDIV_ENC(x) (((x) & 0x03) << 18) /*!< APBCLK CLKDIV on MODULE index, 0x0:CLKDIV */ +#define MODULE_CLKDIV_Msk_ENC(x) (((x) & 0xff) << 10) /*!< CLKDIV mask offset on MODULE index */ +#define MODULE_CLKDIV_Pos_ENC(x) (((x) & 0x1f) << 5) /*!< CLKDIV position offset on MODULE index */ +#define MODULE_IP_EN_Pos_ENC(x) (((x) & 0x1f) << 0) /*!< APBCLK offset on MODULE index */ + + +#define PDMA_MODULE (MODULE_APBCLK_ENC( 0)|MODULE_IP_EN_Pos_ENC(CLK_AHBCLK_PDMA_EN_Pos) |\ + MODULE_CLKSEL_ENC(NA)|MODULE_CLKSEL_Msk_ENC(NA)|MODULE_CLKSEL_Pos_ENC(NA)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< PDMA Module */ +#define ISP_MODULE (MODULE_APBCLK_ENC( 0)|MODULE_IP_EN_Pos_ENC(CLK_AHBCLK_ISP_EN_Pos) |\ + MODULE_CLKSEL_ENC(NA)|MODULE_CLKSEL_Msk_ENC(NA)|MODULE_CLKSEL_Pos_ENC(NA)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< ISP Module */ + +#define WDT_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_WDT_EN_Pos) |\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC( 0)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< WDT Module */ +#define TMR0_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_TMR0_EN_Pos) |\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 7)|MODULE_CLKSEL_Pos_ENC( 8)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< TMR0 Module */ +#define TMR1_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_TMR1_EN_Pos) |\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 7)|MODULE_CLKSEL_Pos_ENC(12)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< TMR1 Module */ +#define TMR2_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_TMR2_EN_Pos) |\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 7)|MODULE_CLKSEL_Pos_ENC(16)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< TMR2 Module */ +#define TMR3_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_TMR3_EN_Pos) |\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 7)|MODULE_CLKSEL_Pos_ENC(20)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< TMR3 Module */ +#define FDIV_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_FDIV_EN_Pos) |\ + MODULE_CLKSEL_ENC( 2)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC( 2)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< FDIV Module */ + +#define I2C0_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_I2C0_EN_Pos) |\ + MODULE_CLKSEL_ENC(NA)|MODULE_CLKSEL_Msk_ENC(NA)|MODULE_CLKSEL_Pos_ENC(NA)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< I2C0 Module */ +#define I2C1_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_I2C1_EN_Pos) |\ + MODULE_CLKSEL_ENC(NA)|MODULE_CLKSEL_Msk_ENC(NA)|MODULE_CLKSEL_Pos_ENC(NA)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< I2C1 Module */ +#define SPI0_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_SPI0_EN_Pos) |\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 1)|MODULE_CLKSEL_Pos_ENC( 4)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< SPI0 Module */ +#define SPI1_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_SPI1_EN_Pos) |\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 1)|MODULE_CLKSEL_Pos_ENC( 5)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< SPI1 Module */ +#define SPI2_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_SPI2_EN_Pos) |\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 1)|MODULE_CLKSEL_Pos_ENC( 6)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< SPI2 Module */ + +#define UART0_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_UART0_EN_Pos)|\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC(24)|\ + MODULE_CLKDIV_ENC( 0)|MODULE_CLKDIV_Msk_ENC(0x0F)|MODULE_CLKDIV_Pos_ENC( 8)) /*!< UART0 Module */ +#define UART1_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_UART1_EN_Pos)|\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC(24)|\ + MODULE_CLKDIV_ENC( 0)|MODULE_CLKDIV_Msk_ENC(0x0F)|MODULE_CLKDIV_Pos_ENC( 8)) /*!< UART1 Module */ + +#define PWM01_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_PWM01_EN_Pos)|\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC(28)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< PWM01 Module */ +#define PWM23_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_PWM23_EN_Pos)|\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC(30)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< PWM23 Module */ +#define USBD_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_USBD_EN_Pos) |\ + MODULE_CLKSEL_ENC(NA)|MODULE_CLKSEL_Msk_ENC(NA)|MODULE_CLKSEL_Pos_ENC(NA)|\ + MODULE_CLKDIV_ENC( 0)|MODULE_CLKDIV_Msk_ENC(0x0F)|MODULE_CLKDIV_Pos_ENC(4)) /*!< USBD Module */ +#define ADC_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_ADC_EN_Pos) |\ + MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC( 2)|\ + MODULE_CLKDIV_ENC( 0)|MODULE_CLKDIV_Msk_ENC(0xFF)|MODULE_CLKDIV_Pos_ENC(16)) /*!< ADC Module */ +#define I2S_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_I2S_EN_Pos) |\ + MODULE_CLKSEL_ENC( 2)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC( 0)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< I2S Module */ +#define PS2_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_PS2_EN_Pos) |\ + MODULE_CLKSEL_ENC(NA)|MODULE_CLKSEL_Msk_ENC(NA)|MODULE_CLKSEL_Pos_ENC(NA)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< PS2 Module */ + +#define WWDT_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_WDT_EN_Pos) |\ + MODULE_CLKSEL_ENC( 2)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC(16)|\ + MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< WWDT Module */ + +/*@}*/ /* end of group CLK_EXPORTED_CONSTANTS */ + + +/** @addtogroup CLK_EXPORTED_FUNCTIONS CLK Exported Functions + @{ +*/ + + +/** + * @brief Get PLL clock frequency + * @param None + * @return PLL frequency + * @details This function get PLL frequency. The frequency unit is Hz. + */ +__STATIC_INLINE uint32_t CLK_GetPLLClockFreq(void) +{ + uint32_t u32PllFreq = 0, u32PllReg; + uint32_t u32FIN, u32NF, u32NR, u32NO; + uint8_t au8NoTbl[4] = {1, 2, 2, 4}; + + u32PllReg = CLK->PLLCON; + + if(u32PllReg & (CLK_PLLCON_PD_Msk | CLK_PLLCON_OE_Msk)) + return 0; /* PLL is in power down mode or fix low */ + + if(u32PllReg & CLK_PLLCON_PLL_SRC_HIRC) + u32FIN = __HIRC; /* PLL source clock from HIRC */ + else + u32FIN = __HXT; /* PLL source clock from HXT */ + + if(u32PllReg & CLK_PLLCON_BP_Msk) + return u32FIN; /* PLL is in bypass mode */ + + /* PLL is output enabled in normal work mode */ + u32NO = au8NoTbl[((u32PllReg & CLK_PLLCON_OUT_DV_Msk) >> CLK_PLLCON_OUT_DV_Pos)]; + u32NF = ((u32PllReg & CLK_PLLCON_FB_DV_Msk) >> CLK_PLLCON_FB_DV_Pos) + 2; + u32NR = ((u32PllReg & CLK_PLLCON_IN_DV_Msk) >> CLK_PLLCON_IN_DV_Pos) + 2; + + /* u32FIN is shifted 2 bits to avoid overflow */ + u32PllFreq = (((u32FIN >> 2) * u32NF) / (u32NR * u32NO) << 2); + + return u32PllFreq; +} + +/** + * @brief This function execute delay function. + * @param[in] us Delay time. The Max value is 2^24 / CPU Clock(MHz). Ex: + * 72MHz => 233016us, 50MHz => 335544us, + 48MHz => 349525us, 28MHz => 699050us ... + * @return None + * @details Use the SysTick to generate the delay time and the UNIT is in us. + * The SysTick clock source is from HCLK, i.e the same as system core clock. + * User can use SystemCoreClockUpdate() to calculate CyclesPerUs automatically before using this function. + */ +__STATIC_INLINE void CLK_SysTickDelay(uint32_t us) +{ + SysTick->LOAD = us * CyclesPerUs; + SysTick->VAL = (0x00); + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; + + /* Waiting for down-count to zero */ + while((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0); + + /* Disable SysTick counter */ + SysTick->CTRL = 0; +} + + +void CLK_DisableCKO(void); +void CLK_EnableCKO(uint32_t u32ClkSrc, uint32_t u32ClkDiv, uint32_t u32ClkDivBy1En); +void CLK_PowerDown(void); +void CLK_Idle(void); +uint32_t CLK_GetHXTFreq(void); +uint32_t CLK_GetHCLKFreq(void); +uint32_t CLK_GetPCLKFreq(void); +uint32_t CLK_GetCPUFreq(void); +uint32_t CLK_SetCoreClock(uint32_t u32Hclk); +void CLK_SetHCLK(uint32_t u32ClkSrc, uint32_t u32ClkDiv); +void CLK_SetModuleClock(uint32_t u32ModuleIdx, uint32_t u32ClkSrc, uint32_t u32ClkDiv); +void CLK_SetSysTickClockSrc(uint32_t u32ClkSrc); +void CLK_EnableXtalRC(uint32_t u32ClkMask); +void CLK_DisableXtalRC(uint32_t u32ClkMask); +void CLK_EnableModuleClock(uint32_t u32ModuleIdx); +void CLK_DisableModuleClock(uint32_t u32ModuleIdx); +uint32_t CLK_EnablePLL(uint32_t u32PllClkSrc, uint32_t u32PllFreq); +void CLK_DisablePLL(void); +uint32_t CLK_WaitClockReady(uint32_t u32ClkMask); +void CLK_EnableSysTick(uint32_t u32ClkSrc, uint32_t u32Count); +void CLK_DisableSysTick(void); + + +/*@}*/ /* end of group CLK_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group CLK_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + + + +#endif //__CLK_H__ + + + +/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/hal/ports/NUMICRO/LLD/CLKv1/driver.mk b/os/hal/ports/NUMICRO/LLD/CLKv1/driver.mk new file mode 100644 index 00000000..35a2681a --- /dev/null +++ b/os/hal/ports/NUMICRO/LLD/CLKv1/driver.mk @@ -0,0 +1,2 @@ +PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/CLKv1/clk.c +PLATFORMINC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/CLKv1 diff --git a/os/hal/ports/NUMICRO/LLD/GPIOv1/driver.mk b/os/hal/ports/NUMICRO/LLD/GPIOv1/driver.mk new file mode 100644 index 00000000..98ed4f2f --- /dev/null +++ b/os/hal/ports/NUMICRO/LLD/GPIOv1/driver.mk @@ -0,0 +1,10 @@ +PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/GPIOv1/gpio.c +PLATFORMINC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/GPIOv1 + +ifeq ($(USE_SMART_BUILD),yes) +ifneq ($(findstring HAL_USE_PAL TRUE,$(HALCONF)),) +PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/GPIOv1/hal_pal_lld.c +endif +else +PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/GPIOv1/hal_pal_lld.c +endif diff --git a/os/hal/ports/NUMICRO/LLD/GPIOv1/gpio.c b/os/hal/ports/NUMICRO/LLD/GPIOv1/gpio.c new file mode 100644 index 00000000..07595518 --- /dev/null +++ b/os/hal/ports/NUMICRO/LLD/GPIOv1/gpio.c @@ -0,0 +1,115 @@ +/**************************************************************************//** + * @file gpio.c + * @version V3.00 + * $Revision: 8 $ + * $Date: 16/06/08 9:58a $ + * @brief NUC123 series GPIO driver source file + * + * @note + * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ + +#include "NUC123.h" + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup GPIO_Driver GPIO Driver + @{ +*/ + +/** @addtogroup GPIO_EXPORTED_FUNCTIONS GPIO Exported Functions + @{ +*/ + +/** + * @brief Set GPIO operation mode + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. + * @param[in] u32PinMask The single or multiple pins of specified GPIO port. \n + * It could be BIT10 ~ BIT15 for PA GPIO port. \n + * It could be BIT0 ~ BIT10 and BIT12 ~ BIT15 for PB GPIO port. \n + * It could be BIT0 ~ BIT5 and BIT8 ~ BIT13 for PC GPIO port. \n + * It could be BIT0 ~ BIT5 and BIT8 ~ BIT11 for PD GPIO port. \n + * It could be BIT0 ~ BIT3 for PF GPIO port. + * @param[in] u32Mode Operation mode. It could be : + * - \ref GPIO_PMD_INPUT, + * - \ref GPIO_PMD_OUTPUT, + * - \ref GPIO_PMD_OPEN_DRAIN, + * - \ref GPIO_PMD_QUASI + * + * @return None + * + * @details This function is used to set specified GPIO operation mode. + */ +void GPIO_SetMode(GPIO_T *port, uint32_t u32PinMask, uint32_t u32Mode) +{ + uint32_t i; + + for(i = 0; i < GPIO_PIN_MAX; i++) + { + if(u32PinMask & (1 << i)) + { + port->PMD = (port->PMD & ~(0x3 << (i << 1))) | (u32Mode << (i << 1)); + } + } +} + +/** + * @brief Enable GPIO interrupt + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. + * @param[in] u32Pin The pin of specified GPIO port. \n + * It could be 10 ~ 15 for PA GPIO port. \n + * It could be 0 ~ 10 and 12 ~ 15 for PB GPIO port. \n + * It could be 0 ~ 5 and 8 ~ 13 for PC GPIO port. \n + * It could be 0 ~ 5 and 8 ~ 11 for PD GPIO port. \n + * It could be 0 ~ 3 for PF GPIO port. + * @param[in] u32IntAttribs The interrupt attribute of specified GPIO pin. It could be : + * - \ref GPIO_INT_RISING + * - \ref GPIO_INT_FALLING + * - \ref GPIO_INT_BOTH_EDGE + * - \ref GPIO_INT_HIGH + * - \ref GPIO_INT_LOW + * + * @return None + * + * @details This function is used to enable specified GPIO pin interrupt. + */ +void GPIO_EnableInt(GPIO_T *port, uint32_t u32Pin, uint32_t u32IntAttribs) +{ + port->IMD |= (((u32IntAttribs >> 24) & 0xFFUL) << u32Pin); + port->IEN |= ((u32IntAttribs & 0xFFFFFFUL) << u32Pin); +} + + +/** + * @brief Disable GPIO interrupt + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. + * @param[in] u32Pin The pin of specified GPIO port. \n + * It could be 10 ~ 15 for PA GPIO port. \n + * It could be 0 ~ 10 and 12 ~ 15 for PB GPIO port. \n + * It could be 0 ~ 5 and 8 ~ 13 for PC GPIO port. \n + * It could be 0 ~ 5 and 8 ~ 11 for PD GPIO port. \n + * It could be 0 ~ 3 for PF GPIO port. + * + * @return None + * + * @details This function is used to enable specified GPIO pin interrupt. + */ +void GPIO_DisableInt(GPIO_T *port, uint32_t u32Pin) +{ + port->IMD &= ~(1UL << u32Pin); + port->IEN &= ~((0x00010001UL) << u32Pin); +} + + +/*@}*/ /* end of group GPIO_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group GPIO_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/hal/ports/NUMICRO/LLD/GPIOv1/hal_pal_lld.c b/os/hal/ports/NUMICRO/LLD/GPIOv1/hal_pal_lld.c new file mode 100644 index 00000000..161ef18f --- /dev/null +++ b/os/hal/ports/NUMICRO/LLD/GPIOv1/hal_pal_lld.c @@ -0,0 +1,191 @@ +/* + Copyright (C) 2019 /u/KeepItUnder + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file hal_pal_lld.c + * @brief PLATFORM PAL subsystem low level driver source. + * + * @addtogroup PAL + * @{ + */ + +#include "hal.h" + +#if (HAL_USE_PAL == TRUE) || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Driver local definitions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver exported variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local variables and types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local functions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver interrupt handlers. */ +/*===========================================================================*/ + +/* DEBUG + +OSAL_IRQ_HANDLER(NUC123_GPIOAB_HANDLER){ + OSAL_IRQ_PROLOGUE(); + + + GPIO_TOGGLE(PB4); + GPIO_TOGGLE(PB5); + GPIO_TOGGLE(PB6); + GPIO_TOGGLE(PB7); + GPIO_TOGGLE(PB8); + + OSAL_IRQ_EPILOGUE(); +} + +OSAL_IRQ_HANDLER(NUC123_GPIOCDF_HANDLER){ + OSAL_IRQ_PROLOGUE(); + + GPIO_TOGGLE(PB4); + GPIO_TOGGLE(PB5); + GPIO_TOGGLE(PB6); + GPIO_TOGGLE(PB7); + GPIO_TOGGLE(PB8); + + OSAL_IRQ_EPILOGUE(); +} +*/ + +/*===========================================================================*/ +/* Driver exported functions. */ +/*===========================================================================*/ + +/** + * @brief NUC123 I/O ports configuration. + * @details Ports A-D(E, F, G, H) clocks enabled. + * + * @param[in] config the NUC123 ports configuration + * + * @notapi + */ +void _pal_lld_init(const PALConfig *config) { + + //(void)config; + /* Turn on GPIO subsystem + * Set all GPIO to Input/HZ + * Clear all GPIO Interrupts + * Set all GPIO Interrupt Modes to Level + * Turn off DeBounce + * Zero all GPIO Outputs (just in case) + */ + + GPIOA->PMD = config->PAData.PMD; + GPIOA->OFFD = config->PAData.OFFD; + GPIOA->DMASK = config->PAData.DMASK; + GPIOA->DBEN = config->PAData.DBEN; + GPIOA->IMD = config->PAData.IMD; + GPIOA->IEN = config->PAData.IEN; + GPIOA->ISRC = config->PAData.ISRC; + GPIOA->DOUT = config->PAData.DOUT; + + GPIOB->PMD = config->PBData.PMD; + GPIOB->OFFD = config->PBData.OFFD; + GPIOB->DMASK = config->PBData.DMASK; + GPIOB->DBEN = config->PBData.DBEN; + GPIOB->IMD = config->PBData.IMD; + GPIOB->IEN = config->PBData.IEN; + GPIOB->ISRC = config->PBData.ISRC; + GPIOB->DOUT = config->PBData.DOUT; + + GPIOC->PMD = config->PCData.PMD; + GPIOC->OFFD = config->PCData.OFFD; + GPIOC->DMASK = config->PCData.DMASK; + GPIOC->DBEN = config->PCData.DBEN; + GPIOC->IMD = config->PCData.IMD; + GPIOC->IEN = config->PCData.IEN; + GPIOC->ISRC = config->PCData.ISRC; + GPIOC->DOUT = config->PCData.DOUT; + + GPIOD->PMD = config->PDData.PMD; + GPIOD->OFFD = config->PDData.OFFD; + GPIOD->DMASK = config->PDData.DMASK; + GPIOD->DBEN = config->PDData.DBEN; + GPIOD->IMD = config->PDData.IMD; + GPIOD->IEN = config->PDData.IEN; + GPIOD->ISRC = config->PDData.ISRC; + GPIOD->DOUT = config->PDData.DOUT; + + GPIOF->PMD = config->PFData.PMD; + GPIOF->OFFD = config->PFData.OFFD; + GPIOF->DMASK = config->PFData.DMASK; + GPIOF->DBEN = config->PFData.DBEN; + GPIOF->IMD = config->PFData.IMD; + GPIOF->IEN = config->PFData.IEN; + GPIOF->ISRC = config->PFData.ISRC; + GPIOF->DOUT = config->PFData.DOUT; + + /* Set DeBounce conditions */ + GPIO->DBNCECON = 0x04u; + + /* Enable External Crystal Oscillator pins */ + SYS->GPF_MFP |= SYS_GPF_MFP_PF0_XT1_OUT | SYS_GPF_MFP_PF1_XT1_IN; + +// SYS->GPD_MFP |= SYS_GPD_MFP_PD10_CLKO; + + /* Enable UART1 data pins */ + SYS->GPB_MFP |= SYS_GPB_MFP_PB1_UART0_TXD | SYS_GPB_MFP_PB0_UART0_RXD; +} + +/** + * @brief Pads mode setup. + * @details This function programs a pads group belonging to the same port + * with the specified mode. + * + * @param[in] port the port identifier + * @param[in] mask the group mask + * @param[in] mode the mode + * + * @notapi + */ + +void _pal_lld_setgroupmode(ioportid_t port, + ioportmask_t mask, + iomode_t mode) { + + uint32_t nucMode; + + nucMode = 0; + + if (mode == PAL_MODE_INPUT || mode == PAL_MODE_INPUT_PULLUP) + nucMode = GPIO_PMD_INPUT; + else if (mode == PAL_MODE_OUTPUT_OPENDRAIN) + nucMode = GPIO_PMD_OPEN_DRAIN; + else if (mode == PAL_MODE_OUTPUT_PUSHPULL) + nucMode = GPIO_PMD_OUTPUT; + else + nucMode = GPIO_PMD_QUASI; + + GPIO_SetMode(port, mask, nucMode); +} + +#endif /* HAL_USE_PAL == TRUE */ + +/** @} */ diff --git a/os/hal/ports/NUMICRO/LLD/GPIOv1/hal_pal_lld.h b/os/hal/ports/NUMICRO/LLD/GPIOv1/hal_pal_lld.h new file mode 100644 index 00000000..11892f93 --- /dev/null +++ b/os/hal/ports/NUMICRO/LLD/GPIOv1/hal_pal_lld.h @@ -0,0 +1,466 @@ +/* + Copyright (C) 2019 /u/KeepItUnder + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file hal_pal_lld.h + * @brief PLATFORM PAL subsystem low level driver header. + * + * @addtogroup PAL + * @{ + */ + +#ifndef HAL_PAL_LLD_H +#define HAL_PAL_LLD_H + +#if (HAL_USE_PAL == TRUE) || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Unsupported modes and specific modes */ +/*===========================================================================*/ +/** + * @name NUC123 specific I/O mode flags + * @{ + */ +/** + * @brief NUC123 specific alternate input mode. + */ +#define PAL_MODE_NUC123_ALTERNATE_INPUT 0x0UL + +/** + * @brief NUC123 specific alternate push-pull output mode. + */ +#define PAL_MODE_NUC123_ALTERNATE_OUTPUT 0x1UL +/** @} */ + +/** + * @brief NUC123 specific alternate output mode. + */ +#define PAL_MODE_NUC123_ALTERNATE_OPEN_DRAIN 0x2UL +/** @} */ + +/** + * @brief NUC123 specific alternate output mode. + */ +#define PAL_MODE_NUC123_ALTERNATE_QUASI 0x3UL +/** @} */ + +/* +#undef PAL_MODE_RESET +#undef PAL_MODE_UNCONNECTED +#undef PAL_MODE_INPUT +#undef PAL_MODE_INPUT_PULLUP +#undef PAL_MODE_INPUT_PULLDOWN +#undef PAL_MODE_INPUT_ANALOG +#undef PAL_MODE_OUTPUT_PUSHPULL +#undef PAL_MODE_OUTPUT_OPENDRAIN + +#define PAL_MODE_RESET 3U +#define PAL_MODE_INPUT 0U +#define PAL_MODE_OUTPUT_PUSHPULL 1U +#define PAL_MODE_OUTPUT_OPENDRAIN 2U +#define PAL_MODE_INPUT_PULLUP 3U +*/ + +/*===========================================================================*/ +/* I/O Ports Types and constants. */ +/*===========================================================================*/ + +/** + * @name Port related definitions + * @{ + */ +/** + * @brief Width, in bits, of an I/O port. + */ +#define PAL_IOPORTS_WIDTH GPIO_PIN_MAX + +/** + * @brief Whole port mask. + * @details This macro specifies all the valid bits into a port. + */ +//#define PAL_WHOLE_PORT ((ioportmask_t)0xFFFFU) +#define PAL_WHOLE_PORT ((ioportmask_t)(2^GPIO_PIN_MAX) - 1) +/** @} */ + +/** + * @name Line handling macros + * @{ + */ +/** + * @brief Forms a line identifier. + * @details A port/pad pair are encoded into an @p ioline_t type. The encoding + * of this type is platform-dependent. + */ +#define PAL_LINE(port, pad) \ + ((ioline_t)((uint32_t)(port)) | ((uint32_t)(pad))) + +/** + * @brief Decodes a port identifier from a line identifier. + */ +#define PAL_PORT(line) \ + ((GPIO_T *)(((uint32_t)(line)) & 0xFFFFFFF0U)) + +/** + * @brief Decodes a pad identifier from a line identifier. + */ +#define PAL_PAD(line) \ + ((uint32_t)((uint32_t)(line) & 0x0000000FU)) + +/** + * @brief Value identifying an invalid line. + */ +#define PAL_NOLINE 0U +/** @} */ + +/** + * @brief Generic I/O ports static initializer. + * @details An instance of this structure must be passed to @p palInit() at + * system startup time in order to initialized the digital I/O + * subsystem. This represents only the initial setup, specific pads + * or whole ports can be reprogrammed at later time. + * @note Implementations may extend this structure to contain more, + * architecture dependent, fields. + */ +typedef struct { + /** @brief Port A setup data.*/ + GPIO_T PAData; + /** @brief Port B setup data.*/ + GPIO_T PBData; + /** @brief Port C setup data.*/ + GPIO_T PCData; + /** @brief Port D setup data.*/ + GPIO_T PDData; + /** @brief Port F setup data.*/ + GPIO_T PFData; +} PALConfig; + +/** + * @brief Digital I/O port sized unsigned type. + */ +typedef uint32_t ioportmask_t; + +/** + * @brief Digital I/O modes. + */ +typedef uint32_t iomode_t; + +/** + * @brief Type of an I/O line. + */ +typedef uint32_t ioline_t; + +/** + * @brief Port Identifier. + * @details This type can be a scalar or some kind of pointer, do not make + * any assumption about it, use the provided macros when populating + * variables of this type. + */ +typedef GPIO_T * ioportid_t; + +/*===========================================================================*/ +/* I/O Ports Identifiers. */ +/*===========================================================================*/ + +/** + * @brief First I/O port identifier. + * @details Low level drivers can define multiple ports, it is suggested to + * use this naming convention. + */ +#define IOPORT1 0 +#define GPIOA PA +#define GPIOB PB +#define GPIOC PC +#define GPIOD PD +#define GPIOF PF + +/*===========================================================================*/ +/* Implementation, some of the following macros could be implemented as */ +/* functions, if so please put them in pal_lld.c. */ +/*===========================================================================*/ + +/** + * @brief Low level PAL subsystem initialization. + * + * @param[in] config architecture-dependent ports configuration + * + * @notapi + */ +#define pal_lld_init(config) _pal_lld_init(config) + +/** + * @brief Reads the physical I/O port states. + * + * @param[in] port port identifier + * @return The port bits. + * + * @notapi + */ +#define pal_lld_readport(port) (port->PIN) + +/** + * @brief Reads the output latch. + * @details The purpose of this function is to read back the latched output + * value. + * + * @param[in] port port identifier + * @return The latched logical states. + * + * @notapi + */ +#define pal_lld_readlatch(port) (port->DOUT) + +/** + * @brief Writes a bits mask on a I/O port. + * + * @param[in] port port identifier + * @param[in] bits bits to be written on the specified port + * + * @notapi + */ +#define pal_lld_writeport(port, bits) (port->DOUT = bits) + + +/** + * @brief Sets a bits mask on a I/O port. + * @note The @ref PAL provides a default software implementation of this + * functionality, implement this function if can optimize it by using + * special hardware functionalities or special coding. + * + * @param[in] port port identifier + * @param[in] bits bits to be ORed on the specified port + * + * @notapi + */ +#define pal_lld_setport(port, bits) (port->DOUT |= bits) + + +/** + * @brief Clears a bits mask on a I/O port. + * @note The @ref PAL provides a default software implementation of this + * functionality, implement this function if can optimize it by using + * special hardware functionalities or special coding. + * + * @param[in] port port identifier + * @param[in] bits bits to be cleared on the specified port + * + * @notapi + */ +#define pal_lld_clearport(port, bits) (port->DOUT &= ~bits) + + +/** + * @brief Toggles a bits mask on a I/O port. + * @note The @ref PAL provides a default software implementation of this + * functionality, implement this function if can optimize it by using + * special hardware functionalities or special coding. + * + * @param[in] port port identifier + * @param[in] bits bits to be XORed on the specified port + * + * @notapi + */ +#define pal_lld_toggleport(port, bits) (port->DOUT ^= bits) + +/** + * @brief Reads a group of bits. + * @note The @ref PAL provides a default software implementation of this + * functionality, implement this function if can optimize it by using + * special hardware functionalities or special coding. + * + * @param[in] port port identifier + * @param[in] mask group mask + * @param[in] offset group bit offset within the port + * @return The group logical states. + * + * @notapi + */ +//#define pal_lld_readgroup(port, mask, offset) 0U + +/** + * @brief Writes a group of bits. + * @note The @ref PAL provides a default software implementation of this + * functionality, implement this function if can optimize it by using + * special hardware functionalities or special coding. + * + * @param[in] port port identifier + * @param[in] mask group mask + * @param[in] offset group bit offset within the port + * @param[in] bits bits to be written. Values exceeding the group width + * are masked. + * + * @notapi + */ +#define pal_lld_writegroup(port, mask, offset, bits) \ + do { \ + uint32_t oldmask = port->DMASK; \ + port->DMASK = ~(mask << offset); \ + port->DOUT = (bits & mask) << offset; \ + port->DMASK = oldmask; \ + } while (false) + +/** + * @brief Pads group mode setup. + * @details This function programs a pads group belonging to the same port + * with the specified mode. + * @note Programming an unknown or unsupported mode is silently ignored. + * + * @param[in] port port identifier + * @param[in] mask group mask + * @param[in] offset group bit offset within the port + * @param[in] mode group mode + * + * @notapi + */ +#define pal_lld_setgroupmode(port, mask, offset, mode) \ + _pal_lld_setgroupmode(port, mask << offset, mode) + +/** + * @brief Reads a logical state from an I/O pad. + * @note The @ref PAL provides a default software implementation of this + * functionality, implement this function if can optimize it by using + * special hardware functionalities or special coding. + * + * @param[in] port port identifier + * @param[in] pad pad number within the port + * @return The logical state. + * @retval PAL_LOW low logical state. + * @retval PAL_HIGH high logical state. + * + * @notapi + */ +/** + * @brief Reads a logical state from an I/O pad. + * @note The @ref PAL provides a default software implementation of this + * functionality, implement this function if can optimize it by using + * special hardware functionalities or special coding. + * + * @param[in] port port identifier + * @param[in] pad pad number within the port + * @return The logical state. + * @retval PAL_LOW low logical state. + * @retval PAL_HIGH high logical state. + * + * @notapi + */ +/*#define pal_lld_readpad(port, pad) PAL_LOW*/ +#define pal_lld_readpad(port, pad) ((port->PIN & PAL_PORT_BIT(pad)) >> pad) + +/** + * @brief Writes a logical state on an output pad. + * @note This function is not meant to be invoked directly by the + * application code. + * @note The @ref PAL provides a default software implementation of this + * functionality, implement this function if can optimize it by using + * special hardware functionalities or special coding. + * + * @param[in] port port identifier + * @param[in] pad pad number within the port + * @param[in] bit logical value, the value must be @p PAL_LOW or + * @p PAL_HIGH + * + * @notapi + */ +/* +#define pal_lld_writepad(port, pad, bit) \ + do { \ + (void)port; \ + (void)pad; \ + (void)bit; \ + } while (false) +*/ +/** + * @brief Sets a pad logical state to @p PAL_HIGH. + * @note The @ref PAL provides a default software implementation of this + * functionality, implement this function if can optimize it by using + * special hardware functionalities or special coding. + * + * @param[in] port port identifier + * @param[in] pad pad number within the port + * + * @notapi + */ +#define pal_lld_setpad(port, pad) \ + (port->DOUT |= PAL_PORT_BIT(pad)) + + +/** + * @brief Clears a pad logical state to @p PAL_LOW. + * @note The @ref PAL provides a default software implementation of this + * functionality, implement this function if can optimize it by using + * special hardware functionalities or special coding. + * + * @param[in] port port identifier + * @param[in] pad pad number within the port + * + * @notapi + */ +#define pal_lld_clearpad(port, pad) \ + (port->DOUT &= ~(0xFFFF0000U | PAL_PORT_BIT(pad))) + + +/** + * @brief Toggles a pad logical state. + * @note The @ref PAL provides a default software implementation of this + * functionality, implement this function if can optimize it by using + * special hardware functionalities or special coding. + * + * @param[in] port port identifier + * @param[in] pad pad number within the port + * + * @notapi + */ +#define pal_lld_togglepad(port, pad) \ + (port->DOUT ^= PAL_PORT_BIT(pad)) + + +/** + * @brief Pad mode setup. + * @details This function programs a pad with the specified mode. + * @note The @ref PAL provides a default software implementation of this + * functionality, implement this function if can optimize it by using + * special hardware functionalities or special coding. + * @note Programming an unknown or unsupported mode is silently ignored. + * + * @param[in] port port identifier + * @param[in] pad pad number within the port + * @param[in] mode pad mode + * + * @notapi + */ +#define pal_lld_setpadmode(port, pad, mode) \ + _pal_lld_setgroupmode(port, PAL_PORT_BIT(pad), mode) + //GPIO_SetMode(port, PAL_PORT_BIT(pad), mode) + +#if !defined(__DOXYGEN__) +extern const PALConfig pal_default_config; +#endif + +#ifdef __cplusplus +extern "C" { +#endif + void _pal_lld_init(const PALConfig *config); + void _pal_lld_setgroupmode(ioportid_t port, + ioportmask_t mask, + iomode_t mode); +#ifdef __cplusplus +} +#endif + +#endif /* HAL_USE_PAL == TRUE */ + +#endif /* HAL_PAL_LLD_H */ + +/** @} */ diff --git a/os/hal/ports/NUMICRO/LLD/PWMv1/driver.mk b/os/hal/ports/NUMICRO/LLD/PWMv1/driver.mk new file mode 100644 index 00000000..350af14a --- /dev/null +++ b/os/hal/ports/NUMICRO/LLD/PWMv1/driver.mk @@ -0,0 +1,2 @@ +PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/PWMv1/pwm.c +PLATFORMINC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/PWMv1 diff --git a/os/hal/ports/NUMICRO/LLD/PWMv1/pwm.c b/os/hal/ports/NUMICRO/LLD/PWMv1/pwm.c new file mode 100644 index 00000000..44a23d09 --- /dev/null +++ b/os/hal/ports/NUMICRO/LLD/PWMv1/pwm.c @@ -0,0 +1,677 @@ +/**************************************************************************//** + * @file pwm.c + * @version V3.00 + * $Revision: 9 $ + * $Date: 15/07/02 11:21a $ + * @brief NUC123 series PWM driver source file + * + * @note + * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ +#include "NUC123.h" + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup PWM_Driver PWM Driver + @{ +*/ + + +/** @addtogroup PWM_EXPORTED_FUNCTIONS PWM Exported Functions + @{ +*/ + +/** + * @brief Configure PWM capture and get the nearest unit time. + * @param[in] pwm The pointer of the specified PWM module + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @param[in] u32UnitTimeNsec The unit time of counter + * @param[in] u32CaptureEdge The condition to latch the counter. This parameter is not used + * @return The nearest unit time in nano second. + * @details This function is used to configure PWM capture and get the nearest unit time. + */ +uint32_t PWM_ConfigCaptureChannel(PWM_T *pwm, + uint32_t u32ChannelNum, + uint32_t u32UnitTimeNsec, + uint32_t u32CaptureEdge) +{ + uint32_t u32Src; + uint32_t u32PWMClockSrc; + uint32_t u32PWMClkTbl[8] = {__HXT, NULL, NULL, __HIRC, NULL, NULL, NULL, __LIRC}; + uint32_t u32NearestUnitTimeNsec; + uint8_t u8Divider = 1; + /* this table is mapping divider value to register configuration */ + uint32_t u32PWMDividerToRegTbl[17] = {NULL, 4, 0, NULL, 1, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 3}; + uint16_t u16Prescale = 2; + uint16_t u16CNR = 0xFFFF; + + if(u32ChannelNum < 2)/* channel 0 and channel 1 */ + u32Src = ((CLK->CLKSEL2 & (CLK_CLKSEL2_PWM01_S_EXT_Msk)) >> (CLK_CLKSEL2_PWM01_S_EXT_Pos - 2)) | (CLK->CLKSEL1 & (CLK_CLKSEL1_PWM01_S_Msk)) >> (CLK_CLKSEL1_PWM01_S_Pos); + else /* channel 2 and channel 3 */ + u32Src = ((CLK->CLKSEL2 & (CLK_CLKSEL2_PWM23_S_EXT_Msk)) >> (CLK_CLKSEL2_PWM23_S_EXT_Pos - 2)) | (CLK->CLKSEL1 & (CLK_CLKSEL1_PWM23_S_Msk)) >> (CLK_CLKSEL1_PWM23_S_Pos); + + if(u32Src == 2) + { + SystemCoreClockUpdate(); + u32PWMClockSrc = SystemCoreClock; + } + else + { + u32PWMClockSrc = u32PWMClkTbl[u32Src]; + } + + u32PWMClockSrc /= 1000; + for(; u16Prescale <= 0x100; u16Prescale++) + { + u32NearestUnitTimeNsec = (1000000 * u16Prescale * u8Divider) / u32PWMClockSrc; + if(u32NearestUnitTimeNsec < (u32UnitTimeNsec)) + { + if((u16Prescale == 0x100) && (u8Divider == 16)) //limit to the maximum unit time(nano second) + break; + if(u16Prescale == 0x100) + { + u16Prescale = 2; + u8Divider <<= 1; // clk divider could only be 1, 2, 4, 8, 16 + continue; + } + if(!((1000000 * ((u16Prescale * u8Divider) + 1)) > (u32NearestUnitTimeNsec * u32PWMClockSrc))) + break; + continue; + } + break; + } + + // Store return value here 'cos we're gonna change u8Divider & u16Prescale & u16CNR to the real value to fill into register + u16Prescale -= 1; + + // convert to real register value + u8Divider = u32PWMDividerToRegTbl[u8Divider]; + + // every two channels share a prescaler + (pwm)->PPR = ((pwm)->PPR & ~(PWM_PPR_CP01_Msk << ((u32ChannelNum >> 1) * 8))) | (u16Prescale << ((u32ChannelNum >> 1) * 8)); + (pwm)->CSR = ((pwm)->CSR & ~(PWM_CSR_CSR0_Msk << (4 * u32ChannelNum))) | (u8Divider << (4 * u32ChannelNum)); + // set PWM to edge aligned type + (pwm)->PCR &= ~(PWM_PCR_PWM01TYPE_Msk << (u32ChannelNum >> 1)); + (pwm)->PCR |= PWM_PCR_CH0MOD_Msk << (8 * u32ChannelNum); + *((__IO uint32_t *)((((uint32_t) & ((pwm)->CNR0)) + u32ChannelNum * 12))) = u16CNR; + + return (u32NearestUnitTimeNsec); +} + +/** + * @brief Configure PWM generator and get the nearest frequency in edge aligned auto-reload mode + * @param[in] pwm The pointer of the specified PWM module + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @param[in] u32Frequency Target generator frequency + * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%... + * @return Nearest frequency clock in nano second + * @details This function is used to configure PWM generator and get the nearest frequency in edge aligned auto-reload mode. + * @note Since every two channels, (0 & 1), (2 & 3), shares a prescaler. Call this API to configure PWM frequency may affect + * existing frequency of other channel. + */ +uint32_t PWM_ConfigOutputChannel(PWM_T *pwm, + uint32_t u32ChannelNum, + uint32_t u32Frequency, + uint32_t u32DutyCycle) +{ + uint32_t u32Src; + uint32_t u32PWMClockSrc; + uint32_t u32PWMClkTbl[8] = {__HXT, NULL, NULL, __HIRC, NULL, NULL, NULL, __LIRC}; + uint32_t i; + uint8_t u8Divider = 1, u8Prescale = 0xFF; + /* this table is mapping divider value to register configuration */ + uint32_t u32PWMDividerToRegTbl[17] = {NULL, 4, 0, NULL, 1, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 3}; + uint16_t u16CNR = 0xFFFF; + + if(u32ChannelNum < 2)/* channel 0 and channel 1 */ + u32Src = ((CLK->CLKSEL2 & (CLK_CLKSEL2_PWM01_S_EXT_Msk)) >> (CLK_CLKSEL2_PWM01_S_EXT_Pos - 2)) | (CLK->CLKSEL1 & (CLK_CLKSEL1_PWM01_S_Msk)) >> (CLK_CLKSEL1_PWM01_S_Pos); + else /* channel 2 and channel 3 */ + u32Src = ((CLK->CLKSEL2 & (CLK_CLKSEL2_PWM23_S_EXT_Msk)) >> (CLK_CLKSEL2_PWM23_S_EXT_Pos - 2)) | (CLK->CLKSEL1 & (CLK_CLKSEL1_PWM23_S_Msk)) >> (CLK_CLKSEL1_PWM23_S_Pos); + + if(u32Src == 2) + { + SystemCoreClockUpdate(); + u32PWMClockSrc = SystemCoreClock; + } + else + { + u32PWMClockSrc = u32PWMClkTbl[u32Src]; + } + + for(; u8Divider < 17; u8Divider <<= 1) // clk divider could only be 1, 2, 4, 8, 16 + { + i = (u32PWMClockSrc / (u32Frequency)) / u8Divider; + // If target value is larger than CNR * prescale, need to use a larger divider + if(i > (0x10000 * 0x100)) + continue; + + // CNR = 0xFFFF + 1, get a prescaler that CNR value is below 0xFFFF + u8Prescale = (i + 0xFFFF) / 0x10000; + + // u8Prescale must at least be 2, otherwise the output stop + if(u8Prescale < 3) + u8Prescale = 2; + + i /= u8Prescale; + + if(i <= 0x10000) + { + if(i == 1) + u16CNR = 1; // Too fast, and PWM cannot generate expected frequency... + else + u16CNR = i; + break; + } + } + // Store return value here 'cos we're gonna change u8Divider & u8Prescale & u16CNR to the real value to fill into register + i = u32PWMClockSrc / (u8Prescale * u8Divider * u16CNR); + + u8Prescale -= 1; + u16CNR -= 1; + // convert to real register value + u8Divider = u32PWMDividerToRegTbl[u8Divider]; + + // every two channels share a prescaler + (pwm)->PPR = ((pwm)->PPR & ~(PWM_PPR_CP01_Msk << ((u32ChannelNum >> 1) * 8))) | (u8Prescale << ((u32ChannelNum >> 1) * 8)); + (pwm)->CSR = ((pwm)->CSR & ~(PWM_CSR_CSR0_Msk << (4 * u32ChannelNum))) | (u8Divider << (4 * u32ChannelNum)); + // set PWM to edge aligned type + (pwm)->PCR &= ~(PWM_PCR_PWM01TYPE_Msk << (u32ChannelNum >> 1)); + (pwm)->PCR |= PWM_PCR_CH0MOD_Msk << (8 * u32ChannelNum); + + if(u32DutyCycle) + { + *((__IO uint32_t *)((((uint32_t) & ((pwm)->CMR0)) + u32ChannelNum * 12))) = u32DutyCycle * (u16CNR + 1) / 100 - 1; + } + else + { + *((__IO uint32_t *)((((uint32_t) & ((pwm)->CMR0)) + u32ChannelNum * 12))) = 0; + } + *((__IO uint32_t *)((((uint32_t) & ((pwm)->CNR0)) + u32ChannelNum * 12))) = u16CNR; + + return(i); +} + + +/** + * @brief Start PWM module + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. + * Bit 0 is channel 0, bit 1 is channel 1... + * @return None + * @details This function is used to start PWM module. + */ +void PWM_Start(PWM_T *pwm, uint32_t u32ChannelMask) +{ + uint32_t u32Mask = 0, i; + for(i = 0; i < PWM_CHANNEL_NUM; i ++) + { + if(u32ChannelMask & (1 << i)) + { + u32Mask |= (PWM_PCR_CH0EN_Msk << (i * 8)); + } + } + (pwm)->PCR |= u32Mask; +} + +/** + * @brief Stop PWM module + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. + * Bit 0 is channel 0, bit 1 is channel 1... + * @return None + * @details This function is used to stop PWM module. + */ +void PWM_Stop(PWM_T *pwm, uint32_t u32ChannelMask) +{ + uint32_t i; + for(i = 0; i < PWM_CHANNEL_NUM; i ++) + { + if(u32ChannelMask & (1 << i)) + { + *((__IO uint32_t *)((((uint32_t) & ((pwm)->CNR0)) + i * 12))) = 0; + } + } +} + +/** + * @brief Stop PWM generation immediately by clear channel enable bit + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. + * Bit 0 is channel 0, bit 1 is channel 1... + * @return None + * @details This function is used to stop PWM generation immediately by clear channel enable bit. + */ +void PWM_ForceStop(PWM_T *pwm, uint32_t u32ChannelMask) +{ + uint32_t u32Mask = 0, i; + for(i = 0; i < PWM_CHANNEL_NUM; i ++) + { + if(u32ChannelMask & (1 << i)) + { + u32Mask |= (PWM_PCR_CH0EN_Msk << (i * 8)); + } + } + (pwm)->PCR &= ~u32Mask; +} + +/** + * @brief Enable selected channel to trigger ADC + * @param[in] pwm The pointer of the specified PWM module + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @param[in] u32Condition This parameter is not used + * @return None + * @details This function is used to enable selected channel to trigger ADC. + * @note This function is only supported when PWM operating at Center-aligned type. + */ +void PWM_EnableADCTrigger(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Condition) +{ + (pwm)->TCON |= (PWM_TCON_PWM0TEN_Msk << u32ChannelNum); +} + +/** + * @brief Disable selected channel to trigger ADC + * @param[in] pwm The pointer of the specified PWM module + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @return None + * @details This function is used to disable selected channel to trigger ADC. + */ +void PWM_DisableADCTrigger(PWM_T *pwm, uint32_t u32ChannelNum) +{ + (pwm)->TCON = ((pwm)->TCON & ~(PWM_TCON_PWM0TEN_Msk << u32ChannelNum)); +} + +/** + * @brief Clear selected channel trigger ADC flag + * @param[in] pwm The pointer of the specified PWM module + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @param[in] u32Condition This parameter is not used + * @return None + * @details This function is used to clear selected channel trigger ADC flag. + */ +void PWM_ClearADCTriggerFlag(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Condition) +{ + (pwm)->TSTATUS = (PWM_TSTATUS_PWM0TF_Msk << u32ChannelNum); +} + +/** + * @brief Get selected channel trigger ADC flag + * @param[in] pwm The pointer of the specified PWM module + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @retval 0 The specified channel trigger ADC to start of conversion flag is not set + * @retval 1 The specified channel trigger ADC to start of conversion flag is set + * @details This function is used to get PWM trigger ADC to start of conversion flag for specified channel. + */ +uint32_t PWM_GetADCTriggerFlag(PWM_T *pwm, uint32_t u32ChannelNum) +{ + return (((pwm)->TSTATUS & (PWM_TSTATUS_PWM0TF_Msk << (u32ChannelNum))) ? 1 : 0); +} + +/** + * @brief Enable capture of selected channel(s) + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. + * Bit 0 is channel 0, bit 1 is channel 1... + * @return None + * @details This function is used to enable capture of selected channel(s). + */ +void PWM_EnableCapture(PWM_T *pwm, uint32_t u32ChannelMask) +{ + uint32_t i; + for(i = 0; i < PWM_CHANNEL_NUM; i ++) + { + if(u32ChannelMask & (1 << i)) + { + if(i < 2) + { + (pwm)->CCR0 |= PWM_CCR0_CAPCH0EN_Msk << (i * 16); + } + else + { + (pwm)->CCR2 |= PWM_CCR2_CAPCH2EN_Msk << ((i - 2) * 16); + } + } + } + (pwm)->CAPENR |= u32ChannelMask; +} + +/** + * @brief Disable capture of selected channel(s) + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. + * Bit 0 is channel 0, bit 1 is channel 1... + * @return None + * @details This function is used to disable capture of selected channel(s). + */ +void PWM_DisableCapture(PWM_T *pwm, uint32_t u32ChannelMask) +{ + uint32_t i; + for(i = 0; i < PWM_CHANNEL_NUM; i ++) + { + if(u32ChannelMask & (1 << i)) + { + if(i < 2) + { + (pwm)->CCR0 &= ~(PWM_CCR0_CAPCH0EN_Msk << (i * 16)); + } + else + { + (pwm)->CCR2 &= ~(PWM_CCR2_CAPCH2EN_Msk << ((i - 2) * 16)); + } + } + } + (pwm)->CAPENR &= ~u32ChannelMask; +} + +/** + * @brief Enables PWM output generation of selected channel(s) + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. + * Set bit 0 to 1 enables channel 0 output, set bit 1 to 1 enables channel 1 output... + * @return None + * @details This function is used to enables PWM output generation of selected channel(s). + */ +void PWM_EnableOutput(PWM_T *pwm, uint32_t u32ChannelMask) +{ + (pwm)->POE |= u32ChannelMask; +} + +/** + * @brief Disables PWM output generation of selected channel(s) + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel + * Set bit 0 to 1 disables channel 0 output, set bit 1 to 1 disables channel 1 output... + * @return None + * @details This function is used to disables PWM output generation of selected channel(s). + */ +void PWM_DisableOutput(PWM_T *pwm, uint32_t u32ChannelMask) +{ + (pwm)->POE &= ~u32ChannelMask; +} + +/** + * @brief Enables PDMA transfer of selected channel(s) for PWM capture + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. + * Set bit 0 to 1 enables channel 0 output, set bit 1 to 1 enables channel 1 output... + * @param[in] u32RisingFirst The capture order is rising, falling first. Every two channels share the same setting. + * @return None + * @details This function is used to enables PDMA transfer of selected channel(s) for PWM capture + */ +void PWM_EnablePDMA(PWM_T *pwm, uint32_t u32ChannelMask, uint32_t u32RisingFirst) +{ + uint32_t i; + for(i = 0; i < PWM_CHANNEL_NUM; i ++) + { + if(u32ChannelMask & (1 << i)) + { + (pwm)->CAPPDMACTL = ((pwm)->CAPPDMACTL & ~(PWM_CAPPDMACTL_CAP0RFORDER_Msk << (i * 8))) | \ + (((u32RisingFirst << PWM_CAPPDMACTL_CAP0RFORDER_Pos) | \ + PWM_CAPPDMACTL_CAP0PDMAMOD_Msk | PWM_CAPPDMACTL_CAP0PDMAEN_Msk) << (i * 8)); + } + } +} + +/** + * @brief Disables PDMA transfer of selected channel(s) for PWM capture + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. + * Set bit 0 to 1 enables channel 0 output, set bit 1 to 1 enables channel 1 output... + * @return None + * @details This function is used to enables PDMA transfer of selected channel(s) for PWM capture + */ +void PWM_DisablePDMA(PWM_T *pwm, uint32_t u32ChannelMask) +{ + uint32_t i; + for(i = 0; i < PWM_CHANNEL_NUM; i ++) + { + if(u32ChannelMask & (1 << i)) + { + (pwm)->CAPPDMACTL &= ~(PWM_CAPPDMACTL_CAP0PDMAEN_Msk << (i * 8)); + } + } +} + +/** + * @brief Enable Dead zone of selected channel + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @param[in] u32Duration Dead Zone length in PWM clock count, valid values are between 0~0xFF, but 0 means there is no + * dead zone. + * @return None + * @details This function is used to enable Dead zone of selected channel. + */ +void PWM_EnableDeadZone(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Duration) +{ + // every two channels shares the same setting + u32ChannelNum >>= 1; + // set duration + (pwm)->PPR = ((pwm)->PPR & ~(PWM_PPR_DZI01_Msk << (8 * u32ChannelNum))) | (u32Duration << (PWM_PPR_DZI01_Pos + 8 * u32ChannelNum)); + // enable dead zone + (pwm)->PCR |= (PWM_PCR_DZEN01_Msk << u32ChannelNum); +} + +/** + * @brief Disable Dead zone of selected channel + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @return None + * @details This function is used to disable Dead zone of selected channel. + */ +void PWM_DisableDeadZone(PWM_T *pwm, uint32_t u32ChannelNum) +{ + // every two channels shares the same setting + u32ChannelNum >>= 1; + // enable dead zone + (pwm)->PCR &= ~(PWM_PCR_DZEN01_Msk << u32ChannelNum); +} + +/** + * @brief Enable capture interrupt of selected channel. + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @param[in] u32Edge Rising or falling edge to latch counter. + * - \ref PWM_CAPTURE_INT_RISING_LATCH + * - \ref PWM_CAPTURE_INT_FALLING_LATCH + * @return None + * @details This function is used to enable capture interrupt of selected channel. + */ +void PWM_EnableCaptureInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Edge) +{ + if(u32ChannelNum < 2) + (pwm)->CCR0 |= u32Edge << (u32ChannelNum * 16); + else + (pwm)->CCR2 |= u32Edge << ((u32ChannelNum - 2) * 16); + +} + +/** + * @brief Disable capture interrupt of selected channel. + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @param[in] u32Edge Rising or falling edge to latch counter. + * - \ref PWM_CAPTURE_INT_RISING_LATCH + * - \ref PWM_CAPTURE_INT_FALLING_LATCH + * @return None + * @details This function is used to disable capture interrupt of selected channel. + */ +void PWM_DisableCaptureInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Edge) +{ + if(u32ChannelNum < 2) + (pwm)->CCR0 &= ~(u32Edge << (u32ChannelNum * 16)); + else + (pwm)->CCR2 &= ~(u32Edge << ((u32ChannelNum - 2) * 16)); +} + +/** + * @brief Clear capture interrupt of selected channel. + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @param[in] u32Edge Rising or falling edge to latch counter. + * - \ref PWM_CAPTURE_INT_RISING_LATCH + * - \ref PWM_CAPTURE_INT_FALLING_LATCH + * @return None + * @details This function is used to clear capture interrupt of selected channel. + */ +void PWM_ClearCaptureIntFlag(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Edge) +{ + //clear capture interrupt flag, and clear CRLR or CFLR latched indicator + if(u32ChannelNum < 2) + (pwm)->CCR0 = ((pwm)->CCR0 & PWM_CCR_MASK) | (PWM_CCR0_CAPIF0_Msk << (u32ChannelNum * 16)) | (u32Edge << (u32ChannelNum * 16 + 5)); + else + (pwm)->CCR2 = ((pwm)->CCR2 & PWM_CCR_MASK) | (PWM_CCR2_CAPIF2_Msk << ((u32ChannelNum - 2) * 16)) | (u32Edge << ((u32ChannelNum - 2) * 16 + 5)); +} + +/** + * @brief Get capture interrupt of selected channel. + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @retval 0 No capture interrupt + * @retval 1 Rising edge latch interrupt + * @retval 2 Falling edge latch interrupt + * @retval 3 Rising and falling latch interrupt + * @details This function is used to get capture interrupt of selected channel. + */ +uint32_t PWM_GetCaptureIntFlag(PWM_T *pwm, uint32_t u32ChannelNum) +{ + if(u32ChannelNum < 2) + { + return (((pwm)->CCR0 & ((PWM_CCR0_CRLRI0_Msk | PWM_CCR0_CFLRI0_Msk) << (u32ChannelNum * 16))) >> (PWM_CCR0_CRLRI0_Pos + u32ChannelNum * 16)); + } + else + { + return (((pwm)->CCR2 & ((PWM_CCR2_CRLRI2_Msk | PWM_CCR2_CFLRI2_Msk) << ((u32ChannelNum - 2) * 16))) >> (PWM_CCR2_CRLRI2_Pos + (u32ChannelNum - 2) * 16)); + } + +} +/** + * @brief Enable duty interrupt of selected channel + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @param[in] u32IntDutyType This parameter is not used + * @return None + * @details This function is used to enable duty interrupt of selected channel. + */ +void PWM_EnableDutyInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32IntDutyType) +{ + (pwm)->PIER |= (PWM_PIER_PWMDIE0_Msk << u32ChannelNum); +} + +/** + * @brief Disable duty interrupt of selected channel + * @param[in] pwm The pointer of the specified PWM module + * - PWMA : PWM Group A + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @return None + * @details This function is used to disable duty interrupt of selected channel. + */ +void PWM_DisableDutyInt(PWM_T *pwm, uint32_t u32ChannelNum) +{ + (pwm)->PIER &= ~(PWM_PIER_PWMDIE0_Msk << u32ChannelNum); +} + +/** + * @brief Clear duty interrupt flag of selected channel + * @param[in] pwm The pointer of the specified PWM module + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @return None + * @details This function is used to clear duty interrupt flag of selected channel. + */ +void PWM_ClearDutyIntFlag(PWM_T *pwm, uint32_t u32ChannelNum) +{ + (pwm)->PIIR = PWM_PIIR_PWMDIF0_Msk << u32ChannelNum; +} + +/** + * @brief Get duty interrupt flag of selected channel + * @param[in] pwm The pointer of the specified PWM module + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @retval 0 Duty interrupt did not occur + * @retval 1 Duty interrupt occurred + * @details This function is used to get duty interrupt flag of selected channel. + */ +uint32_t PWM_GetDutyIntFlag(PWM_T *pwm, uint32_t u32ChannelNum) +{ + return (((pwm)->PIIR & (PWM_PIIR_PWMDIF0_Msk << u32ChannelNum)) ? 1 : 0); +} + +/** + * @brief Enable period interrupt of selected channel + * @param[in] pwm The pointer of the specified PWM module + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @param[in] u32IntPeriodType Period interrupt type, could be either + * - \ref PWM_PERIOD_INT_UNDERFLOW + * - \ref PWM_PERIOD_INT_MATCH_CNR + * @return None + * @details This function is used to enable period interrupt of selected channel. + * Every two channels, (0 & 1), (2 & 3), shares the period interrupt type setting. + */ +void PWM_EnablePeriodInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32IntPeriodType) +{ + (pwm)->PIER = ((pwm)->PIER & ~(PWM_PIER_INT01TYPE_Msk << (u32ChannelNum >> 1))) | \ + (PWM_PIER_PWMIE0_Msk << u32ChannelNum) | (u32IntPeriodType << (u32ChannelNum >> 1)); +} + +/** + * @brief Disable period interrupt of selected channel + * @param[in] pwm The pointer of the specified PWM module + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @return None + * @details This function is used to disable period interrupt of selected channel. + */ +void PWM_DisablePeriodInt(PWM_T *pwm, uint32_t u32ChannelNum) +{ + (pwm)->PIER &= ~(PWM_PIER_PWMIE0_Msk << u32ChannelNum); +} + +/** + * @brief Clear period interrupt of selected channel + * @param[in] pwm The pointer of the specified PWM module + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @return None + * @details This function is used to clear period interrupt of selected channel. + */ +void PWM_ClearPeriodIntFlag(PWM_T *pwm, uint32_t u32ChannelNum) +{ + (pwm)->PIIR = (PWM_PIIR_PWMIF0_Msk << u32ChannelNum); +} + +/** + * @brief Get period interrupt of selected channel + * @param[in] pwm The pointer of the specified PWM module + * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 + * @retval 0 Period interrupt did not occur + * @retval 1 Period interrupt occurred + * @details This function is used to get period interrupt of selected channel. + */ +uint32_t PWM_GetPeriodIntFlag(PWM_T *pwm, uint32_t u32ChannelNum) +{ + return (((pwm)->PIIR & (PWM_PIIR_PWMIF0_Msk << (u32ChannelNum))) ? 1 : 0); +} + + + +/*@}*/ /* end of group PWM_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group PWM_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/hal/ports/NUMICRO/LLD/TIMv1/driver.mk b/os/hal/ports/NUMICRO/LLD/TIMv1/driver.mk new file mode 100644 index 00000000..07fb4225 --- /dev/null +++ b/os/hal/ports/NUMICRO/LLD/TIMv1/driver.mk @@ -0,0 +1,3 @@ +PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/TIMv1/hal_st_lld.c +#PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/TIMv1/timer.c +PLATFORMINC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/TIMv1 diff --git a/os/hal/ports/NUMICRO/LLD/TIMv1/hal_st_lld.c b/os/hal/ports/NUMICRO/LLD/TIMv1/hal_st_lld.c new file mode 100644 index 00000000..3c7aa331 --- /dev/null +++ b/os/hal/ports/NUMICRO/LLD/TIMv1/hal_st_lld.c @@ -0,0 +1,351 @@ +/* + Copyright (C) 2019 /u/KeepItUnder + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file TIMv1/hal_st_lld.c + * @brief ST Driver subsystem low level driver code. + * + * @addtogroup ST + * @{ + */ + +#include "hal.h" + +#if (OSAL_ST_MODE != OSAL_ST_MODE_NONE) || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Driver local definitions. */ +/*===========================================================================*/ + +#if OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING + +#if (OSAL_ST_RESOLUTION == 32) +#define ST_ARR_INIT 0xFFFFFFFF +#else +#define ST_ARR_INIT 0x0000FFFF +#endif + +#if NUC123_ST_USE_TIMER == 2 +#if (OSAL_ST_RESOLUTION == 32) && !NUC123_TIM2_IS_32BITS +#error "TIM2 is not a 32bits timer" +#endif + +#if defined(NUC123_TIM2_IS_USED) +#error "ST requires TIM2 but the timer is already used" +#else +#define NUC123_TIM2_IS_USED +#endif + +#define ST_HANDLER NUC123_TIM2_HANDLER +#define ST_NUMBER NUC123_TIM2_NUMBER +#define ST_USE_TIMER TIMER2 + +#elif NUC123_ST_USE_TIMER == 3 +#if (OSAL_ST_RESOLUTION == 32) && !NUC123_TIM3_IS_32BITS +#error "TIM3 is not a 32bits timer" +#endif + +#if defined(NUC123_TIM3_IS_USED) +#error "ST requires TIM3 but the timer is already used" +#else +#define NUC123_TIM3_IS_USED +#endif + +#define ST_HANDLER NUC123_TIM3_HANDLER +#define ST_NUMBER NUC123_TIM3_NUMBER +#define ST_USE_TIMER TIMER3 + +#elif NUC123_ST_USE_TIMER == 4 +#if (OSAL_ST_RESOLUTION == 32) && !NUC123_TIM4_IS_32BITS +#error "TIM4 is not a 32bits timer" +#endif + +#if defined(NUC123_TIM4_IS_USED) +#error "ST requires TIM4 but the timer is already used" +#else +#define NUC123_TIM4_IS_USED +#endif + +#define ST_HANDLER NUC123_TIM4_HANDLER +#define ST_NUMBER NUC123_TIM4_NUMBER +#define ST_USE_TIMER TIMER4 + +#else +#error "NUC123_ST_USE_TIMER specifies an unsupported timer" +#endif + +#endif /* OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING */ + +/*===========================================================================*/ +/* Driver exported variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local variables and types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local functions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver interrupt handlers. */ +/*===========================================================================*/ + +#if (OSAL_ST_MODE == OSAL_ST_MODE_PERIODIC) || defined(__DOXYGEN__) +/** + * @brief System Timer vector. + * @details This interrupt is used for system tick in periodic mode. + * + * @isr + */ +OSAL_IRQ_HANDLER(SysTick_Handler) { + + OSAL_IRQ_PROLOGUE(); + + osalSysLockFromISR(); + osalOsTimerHandlerI(); + osalSysUnlockFromISR(); + + /* DEBUG Output to pin PB8 */ + //GPIO_TOGGLE(PB8); + //GPIO_TOGGLE(PD10); + //GPIO_TOGGLE(PB14); + //uint16_t quickChange = PB14; + + //pal_lld_writepad(GPIOB, 14, ~quickChange); + // if (PB14 == 0) + // palSetLine(B14); + // else + // palClearLine(B14); + //palToggleLine(B14); + + OSAL_IRQ_EPILOGUE(); +} +#endif /* OSAL_ST_MODE == OSAL_ST_MODE_PERIODIC */ + +#if (OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING) || defined(__DOXYGEN__) +/** + * @brief TIM2 interrupt handler. + * @details This interrupt is used for system tick in free running mode. + * + * @isr + */ +OSAL_IRQ_HANDLER(ST_HANDLER) { + + OSAL_IRQ_PROLOGUE(); + + /* Note, under rare circumstances an interrupt can remain latched even if + the timer SR register has been cleared, in those cases the interrupt + is simply ignored.*/ + if (TIMER_GetIntFlag(NUC123_ST_TIM)) { + TIMER_ClearIntFlag(NUC123_ST_TIM); + + osalSysLockFromISR(); + osalOsTimerHandlerI(); + osalSysUnlockFromISR(); + } + + /* DEBUG Output to pin PC13 */ + //GPIO_TOGGLE(PB8); + //GPIO_TOGGLE(PD11); + + OSAL_IRQ_EPILOGUE(); +} +#endif /* OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING */ + +/* DEBUG - Catch unused Interrupt Vectors and output to test pins + +OSAL_IRQ_HANDLER(Vector7C){ + OSAL_IRQ_PROLOGUE(); + + GPIO_TOGGLE(PB8); + GPIO_TOGGLE(PB11); + + OSAL_IRQ_EPILOGUE(); +} + +OSAL_IRQ_HANDLER(NUC123_TIM3_HANDLER){ + + OSAL_IRQ_PROLOGUE(); + + GPIO_TOGGLE(PB4); + GPIO_TOGGLE(PB5); + GPIO_TOGGLE(PB6); + GPIO_TOGGLE(PB7); + GPIO_TOGGLE(PB8); + + OSAL_IRQ_EPILOGUE(); +} + +OSAL_IRQ_HANDLER(NUC123_TIM4_HANDLER){ + + OSAL_IRQ_PROLOGUE(); + + GPIO_TOGGLE(PB4); + GPIO_TOGGLE(PB5); + GPIO_TOGGLE(PB6); + GPIO_TOGGLE(PB7); + GPIO_TOGGLE(PB8); + + OSAL_IRQ_EPILOGUE(); +} + +OSAL_IRQ_HANDLER(NUC123_ADC_HANDLER){ + + OSAL_IRQ_PROLOGUE(); + + GPIO_TOGGLE(PB4); + GPIO_TOGGLE(PB5); + GPIO_TOGGLE(PB6); + GPIO_TOGGLE(PB7); + GPIO_TOGGLE(PB8); + + OSAL_IRQ_EPILOGUE(); +} + +OSAL_IRQ_HANDLER(NUC123_USB1_HANDLER){ + + OSAL_IRQ_PROLOGUE(); + + GPIO_TOGGLE(PB4); + GPIO_TOGGLE(PB5); + GPIO_TOGGLE(PB6); + GPIO_TOGGLE(PB7); + GPIO_TOGGLE(PB8); + + OSAL_IRQ_EPILOGUE(); +} + +OSAL_IRQ_HANDLER(NUC123_PDMA_HANDLER){ + + OSAL_IRQ_PROLOGUE(); + + GPIO_TOGGLE(PB4); + GPIO_TOGGLE(PB5); + GPIO_TOGGLE(PB6); + GPIO_TOGGLE(PB7); + GPIO_TOGGLE(PB8); + + OSAL_IRQ_EPILOGUE(); +} + +//OSAL_IRQ_HANDLER(HardFault_Handler){ +// OSAL_IRQ_PROLOGUE(); + +// NVIC_SystemReset(); + +// OSAL_IRQ_EPILOGUE(); +//} +*/ + +/*===========================================================================*/ +/* Driver exported functions. */ +/*===========================================================================*/ + +/** + * @brief Low level ST driver initialization. + * + * @notapi + */ +void st_lld_init(void) { + + //GPIO_SetMode(PB, BIT6, GPIO_PMD_OUTPUT); + //PB6 = 1; + +#if OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING + /* Free running counter mode.*/ + + /* Enabling timer clock.*/ + //ST_ENABLE_CLOCK(); + //GPIO_SetMode(PB, BIT7, GPIO_PMD_OUTPUT); + //PB7 = 1; + + TIMER_Open(ST_USE_TIMER, TIMER_CONTINUOUS_MODE, OSAL_ST_FREQUENCY); + + /* Initializing the counter in free running mode.*/ +/* NUC123_ST_TIM->PSC = (ST_CLOCK_SRC / OSAL_ST_FREQUENCY) - 1; + NUC123_ST_TIM->ARR = ST_ARR_INIT; + NUC123_ST_TIM->CCMR1 = 0; + NUC123_ST_TIM->CCR[0] = 0; + NUC123_ST_TIM->DIER = 0; + NUC123_ST_TIM->CR2 = 0; + NUC123_ST_TIM->EGR = TIM_EGR_UG; + NUC123_ST_TIM->CR1 = TIM_CR1_CEN; +*/ + /* IRQ enabled.*/ + nvicEnableVector(ST_NUMBER, NUC123_ST_IRQ_PRIORITY); + + TIMER_EnableInt(ST_USE_TIMER); + + /* Start the Timer! */ + TIMER_Start(ST_USE_TIMER); +#endif /* OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING */ + +#if OSAL_ST_MODE == OSAL_ST_MODE_PERIODIC + /* Periodic systick mode, the Cortex-Mx internal systick timer is used + in this mode.*/ + +// GPIO_SetMode(PB, BIT8, GPIO_PMD_OUTPUT); +// PB8 = 1; + + // CLK_EnableSysTick(CLK_CLKSEL0_STCLK_S_HCLK, (NUC123_HCLK / OSAL_ST_FREQUENCY) - 1); + SysTick->LOAD = (NUC123_HCLK / OSAL_ST_FREQUENCY) - 1; + SysTick->VAL = 0; + SysTick->CTRL = (~SysTick_CTRL_CLKSOURCE_Msk) & + (SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk); + + /* IRQ enabled.*/ + nvicSetSystemHandlerPriority(HANDLER_SYSTICK, NUC123_ST_IRQ_PRIORITY); + +#endif /* OSAL_ST_MODE == OSAL_ST_MODE_PERIODIC */ + +/* DEBUG */ + +// TIMER_Open(TIMER3, TIMER_CONTINUOUS_MODE, OSAL_ST_FREQUENCY); + +// nvicEnableVector(NUC123_TIM3_NUMBER, 0); + +// TIMER_EnableInt(TIMER3); +// TIMER_Start(TIMER3); + +// /* Enable peripheral clock */ +// CLK_EnableModuleClock(UART0_MODULE); +// CLK_EnableModuleClock(USBD_MODULE); +// CLK_EnableModuleClock(TMR0_MODULE); +// CLK_EnableModuleClock(TMR1_MODULE); +// CLK_EnableModuleClock(TMR2_MODULE); +// CLK_EnableModuleClock(TMR3_MODULE); +// // +// /* Peripheral clock source */ +// // CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_PLL, CLK_CLKDIV_UART(1)); +// CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0_S_HXT, 0); +// CLK_SetModuleClock(TMR1_MODULE, CLK_CLKSEL1_TMR1_S_HIRC, 0); +// CLK_SetModuleClock(TMR2_MODULE, CLK_CLKSEL1_TMR2_S_HCLK, 0); +// CLK_SetModuleClock(TMR3_MODULE, CLK_CLKSEL1_TMR3_S_LIRC, 0); + +} + +#else /* OSAL_ST_MODE == OSAL_ST_MODE_NONE!!! */ + #error "We can't proceed without an OSAL_ST clock!" + +#endif /* OSAL_ST_MODE != OSAL_ST_MODE_NONE */ + +/** @} */ diff --git a/os/hal/ports/NUMICRO/LLD/TIMv1/hal_st_lld.h b/os/hal/ports/NUMICRO/LLD/TIMv1/hal_st_lld.h new file mode 100644 index 00000000..d1d68ced --- /dev/null +++ b/os/hal/ports/NUMICRO/LLD/TIMv1/hal_st_lld.h @@ -0,0 +1,200 @@ +/* + Copyright (C) 2019 /u/KeepItUnder + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file hal_st_lld.h + * @brief ST Driver subsystem low level driver header. + * @details This header is designed to be include-able without having to + * include other files from the HAL. + * + * @addtogroup ST + * @{ + */ + +#ifndef HAL_ST_LLD_H +#define HAL_ST_LLD_H + +#include "mcuconf.h" +//#include "nuc123_tim.h" + +/* + * Registry definitions. + */ +#include "nuc123_registry.h" + +/*===========================================================================*/ +/* Driver constants. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver pre-compile time settings. */ +/*===========================================================================*/ + +/** + * @name Configuration options + * @{ + */ +/** + * @brief SysTick timer IRQ priority. + */ +#if !defined(NUC123_ST_IRQ_PRIORITY) || defined(__DOXYGEN__) +#define NUC123_ST_IRQ_PRIORITY 8 +#endif + +/** + * @brief TIMx unit (by number) to be used for free running operations. + * @note You must select a 32 bits timer if a 32 bits @p systick_t type + * is required. + * @note Timers 2, 3 and 4 are supported. + */ +#if !defined(NUC123_ST_USE_TIMER) || defined(__DOXYGEN__) +#define NUC123_ST_USE_TIMER 2 +#endif +/** @} */ + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +#if NUC123_ST_USE_TIMER == 2 +#if !NUC123_HAS_TIM2 +#error "TIM2 not present" +#endif +#define NUC123_ST_TIM TIMER1 + +#elif NUC123_ST_USE_TIMER == 3 +#if !NUC123_HAS_TIM3 +#error "TIM3 not present" +#endif +#define NUC123_ST_TIM TIMER2 + +#elif NUC123_ST_USE_TIMER == 4 +#if !NUC123_HAS_TIM4 +#error "TIM4 not present" +#endif +#define NUC123_ST_TIM TIMER3 + +#else +#error "NUC123_ST_USE_TIMER specifies an unsupported timer" +#endif + +/*===========================================================================*/ +/* Driver data structures and types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver macros. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#ifdef __cplusplus +extern "C" { +#endif + void st_lld_init(void); +#ifdef __cplusplus +} +#endif + +/*===========================================================================*/ +/* Driver inline functions. */ +/*===========================================================================*/ + +/** + * @brief Returns the time counter value. + * + * @return The counter value. + * + * @notapi + */ +static inline systime_t st_lld_get_counter(void) { + + return (systime_t)NUC123_ST_TIM->TDR; +} + +/** + * @brief Starts the alarm. + * @note Makes sure that no spurious alarms are triggered after + * this call. + * + * @param[in] time the time to be set for the first alarm + * + * @notapi + */ +static inline void st_lld_start_alarm(systime_t time) { + + //NUC123_ST_TIM->TCMP = (uint32_t)time; + //NUC123_ST_TIM->SR = 0; + //NUC123_ST_TIM->DIER = NUC123_TIM_DIER_CC1IE; + TIMER_Open(NUC123_ST_TIM, TIMER_CONTINUOUS_MODE | TIMER_TCSR_TDR_EN_Msk, TIMER_GetModuleClock(NUC123_ST_TIM)); + TIMER_SET_CMP_VALUE(NUC123_ST_TIM, (uint32_t)time); + TIMER_SET_PRESCALE_VALUE(NUC123_ST_TIM, 0); + TIMER_Start(NUC123_ST_TIM); +} + +/** + * @brief Stops the alarm interrupt. + * + * @notapi + */ +static inline void st_lld_stop_alarm(void) { + + TIMER_DisableInt(NUC123_ST_TIM); +} + +/** + * @brief Sets the alarm time. + * + * @param[in] time the time to be set for the next alarm + * + * @notapi + */ +static inline void st_lld_set_alarm(systime_t time) { + + TIMER_SET_CMP_VALUE(NUC123_ST_TIM, (uint32_t)time); +} + +/** + * @brief Returns the current alarm time. + * + * @return The currently set alarm time. + * + * @notapi + */ +static inline systime_t st_lld_get_alarm(void) { + + return (systime_t)NUC123_ST_TIM->TCMPR; +} + +/** + * @brief Determines if the alarm is active. + * + * @return The alarm status. + * @retval false if the alarm is not active. + * @retval true is the alarm is active + * + * @notapi + */ +static inline bool st_lld_is_alarm_active(void) { + + return (bool)((TIMER_GetIntFlag(NUC123_ST_TIM) & TIMER_IS_ACTIVE(NUC123_ST_TIM)) != 0); +} + +#endif /* HAL_ST_LLD_H */ + +/** @} */ diff --git a/os/hal/ports/NUMICRO/LLD/USBv1/driver.mk b/os/hal/ports/NUMICRO/LLD/USBv1/driver.mk new file mode 100644 index 00000000..5fb8fe88 --- /dev/null +++ b/os/hal/ports/NUMICRO/LLD/USBv1/driver.mk @@ -0,0 +1,9 @@ +ifeq ($(USE_SMART_BUILD),yes) +ifneq ($(findstring HAL_USE_USB TRUE,$(HALCONF)),) +PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c +endif +else +PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c +endif + +PLATFORMINC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/USBv1 diff --git a/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c b/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c new file mode 100644 index 00000000..d0b1f35a --- /dev/null +++ b/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c @@ -0,0 +1,570 @@ +/* + ChibiOS - Copyright (C) 2017 Frank Zschockelt + ChibiOS - Copyright (C) 2019 /u/KeepItUnder + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file hal_usb_lld.c + * @brief NUC123 USB subsystem low level driver source. + * + * @addtogroup USB + * @{ + */ + +#include "hal.h" + +#if (HAL_USE_USB == TRUE) || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Driver local definitions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver exported variables. */ +/*===========================================================================*/ + +/** + * @brief USB1 driver identifier. + */ +#if (NUC123_USB_USE_USB1 == TRUE) || defined(__DOXYGEN__) +USBDriver USBD1; +#endif + +/*===========================================================================*/ +/* Driver local variables and types. */ +/*===========================================================================*/ + +uint8_t * const usbd_sram = (uint8_t*)(USBD_BASE + 0x100); + +/** + * @brief EP0 state. + */ + /** + * @brief IN EP0 state. + */ + USBInEndpointState ep0_in; + /** + * @brief OUT EP0 state. + */ + USBOutEndpointState ep0_out; + +static uint8_t ep0setup_buffer[8]; + +/** + * @brief EP0 initialization structure. + */ +static const USBEndpointConfig ep0config = { + USB_EP_MODE_TYPE_CTRL, + _usb_ep0setup, + _usb_ep0in, + _usb_ep0out, + 0x40, + 0x40, + &ep0_in, + &ep0_out, + 1, + ep0setup_buffer +}; + +/*===========================================================================*/ +/* Driver local variables and types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local functions. */ +/*===========================================================================*/ +void _toggle_dsq(int ep, uint8_t *dsq) +{ + if (*dsq) { + USBD->EP[ep].CFG &= ~USBD_CFG_DSQ_SYNC_Msk; + } + else { + USBD->EP[ep].CFG |= USBD_CFG_DSQ_SYNC_Msk; + } + *dsq = !*dsq; +} + +/*===========================================================================*/ +/* Driver interrupt handlers and threads. */ +/*===========================================================================*/ + +static void serve_endpoint_irq(USBDriver *usbp, + uint32_t endpoint_mask, + uint32_t epstatus) +{ + for (int hwEp = 0; hwEp < USB_MAX_ENDPOINTS; hwEp++) { + if (endpoint_mask & (1 << hwEp)) { + uint32_t bus_status = ((epstatus >> (hwEp*(USBD_EPSTS_EPSTS1_Pos - USBD_EPSTS_EPSTS0_Pos))) & USBD_EPSTS_EPSTS0_Msk) >> USBD_EPSTS_EPSTS0_Pos; + usbep_t ep = (USBD->EP[hwEp].CFG & USBD_CFG_EP_NUM_Msk) >> USBD_CFG_EP_NUM_Pos; + + switch (bus_status) { + case 0: /* In ACK */ + { + USBInEndpointState *iesp = usbp->epc[ep]->in_state; + iesp->txcnt += USBD->EP[hwEp].MXPLD; + if (iesp->txcnt >= iesp->txsize) { + _usb_isr_invoke_in_cb(usbp, ep); + } + else { + uint32_t txcnt; + if ((iesp->txcnt + usbp->epc[ep]->in_maxsize) > iesp->txsize) { + txcnt = iesp->txsize - iesp->txcnt; + } + else { + txcnt = usbp->epc[ep]->in_maxsize; + } + for (uint32_t n = 0; n < txcnt; n++) { + usbd_sram[(USBD->EP[hwEp].BUFSEG) + n] = iesp->txbuf[iesp->txcnt + n]; + } + _toggle_dsq(hwEp, &(iesp->dsq)); + USBD->EP[hwEp].MXPLD = txcnt; + } + } + break; + case 0x1: /* In NAK */ + break; + case 0x2: /* Out Packet Data 0 ACK */ + case 0x6: /* Out Packet Data 1 ACK */ + { + USBOutEndpointState *oesp = usbp->epc[ep]->out_state; + for (uint32_t n = 0; n < USBD->EP[hwEp].MXPLD; n++) { + oesp->rxbuf[oesp->rxcnt] = usbd_sram[USBD->EP[hwEp].BUFSEG + n]; + oesp->rxcnt++; + } + if (oesp->rxcnt == oesp->rxsize) { + _usb_isr_invoke_out_cb(usbp, ep); + } + else { + _toggle_dsq(hwEp, &(oesp->dsq)); + if ((oesp->rxcnt + usbp->epc[ep]->out_maxsize) > oesp->rxsize) { + USBD->EP[hwEp].MXPLD = oesp->rxsize - oesp->rxcnt; + } + else { + USBD->EP[hwEp].MXPLD = usbp->epc[ep]->out_maxsize; + } + } + } + break; + case 0x3: /* Setup ACK */ + break; + case 0x7: /* Isochronous transfer end */ + default: + osalDbgAssert(FALSE, "not supported"); + } + } + } +} + +static void serve_usb_irq(USBDriver *usbp) { + uint32_t intsts = USBD->INTSTS; + uint32_t epsts = USBD->EPSTS; + + if (intsts & USBD_INTSTS_FLDET_STS_Msk) { + USBD->INTSTS |= USBD_INTSTS_FLDET_STS_Msk; + if (USBD->FLDET) { + usbConnectBus(usbp); + } + else { + usbDisconnectBus(usbp); + } + } + + if (intsts & USBD_INTSTS_BUS_STS_Msk) { + uint32_t bus_attr = USBD->ATTR; + USBD->INTSTS |= USBD_INTSTS_BUS_STS_Msk; + if (bus_attr & USBD_ATTR_USBRST_Msk) { + _usb_reset(usbp); + } + if (bus_attr & USBD_ATTR_SUSPEND_Msk) { + if (usbp->state == USB_ACTIVE) { + _usb_suspend(usbp); + } + } + if (bus_attr & USBD_ATTR_RESUME_Msk) { + usbConnectBus(usbp); + (usbp)->receiving = 0; + (usbp)->transmitting = 0; + _usb_wakeup(usbp); + } + } + + if (intsts & USBD_INTSTS_USB_STS_Msk) { + /* check endpoints first */ + serve_endpoint_irq(usbp, (intsts & USBD_INTSTS_EPEVT_Msk) >> USBD_INTSTS_EPEVT_Pos, epsts); + USBD->INTSTS = intsts & USBD_INTSTS_EPEVT_Msk; + /* then handle setup packets */ + if (intsts & USBD_INTSTS_SETUP_Msk) { + USBD->INTSTS |= USBD_INTSTS_SETUP_Msk; + USBInEndpointState *iesp = usbp->epc[0]->in_state; + iesp->dsq = 0; + _usb_isr_invoke_setup_cb(usbp, 0); + } + } + if (intsts & USBD_INTSTS_WAKEUP_STS_Msk) { + USBD->INTSTS |= USBD_INTSTS_WAKEUP_STS_Msk; + USBD->ATTR |= USBD_ATTR_PHY_EN_Msk; + } +} + +OSAL_IRQ_HANDLER(NUC123_USB1_HANDLER) { + OSAL_IRQ_PROLOGUE(); + serve_usb_irq(&USBD1); + OSAL_IRQ_EPILOGUE(); +} + +/*===========================================================================*/ +/* Driver exported functions. */ +/*===========================================================================*/ + +/** + * @brief Low level USB driver initialization. + * + * @notapi + */ +void usb_lld_init(void) { + +#if NUC123_USB_USE_USB1 == TRUE + /* Driver initialization.*/ + usbObjectInit(&USBD1); +#endif +} + +/** + * @brief Configures and activates the USB peripheral. + * + * @param[in] usbp pointer to the @p USBDriver object + * + * @notapi + */ +void usb_lld_start(USBDriver *usbp) { + if (usbp->state == USB_STOP) { + /* Enables the peripheral.*/ +#if NUC123_USB_USE_USB1 == TRUE + if (&USBD1 == usbp) { + uint16_t delay; + /* Enable USB Clock */ + UNLOCKREG(); + CLK->APBCLK |= CLK_APBCLK_USBD_EN_Msk; + + /* Reset USB */ + SYS->IPRSTC2 |= SYS_IPRSTC2_USBD_RST_Msk; + for (delay=0x100; delay > 0; delay--); + SYS->IPRSTC2 &= ~SYS_IPRSTC2_USBD_RST_Msk; + LOCKREG(); + + usbConnectBus(usbp); + USBD->ATTR = (USBD_ATTR_BYTEM_Msk | USBD_ATTR_PWRDN_Msk | + USBD_ATTR_DPPU_EN_Msk |USBD_ATTR_USB_EN_Msk | + USBD_ATTR_PHY_EN_Msk); + + + USBD->DRVSE0 = 1u; + for (delay=0x100; delay > 0; delay--); + USBD->DRVSE0 = 0u; + + USBD->INTSTS = USBD->INTSTS; + + nvicEnableVector(NUC123_USB1_NUMBER, NUC123_USB_USB1_IRQ_PRIORITY); + + USBD->INTEN = (USBD_INTEN_WAKEUP_EN_Msk | + USBD_INTEN_WAKEUP_IE_Msk | + USBD_INTEN_FLDET_IE_Msk | + USBD_INTEN_USB_IE_Msk | + USBD_INTEN_BUS_IE_Msk); + } +#endif + } +} + +/** + * @brief Deactivates the USB peripheral. + * + * @param[in] usbp pointer to the @p USBDriver object + * + * @notapi + */ +void usb_lld_stop(USBDriver *usbp) { + if (usbp->state == USB_READY) { + /* Resets the peripheral.*/ + /* Disables the peripheral.*/ +#if NUC123_USB_USE_USB1 == TRUE + if (&USBD1 == usbp) { + + } +#endif + } +} + +/** + * @brief USB low level reset routine. + * + * @param[in] usbp pointer to the @p USBDriver object + * + * @notapi + */ +void usb_lld_reset(USBDriver *usbp) { + /* Post reset initialization.*/ + /* EP0 initialization.*/ + usbp->epc[0] = &ep0config; + /* NUC123 has 512b SRAM for EP-buffers; the first 8b are reserved for setup packets */ + usbp->bufnext = 8; + usbp->epnext = 0; + + usb_lld_init_endpoint(usbp, 0); + usbConnectBus(usbp); + USBD->FADDR = 0; +} + +/** + * @brief Sets the USB address. + * + * @param[in] usbp pointer to the @p USBDriver object + * + * @notapi + */ +void usb_lld_set_address(USBDriver *usbp) { + USBD->FADDR = usbp->address; +} + +uint32_t usb_alloc_buf(USBDriver *usbp, size_t size) { + uint32_t buf; + buf = usbp->bufnext; + usbp->bufnext += size; + osalDbgAssert(usbp->bufnext <= 512, "usb buffer space full"); + return buf; +} + + +/** + * @brief Enables an endpoint. + * + * @param[in] usbp pointer to the @p USBDriver object + * @param[in] ep endpoint number + * + * @notapi + */ +void usb_lld_init_endpoint(USBDriver *usbp, usbep_t ep) { + const USBEndpointConfig *epcp = usbp->epc[ep]; + uint8_t hwep; + + + if (epcp->in_state != NULL) { + hwep = usbp->epnext; + usbp->epnext += 1; + osalDbgAssert(usbp->epnext <= USB_MAX_ENDPOINTS, "No endpoints left"); + + USBD->EP[hwep].BUFSEG = usb_alloc_buf(usbp, epcp->in_maxsize); + if (epcp->ep_mode == USB_EP_MODE_TYPE_CTRL) + /* 2 == in */ + USBD->EP[hwep].CFG = (ep << USBD_CFG_EP_NUM_Pos) | (2 << USBD_CFG_STATE_Pos) | USBD_CFG_CSTALL_Msk; + else + USBD->EP[hwep].CFG = (ep << USBD_CFG_EP_NUM_Pos) | (2 << USBD_CFG_STATE_Pos); + epcp->in_state->hwEp = hwep; + } + + if (epcp->out_state != NULL) { + hwep = usbp->epnext; + usbp->epnext += 1; + osalDbgAssert(usbp->epnext <= USB_MAX_ENDPOINTS, "No endpoints left"); + + USBD->EP[hwep].BUFSEG = usb_alloc_buf(usbp, epcp->out_maxsize); + if (epcp->ep_mode == USB_EP_MODE_TYPE_CTRL) + /* 1 == Out */ + USBD->EP[hwep].CFG = (ep << USBD_CFG_EP_NUM_Pos) | (1 << USBD_CFG_STATE_Pos) | USBD_CFG_CSTALL_Msk; + else + USBD->EP[hwep].CFG = (ep << USBD_CFG_EP_NUM_Pos) | (1 << USBD_CFG_STATE_Pos); + epcp->out_state->hwEp = hwep; + } + +} + +/** + * @brief Disables all the active endpoints except the endpoint zero. + * + * @param[in] usbp pointer to the @p USBDriver object + * + * @notapi + */ +void usb_lld_disable_endpoints(USBDriver *usbp) { + (void)usbp; + + for (int i = 0; i < USB_MAX_ENDPOINTS; i++) { + USBD->EP[i].CFGP |= USBD_CFGP_CLRRDY_Msk; + USBD->EP[i].CFG &= ~USBD_CFG_STATE_Msk; + } +} + +/** + * @brief Returns the status of an OUT endpoint. + * + * @param[in] usbp pointer to the @p USBDriver object + * @param[in] ep endpoint number + * @return The endpoint status. + * @retval EP_STATUS_DISABLED The endpoint is not active. + * @retval EP_STATUS_STALLED The endpoint is stalled. + * @retval EP_STATUS_ACTIVE The endpoint is active. + * + * @notapi + */ +usbepstatus_t usb_lld_get_status_out(USBDriver *usbp, usbep_t ep) { + (void)usbp; + (void)ep; + + return EP_STATUS_DISABLED; +} + +/** + * @brief Returns the status of an IN endpoint. + * + * @param[in] usbp pointer to the @p USBDriver object + * @param[in] ep endpoint number + * @return The endpoint status. + * @retval EP_STATUS_DISABLED The endpoint is not active. + * @retval EP_STATUS_STALLED The endpoint is stalled. + * @retval EP_STATUS_ACTIVE The endpoint is active. + * + * @notapi + */ +usbepstatus_t usb_lld_get_status_in(USBDriver *usbp, usbep_t ep) { + return EP_STATUS_DISABLED; +} + +/** + * @brief Reads a setup packet from the dedicated packet buffer. + * @details This function must be invoked in the context of the @p setup_cb + * callback in order to read the received setup packet. + * @pre In order to use this function the endpoint must have been + * initialized as a control endpoint. + * @post The endpoint is ready to accept another packet. + * + * @param[in] usbp pointer to the @p USBDriver object + * @param[in] ep endpoint number + * @param[out] buf buffer where to copy the packet data + * + * @notapi + */ +void usb_lld_read_setup(USBDriver *usbp, usbep_t ep, uint8_t *buf) { + (void)usbp; + (void)ep; + int i; + for (i = 0; i < 8; i++) { + *buf = usbd_sram[i]; + //*buf = ep0setup_buffer[i]; + ep0setup_buffer[i] = usbd_sram[i]; + buf += 1; + } +} + + +/** + * @brief Starts a receive operation on an OUT endpoint. + * + * @param[in] usbp pointer to the @p USBDriver object + * @param[in] ep endpoint number + * + * @notapi + */ +void usb_lld_start_out(USBDriver *usbp, usbep_t ep) { + uint32_t rxcnt; + USBOutEndpointState *oesp = usbp->epc[ep]->out_state; + if (oesp->rxsize > usbp->epc[ep]->out_maxsize) { + rxcnt = usbp->epc[ep]->out_maxsize; + } + else { + rxcnt = oesp->rxsize; + } + _toggle_dsq(oesp->hwEp, &(oesp->dsq)); + USBD->EP[oesp->hwEp].MXPLD = rxcnt; +} + +/** + * @brief Starts a transmit operation on an IN endpoint. + * + * @param[in] usbp pointer to the @p USBDriver object + * @param[in] ep endpoint number + * + * @notapi + */ +void usb_lld_start_in(USBDriver *usbp, usbep_t ep) { + uint32_t i, txcnt; + USBInEndpointState *iesp = usbp->epc[ep]->in_state; + if (iesp->txsize > usbp->epc[ep]->in_maxsize) { + txcnt = usbp->epc[ep]->in_maxsize; + } + else { + txcnt = iesp->txsize; + } + for (i = 0; i < txcnt; i++) { + usbd_sram[(USBD->EP[iesp->hwEp].BUFSEG) + i] = iesp->txbuf[i]; + } + _toggle_dsq(iesp->hwEp, &(iesp->dsq)); + USBD->EP[iesp->hwEp].MXPLD = txcnt; +} + +/** + * @brief Brings an OUT endpoint in the stalled state. + * + * @param[in] usbp pointer to the @p USBDriver object + * @param[in] ep endpoint number + * + * @notapi + */ +void usb_lld_stall_out(USBDriver *usbp, usbep_t ep) { + USBOutEndpointState *oesp = usbp->epc[ep]->out_state; + USBD->EP[oesp->hwEp].CFGP |= (USBD_CFGP_SSTALL_Msk | USBD_CFGP_CLRRDY_Msk); +} + +/** + * @brief Brings an IN endpoint in the stalled state. + * + * @param[in] usbp pointer to the @p USBDriver object + * @param[in] ep endpoint number + * + * @notapi + */ +void usb_lld_stall_in(USBDriver *usbp, usbep_t ep) { + USBInEndpointState *iesp = usbp->epc[ep]->in_state; + USBD->EP[iesp->hwEp].CFGP |= (USBD_CFGP_SSTALL_Msk | USBD_CFGP_CLRRDY_Msk); +} + +/** + * @brief Brings an OUT endpoint in the active state. + * + * @param[in] usbp pointer to the @p USBDriver object + * @param[in] ep endpoint number + * + * @notapi + */ +void usb_lld_clear_out(USBDriver *usbp, usbep_t ep) { + USBOutEndpointState *oesp = usbp->epc[ep]->out_state; + USBD->EP[oesp->hwEp].CFGP &= ~USBD_CFGP_SSTALL_Msk; +} + +/** + * @brief Brings an IN endpoint in the active state. + * + * @param[in] usbp pointer to the @p USBDriver object + * @param[in] ep endpoint number + * + * @notapi + */ +void usb_lld_clear_in(USBDriver *usbp, usbep_t ep) { + USBInEndpointState *iesp = usbp->epc[ep]->in_state; + USBD->EP[iesp->hwEp].CFGP &= ~USBD_CFGP_SSTALL_Msk; +} + +#endif /* HAL_USE_USB == TRUE */ + +/** @} */ diff --git a/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.h b/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.h new file mode 100644 index 00000000..5acc2973 --- /dev/null +++ b/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.h @@ -0,0 +1,425 @@ +/* + ChibiOS - Copyright (C) 2017 Frank Zschockelt + ChibiOS - Copyright (C) 2019 /u/KeepItUnder + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file hal_usb_lld.h + * @brief NUC123 USB subsystem low level driver header. + * + * @addtogroup USB + * @{ + */ + +#ifndef HAL_USB_LLD_H +#define HAL_USB_LLD_H + +#if (HAL_USE_USB == TRUE) || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Driver constants. */ +/*===========================================================================*/ + +/** + * @brief Maximum endpoint address. + */ +#define USB_MAX_ENDPOINTS 8 + +/** + * @brief Status stage handling method. + */ +#define USB_EP0_STATUS_STAGE USB_EP0_STATUS_STAGE_SW + +/** + * @brief The address can be changed immediately upon packet reception. + */ +#define USB_SET_ADDRESS_MODE USB_LATE_SET_ADDRESS + +/** + * @brief Method for set address acknowledge. + */ +#define USB_SET_ADDRESS_ACK_HANDLING USB_SET_ADDRESS_ACK_SW + +/*===========================================================================*/ +/* Driver pre-compile time settings. */ +/*===========================================================================*/ + +/** + * @name NUC123 configuration options + * @{ + */ +/** + * @brief USB driver enable switch. + * @details If set to @p TRUE the support for USB1 is included. + * @note The default is @p FALSE. + */ +#if !defined(NUC123_USB_USE_USB1) || defined(__DOXYGEN__) +#define NUC123_USB_USE_USB1 FALSE +#endif + +/** + * @brief USB interrupt priority level setting. + */ +#if !defined(NUC123_USB_USB1_IRQ_PRIORITY) || defined(__DOXYGEN__) +#define NUC123_USB_USB1_IRQ_PRIORITY 2 +#endif + +/** + * @brief Host wake-up procedure duration. + */ +#if !defined(USB_HOST_WAKEUP_DURATION) || defined(__DOXYGEN__) +#define USB_HOST_WAKEUP_DURATION 2 +#endif + +/** @} */ + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +#if (USB_HOST_WAKEUP_DURATION < 2) || (USB_HOST_WAKEUP_DURATION > 15) +#error "invalid USB_HOST_WAKEUP_DURATION setting, it must be between 2 and 15" +#endif + +/*===========================================================================*/ +/* Driver data structures and types. */ +/*===========================================================================*/ + +/** + * @brief Type of an IN endpoint state structure. + */ +typedef struct { + /** + * @brief Requested transmit transfer size. + */ + size_t txsize; + /** + * @brief Transmitted bytes so far. + */ + size_t txcnt; + /** + * @brief Pointer to the transmission linear buffer. + */ + const uint8_t *txbuf; +#if (USB_USE_WAIT == TRUE) || defined(__DOXYGEN__) + /** + * @brief Waiting thread. + */ + thread_reference_t thread; +#endif + /* End of the mandatory fields.*/ + uint8_t hwEp; + uint8_t dsq; +} USBInEndpointState; + +/** + * @brief Type of an OUT endpoint state structure. + */ +typedef struct { + /** + * @brief Requested receive transfer size. + */ + size_t rxsize; + /** + * @brief Received bytes so far. + */ + size_t rxcnt; + /** + * @brief Pointer to the receive linear buffer. + */ + uint8_t *rxbuf; +#if (USB_USE_WAIT == TRUE) || defined(__DOXYGEN__) + /** + * @brief Waiting thread. + */ + thread_reference_t thread; +#endif + /* End of the mandatory fields.*/ + uint8_t hwEp; + uint8_t dsq; +} USBOutEndpointState; + +/** + * @brief Type of an USB endpoint configuration structure. + * @note Platform specific restrictions may apply to endpoints. + */ +typedef struct { + /** + * @brief Type and mode of the endpoint. + */ + uint32_t ep_mode; + /** + * @brief Setup packet notification callback. + * @details This callback is invoked when a setup packet has been + * received. + * @post The application must immediately call @p usbReadPacket() in + * order to access the received packet. + * @note This field is only valid for @p USB_EP_MODE_TYPE_CTRL + * endpoints, it should be set to @p NULL for other endpoint + * types. + */ + usbepcallback_t setup_cb; + /** + * @brief IN endpoint notification callback. + * @details This field must be set to @p NULL if the IN endpoint is not + * used. + */ + usbepcallback_t in_cb; + /** + * @brief OUT endpoint notification callback. + * @details This field must be set to @p NULL if the OUT endpoint is not + * used. + */ + usbepcallback_t out_cb; + /** + * @brief IN endpoint maximum packet size. + * @details This field must be set to zero if the IN endpoint is not + * used. + */ + uint16_t in_maxsize; + /** + * @brief OUT endpoint maximum packet size. + * @details This field must be set to zero if the OUT endpoint is not + * used. + */ + uint16_t out_maxsize; + /** + * @brief @p USBEndpointState associated to the IN endpoint. + * @details This structure maintains the state of the IN endpoint. + */ + USBInEndpointState *in_state; + /** + * @brief @p USBEndpointState associated to the OUT endpoint. + * @details This structure maintains the state of the OUT endpoint. + */ + USBOutEndpointState *out_state; + /* End of the mandatory fields.*/ + /** + * @brief Reserved field, not currently used. + * @note Initialize this field to 1 in order to be forward compatible. + */ + uint16_t ep_buffers; + /** + * @brief Pointer to a buffer for setup packets. + * @details Setup packets require a dedicated 8-bytes buffer, set this + * field to @p NULL for non-control endpoints. + */ + uint8_t *setup_buf; +} USBEndpointConfig; + +/** + * @brief Type of an USB driver configuration structure. + */ +typedef struct { + /** + * @brief USB events callback. + * @details This callback is invoked when an USB driver event is registered. + */ + usbeventcb_t event_cb; + /** + * @brief Device GET_DESCRIPTOR request callback. + * @note This callback is mandatory and cannot be set to @p NULL. + */ + usbgetdescriptor_t get_descriptor_cb; + /** + * @brief Requests hook callback. + * @details This hook allows to be notified of standard requests or to + * handle non standard requests. + */ + usbreqhandler_t requests_hook_cb; + /** + * @brief Start Of Frame callback. + */ + usbcallback_t sof_cb; + /* End of the mandatory fields.*/ +} USBConfig; + +/** + * @brief Structure representing an USB driver. + */ +struct USBDriver { + /** + * @brief Driver state. + */ + usbstate_t state; + /** + * @brief Current configuration data. + */ + const USBConfig *config; + /** + * @brief Bit map of the transmitting IN endpoints. + */ + uint16_t transmitting; + /** + * @brief Bit map of the receiving OUT endpoints. + */ + uint16_t receiving; + /** + * @brief Active endpoints configurations. + */ + const USBEndpointConfig *epc[USB_MAX_ENDPOINTS + 1]; + /** + * @brief Fields available to user, it can be used to associate an + * application-defined handler to an IN endpoint. + * @note The base index is one, the endpoint zero does not have a + * reserved element in this array. + */ + void *in_params[USB_MAX_ENDPOINTS]; + /** + * @brief Fields available to user, it can be used to associate an + * application-defined handler to an OUT endpoint. + * @note The base index is one, the endpoint zero does not have a + * reserved element in this array. + */ + void *out_params[USB_MAX_ENDPOINTS]; + /** + * @brief Endpoint 0 state. + */ + usbep0state_t ep0state; + /** + * @brief Next position in the buffer to be transferred through endpoint 0. + */ + uint8_t *ep0next; + /** + * @brief Number of bytes yet to be transferred through endpoint 0. + */ + size_t ep0n; + /** + * @brief Endpoint 0 end transaction callback. + */ + usbcallback_t ep0endcb; + /** + * @brief Setup packet buffer. + */ + uint8_t setup[8]; + /** + * @brief Current USB device status. + */ + uint16_t status; + /** + * @brief Assigned USB address. + */ + uint8_t address; + /** + * @brief Current USB device configuration. + */ + uint8_t configuration; + /** + * @brief State of the driver when a suspend happened. + */ + usbstate_t saved_state; +#if defined(USB_DRIVER_EXT_FIELDS) + USB_DRIVER_EXT_FIELDS +#endif + /* End of the mandatory fields.*/ + uint32_t bufnext; + uint8_t epnext; +}; + +/*===========================================================================*/ +/* Driver macros. */ +/*===========================================================================*/ + +/** + * @brief Returns the current frame number. + * + * @param[in] usbp pointer to the @p USBDriver object + * @return The current frame number. + * + * @notapi + */ +#define usb_lld_get_frame_number(usbp) 0 + +/** + * @brief Returns the exact size of a receive transaction. + * @details The received size can be different from the size specified in + * @p usbStartReceiveI() because the last packet could have a size + * different from the expected one. + * @pre The OUT endpoint must have been configured in transaction mode + * in order to use this function. + * + * @param[in] usbp pointer to the @p USBDriver object + * @param[in] ep endpoint number + * @return Received data size. + * + * @notapi + */ +#define usb_lld_get_transaction_size(usbp, ep) \ + ((usbp)->epc[ep]->out_state->rxcnt) + +/** + * @brief Connects the USB device. + * + * @api + */ +#define usb_lld_connect_bus(usbp) (USBD->ATTR |= USBD_ATTR_USB_EN_Msk | USBD_ATTR_PHY_EN_Msk) + +/** + * @brief Disconnect the USB device. + * + * @api + */ +#define usb_lld_disconnect_bus(usbp) (USBD->ATTR &= ~USBD_ATTR_USB_EN_Msk) + +/** + * @brief Start of host wake-up procedure. + * + * @notapi + */ +#define usb_lld_wakeup_host(usbp) \ + do{ \ + USBD->ATTR |= USBD_ATTR_RWAKEUP_Msk; \ + osalThreadSleepMilliseconds(USB_HOST_WAKEUP_DURATION); \ + USBD->ATTR &= ~USBD_ATTR_RWAKEUP_Msk; \ + } while (false) + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#if (NUC123_USB_USE_USB1 == TRUE) && !defined(__DOXYGEN__) +extern USBDriver USBD1; +#endif + +#ifdef __cplusplus +extern "C" { +#endif + void usb_lld_init(void); + void usb_lld_start(USBDriver *usbp); + void usb_lld_stop(USBDriver *usbp); + void usb_lld_reset(USBDriver *usbp); + void usb_lld_set_address(USBDriver *usbp); + void usb_lld_init_endpoint(USBDriver *usbp, usbep_t ep); + void usb_lld_disable_endpoints(USBDriver *usbp); + usbepstatus_t usb_lld_get_status_in(USBDriver *usbp, usbep_t ep); + usbepstatus_t usb_lld_get_status_out(USBDriver *usbp, usbep_t ep); + void usb_lld_read_setup(USBDriver *usbp, usbep_t ep, uint8_t *buf); + void usb_lld_prepare_receive(USBDriver *usbp, usbep_t ep); + void usb_lld_prepare_transmit(USBDriver *usbp, usbep_t ep); + void usb_lld_start_out(USBDriver *usbp, usbep_t ep); + void usb_lld_start_in(USBDriver *usbp, usbep_t ep); + void usb_lld_stall_out(USBDriver *usbp, usbep_t ep); + void usb_lld_stall_in(USBDriver *usbp, usbep_t ep); + void usb_lld_clear_out(USBDriver *usbp, usbep_t ep); + void usb_lld_clear_in(USBDriver *usbp, usbep_t ep); +#ifdef __cplusplus +} +#endif + +#endif /* HAL_USE_USB == TRUE */ + +#endif /* HAL_USB_LLD_H */ + +/** @} */ diff --git a/os/hal/ports/NUMICRO/NUC123SD4AN0/hal_lld.c b/os/hal/ports/NUMICRO/NUC123SD4AN0/hal_lld.c new file mode 100644 index 00000000..9e2b5946 --- /dev/null +++ b/os/hal/ports/NUMICRO/NUC123SD4AN0/hal_lld.c @@ -0,0 +1,257 @@ +/* + Copyright (C) 2019 /u/KeepItUnder + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file NUC123SD4AN0/hal_lld.c + * @brief NUC123SD4AN0 HAL subsystem low level driver source. + * + * @addtogroup HAL + * @{ + */ + +#include "hal.h" + +/*===========================================================================*/ +/* Driver local definitions. */ +/*===========================================================================*/ + +#define NUC123_PLLXTPRE_OFFSET 17 /**< PLLXTPRE offset */ +#define NUC123_PLLXTPRE_MASK 0x01 /**< PLLXTPRE mask */ + +/*===========================================================================*/ +/* Driver exported variables. */ +/*===========================================================================*/ + +/** + * @brief CMSIS system core clock variable. + * @note It is declared in system_NUC123SD4AN0.h. + */ +//uint32_t SystemCoreClock = NUC123_HCLK; + +/*===========================================================================*/ +/* Driver local variables and types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local functions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver interrupt handlers. */ +/*===========================================================================*/ + +#if defined(NUC123_DMA_REQUIRED) || defined(__DOXYGEN__) +#if defined(NUC123_DMA1_CH23_HANDLER) || defined(__DOXYGEN__) +/** + * @brief DMA1 streams 2 and 3 shared ISR. + * @note It is declared here because this device has a non-standard + * DMA shared IRQ handler. + * + * @isr + */ +OSAL_IRQ_HANDLER(NUC123_DMA1_CH23_HANDLER) { + + OSAL_IRQ_PROLOGUE(); + + /* Check on channel 2.*/ + dmaServeInterrupt(NUC123_DMA1_STREAM2); + + /* Check on channel 3.*/ + dmaServeInterrupt(NUC123_DMA1_STREAM3); + + OSAL_IRQ_EPILOGUE(); +} +#endif /* defined(NUC123_DMA1_CH23_HANDLER) */ + +#if defined(NUC123_DMA1_CH4567_HANDLER) || defined(__DOXYGEN__) +/** + * @brief DMA1 streams 4, 5, 6 and 7 shared ISR. + * + * @isr + */ +OSAL_IRQ_HANDLER(NUC123_DMA1_CH4567_HANDLER) { + + OSAL_IRQ_PROLOGUE(); + + /* Check on channel 4.*/ + dmaServeInterrupt(NUC123_DMA1_STREAM4); + + /* Check on channel 5.*/ + dmaServeInterrupt(NUC123_DMA1_STREAM5); + +#if NUC123_DMA1_NUM_CHANNELS > 5 + /* Check on channel 6.*/ + dmaServeInterrupt(NUC123_DMA1_STREAM6); +#endif + +#if NUC123_DMA1_NUM_CHANNELS > 6 + /* Check on channel 7.*/ + dmaServeInterrupt(NUC123_DMA1_STREAM7); +#endif + + OSAL_IRQ_EPILOGUE(); +} +#endif /* defined(NUC123_DMA1_CH4567_HANDLER) */ + +#if defined(NUC123_DMA12_CH23_CH12_HANDLER) || defined(__DOXYGEN__) +/** + * @brief DMA1 streams 2 and 3, DMA2 streams 1 and 1 shared ISR. + * @note It is declared here because this device has a non-standard + * DMA shared IRQ handler. + * + * @isr + */ +OSAL_IRQ_HANDLER(NUC123_DMA12_CH23_CH12_HANDLER) { + + OSAL_IRQ_PROLOGUE(); + + /* Check on channel 2 of DMA1.*/ + dmaServeInterrupt(NUC123_DMA1_STREAM2); + + /* Check on channel 3 of DMA1.*/ + dmaServeInterrupt(NUC123_DMA1_STREAM3); + + /* Check on channel 1 of DMA2.*/ + dmaServeInterrupt(NUC123_DMA2_STREAM1); + + /* Check on channel 2 of DMA2.*/ + dmaServeInterrupt(NUC123_DMA2_STREAM2); + + OSAL_IRQ_EPILOGUE(); +} +#endif /* defined(NUC123_DMA12_CH23_CH12_HANDLER) */ + +#if defined(NUC123_DMA12_CH4567_CH345_HANDLER) || defined(__DOXYGEN__) +/** + * @brief DMA1 streams 4, 5, 6 and 7, DMA2 streams 3, 4 and 5 shared ISR. + * @note It is declared here because this device has a non-standard + * DMA shared IRQ handler. + * + * @isr + */ +OSAL_IRQ_HANDLER(NUC123_DMA12_CH4567_CH345_HANDLER) { + + OSAL_IRQ_PROLOGUE(); + + /* Check on channel 4 of DMA1.*/ + dmaServeInterrupt(NUC123_DMA1_STREAM4); + + /* Check on channel 5 of DMA1.*/ + dmaServeInterrupt(NUC123_DMA1_STREAM5); + + /* Check on channel 6 of DMA1.*/ + dmaServeInterrupt(NUC123_DMA1_STREAM6); + + /* Check on channel 7 of DMA1.*/ + dmaServeInterrupt(NUC123_DMA1_STREAM7); + + /* Check on channel 3 of DMA2.*/ + dmaServeInterrupt(NUC123_DMA2_STREAM3); + + /* Check on channel 4 of DMA2.*/ + dmaServeInterrupt(NUC123_DMA2_STREAM4); + + /* Check on channel 5 of DMA2.*/ + dmaServeInterrupt(NUC123_DMA2_STREAM5); + + OSAL_IRQ_EPILOGUE(); +} +#endif /* defined(NUC123_DMA12_CH4567_CH345_HANDLER) */ +#endif /* defined(NUC123_DMA_REQUIRED) */ + +/*===========================================================================*/ +/* Driver exported functions. */ +/*===========================================================================*/ + +/** + * @brief Low level HAL driver initialization. + * + * @notapi + */ +void hal_lld_init(void) { + + /* Reset of all peripherals.*/ +// **NUC123TODO +#if defined(NUC123_DMA_REQUIRED) + //dmaInit(); + //usbInit(); + //uartInit(); + //spiInit(); +#endif + //usbInit(); + +} + +/** + * @brief NUC123 clocks and PLL initialization. + * @note All the involved constants come from the file @p board.h. + * @note This function should be invoked just after the system reset. + * + * @special + */ +void NUC123_clock_init(void) { + SYS_UnlockReg(); + + /* Enable XT1_OUT (PF.0) and XT1_IN (PF.1) */ + SYS->GPF_MFP |= SYS_GPF_MFP_PF0_XT1_OUT | SYS_GPF_MFP_PF1_XT1_IN; + + /*---------------------------------------------------------------------------------------------------------*/ + /* Init System Clock */ + /*---------------------------------------------------------------------------------------------------------*/ + + /* Enable Internal RC 22.1184 MHz 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 12 MHz clock */ + CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk); + + /* Waiting for external XTAL clock ready */ + CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk); + + /* Set core clock */ + CLK_SetCoreClock(FREQ_72MHZ); + + SystemCoreClock = NUC123_HCLK; + + //CLK_SetSysTickClockSrc(CLK_CLKSEL0_STCLK_S_HCLK_DIV2); + + CLK_EnableSysTick(CLK_CLKSEL0_STCLK_S_HCLK_DIV2, (NUC123_HCLK / OSAL_ST_FREQUENCY) - 1); + /* Enable module clock */ + //CLK_EnableModuleClock(UART0_MODULE); + CLK_EnableModuleClock(USBD_MODULE); + + /* Select module clock source */ + //CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1)); + CLK_SetModuleClock(USBD_MODULE, 0, CLK_CLKDIV_USB(3)); + + /* TEMPORARY!!! */ + /* Set GPB multi-function pins for UART0 RXD and TXD */ + SYS->GPB_MFP = (SYS_GPB_MFP_PB0_UART0_RXD | SYS_GPB_MFP_PB1_UART0_TXD); + /* Set PC.13 as CLKO function pin */ + //SYS->GPC_MFP = SYS_GPC_MFP_PC13_CLKO; + //SYS->ALT_MFP = SYS_ALT_MFP_PC13_CLKO; + + /* Enable CLKO (PC.13) for monitor HCLK. CLKO = HCLK/8 Hz*/ + //CLK_EnableCKO(CLK_CLKSEL2_FRQDIV_S_HCLK, 2, 0); +} + +/** @} */ diff --git a/os/hal/ports/NUMICRO/NUC123SD4AN0/hal_lld.h b/os/hal/ports/NUMICRO/NUC123SD4AN0/hal_lld.h new file mode 100644 index 00000000..b930f6fd --- /dev/null +++ b/os/hal/ports/NUMICRO/NUC123SD4AN0/hal_lld.h @@ -0,0 +1,815 @@ +/* + Copyright (C) 2019 /u/KeepItUnder + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file NUC123SD4AN0/hal_lld.h + * @brief NUC123SD4AN0 HAL subsystem low level driver header. + * @pre This module requires the following macros to be defined in the + * @p board.h file: + * - NUC123_LSECLK. + * - NUC123_LSEDRV. + * - NUC123_LSE_BYPASS (optionally). + * - NUC123_HSECLK. + * - NUC123_HSE_BYPASS (optionally). + * . + * . + * + * @addtogroup HAL + * @{ + */ + +#ifndef HAL_LLD_H +#define HAL_LLD_H + +/*===========================================================================*/ +/* Driver constants. */ +/*===========================================================================*/ + +/** + * @name Platform identification macros + * @{ + */ +#if defined(NUC123SD4AN0) || defined(__DOXYGEN__) +#define PLATFORM_NAME "NUC123SD4AN0 NUC123 Cortex M0 USB Micro" + +#else +#error "NUC123 device unsupported or not specified" +#endif +/** @} */ + +/** + * @name Absolute Maximum Ratings + * @{ + */ +/** + * @brief Maximum system clock frequency. + */ +#define NUC123_SYSCLK_MAX FREQ_72MHZ + +/** + * @brief Maximum HSE clock frequency. + */ +#define NUC123_HSECLK_MAX 24000000 + +/** + * @brief Minimum HSE clock frequency. + */ +#define NUC123_HSECLK_MIN 4000000 + +/** + * @brief Maximum LSE clock frequency. + */ +#define NUC123_LSECLK_MAX 10000 + +/** + * @brief Minimum LSE clock frequency. + */ +#define NUC123_LSECLK_MIN 10000 + +/** + * @brief Maximum PLLs input clock frequency. + */ +#define NUC123_PLLIN_MAX 24000000 + +/** + * @brief Minimum PLLs input clock frequency. + */ +#define NUC123_PLLIN_MIN 4000000 + +/** + * @brief Maximum PLL output clock frequency. + */ +#define NUC123_PLLOUT_MAX FREQ_72MHZ + +/** + * @brief Minimum PLL output clock frequency. + */ +#define NUC123_PLLOUT_MIN 4000000 + +/** + * @brief Maximum APB clock frequency. + */ +#define NUC123_PCLK_MAX FREQ_72MHZ +/** @} */ + +/** + * @name Internal clock sources + * @{ + */ +#define NUC123_HSICLK __HIRC /**< High speed internal clock. */ +#define NUC123_HSI_69CLK 691200 /**< ~0.69MHz High speed internal clock. */ +#define NUC123_HSI1_38CLK 1382400 /**< ~1.375MHz High speed internal clock. */ +#define NUC123_HSI2_76CLK 2764800 /**< ~2.75MHz High speed internal clock. */ +#define NUC123_HSI5_5CLK 5529600 /**< ~5.5MHz speed internal clock.*/ +#define NUC123_HSI11CLK 11059200 /**< ~11MHz speed internal clock.*/ +#define NUC123_LSICLK __LIRC /**< Low speed internal clock. */ +/** @} */ + +/** + * @name CLKSEL0 register bits definitions + * @{ + */ + +#define NUC123_HCLKSRC_HSE (0 << 0) /**< HCLK source is HSE */ +#define NUC123_HCLKSRC_PLL_2 (1 << 0) /**< HCLK source is PLL/2 */ +#define NUC123_HCLKSRC_PLL (2 << 0) /**< HCLK source is PLL */ +#define NUC123_HCLKSRC_LSI (3 << 0) /**< HCLK source is LSI */ +#define NUC123_HCLKSRC_HSI (7 << 0) /**< HCLK source is HSI */ + +#define NUC123_SW_HSE (0 << 3) /**< SYSCLK source is HSE. */ +#define NUC123_SW_HSE_2 (1 << 3) /**< SYSCLK source is HSE/2. */ +#define NUC123_SW_HCLK_2 (3 << 3) /**< SYSCLK source is HCLK/2. */ +#define NUC123_SW_HSI_2 (7 << 3) /**< SYSCLK source is HSI. */ +/** @} */ + +/** + * @name CLKSEL1 register bits definitions + * @{ + */ +#define NUC123_WDTSRC_MASK (3 << 0) /**< WDT source mask */ +#define NUC123_WDTSRC_HCLK_2048 (2 << 0) /**< WDT source is HCLK/2048 */ +#define NUC123_WDTSRC_LSI (3 << 0) /**< WDT source is LSI */ + +#define NUC123_ADCSRC_MASK (3 << 2) /**< ADC source mask */ +#define NUC123_ADCSRC_HSE (0 << 2) /**< ADC source is HSE */ +#define NUC123_ADCSRC_PLL (1 << 2) /**< ADC source is PLL */ +#define NUC123_ADCSRC_HCLK (2 << 2) /**< ADC source is HCLK */ +#define NUC123_ADCSRC_HSI (3 << 2) /**< ADC source is HSI */ + +#define NUC123_SPI0SRC_MASK (1 << 4) /**< SPI0 source mask */ +#define NUC123_SPI0SRC_PLL (0 << 4) /**< SPI0 source is PLL */ +#define NUC123_SPI0SRC_HCLK (1 << 4) /**< SPI0 source is HCLK */ +#define NUC123_SPI1SRC_MASK (1 << 5) /**< SPI1 source MASK */ +#define NUC123_SPI1SRC_PLL (0 << 5) /**< SPI1 source is PLL */ +#define NUC123_SPI1SRC_HCLK (1 << 5) /**< SPI1 source is HCLK */ +#define NUC123_SPI2SRC_MASK (1 << 6) /**< SPI2 source mask */ +#define NUC123_SPI2SRC_PLL (0 << 6) /**< SPI2 source is PLL */ +#define NUC123_SPI2SRC_HCLK (1 << 6) /**< SPI2 source is HCLK */ + +#define NUC123_TMR0SRC_MASK (7 << 8) /**< TMR0 source mask */ +#define NUC123_TMR0SRC_HSE (0 << 8) /**< TMR0 source is HSE */ +#define NUC123_TMR0SRC_HCLK (2 << 8) /**< TMR0 source is HCLK */ +#define NUC123_TMR0SRC_TM0 (3 << 8) /**< TMR0 source is TM0 pin */ +#define NUC123_TMR0SRC_LSI (5 << 8) /**< TMR0 source is LSI */ +#define NUC123_TMR0SRC_HSI (7 << 8) /**< TMR0 source is HSI */ + +#define NUC123_TMR1SRC_MASK (7 << 12) /**< TMR1 source mask */ +#define NUC123_TMR1SRC_HSE (0 << 12) /**< TMR1 source is HSE */ +#define NUC123_TMR1SRC_HCLK (2 << 12) /**< TMR1 source is HCLK */ +#define NUC123_TMR1SRC_TM1 (3 << 12) /**< TMR1 source is TM1 pin */ +#define NUC123_TMR1SRC_LSI (5 << 12) /**< TMR1 source is LSI */ +#define NUC123_TMR1SRC_HSI (7 << 12) /**< TMR1 source is HSI */ + +#define NUC123_TMR2SRC_MASK (7 << 16) /**< TMR2 source mask */ +#define NUC123_TMR2SRC_HSE (0 << 16) /**< TMR2 source is HSE */ +#define NUC123_TMR2SRC_HCLK (2 << 16) /**< TMR2 source is HCLK */ +#define NUC123_TMR2SRC_TM2 (3 << 16) /**< TMR2 source is TM2 pin */ +#define NUC123_TMR2SRC_LSI (5 << 16) /**< TMR2 source is LSI */ +#define NUC123_TMR2SRC_HSI (7 << 16) /**< TMR2 source is HSI */ + +#define NUC123_TMR3SRC_MASK (7 << 20) /**< TMR3 source mask */ +#define NUC123_TMR3SRC_HSE (0 << 20) /**< TMR3 source is HSE */ +#define NUC123_TMR3SRC_HCLK (2 << 20) /**< TMR3 source is HCLK */ +#define NUC123_TMR3SRC_LSI (5 << 20) /**< TMR3 source is LSI */ +#define NUC123_TMR3SRC_HSI (7 << 20) /**< TMR3 source is HSI */ + +#define NUC123_USARTSRC_MASK (3 << 24) /**< UART source mask. */ +#define NUC123_USARTSRC_HS3 (0 << 24) /**< UART source is HSE. */ +#define NUC123_USARTSRC_PLL (1 << 24) /**< UART source is PLL. */ +#define NUC123_USARTSRC_HSI (3 << 24) /**< UART source is HSI. */ + +#define NUC123_PWM01SRCA_MASK (3 << 28) /**< PWM0/1 source [1:0] mask */ +#define NUC123_PWM01SRCA_HSE (0 << 28) /**< PWM0/1 source [1:0] is HSE */ +#define NUC123_PWM01SRCA_HCLK (2 << 28) /**< PWM0/1 source [1:0] is HCLK*/ +#define NUC123_PWM01SRCA_HSI (3 << 28) /**< PWM0/1 source [1:0] is HSI */ +#define NUC123_PWM01SRCA_LSI (3 << 28) /**< PWM0/1 source [1:0] is LSI */ + +#define NUC123_PWM23SRCA_MASK (3 << 30) /**< PWM2/3 source [1:0] mask */ +#define NUC123_PWM23SRCA_HSE (0 << 30) /**< PWM2/3 source [1:0] is HSE */ +#define NUC123_PWM23SRCA_HCLK (2 << 30) /**< PWM2/3 source [1:0] is HCLK*/ +#define NUC123_PWM23SRCA_HSI (3 << 30) /**< PWM2/3 source [1:0] is HSI */ +#define NUC123_PWM23SRCA_LSI (3 << 30) /**< PWM2/3 source [1:0] is LSI */ +/** @} */ + +/** + * @name CLKSEL2 register bits definitions + * @{ + */ +#define NUC123_I2SSRC_MASK (3 << 0) /**< I2S clock source mask. */ +#define NUC123_I2SSRC_HSE (0 << 0) /**< I2S clock source is HSE. */ +#define NUC123_I2SSRC_PLL (1 << 0) /**< I2S clock source is PLL. */ +#define NUC123_I2SSRC_HCLK (2 << 0) /**< I2S clock source is HCLK. */ +#define NUC123_I2SSRC_HSI (3 << 0) /**< I2S clock source is HSI. */ + +#define NUC123_FREQDIVSRC_MASK (3 << 2) /**< FRQDIV clock source mask */ +#define NUC123_FREQDIVSRC_HSE (0 << 2) /**< FRQDIV clock source is HSE */ +#define NUC123_FREQDIVSRC_HCLK (2 << 2) /**< FRQDIV clock source is HCLK*/ +#define NUC123_FREQDIVSRC_HSI (3 << 2) /**< FRQDIV clock source is LSI */ + +#define NUC123_PWM01SRCB_MASK (1 << 8) /**< PWM0/1 source [2] mask */ +#define NUC123_PWM01SRCB_HSI (0 << 8) /**< PWM0/1 source [2] is HSI */ +#define NUC123_PWM01SRCB_LSI (1 << 8) /**< PWM0/1 source [2] is LSI */ + +#define NUC123_PWM23SRCB_MASK (1 << 9) /**< PWM2/3 source [2] mask */ +#define NUC123_PWM23SRCB_HSI (0 << 9) /**< PWM2/3 source [2] is HSI */ +#define NUC123_PWM23SRCB_LSI (1 << 9) /**< PWM2/3 source [2] is LSI */ + +#define NUC123_WWDTSRC_MASK (3 << 16) /**< WWDT source mask */ +#define NUC123_WWDTSRC_HCLK_2048 (2 << 16) /**< WWDT source is HCLK/2048 */ +#define NUC123_WWDTSRC_LSI (3 << 16) /**< WWDT source is LSI */ +/** @} */ + +/*===========================================================================*/ +/* Driver pre-compile time settings. */ +/*===========================================================================*/ + +/** + * @name Configuration options + * @{ + */ +/** + * @brief Disables the PWR/RCC initialization in the HAL. + */ +#if !defined(NUC123_NO_INIT) || defined(__DOXYGEN__) +#define NUC123_NO_INIT FALSE +#endif + +/** + * @brief Enables or disables the HSI clock source. + */ +#if !defined(NUC123_HSI_ENABLED) || defined(__DOXYGEN__) +#define NUC123_HSI_ENABLED TRUE +#endif + +/** + * @brief Enables or disables the LSI clock source. + */ +#if !defined(NUC123_LSI_ENABLED) || defined(__DOXYGEN__) +#define NUC123_LSI_ENABLED TRUE +#endif + +/** + * @brief Enables or disables the HSE clock source. + */ +#if !defined(NUC123_HSE_ENABLED) || defined(__DOXYGEN__) +#define NUC123_HSE_ENABLED TRUE +#endif + +/** + * @brief Enables or disables the LSE clock source. + */ +#if !defined(NUC123_LSE_ENABLED) || defined(__DOXYGEN__) +#define NUC123_LSE_ENABLED FALSE +#endif + +/** + * @brief Main clock source selection. + * @note If the selected clock source is not the PLL then the PLL is not + * initialized and started. + * @note The default value is calculated for a 72MHz system clock from + * a 12MHz crystal using the PLL. + */ +#if !defined(NUC123_SW) || defined(__DOXYGEN__) +#define NUC123_SW NUC123_SW_HCLK_2 +#endif + +/** + * @brief Clock source for the PLL. + * @note This setting has only effect if the PLL is selected as the + * system clock source. + * @note The default value is calculated for a 72MHz system clock from + * a 12MHz crystal using the PLL. + */ +#if !defined(NUC123_PLLSRC) || defined(__DOXYGEN__) +#define NUC123_PLLSRC NUC123_PLLSRC_HSE +#endif + +/** + * @brief Crystal PLL pre-divider. + * @note This setting has only effect if the PLL is selected as the + * system clock source. + * @note The default value is calculated for a 72MHz system clock from + * a 21MHz crystal using the PLL. + */ +#if !defined(NUC123_PREDIV_VALUE) || defined(__DOXYGEN__) +#define NUC123_PREDIV_VALUE 1 +#endif + +/** + * @brief PLL multiplier value. + * @note The allowed range is 2...16. + * @note The default value is calculated for a 72MHz system clock from + * a 12MHz crystal using the PLL. + */ +#if !defined(NUC123_PLLMUL_VALUE) || defined(__DOXYGEN__) +#define NUC123_PLLMUL_VALUE 6 +#endif + +/** + * @brief AHB prescaler value. + * @note The default value is calculated for a 72MHz system clock from + * a 12MHz crystal using the PLL. + */ +#if !defined(NUC123_HPRE) || defined(__DOXYGEN__) +#define NUC123_HPRE NUC123_HPRE_DIV1 +#endif + +/** + * @brief APB1 prescaler value. + */ +#if !defined(NUC123_PPRE) || defined(__DOXYGEN__) +#define NUC123_PPRE NUC123_PPRE_DIV1 +#endif + +/** + * @brief MCO pin setting. + */ +#if !defined(NUC123_MCOSEL) || defined(__DOXYGEN__) +#define NUC123_MCOSEL NUC123_MCOSEL_NOCLOCK +#endif + +/** + * @brief MCO divider setting. + */ +#if !defined(NUC123_MCOPRE) || defined(__DOXYGEN__) +#define NUC123_MCOPRE NUC123_MCOPRE_DIV1 +#endif + +/** + * @brief MCO PLL divider setting. + */ +#if !defined(NUC123_PLLNODIV) || defined(__DOXYGEN__) +#define NUC123_PLLNODIV NUC123_PLLNODIV_DIV2 +#endif + +/** + * @brief USB Clock source. + */ +#if !defined(NUC123_USBSW) || defined(__DOXYGEN__) +#define NUC123_USBSW NUC123_USBSW_HSI48 +#endif + +/** + * @brief CEC clock source. + */ +#if !defined(NUC123_CECSW) || defined(__DOXYGEN__) +#define NUC123_CECSW NUC123_CECSW_HSI +#endif + +/** + * @brief I2C1 clock source. + */ +#if !defined(NUC123_I2C1SW) || defined(__DOXYGEN__) +#define NUC123_I2C1SW NUC123_I2C1SW_HSI +#endif + +/** + * @brief USART1 clock source. + */ +#if !defined(NUC123_USART1SW) || defined(__DOXYGEN__) +#define NUC123_USART1SW NUC123_USART1SW_PCLK +#endif +/** @} */ + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +/* + * Configuration-related checks. + */ +#if !defined(NUC123SD4AN0_MCUCONF) +#error "Using a wrong mcuconf.h file, NUC123SD4AN0_MCUCONF not defined" +#endif + +/* + * HSI related checks. + */ +#if NUC123_HSI_ENABLED + +/*#if NUC123_SW == NUC123_SW_HSE +#error "HSI not enabled, required by NUC123_SW" +#endif + +#if NUC123_CECSW == NUC123_CECSW_HSI +#error "HSI not enabled, required by NUC123_CECSW" +#endif + +#if NUC123_I2C1SW == NUC123_I2C1SW_HSI +#error "HSI not enabled, required by NUC123_I2C1SW" +#endif + +#if NUC123_USART1SW == NUC123_USART1SW_HSI +#error "HSI not enabled, required by NUC123_USART1SW" +#endif + +#if (NUC123_SW == NUC123_SW_PLL) && \ + (NUC123_PLLSRC == NUC123_PLLSRC_HSI_DIV2) || \ + (NUC123_PLLSRC == NUC123_PLLSRC_HSI) +#error "HSI not enabled, required by NUC123_SW and NUC123_PLLSRC" +#endif + +#if (NUC123_MCOSEL == NUC123_MCOSEL_HSI) || \ + ((NUC123_MCOSEL == NUC123_MCOSEL_PLLDIV2) && \ + ((NUC123_PLLSRC == NUC123_PLLSRC_HSI_DIV2) || \ + (NUC123_PLLSRC == NUC123_PLLSRC_HSI))) +#error "HSI not enabled, required by NUC123_MCOSEL" +#endif +*/ +#endif /* !NUC123_HSI_ENABLED */ + +/* + * HSE related checks. + */ +#if NUC123_HSE_ENABLED + +#if NUC123_HSECLK == 0 +#error "HSE frequency not defined" +#elif (NUC123_HSECLK < NUC123_HSECLK_MIN) || (NUC123_HSECLK > NUC123_HSECLK_MAX) +#error "NUC123_HSECLK outside acceptable range (NUC123_HSECLK_MIN...NUC123_HSECLK_MAX)" +#endif + +#else /* !NUC123_HSE_ENABLED */ + +#if (NUC123_SW == NUC123_SW_HSE) || (NUC123_SW == NUC123_SW_HSE_2) +#error "HSE not enabled, required by NUC123_SW" +#endif + +#if (NUC123_SW == NUC123_SW_HCL) && (NUC123_PLLSRC == NUC123_PLLSRC_HSE) +#error "HSE not enabled, required by NUC123_SW and NUC123_PLLSRC" +#endif + +#if (NUC123_MCOSEL == NUC123_MCOSEL_HSE) || \ + ((NUC123_MCOSEL == NUC123_MCOSEL_PLLDIV2) && \ + (NUC123_PLLSRC == NUC123_PLLSRC_HSE)) +#error "HSE not enabled, required by NUC123_MCOSEL" +#endif + +#endif /* !NUC123_HSE_ENABLED */ + +/* + * LSI related checks. + */ +#if NUC123_LSI_ENABLED +#else /* !NUC123_LSI_ENABLED */ + +#if NUC123_RTCSEL == NUC123_RTCSEL_LSI +#error "LSI not enabled, required by NUC123_RTCSEL" +#endif + +#endif /* !NUC123_LSI_ENABLED */ + +/* + * LSE related checks. + */ +#if NUC123_LSE_ENABLED + +#if (NUC123_LSECLK == 0) +#error "LSE frequency not defined" +#endif + +#if (NUC123_LSECLK < NUC123_LSECLK_MIN) || (NUC123_LSECLK > NUC123_LSECLK_MAX) +#error "NUC123_LSECLK outside acceptable range (NUC123_LSECLK_MIN...NUC123_LSECLK_MAX)" +#endif + +#if !defined(NUC123_LSEDRV) +#error "NUC123_LSEDRV not defined" +#endif + +#if (NUC123_LSEDRV >> 3) > 3 +#error "NUC123_LSEDRV outside acceptable range ((0<<3)...(3<<3))" +#endif + +#else /* !NUC123_LSE_ENABLED */ + +#endif /* !NUC123_LSE_ENABLED */ + +/* PLL activation conditions.*/ +#if (NUC123_SW == NUC123_SW_PLL) || \ + (NUC123_USBSW == NUC123_USBSW_PCLK) || \ + (NUC123_MCOSEL == NUC123_MCOSEL_PLLDIV2) || \ + defined(__DOXYGEN__) +/** + * @brief PLL activation flag. + */ +#define NUC123_ACTIVATE_PLL TRUE +#else +#define NUC123_ACTIVATE_PLL FALSE +#endif + +/* HSE, HSI prescaler setting check.*/ +#if ((NUC123_PREDIV_VALUE >= 1) || (NUC123_PREDIV_VALUE <= 16)) +#define NUC123_PREDIV ((NUC123_PREDIV_VALUE - 1) << 0) +#else +#error "invalid NUC123_PREDIV value specified" +#endif + +/** + * @brief PLLMUL field. + */ +#if ((NUC123_PLLMUL_VALUE >= 2) && (NUC123_PLLMUL_VALUE <= 16)) || \ + defined(__DOXYGEN__) +#define NUC123_PLLMUL ((NUC123_PLLMUL_VALUE - 2) << 18) +#else +#error "invalid NUC123_PLLMUL_VALUE value specified" +#endif + +/** + * @brief PLL input clock frequency. + */ +#if (NUC123_PLLSRC == NUC123_PLLSRC_HSE) || defined(__DOXYGEN__) +#define NUC123_PLLCLKIN (NUC123_HSECLK / NUC123_PREDIV_VALUE) +#elif NUC123_PLLSRC == NUC123_PLLSRC_HSI_DIV2 +#define NUC123_PLLCLKIN (NUC123_HSICLK / 2) +#elif NUC123_PLLSRC == NUC123_PLLSRC_HSI +#define NUC123_PLLCLKIN (NUC123_HSICLK / NUC123_PREDIV_VALUE) +#else +#error "invalid NUC123_PLLSRC value specified" +#endif + +/* PLL input frequency range check.*/ +#if (NUC123_PLLCLKIN < NUC123_PLLIN_MIN) || (NUC123_PLLCLKIN > NUC123_PLLIN_MAX) +#error "NUC123_PLLCLKIN outside acceptable range (NUC123_PLLIN_MIN...NUC123_PLLIN_MAX)" +#endif + +/** + * @brief PLL output clock frequency. + */ +#define NUC123_PLLCLKOUT (NUC123_PLLCLKIN * NUC123_PLLMUL_VALUE) + +/* PLL output frequency range check. +#if (NUC123_PLLCLKOUT < NUC123_PLLOUT_MIN) || (NUC123_PLLCLKOUT > NUC123_PLLOUT_MAX) +#error "NUC123_PLLCLKOUT outside acceptable range (NUC123_PLLOUT_MIN...NUC123_PLLOUT_MAX)" +#endif +*/ +/** + * @brief System clock source. + */ +#if (NUC123_SW == NUC123_SW_HSE) || defined(__DOXYGEN__) +#define NUC123_SYSCLK NUC123_HSECLK +#elif (NUC123_SW == NUC123_SW_HSE_2) +#define NUC123_SYSCLK NUC123_HSECLK >> 1 +#elif (NUC123_SW == NUC123_SW_HCLK_2) +#define NUC123_SYSCLK FREQ_72MHZ >> 1 +#elif (NUC123_SW == NUC123_SW_HSI_2) +#define NUC123_SYSCLK NUC123_HSI11CLK +#else +#error "invalid NUC123_SW value specified" +#endif + +/* Check on the system clock.*/ +#if NUC123_SYSCLK > NUC123_SYSCLK_MAX +#error "NUC123_SYSCLK above maximum rated frequency (NUC123_SYSCLK_MAX)" +#endif + +/** + * @brief AHB frequency. + * +#if (NUC123_HPRE == NUC123_HPRE_DIV1) || defined(__DOXYGEN__) +#define NUC123_HCLK (NUC123_SYSCLK / 1) +#elif NUC123_HPRE == NUC123_HPRE_DIV2 +#define NUC123_HCLK (NUC123_SYSCLK / 2) +#elif NUC123_HPRE == NUC123_HPRE_DIV4 +#define NUC123_HCLK (NUC123_SYSCLK / 4) +#elif NUC123_HPRE == NUC123_HPRE_DIV8 +#define NUC123_HCLK (NUC123_SYSCLK / 8) +#elif NUC123_HPRE == NUC123_HPRE_DIV16 +#define NUC123_HCLK (NUC123_SYSCLK / 16) +#elif NUC123_HPRE == NUC123_HPRE_DIV64 +#define NUC123_HCLK (NUC123_SYSCLK / 64) +#elif NUC123_HPRE == NUC123_HPRE_DIV128 +#define NUC123_HCLK (NUC123_SYSCLK / 128) +#elif NUC123_HPRE == NUC123_HPRE_DIV256 +#define NUC123_HCLK (NUC123_SYSCLK / 256) +#elif NUC123_HPRE == NUC123_HPRE_DIV512 +#define NUC123_HCLK (NUC123_SYSCLK / 512) +#else +#error "invalid NUC123_HPRE value specified" +#endif +*/ +#define NUC123_HCLK (NUC123_SYSCLK / 1) + +/* AHB frequency check.*/ +#if NUC123_HCLK > NUC123_SYSCLK_MAX +#error "NUC123_HCLK exceeding maximum frequency (NUC123_SYSCLK_MAX)" +#endif + +/** + * @brief APB frequency. + */ +#if (NUC123_PPRE == NUC123_PPRE_DIV1) || defined(__DOXYGEN__) +#define NUC123_PCLK (NUC123_HCLK / 1) +#elif NUC123_PPRE == NUC123_PPRE_DIV2 +#define NUC123_PCLK (NUC123_HCLK / 2) +#elif NUC123_PPRE == NUC123_PPRE_DIV4 +#define NUC123_PCLK (NUC123_HCLK / 4) +#elif NUC123_PPRE == NUC123_PPRE_DIV8 +#define NUC123_PCLK (NUC123_HCLK / 8) +#elif NUC123_PPRE == NUC123_PPRE_DIV16 +#define NUC123_PCLK (NUC123_HCLK / 16) +#else +#error "invalid NUC123_PPRE value specified" +#endif + +/* APB frequency check.*/ +#if NUC123_PCLK > NUC123_PCLK_MAX +#error "NUC123_PCLK exceeding maximum frequency (NUC123_PCLK_MAX)" +#endif + +/* NUC123_PLLNODIV check.*/ +#if (NUC123_PLLNODIV != NUC123_PLLNODIV_DIV2) && \ + (NUC123_PLLNODIV != NUC123_PLLNODIV_DIV1) +#error "invalid NUC123_PLLNODIV value specified" +#endif + +/** + * @brief MCO clock before divider. + */ +// #if (NUC123_MCOSEL == NUC123_MCOSEL_NOCLOCK) || defined(__DOXYGEN__) +// #define NUC123_MCODIVCLK 0 +// #elif NUC123_MCOSEL == NUC123_MCOSEL_HSI14 +// #define NUC123_MCODIVCLK NUC123_HSI14CLK +// #elif NUC123_MCOSEL == NUC123_MCOSEL_LSI +// #define NUC123_MCODIVCLK NUC123_LSICLK +// #elif NUC123_MCOSEL == NUC123_MCOSEL_LSE +// #define NUC123_MCODIVCLK NUC123_LSECLK +// #elif NUC123_MCOSEL == NUC123_MCOSEL_SYSCLK +// #define NUC123_MCODIVCLK NUC123_SYSCLK +// #elif NUC123_MCOSEL == NUC123_MCOSEL_HSI +// #define NUC123_MCODIVCLK NUC123_HSICLK +// #elif NUC123_MCOSEL == NUC123_MCOSEL_HSE +// #define NUC123_MCODIVCLK NUC123_HSECLK +// #elif NUC123_MCOSEL == NUC123_MCOSEL_PLLDIV2 +// #if NUC123_PLLNODIV == NUC123_PLLNODIV_DIV2 +// #define NUC123_MCODIVCLK (NUC123_PLLCLKOUT / 2) +// #else +// #define NUC123_MCODIVCLK (NUC123_PLLCLKOUT / 1) +// #endif +// #elif NUC123_MCOSEL == NUC123_MCOSEL_HSI48 +// #define NUC123_MCODIVCLK NUC123_HSI48CLK +// #else +// #error "invalid NUC123_MCOSEL value specified" +// #endif + +/** + * @brief MCO output pin clock. + */ +// #if (NUC123_MCOPRE == NUC123_MCOPRE_DIV1) || defined(__DOXYGEN__) +// #define NUC123_MCOCLK NUC123_MCODIVCLK +// #elif (NUC123_MCOPRE == NUC123_MCOPRE_DIV2) && NUC123_HAS_MCO_PREDIV +// #define NUC123_MCOCLK (NUC123_MCODIVCLK / 2) +// #elif (NUC123_MCOPRE == NUC123_MCOPRE_DIV4) && NUC123_HAS_MCO_PREDIV +// #define NUC123_MCOCLK (NUC123_MCODIVCLK / 4) +// #elif (NUC123_MCOPRE == NUC123_MCOPRE_DIV8) && NUC123_HAS_MCO_PREDIV +// #define NUC123_MCOCLK (NUC123_MCODIVCLK / 8) +// #elif (NUC123_MCOPRE == NUC123_MCOPRE_DIV16) && NUC123_HAS_MCO_PREDIV +// #define NUC123_MCOCLK (NUC123_MCODIVCLK / 16) +// #elif !NUC123_HAS_MCO_PREDIV +// #error "MCO_PREDIV not available on this platform. Select NUC123_MCODIVCLK." +// #else +// #error "invalid NUC123_MCOPRE value specified" +// #endif + +/** + * @brief USB frequency. + */ +// #if (NUC123_USBSW == NUC123_USBSW_HSI48) || defined(__DOXYGEN__) +// #define NUC123_USBCLK NUC123_HSI48CLK +// #elif NUC123_USBSW == NUC123_USBSW_PCLK +// #define NUC123_USBCLK NUC123_PLLCLKOUT +// #else +// #error "invalid source selected for USB clock" +// #endif + +/** + * @brief CEC frequency. + */ +#if (NUC123_CECSW == NUC123_CECSW_HSI) || defined(__DOXYGEN__) +#define NUC123_CECCLK NUC123_HSICLK +#elif NUC123_CECSW == NUC123_CECSW_LSE +#define NUC123_CECCLK NUC123_LSECLK +#elif NUC123_CECSW == NUC123_CECSW_OFF +#define NUC123_CECCLK 0 +#else +#error "invalid source selected for CEC clock" +#endif + +/** + * @brief I2C1 frequency. + */ +#if (NUC123_I2C1SW == NUC123_I2C1SW_HSI) || defined(__DOXYGEN__) +#define NUC123_I2C1CLK NUC123_HSICLK +#elif NUC123_I2C1SW == NUC123_I2C1SW_SYSCLK +#define NUC123_I2C1CLK NUC123_SYSCLK +#else +#error "invalid source selected for I2C1 clock" +#endif + +/** + * @brief USART1 frequency. + */ +#if (NUC123_USART1SW == NUC123_USART1SW_PCLK) || defined(__DOXYGEN__) +#define NUC123_USART1CLK NUC123_PCLK +#elif NUC123_USART1SW == NUC123_USART1SW_SYSCLK +#define NUC123_USART1CLK NUC123_SYSCLK +#elif NUC123_USART1SW == NUC123_USART1SW_LSE +#define NUC123_USART1CLK NUC123_LSECLK +#elif NUC123_USART1SW == NUC123_USART1SW_HSI +#define NUC123_USART1CLK NUC123_HSICLK +#else +#error "invalid source selected for USART1 clock" +#endif + +/** + * @brief USART2 frequency. + */ +#define NUC123_USART2CLK NUC123_PCLK + +/** + * @brief USART3 frequency. + */ +#define NUC123_USART3CLK NUC123_PCLK + +/** + * @brief USART4 frequency. + */ +#define NUC123_UART4CLK NUC123_PCLK + +/** + * @brief USART5 frequency. + */ +#define NUC123_UART5CLK NUC123_PCLK + +/** + * @brief USART6 frequency. + */ +#define NUC123_USART6CLK NUC123_PCLK + +/** + * @brief Timers clock. + */ +#if (NUC123_PPRE == NUC123_PPRE_DIV1) || defined(__DOXYGEN__) +#define NUC123_TIMCLK1 (NUC123_PCLK * 1) +#define NUC123_TIMCLK2 (NUC123_PCLK * 1) +#else +#define NUC123_TIMCLK1 (NUC123_PCLK * 2) +#define NUC123_TIMCLK2 (NUC123_PCLK * 2) +#endif + +/** + * @brief Flash settings. + */ +#if (NUC123_HCLK <= 24000000) || defined(__DOXYGEN__) +#define NUC123_FLASHBITS 0x00000010 +#else +#define NUC123_FLASHBITS 0x00000011 +#endif + +/* + * For compatibility with driver assuming a specific PPRE clock. + */ +#define NUC123_PCLK1 NUC123_PCLK +#define NUC123_PCLK2 NUC123_PCLK + +/*===========================================================================*/ +/* Driver data structures and types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver macros. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +/* Various helpers.*/ +#include "nvic.h" +#include "nuc123_isr.h" +//#include "nuc123_dma.h" + +#ifdef __cplusplus +extern "C" { +#endif + void hal_lld_init(void); + void NUC123_clock_init(void); +#ifdef __cplusplus +} +#endif + +#endif /* HAL_LLD_H */ + +/** @} */ diff --git a/os/hal/ports/NUMICRO/NUC123SD4AN0/nuc123_isr.h b/os/hal/ports/NUMICRO/NUC123SD4AN0/nuc123_isr.h new file mode 100644 index 00000000..df3e7c9a --- /dev/null +++ b/os/hal/ports/NUMICRO/NUC123SD4AN0/nuc123_isr.h @@ -0,0 +1,152 @@ +/* + Copyright (C) 2019 /u/KeepItUnder + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file NUMICRO/nuc123_isr.h + * @brief ISR remapper driver header. + * + * @addtogroup NUC123SD4AN0_ISR + * @{ + */ + +#ifndef NUC123_ISR_H +#define NUC123_ISR_H + +/*===========================================================================*/ +/* Driver constants. */ +/*===========================================================================*/ + +/** + * @name ISR names and numbers remapping + * @{ + */ + +/* + * GPIO units. + */ +#if defined(NUC123SD4AN0) +#define NUC123_GPIOAB_HANDLER Vector50 +#define NUC123_GPIOCDF_HANDLER Vector54 + +#define NUC123_GPIOAB_NUMBER GPAB_IRQn +#define NUC123_GPIOCDF_NUMBER GPCDF_IRQn +#endif + +/* + * Special ST unit + */ +#define NUC123_ST_HANDLER Vector3C +#define NUC123_ST_NUMBER SysTick_IRQn + +/* + * DMA units. + */ +#define NUC123_PDMA_HANDLER VectorA8 +#define NUC123_PDMA_NUMBER PDMA_IRQn + +/* + * ADC units. + */ +#define NUC123_ADC_HANDLER VectorB0 +#define NUC123_ADC_NUMBER ADC_IRQn + +/* + * PWM units. + */ +#define NUC123_PWMA_HANDLER Vector58 +#define NUC123_PWMA_NUMBER PWMA_IRQn + +/* + * SPI units. + */ +#define NUC123_SPI0_HANDLER Vector78 +#define NUC123_SPI1_HANDLER Vector7C +#define NUC123_SPI2_HANDLER Vector80 + +#define NUC123_SPI0_NUMBER SPI0_IRQn +#define NUC123_SPI1_NUMBER SPI1_IRQn +#define NUC123_SPI2_NUMBER SPI2_IRQn + +/* + * I2S units. + */ +#define NUC123_I2C1_HANDLER VectorB8 +#define NUC123_I2C1_NUMBER I2S_IRQn + +/* + * I2C units. + */ +#define NUC123_I2C1_GLOBAL_HANDLER Vector88 +#define NUC123_I2C1_GLOBAL_NUMBER I2C0_IRQn + +#define NUC123_I2C2_GLOBAL_HANDLER Vector8C +#define NUC123_I2C2_GLOBAL_NUMBER I2C1_IRQn + +/* + * TIM units. + */ +#define NUC123_TIM1_HANDLER Vector60 +#define NUC123_TIM2_HANDLER Vector64 +#define NUC123_TIM3_HANDLER Vector68 +#define NUC123_TIM4_HANDLER Vector6C + +#define NUC123_TIM1_NUMBER TMR0_IRQn +#define NUC123_TIM2_NUMBER TMR1_IRQn +#define NUC123_TIM3_NUMBER TMR2_IRQn +#define NUC123_TIM4_NUMBER TMR3_IRQn + +/* + * USART units. + */ +#define NUC123_USART1_HANDLER Vector70 +#define NUC123_USART2_HANDLER Vector74 + +#define NUC123_USART1_NUMBER UART0_IRQn +#define NUC123_USART2_NUMBER UART1_IRQn + +/* + * USB units. + */ +#define NUC123_USB1_HANDLER Vector9C +#define NUC123_USB1_NUMBER USBD_IRQn + +#define USBD_INTSTS_EPEVT_Pos USBD_INTSTS_EPEVT0_Pos +#define USBD_INTSTS_EPEVT_Msk (0xFFul << USBD_INTSTS_EPEVT_Pos) +/** @} */ + +/*===========================================================================*/ +/* Driver pre-compile time settings. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver data structures and types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver macros. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#endif /* NUC123_ISR_H */ + +/** @} */ diff --git a/os/hal/ports/NUMICRO/NUC123SD4AN0/nuc123_registry.h b/os/hal/ports/NUMICRO/NUC123SD4AN0/nuc123_registry.h new file mode 100644 index 00000000..13c8691e --- /dev/null +++ b/os/hal/ports/NUMICRO/NUC123SD4AN0/nuc123_registry.h @@ -0,0 +1,263 @@ +/* + Copyright (C) 2019 /u/KeepItUnder + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file NUC123SD4AN0/nuc123_registry.h + * @brief NUC123SD4AN0 capabilities registry. + * + * @addtogroup HAL + * @{ + */ + +#ifndef NUC123_REGISTRY_H +#define NUC123_REGISTRY_H + +#if !defined(NUC123SD4AN0) || defined(__DOXYGEN__) +#define NUC123SD4AN0 +#endif + +/*===========================================================================*/ +/* Platform capabilities. */ +/*===========================================================================*/ + +/** + * @name NUC123SD4AN0 capabilities + * @{ + */ + +/* RCC attributes. */ +#define NUC123_HAS_HSI48 FALSE +#define NUC123_HAS_HSI_PREDIV FALSE +#define NUC123_HAS_MCO_PREDIV TRUE + +/* ADC attributes.*/ +#define NUC123_HAS_ADC1 TRUE +#define NUC123_ADC_SUPPORTS_PRESCALER FALSE +#define NUC123_ADC_SUPPORTS_OVERSAMPLING FALSE +#define NUC123_ADC1_IRQ_SHARED_WITH_EXTI FALSE +#define NUC123_ADC1_HANDLER Vector70 +#define NUC123_ADC1_NUMBER Vector70_IRQn +#define NUC123_ADC1_DMA_MSK (NUC123_DMA_STREAM_ID_MSK(1, 1) |\ + NUC123_DMA_STREAM_ID_MSK(1, 2)) +#define NUC123_ADC1_DMA_CHN 0x00000011 + +#define NUC123_HAS_ADC2 FALSE +#define NUC123_HAS_ADC3 FALSE +#define NUC123_HAS_ADC4 FALSE + +/* CAN attributes.*/ +#define NUC123_HAS_CAN1 FALSE +#define NUC123_HAS_CAN2 FALSE +#define NUC123_HAS_CAN3 FALSE + +/* DAC attributes.*/ +#define NUC123_HAS_DAC1_CH1 FALSE +#define NUC123_HAS_DAC1_CH2 FALSE +#define NUC123_HAS_DAC2_CH1 FALSE +#define NUC123_HAS_DAC2_CH2 FALSE + +/* DMA attributes.*/ +#define NUC123_ADVANCED_DMA FALSE +#define NUC123_DMA_SUPPORTS_CSELR FALSE +#define NUC123_DMA1_NUM_CHANNELS 6 +#define NUC123_DMA2_NUM_CHANNELS 0 +#define NUC123_DMA1_CH1_HANDLER Vector64 +#define NUC123_DMA1_CH23_HANDLER Vector68 +#define NUC123_DMA1_CH4567_HANDLER Vector6C +#define NUC123_DMA1_CH1_NUMBER Vector64_IRQn +#define NUC123_DMA1_CH23_NUMBER Vector68_IRQn +#define NUC123_DMA1_CH4567_NUMBER Vector6C_IRQn + +#define NUC123_DMA1_CH2_NUMBER NUC123_DMA1_CH23_NUMBER +#define NUC123_DMA1_CH3_NUMBER NUC123_DMA1_CH23_NUMBER +#define DMA1_CH2_CMASK 0x00000006U +#define DMA1_CH3_CMASK 0x00000006U + +#define NUC123_DMA1_CH4_NUMBER NUC123_DMA1_CH4567_NUMBER +#define NUC123_DMA1_CH5_NUMBER NUC123_DMA1_CH4567_NUMBER +#define NUC123_DMA1_CH6_NUMBER NUC123_DMA1_CH4567_NUMBER +#define NUC123_DMA1_CH7_NUMBER NUC123_DMA1_CH4567_NUMBER +#define DMA1_CH4_CMASK 0x00000078U +#define DMA1_CH5_CMASK 0x00000078U +#define DMA1_CH6_CMASK 0x00000078U +#define DMA1_CH7_CMASK 0x00000078U + +/* ETH attributes.*/ +#define NUC123_HAS_ETH FALSE + +/* EXTI attributes.*/ +//#define NUC123_EXTI_NUM_LINES 20 +//#define NUC123_EXTI_IMR_MASK 0xFFF50000U + +/* GPIO attributes.*/ +#define NUC123_HAS_GPIOA TRUE +#define NUC123_HAS_GPIOB TRUE +#define NUC123_HAS_GPIOC TRUE +#define NUC123_HAS_GPIOD TRUE +#define NUC123_HAS_GPIOE FALSE +#define NUC123_HAS_GPIOF TRUE +#define NUC123_HAS_GPIOG FALSE +#define NUC123_HAS_GPIOH FALSE +#define NUC123_HAS_GPIOI FALSE +#define NUC123_HAS_GPIOJ FALSE +#define NUC123_HAS_GPIOK FALSE + +/* I2C attributes.*/ +#define NUC123_HAS_I2C1 TRUE +#define NUC123_I2C1_RX_DMA_MSK NUC123_DMA_STREAM_ID_MSK(1, 3) +#define NUC123_I2C1_RX_DMA_CHN 0x00000200 +#define NUC123_I2C1_TX_DMA_MSK NUC123_DMA_STREAM_ID_MSK(1, 2) +#define NUC123_I2C1_TX_DMA_CHN 0x00000020 + +#define NUC123_HAS_I2C2 TRUE +#define NUC123_I2C2_RX_DMA_MSK NUC123_DMA_STREAM_ID_MSK(1, 5) +#define NUC123_I2C2_RX_DMA_CHN 0x00020000 +#define NUC123_I2C2_TX_DMA_MSK NUC123_DMA_STREAM_ID_MSK(1, 4) +#define NUC123_I2C2_TX_DMA_CHN 0x00002000 + +#define NUC123_HAS_I2C3 FALSE +#define NUC123_HAS_I2C4 FALSE + +/* QUADSPI attributes.*/ +#define NUC123_HAS_QUADSPI1 FALSE + +/* RTC attributes.*/ +#define NUC123_HAS_RTC FALSE +#define NUC123_RTC_HAS_SUBSECONDS FALSE +#define NUC123_RTC_HAS_PERIODIC_WAKEUPS FALSE +#define NUC123_RTC_NUM_ALARMS 0 +#define NUC123_RTC_HAS_INTERRUPTS FALSE + +/* SDIO attributes.*/ +#define NUC123_HAS_SDIO FALSE + +/* SPI attributes.*/ +#define NUC123_HAS_SPI1 TRUE +#define NUC123_SPI1_SUPPORTS_I2S FALSE +#define NUC123_SPI1_RX_DMA_MSK NUC123_DMA_STREAM_ID_MSK(1, 2) +#define NUC123_SPI1_RX_DMA_CHN 0x00000030 +#define NUC123_SPI1_TX_DMA_MSK NUC123_DMA_STREAM_ID_MSK(1, 3) +#define NUC123_SPI1_TX_DMA_CHN 0x00000300 + +#define NUC123_HAS_SPI2 TRUE +#define NUC123_SPI2_SUPPORTS_I2S FALSE +#define NUC123_SPI2_RX_DMA_MSK NUC123_DMA_STREAM_ID_MSK(1, 4) +#define NUC123_SPI2_RX_DMA_CHN 0x00003000 +#define NUC123_SPI2_TX_DMA_MSK NUC123_DMA_STREAM_ID_MSK(1, 5) +#define NUC123_SPI2_TX_DMA_CHN 0x00030000 + +#define NUC123_HAS_SPI3 FALSE +#define NUC123_HAS_SPI4 FALSE +#define NUC123_HAS_SPI5 FALSE +#define NUC123_HAS_SPI6 FALSE + +/* TIM attributes.*/ +#define NUC123_TIM_MAX_CHANNELS 4 + +#define NUC123_HAS_TIM1 TRUE +#define NUC123_TIM1_IS_32BITS TRUE +#define NUC123_TIM1_CHANNELS 1 + +#define NUC123_HAS_TIM2 TRUE +#define NUC123_TIM2_IS_32BITS TRUE +#define NUC123_TIM2_CHANNELS 1 + +#define NUC123_HAS_TIM3 TRUE +#define NUC123_TIM3_IS_32BITS TRUE +#define NUC123_TIM3_CHANNELS 1 + +#define NUC123_HAS_TIM4 TRUE +#define NUC123_TIM14_IS_32BITS TRUE +#define NUC123_TIM14_CHANNELS 1 + +#define NUC123_HAS_TIM5 FALSE +#define NUC123_HAS_TIM6 FALSE +#define NUC123_HAS_TIM7 FALSE +#define NUC123_HAS_TIM8 FALSE +#define NUC123_HAS_TIM9 FALSE +#define NUC123_HAS_TIM10 FALSE +#define NUC123_HAS_TIM11 FALSE +#define NUC123_HAS_TIM12 FALSE +#define NUC123_HAS_TIM13 FALSE +#define NUC123_HAS_TIM14 FALSE +#define NUC123_HAS_TIM15 FALSE +#define NUC123_HAS_TIM16 FALSE +#define NUC123_HAS_TIM17 FALSE +#define NUC123_HAS_TIM18 FALSE +#define NUC123_HAS_TIM19 FALSE +#define NUC123_HAS_TIM20 FALSE +#define NUC123_HAS_TIM21 FALSE +#define NUC123_HAS_TIM22 FALSE + +/* USART attributes.*/ +/*#define NUC123_HAS_USART1 TRUE +#define NUC123_USART1_RX_DMA_MSK (NUC123_DMA_STREAM_ID_MSK(1, 1) |\ + NUC123_DMA_STREAM_ID_MSK(1, 3) |\ + NUC123_DMA_STREAM_ID_MSK(1, 5)) +#define NUC123_USART1_RX_DMA_CHN 0x00080808 +#define NUC123_USART1_TX_DMA_MSK (NUC123_DMA_STREAM_ID_MSK(1, 2) |\ + NUC123_DMA_STREAM_ID_MSK(1, 4)) +#define NUC123_USART1_TX_DMA_CHN 0x00008080 + +#define NUC123_HAS_USART2 TRUE +#define NUC123_USART2_RX_DMA_MSK (NUC123_DMA_STREAM_ID_MSK(1, 1) |\ + NUC123_DMA_STREAM_ID_MSK(1, 3) |\ + NUC123_DMA_STREAM_ID_MSK(1, 5)) +#define NUC123_USART2_RX_DMA_CHN 0x00090909 +#define NUC123_USART2_TX_DMA_MSK (NUC123_DMA_STREAM_ID_MSK(1, 2) |\ + NUC123_DMA_STREAM_ID_MSK(1, 4)) +#define NUC123_USART2_TX_DMA_CHN 0x00009090 +*/ +#define NUC123_HAS_USART1 FALSE +#define NUC123_HAS_USART2 FALSE +#define NUC123_HAS_USART3 FALSE +#define NUC123_HAS_UART4 FALSE +#define NUC123_HAS_UART5 FALSE +#define NUC123_HAS_USART6 FALSE +#define NUC123_HAS_UART7 FALSE +#define NUC123_HAS_UART8 FALSE +#define NUC123_HAS_LPUART1 FALSE + +/* USB attributes.*/ +#define NUC123_HAS_USB TRUE +#define NUC123_HAS_OTG1 FALSE +#define NUC123_HAS_OTG2 FALSE + +/* IWDG attributes.*/ +#define NUC123_HAS_IWDG TRUE +#define NUC123_IWDG_IS_WINDOWED TRUE + +/* LTDC attributes.*/ +#define NUC123_HAS_LTDC FALSE + +/* DMA2D attributes.*/ +#define NUC123_HAS_DMA2D FALSE + +/* FSMC attributes.*/ +#define NUC123_HAS_FSMC FALSE + +/* CRC attributes.*/ +#define NUC123_HAS_CRC TRUE +#define NUC123_CRC_PROGRAMMABLE FALSE + +#else +#error "NUC123SD4AN0 device not specified" + +/** @} */ + +#endif /* NUC123_REGISTRY_H */ + +/** @} */ diff --git a/os/hal/ports/NUMICRO/NUC123SD4AN0/platform.mk b/os/hal/ports/NUMICRO/NUC123SD4AN0/platform.mk new file mode 100644 index 00000000..513addd6 --- /dev/null +++ b/os/hal/ports/NUMICRO/NUC123SD4AN0/platform.mk @@ -0,0 +1,22 @@ +# Required platform files. +PLATFORMSRC := $(CHIBIOS)/os/hal/ports/common/ARMCMx/nvic.c \ + $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/NUC123SD4AN0/hal_lld.c \ + $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/NUC123SD4AN0/system_NUC123.c + +# Required include directories. +PLATFORMINC := $(CHIBIOS)/os/hal/ports/common/ARMCMx \ + $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/NUC123SD4AN0 \ + $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD + +# Optional platform files. +ifeq ($(USE_SMART_BUILD),yes) +HALCONF := $(strip $(shell cat halconf.h | egrep -e "\#define")) + +endif + +# Drivers compatible with the platform. +include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/CLKv1/driver.mk +include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/GPIOv1/driver.mk +include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/TIMv1/driver.mk +include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/PWMv1/driver.mk +include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/USBv1/driver.mk diff --git a/os/hal/ports/NUMICRO/NUC123SD4AN0/system_NUC123.c b/os/hal/ports/NUMICRO/NUC123SD4AN0/system_NUC123.c new file mode 100644 index 00000000..f1b8a868 --- /dev/null +++ b/os/hal/ports/NUMICRO/NUC123SD4AN0/system_NUC123.c @@ -0,0 +1,79 @@ +/**************************************************************************//** + * @file system_NUC123.c + * @version V3.0 + * $Revision: 5 $ + * $Date: 15/07/02 11:21a $ + * @brief NUC123 Series CMSIS System File + * + * @note + * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. + * + ******************************************************************************/ +#include +#include "NUC123.h" + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __HSI; /*!< System Clock Frequency (Core Clock) */ +uint32_t CyclesPerUs = (__HSI / 1000000); /* Cycles per micro second */ +uint32_t PllClock = __HSI; /*!< PLL Output Clock Frequency */ +uint32_t gau32ClkSrcTbl[] = {__HXT, NULL, __HSI, __LIRC, NULL, NULL, NULL, __HIRC}; + + +/*---------------------------------------------------------------------------- + Clock functions + This function is used to update the variable SystemCoreClock + and must be called whenever the core clock is changed. + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate(void) /* Get Core Clock Frequency */ +{ + uint32_t u32Freq, u32ClkSrc; + uint32_t u32HclkDiv; + + /* Update PLL Clock */ + PllClock = CLK_GetPLLClockFreq(); + + u32ClkSrc = CLK->CLKSEL0 & CLK_CLKSEL0_HCLK_S_Msk; + + if(u32ClkSrc == CLK_CLKSEL0_HCLK_S_PLL) + { + /* Use PLL clock */ + u32Freq = PllClock; + } + else if(u32ClkSrc == CLK_CLKSEL0_HCLK_S_PLL_DIV2) + { + /* Use PLL/2 clock */ + u32Freq = PllClock >> 1; + } + else + { + /* Use the clock sources directly */ + u32Freq = gau32ClkSrcTbl[u32ClkSrc]; + } + + u32HclkDiv = (CLK->CLKDIV & CLK_CLKDIV_HCLK_N_Msk) + 1; + + /* Update System Core Clock */ + SystemCoreClock = u32Freq / u32HclkDiv; + + CyclesPerUs = (SystemCoreClock + 500000) / 1000000; +} + +/*---------------------------------------------------------------------------------------------------------*/ +/* Function: SystemInit */ +/* */ +/* Parameters: */ +/* None */ +/* */ +/* Returns: */ +/* None */ +/* */ +/* Description: */ +/* The necessary initialization of system. */ +/* */ +/*---------------------------------------------------------------------------------------------------------*/ +void SystemInit(void) +{ +} From 08e48cd50b0b91f978ce13e303f316e300c38e2d Mon Sep 17 00:00:00 2001 From: GitWellBack <48095880+GitWellBack@users.noreply.github.com> Date: Mon, 3 Jun 2019 20:52:09 +1000 Subject: [PATCH 2/3] Update to integrate OSS re-engineer of NUMICRO MCU --- os/common/ext/CMSIS/Nuvoton/NUMICRO/NUC123.h | 8762 ----------------- .../ext/CMSIS/Nuvoton/NUMICRO/NUC123SD4AN0.h | 5814 +++++++++++ os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/adc.h | 342 - os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/clk.h | 409 - os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/crc.h | 165 - os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/fmc.h | 480 - .../ext/CMSIS/Nuvoton/NUMICRO/inc/gpio.h | 457 - os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/i2c.h | 211 - os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/i2s.h | 319 - .../ext/CMSIS/Nuvoton/NUMICRO/inc/pdma.h | 198 - os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/ps2.h | 254 - os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/pwm.h | 230 - os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/spi.h | 381 - os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/sys.h | 1368 --- .../ext/CMSIS/Nuvoton/NUMICRO/inc/timer.h | 393 - .../ext/CMSIS/Nuvoton/NUMICRO/inc/uart.h | 427 - .../ext/CMSIS/Nuvoton/NUMICRO/inc/usbd.h | 663 -- os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/wdt.h | 200 - .../ext/CMSIS/Nuvoton/NUMICRO/inc/wwdt.h | 144 - .../ext/CMSIS/Nuvoton/NUMICRO/system_NUC123.h | 65 - .../Nuvoton/NUMICRO/system_NUC123SD4AN0.h | 75 + .../ARMCMx/devices/NUC123SD4AN0/cmparams.h | 5 +- os/hal/ports/NUMICRO/LLD/CLKv1/clk.c | 678 -- os/hal/ports/NUMICRO/LLD/CLKv1/clk.h | 409 - os/hal/ports/NUMICRO/LLD/CLKv1/driver.mk | 2 +- os/hal/ports/NUMICRO/LLD/CLKv1/hal_clks_lld.c | 511 + os/hal/ports/NUMICRO/LLD/CLKv1/hal_clks_lld.h | 222 + os/hal/ports/NUMICRO/LLD/GPIOv1/driver.mk | 2 +- os/hal/ports/NUMICRO/LLD/GPIOv1/gpio.c | 115 - os/hal/ports/NUMICRO/LLD/GPIOv1/hal_pal_lld.c | 15 +- os/hal/ports/NUMICRO/LLD/GPIOv1/hal_pal_lld.h | 1034 +- os/hal/ports/NUMICRO/LLD/PWMv1/driver.mk | 2 - os/hal/ports/NUMICRO/LLD/PWMv1/pwm.c | 677 -- os/hal/ports/NUMICRO/LLD/TIMv1/driver.mk | 1 + os/hal/ports/NUMICRO/LLD/TIMv1/hal_pwm_lld.c | 231 + os/hal/ports/NUMICRO/LLD/TIMv1/hal_pwm_lld.h | 120 + os/hal/ports/NUMICRO/LLD/TIMv1/hal_st_lld.c | 135 +- os/hal/ports/NUMICRO/LLD/TIMv1/hal_st_lld.h | 101 +- os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c | 2 +- os/hal/ports/NUMICRO/NUC123SD4AN0/hal_lld.c | 29 +- os/hal/ports/NUMICRO/NUC123SD4AN0/hal_lld.h | 102 +- .../NUMICRO/NUC123SD4AN0/system_NUC123.c | 79 - .../NUC123SD4AN0/system_NUC123SD4AN0.c | 153 + 43 files changed, 8351 insertions(+), 17631 deletions(-) delete mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/NUC123.h create mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/NUC123SD4AN0.h delete mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/adc.h delete mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/clk.h delete mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/crc.h delete mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/fmc.h delete mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/gpio.h delete mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/i2c.h delete mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/i2s.h delete mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/pdma.h delete mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/ps2.h delete mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/pwm.h delete mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/spi.h delete mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/sys.h delete mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/timer.h delete mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/uart.h delete mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/usbd.h delete mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/wdt.h delete mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/wwdt.h delete mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/system_NUC123.h create mode 100644 os/common/ext/CMSIS/Nuvoton/NUMICRO/system_NUC123SD4AN0.h delete mode 100644 os/hal/ports/NUMICRO/LLD/CLKv1/clk.c delete mode 100644 os/hal/ports/NUMICRO/LLD/CLKv1/clk.h create mode 100644 os/hal/ports/NUMICRO/LLD/CLKv1/hal_clks_lld.c create mode 100644 os/hal/ports/NUMICRO/LLD/CLKv1/hal_clks_lld.h delete mode 100644 os/hal/ports/NUMICRO/LLD/GPIOv1/gpio.c delete mode 100644 os/hal/ports/NUMICRO/LLD/PWMv1/driver.mk delete mode 100644 os/hal/ports/NUMICRO/LLD/PWMv1/pwm.c create mode 100644 os/hal/ports/NUMICRO/LLD/TIMv1/hal_pwm_lld.c create mode 100644 os/hal/ports/NUMICRO/LLD/TIMv1/hal_pwm_lld.h delete mode 100644 os/hal/ports/NUMICRO/NUC123SD4AN0/system_NUC123.c create mode 100644 os/hal/ports/NUMICRO/NUC123SD4AN0/system_NUC123SD4AN0.c diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/NUC123.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/NUC123.h deleted file mode 100644 index e2de58bf..00000000 --- a/os/common/ext/CMSIS/Nuvoton/NUMICRO/NUC123.h +++ /dev/null @@ -1,8762 +0,0 @@ -/**************************************************************************//** - * @file NUC123.h - * @version V3.0 - * $Revision: 84 $ - * $Date: 16/06/22 8:25p $ - * @brief NUC123 Series Peripheral Access Layer Header File - * - * @note - * Copyright (C) 2014~2016 Nuvoton Technology Corp. All rights reserved. - * - ******************************************************************************/ - -/** - \mainpage Introduction - * - * - * This user manual describes the usage of NUC123 Series MCU device driver - * - * Disclaimer - * - * The Software is furnished "AS IS", without warranty as to performance or results, and - * the entire risk as to performance or results is assumed by YOU. Nuvoton disclaims all - * warranties, express, implied or otherwise, with regard to the Software, its use, or - * operation, including without limitation any and all warranties of merchantability, fitness - * for a particular purpose, and non-infringement of intellectual property rights. - * - * Copyright Notice - * - * Copyright (C) 2014~2016 Nuvoton Technology Corp. All rights reserved. - */ - - -#ifndef __NUC123_H__ -#define __NUC123_H__ - -/* - * ========================================================================== - * ---------- Interrupt Number Definition ----------------------------------- - * ========================================================================== -*/ - -/** @addtogroup MCU_CMSIS Device Definitions for CMSIS - Interrupt Number Definition and Configurations for CMSIS - @{ -*/ - -/** - * @details Interrupt Number Definition. The maximum of 32 Specific Interrupts are possible. - */ - -typedef enum IRQn -{ - /****** Cortex-M0 Processor Exceptions Numbers ***************************************************/ - NonMaskableInt_IRQn = -14, /*!< 2 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 */ - - /****** ARMIKMCU Swift specific Interrupt Numbers ************************************************/ - BOD_IRQn = 0, /*!< Brown-Out Low Voltage Detected Interrupt */ - WDT_IRQn = 1, /*!< Watch Dog Timer Interrupt */ - EINT0_IRQn = 2, /*!< EINT0 Interrupt */ - EINT1_IRQn = 3, /*!< EINT1 Interrupt */ - GPAB_IRQn = 4, /*!< GPIO_PA/PB Interrupt */ - GPCDF_IRQn = 5, /*!< GPIO_PC/PD/PF Interrupt */ - PWMA_IRQn = 6, /*!< PWMA Interrupt */ - TMR0_IRQn = 8, /*!< TIMER0 Interrupt */ - TMR1_IRQn = 9, /*!< TIMER1 Interrupt */ - TMR2_IRQn = 10, /*!< TIMER2 Interrupt */ - TMR3_IRQn = 11, /*!< TIMER3 Interrupt */ - UART0_IRQn = 12, /*!< UART0 Interrupt */ - UART1_IRQn = 13, /*!< UART1 Interrupt */ - SPI0_IRQn = 14, /*!< SPI0 Interrupt */ - SPI1_IRQn = 15, /*!< SPI1 Interrupt */ - SPI2_IRQn = 16, /*!< SPI2 Interrupt */ - I2C0_IRQn = 18, /*!< I2C0 Interrupt */ - I2C1_IRQn = 19, /*!< I2C1 Interrupt */ - CAN0_IRQn = 20, /*!< CAN0 Interrupt */ - CAN1_IRQn = 21, /*!< CAN1 Interrupt */ - USBD_IRQn = 23, /*!< USB device Interrupt */ - PS2_IRQn = 24, /*!< PS/2 device Interrupt */ - PDMA_IRQn = 26, /*!< PDMA Interrupt */ - I2S_IRQn = 27, /*!< I2S Interrupt */ - PWRWU_IRQn = 28, /*!< Power Down Wake Up Interrupt */ - ADC_IRQn = 29, /*!< ADC Interrupt */ - IRC_IRQn = 30, /*!< IRC TRIM Interrupt */ -} IRQn_Type; - - -/* - * ========================================================================== - * ----------- Processor and Core Peripheral Section ------------------------ - * ========================================================================== - */ - -/* Configuration of the Cortex-M0 Processor and Core Peripherals */ -#define __MPU_PRESENT 0 /*!< armikcmu does not provide a MPU present or not */ -#define __NVIC_PRIO_BITS 2 /*!< armikcmu Supports 2 Bits for the Priority Levels */ -#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ - - -/*@}*/ /* end of group MCU_CMSIS */ - - -#include "core_cm0.h" /* Cortex-M0 processor and core peripherals */ -#include "system_NUC123.h" /* NUC123 System */ - -#if defined ( __CC_ARM ) -#pragma anon_unions -#endif - - -/*-------------------------------- Device Specific Peripheral registers structures ---------------------*/ -/** @addtogroup REGISTER Control Register - Peripheral Control Registers - @{ - */ - -/*----------------------------- ADC Controller -------------------------------*/ -/** @addtogroup REG_ADC Analog to Digital Converter (ADC) - Memory Mapped Structure for ADC Controller - @{ - */ - -typedef struct -{ - - - -/** - * @var ADC_T::ADDR - * Offset: 0x00-0x1C ADC Data Register x - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[9:0] |RSLT |A/D Conversion Result - * | | |This field contains conversion result of ADC. - * |[16] |OVERRUN |Overrun Flag (Read Only) - * | | |If converted data in RSLT has not been read before new conversion result is loaded to this register, OVERRUN is set to 1 and previous conversion result is gone. - * | | |It is cleared by hardware after ADDR register is read. - * | | |0 = Data in RSLT (ADDRx[9:0], x=0~7) is recent conversion result. - * | | |1 = Data in RSLT (ADDRx[9:0], x=0~7) is overwritten. - * |[17] |VALID |Valid Flag (Read Only) - * | | |This bit is set to 1 when corresponding channel analog input conversion is completed and cleared by hardware after ADDR register is read. - * | | |0 = Data in RSLT bits (ADDRx[9:0], x=0~7) is not valid. - * | | |1 = Data in RSLT bits (ADDRx[9:0], x=0~7) is valid. - * @var ADC_T::ADCR - * Offset: 0x20 ADC Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |ADEN |A/D Converter Enable Bit - * | | |Before starting A/D conversion function, this bit should be set to 1. - * | | |Clear it to 0 to disable A/D converter analog circuit for saving power consumption. - * | | |0 = A/D converter Disabled. - * | | |1 = A/D converter Enabled. - * |[1] |ADIE |A/D Interrupt Enable Bit - * | | |A/D conversion end interrupt request is generated if ADIE bit is set to 1. - * | | |0 = A/D interrupt function Disabled. - * | | |1 = A/D interrupt function Enabled. - * |[3:2] |ADMD |A/D Converter Operation Mode - * | | |00 = Single conversion. - * | | |01 = Reserved. - * | | |10 = Single-cycle scan. - * | | |11 = Continuous scan. - * | | |When changing the operation mode, software should disable ADST bit (ADCR[11]) firstly. - * |[5:4] |TRGS |Hardware Trigger Source - * | | |00 = A/D conversion is started by external STADC pin. - * | | |11 = A/D conversion is started by PWM Center-aligned trigger. - * | | |Others = Reserved. - * | | |Note: TRGEN (ADCR[8]) and ADST (ADCR[11]) shall be cleared to 0 before changing TRGS. - * |[7:6] |TRGCOND |External Trigger Condition - * | | |These two bits decide external pin STADC trigger event is level or edge. - * | | |The signal must be kept at stable state at least 8 PCLKs for level trigger and 4 PCLKs at high and low state for edge trigger. - * | | |00 = Low level. - * | | |01 = High level. - * | | |10 = Falling edge. - * | | |11 = Rising edge. - * |[8] |TRGEN |Hardware Trigger Enable Bit - * | | |Enable or disable triggering of A/D conversion by external STADC pin or by PWM trigger. - * | | |0 = External trigger Disabled. - * | | |1 = External trigger Enabled. - * | | |Note: ADC hardware trigger function is only supported in single-cycle scan mode. - * | | |If hardware trigger is enabled, the ADST bit can be set to 1 by the selected hardware trigger source. - * |[9] |PTEN |PDMA Transfer Enable Bit - * | | |When A/D conversion is completed, the converted data is loaded into ADDR 0~7, software can enable this bit to generate a PDMA data transfer request. - * | | |When PTEN=1, software must set ADIE=0 (ADCR[1]) to disable interrupt. - * | | |0 = PDMA data transfer Disabled. - * | | |1 = PDMA data transfer in ADDR 0~7 Enabled. - * |[11] |ADST |A/D Conversion Start - * | | |ADST bit can be set to 1 from three sources: software, STADC pin and PWM output. - * | | |ADST will be cleared to 0 by hardware automatically at the ends of single mode and single-cycle scan mode. - * | | |In continuous scan mode, A/D conversion is continuously performed until software writes 0 to this bit or chip reset. - * | | |0 = Conversion stopped and A/D converter entering idle state. - * | | |1 = Conversion started. - * | | |Note: when ADST is clear to 0 by hardware automatically in single mode, user need to wait one ADC_CLK cycle for next A/D conversion. - * @var ADC_T::ADCHER - * Offset: 0x24 ADC Channel Enable Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[7:0] |CHEN |Analog Input Channel Enable Bit - * | | |Set CHEN[7:0] to enable the corresponding analog input channel 7 ~ 0. - * | | |0 = Channel Disabled. - * | | |1 = Channel Enabled. - * |[8] |PRESEL |Analog Input Channel 7 Select - * | | |0 = External analog input. - * | | |1 = Internal band-gap voltage. - * | | |Note: - * | | |When software selects the band-gap voltage as the analog input source of ADC channel 7, ADC clock rate needs to be limited to slower than 300 kHz. - * @var ADC_T::ADCMPR - * Offset: 0x28-0x2C ADC Compare Register x - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |CMPEN |Compare Enable Bit - * | | |Set this bit to 1 to enable ADC controller to compare CMPD (ADCMPRx[25:16]) with specified channel conversion result when converted data is loaded into ADDRx register. - * | | |0 = Compare function Disabled. - * | | |1 = Compare function Enabled. - * |[1] |CMPIE |Compare Interrupt Enable Bit - * | | |If the compare function is enabled and the compare condition matches the setting of - * | | |CMPCOND (ADCMPRx[2]) and CMPMATCNT (ADCMPRx[11:8]), CMPFx bit (ADSR[2:1]) - * | | |will be set, in the meanwhile, if CMPIE (ADCMPRx[1]) is set to 1, a compare interrupt - * | | |request is generated. - * | | |0 = Compare function interrupt Disabled. - * | | |1 = Compare function interrupt Enabled. - * |[2] |CMPCOND |Compare Condition - * | | |0 = Set the compare condition as that when a 10-bit A/D conversion result is less than the 10-bit CMPD (ADCMPRx[25:16]), the internal match counter will increase one. - * | | |1 = Set the compare condition as that when a 10-bit A/D conversion result is greater or equal to the 10-bit CMPD (ADCMPRx[25:16]), the internal match counter will increase one. - * | | |Note: When the internal counter reaches the value to (CMPMATCNT+1), the CMPFx bit will be set. - * |[5:3] |CMPCH |Compare Channel Selection - * | | |000 = Channel 0 conversion result is selected to be compared. - * | | |001 = Channel 1 conversion result is selected to be compared. - * | | |010 = Channel 2 conversion result is selected to be compared. - * | | |011 = Channel 3 conversion result is selected to be compared. - * | | |100 = Channel 4 conversion result is selected to be compared. - * | | |101 = Channel 5 conversion result is selected to be compared. - * | | |110 = Channel 6 conversion result is selected to be compared. - * | | |111 = Channel 7 conversion result is selected to be compared. - * |[11:8] |CMPMATCNT |Compare Match Count - * | | |When the specified A/D channel analog conversion result matches the compare condition defined by CMPCOND (ADCMPRx[2]), the internal match counter will increase 1, - * | | |otherwise, the compare match counter will be cleared to 0. - * | | |When the internal counter reaches the value to (CMPMATCNT+1), CMPFx bit (ADSR[2:1]) will be set. - * |[25:16] |CMPD |Comparison Data - * | | |The 10-bit data is used to compare with conversion result of specified channel. - * @var ADC_T::ADSR - * Offset: 0x30 ADC Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |ADF |A/D Conversion End Flag - * | | |A status flag that indicates the end of A/D conversion. - * | | |ADF is set to 1 at these two conditions: - * | | |1. When A/D conversion ends in Single mode. - * | | |2. When A/D conversion ends on all specified channels in Scan mode. - * | | |This flag can be cleared by writing 1 to itself. - * |[1] |CMPF0 |Compare Flag - * | | |When the selected channel A/D conversion result meets setting condition in ADCMPR0 then this bit is set to 1. - * | | |And it is cleared by writing 1 to self. - * | | |0 = Conversion result in ADDR does not meet ADCMPR0 setting. - * | | |1 = Conversion result in ADDR meets ADCMPR0 setting. - * |[2] |CMPF1 |Compare Flag - * | | |When the selected channel A/D conversion result meets setting condition in ADCMPR1 then this bit is set to 1. - * | | |And it is cleared by writing 1 to self. - * | | |0 = Conversion result in ADDR does not meet ADCMPR1 setting. - * | | |1 = Conversion result in ADDR meets ADCMPR1 setting. - * |[3] |BUSY |BUSY/IDLE (Read Only) - * | | |0 = A/D converter is in idle state. - * | | |1 = A/D converter is busy at conversion. - * | | |This bit is a mirror of ADST bit in ADCR. - * |[6:4] |CHANNEL |Current Conversion Channel (Read Only) - * | | |This field reflects the current conversion channel when BUSY = 1 (ADSR[3]). - * | | |When BUSY(ADSR[3]) = 0, it shows the number of the next converted channel. - * |[15:8] |VALID |Data Valid Flag (Read Only) - * | | |VALID[7:0] is a mirror of the VALID bits in ADDR7[17] ~ ADDR0[17]. - * | | |It is read only. - * |[23:16] |OVERRUN |Overrun Flag (Read Only) - * | | |OVERRUN[7:0] is a mirror of the OVERRUN bits in ADDR7[16] ~ ADDR0[16]. - * @var ADC_T::ADPDMA - * Offset: 0x40 ADC PDMA Current Transfer Data Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[9:0] |AD_PDMA |ADC PDMA Current Transfer Data Register (Read Only) - * | | |When transferring A/D conversion result with PDMA, software can read this register to monitor current PDMA transfer data. - */ - - __I uint32_t ADDR[8]; /* Offset: 0x00-0x1C ADC Data Register x */ - __IO uint32_t ADCR; /* Offset: 0x20 ADC Control Register */ - __IO uint32_t ADCHER; /* Offset: 0x24 ADC Channel Enable Register */ - __IO uint32_t ADCMPR[2]; /* Offset: 0x28-0x2C ADC Compare Register x */ - __IO uint32_t ADSR; /* Offset: 0x30 ADC Status Register */ - __I uint32_t RESERVE0[3]; - __I uint32_t ADPDMA; /* Offset: 0x40 ADC PDMA Current Transfer Data Register */ - -} ADC_T; - - - -/** @addtogroup REG_ADC_BITMASK ADC Bit Mask - @{ - */ - -/* ADDR Bit Field Definitions */ -#define ADC_ADDR_VALID_Pos 17 /*!< ADC_T::ADDR: VALID Position */ -#define ADC_ADDR_VALID_Msk (1ul << ADC_ADDR_VALID_Pos) /*!< ADC_T::ADDR: VALID Mask */ - -#define ADC_ADDR_OVERRUN_Pos 16 /*!< ADC_T::ADDR: OVERRUN Position */ -#define ADC_ADDR_OVERRUN_Msk (1ul << ADC_ADDR_OVERRUN_Pos) /*!< ADC_T::ADDR: OVERRUN Mask */ - -#define ADC_ADDR_RSLT_Pos 0 /*!< ADC_T::ADDR: RSLT Position */ -#define ADC_ADDR_RSLT_Msk (0x3FFul << ADC_ADDR_RSLT_Pos) /*!< ADC_T::ADDR: RSLT Mask */ - -/* ADCR Bit Field Definitions */ -#define ADC_ADCR_ADST_Pos 11 /*!< ADC_T::ADCR: ADST Position */ -#define ADC_ADCR_ADST_Msk (1ul << ADC_ADCR_ADST_Pos) /*!< ADC_T::ADCR: ADST Mask */ - -#define ADC_ADCR_PTEN_Pos 9 /*!< ADC_T::ADCR: PTEN Position */ -#define ADC_ADCR_PTEN_Msk (1ul << ADC_ADCR_PTEN_Pos) /*!< ADC_T::ADCR: PTEN Mask */ - -#define ADC_ADCR_TRGEN_Pos 8 /*!< ADC_T::ADCR: TRGEN Position */ -#define ADC_ADCR_TRGEN_Msk (1ul << ADC_ADCR_TRGEN_Pos) /*!< ADC_T::ADCR: TRGEN Mask */ - -#define ADC_ADCR_TRGCOND_Pos 6 /*!< ADC_T::ADCR: TRGCOND Position */ -#define ADC_ADCR_TRGCOND_Msk (3ul << ADC_ADCR_TRGCOND_Pos) /*!< ADC_T::ADCR: TRGCOND Mask */ - -#define ADC_ADCR_TRGS_Pos 4 /*!< ADC_T::ADCR: TRGS Position */ -#define ADC_ADCR_TRGS_Msk (3ul << ADC_ADCR_TRGS_Pos) /*!< ADC_T::ADCR: TRGS Mask */ - -#define ADC_ADCR_ADMD_Pos 2 /*!< ADC_T::ADCR: ADMD Position */ -#define ADC_ADCR_ADMD_Msk (3ul << ADC_ADCR_ADMD_Pos) /*!< ADC_T::ADCR: ADMD Mask */ - -#define ADC_ADCR_ADIE_Pos 1 /*!< ADC_T::ADCR: ADIE Position */ -#define ADC_ADCR_ADIE_Msk (1ul << ADC_ADCR_ADIE_Pos) /*!< ADC_T::ADCR: ADIE Mask */ - -#define ADC_ADCR_ADEN_Pos 0 /*!< ADC_T::ADCR: ADEN Position */ -#define ADC_ADCR_ADEN_Msk (1ul << ADC_ADCR_ADEN_Pos) /*!< ADC_T::ADCR: ADEN Mask */ - -/* ADCHER Bit Field Definitions */ -#define ADC_ADCHER_PRESEL_Pos 8 /*!< ADC_T::ADCHER: PRESEL Position */ -#define ADC_ADCHER_PRESEL_Msk (1ul << ADC_ADCHER_PRESEL_Pos) /*!< ADC_T::ADCHER: PRESEL Mask */ - -#define ADC_ADCHER_CHEN_Pos 0 /*!< ADC_T::ADCHER: CHEN Position */ -#define ADC_ADCHER_CHEN_Msk (0xFFul << ADC_ADCHER_CHEN_Pos) /*!< ADC_T::ADCHER: CHEN Mask */ - -/* ADCMPR Bit Field Definitions */ -#define ADC_ADCMPR_CMPD_Pos 16 /*!< ADC_T::ADCMPR: CMPD Position */ -#define ADC_ADCMPR_CMPD_Msk (0x3FFul << ADC_ADCMPR_CMPD_Pos) /*!< ADC_T::ADCMPR: CMPD Mask */ - -#define ADC_ADCMPR_CMPMATCNT_Pos 8 /*!< ADC_T::ADCMPR: CMPMATCNT Position */ -#define ADC_ADCMPR_CMPMATCNT_Msk (0xFul << ADC_ADCMPR_CMPMATCNT_Pos) /*!< ADC_T::ADCMPR: CMPMATCNT Mask */ - -#define ADC_ADCMPR_CMPCH_Pos 3 /*!< ADC_T::ADCMPR: CMPCH Position */ -#define ADC_ADCMPR_CMPCH_Msk (7ul << ADC_ADCMPR_CMPCH_Pos) /*!< ADC_T::ADCMPR: CMPCH Mask */ - -#define ADC_ADCMPR_CMPCOND_Pos 2 /*!< ADC_T::ADCMPR: CMPCOND Position */ -#define ADC_ADCMPR_CMPCOND_Msk (1ul << ADC_ADCMPR_CMPCOND_Pos) /*!< ADC_T::ADCMPR: CMPCOND Mask */ - -#define ADC_ADCMPR_CMPIE_Pos 1 /*!< ADC_T::ADCMPR: CMPIE Position */ -#define ADC_ADCMPR_CMPIE_Msk (1ul << ADC_ADCMPR_CMPIE_Pos) /*!< ADC_T::ADCMPR: CMPIE Mask */ - -#define ADC_ADCMPR_CMPEN_Pos 0 /*!< ADC_T::ADCMPR: CMPEN Position */ -#define ADC_ADCMPR_CMPEN_Msk (1ul << ADC_ADCMPR_CMPEN_Pos) /*!< ADC_T::ADCMPR: CMPEN Mask */ - -/* ADSR Bit Field Definitions */ -#define ADC_ADSR_OVERRUN_Pos 16 /*!< ADC_T::ADSR: OVERRUN Position */ -#define ADC_ADSR_OVERRUN_Msk (0xFFul << ADC_ADSR_OVERRUN_Pos) /*!< ADC_T::ADSR: OVERRUN Mask */ - -#define ADC_ADSR_VALID_Pos 8 /*!< ADC_T::ADSR: VALID Position */ -#define ADC_ADSR_VALID_Msk (0xFFul << ADC_ADSR_VALID_Pos) /*!< ADC_T::ADSR: VALID Mask */ - -#define ADC_ADSR_CHANNEL_Pos 4 /*!< ADC_T::ADSR: CHANNEL Position */ -#define ADC_ADSR_CHANNEL_Msk (7ul << ADC_ADSR_CHANNEL_Pos) /*!< ADC_T::ADSR: CHANNEL Mask */ - -#define ADC_ADSR_BUSY_Pos 3 /*!< ADC_T::ADSR: BUSY Position */ -#define ADC_ADSR_BUSY_Msk (1ul << ADC_ADSR_BUSY_Pos) /*!< ADC_T::ADSR: BUSY Mask */ - -#define ADC_ADSR_CMPF1_Pos 2 /*!< ADC_T::ADSR: CMPF1 Position */ -#define ADC_ADSR_CMPF1_Msk (1ul << ADC_ADSR_CMPF1_Pos) /*!< ADC_T::ADSR: CMPF1 Mask */ - -#define ADC_ADSR_CMPF0_Pos 1 /*!< ADC_T::ADSR: CMPF0 Position */ -#define ADC_ADSR_CMPF0_Msk (1ul << ADC_ADSR_CMPF0_Pos) /*!< ADC_T::ADSR: CMPF0 Mask */ - -#define ADC_ADSR_ADF_Pos 0 /*!< ADC_T::ADSR: ADF Position */ -#define ADC_ADSR_ADF_Msk (1ul << ADC_ADSR_ADF_Pos) /*!< ADC_T::ADSR: ADF Mask */ - -/* ADPDMA Bit Field Definitions */ -#define ADC_ADPDMA_AD_PDMA_Pos 0 /*!< ADC_T::ADPDMA: AD_PDMA Position */ -#define ADC_ADPDMA_AD_PDMA_Msk (0x3FFul << ADC_ADPDMA_AD_PDMA_Pos) /*!< ADC_T::ADPDMA: AD_PDMA Mask */ -/*@}*/ /* end of group REG_ADC_BITMASK */ -/*@}*/ /* end of group REG_ADC */ - - -/*---------------------------- Clock Controller ------------------------------*/ -/** @addtogroup REG_CLK System Clock Controller (CLK) - Memory Mapped Structure for System Clock Controller - @{ - */ - -typedef struct -{ - - - -/** - * @var CLK_T::PWRCON - * Offset: 0x00 System Power-down Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |XTL12M_EN |External 4~24 MHz High Speed Crystal Enable (HXT) Control (Write Protect) - * | | |The bit default value is set by flash controller user configuration register CFOSC (Config0[26:24]). - * | | |When the default clock source is from external 4~24 MHz high speed crystal, this bit is set to 1 automatically. - * | | |0 = External 4~24 MHz high speed crystal oscillator (HXT) Disabled. - * | | |1 = External 4~24 MHz high speed crystal oscillator (HXT) Enabled. - * | | |Note: This bit is write protected bit. Refer to the REGWRPROT register. - * |[2] |OSC22M_EN |Internal 22.1184 MHz High Speed Oscillator (HIRC) Enable Control (Write Protect) - * | | |0 = Internal 22.1184 MHz high speed oscillator (HIRC) Disabled. - * | | |1 = Internal 22.1184 MHz high speed oscillator (HIRC) Enabled. - * | | |Note: This bit is write protected bit. Refer to the REGWRPROT register. - * |[3] |OSC10K_EN |Internal 10 KHz Low Speed Oscillator (LIRC) Enable Control (Write Protect) - * | | |0 = Internal 10 kHz low speed oscillator (LIRC) Disabled. - * | | |1 = Internal 10 kHz low speed oscillator (LIRC) Enabled. - * | | |Note: This bit is write protected bit. Refer to the REGWRPROT register. - * |[4] |PD_WU_DLY |Wake-up Delay Counter Enable Control (Write Protect) - * | | |When the chip wakes up from Power-down mode, the clock control will delay certain clock cycles to wait system clock stable. - * | | |The delayed clock cycle is 4096 clock cycles when chip work at external 4~24 MHz high speed crystal, and 256 clock cycles when chip work at internal 22.1184 MHz high speed oscillator. - * | | |0 = Clock cycles delay Disabled. - * | | |1 = Clock cycles delay Enabled. - * | | |Note: This bit is write protected bit. Refer to the REGWRPROT register. - * |[5] |PD_WU_INT_EN|Power-Down Mode Wake-Up Interrupt Enable Control (Write Protect) - * | | |0 = Power-down mode wake-up interrupt Disabled. - * | | |1 = Power-down mode wake-up interrupt Enabled. - * | | |Note1: The interrupt will occur when both PD_WU_STS and PD_WU_INT_EN are high. - * | | |Note2: This bit is write protected bit. Refer to the REGWRPROT register. - * |[6] |PD_WU_STS |Power-down Mode Wake-Up Interrupt Status - * | | |Set by "Power-down wake-up event", it indicates that resume from Power-down mode. - * | | |The flag is set if the GPIO, USB, UART, WDT, TIMER, I2C or BOD wake-up occurred. - * | | |This bit can be cleared to 0 by software writing "1". - * | | |Note: This bit is working only if PD_WU_INT_EN (PWRCON[5]) set to 1. - * |[7] |PWR_DOWN_EN|System Power-down Enable Bit (Write Protect) - * | | |When this bit is set to 1, Power-down mode is enabled and chip Power-down behavior will depends on the PD_WAIT_CPU bit - * | | |(a) If the PD_WAIT_CPU is 0, then the chip enters Power-down mode immediately after the PWR_DOWN_EN bit set. - * | | |(b) if the PD_WAIT_CPU is 1, then the chip keeps active till the CPU sleep mode is also active and then the chip enters Power-down mode (recommend) - * | | |When chip wakes up from Power-down mode, this bit is cleared by hardware. - * | | |User needs to set this bit again for next Power-down. - * | | |In Power-down mode, 4~24 MHz external high speed crystal oscillator (HXT) and the 22.1184 MHz internal high speed RC oscillator (HIRC) will be disabled in this mode, but the 10 kHz internal low speed RC oscillator (LIRC) is not controlled by Power-down mode. - * | | |In Power- down mode, the PLL and system clock are disabled, and ignored the clock source selection. The clocks of peripheral are not controlled by Power-down mode, if the peripheral clock source is from the 10 kHz internal low speed RC oscillator (LIRC). - * | | |The clocks of peripheral are not controlled by Power-down mode, if the peripheral clock source is from the internal 10 kHz low speed oscillator. - * | | |0 = Chip operating normally or chip in Idle mode because of WFI command. - * | | |1 = Chip enters Power-down mode instantly or waits CPU sleep command WFI. - * | | |Note: This bit is write protected bit. Refer to the REGWRPROT register. - * |[8] |PD_WAIT_CPU|This Bit Control The Power-Down Entry Condition (Write Protect) - * | | |0 = Chip enters Power-down mode when the PWR_DOWN_EN bit is set to 1. - * | | |1 = Chip enters Power-down mode when the both PD_WAIT_CPU and PWR_DOWN_EN bits are set to 1 and CPU run WFI instruction. - * | | |Note: This bit is write protected bit. Refer to the REGWRPROT register. - * @var CLK_T::AHBCLK - * Offset: 0x04 AHB Devices Clock Enable Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[1] |PDMA_EN |PDMA Controller Clock Enable Control - * | | |0 = PDMA peripheral clock Disabled. - * | | |1 = PDMA peripheral clock Enabled. - * |[2] |ISP_EN |Flash ISP Controller Clock Enable Control - * | | |0 = Flash ISP peripheral clock Disabled. - * | | |1 = Flash ISP peripheral clock Enabled. - * @var CLK_T::APBCLK - * Offset: 0x08 APB Devices Clock Enable Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |WDT_EN |Watchdog Timer Clock Enable Control (Write Protect) - * | | |0 = Watchdog Timer clock Disabled. - * | | |1 = Watchdog Timer clock Enabled. - * | | |Note: This bit is write protected bit. Refer to the REGWRPROT register. - * |[2] |TMR0_EN |Timer0 Clock Enable Control - * | | |0 = Timer0 clock Disabled. - * | | |1 = Timer0 clock Enabled. - * |[3] |TMR1_EN |Timer1 Clock Enable Control - * | | |0 = Timer1 clock Disabled. - * | | |1 = Timer1 clock Enabled. - * |[4] |TMR2_EN |Timer2 Clock Enable Control - * | | |0 = Timer2 clock Disabled. - * | | |1 = Timer2 clock Enabled. - * |[5] |TMR3_EN |Timer3 Clock Enable Control - * | | |0 = Timer3 clock Disabled. - * | | |1 = Timer3 clock Enabled. - * |[6] |FDIV_EN |Frequency Divider Output Clock Enable Control - * | | |0 = FDIV clock Disabled. - * | | |1 = FDIV clock Enabled. - * |[8] |I2C0_EN |I2C0 Clock Enable Control - * | | |0 = I2C0 clock Disabled. - * | | |1 = I2C0 clock Enabled. - * |[9] |I2C1_EN |I2C1 Clock Enable Control - * | | |0 = I2C1 clock Disabled. - * | | |1 = I2C1 clock Enabled. - * |[12] |SPI0_EN |SPI0 Clock Enable Control - * | | |0 = SPI0 clock Disabled. - * | | |1 = SPI0 clock Enabled. - * |[13] |SPI1_EN |SPI1 Clock Enable Control - * | | |0 = SPI1 clock Disabled. - * | | |1 = SPI1 clock Enabled. - * |[14] |SPI2_EN |SPI2 Clock Enable Control - * | | |0 = SPI2 clock Disabled. - * | | |1 = SPI2 clock Enabled. - * |[16] |UART0_EN |UART0 Clock Enable Control - * | | |0 = UART0 clock Disabled. - * | | |1 = UART0 clock Enabled. - * |[17] |UART1_EN |UART1 Clock Enable Control - * | | |0 = UART1 clock Disabled. - * | | |1 = UART1 clock Enabled. - * |[20] |PWM01_EN |PWM_01 Clock Enable Control - * | | |0 = PWM01 clock Disabled. - * | | |1 = PWM01 clock Enabled. - * |[21] |PWM23_EN |PWM_23 Clock Enable Control - * | | |0 = PWM23 clock Disabled. - * | | |1 = PWM23 clock Enabled. - * |[27] |USBD_EN |USB 2.0 FS Device Controller Clock Enable Control - * | | |0 = USB clock Disabled. - * | | |1 = USB clock Enabled. - * |[28] |ADC_EN |Analog-Digital-Converter (ADC) Clock Enable Control - * | | |0 = ADC clock Disabled. - * | | |1 = ADC clock Enabled. - * |[29] |I2S_EN |I2S Clock Enable Control - * | | |0 = I2S clock Disabled. - * | | |1 = I2S clock Enabled. - * |[31] |PS2_EN |PS/2 Clock Enable Control - * | | |0 = PS/2 clock Disabled. - * | | |1 = PS/2 clock Enabled. - * @var CLK_T::CLKSTATUS - * Offset: 0x0C Clock status monitor Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |XTL12M_STB|External 4~24 MHz High Speed Crystal (HXT) Clock Source Stable Flag (Read Only) - * | | |0 = External 4~24 MHz high speed crystal clock (HXT) is not stable or disabled. - * | | |1 = External 4~24 MHz high speed crystal clock (HXT) is stable and enabled. - * |[2] |PLL_STB |Internal PLL Clock Source Stable Flag (Read Only) - * | | |0 = Internal PLL clock is not stable or disabled. - * | | |1 = Internal PLL clock is stable in normal mode. - * |[3] |OSC10K_STB|Internal 10 KHz Low Speed Oscillator (LIRC) Clock Source Stable Flag (Read Only) - * | | |0 = Internal 10 kHz low speed oscillator clock (LIRC) is not stable or disabled. - * | | |1 = Internal 10 kHz low speed oscillator clock (LIRC) is stable and enabled. - * |[4] |OSC22M_STB|Internal 22.1184 MHz High Speed Oscillator (HIRC) Clock Source Stable Flag (Read Only) - * | | |0 = Internal 22.1184 MHz high speed oscillator (HIRC) clock is not stable or disabled. - * | | |1 = Internal 22.1184 MHz high speed oscillator (HIRC) clock is stable and enabled. - * |[7] |CLK_SW_FAIL|Clock Switching Fail Flag - * | | |This bit is updated when software switches system clock source. - * | | |If switch target clock is stable, this bit will be set to 0. - * | | |If switch target clock is not stable, this bit will be set to 1. - * | | |0 = Clock switching success. - * | | |1 = Clock switching failure. - * | | |Note1: On NUC123xxxANx, this bit can be cleared to 0 by software writing "1". - * | | |Note2: On NUC123xxxAEx, this bit is read only. After selected clock source is stable, hardware will switch system clock to selected clock automatically, and CLK_SW_FAIL will be cleared automatically by hardware. - * @var CLK_T::CLKSEL0 - * Offset: 0x10 Clock Source Select Control Register 0 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[2:0] |HCLK_S |HCLK Clock Source Select (Write Protect) - * | | |The 3-bit default value is reloaded from the value of CFOSC (CONFIG0[26:24]) in user configuration register of Flash controller by any reset. - * | | |Therefore the default value is either 000b or 111b. - * | | |000 = Clock source from external 4~24 MHz high speed crystal oscillator clock. - * | | |001 = Clock source from PLL/2 clock. - * | | |010 = Clock source from PLL clock. - * | | |011 = Clock source from internal 10 kHz low speed oscillator clock. - * | | |111 = Clock source from internal 22.1184 MHz high speed oscillator clock. - * | | |Note1: Before clock switching, the related clock sources (both pre-select and new-select) must be turn on. - * | | |Note2: These bits are write protected bit. Refer to the REGWRPROT register. - * |[5:3] |STCLK_S |Cortex-M0 SysTick Clock Source Select (Write Protect) - * | | |If SYST_CSR[2] = 1, SysTick clock source is from HCLK. - * | | |If SYST_CSR[2] = 0, SysTick clock source is defined by STCLK_S(CLKSEL0[5:3]). - * | | |000 = Clock source from external 4~24 MHz high speed crystal clock. - * | | |010 = Clock source from external 4~24 MHz high speed crystal clock/2. - * | | |011 = Clock source from HCLK/2. - * | | |111 = Clock source from internal 22.1184 MHz high speed oscillator clock/2. - * | | |Note1: If SysTick clock source is not from HCLK (i.e. SYST_CSR[2] = 0), SysTick clock source must less than or equal to HCLK/2. - * | | |Note2: These bits are write protected bit. Refer to the REGWRPROT register. - * @var CLK_T::CLKSEL1 - * Offset: 0x14 Clock Source Select Control Register 1 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[1:0] |WDT_S |Watchdog Timer Clock Source Select (Write Protect) - * | | |10 = Clock source from HCLK/2048 clock. - * | | |11 = Clock source from internal 10 kHz low speed oscillator clock. - * | | |Note: These bits are write protected bit. Refer to the REGWRPROT register. - * |[3:2] |ADC_S |ADC Clock Source Select - * | | |00 = Clock source from external 4~24 MHz high speed crystal oscillator clock. - * | | |01 = Clock source from PLL clock. - * | | |10 = Clock source from HCLK. - * | | |11 = Clock source from internal 22.1184 MHz high speed oscillator clock. - * |[4] |SPI0_S |SPI0 Clock Source Selection - * | | |0 = Clock source from PLL clock. - * | | |1 = Clock source from HCLK. - * |[5] |SPI1_S |SPI1 Clock Source Selection - * | | |0 = Clock source from PLL clock. - * | | |1 = Clock source from HCLK. - * |[6] |SPI2_S |SPI2 Clock Source Selection - * | | |0 = Clock source from PLL clock. - * | | |1 = Clock source from HCLK. - * |[10:8] |TMR0_S |TIMER0 Clock Source Selection - * | | |000 = Clock source from external 4~24 MHz high speed crystal clock. - * | | |010 = Clock source from HCLK. - * | | |011 = Clock source from external trigger. - * | | |101 = Clock source from internal 10 kHz low speed oscillator clock. - * | | |111 = Clock source from internal 22.1184 MHz high speed oscillator clock. - * | | |Others = Reserved. - * |[14:12] |TMR1_S |TIMER1 Clock Source Selection - * | | |000 = Clock source from external 4~24 MHz high speed crystal clock. - * | | |010 = Clock source from HCLK. - * | | |011 = Clock source from external trigger. - * | | |101 = Clock source from internal 10 kHz low speed oscillator clock. - * | | |111 = Clock source from internal 22.1184 MHz high speed oscillator clock. - * | | |Others = Reserved. - * |[18:16] |TMR2_S |TIMER2 Clock Source Selection - * | | |000 = Clock source from external 4~24 MHz high speed crystal clock. - * | | |010 = Clock source from HCLK. - * | | |011 = Clock source from external trigger. - * | | |101 = Clock source from internal 10 kHz low speed oscillator clock. - * | | |111 = Clock source from internal 22.1184 MHz high speed oscillator clock. - * | | |Others = Reserved. - * |[22:20] |TMR3_S |TIMER3 Clock Source Selection - * | | |000 = Clock source from external 4~24 MHz high speed crystal clock. - * | | |010 = Clock source from HCLK. - * | | |011 = Reserved. - * | | |101 = Clock source from internal 10 kHz low speed oscillator clock. - * | | |111 = Clock source from internal 22.1184 MHz high speed oscillator clock. - * | | |Others = Reserved. - * |[25:24] |UART_S |UART Clock Source Selection - * | | |00 = Clock source from external 4~24 MHz high speed crystal oscillator clock. - * | | |01 = Clock source from PLL clock. - * | | |11 = Clock source from internal 22.1184 MHz high speed oscillator clock. - * |[29:28] |PWM01_S |PWM0 and PWM1 Clock Source Selection - * | | |PWM0 and PWM1 used the same clock source; both of them used the same prescaler. - * | | |The clock source of PWM0 and PWM1 is defined by PWM01_S (CLKSEL1[29:28]) and PWM01_S_E (CLKSEL2[8]). - * | | |If PWM01_S_E = 0, the clock source of PWM0 and PWM1 defined by PWM01_S list below: - * | | |00 = Clock source from external 4~24 MHz high speed crystal oscillator clock. - * | | |10 = Clock source from HCLK. - * | | |11 = Clock source from internal 22.1184 MHz high speed oscillator clock. - * | | |If PWM01_S_E = 1, the clock source of PWM0 and PWM1 defined by PWM01_S list below: - * | | |00 = Reserved. - * | | |01 = Reserved. - * | | |10 = Reserved. - * | | |11 = Clock source from internal 10 kHz low speed oscillator clock. - * |[31:30] |PWM23_S |PWM2 and PWM3 Clock Source Selection - * | | |PWM2 and PWM3 used the same clock source; both of them used the same prescaler. - * | | |The clock source of PWM2 and PWM3 is defined by PWM23_S (CLKSEL1[31:30]) and PWM23_S_E (CLKSEL2[9]). - * | | |If PWM23_S_E = 0, theclock source of PWM2 and PWM3 defined by PWM23_S list below: - * | | |00 = Clock source from external 4~24 MHz high speed crystal oscillator clock. - * | | |10 = Clock source from HCLK. - * | | |11 = Clock source from internal 22.1184 MHz high speed oscillator clock. - * | | |If PWM23_S_E = 1, the clock source of PWM2 and PWM3 defined by PWM23_S list below: - * | | |00 = Reserved. - * | | |01 = Reserved. - * | | |10 = Reserved. - * | | |11 = Clock source from internal 10 kHz low speed oscillator clock. - * @var CLK_T::CLKDIV - * Offset: 0x18 Clock Divider Number Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[3:0] |HCLK_N |HCLK Clock Divide Number From HCLK Clock Source - * | | |HCLK clock frequency = (HCLK clock source frequency) / (HCLK_N + 1). - * |[7:4] |USB_N |USB Clock Divide Number From PLL Clock - * | | |USB clock frequency = (PLL frequency) / (USB_N + 1). - * |[11:8] |UART_N |UART Clock Divide Number From UART Clock Source - * | | |UART clock frequency = (UART clock source frequency) / (UART_N + 1). - * |[23:16] |ADC_N |ADC Clock Divide Number From ADC Clock Source - * | | |ADC clock frequency = (ADC clock source frequency) / (ADC_N + 1). - * @var CLK_T::CLKSEL2 - * Offset: 0x1C Clock Source Select Control Register 2 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[1:0] |I2S_S |I2S Clock Source Selection - * | | |00 = Clock source from external 4~24 MHz high speed crystal oscillator clock. - * | | |01 = Clock source from PLL clock. - * | | |10 = Clock source from HCLK. - * | | |11 = Clock source from internal 22.1184 MHz high speed oscillator clock. - * |[3:2] |FRQDIV_S |Clock Divider Clock Source Selection - * | | |00 = Clock source from external 4~24 MHz high speed crystal oscillator clock. - * | | |10 = Clock source from HCLK. - * | | |11 = Clock source from internal 22.1184 MHz high speed oscillator clock. - * |[8] |PWM01_S_E |PWM0 and PWM1 Clock Source Selection Extend - * | | |PWM0 and PWM1 used the same clock source; both of them used the same prescaler. - * | | |The clock source of PWM0 and PWM1 is defined by PWM01_S (CLKSEL1[29:28]) and PWM01_S_E (CLKSEL2[8]). - * | | |If PWM01_S_E = 0, the clock source of PWM0 and PWM1 defined by PWM01_S list below: - * | | |00 = Clock source from external 4~24 MHz high speed crystal oscillator clock. - * | | |10 = Clock source from HCLK. - * | | |11 = Clock source from internal 22.1184 MHz high speed oscillator clock. - * | | |If PWM01_S_E = 1, the clock source of PWM0 and PWM1 defined by PWM01_S list below: - * | | |00 = Reserved. - * | | |01 = Reserved. - * | | |10 = Reserved. - * | | |11 = Clock source from internal 10 kHz low speed oscillator clock. - * |[9] |PWM23_S_E |PWM2 and PWM3 Clock Source Selection Extend - * | | |PWM2 and PWM3 used the same clock source; both of them used the same prescaler. - * | | |The clock source of PWM2 and PWM3 is defined by PWM23_S (CLKSEL1[31:30]) and PWM23_S_E (CLKSEL2[9]). - * | | |If PWM23_S_E = 0, the clock source of PWM2 and PWM3 defined by PWM23_S list below: - * | | |00 = Clock source from external 4~24 MHz high speed crystal oscillator clock. - * | | |10 = Clock source from HCLK. - * | | |11 = Clock source from internal 22.1184 MHz high speed oscillator clock. - * | | |If PWM23_S_E = 1, the clock source of PWM2 and PWM3 defined by PWM23_S list below: - * | | |00 = Reserved. - * | | |01 = Reserved. - * | | |10 = Reserved. - * | | |11 = Clock source from internal 10 kHz low speed oscillator clock. - * |[17:16] |WWDT_S |Window Watchdog Timer Clock Source Selection - * | | |10 = Clock source from HCLK/2048 clock. - * | | |11 = Clock source from internal 10 kHz low speed oscillator clock. - * @var CLK_T::PLLCON - * Offset: 0x20 PLL Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[8:0] |FB_DV |PLL Feedback Divider Control Bits - * | | |Refer to the PLL formulas. - * |[13:9] |IN_DV |PLL Input Divider Control Bits - * | | |Refer to the PLL formulas. - * |[15:14] |OUT_DV |PLL Output Divider Control Bits - * | | |Refer to the PLL formulas. - * |[16] |PD |Power-down Mode - * | | |If the PWR_DOWN_EN bit is set to 1 in PWRCON register, the PLL will enter Power-down mode too. - * | | |0 = PLL is in Normal mode. - * | | |1 = PLL is in Power-down mode (default). - * |[17] |BP |PLL Bypass Control - * | | |0 = PLL is in Normal mode (default). - * | | |1 = PLL clock output is same as PLL source clock input. - * |[18] |OE |PLL OE (FOUT Enable) Control - * | | |0 = PLL FOUT Enabled. - * | | |1 = PLL FOUT is fixed low. - * |[19] |PLL_SRC |PLL Source Clock Selection - * | | |0 = PLL source clock from external 4~24 MHz high speed crystal. - * | | |1 = PLL source clock from internal 22.1184 MHz high speed oscillator. - * @var CLK_T::FRQDIV - * Offset: 0x24 Frequency Divider Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[3:0] |FSEL |Divider Output Frequency Selection Bits - * | | |The formula of output frequency is Fout = Fin/2(N+1). - * | | |Fin is the input clock frequency. - * | | |Fout is the frequency of divider output clock. - * | | |N is the 4-bit value of FSEL[3:0]. - * |[4] |DIVIDER_EN|Frequency Divider Enable Bit - * | | |0 = Frequency Divider function Disabled. - * | | |1 = Frequency Divider function Enabled. - * @var CLK_T::APBDIV - * Offset: 0x2C APB Divider Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |APBDIV |APB Divider Enable Bit - * | | |0 = PCLK is HCLK. - * | | |1 = PCLK is HCLK/2. - */ - - __IO uint32_t PWRCON; /* Offset: 0x00 System Power-down Control Register */ - __IO uint32_t AHBCLK; /* Offset: 0x04 AHB Devices Clock Enable Control Register */ - __IO uint32_t APBCLK; /* Offset: 0x08 APB Devices Clock Enable Control Register */ - __IO uint32_t CLKSTATUS; /* Offset: 0x0C Clock status monitor Register */ - __IO uint32_t CLKSEL0; /* Offset: 0x10 Clock Source Select Control Register 0 */ - __IO uint32_t CLKSEL1; /* Offset: 0x14 Clock Source Select Control Register 1 */ - __IO uint32_t CLKDIV; /* Offset: 0x18 Clock Divider Number Register */ - __IO uint32_t CLKSEL2; /* Offset: 0x1C Clock Source Select Control Register 2 */ - __IO uint32_t PLLCON; /* Offset: 0x20 PLL Control Register */ - __IO uint32_t FRQDIV; /* Offset: 0x24 Frequency Divider Control Register */ - __I uint32_t RESERVE0; - __IO uint32_t APBDIV; /* Offset: 0x2C APB Divider Control Register */ - -} CLK_T; - - - -/** @addtogroup REG_CLK_BITMASK CLK Bit Mask - @{ - */ - -/* CLK PWRCON Bit Field Definitions */ -#define CLK_PWRCON_PD_WAIT_CPU_Pos 8 /*!< CLK_T::PWRCON: PD_WAIT_CPU Position */ -#define CLK_PWRCON_PD_WAIT_CPU_Msk (1ul << CLK_PWRCON_PD_WAIT_CPU_Pos) /*!< CLK_T::PWRCON: PD_WAIT_CPU Mask */ - -#define CLK_PWRCON_PWR_DOWN_EN_Pos 7 /*!< CLK_T::PWRCON: PWR_DOWN_EN Position */ -#define CLK_PWRCON_PWR_DOWN_EN_Msk (1ul << CLK_PWRCON_PWR_DOWN_EN_Pos) /*!< CLK_T::PWRCON: PWR_DOWN_EN Mask */ - -#define CLK_PWRCON_PD_WU_STS_Pos 6 /*!< CLK_T::PWRCON: PD_WU_STS Position */ -#define CLK_PWRCON_PD_WU_STS_Msk (1ul << CLK_PWRCON_PD_WU_STS_Pos) /*!< CLK_T::PWRCON: PD_WU_STS Mask */ - -#define CLK_PWRCON_PD_WU_INT_EN_Pos 5 /*!< CLK_T::PWRCON: PD_WU_INT_EN Position */ -#define CLK_PWRCON_PD_WU_INT_EN_Msk (1ul << CLK_PWRCON_PD_WU_INT_EN_Pos) /*!< CLK_T::PWRCON: PD_WU_INT_EN Mask */ - -#define CLK_PWRCON_PD_WU_DLY_Pos 4 /*!< CLK_T::PWRCON: PD_WU_DLY Position */ -#define CLK_PWRCON_PD_WU_DLY_Msk (1ul << CLK_PWRCON_PD_WU_DLY_Pos) /*!< CLK_T::PWRCON: PD_WU_DLY Mask */ - -#define CLK_PWRCON_OSC10K_EN_Pos 3 /*!< CLK_T::PWRCON: OSC10K_EN Position */ -#define CLK_PWRCON_OSC10K_EN_Msk (1ul << CLK_PWRCON_OSC10K_EN_Pos) /*!< CLK_T::PWRCON: OSC10K_EN Mask */ -#define CLK_PWRCON_IRC10K_EN_Pos 3 /*!< CLK_T::PWRCON: IRC10K_EN Position */ -#define CLK_PWRCON_IRC10K_EN_Msk (1ul << CLK_PWRCON_IRC10K_EN_Pos) /*!< CLK_T::PWRCON: IRC10K_EN Mask */ - -#define CLK_PWRCON_OSC22M_EN_Pos 2 /*!< CLK_T::PWRCON: OSC22M_EN Position */ -#define CLK_PWRCON_OSC22M_EN_Msk (1ul << CLK_PWRCON_OSC22M_EN_Pos) /*!< CLK_T::PWRCON: OSC22M_EN Mask */ -#define CLK_PWRCON_IRC22M_EN_Pos 2 /*!< CLK_T::PWRCON: IRC22M_EN Position */ -#define CLK_PWRCON_IRC22M_EN_Msk (1ul << CLK_PWRCON_IRC22M_EN_Pos) /*!< CLK_T::PWRCON: IRC22M_EN Mask */ - -#define CLK_PWRCON_XTL12M_EN_Pos 0 /*!< CLK_T::PWRCON: XTL12M_EN Position */ -#define CLK_PWRCON_XTL12M_EN_Msk (1ul << CLK_PWRCON_XTL12M_EN_Pos) /*!< CLK_T::PWRCON: XTL12M_EN Mask */ - -/* CLK AHBCLK Bit Field Definitions */ -#define CLK_AHBCLK_ISP_EN_Pos 2 /*!< CLK_T::AHBCLK: ISP_EN Position */ -#define CLK_AHBCLK_ISP_EN_Msk (1ul << CLK_AHBCLK_ISP_EN_Pos) /*!< CLK_T::AHBCLK: ISP_EN Mask */ - -#define CLK_AHBCLK_PDMA_EN_Pos 1 /*!< CLK_T::AHBCLK: PDMA_EN Position */ -#define CLK_AHBCLK_PDMA_EN_Msk (1ul << CLK_AHBCLK_PDMA_EN_Pos) /*!< CLK_T::AHBCLK: PDMA_EN Mask */ - - -/* CLK APBCLK Bit Field Definitions */ -#define CLK_APBCLK_PS2_EN_Pos 31 /*!< CLK_T::APBCLK: PS2_EN Position */ -#define CLK_APBCLK_PS2_EN_Msk (1ul << CLK_APBCLK_PS2_EN_Pos) /*!< CLK_T::APBCLK: PS2_EN Mask */ - -#define CLK_APBCLK_I2S_EN_Pos 29 /*!< CLK_T::APBCLK: I2S_EN Position */ -#define CLK_APBCLK_I2S_EN_Msk (1ul << CLK_APBCLK_I2S_EN_Pos) /*!< CLK_T::APBCLK: I2S_EN Mask */ - -#define CLK_APBCLK_ADC_EN_Pos 28 /*!< CLK_T::APBCLK: ADC_EN Position */ -#define CLK_APBCLK_ADC_EN_Msk (1ul << CLK_APBCLK_ADC_EN_Pos) /*!< CLK_T::APBCLK: ADC_EN Mask */ - -#define CLK_APBCLK_USBD_EN_Pos 27 /*!< CLK_T::APBCLK: USBD_EN Position */ -#define CLK_APBCLK_USBD_EN_Msk (1ul << CLK_APBCLK_USBD_EN_Pos) /*!< CLK_T::APBCLK: USBD_EN Mask */ - -#define CLK_APBCLK_PWM23_EN_Pos 21 /*!< CLK_T::APBCLK: PWM23_EN Position */ -#define CLK_APBCLK_PWM23_EN_Msk (1ul << CLK_APBCLK_PWM23_EN_Pos) /*!< CLK_T::APBCLK: PWM23_EN Mask */ - -#define CLK_APBCLK_PWM01_EN_Pos 20 /*!< CLK_T::APBCLK: PWM01_EN Position */ -#define CLK_APBCLK_PWM01_EN_Msk (1ul << CLK_APBCLK_PWM01_EN_Pos) /*!< CLK_T::APBCLK: PWM01_EN Mask */ - -#define CLK_APBCLK_UART1_EN_Pos 17 /*!< CLK_T::APBCLK: UART1_EN Position */ -#define CLK_APBCLK_UART1_EN_Msk (1ul << CLK_APBCLK_UART1_EN_Pos) /*!< CLK_T::APBCLK: UART1_EN Mask */ - -#define CLK_APBCLK_UART0_EN_Pos 16 /*!< CLK_T::APBCLK: UART0_EN Position */ -#define CLK_APBCLK_UART0_EN_Msk (1ul << CLK_APBCLK_UART0_EN_Pos) /*!< CLK_T::APBCLK: UART0_EN Mask */ - -#define CLK_APBCLK_SPI2_EN_Pos 14 /*!< CLK_T::APBCLK: SPI2_EN Position */ -#define CLK_APBCLK_SPI2_EN_Msk (1ul << CLK_APBCLK_SPI2_EN_Pos) /*!< CLK_T::APBCLK: SPI2_EN Mask */ - -#define CLK_APBCLK_SPI1_EN_Pos 13 /*!< CLK_T::APBCLK: SPI1_EN Position */ -#define CLK_APBCLK_SPI1_EN_Msk (1ul << CLK_APBCLK_SPI1_EN_Pos) /*!< CLK_T::APBCLK: SPI1_EN Mask */ - -#define CLK_APBCLK_SPI0_EN_Pos 12 /*!< CLK_T::APBCLK: SPI0_EN Position */ -#define CLK_APBCLK_SPI0_EN_Msk (1ul << CLK_APBCLK_SPI0_EN_Pos) /*!< CLK_T::APBCLK: SPI0_EN Mask */ - -#define CLK_APBCLK_I2C1_EN_Pos 9 /*!< CLK_T::APBCLK: I2C1_EN Position */ -#define CLK_APBCLK_I2C1_EN_Msk (1ul << CLK_APBCLK_I2C1_EN_Pos) /*!< CLK_T::APBCLK: I2C1_EN Mask */ - -#define CLK_APBCLK_I2C0_EN_Pos 8 /*!< CLK_T::APBCLK: I2C0_EN_ Position */ -#define CLK_APBCLK_I2C0_EN_Msk (1ul << CLK_APBCLK_I2C0_EN_Pos) /*!< CLK_T::APBCLK: I2C0_EN_ Mask */ - -#define CLK_APBCLK_FDIV_EN_Pos 6 /*!< CLK_T::APBCLK: FDIV_EN Position */ -#define CLK_APBCLK_FDIV_EN_Msk (1ul << CLK_APBCLK_FDIV_EN_Pos) /*!< CLK_T::APBCLK: FDIV_EN Mask */ - -#define CLK_APBCLK_TMR3_EN_Pos 5 /*!< CLK_T::APBCLK: TMR3_EN Position */ -#define CLK_APBCLK_TMR3_EN_Msk (1ul << CLK_APBCLK_TMR3_EN_Pos) /*!< CLK_T::APBCLK: TMR3_EN Mask */ - -#define CLK_APBCLK_TMR2_EN_Pos 4 /*!< CLK_T::APBCLK: TMR2_EN Position */ -#define CLK_APBCLK_TMR2_EN_Msk (1ul << CLK_APBCLK_TMR2_EN_Pos) /*!< CLK_T::APBCLK: TMR2_EN Mask */ - -#define CLK_APBCLK_TMR1_EN_Pos 3 /*!< CLK_T::APBCLK: TMR1_EN Position */ -#define CLK_APBCLK_TMR1_EN_Msk (1ul << CLK_APBCLK_TMR1_EN_Pos) /*!< CLK_T::APBCLK: TMR1_EN Mask */ - -#define CLK_APBCLK_TMR0_EN_Pos 2 /*!< CLK_T::APBCLK: TMR0_EN Position */ -#define CLK_APBCLK_TMR0_EN_Msk (1ul << CLK_APBCLK_TMR0_EN_Pos) /*!< CLK_T::APBCLK: TMR0_EN Mask */ - -#define CLK_APBCLK_WDT_EN_Pos 0 /*!< CLK_T::APBCLK: WDT_EN Position */ -#define CLK_APBCLK_WDT_EN_Msk (1ul << CLK_APBCLK_WDT_EN_Pos) /*!< CLK_T::APBCLK: WDT_EN Mask */ - - -/* CLK CLKSTATUS Bit Field Definitions */ -#define CLK_CLKSTATUS_CLK_SW_FAIL_Pos 7 /*!< CLK_T::CLKSTATUS: CLK_SW_FAIL Position */ -#define CLK_CLKSTATUS_CLK_SW_FAIL_Msk (1ul << CLK_CLKSTATUS_CLK_SW_FAIL_Pos) /*!< CLK_T::CLKSTATUS: CLK_SW_FAIL Mask */ - -#define CLK_CLKSTATUS_OSC22M_STB_Pos 4 /*!< CLK_T::CLKSTATUS: OSC22M_STB Position */ -#define CLK_CLKSTATUS_OSC22M_STB_Msk (1ul << CLK_CLKSTATUS_OSC22M_STB_Pos) /*!< CLK_T::CLKSTATUS: OSC22M_STB Mask */ -#define CLK_CLKSTATUS_IRC22M_STB_Pos 4 /*!< CLK_T::CLKSTATUS: IRC22M_STB Position */ -#define CLK_CLKSTATUS_IRC22M_STB_Msk (1ul << CLK_CLKSTATUS_IRC22M_STB_Pos) /*!< CLK_T::CLKSTATUS: IRC22M_STB Mask */ - -#define CLK_CLKSTATUS_OSC10K_STB_Pos 3 /*!< CLK_T::CLKSTATUS: OSC10K_STB Position */ -#define CLK_CLKSTATUS_OSC10K_STB_Msk (1ul << CLK_CLKSTATUS_OSC10K_STB_Pos) /*!< CLK_T::CLKSTATUS: OSC10K_STB Mask */ -#define CLK_CLKSTATUS_IRC10K_STB_Pos 3 /*!< CLK_T::CLKSTATUS: IRC10K_STB Position */ -#define CLK_CLKSTATUS_IRC10K_STB_Msk (1ul << CLK_CLKSTATUS_IRC10K_STB_Pos) /*!< CLK_T::CLKSTATUS: IRC10K_STB Mask */ - -#define CLK_CLKSTATUS_PLL_STB_Pos 2 /*!< CLK_T::CLKSTATUS: PLL_STB Position */ -#define CLK_CLKSTATUS_PLL_STB_Msk (1ul << CLK_CLKSTATUS_PLL_STB_Pos) /*!< CLK_T::CLKSTATUS: PLL_STB Mask */ - -#define CLK_CLKSTATUS_XTL12M_STB_Pos 0 /*!< CLK_T::CLKSTATUS: XTL12M_STB Position */ -#define CLK_CLKSTATUS_XTL12M_STB_Msk (1ul << CLK_CLKSTATUS_XTL12M_STB_Pos) /*!< CLK_T::CLKSTATUS: XTL12M_STB Mask */ - -/* CLK CLKSEL0 Bit Field Definitions */ -#define CLK_CLKSEL0_STCLK_S_Pos 3 /*!< CLK_T::CLKSEL0: STCLK_S Position */ -#define CLK_CLKSEL0_STCLK_S_Msk (7ul << CLK_CLKSEL0_STCLK_S_Pos) /*!< CLK_T::CLKSEL0: STCLK_S Mask */ - -#define CLK_CLKSEL0_HCLK_S_Pos 0 /*!< CLK_T::CLKSEL0: HCLK_S Position */ -#define CLK_CLKSEL0_HCLK_S_Msk (7ul << CLK_CLKSEL0_HCLK_S_Pos) /*!< CLK_T::CLKSEL0: HCLK_S Mask */ - -/* CLK CLKSEL1 Bit Field Definitions */ -#define CLK_CLKSEL1_PWM23_S_Pos 30 /*!< CLK_T::CLKSEL1: PWM23_S Position */ -#define CLK_CLKSEL1_PWM23_S_Msk (3ul << CLK_CLKSEL1_PWM23_S_Pos) /*!< CLK_T::CLKSEL1: PWM23_S Mask */ - -#define CLK_CLKSEL1_PWM01_S_Pos 28 /*!< CLK_T::CLKSEL1: PWM01_S Position */ -#define CLK_CLKSEL1_PWM01_S_Msk (3ul << CLK_CLKSEL1_PWM01_S_Pos) /*!< CLK_T::CLKSEL1: PWM01_S Mask */ - -#define CLK_CLKSEL1_UART_S_Pos 24 /*!< CLK_T::CLKSEL1: UART_S Position */ -#define CLK_CLKSEL1_UART_S_Msk (3ul << CLK_CLKSEL1_UART_S_Pos) /*!< CLK_T::CLKSEL1: UART_S Mask */ - -#define CLK_CLKSEL1_TMR3_S_Pos 20 /*!< CLK_T::CLKSEL1: TMR3_S Position */ -#define CLK_CLKSEL1_TMR3_S_Msk (7ul << CLK_CLKSEL1_TMR3_S_Pos) /*!< CLK_T::CLKSEL1: TMR3_S Mask */ - -#define CLK_CLKSEL1_TMR2_S_Pos 16 /*!< CLK_T::CLKSEL1: TMR2_S Position */ -#define CLK_CLKSEL1_TMR2_S_Msk (7ul << CLK_CLKSEL1_TMR2_S_Pos) /*!< CLK_T::CLKSEL1: TMR2_S Mask */ - -#define CLK_CLKSEL1_TMR1_S_Pos 12 /*!< CLK_T::CLKSEL1: TMR1_S Position */ -#define CLK_CLKSEL1_TMR1_S_Msk (7ul << CLK_CLKSEL1_TMR1_S_Pos) /*!< CLK_T::CLKSEL1: TMR1_S Mask */ - -#define CLK_CLKSEL1_TMR0_S_Pos 8 /*!< CLK_T::CLKSEL1: TMR0_S Position */ -#define CLK_CLKSEL1_TMR0_S_Msk (7ul << CLK_CLKSEL1_TMR0_S_Pos) /*!< CLK_T::CLKSEL1: TMR0_S Mask */ - -#define CLK_CLKSEL1_SPI2_S_Pos 6 /*!< CLK_T::CLKSEL1: SPI2_S Position */ -#define CLK_CLKSEL1_SPI2_S_Msk (1ul << CLK_CLKSEL1_SPI2_S_Pos) /*!< CLK_T::CLKSEL1: SPI2_S Mask */ - -#define CLK_CLKSEL1_SPI1_S_Pos 5 /*!< CLK_T::CLKSEL1: SPI1_S Position */ -#define CLK_CLKSEL1_SPI1_S_Msk (1ul << CLK_CLKSEL1_SPI1_S_Pos) /*!< CLK_T::CLKSEL1: SPI1_S Mask */ - -#define CLK_CLKSEL1_SPI0_S_Pos 4 /*!< CLK_T::CLKSEL1: SPI0_S Position */ -#define CLK_CLKSEL1_SPI0_S_Msk (1ul << CLK_CLKSEL1_SPI0_S_Pos) /*!< CLK_T::CLKSEL1: SPI0_S Mask */ - -#define CLK_CLKSEL1_ADC_S_Pos 2 /*!< CLK_T::CLKSEL1: ADC_S Position */ -#define CLK_CLKSEL1_ADC_S_Msk (3ul << CLK_CLKSEL1_ADC_S_Pos) /*!< CLK_T::CLKSEL1: ADC_S Mask */ - -#define CLK_CLKSEL1_WDT_S_Pos 0 /*!< CLK_T::CLKSEL1: WDT_S Position */ -#define CLK_CLKSEL1_WDT_S_Msk (3ul << CLK_CLKSEL1_WDT_S_Pos) /*!< CLK_T::CLKSEL1: WDT_S Mask */ - -/* CLK CLKSEL2 Bit Field Definitions */ -#define CLK_CLKSEL2_WWDT_S_Pos 16 /*!< CLK_T::CLKSEL2: WWDT_S Position */ -#define CLK_CLKSEL2_WWDT_S_Msk (3ul << CLK_CLKSEL2_WWDT_S_Pos) /*!< CLK_T::CLKSEL2: WWDT_S Mask */ - -#define CLK_CLKSEL2_PWM23_S_E_Pos 9 /*!< CLK_T::CLKSEL2: PWM23_S_E Position */ -#define CLK_CLKSEL2_PWM23_S_E_Msk (1ul << CLK_CLKSEL2_PWM23_S_E_Pos) /*!< CLK_T::CLKSEL2: PWM23_S_E Mask */ -#define CLK_CLKSEL2_PWM23_S_EXT_Pos 9 /*!< CLK_T::CLKSEL2: PWM23_S_EXT Position */ -#define CLK_CLKSEL2_PWM23_S_EXT_Msk (1ul << CLK_CLKSEL2_PWM23_S_EXT_Pos) /*!< CLK_T::CLKSEL2: PWM23_S_EXT Mask */ - -#define CLK_CLKSEL2_PWM01_S_E_Pos 8 /*!< CLK_T::CLKSEL2: PWM01_S_E Position */ -#define CLK_CLKSEL2_PWM01_S_E_Msk (1ul << CLK_CLKSEL2_PWM01_S_E_Pos) /*!< CLK_T::CLKSEL2: PWM01_S_E Mask */ -#define CLK_CLKSEL2_PWM01_S_EXT_Pos 8 /*!< CLK_T::CLKSEL2: PWM01_S_EXT Position */ -#define CLK_CLKSEL2_PWM01_S_EXT_Msk (1ul << CLK_CLKSEL2_PWM01_S_EXT_Pos) /*!< CLK_T::CLKSEL2: PWM01_S_EXT Mask */ - -#define CLK_CLKSEL2_FRQDIV_S_Pos 2 /*!< CLK_T::CLKSEL2: FRQDIV_S Position */ -#define CLK_CLKSEL2_FRQDIV_S_Msk (3ul << CLK_CLKSEL2_FRQDIV_S_Pos) /*!< CLK_T::CLKSEL2: FRQDIV_S Mask */ - -#define CLK_CLKSEL2_I2S_S_Pos 0 /*!< CLK_T::CLKSEL2: I2S_S Position */ -#define CLK_CLKSEL2_I2S_S_Msk (3ul << CLK_CLKSEL2_I2S_S_Pos) /*!< CLK_T::CLKSEL2: I2S_S Mask */ - -/* CLK CLKDIV Bit Field Definitions */ -#define CLK_CLKDIV_ADC_N_Pos 16 /*!< CLK_T::CLKDIV: ADC_N Position */ -#define CLK_CLKDIV_ADC_N_Msk (0xFFul << CLK_CLKDIV_ADC_N_Pos) /*!< CLK_T::CLKDIV: ADC_N Mask */ - -#define CLK_CLKDIV_UART_N_Pos 8 /*!< CLK_T::CLKDIV: UART_N Position */ -#define CLK_CLKDIV_UART_N_Msk (0xFul << CLK_CLKDIV_UART_N_Pos) /*!< CLK_T::CLKDIV: UART_N Mask */ - -#define CLK_CLKDIV_USB_N_Pos 4 /*!< CLK_T::CLKDIV: USB_N Position */ -#define CLK_CLKDIV_USB_N_Msk (0xFul << CLK_CLKDIV_USB_N_Pos) /*!< CLK_T::CLKDIV: USB_N Mask */ - -#define CLK_CLKDIV_HCLK_N_Pos 0 /*!< CLK_T::CLKDIV: HCLK_N Position */ -#define CLK_CLKDIV_HCLK_N_Msk (0xFul << CLK_CLKDIV_HCLK_N_Pos) /*!< CLK_T::CLKDIV: HCLK_N Mask */ - -/* CLK PLLCON Bit Field Definitions */ -#define CLK_PLLCON_PLL_SRC_Pos 19 /*!< CLK_T::PLLCON: PLL_SRC Position */ -#define CLK_PLLCON_PLL_SRC_Msk (1ul << CLK_PLLCON_PLL_SRC_Pos) /*!< CLK_T::PLLCON: PLL_SRC Mask */ - -#define CLK_PLLCON_OE_Pos 18 /*!< CLK_T::PLLCON: PLL_SRC Position */ -#define CLK_PLLCON_OE_Msk (1ul << CLK_PLLCON_OE_Pos) /*!< CLK_T::PLLCON: PLL_SRC Mask */ - -#define CLK_PLLCON_BP_Pos 17 /*!< CLK_T::PLLCON: OE Position */ -#define CLK_PLLCON_BP_Msk (1ul << CLK_PLLCON_BP_Pos) /*!< CLK_T::PLLCON: OE Mask */ - -#define CLK_PLLCON_PD_Pos 16 /*!< CLK_T::PLLCON: PD Position */ -#define CLK_PLLCON_PD_Msk (1ul << CLK_PLLCON_PD_Pos) /*!< CLK_T::PLLCON: PD Mask */ - -#define CLK_PLLCON_OUT_DV_Pos 14 /*!< CLK_T::PLLCON: OUT_DV Position */ -#define CLK_PLLCON_OUT_DV_Msk (3ul << CLK_PLLCON_OUT_DV_Pos) /*!< CLK_T::PLLCON: OUT_DV Mask */ - -#define CLK_PLLCON_IN_DV_Pos 9 /*!< CLK_T::PLLCON: IN_DV Position */ -#define CLK_PLLCON_IN_DV_Msk (0x1Ful << CLK_PLLCON_IN_DV_Pos) /*!< CLK_T::PLLCON: IN_DV Mask */ - -#define CLK_PLLCON_FB_DV_Pos 0 /*!< CLK_T::PLLCON: FB_DV Position */ -#define CLK_PLLCON_FB_DV_Msk (0x1FFul << CLK_PLLCON_FB_DV_Pos) /*!< CLK_T::PLLCON: FB_DV Mask */ - -/* CLK FRQDIV Bit Field Definitions */ -#define CLK_FRQDIV_DIVIDER_EN_Pos 4 /*!< CLK_T::FRQDIV: DIVIDER_EN Position */ -#define CLK_FRQDIV_DIVIDER_EN_Msk (1ul << CLK_FRQDIV_DIVIDER_EN_Pos) /*!< CLK_T::FRQDIV: DIVIDER_EN Mask */ - -#define CLK_FRQDIV_FSEL_Pos 0 /*!< CLK_T::FRQDIV: FRQDIV_FSEL Position */ -#define CLK_FRQDIV_FSEL_Msk (0xFul << CLK_FRQDIV_FSEL_Pos) /*!< CLK_T::FRQDIV: FRQDIV_FSEL Mask */ - -/* CLK APBDIV Bit Field Definitions */ -#define CLK_APBDIV_APBDIV_Pos 0 /*!< CLK_T::APBDIV: APBDIV Position */ -#define CLK_APBDIV_APBDIV_Msk (1ul << CLK_APBDIV_APBDIV_Pos) /*!< CLK_T::APBDIV: APBDIV Mask */ -/*@}*/ /* end of group REG_CLK_BITMASK */ -/*@}*/ /* end of group REG_CLK */ - - -/*----------------------------- Cyclic Redundancy Check (CRC) Controller -----------------------------*/ -/** @addtogroup REG_CRC Cyclic Redundancy Check Controller (CRC) - Memory Mapped Structure for Cyclic Redundancy Check - @{ - */ - -typedef struct -{ - - -/** - * @var CRC_T::CTL - * Offset: 0x00 CRC Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |CRCCEN |CRC Channel Enable - * | | |0 = No effect. - * | | |1 = CRC operation Enabled. - * | | |Note1: When operating in CRC DMA mode (TRIG_EN (CRC_CTL[23]) = 1), if user clears this bit, the DMA operation will be continuous until all CRC DMA operation is done, and the TRIG_EN (CRC_CTL[23]) bit will keep 1until all CRC DMA operation done. - * | | |But in this case, the CRC_BLKD_IF (CRC_DMAISR[1])flag will inactive, user can read CRC checksum result only if TRIG_EN (CRC_CTL[23]) clears to 0. - * | | |Note2: When operating in CRC DMA mode (TRIG_EN (CRC_CTL[23]) = 1), if user wants to stop the transfer immediately, user can write 1 to CRC_RST (CRC_CTL [1]) bit to stop the transmission. - * |[1] |CRC_RST |CRC Engine Reset - * | | |0 = No effect. - * | | |1 = Reset the internal CRC state machine and internal buffer. - * | | |The others contents of CRC_CTL register will not be cleared. - * | | |This bit will be cleared automatically. - * | | |Note: When operated in CPU PIO mode, setting this bit will reload the initial seed value (CRC_SEED register). - * |[23] |TRIG_EN |Trigger Enable - * | | |This bit is used to trigger the CRC DMA transfer. - * | | |0 = No effect. - * | | |1 = CRC DMA data read or write transfer Enabled. - * | | |Note1: If this bit asserts which indicates the CRC engine operation in CRC DMA mode, do not fill in any data in CRC_WDATA register. - * | | |Note2: When CRC DMA transfer completed, this bit will be cleared automatically. - * | | |Note3: If the bus error occurs when CRC DMA transfer data, all CRC DMA transfer will be stopped. - * | | |Software must reset all DMA channel before trigger DMA again. - * |[24] |WDATA_RVS |Write Data Order Reverse - * | | |This bit is used to enable the bit order reverse function for write data value in CRC_WDATA register. - * | | |0 = Bit order reverse for CRC write data in Disabled. - * | | |1 = Bit order reverse for CRC write data in Enabled (per byre). - * | | |Note: If the write data is 0xAABBCCDD, the bit order reverse for CRC write data in is 0x55DD33BB - * |[25] |CHECKSUM_RVS|Checksum Reverse - * | | |This bit is used to enable the bit order reverse function for write data value in CRC_CHECKSUM register. - * | | |0 = Bit order reverse for CRC checksum Disabled. - * | | |1 = Bit order reverse for CRC checksum Enabled. - * | | |Note: If the checksum result is 0XDD7B0F2E, the bit order reverse for CRC checksum is 0x74F0DEBB - * |[26] |WDATA_COM |Write Data 1's Complement - * | | |This bit is used to enable the 1's complement function for write data value in CRC_WDATA register. - * | | |0 = 1's complement for CRC write data in Disabled. - * | | |1 = 1's complement for CRC write data in Enabled. - * |[27] |CHECKSUM_COM|Checksum 1's Complement - * | | |This bit is used to enable the 1's complement function for checksum result in CRC_CHECKSUM register. - * | | |0 = 1's complement for CRC checksum Disabled. - * | | |1 = 1's complement for CRC checksum Enabled. - * |[29:28] |CPU_WDLEN |CPU Write Data Length - * | | |This field indicates the CPU write data length only when operating in CPU PIO mode. - * | | |00 = The write data length is 8-bit mode. - * | | |01 = The write data length is 16-bit mode. - * | | |10 = The write data length is 32-bit mode. - * | | |11 = Reserved. - * | | |Note1: This field is only valid when operating in CPU PIO mode. - * | | |Note2: When the write data length is 8-bit mode, the valid data in CRC_WDATA register is only CRC_WDATA [7:0] bits; if the write data length is 16-bit mode, the valid data in CRC_WDATA register is only CRC_WDATA [15:0]. - * |[31:30] |CRC_MODE |CRC Polynomial Mode - * | | |This field indicates the CRC operation polynomial mode. - * | | |00 = CRC-CCITT Polynomial Mode. - * | | |01 = CRC-8 Polynomial Mode. - * | | |10 = CRC-16 Polynomial Mode. - * | | |11 = CRC-32 Polynomial Mode. - * @var CRC_T::DMASAR - * Offset: 0x04 CRC DMA Source Address Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |CRC_DMASAR|CRC DMA Transfer Source Address Register - * | | |This field indicates a 32-bit source address of CRC DMA. - * | | |(CRC_DMASAR + CRC_DMABCR) = (CRC_DMACSAR + CRC_DMACBCR). - * | | |Note: The source address must be word alignment - * @var CRC_T::DMABCR - * Offset: 0x0C CRC DMA Transfer Byte Count Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |CRC_DMABCR|CRC DMA Transfer Byte Count Register - * | | |This field indicates a 16-bit total transfer byte count number of CRC DMA - * | | |(CRC_DMASAR + CRC_DMABCR) = (CRC_DMACSAR + CRC_DMACBCR). - * @var CRC_T::DMACSAR - * Offset: 0x14 CRC DMA Current Source Address Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |CRC_DMACSAR|CRC DMA Current Source Address Register (Read Only) - * | | |This field indicates the current source address where the CRC DMA transfer just occurs. - * | | |(CRC_DMASAR + CRC_DMABCR) = (CRC_DMACSAR + CRC_DMACBCR). - * @var CRC_T::DMACBCR - * Offset: 0x1C CRC DMA Current Transfer Byte Count Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |CRC_DMACBCR|CRC DMA Current Remained Byte Count Register (Read Only) - * | | |This field indicates the current remained byte count of CRC DMA. - * | | |(CRC_DMASAR + CRC_DMABCR) = (CRC_DMACSAR + CRC_DMACBCR). - * | | |Note: Setting CRC_RST (CRC_CTL[1]) bit to 1 will clear this register value. - * @var CRC_T::DMAIER - * Offset: 0x20 CRC DMA Interrupt Enable Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |CRC_TABORT_IE|CRC DMA Read/Write Target Abort Interrupt Enable - * | | |Enable this bit will generate the CRC DMA Target Abort interrupt signal while CRC_TARBOT_IF (CRC_DMAISR[0]) bit is set to 1. - * | | |0 = Target abort interrupt generation Disabled during CRC DMA transfer. - * | | |1 = Target abort interrupt generation Enabled during CRC DMA transfer. - * |[1] |CRC_BLKD_IE|CRC DMA Block Transfer Done Interrupt Enable - * | | |Enable this bit will generate the CRC DMA Transfer Done interrupt signal while CRC_BLKD_IF (CRC_DMAISR[1]) bit is set to 1. - * | | |0 = Interrupt generator Disabled when CRC DMA transfer done. - * | | |1 = Interrupt generator Enabled when CRC DMA transfer done. - * @var CRC_T::DMAISR - * Offset: 0x24 CRC DMA Interrupt Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |CRC_TABORT_IF|CRC DMA Read/Write Target Abort Interrupt Flag - * | | |This bit indicates that CRC bus has error or not during CRC DMA transfer. - * | | |0 = No bus error response received during CRC DMA transfer. - * | | |1 = Bus error response received during CRC DMA transfer. - * | | |It is cleared by writing 1 to it through software. - * | | |Note: The bit filed indicate bus master received error response or not. - * | | |If bus master received error response, it means that CRC transfer target abort is happened. - * | | |DMA will stop transfer and respond this event to software then CRC state machine goes to IDLE state. - * | | |When target abort occurred, software must reset DMA before transfer those data again. - * |[1] |CRC_BLKD_IF|CRC DMA Block Transfer Done Interrupt Flag - * | | |This bit indicates that CRC DMA transfer has finished or not. - * | | |0 = Not finished if TRIG_EN (CRC_CTL[23]) bit has enabled. - * | | |1 = CRC transfer done if TRIG_EN (CRC_CTL[23]) bit has enabled. - * | | |It is cleared by writing 1 to it through software. - * | | |(When CRC DMA transfer done, TRIG_EN (CRC_CTL[23]) bit will be cleared automatically) - * @var CRC_T::WDATA - * Offset: 0x80 CRC Write Data Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |CRC_WDATA |CRC Write Data Register - * | | |When operating in CPU PIO mode, software can write data to this field to perform CRC operation. - * | | |When operating in DMA mode, this field indicates the DMA read data from memory and cannot be written. - * | | |Note: When the write data length is 8-bit mode, the valid data in CRC_WDATA register is only CRC_WDATA [7:0] bits; if the write data length is 16-bit mode, the valid data in CRC_WDATA register is only CRC_WDATA [15:0]. - * @var CRC_T::SEED - * Offset: 0x84 CRC Seed Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |CRC_SEED |CRC Seed Register - * | | |This field indicates the CRC seed value. - * @var CRC_T::CHECKSUM - * Offset: 0x88 CRC Checksum Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |CRC_CHECKSUM|CRC Checksum Register - * | | |This fields indicates the CRC checksum result - */ - - __IO uint32_t CTL; /* Offset: 0x00 CRC Control Register */ - __IO uint32_t DMASAR; /* Offset: 0x04 CRC DMA Source Address Register */ - __I uint32_t RESERVED0; - __IO uint32_t DMABCR; /* Offset: 0x0C CRC DMA Transfer Byte Count Register */ - __I uint32_t RESERVED1; - __I uint32_t DMACSAR; /* Offset: 0x14 CRC DMA Current Source Address Register */ - __I uint32_t RESERVED2; - __I uint32_t DMACBCR; /* Offset: 0x1C CRC DMA Current Transfer Byte Count Register */ - __IO uint32_t DMAIER; /* Offset: 0x20 CRC DMA Interrupt Enable Register */ - __IO uint32_t DMAISR; /* Offset: 0x24 CRC DMA Interrupt Status Register */ - __I uint32_t RESERVED3[22]; - __IO uint32_t WDATA; /* Offset: 0x80 CRC Write Data Register */ - __IO uint32_t SEED; /* Offset: 0x84 CRC Seed Register */ - __I uint32_t CHECKSUM; /* Offset: 0x88 CRC Checksum Register */ - -} CRC_T; - - - -/** @addtogroup REG_CRC_BITMASK CRC Bit Mask - @{ - */ - -/* CRC CTL Bit Field Definitions */ -#define CRC_CTL_CRC_MODE_Pos 30 /*!< CRC_T::CTL: CRC_MODE Position */ -#define CRC_CTL_CRC_MODE_Msk (0x3ul << CRC_CTL_CRC_MODE_Pos) /*!< CRC_T::CTL: CRC_MODE Mask */ - -#define CRC_CTL_CPU_WDLEN_Pos 28 /*!< CRC_T::CTL: CPU_WDLEN Position */ -#define CRC_CTL_CPU_WDLEN_Msk (0x3ul << CRC_CTL_CPU_WDLEN_Pos) /*!< CRC_T::CTL: CPU_WDLEN Mask */ - -#define CRC_CTL_CHECKSUM_COM_Pos 27 /*!< CRC_T::CTL: CHECKSUM_COM Position */ -#define CRC_CTL_CHECKSUM_COM_Msk (1ul << CRC_CTL_CHECKSUM_COM_Pos) /*!< CRC_T::CTL: CHECKSUM_COM Mask */ - -#define CRC_CTL_WDATA_COM_Pos 26 /*!< CRC_T::CTL: WDATA_COM Position */ -#define CRC_CTL_WDATA_COM_Msk (1ul << CRC_CTL_WDATA_COM_Pos) /*!< CRC_T::CTL: WDATA_COM Mask */ - -#define CRC_CTL_CHECKSUM_RVS_Pos 25 /*!< CRC_T::CTL: CHECKSUM_RVS Position */ -#define CRC_CTL_CHECKSUM_RVS_Msk (1ul << CRC_CTL_CHECKSUM_RVS_Pos) /*!< CRC_T::CTL: CHECKSUM_RVS Mask */ - -#define CRC_CTL_WDATA_RVS_Pos 24 /*!< CRC_T::CTL: WDATA_RVS Position */ -#define CRC_CTL_WDATA_RVS_Msk (1ul << CRC_CTL_WDATA_RVS_Pos) /*!< CRC_T::CTL: WDATA_RVS Mask */ - -#define CRC_CTL_TRIG_EN_Pos 23 /*!< CRC_T::CTL: TRIG_EN Position */ -#define CRC_CTL_TRIG_EN_Msk (1ul << CRC_CTL_TRIG_EN_Pos) /*!< CRC_T::CTL: TRIG_EN Mask */ - -#define CRC_CTL_CRC_RST_Pos 1 /*!< CRC_T::CTL: CRC_RST Position */ -#define CRC_CTL_CRC_RST_Msk (1ul << CRC_CTL_CRC_RST_Pos) /*!< CRC_T::CTL: CRC_RST Mask */ - -#define CRC_CTL_CRCCEN_Pos 0 /*!< CRC_T::CTL: CRCCEN Position */ -#define CRC_CTL_CRCCEN_Msk (1ul << CRC_CTL_CRCCEN_Pos) /*!< CRC_T::CTL: CRCCEN Mask */ - -/* CRC DMASAR Bit Field Definitions */ -#define CRC_DMASAR_CRC_DMASAR_Pos 0 /*!< CRC_T::DMASAR: CRC_DMASAR Position */ -#define CRC_DMASAR_CRC_DMASAR_Msk (0xFFFFFFFFul << CRC_DMASAR_CRC_DMASAR_Pos) /*!< CRC_T::DMASAR: CRC_DMASAR Mask */ - -/* CRC DMABCR Bit Field Definitions */ -#define CRC_DMABCR_CRC_DMABCR_Pos 0 /*!< CRC_T::DMABCR: CRC_DMABCR Position */ -#define CRC_DMABCR_CRC_DMABCR_Msk (0xFFFFul << CRC_DMABCR_CRC_DMABCR_Pos) /*!< CRC_T::DMABCR: CRC_DMABCR Mask */ - -/* CRC DMACSAR Bit Field Definitions */ -#define CRC_DMACSAR_CRC_DMACSAR_Pos 0 /*!< CRC_T::DMACSAR: CRC_DMACSAR Position */ -#define CRC_DMACSAR_CRC_DMACSAR_Msk (0xFFFFFFFFul << CRC_DMACSAR_CRC_DMACSAR_Pos) /*!< CRC_T::DMACSAR: CRC_DMACSAR Mask */ - -/* CRC DMACBCR Bit Field Definitions */ -#define CRC_DMACBCR_CRC_DMACBCR_Pos 0 /*!< CRC_T::DMACBCR: DMACBCR Position */ -#define CRC_DMACBCR_CRC_DMACBCR_Msk (0xFFFFul << CRC_DMACBCR_CRC_DMACBCR_Pos) /*!< CRC_T::DMACBCR: DMACBCR Mask */ - -/* CRC DMAIER Bit Field Definitions */ -#define CRC_DMAIER_CRC_BLKD_IE_Pos 1 /*!< CRC_T::DMAIER: CRC_BLKD_IE Position */ -#define CRC_DMAIER_CRC_BLKD_IE_Msk (1ul << CRC_DMAIER_CRC_BLKD_IE_Pos) /*!< CRC_T::DMAIER: CRC_BLKD_IE Mask */ - -#define CRC_DMAIER_CRC_TABORT_IE_Pos 0 /*!< CRC_T::DMAIER: CRC_TABORT_IE Position */ -#define CRC_DMAIER_CRC_TABORT_IE_Msk (1ul << CRC_DMAIER_CRC_TABORT_IE_Pos) /*!< CRC_T::DMAIER: CRC_TABORT_IE Mask */ - -/* CRC DMAISR Bit Field Definitions */ -#define CRC_DMAISR_CRC_BLKD_IF_Pos 1 /*!< CRC_T::DMAISR: CRC_BLKD_IF Position */ -#define CRC_DMAISR_CRC_BLKD_IF_Msk (1ul << CRC_DMAISR_CRC_BLKD_IF_Pos) /*!< CRC_T::DMAISR: CRC_BLKD_IF Mask */ - -#define CRC_DMAISR_CRC_TABORT_IF_Pos 0 /*!< CRC_T::DMAISR: CRC_TABORT_IF Position */ -#define CRC_DMAISR_CRC_TABORT_IF_Msk (1ul << CRC_DMAISR_CRC_TABORT_IF_Pos) /*!< CRC_T::DMAISR: CRC_TABORT_IF Mask */ - -/* CRC WDATA Bit Field Definitions */ -#define CRC_WDATA_CRC_WDATA_Pos 0 /*!< CRC_T::WDATA: CRC_WDATA Position */ -#define CRC_WDATA_CRC_WDATA_Msk (0xFFFFFFFFul << CRC_WDATA_CRC_WDATA_Pos) /*!< CRC_T::WDATA: CRC_WDATA Mask */ - -/* CRC SEED Bit Field Definitions */ -#define CRC_SEED_CRC_SEED_Pos 0 /*!< CRC_T::SEED: CRC_SEED Position */ -#define CRC_SEED_CRC_SEED_Msk (0xFFFFFFFFul << CRC_SEED_CRC_SEED_Pos) /*!< CRC_T::SEED: CRC_SEED Mask */ - -/* CRC CHECKSUM Bit Field Definitions */ -#define CRC_CHECKSUM_CRC_CHECKSUM_Pos 0 /*!< CRC_T::CHECKSUM: CRC_CHECKSUM Position */ -#define CRC_CHECKSUM_CRC_CHECKSUM_Msk (0xFFFFFFFFul << CRC_CHECKSUM_CRC_CHECKSUM_Pos) /*!< CRC_T::CHECKSUM: CRC_CHECKSUM Mask */ -/*@}*/ /* end of group REG_CRC_BITMASK */ -/*@}*/ /* end of group REG_CRC */ - -/*-------------------------- FLASH Memory Controller -------------------------*/ -/** @addtogroup REG_FMC Flash Memory Controller (FMC) - Memory Mapped Structure for Flash Memory Controller - @{ - */ - -typedef struct -{ - - -/** - * @var FMC_T::ISPCON - * Offset: 0x00 ISP Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |ISPEN |ISP Enable - * | | |This bit is protected bit. ISP function enable bit. Set this bit to enable ISP function. - * | | |1 = Enable ISP function - * | | |0 = Disable ISP function - * |[1] |BS |Boot Select - * | | |This bit is protected bit. Set/clear this bit to select next booting from LDROM/APROM, - * | | |respectively. This bit also functions as MCU booting status flag, which can be used to check where - * | | |MCU booted from. This bit is initiated with the inverted value of CBS in Config0 after power- - * | | |on reset; It keeps the same value at other reset. - * | | |1 = boot from LDROM - * | | |0 = boot from APROM - * |[4] |CFGUEN |Config Update Enable - * | | |Writing this bit to 1 enables s/w to update Config value by ISP procedure regardless of program - * | | |code is running in APROM or LDROM. - * | | |1 = Config update enable - * | | |0 = Config update disable - * |[5] |LDUEN |LDROM Update Enable - * | | |LDROM update enable bit. - * | | |1 = LDROM can be updated when the MCU runs in APROM. - * | | |0 = LDROM cannot be updated - * |[6] |ISPFF |ISP Fail Flag - * | | |This bit is set by hardware when a triggered ISP meets any of the following conditions: - * | | |(1) APROM writes to itself. - * | | |(2) LDROM writes to itself. - * | | |(3) Destination address is illegal, such as over an available range. - * | | |Write 1 to clear. - * |[7] |SWRST |Software Reset - * | | |Writing 1 to this bit to start software reset. - * | | |It is cleared by hardware after reset is finished. - * @var FMC_T::ISPADR - * Offset: 0x04 ISP Address Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |ISPADR |ISP Address - * | | |it supports word program only. ISPARD[1:0] must be kept 2'b00 for ISP operation. - * @var FMC_T::ISPDAT - * Offset: 0x08 ISP Data Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |ISPDAT |ISP Data - * | | |Write data to this register before ISP program operation - * | | |Read data from this register after ISP read operation - * @var FMC_T::ISPCMD - * Offset: 0x0C ISP Command Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[5:0] |ISPCMD |ISP Command - * | | |ISP command table is shown below: - * | | |0x00 = Read. - * | | |0x21 = Program. - * | | |0x22 = Page Erase. - * @var FMC_T::ISPTRG - * Offset: 0x10 ISP Trigger Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |ISPGO |ISP start trigger - * | | |Write 1 to start ISP operation and this bit will be cleared to 0 by hardware automatically when ISP - * | | |operation is finish. - * | | |1 = ISP is on going - * | | |0 = ISP done - * @var FMC_T::DFBADR - * Offset: 0x14 Data Flash Base Address Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |DFBA |Data Flash Base Address - * | | |This register indicates data flash start address. - * | | |It is a read only register. - * | | |For 8/16/32/64kB flash memory device, the data flash size is 4kB and it start address is fixed at - * | | |0x01F000 by hardware internally. - * @var FMC_T::FATCON - * Offset: 0x18 Flash Access Time Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |FPSEN |Flash Power Save Enable - * | | |If CPU clock is slower than 24 MHz, then s/w can enable flash power saving function. - * | | |1 = Enable flash power saving - * | | |0 = Disable flash power saving - * |[4] |L_SPEED |Flash Low Speed Mode Enable - * | | |1 = Flash access always no wait state (zero wait state) - * | | |0 = Insert wait state while Flash access discontinued address. - * | | |Note: Set this bit only when HCLK <= 25MHz. If HCLK > 25MHz, CPU will fetch wrong - * | | |code and cause fail result. - * @var FMC_T::ISPSTA - * Offset: 0x40 ISP Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |ISPGO |ISP Start Trigger (Read Only) - * | | |Write 1 to start ISP operation and this bit will be cleared to 0 by hardware - * | | |automatically when ISP operation is finished. - * | | |0 = ISP operation finished. - * | | |1 = ISP operation progressed. - * | | |Note: This bit is the same as ISPTRG bit0 - * |[2:1] |CBS |Chip Boot Selection (Read Only) - * | | |This is a mirror of CBS in Config0. - * |[6] |ISPFF |ISP Fail Flag (Write-protection Bit) - * | | |This bit is set by hardware when a triggered ISP meets any of the following conditions: - * | | |(1) APROM writes to itself. - * | | |(2) LDROM writes to itself. - * | | |(3) CONFIG is erased/programmed when CFGUEN is set to 0 - * | | |(4) Destination address is illegal, such as over an available range. - * |[20:9] |VECMAP |Vector Page Mapping Address (Read Only) - * | | |The current flash address space 0x0000_0000~0x0000_01FF is mapping to the address - * | | |{VECMAP[11:0], 9'h000} ~ {VECMAP[11:0], 9'h1FF} - */ - - __IO uint32_t ISPCON; /* Offset: 0x00 ISP Control Register */ - __IO uint32_t ISPADR; /* Offset: 0x04 ISP Address Register */ - __IO uint32_t ISPDAT; /* Offset: 0x08 ISP Data Register */ - __IO uint32_t ISPCMD; /* Offset: 0x0C ISP Command Register */ - __IO uint32_t ISPTRG; /* Offset: 0x10 ISP Trigger Control Register */ - __I uint32_t DFBADR; /* Offset: 0x14 Data Flash Base Address Register */ - __IO uint32_t FATCON; /* Offset: 0x18 Flash Access Time Control Register */ - __I uint32_t RESERVED[9]; - __IO uint32_t ISPSTA; /* Offset: 0x40 ISP Status Register */ - -} FMC_T; - - - -/** @addtogroup REG_FMC_BITMASK FMC Bit Mask - @{ - */ - -/* FMC ISPCON Bit Field Definitions */ -#define FMC_ISPCON_ET_Pos 12 /*!< FMC_T::ISPCON: ET Position */ -#define FMC_ISPCON_ET_Msk (7ul << FMC_ISPCON_ET_Pos) /*!< FMC_T::ISPCON: ET Mask */ - -#define FMC_ISPCON_PT_Pos 8 /*!< FMC_T::ISPCON: PT Position */ -#define FMC_ISPCON_PT_Msk (7ul << FMC_ISPCON_PT_Pos) /*!< FMC_T::ISPCON: PT Mask */ - -#define FMC_ISPCON_ISPFF_Pos 6 /*!< FMC_T::ISPCON: ISPFF Position */ -#define FMC_ISPCON_ISPFF_Msk (1ul << FMC_ISPCON_ISPFF_Pos) /*!< FMC_T::ISPCON: ISPFF Mask */ - -#define FMC_ISPCON_LDUEN_Pos 5 /*!< FMC_T::ISPCON: LDUEN Position */ -#define FMC_ISPCON_LDUEN_Msk (1ul << FMC_ISPCON_LDUEN_Pos) /*!< FMC_T::ISPCON: LDUEN Mask */ - -#define FMC_ISPCON_CFGUEN_Pos 4 /*!< FMC_T::ISPCON: CFGUEN Position */ -#define FMC_ISPCON_CFGUEN_Msk (1ul << FMC_ISPCON_CFGUEN_Pos) /*!< FMC_T::ISPCON: CFGUEN Mask */ - -#define FMC_ISPCON_APUEN_Pos 3 /*!< FMC_T::ISPCON: APUEN Position */ -#define FMC_ISPCON_APUEN_Msk (1ul << FMC_ISPCON_APUEN_Pos) /*!< FMC_T::ISPCON: APUEN Mask */ - -#define FMC_ISPCON_BS_Pos 1 /*!< FMC_T::ISPCON: BS Position */ -#define FMC_ISPCON_BS_Msk (0x1ul << FMC_ISPCON_BS_Pos) /*!< FMC_T::ISPCON: BS Mask */ - -#define FMC_ISPCON_ISPEN_Pos 0 /*!< FMC_T::ISPCON: ISPEN Position */ -#define FMC_ISPCON_ISPEN_Msk (1ul << FMC_ISPCON_ISPEN_Pos) /*!< FMC_T::ISPCON: ISPEN Mask */ - -/* FMC ISPADR Bit Field Definitions */ -#define FMC_ISPADR_ISPADR_Pos 0 /*!< FMC_T::ISPADR: ISPADR Position */ -#define FMC_ISPADR_ISPADR_Msk (0xFFFFFFFFul << FMC_ISPADR_ISPADR_Pos) /*!< FMC_T::ISPADR: ISPADR Mask */ - -/* FMC ISPADR Bit Field Definitions */ -#define FMC_ISPDAT_ISPDAT_Pos 0 /*!< FMC_T::ISPDAT: ISPDAT Position */ -#define FMC_ISPDAT_ISPDAT_Msk (0xFFFFFFFFul << FMC_ISPDAT_ISPDAT_Pos) /*!< FMC_T::ISPDAT: ISPDAT Mask */ - -/* FMC ISPCMD Bit Field Definitions */ -#define FMC_ISPCMD_FOEN_Pos 5 /*!< FMC_T::ISPCMD: FOEN Position */ -#define FMC_ISPCMD_FOEN_Msk (1ul << FMC_ISPCMD_FOEN_Pos) /*!< FMC_T::ISPCMD: FOEN Mask */ - -#define FMC_ISPCMD_FCEN_Pos 4 /*!< FMC_T::ISPCMD: FCEN Position */ -#define FMC_ISPCMD_FCEN_Msk (1ul << FMC_ISPCMD_FCEN_Pos) /*!< FMC_T::ISPCMD: FCEN Mask */ - -#define FMC_ISPCMD_FCTRL_Pos 0 /*!< FMC_T::ISPCMD: FCTRL Position */ -#define FMC_ISPCMD_FCTRL_Msk (0xFul << FMC_ISPCMD_FCTRL_Pos) /*!< FMC_T::ISPCMD: FCTRL Mask */ - -/* FMC ISPTRG Bit Field Definitions */ -#define FMC_ISPTRG_ISPGO_Pos 0 /*!< FMC_T::ISPTRG: ISPGO Position */ -#define FMC_ISPTRG_ISPGO_Msk (1ul << FMC_ISPTRG_ISPGO_Pos) /*!< FMC_T::ISPTRG: ISPGO Mask */ - -/* FMC DFBADR Bit Field Definitions */ -#define FMC_DFBADR_DFBA_Pos 0 /*!< FMC_T::DFBADR: DFBA Position */ -#define FMC_DFBADR_DFBA_Msk (0xFFFFFFFFul << FMC_DFBADR_DFBA_Pos) /*!< FMC_T::DFBADR: DFBA Mask */ - -/* FMC FATCON Bit Field Definitions */ -#define FMC_FATCON_FOMSEL1_Pos 6 /*!< FMC_T::FATCON: FOMSEL1 Position */ -#define FMC_FATCON_FOMSEL1_Msk (1ul << FMC_FATCON_FOMSEL1_Pos) /*!< FMC_T::FATCON: FOMSEL1 Mask */ - -#define FMC_FATCON_FOMSEL0_Pos 4 /*!< FMC_T::FATCON: FOMSEL0 Position */ -#define FMC_FATCON_FOMSEL0_Msk (1ul << FMC_FATCON_FOMSEL0_Pos) /*!< FMC_T::FATCON: FOMSEL0 Mask */ - -#define FMC_FATCON_FATS_Pos 1 /*!< FMC_T::FATCON: FATS Position */ -#define FMC_FATCON_FATS_Msk (7ul << FMC_FATCON_FATS_Pos) /*!< FMC_T::FATCON: FATS Mask */ - -#define FMC_FATCON_FPSEN_Pos 0 /*!< FMC_T::FATCON: FPSEN Position */ -#define FMC_FATCON_FPSEN_Msk (1ul << FMC_FATCON_FPSEN_Pos) /*!< FMC_T::FATCON: FPSEN Mask */ - - -#define FMC_ISPSTA_ISPGO_Pos 0 /*!< FMC_T::ISPSTA: ISPGO Position */ -#define FMC_ISPSTA_ISPGO_Msk (1ul << FMC_ISPSTA_ISPGO_Pos) /*!< FMC_T::ISPSTA: ISPGO Mask */ - -#define FMC_ISPSTA_CBS_Pos 1 /*!< FMC_T::ISPSTA: CBS Position */ -#define FMC_ISPSTA_CBS_Msk (0x3ul << FMC_ISPSTA_CBS_Pos) /*!< FMC_T::ISPSTA: CBS Mask */ - -#define FMC_ISPSTA_ISPFF_Pos 6 /*!< FMC_T::ISPSTA: ISPFF Position */ -#define FMC_ISPSTA_ISPFF_Msk (0x3ul << FMC_ISPSTA_ISPFF_Pos) /*!< FMC_T::ISPSTA: ISPFF Mask */ - -#define FMC_ISPSTA_VECMAP_Pos 9 /*!< FMC_T::ISPSTA: VECMAP Position */ -#define FMC_ISPSTA_VECMAP_Msk (0xFFFul << FMC_ISPSTA_VECMAP_Pos) /*!< FMC_T::ISPSTA: VECMAP Mask */ - -/*@}*/ /* end of group REG_FMC_BITMASK */ -/*@}*/ /* end of group REG_FMC */ - - - -/*--------------------- General Purpose I/O (GPIO) ---------------------*/ -/** @addtogroup REG_GPIO General Purpose Input/Output Controller (GPIO) - Memory Mapped Structure for General Purpose I/O - @{ - */ - -typedef struct -{ - - -/** - * @var GPIO_T::PMD - * Offset: 0x00/0x40/0x80/0xC0/0x140 GPIO Port [A/B/C/D/F] Pin I/O Mode Control - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[2n+1:2n]|PMDn |GPIOx I/O Pin[n] Mode Control - * | | |Determine each I/O mode of GPIOx pins. - * | | |00 = GPIO port [n] pin is in Input mode. - * | | |01 = GPIO port [n] pin is in Push-pull Output mode. - * | | |10 = GPIO port [n] pin is in Open-drain Output mode. - * | | |11 = GPIO port [n] pin is in Quasi-bidirectional mode. - * | | |Note: - * | | |n = 10~15 for port A. Others are reserved. - * | | |n = 0~10, 12~15 for port B. Others are reserved. - * | | |n = 0~5, 8~13 for port C. Others are reserved. - * | | |n = 0~5, 8~11 for port D. Others are reserved. - * | | |n = 0~3 for port F. Others are reserved. - * @var GPIO_T::OFFD - * Offset: 0x04/0x44/0x84/0xC4/0x144 GPIO Port [A/B/C/D/F] Pin Digital Input Path Disable Control - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[[n+16]]|OFFDn |GPIOx Pin[n] Digital Input Path Disable Control - * | | |Each of these bits is used to control if the digital input path of corresponding GPIO pin is disabled. - * | | |If input is analog signal, users can disable GPIO digital input path to avoid current leakage. - * | | |0 = I/O digital input path Enabled. - * | | |1 = I/O digital input path Disabled (digital input tied to low). - * | | |Note: - * | | |n = 10~15 for port A. Others are reserved. - * | | |n = 0~10, 12~15 for port B. Others are reserved. - * | | |n = 0~5, 8~13 for port C. Others are reserved. - * | | |n = 0~5, 8~11 for port D. Others are reserved. - * | | |n = 0~3 for port F. Others are reserved. - * @var GPIO_T::DOUT - * Offset: 0x08/0x48/0x88/0xC8/0x148 GPIO Port [A/B/C/D/F] Data Output Value - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[n] |DOUTn |GPIOx Pin[n] Output Value - * | | |Each of these bits controls the status of a Px.n pin when the Px.n is configured as Push-pull output, Open-drain output or Quasi-bidirectional mode. - * | | |0 = Px.n will drive Low if the Px.n pin is configured as Push-pull output, Open-drain output or Quasi-bidirectional mode. - * | | |1 = Px.n will drive High if the Px.n pin is configured as Push-pull output or Quasi-bidirectional mode. - * | | |Note: - * | | |n = 10~15 for port A. Others are reserved. - * | | |n = 0~10, 12~15 for port B. Others are reserved. - * | | |n = 0~5, 8~13 for port C. Others are reserved. - * | | |n = 0~5, 8~11 for port D. Others are reserved. - * | | |n = 0~3 for port F. Others are reserved. - * @var GPIO_T::DMASK - * Offset: 0x0C/0x4C/0x8C/0xCC/0x14C GPIO Port [A/B/C/D/F] Data Output Write Mask - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[n] |DMASKn |GPIOx Pin[n] Data Output Write Mask - * | | |These bits are used to protect the corresponding DOUT (GPIOx_DOUT[n]) bit. - * | | |When the DATMSK (GPIOx _DATMSK[n]) bit is set to 1, the corresponding DOUT (GPIOx _DOUT[n]) bit is protected. - * | | |If the write signal is masked, writing data to the protect bit is ignored. - * | | |0 = Corresponding DOUT (GPIOx_DOUT[n]) bit can be updated. - * | | |1 = Corresponding DOUT (GPIOx_DOUT[n]) bit protected. - * | | |Note1: This function only protect corresponding DOUT (GPIOx_DOUT[n]) bit, and will not protect corresponding bit control register GPIOxn_DOUT. - * | | |Note2: - * | | |n = 10~15 for port A. Others are reserved. - * | | |n = 0~10, 12~15 for port B. Others are reserved. - * | | |n = 0~5, 8~13 for port C. Others are reserved. - * | | |n = 0~5, 8~11 for port D. Others are reserved. - * | | |n = 0~3 for port F. Others are reserved. - * @var GPIO_T::PIN - * Offset: 0x10/0x50/0x90/0xD0/0x150 GPIO Port [A/B/C/D/F] Pin Value - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[n] |PINn |GPIOx Pin[n] Pin Values - * | | |Each bit of the register reflects the actual status of the respective GPIO pin. - * | | |If the bit is 1, it indicates the corresponding pin status is high, else the pin status is low. - * | | |Note: - * | | |n = 10~15 for port A. Others are reserved. - * | | |n = 0~10, 12~15 for port B. Others are reserved. - * | | |n = 0~5, 8~13 for port C. Others are reserved. - * | | |n = 0~5, 8~11 for port D. Others are reserved. - * | | |n = 0~3 for port F. Others are reserved. - * @var GPIO_T::DBEN - * Offset: 0x14/0x54/0x94/0xD4/0x154 GPIO Port [A/B/C/D/F] De-bounce Enable - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[n] |DBENn |GPIOx Pin[n] Input Signal De-Bounce Enable - * | | |The DBEN[n] bit is used to enable the de-bounce function for each corresponding bit. - * | | |If the input signal pulse width cannot be sampled by continuous two de-bounce sample cycle, the input signal transition is seen as the signal bounce and will not trigger the interrupt. - * | | |The de-bounce clock source is controlled by DBCLKSRC (DBNCECON [4]), one de-bounce sample cycle period is controlled by DBCLKSEL (DBNCECON [3:0]). - * | | |0 = Px.n de-bounce function Disabled. - * | | |1 = Px.n de-bounce function Enabled. - * | | |The de-bounce function is valid only for edge triggered interrupt. If the interrupt mode is level triggered, the de-bounce enable bit is ignored. - * | | |Note: - * | | |n = 10~15 for port A. Others are reserved. - * | | |n = 0~10, 12~15 for port B. Others are reserved. - * | | |n = 0~5, 8~13 for port C. Others are reserved. - * | | |n = 0~5, 8~11 for port D. Others are reserved. - * | | |n = 0~3 for port F. Others are reserved. - * @var GPIO_T::IMD - * Offset: 0x18/0x58/0x98/0xD8/0x158 GPIO Port [A/B/C/D/F] Interrupt Mode Control - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[n] |IMDn |GPIOx Pin[n] Edge Or Level Detection Interrupt Control - * | | |IMD[n] is used to control the interrupt is by level trigger or by edge trigger. - * | | |If the interrupt is by edge trigger, the trigger source can be controlled by de-bounce. - * | | |If the interrupt is by level trigger, the input source is sampled by one HCLK clock and generates the interrupt. - * | | |0 = Edge trigger interrupt. - * | | |1 = Level trigger interrupt. - * | | |If the pin is set as the level trigger interrupt, only one level can be set on the registers GPIOx_IEN. - * | | |If both levels to trigger interrupt are set, the setting is ignored and no interrupt will occur. - * | | |The de-bounce function is valid only for edge triggered interrupt. If the interrupt mode is level triggered, the de-bounce enable bit is ignored. - * | | |Note: - * | | |n = 10~15 for port A. Others are reserved. - * | | |n = 0~10, 12~15 for port B. Others are reserved. - * | | |n = 0~5, 8~13 for port C. Others are reserved. - * | | |n = 0~5, 8~11 for port D. Others are reserved. - * | | |n = 0~3 for port F. Others are reserved. - * @var GPIO_T::IEN - * Offset: 0x1C/0x5C/0x9C/0xDC/0x15C GPIO Port [A/B/C/D/F] Interrupt Enable - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[n] |IF_ENn |GPIOx Pin[n] Falling Edge or Low Level Interrupt Trigger Type Enable Bit - * | | |The IF_EN (GPIOx_IEN[n]) bit is used to enable the interrupt for each of the corresponding input Px.n pin. Set bit to 1 also enable the pin wake-up function. - * | | |When setting the IF_EN (Px_IEN[n]) bit to 1 : - * | | |If the interrupt is level trigger (IMD (GPIOx_IMD[n]) bit is set to 1), the input Px.n pin will generate the interrupt while this pin state is at low level. - * | | |If the interrupt is edge trigger(IMD (GPIOx_IMD[n]) bit is set to 0), the input Px.n pin will generate the interrupt while this pin state changed from high to low. - * | | |0 = Px.n level low or high to low interrupt Disabled. - * | | |1 = Px.n level low or high to low interrupt Enabled. - * | | |Note: - * | | |n = 10~15 for port A. Others are reserved. - * | | |n = 0~10, 12~15 for port B. Others are reserved. - * | | |n = 0~5, 8~13 for port C. Others are reserved. - * | | |n = 0~5, 8~11 for port D. Others are reserved. - * | | |n = 0~3 for port F. Others are reserved. - * |[n+16] |IR_ENn |GPIOx Pin[n] Rising Edge or High Level Interrupt Trigger Type Enable Bit - * | | |The IR_EN (GPIOx_IEN[n+16]) bit is used to enable the interrupt for each of the corresponding input Px.n pin. Set bit to 1 also enable the pin wake-up function. - * | | |When setting the IR_EN (GPIOx_IEN[n+16]) bit to 1 : - * | | |If the interrupt is level trigger (IMD (GPIOx_IMD[n]) bit is set to 1), the input Px.n pin will generate the interrupt while this pin state is at high level. - * | | |If the interrupt is edge trigger (IMD (Px_IMD[n]) bit is set to 0), the input Px.n pin will generate the interrupt while this pin state changed from low to high. - * | | |0 = Px.n level high or low to high interrupt Disabled. - * | | |1 = Px.n level high or low to high interrupt Enabled. - * | | |Note: - * | | |n = 10~15 for port A. Others are reserved. - * | | |n = 0~10, 12~15 for port B. Others are reserved. - * | | |n = 0~5, 8~13 for port C. Others are reserved. - * | | |n = 0~5, 8~11 for port D. Others are reserved. - * | | |n = 0~3 for port F. Others are reserved. - * @var GPIO_T::ISRC - * Offset: 0x20/0x60/0xA0/0xE0/0x160 GPIO Port [A/B/C/D/F] Interrupt Source Flag - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[n] |ISRCn |GPIOx Pin[n] Interrupt Source Flag - * | | |Read : - * | | |0 = No interrupt at Px.n. - * | | |1 = Px.n generates an interrupt. - * | | |Write : - * | | |0= No action. - * | | |1= Clear the corresponding pending interrupt. - * | | |Note: - * | | |n = 10~15 for port A. Others are reserved. - * | | |n = 0~10, 12~15 for port B. Others are reserved. - * | | |n = 0~5, 8~13 for port C. Others are reserved. - * | | |n = 0~5, 8~11 for port D. Others are reserved. - * | | |n = 0~3 for port F. Others are reserved. - */ - - __IO uint32_t PMD; /* Offset: 0x00/0x40/0x80/0xC0/0x140 GPIO Port [A/B/C/D/F] Pin I/O Mode Control */ - __IO uint32_t OFFD; /* Offset: 0x04/0x44/0x84/0xC4/0x144 GPIO Port [A/B/C/D/F] Pin Digital Input Path Disable Control */ - __IO uint32_t DOUT; /* Offset: 0x08/0x48/0x88/0xC8/0x148 GPIO Port [A/B/C/D/F] Data Output Value */ - __IO uint32_t DMASK; /* Offset: 0x0C/0x4C/0x8C/0xCC/0x14C GPIO Port [A/B/C/D/F] Data Output Write Mask */ - __I uint32_t PIN; /* Offset: 0x10/0x50/0x90/0xD0/0x150 GPIO Port [A/B/C/D/F] Pin Value */ - __IO uint32_t DBEN; /* Offset: 0x14/0x54/0x94/0xD4/0x154 GPIO Port [A/B/C/D/F] De-bounce Enable */ - __IO uint32_t IMD; /* Offset: 0x18/0x58/0x98/0xD8/0x158 GPIO Port [A/B/C/D/F] Interrupt Mode Control */ - __IO uint32_t IEN; /* Offset: 0x1C/0x5C/0x9C/0xDC/0x15C GPIO Port [A/B/C/D/F] Interrupt Enable */ - __IO uint32_t ISRC; /* Offset: 0x20/0x60/0xA0/0xE0/0x160 GPIO Port [A/B/C/D/F] Interrupt Source Flag */ - -} GPIO_T; - - - - -typedef struct -{ - - -/** - * @var GPIO_DBNCECON_T::DBNCECON - * Offset: 0x180 External Interrupt De-bounce Control - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[3:0] |DBCLKSEL |De-Bounce Sampling Cycle Selection - * | | |0000 = Sample interrupt input once per 1 clocks. - * | | |0001 = Sample interrupt input once per 2 clocks. - * | | |0010 = Sample interrupt input once per 4 clocks. - * | | |0011 = Sample interrupt input once per 8 clocks. - * | | |0100 = Sample interrupt input once per 16 clocks. - * | | |0101 = Sample interrupt input once per 32 clocks. - * | | |0110 = Sample interrupt input once per 64 clocks. - * | | |0111 = Sample interrupt input once per 128 clocks. - * | | |1000 = Sample interrupt input once per 256 clocks. - * | | |1001 = Sample interrupt input once per 2*256 clocks. - * | | |1010 = Sample interrupt input once per 4*256clocks. - * | | |1011 = Sample interrupt input once per 8*256 clocks. - * | | |1100 = Sample interrupt input once per 16*256 clocks. - * | | |1101 = Sample interrupt input once per 32*256 clocks. - * | | |1110 = Sample interrupt input once per 64*256 clocks. - * | | |1111 = Sample interrupt input once per 128*256 clocks. - * |[4] |DBCLKSRC |De-Bounce Counter Clock Source Selection - * | | |0 = De-bounce counter clock source is the HCLK. - * | | |1 = De-bounce counter clock source is the internal 10 kHz low speed oscillator. - * |[5] |ICLK_ON |Interrupt Clock On Mode - * | | |0 = Edge detection circuit is active only if I/O pin corresponding GPIOx_IEN bit is set to 1. - * | | |1 = All I/O pins edge detection circuit is always active after reset. - * | | |It is recommended to turn off this bit to save system power if no special application concern. - */ - - __IO uint32_t DBNCECON; /* Offset: 0x180 External Interrupt De-bounce Control */ - -} GPIO_DBNCECON_T; - - - -/** @addtogroup REG_GPIO_BITMASK GPIO Bit Mask - @{ - */ - -/* GPIO PMD Bit Field Definitions */ -#define GPIO_PMD_PMD15_Pos 30 /*!< GPIO_T::PMD: PMD15 Position */ -#define GPIO_PMD_PMD15_Msk (0x3ul << GPIO_PMD_PMD15_Pos) /*!< GPIO_T::PMD: PMD15 Mask */ - -#define GPIO_PMD_PMD14_Pos 28 /*!< GPIO_T::PMD: PMD14 Position */ -#define GPIO_PMD_PMD14_Msk (0x3ul << GPIO_PMD_PMD14_Pos) /*!< GPIO_T::PMD: PMD14 Mask */ - -#define GPIO_PMD_PMD13_Pos 26 /*!< GPIO_T::PMD: PMD13 Position */ -#define GPIO_PMD_PMD13_Msk (0x3ul << GPIO_PMD_PMD13_Pos) /*!< GPIO_T::PMD: PMD13 Mask */ - -#define GPIO_PMD_PMD12_Pos 24 /*!< GPIO_T::PMD: PMD12 Position */ -#define GPIO_PMD_PMD12_Msk (0x3ul << GPIO_PMD_PMD12_Pos) /*!< GPIO_T::PMD: PMD12 Mask */ - -#define GPIO_PMD_PMD11_Pos 22 /*!< GPIO_T::PMD: PMD11 Position */ -#define GPIO_PMD_PMD11_Msk (0x3ul << GPIO_PMD_PMD11_Pos) /*!< GPIO_T::PMD: PMD11 Mask */ - -#define GPIO_PMD_PMD10_Pos 20 /*!< GPIO_T::PMD: PMD10 Position */ -#define GPIO_PMD_PMD10_Msk (0x3ul << GPIO_PMD_PMD10_Pos) /*!< GPIO_T::PMD: PMD10 Mask */ - -#define GPIO_PMD_PMD9_Pos 18 /*!< GPIO_T::PMD: PMD9 Position */ -#define GPIO_PMD_PMD9_Msk (0x3ul << GPIO_PMD_PMD9_Pos) /*!< GPIO_T::PMD: PMD9 Mask */ - -#define GPIO_PMD_PMD8_Pos 16 /*!< GPIO_T::PMD: PMD8 Position */ -#define GPIO_PMD_PMD8_Msk (0x3ul << GPIO_PMD_PMD8_Pos) /*!< GPIO_T::PMD: PMD8 Mask */ - -#define GPIO_PMD_PMD7_Pos 14 /*!< GPIO_T::PMD: PMD7 Position */ -#define GPIO_PMD_PMD7_Msk (0x3ul << GPIO_PMD_PMD7_Pos) /*!< GPIO_T::PMD: PMD7 Mask */ - -#define GPIO_PMD_PMD6_Pos 12 /*!< GPIO_T::PMD: PMD6 Position */ -#define GPIO_PMD_PMD6_Msk (0x3ul << GPIO_PMD_PMD6_Pos) /*!< GPIO_T::PMD: PMD6 Mask */ - -#define GPIO_PMD_PMD5_Pos 10 /*!< GPIO_T::PMD: PMD5 Position */ -#define GPIO_PMD_PMD5_Msk (0x3ul << GPIO_PMD_PMD5_Pos) /*!< GPIO_T::PMD: PMD5 Mask */ - -#define GPIO_PMD_PMD4_Pos 8 /*!< GPIO_T::PMD: PMD4 Position */ -#define GPIO_PMD_PMD4_Msk (0x3ul << GPIO_PMD_PMD4_Pos) /*!< GPIO_T::PMD: PMD4 Mask */ - -#define GPIO_PMD_PMD3_Pos 6 /*!< GPIO_T::PMD: PMD3 Position */ -#define GPIO_PMD_PMD3_Msk (0x3ul << GPIO_PMD_PMD3_Pos) /*!< GPIO_T::PMD: PMD3 Mask */ - -#define GPIO_PMD_PMD2_Pos 4 /*!< GPIO_T::PMD: PMD2 Position */ -#define GPIO_PMD_PMD2_Msk (0x3ul << GPIO_PMD_PMD2_Pos) /*!< GPIO_T::PMD: PMD2 Mask */ - -#define GPIO_PMD_PMD1_Pos 2 /*!< GPIO_T::PMD: PMD1 Position */ -#define GPIO_PMD_PMD1_Msk (0x3ul << GPIO_PMD_PMD1_Pos) /*!< GPIO_T::PMD: PMD1 Mask */ - -#define GPIO_PMD_PMD0_Pos 0 /*!< GPIO_T::PMD: PMD0 Position */ -#define GPIO_PMD_PMD0_Msk (0x3ul << GPIO_PMD_PMD0_Pos) /*!< GPIO_T::PMD: PMD0 Mask */ - -/* GPIO OFFD Bit Field Definitions */ -#define GPIO_OFFD_OFFD_Pos 16 /*!< GPIO_T::OFFD: OFFD Position */ -#define GPIO_OFFD_OFFD_Msk (0xFFFFul << GPIO_OFFD_OFFD_Pos) /*!< GPIO_T::OFFD: OFFD Mask */ - -/* GPIO DOUT Bit Field Definitions */ -#define GPIO_DOUT_DOUT_Pos 0 /*!< GPIO_T::DOUT: DOUT Position */ -#define GPIO_DOUT_DOUT_Msk (0xFFFFul << GPIO_DOUT_DOUT_Pos) /*!< GPIO_T::DOUT: DOUT Mask */ - -/* GPIO DMASK Bit Field Definitions */ -#define GPIO_DMASK_DMASK_Pos 0 /*!< GPIO_T::DMASK: DMASK Position */ -#define GPIO_DMASK_DMASK_Msk (0xFFFFul << GPIO_DMASK_DMASK_Pos) /*!< GPIO_T::DMASK: DMASK Mask */ - -/* GPIO PIN Bit Field Definitions */ -#define GPIO_PIN_PIN_Pos 0 /*!< GPIO_T::PIN: PIN Position */ -#define GPIO_PIN_PIN_Msk (0xFFFFul << GPIO_PIN_PIN_Pos) /*!< GPIO_T::PIN: PIN Mask */ - -/* GPIO DBEN Bit Field Definitions */ -#define GPIO_DBEN_DBEN_Pos 0 /*!< GPIO_T::DBEN: DBEN Position */ -#define GPIO_DBEN_DBEN_Msk (0xFFFFul << GPIO_DBEN_DBEN_Pos) /*!< GPIO_T::DBEN: DBEN Mask */ - -/* GPIO IMD Bit Field Definitions */ -#define GPIO_IMD_IMD_Pos 0 /*!< GPIO_T::IMD: IMD Position */ -#define GPIO_IMD_IMD_Msk (0xFFFFul << GPIO_IMD_IMD_Pos) /*!< GPIO_T::IMD: IMD Mask */ - -/* GPIO IEN Bit Field Definitions */ -#define GPIO_IEN_IR_EN_Pos 16 /*!< GPIO_T::IEN: IR_EN Position */ -#define GPIO_IEN_IR_EN_Msk (0xFFFFul << GPIO_IEN_IR_EN_Pos) /*!< GPIO_T::IEN: IR_EN Mask */ - -#define GPIO_IEN_IF_EN_Pos 0 /*!< GPIO_T::IEN: IF_EN Position */ -#define GPIO_IEN_IF_EN_Msk (0xFFFFul << GPIO_IEN_IF_EN_Pos) /*!< GPIO_T::IEN: IF_EN Mask */ - -/* GPIO ISRC Bit Field Definitions */ -#define GPIO_ISRC_ISRC_Pos 0 /*!< GPIO_T::ISRC: ISRC Position */ -#define GPIO_ISRC_ISRC_Msk (0xFFFFul << GPIO_ISRC_ISRC_Pos) /*!< GPIO_T::ISRC: ISRC Mask */ - -/* GPIO DBNCECON Bit Field Definitions */ -#define GPIO_DBNCECON_ICLK_ON_Pos 5 /*!< GPIO_DBNCECON_T::DBNCECON: ICLK_ON Position */ -#define GPIO_DBNCECON_ICLK_ON_Msk (1ul << GPIO_DBNCECON_ICLK_ON_Pos) /*!< GPIO_DBNCECON_T::DBNCECON: ICLK_ON Mask */ - -#define GPIO_DBNCECON_DBCLKSRC_Pos 4 /*!< GPIO_DBNCECON_T::DBNCECON: DBCLKSRC Position */ -#define GPIO_DBNCECON_DBCLKSRC_Msk (1ul << GPIO_DBNCECON_DBCLKSRC_Pos) /*!< GPIO_DBNCECON_T::DBNCECON: DBCLKSRC Mask */ - -#define GPIO_DBNCECON_DBCLKSEL_Pos 0 /*!< GPIO_DBNCECON_T::DBNCECON: DBCLKSEL Position */ -#define GPIO_DBNCECON_DBCLKSEL_Msk (0xFul << GPIO_DBNCECON_DBCLKSEL_Pos) /*!< GPIO_DBNCECON_T::DBNCECON: DBCLKSEL Mask */ -/*@}*/ /* end of group REG_GPIO_BITMASK */ -/*@}*/ /* end of group REG_GPIO */ - -/*------------------------------ I2C Controller ------------------------------*/ -/** @addtogroup REG_I2C Inter-IC Bus Controller (I2C) - Memory Mapped Structure for I2C Serial Interface Controller - @{ - */ - -typedef struct -{ - - -/** - * @var I2C_T::I2CON - * Offset: 0x00 I2C Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[2] |AA |Assert Acknowledge Control - * | | |When AA =1 prior to address or data received, an acknowledged (low level to I2Cn_SDA) will be returned during the acknowledge clock pulse on the I2Cn_SCL line when 1.) A slave is acknowledging the address sent from master, 2.) The receiver devices are acknowledging the data sent by transmitter. - * | | |When AA=0 prior to address or data received, a Not acknowledged (high level to I2Cn_SDA) will be returned during the acknowledge clock pulse on the I2Cn_SCL line. - * |[3] |SI |I2C Interrupt Flag - * | | |When a new I2C state is present in the I2CSTATUS register, the SI flag is set by hardware, and if bit EI (I2CON [7]) is set, the I2C interrupt is requested. - * | | |SI must be cleared by software. - * | | |Clear SI by writing 1 to this bit. - * |[4] |STO |I2C STOP Control - * | | |In Master mode, setting STO to transmit a STOP condition to bus then I2C hardware will check the bus condition if a STOP condition is detected this bit will be cleared by hardware automatically. - * | | |In a slave mode, setting STO resets I2C hardware to the defined "not addressed" slave mode. - * | | |This means it is NO LONGER in the slave receiver mode to receive data from the master transmit device. - * |[5] |STA |I2C START Control - * | | |Setting STA to logic 1 to enter Master mode, the I2C hardware sends a START or repeat START condition to bus when the bus is free. - * |[6] |ENS1 |I2C Controller Enable - * | | |0 = Disabled. - * | | |1 = Enabled. - * | | |Set to enable I2C serial function controller. - * | | |When ENS1=1 the I2C serial function enables. - * | | |The multi-function pin function of I2Cn_SDA and I2Cn_SCL must set to I2C function first. - * |[7] |EI |Enable Interrupt - * | | |0 = I2C interrupt Disabled. - * | | |1 = I2C interrupt Enabled. - * @var I2C_T::I2CADDR0 - * Offset: 0x04 I2C Slave Address Register0 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |GC |General Call Function - * | | |0 = General Call Function Disabled. - * | | |1 = General Call Function Enabled. - * |[7:1] |I2CADDR |I2C Address Register - * | | |The content of this register is irrelevant when I2C is in Master mode. - * | | |In the slave mode, the seven most significant bits must be loaded with the chip's own address. - * | | |The I2C hardware will react if either of the address is matched. - * @var I2C_T::I2CDAT - * Offset: 0x08 I2C Data Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[7:0] |I2CDAT |I2C Data Register - * | | |Bit [7:0] is located with the 8-bit transferred data of I2C serial port. - * @var I2C_T::I2CSTATUS - * Offset: 0x0C I2C Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[7:0] |I2CSTATUS |I2C Status Register - * | | |The status register of I2C: - * | | |The three least significant bits are always 0. - * | | |The five most significant bits contain the status code. - * | | |There are 26 possible status codes. - * | | |When I2CSTATUS contains F8H, no serial interrupt is requested. - * | | |All other I2CSTATUS values correspond to defined I2C states. - * | | |When each of these states is entered, a status interrupt is requested (SI = 1). - * | | |A valid status code is present in I2CSTATUS one cycle after SI is set by hardware and is still present one cycle after SI has been reset by software. - * | | |In addition, states 00H stands for a Bus Error. - * | | |A Bus Error occurs when a START or STOP condition is present at an illegal position in the formation frame. - * | | |Example of illegal position are during the serial transfer of an address byte, a data byte or an acknowledge bit. - * @var I2C_T::I2CLK - * Offset: 0x10 I2C Clock Divided Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[7:0] |I2CLK |I2C clock divided Register - * | | |The I2C clock rate bits: Data Baud Rate of I2C = (system clock) / (4x (I2CLK+1)). - * | | |Note: The minimum value of I2CLK is 4. - * @var I2C_T::I2CTOC - * Offset: 0x14 I2C Time-out Counter Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |TIF |Time-out Flag - * | | |This bit is set by H/W when I2C time-out happened and it can interrupt CPU if I2C interrupt enable bit (EI) is set to 1. - * | | |Note: Write 1 to clear this bit. - * |[1] |DIV4 |Time-out Counter Input Clock Divided by 4 - * | | |0 = Disabled. - * | | |1 = Enabled. - * | | |When Enabled, The time-out period is extend 4 times. - * |[2] |ENTI |Time-out Counter Enable/Disable - * | | |0 = Disabled. - * | | |1 = Enabled. - * | | |When Enabled, the 14-bit time-out counter will start counting when SI is clear. - * | | |Setting flag SI to high will reset counter and re-start up counting after SI is cleared. - * @var I2C_T::I2CADDR1 - * Offset: 0x18 I2C Slave Address Register1 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |GC |General Call Function - * | | |0 = General Call Function Disabled. - * | | |1 = General Call Function Enabled. - * |[7:1] |I2CADDR |I2C Address Register - * | | |The content of this register is irrelevant when I2C is in Master mode. - * | | |In the slave mode, the seven most significant bits must be loaded with the chip's own address. - * | | |The I2C hardware will react if either of the address is matched. - * @var I2C_T::I2CADDR2 - * Offset: 0x1C I2C Slave Address Register2 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |GC |General Call Function - * | | |0 = General Call Function Disabled. - * | | |1 = General Call Function Enabled. - * |[7:1] |I2CADDR |I2C Address Register - * | | |The content of this register is irrelevant when I2C is in Master mode. - * | | |In the slave mode, the seven most significant bits must be loaded with the chip's own address. - * | | |The I2C hardware will react if either of the address is matched. - * @var I2C_T::I2CADDR3 - * Offset: 0x20 I2C Slave Address Register3 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |GC |General Call Function - * | | |0 = General Call Function Disabled. - * | | |1 = General Call Function Enabled. - * |[7:1] |I2CADDR |I2C Address Register - * | | |The content of this register is irrelevant when I2C is in Master mode. - * | | |In the slave mode, the seven most significant bits must be loaded with the chip's own address. - * | | |The I2C hardware will react if either of the address is matched. - * @var I2C_T::I2CADM0 - * Offset: 0x24 I2C Slave Address Mask Register0 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[7:1] |I2CADM |I2C Address Mask Register - * | | |0 = Mask Disabled (the received corresponding register bit should be exact the same as address register.). - * | | |1 = Mask Enabled (the received corresponding address bit is don't care.). - * | | |I2C bus controllers support multiple address recognition with four address mask register. - * | | |When the bit in the address mask register is set to one, it means the received corresponding address bit is don't-care. - * | | |If the bit is set to zero, that means the received corresponding register bit should be exact the same as address register. - * @var I2C_T::I2CADM1 - * Offset: 0x28 I2C Slave Address Mask Register1 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[7:1] |I2CADM |I2C Address Mask Register - * | | |0 = Mask Disabled (the received corresponding register bit should be exact the same as address register.). - * | | |1 = Mask Enabled (the received corresponding address bit is don't care.). - * | | |I2C bus controllers support multiple address recognition with four address mask register. - * | | |When the bit in the address mask register is set to one, it means the received corresponding address bit is don't-care. - * | | |If the bit is set to zero, that means the received corresponding register bit should be exact the same as address register. - * @var I2C_T::I2CADM2 - * Offset: 0x2C I2C Slave Address Mask Register2 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[7:1] |I2CADM |I2C Address Mask Register - * | | |0 = Mask Disabled (the received corresponding register bit should be exact the same as address register.). - * | | |1 = Mask Enabled (the received corresponding address bit is don't care.). - * | | |I2C bus controllers support multiple address recognition with four address mask register. - * | | |When the bit in the address mask register is set to one, it means the received corresponding address bit is don't-care. - * | | |If the bit is set to zero, that means the received corresponding register bit should be exact the same as address register. - * @var I2C_T::I2CADM3 - * Offset: 0x30 I2C Slave Address Mask Register3 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[7:1] |I2CADM |I2C Address Mask Register - * | | |0 = Mask Disabled (the received corresponding register bit should be exact the same as address register.). - * | | |1 = Mask Enabled (the received corresponding address bit is don't care.). - * | | |I2C bus controllers support multiple address recognition with four address mask register. - * | | |When the bit in the address mask register is set to one, it means the received corresponding address bit is don't-care. - * | | |If the bit is set to zero, that means the received corresponding register bit should be exact the same as address register. - * @var I2C_T::I2CWKUPCON - * Offset: 0x3C I2C Wake-up Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |WKUPEN |I2C Wake-up Enable - * | | |0 = I2C wake-up function Disabled. - * | | |1= I2C wake-up function Enabled. - * @var I2C_T::I2CWKUPSTS - * Offset: 0x40 I2C Wake-up Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |WKUPIF |I2C Wake-up Flag - * | | |When chip is woken up from Power-down mode by I2C, this bit is set to 1. - * | | |Software can write 1 to clear this bit. - */ - - __IO uint32_t I2CON; /* Offset: 0x00 I2C Control Register */ - __IO uint32_t I2CADDR0; /* Offset: 0x04 I2C Slave Address Register0 */ - __IO uint32_t I2CDAT; /* Offset: 0x08 I2C Data Register */ - __I uint32_t I2CSTATUS; /* Offset: 0x0C I2C Status Register */ - __IO uint32_t I2CLK; /* Offset: 0x10 I2C Clock Divided Register */ - __IO uint32_t I2CTOC; /* Offset: 0x14 I2C Time-out Counter Register */ - __IO uint32_t I2CADDR1; /* Offset: 0x18 I2C Slave Address Register1 */ - __IO uint32_t I2CADDR2; /* Offset: 0x1C I2C Slave Address Register2 */ - __IO uint32_t I2CADDR3; /* Offset: 0x20 I2C Slave Address Register3 */ - __IO uint32_t I2CADM0; /* Offset: 0x24 I2C Slave Address Mask Register0 */ - __IO uint32_t I2CADM1; /* Offset: 0x28 I2C Slave Address Mask Register1 */ - __IO uint32_t I2CADM2; /* Offset: 0x2C I2C Slave Address Mask Register2 */ - __IO uint32_t I2CADM3; /* Offset: 0x30 I2C Slave Address Mask Register3 */ - __I uint32_t RESERVED[2]; - __IO uint32_t I2CWKUPCON; /* Offset: 0x3C I2C Wake-up Control Register */ - __IO uint32_t I2CWKUPSTS; /* Offset: 0x40 I2C Wake-up Status Register */ - -} I2C_T; - - - -/** @addtogroup REG_I2C_BITMASK I2C Bit Mask - @{ - */ - -/* I2C I2CON Bit Field Definitions */ -#define I2C_I2CON_EI_Pos 7 /*!< I2C_T::I2CON: EI Position */ -#define I2C_I2CON_EI_Msk (1ul << I2C_I2CON_EI_Pos) /*!< I2C_T::I2CON: EI Mask */ - -#define I2C_I2CON_ENS1_Pos 6 /*!< I2C_T::I2CON: ENS1 Position */ -#define I2C_I2CON_ENS1_Msk (1ul << I2C_I2CON_ENS1_Pos) /*!< I2C_T::I2CON: ENS1 Mask */ - -#define I2C_I2CON_STA_Pos 5 /*!< I2C_T::I2CON: STA Position */ -#define I2C_I2CON_STA_Msk (1ul << I2C_I2CON_STA_Pos) /*!< I2C_T::I2CON: STA Mask */ - -#define I2C_I2CON_STO_Pos 4 /*!< I2C_T::I2CON: STO Position */ -#define I2C_I2CON_STO_Msk (1ul << I2C_I2CON_STO_Pos) /*!< I2C_T::I2CON: STO Mask */ - -#define I2C_I2CON_SI_Pos 3 /*!< I2C_T::I2CON: SI Position */ -#define I2C_I2CON_SI_Msk (1ul << I2C_I2CON_SI_Pos) /*!< I2C_T::I2CON: SI Mask */ - -#define I2C_I2CON_AA_Pos 2 /*!< I2C_T::I2CON: AA Position */ -#define I2C_I2CON_AA_Msk (1ul << I2C_I2CON_AA_Pos) /*!< I2C_T::I2CON: AA Mask */ - -/* I2C I2CADDR Bit Field Definitions */ -#define I2C_I2CADDR_I2CADDR_Pos 1 /*!< I2C_T::I2CADDR1: I2CADDR Position */ -#define I2C_I2CADDR_I2CADDR_Msk (0x7Ful << I2C_I2CADDR_I2CADDR_Pos) /*!< I2C_T::I2CADDR1: I2CADDR Mask */ - -#define I2C_I2CADDR_GC_Pos 0 /*!< I2C_T::I2CADDR1: GC Position */ -#define I2C_I2CADDR_GC_Msk (1ul << I2C_I2CADDR_GC_Pos) /*!< I2C_T::I2CADDR1: GC Mask */ - -/* I2C I2CDAT Bit Field Definitions */ -#define I2C_I2CDAT_I2CDAT_Pos 0 /*!< I2C_T::I2CDAT: I2CDAT Position */ -#define I2C_I2CDAT_I2CDAT_Msk (0xFFul << I2C_I2CDAT_I2CDAT_Pos) /*!< I2C_T::I2CDAT: I2CDAT Mask */ - -/* I2C I2CSTATUS Bit Field Definitions */ -#define I2C_I2CSTATUS_I2CSTATUS_Pos 0 /*!< I2C_T::I2CSTATUS: I2CSTATUS Position */ -#define I2C_I2CSTATUS_I2CSTATUS_Msk (0xFFul << I2C_I2CSTATUS_I2CSTATUS_Pos) /*!< I2C_T::I2CSTATUS: I2CSTATUS Mask */ - -/* I2C I2CLK Bit Field Definitions */ -#define I2C_I2CLK_I2CLK_Pos 0 /*!< I2C_T::I2CLK: I2CLK Position */ -#define I2C_I2CLK_I2CLK_Msk (0xFFul << I2C_I2CLK_I2CLK_Pos) /*!< I2C_T::I2CLK: I2CLK Mask */ - -/* I2C I2CTOC Bit Field Definitions */ -#define I2C_I2CTOC_ENTI_Pos 2 /*!< I2C_T::I2CTOC: ENTI Position */ -#define I2C_I2CTOC_ENTI_Msk (1ul << I2C_I2CTOC_ENTI_Pos) /*!< I2C_T::I2CTOC: ENTI Mask */ - -#define I2C_I2CTOC_DIV4_Pos 1 /*!< I2C_T::I2CTOC: DIV4 Position */ -#define I2C_I2CTOC_DIV4_Msk (1ul << I2C_I2CTOC_DIV4_Pos) /*!< I2C_T::I2CTOC: DIV4 Mask */ - -#define I2C_I2CTOC_TIF_Pos 0 /*!< I2C_T::I2CTOC: TIF Position */ -#define I2C_I2CTOC_TIF_Msk (1ul << I2C_I2CTOC_TIF_Pos) /*!< I2C_T::I2CTOC: TIF Mask */ - -/* I2C I2CADM Bit Field Definitions */ -#define I2C_I2CADM_I2CADM_Pos 1 /*!< I2C_T::I2CADM0: I2CADM Position */ -#define I2C_I2CADM_I2CADM_Msk (0x7Ful << I2C_I2CADM_I2CADM_Pos) /*!< I2C_T::I2CADM0: I2CADM Mask */ - -/* I2C I2CWKUPCON Bit Field Definitions */ -#define I2C_I2CWKUPCON_WKUPEN_Pos 0 /*!< I2C_T::I2CWKUPCON: WKUPEN Position */ -#define I2C_I2CWKUPCON_WKUPEN_Msk (1ul << I2C_I2CWKUPCON_WKUPEN_Pos) /*!< I2C_T::I2CWKUPCON: WKUPEN Mask */ - -/* I2C I2CWKUPSTS Bit Field Definitions */ -#define I2C_I2CWKUPSTS_WKUPIF_Pos 0 /*!< I2C_T::I2CWKUPSTS: WKUPIF Position */ -#define I2C_I2CWKUPSTS_WKUPIF_Msk (1ul << I2C_I2CWKUPSTS_WKUPIF_Pos) /*!< I2C_T::I2CWKUPSTS: WKUPIF Mask */ -/*@}*/ /* end of group REG_I2C_BITMASK */ -/*@}*/ /* end of group REG_I2C */ - -/*----------------------------- I2S Controller -------------------------------*/ -/** @addtogroup REG_I2S Integrated Inter-chip Sound(I2S) - Memory Mapped Structure for I2S Interface Controller - @{ - */ - -typedef struct -{ - - -/** - * @var I2S_T::CON - * Offset: 0x00 I2S Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |I2SEN |I2S Controller Enable - * | | |0 = Disabled. - * | | |1 = Enabled. - * |[1] |TXEN |Transmit Enable - * | | |0 = Data transmit Disabled. - * | | |1 = Data transmit Enabled. - * |[2] |RXEN |Receive Enable - * | | |0 = Data receiving Disabled. - * | | |1 = Data receiving Enabled. - * |[3] |MUTE |Transmit Mute Enable - * | | |0 = Transmit data is shifted from buffer. - * | | |1 = Send zero on transmit channel. - * |[5:4] |WORDWIDTH |Word Width - * | | |00 = data is 8-bit word. - * | | |01 = data is 16-bit word. - * | | |10 = data is 24-bit word. - * | | |11 = data is 32-bit word. - * |[6] |MONO |Monaural Data - * | | |0 = Data is stereo format. - * | | |1 = Data is monaural format. - * |[7] |FORMAT |Data Format - * | | |0 = I2S data format. - * | | |1 = MSB justified data format. - * |[8] |SLAVE |Slave Mode - * | | |I2S can operate as master or slave. - * | | |For Master mode, I2SBCLK and I2SLRCLK pins are output mode and send bit clock from NuMicro NUC123 series to Audio CODEC chip. - * | | |In Slave mode, I2SBCLK and I2SLRCLK pins are input mode and I2SBCLK and I2SLRCLK signals are received from outer Audio CODEC chip. - * | | |0 = Master mode. - * | | |1 = Slave mode. - * |[11:9] |TXTH |Transmit FIFO Threshold Level - * | | |If the count of remaining data word (32 bits) in transmit FIFO is equal to or less than threshold level then TXTHF (I2SSTATUS[18]) is set. - * | | |000 = 0 word data in transmit FIFO. - * | | |001 = 1 word data in transmit FIFO. - * | | |010 = 2 words data in transmit FIFO. - * | | |011 = 3 words data in transmit FIFO. - * | | |100 = 4 words data in transmit FIFO. - * | | |101 = 5 words data in transmit FIFO. - * | | |110 = 6 words data in transmit FIFO. - * | | |111 = 7 words data in transmit FIFO. - * |[14:12] |RXTH |Receive FIFO Threshold Level - * | | |When the count of received data word(s) in buffer is equal to or higher than threshold level, RXTHF (I2SSTATUS[10]) will be set. - * | | |000 = 1 word data in receive FIFO. - * | | |001 = 2 word data in receive FIFO. - * | | |010 = 3 word data in receive FIFO. - * | | |011 = 4 word data in receive FIFO. - * | | |100 = 5 word data in receive FIFO. - * | | |101 = 6 word data in receive FIFO. - * | | |110 = 7 word data in receive FIFO. - * | | |111 = 8 word data in receive FIFO. - * |[15] |MCLKEN |Master Clock Enable - * | | |If MCLKEN is set to 1, I2S controller will generate master clock on I2S_MCLK pin for external audio devices. - * | | |0 = Master clock Disabled. - * | | |1 = Master clock Enabled. - * |[16] |RCHZCEN |Right Channel Zero Cross Detection Enable - * | | |If this bit is set to 1, when right channel data sign bit change or next shift data bits are all 0 then RZCF flag in I2SSTATUS register is set to 1. - * | | |This function is only available in transmit operation. - * | | |0 = Right channel zero cross detection Disabled. - * | | |1 = Right channel zero cross detection Enabled. - * |[17] |LCHZCEN |Left Channel Zero Cross Detection Enable - * | | |If this bit is set to 1, when left channel data sign bit changes or next shift data bits are all 0 then LZCF flag in I2SSTATUS register is set to 1. - * | | |This function is only available in transmit operation. - * | | |0 = Left channel zero cross detection Disabled. - * | | |1 = Left channel zero cross detection Enabled. - * |[18] |CLR_TXFIFO|Clear Transmit FIFO - * | | |Write 1 to clear transmit FIFO, internal pointer is reset to FIFO start point, and TX_LEVEL[3:0] returns to 0 and - * | | |transmit FIFO becomes empty but data in transmit FIFO is not changed. - * | | |This bit is cleared by hardware automatically. Returns 0 on read. - * |[19] |CLR_RXFIFO|Clear Receive FIFO - * | | |Write 1 to clear receive FIFO, internal pointer is reset to FIFO start point, and RX_LEVEL[3:0] returns 0 and receive FIFO becomes empty. - * | | |This bit is cleared by hardware automatically. Returns 0 on read. - * |[20] |TXDMA |Enable Transmit DMA - * | | |When TX DMA is enabled, I2S request DMA to transfer data from SRAM to transmit FIFO if FIFO is not full. - * | | |0 = TX DMA Disabled. - * | | |1 = TX DMA Enabled. - * |[21] |RXDMA |Enable Receive DMA - * | | |When RX DMA is enabled, I2S requests DMA to transfer data from receive FIFO to SRAM if FIFO is not empty. - * | | |0 = RX DMA Disabled. - * | | |1 = RX DMA Enabled. - * |[23] |RXLCH |Receive Left Channel Enable - * | | |When monaural format is selected (MONO = 1), I2S controller will receive right channel data if RXLCH is set to 0, - * | | |and receive left channel data if RXLCH is set to 1. - * | | |0 = Receive right channel data in Mono mode. - * | | |1 = Receive left channel data in Mono mode. - * @var I2S_T::CLKDIV - * Offset: 0x04 I2S Clock Divider Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[2:0] |MCLK_DIV |Master Clock Divider - * | | |If MCLKEN is set to 1, I2S controller will generate master clock for external audio devices. - * | | |The master clock rate, F_MCLK, is determined by the following expressions. - * | | |If MCLK_DIV >= 1, F_MCLK = F_I2SCLK/(2x(MCLK_DIV)). - * | | |If MCLK_DIV = 0, F_MCLK = F_I2SCLK. - * | | |F_I2SCLK is the frequency of I2S peripheral clock. - * | | |In general, the master clock rate is 256 times sampling clock rate. - * |[15:8] |BCLK_DIV |Bit Clock Divider - * | | |The I2S controller will generate bit clock in Master mode. - * | | |The bit clock rate, F_BCLK, is determined by the following expression. - * | | |F_BCLK = F_I2SCLK /(2x(BCLK_DIV + 1)) , where F_I2SCLK is the frequency of I2S peripheral clock. - * @var I2S_T::IE - * Offset: 0x08 I2S Interrupt Enable Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |RXUDFIE |Receive FIFO Underflow Interrupt Enable - * | | |0 = Interrupt Disabled. - * | | |1 = Interrupt Enabled. - * |[1] |RXOVFIE |Receive FIFO Overflow Interrupt Enable - * | | |0 = Interrupt Disabled. - * | | |1 = Interrupt Enabled. - * |[2] |RXTHIE |Receive FIFO Threshold Level Interrupt Enable - * | | |When the count of data words in receive FIFO is equal to or higher than RXTH (I2SCON[14:12]) and - * | | |this bit is set to 1, receive FIFO threshold level interrupt will be asserted. - * | | |0 = Interrupt Disabled. - * | | |1 = Interrupt Enabled. - * |[8] |TXUDFIE |Transmit FIFO Underflow Interrupt Enable - * | | |Interrupt occurs if this bit is set to 1 and the transmit FIFO underflow flag is set to 1. - * | | |0 = Interrupt Disabled. - * | | |1 = Interrupt Enabled. - * |[9] |TXOVFIE |Transmit FIFO Overflow Interrupt Enable - * | | |Interrupt occurs if this bit is set to 1 and the transmit FIFO overflow flag is set to 1 - * | | |0 = Interrupt Disabled. - * | | |1 = Interrupt Enabled. - * |[10] |TXTHIE |Transmit FIFO Threshold Level Interrupt Enable - * | | |Interrupt occurs if this bit is set to 1 and the count of data words in transmit FIFO is less than TXTH (I2SCON[11:9]). - * | | |0 = Interrupt Disabled. - * | | |1 = Interrupt Enabled. - * |[11] |RZCIE |Right Channel Zero-Cross Interrupt Enable - * | | |Interrupt occurs if this bit is set to 1 and right channel zero-cross event is detected. - * | | |0 = Interrupt Disabled. - * | | |1 = Interrupt Enabled. - * |[12] |LZCIE |Left Channel Zero-Cross Interrupt Enable - * | | |Interrupt occurs if this bit is set to 1 and left channel zero-cross event is detected. - * | | |0 = Interrupt Disabled. - * | | |1 = Interrupt Enabled. - * @var I2S_T::STATUS - * Offset: 0x0C I2S Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |I2SINT |I2S Interrupt Flag - * | | |This bit is wire-OR of I2STXINT and I2SRXINT bits. - * | | |0 = No I2S interrupt. - * | | |1 = I2S interrupt. - * | | |Note: This bit is read only. - * |[1] |I2SRXINT |I2S Receive Interrupt - * | | |0 = No receive interrupt. - * | | |1 = Receive interrupt. - * | | |Note: This bit is read only. - * |[2] |I2STXINT |I2S Transmit Interrupt - * | | |0 = No transmit interrupt. - * | | |1 = Transmit interrupt. - * | | |Note: This bit is read only. - * |[3] |RIGHT |Right Channel - * | | |This bit indicates current transmit data is belong to which channel - * | | |0 = Left channel. - * | | |1 = Right channel. - * | | |Note: This bit is read only. - * |[8] |RXUDF |Receive FIFO Underflow Flag - * | | |Underflow event will occur if read the empty receive FIFO. - * | | |0 = No underflow event occurred. - * | | |1 = Underflow. - * | | |Note: Write 1 to clear this bit to 0. - * |[9] |RXOVF |Receive FIFO Overflow Flag - * | | |When receive FIFO is full and hardware attempt to write data to receive FIFO, this bit will be set to 1, data in 1st buffer will be overwrote. - * | | |0 = No overflow. - * | | |1 = Overflow. - * | | |Note: Write 1 to clear this bit to 0. - * |[10] |RXTHF |Receive FIFO Threshold Flag - * | | |When data word(s) in receive FIFO is equal to or larger than threshold value set in RXTH (I2SCON[14:12]). - * | | |The RXTHF bit becomes to 1. - * | | |It keeps at 1 till RX_LEVEL (I2SSTATUS[27:24]) is less than RXTH. - * | | |0 = Data word(s) in FIFO is less than threshold level. - * | | |1 = Data word(s) in FIFO is equal to or larger than threshold level. - * | | |Note: This bit is read only. - * |[11] |RXFULL |Receive FIFO Full - * | | |This bit reflects the count of data in receive FIFO is 8 - * | | |0 = Not full. - * | | |1 = Full. - * | | |Note: This bit is read only. - * |[12] |RXEMPTY |Receive FIFO Empty - * | | |This bit reflects the count of data in receive FIFO is 0 - * | | |0 = Not empty. - * | | |1 = Empty. - * | | |Note: This bit is read only. - * |[16] |TXUDF |Transmit FIFO Underflow Flag - * | | |If transmit FIFO is empty and hardware reads data from transmit FIFO. This bit will be set to 1. - * | | |0 = No underflow. - * | | |1 = Underflow. - * | | |Note: Software can write 1 to clear this bit to 0. - * |[17] |TXOVF |Transmit FIFO Overflow Flag - * | | |This bit will be set to 1 if writes data to transmit FIFO when transmit FIFO is full. - * | | |0 = No overflow. - * | | |1 = Overflow. - * | | |Note: Write 1 to clear this bit to 0. - * |[18] |TXTHF |Transmit FIFO Threshold Flag - * | | |When the count of data stored in transmit-FIFO is equal to or less than threshold value set in TXTH (I2SCON[11:9]). - * | | |The TXTHF bit becomes to 1. - * | | |It keeps at 1 till TX_LEVEL (I2SSTATUS[31:28]) is larger than TXTH. - * | | |0 = Data word(s) in FIFO is larger than threshold level. - * | | |1 = Data word(s) in FIFO is equal to or less than threshold level. - * | | |Note: This bit is read only. - * |[19] |TXFULL |Transmit FIFO Full - * | | |This bit reflects data word number in transmit FIFO is 8 - * | | |0 = Not full. - * | | |1 = Full. - * | | |Note: This bit is read only. - * |[20] |TXEMPTY |Transmit FIFO Empty - * | | |This bit reflects data word number in transmit FIFO is 0 - * | | |0 = Not empty. - * | | |1 = Empty. - * | | |Note: This bit is read only. - * |[21] |TXBUSY |Transmit Busy - * | | |This bit is cleared to 0 when all data in transmit FIFO and shift buffer is shifted out. - * | | |And set to 1 when 1st data is load to shift buffer. - * | | |0 = Transmit shift buffer is empty. - * | | |1 = Transmit shift buffer is not empty. - * | | |Note: This bit is read only. - * |[22] |RZCF |Right Channel Zero-Cross Flag - * | | |It indicates the sign bit of right channel sample data is changed or all data bits are 0. - * | | |0 = No zero-cross. - * | | |1 = Right channel zero-cross event is detected. - * | | |Note: Write 1 to clear this bit to 0. - * |[23] |LZCF |Left Channel Zero-Cross Flag - * | | |It indicates the sign bit of left channel sample data is changed or all data bits are 0. - * | | |0 = No zero-cross. - * | | |1 = Left channel zero-cross event is detected. - * | | |Note: Write 1 to clear this bit to 0. - * |[27:24] |RX_LEVEL |Receive FIFO Level - * | | |These bits indicate word number in receive FIFO - * | | |0000 = No data. - * | | |0001 = 1 word in receive FIFO. - * | | |.... - * | | |1000 = 8 words in receive FIFO. - * |[31:28] |TX_LEVEL |Transmit FIFO Level - * | | |These bits indicate word number in transmit FIFO - * | | |0000 = No data. - * | | |0001 = 1 word in transmit FIFO. - * | | |.... - * | | |1000 = 8 words in transmit FIFO. - * @var I2S_T::TXFIFO - * Offset: 0x10 I2S Transmit FIFO Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |TXFIFO |Transmit FIFO Register - * | | |I2S contains 8 words (8x32 bits) data buffer for data transmit. - * | | |Write data to this register to prepare data for transmission. - * | | |The remaining word number is indicated by TX_LEVEL (I2SSTATUS[31:28]). - * @var I2S_T::RXFIFO - * Offset: 0x14 I2S Receive FIFO Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |RXFIFO |Receive FIFO Register - * | | |I2S contains 8 words (8x32 bits) data buffer for data receive. - * | | |Read this register to get data of receive FIFO. - * | | |The remaining data word number is indicated by RX_LEVEL (I2SSTATUS[27:24]). - */ - - __IO uint32_t CON; /* Offset: 0x00 I2S Control Register */ - __IO uint32_t CLKDIV; /* Offset: 0x04 I2S Clock Divider Control Register */ - __IO uint32_t IE; /* Offset: 0x08 I2S Interrupt Enable Register */ - __IO uint32_t STATUS; /* Offset: 0x0C I2S Status Register */ - __O uint32_t TXFIFO; /* Offset: 0x10 I2S Transmit FIFO Register */ - __I uint32_t RXFIFO; /* Offset: 0x14 I2S Receive FIFO Register */ - -} I2S_T; - - - -/** @addtogroup REG_I2S_BITMASK I2S Bit Mask - @{ - */ - -/* I2S I2SCON Bit Field Definitions */ -#define I2S_CON_PCM_Pos 24 /*!< I2S_T::CON: PCM Position */ -#define I2S_CON_PCM_Msk (1ul << I2S_CON_PCM_Pos) /*!< I2S_T::CON: PCM Mask */ - -#define I2S_CON_RXLCH_Pos 23 /*!< I2S_T::CON: RXLCH Position */ -#define I2S_CON_RXLCH_Msk (1ul << I2S_CON_RXLCH_Pos) /*!< I2S_T::CON: RXLCH Mask */ - -#define I2S_CON_RXDMA_Pos 21 /*!< I2S_T::CON: RXDMA Position */ -#define I2S_CON_RXDMA_Msk (1ul << I2S_CON_RXDMA_Pos) /*!< I2S_T::CON: RXDMA Mask */ - -#define I2S_CON_TXDMA_Pos 20 /*!< I2S_T::CON: TXDMA Position */ -#define I2S_CON_TXDMA_Msk (1ul << I2S_CON_TXDMA_Pos) /*!< I2S_T::CON: TXDMA Mask */ - -#define I2S_CON_CLR_RXFIFO_Pos 19 /*!< I2S_T::CON: CLR_RXFIFO Position */ -#define I2S_CON_CLR_RXFIFO_Msk (1ul << I2S_CON_CLR_RXFIFO_Pos) /*!< I2S_T::CON: CLR_RXFIFO Mask */ - -#define I2S_CON_CLR_TXFIFO_Pos 18 /*!< I2S_T::CON: CLR_TXFIFO Position */ -#define I2S_CON_CLR_TXFIFO_Msk (1ul << I2S_CON_CLR_TXFIFO_Pos) /*!< I2S_T::CON: CLR_TXFIFO Mask */ - -#define I2S_CON_LCHZCEN_Pos 17 /*!< I2S_T::CON: LCHZCEN Position */ -#define I2S_CON_LCHZCEN_Msk (1ul << I2S_CON_LCHZCEN_Pos) /*!< I2S_T::CON: LCHZCEN Mask */ - -#define I2S_CON_RCHZCEN_Pos 16 /*!< I2S_T::CON: RCHZCEN Position */ -#define I2S_CON_RCHZCEN_Msk (1ul << I2S_CON_RCHZCEN_Pos) /*!< I2S_T::CON: RCHZCEN Mask */ - -#define I2S_CON_MCLKEN_Pos 15 /*!< I2S_T::CON: MCLKEN Position */ -#define I2S_CON_MCLKEN_Msk (1ul << I2S_CON_MCLKEN_Pos) /*!< I2S_T::CON: MCLKEN Mask */ - -#define I2S_CON_RXTH_Pos 12 /*!< I2S_T::CON: RXTH Position */ -#define I2S_CON_RXTH_Msk (7ul << I2S_CON_RXTH_Pos) /*!< I2S_T::CON: RXTH Mask */ - -#define I2S_CON_TXTH_Pos 9 /*!< I2S_T::CON: TXTH Position */ -#define I2S_CON_TXTH_Msk (7ul << I2S_CON_TXTH_Pos) /*!< I2S_T::CON: TXTH Mask */ - -#define I2S_CON_SLAVE_Pos 8 /*!< I2S_T::CON: SLAVE Position */ -#define I2S_CON_SLAVE_Msk (1ul << I2S_CON_SLAVE_Pos) /*!< I2S_T::CON: SLAVE Mask */ - -#define I2S_CON_FORMAT_Pos 7 /*!< I2S_T::CON: FORMAT Position */ -#define I2S_CON_FORMAT_Msk (1ul << I2S_CON_FORMAT_Pos) /*!< I2S_T::CON: FORMAT Mask */ - -#define I2S_CON_MONO_Pos 6 /*!< I2S_T::CON: MONO Position */ -#define I2S_CON_MONO_Msk (1ul << I2S_CON_MONO_Pos) /*!< I2S_T::CON: MONO Mask */ - -#define I2S_CON_WORDWIDTH_Pos 4 /*!< I2S_T::CON: WORDWIDTH Position */ -#define I2S_CON_WORDWIDTH_Msk (3ul << I2S_CON_WORDWIDTH_Pos) /*!< I2S_T::CON: WORDWIDTH Mask */ - -#define I2S_CON_MUTE_Pos 3 /*!< I2S_T::CON: MUTE Position */ -#define I2S_CON_MUTE_Msk (1ul << I2S_CON_MUTE_Pos) /*!< I2S_T::CON: MUTE Mask */ - -#define I2S_CON_RXEN_Pos 2 /*!< I2S_T::CON: RXEN Position */ -#define I2S_CON_RXEN_Msk (1ul << I2S_CON_RXEN_Pos) /*!< I2S_T::CON: RXEN Mask */ - -#define I2S_CON_TXEN_Pos 1 /*!< I2S_T::CON: TXEN Position */ -#define I2S_CON_TXEN_Msk (1ul << I2S_CON_TXEN_Pos) /*!< I2S_T::CON: TXEN Mask */ - -#define I2S_CON_I2SEN_Pos 0 /*!< I2S_T::CON: I2SEN Position */ -#define I2S_CON_I2SEN_Msk (1ul << I2S_CON_I2SEN_Pos) /*!< I2S_T::CON: I2SEN Mask */ - -/* I2S I2SCLKDIV Bit Field Definitions */ -#define I2S_CLKDIV_BCLK_DIV_Pos 8 /*!< I2S_T::CLKDIV: BCLK_DIV Position */ -#define I2S_CLKDIV_BCLK_DIV_Msk (0xFFul << I2S_CLKDIV_BCLK_DIV_Pos) /*!< I2S_T::CLKDIV: BCLK_DIV Mask */ - -#define I2S_CLKDIV_MCLK_DIV_Pos 0 /*!< I2S_T::CLKDIV: MCLK_DIV Position */ -#define I2S_CLKDIV_MCLK_DIV_Msk (7ul << I2S_CLKDIV_MCLK_DIV_Pos) /*!< I2S_T::CLKDIV: MCLK_DIV Mask */ - -/* I2S I2SIE Bit Field Definitions */ -#define I2S_IE_LZCIE_Pos 12 /*!< I2S_T::IE: LZCIE Position */ -#define I2S_IE_LZCIE_Msk (1ul << I2S_IE_LZCIE_Pos) /*!< I2S_T::IE: LZCIE Mask */ - -#define I2S_IE_RZCIE_Pos 11 /*!< I2S_T::IE: RZCIE Position */ -#define I2S_IE_RZCIE_Msk (1ul << I2S_IE_RZCIE_Pos) /*!< I2S_T::IE: RZCIE Mask */ - -#define I2S_IE_TXTHIE_Pos 10 /*!< I2S_T::IE: TXTHIE Position */ -#define I2S_IE_TXTHIE_Msk (1ul << I2S_IE_TXTHIE_Pos) /*!< I2S_T::IE: TXTHIE Mask */ - -#define I2S_IE_TXOVFIE_Pos 9 /*!< I2S_T::IE: TXOVFIE Position */ -#define I2S_IE_TXOVFIE_Msk (1ul << I2S_IE_TXOVFIE_Pos) /*!< I2S_T::IE: TXOVFIE Mask */ - -#define I2S_IE_TXUDFIE_Pos 8 /*!< I2S_T::IE: TXUDFIE Position */ -#define I2S_IE_TXUDFIE_Msk (1ul << I2S_IE_TXUDFIE_Pos) /*!< I2S_T::IE: TXUDFIE Mask */ - -#define I2S_IE_RXTHIE_Pos 2 /*!< I2S_T::IE: RXTHIE Position */ -#define I2S_IE_RXTHIE_Msk (1ul << I2S_IE_RXTHIE_Pos) /*!< I2S_T::IE: RXTHIE Mask */ - -#define I2S_IE_RXOVFIE_Pos 1 /*!< I2S_T::IE: RXOVFIE Position */ -#define I2S_IE_RXOVFIE_Msk (1ul << I2S_IE_RXOVFIE_Pos) /*!< I2S_T::IE: RXOVFIE Mask */ - -#define I2S_IE_RXUDFIE_Pos 0 /*!< I2S_T::IE: RXUDFIE Position */ -#define I2S_IE_RXUDFIE_Msk (1ul << I2S_IE_RXUDFIE_Pos) /*!< I2S_T::IE: RXUDFIE Mask */ - - -/* I2S I2SSTATUS Bit Field Definitions */ -#define I2S_STATUS_TX_LEVEL_Pos 28 /*!< I2S_T::STATUS: TX_LEVEL Position */ -#define I2S_STATUS_TX_LEVEL_Msk (0xFul << I2S_STATUS_TX_LEVEL_Pos) /*!< I2S_T::STATUS: TX_LEVEL Mask */ - -#define I2S_STATUS_RX_LEVEL_Pos 24 /*!< I2S_T::STATUS: RX_LEVEL Position */ -#define I2S_STATUS_RX_LEVEL_Msk (0xFul << I2S_STATUS_RX_LEVEL_Pos) /*!< I2S_T::STATUS: RX_LEVEL Mask */ - -#define I2S_STATUS_LZCF_Pos 23 /*!< I2S_T::STATUS: LZCF Position */ -#define I2S_STATUS_LZCF_Msk (1ul << I2S_STATUS_LZCF_Pos) /*!< I2S_T::STATUS: LZCF Mask */ - -#define I2S_STATUS_RZCF_Pos 22 /*!< I2S_T::STATUS: RZCF Position */ -#define I2S_STATUS_RZCF_Msk (1ul << I2S_STATUS_RZCF_Pos) /*!< I2S_T::STATUS: RZCF Mask */ - -#define I2S_STATUS_TXBUSY_Pos 21 /*!< I2S_T::STATUS: TXBUSY Position */ -#define I2S_STATUS_TXBUSY_Msk (1ul << I2S_STATUS_TXBUSY_Pos) /*!< I2S_T::STATUS: TXBUSY Mask */ - -#define I2S_STATUS_TXEMPTY_Pos 20 /*!< I2S_T::STATUS: TXEMPTY Position */ -#define I2S_STATUS_TXEMPTY_Msk (1ul << I2S_STATUS_TXEMPTY_Pos) /*!< I2S_T::STATUS: TXEMPTY Mask */ - -#define I2S_STATUS_TXFULL_Pos 19 /*!< I2S_T::STATUS: TXFULL Position */ -#define I2S_STATUS_TXFULL_Msk (1ul << I2S_STATUS_TXFULL_Pos) /*!< I2S_T::STATUS: TXFULL Mask */ - -#define I2S_STATUS_TXTHF_Pos 18 /*!< I2S_T::STATUS: TXTHF Position */ -#define I2S_STATUS_TXTHF_Msk (1ul << I2S_STATUS_TXTHF_Pos) /*!< I2S_T::STATUS: TXTHF Mask */ - -#define I2S_STATUS_TXOVF_Pos 17 /*!< I2S_T::STATUS: TXOVF Position */ -#define I2S_STATUS_TXOVF_Msk (1ul << I2S_STATUS_TXOVF_Pos) /*!< I2S_T::STATUS: TXOVF Mask */ - -#define I2S_STATUS_TXUDF_Pos 16 /*!< I2S_T::STATUS: TXUDF Position */ -#define I2S_STATUS_TXUDF_Msk (1ul << I2S_STATUS_TXUDF_Pos) /*!< I2S_T::STATUS: TXUDF Mask */ - -#define I2S_STATUS_RXEMPTY_Pos 12 /*!< I2S_T::STATUS: RXEMPTY Position */ -#define I2S_STATUS_RXEMPTY_Msk (1ul << I2S_STATUS_RXEMPTY_Pos) /*!< I2S_T::STATUS: RXEMPTY Mask */ - -#define I2S_STATUS_RXFULL_Pos 11 /*!< I2S_T::STATUS: RXFULL Position */ -#define I2S_STATUS_RXFULL_Msk (1ul << I2S_STATUS_RXFULL_Pos) /*!< I2S_T::STATUS: RXFULL Mask */ - -#define I2S_STATUS_RXTHF_Pos 10 /*!< I2S_T::STATUS: RXTHF Position */ -#define I2S_STATUS_RXTHF_Msk (1ul << I2S_STATUS_RXTHF_Pos) /*!< I2S_T::STATUS: RXTHF Mask */ - -#define I2S_STATUS_RXOVF_Pos 9 /*!< I2S_T::STATUS: RXOVF Position */ -#define I2S_STATUS_RXOVF_Msk (1ul << I2S_STATUS_RXOVF_Pos) /*!< I2S_T::STATUS: RXOVF Mask */ - -#define I2S_STATUS_RXUDF_Pos 8 /*!< I2S_T::STATUS: RXUDF Position */ -#define I2S_STATUS_RXUDF_Msk (1ul << I2S_STATUS_RXUDF_Pos) /*!< I2S_T::STATUS: RXUDF Mask */ - -#define I2S_STATUS_RIGHT_Pos 3 /*!< I2S_T::STATUS: RIGHT Position */ -#define I2S_STATUS_RIGHT_Msk (1ul << I2S_STATUS_RIGHT_Pos) /*!< I2S_T::STATUS: RIGHT Mask */ - -#define I2S_STATUS_I2STXINT_Pos 2 /*!< I2S_T::STATUS: I2STXINT Position */ -#define I2S_STATUS_I2STXINT_Msk (1ul << I2S_STATUS_I2STXINT_Pos) /*!< I2S_T::STATUS: I2STXINT Mask */ - -#define I2S_STATUS_I2SRXINT_Pos 1 /*!< I2S_T::STATUS: I2SRXINT Position */ -#define I2S_STATUS_I2SRXINT_Msk (1ul << I2S_STATUS_I2SRXINT_Pos) /*!< I2S_T::STATUS: I2SRXINT Mask */ - -#define I2S_STATUS_I2SINT_Pos 0 /*!< I2S_T::STATUS: I2SINT Position */ -#define I2S_STATUS_I2SINT_Msk (1ul << I2S_STATUS_I2SINT_Pos) /*!< I2S_T::STATUS: I2SINT Mask */ -/*@}*/ /* end of group REG_I2S_BITMASK */ -/*@}*/ /* end of group REG_I2S */ - -/*------------------------------ DMA Controller -----------------------------*/ -/** @addtogroup REG_PDMA Peripheral Direct Memory Access Controller (PDMA) - Memory Mapped Structure for PDMA Controller - @{ - */ - -typedef struct -{ - - -/** - * @var PDMA_T::CSR - * Offset: 0x00 PDMA Channel x Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |PDMACEN |PDMA Channel Enable Bit - * | | |Setting this bit to 1 enables PDMA operation. - * | | |If this bit is cleared, PDMA will ignore all PDMA request and force Bus Master into IDLE state. - * |[1] |SW_RST |Software Engine Reset - * | | |0 = No effect. - * | | |1 = Reset the internal state machine, pointers and internal buffer. - * | | |The contents of control register will not be cleared. - * | | |This bit will be automatically cleared after one AHB clock cycle. - * |[3:2] |MODE_SEL |PDMA Mode Selection - * | | |00 = Memory to Memory mode (Memory-to-Memory). - * | | |01 = Peripheral to Memory mode (Peripheral-to-Memory). - * | | |10 = Memory to Peripheral mode (Memory-to-Peripheral). - * |[5:4] |SAD_SEL |Transfer Source Address Direction Selection - * | | |00 = Transfer source address is increasing successively. - * | | |01 = Reserved. - * | | |10 = Transfer source address is fixed (This feature can be used when data where transferred from a single source to multiple destinations). - * | | |11 = Reserved. - * |[7:6] |DAD_SEL |Transfer Destination Address Direction Selection - * | | |00 = Transfer destination address is increasing successively. - * | | |01 = Reserved. - * | | |10 = Transfer destination address is fixed. - * | | |(This feature can be used when data where transferred from multiple sources to a single destination). - * | | |11 = Reserved. - * |[20:19] |APB_TWS |Peripheral Transfer Width Selection - * | | |00 = One word (32-bit) is transferred for every PDMA operation. - * | | |01 = One byte (8-bit) is transferred for every PDMA operation. - * | | |10 = One half-word (16-bit) is transferred for every PDMA operation. - * | | |11 = Reserved. - * | | |Note: This field is meaningful only when MODE_SEL (PDMA_CSRx[3:2]) is Peripheral to Memory mode (Peripheral-to-Memory) or Memory to Peripheral mode (Memory-to-Peripheral). - * |[23] |TRIG_EN |Trigger Enable Bit - * | | |0 = No effect. - * | | |1 = PDMA data read or write transfer Enabled. - * | | |Note1: When PDMA transfer completed, this bit will be cleared automatically. - * | | |Note2: If the bus error occurs, all PDMA transfer will be stopped. - * | | |Software must reset all PDMA channel, and then trigger again. - * @var PDMA_T::SAR - * Offset: 0x04 PDMA Channel x Source Address Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |PDMA_SAR |PDMA Transfer Source Address Register - * | | |This field indicates a 32-bit source address of PDMA. - * | | |Note: The source address must be word alignment. - * @var PDMA_T::DAR - * Offset: 0x08 PDMA Channel x Destination Address Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |PDMA_DAR |PDMA Transfer Destination Address Register - * | | |This field indicates a 32-bit destination address of PDMA. - * | | |Note: The destination address must be word alignment - * @var PDMA_T::BCR - * Offset: 0x0C PDMA Channel x Transfer Byte Count Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |PDMA_BCR |PDMA Transfer Byte Count Register - * | | |This field indicates a 16-bit transfer byte count number of PDMA; it must be word alignment. - * @var PDMA_T::POINT - * Offset: 0x10 PDMA Channel x Internal buffer pointer Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[3:0] |PDMA_POINT|PDMA Internal Buffer Pointer Register (Read Only) - * | | |This field indicates the internal buffer pointer. - * @var PDMA_T::CSAR - * Offset: 0x14 PDMA Channel x Current Source Address Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |PDMA_CSAR |PDMA Current Source Address Register (Read Only) - * | | |This field indicates the source address where the PDMA transfer just occurred. - * @var PDMA_T::CDAR - * Offset: 0x18 PDMA Channel x Current Destination Address Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |PDMA_CDAR |PDMA Current Destination Address Register (Read Only) - * | | |This field indicates the destination address where the PDMA transfer just occurred. - * @var PDMA_T::CBCR - * Offset: 0x1C PDMA Channel x Current Transfer Byte Count Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |PDMA_CBCR |PDMA Current Byte Count Register (Read Only) - * | | |This field indicates the current remained byte count of PDMA. - * | | |Note: SW_RST will clear this register value. - * @var PDMA_T::IER - * Offset: 0x20 PDMA Channel x Interrupt Enable Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |TABORT_IE |PDMA Read/Write Target Abort Interrupt Enable Bit - * | | |0 = Target abort interrupt generation Disabled during PDMA transfer. - * | | |1 = Target abort interrupt generation Enabled during PDMA transfer. - * |[1] |BLKD_IE |PDMA Block Transfer Done Interrupt Enable Bit - * | | |0 = Interrupt generator Disabled when PDMA transfer is done. - * | | |1 = Interrupt generator Enabled when PDMA transfer is done. - * @var PDMA_T::ISR - * Offset: 0x24 PDMA Channel x Interrupt Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |TABORT_IF |PDMA Read/Write Target Abort Interrupt Flag - * | | |This bit can be cleared to 0 by software writing '1'. - * | | |0 = No bus ERROR response received. - * | | |1 = Bus ERROR response received. - * | | |Note: This bit filed indicates bus master received ERROR response or not. - * | | |If bus master received ERROR response, it means that target abort is happened. - * | | |PDMA controller will stop transfer and respond this event to software then goes to IDLE state. - * | | |When target abort occurred, software must reset PDMA, and then transfer those data again. - * |[1] |BLKD_IF |PDMA Block Transfer Done Interrupt Flag - * | | |This bit indicates that PDMA has finished all transfers. This bit can be cleared to 0 by software writing '1' - * | | |0 = Not finished. - * | | |1 = Done. - * @var PDMA_T::SBUF - * Offset: 0x80 PDMA Channel x Shared Buffer FIFO x Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |PDMA_SBUF0|PDMA Shared Buffer FIFO 0 (Read Only) - * | | |Each channel has its own 1 word internal buffer. - */ - - __IO uint32_t CSR; /* Offset: 0x00 PDMA Channel x Control Register */ - __IO uint32_t SAR; /* Offset: 0x04 PDMA Channel x Source Address Register */ - __IO uint32_t DAR; /* Offset: 0x08 PDMA Channel x Destination Address Register */ - __IO uint32_t BCR; /* Offset: 0x0C PDMA Channel x Transfer Byte Count Register */ - __I uint32_t POINT; /* Offset: 0x10 PDMA Channel x Internal buffer pointer Register */ - __I uint32_t CSAR; /* Offset: 0x14 PDMA Channel x Current Source Address Register */ - __I uint32_t CDAR; /* Offset: 0x18 PDMA Channel x Current Destination Address Register */ - __I uint32_t CBCR; /* Offset: 0x1C PDMA Channel x Current Transfer Byte Count Register */ - __IO uint32_t IER; /* Offset: 0x20 PDMA Channel x Interrupt Enable Register */ - __IO uint32_t ISR; /* Offset: 0x24 PDMA Channel x Interrupt Status Register */ - __I uint32_t RESERVE[22]; - __I uint32_t SBUF; /* Offset: 0x80 PDMA Channel x Shared Buffer FIFO x Register */ - -} PDMA_T; - - - - -typedef struct -{ - - -/** - * @var PDMA_GCR_T::GCRCSR - * Offset: 0x00 PDMA Global Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[8] |CLK0_EN |PDMA Controller Channel 0 Clock Enable Control - * | | |0 = CRC controller clock Disabled. - * | | |1 = CRC controller clock Enabled. - * |[9] |CLK1_EN |PDMA Controller Channel 1 Clock Enable Control - * | | |0 = PDMA channel 1 clock Disabled. - * | | |1 = PDMA channel 1 clock Enabled. - * |[10] |CLK2_EN |PDMA Controller Channel 2 Clock Enable Control - * | | |0 = PDMA channel 2 clock Disabled. - * | | |1 = PDMA channel 2 clock Enabled. - * |[11] |CLK3_EN |PDMA Controller Channel 3 Clock Enable Control - * | | |0 = PDMA channel 3 clock Disabled. - * | | |1 = PDMA channel 3 clock Enabled. - * |[12] |CLK4_EN |PDMA Controller Channel 4 Clock Enable Control - * | | |0 = PDMA channel 4 clock Disabled. - * | | |1 = PDMA channel 4 clock Enabled. - * |[13] |CLK5_EN |PDMA Controller Channel 5 Clock Enable Control - * | | |0 = PDMA channel 5 clock Disabled. - * | | |1 = PDMA channel 5 clock Enabled. - * |[24] |CRC_CLK_EN|CRC Controller Clock Enable Control - * | | |0 = CRC controller clock Disabled. - * | | |1 = CRC controller clock Enabled. - * @var PDMA_GCR_T::PDSSR0 - * Offset: 0x04 PDMA Service Selection Control Register 0 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[3:0] |SPI0_RXSEL|PDMA SPI0 RX Selection - * | | |This field defines which PDMA channel is connected to the on-chip peripheral SPI0 RX. - * | | |Software can change the channel RX setting by SPI0_RXSEL. - * | | |0000: CH0 - * | | |0001: CH1 - * | | |0010: CH2 - * | | |0011: CH3 - * | | |0100: CH4 - * | | |0101: CH5 - * | | |Others : Reserved - * | | |Note: For example, SPI0_RXSEL = 0100, that means SPI0_RX is connected to PDMA_CH4. - * |[7:4] |SPI0_TXSEL|PDMA SPI0 TX Selection - * | | |This field defines which PDMA channel is connected to the on-chip peripheral SPI0 TX. - * | | |Software can configure the TX channel setting by SPI0_TXSEL. - * | | |The channel configuration is the same as SPI0_RXSEL field. - * | | |Please refer to the explanation of SPI0_RXSEL. - * |[11:8] |SPI1_RXSEL|PDMA SPI1 RX Selection - * | | |This field defines which PDMA channel is connected to the on-chip peripheral SPI1 RX. - * | | |Software can configure the RX channel setting by SPI1_RXSEL. - * | | |The channel configuration is the same as SPI0_RXSEL field. - * | | |Please refer to the explanation of SPI0_RXSEL. - * |[15:12] |SPI1_TXSEL|PDMA SPI1 TX Selection - * | | |This field defines which PDMA channel is connected to the on-chip peripheral SPI1 TX. - * | | |Software can configure the TX channel setting by SPI1_TXSEL. - * | | |The channel configuration is the same as SPI0_RXSEL field. - * | | |Please refer to the explanation of SPI0_RXSEL. - * |[19:16] |SPI2_RXSEL|PDMA SPI2 RX Selection - * | | |This field defines which PDMA channel is connected to the on-chip peripheral SPI2 RX. - * | | |Software can configure the RX channel setting by SPI2_RXSEL. - * | | |The channel configuration is the same as SPI0_RXSEL field. - * | | |Please refer to the explanation of SPI0_RXSEL. - * |[23:20] |SPI2_TXSEL|PDMA SPI2 TX Selection - * | | |This field defines which PDMA channel is connected to the on-chip peripheral SPI2 TX. - * | | |Software can configure the TX channel setting by SPI2_TXSEL. - * | | |The channel configuration is the same as SPI0_RXSEL field. - * | | |Please refer to the explanation of SPI0_RXSEL. - * @var PDMA_GCR_T::PDSSR1 - * Offset: 0x08 PDMA Service Selection Control Register 1 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[3:0] |UART0_RXSEL|PDMA UART0 RX Selection - * | | |This field defines which PDMA channel is connected to the on-chip peripheral UART0 RX. - * | | |Software can change the channel RX setting by UART0_RXSEL. - * | | |0000: CH0 - * | | |0001: CH1 - * | | |0010: CH2 - * | | |0011: CH3 - * | | |0100: CH4 - * | | |0101: CH5 - * | | |Others : Reserved - * | | |Note: For example, UART0_RXSEL = 0100, which means UART0_RX is connected to PDMA_CH4. - * |[7:4] |UART0_TXSEL|PDMA UART0 TX Selection - * | | |This field defines which PDMA channel is connected to the on-chip peripheral UART0 TX. - * | | |Software can configure the TX channel setting by UART0_TXSEL. - * | | |The channel configuration is the same as UART0_RXSEL field. - * | | |Please refer to the explanation of UART0_RXSEL. - * |[11:8] |UART1_RXSEL|PDMA UART1 RX Selection - * | | |This field defines which PDMA channel is connected to the on-chip peripheral UART1 RX. - * | | |Software can configure the RX channel setting by UART1_RXSEL. - * | | |The channel configuration is the same as UART0_RXSEL field. - * | | |Please refer to the explanation of UART0_RXSEL. - * |[15:12] |UART1_TXSEL|PDMA UART1 TX Selection - * | | |This field defines which PDMA channel is connected to the on-chip peripheral UART1 TX. - * | | |Software can configure the TX channel setting by UART1_TXSEL. - * | | |The channel configuration is the same as UART0_RXSEL field. - * | | |Please refer to the explanation of UART0_RXSEL. - * |[27:24] |ADC_RXSEL |PDMA ADC RX Selection - * | | |This field defines which PDMA channel is connected to the on-chip peripheral ADC RX. - * | | |Software can configure the RX channel setting by ADC_RXSEL. - * | | |The channel configuration is the same as UART0_RXSEL field. - * | | |Please refer to the explanation of UART0_RXSEL. - * @var PDMA_GCR_T::GCRISR - * Offset: 0x0C PDMA Global Interrupt Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |INTR0 |Interrupt Status Of Channel 0 - * | | |This bit is the interrupt status of PDMA channel 0. - * | | |Note: This bit is read only - * |[1] |INTR1 |Interrupt Status Of Channel 1 - * | | |This bit is the interrupt status of PDMA channel 1. - * | | |Note: This bit is read only - * |[2] |INTR2 |Interrupt Status Of Channel 2 - * | | |This bit is the interrupt status of PDMA channel 2. - * | | |Note: This bit is read only - * |[3] |INTR3 |Interrupt Status Of Channel 3 - * | | |This bit is the interrupt status of PDMA channel 3. - * | | |Note: This bit is read only - * |[4] |INTR4 |Interrupt Status Of Channel 4 - * | | |This bit is the interrupt status of PDMA channel 4. - * | | |Note: This bit is read only - * |[5] |INTR5 |Interrupt Status Of Channel 5 - * | | |This bit is the interrupt status of PDMA channel 5. - * | | |Note: This bit is read only - * |[16] |INTRCRC |Interrupt Status Of CRC Controller - * | | |This bit is the interrupt status of CRC controller - * | | |Note: This bit is read only - * |[31] |INTR |Interrupt Status - * | | |This bit is the interrupt status of PDMA controller. - * | | |Note: This bit is read only - * @var PDMA_GCR_T::PDSSR2 - * Offset: 0x10 PDMA Service Selection Control Register 2 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[3:0] |I2S_RXSEL |PDMA I2S RX Selection - * | | |This field defines which PDMA channel is connected to the on-chip peripheral I2S RX. - * | | |Software can change the channel RX setting by I2S_RXSEL. - * | | |0000: CH0 - * | | |0001: CH1 - * | | |0010: CH2 - * | | |0011: CH3 - * | | |0100: CH4 - * | | |0101: CH5 - * | | |Others : Reserved - * | | |Note: For example: I2S_RXSEL (PDMA_PDSSR2[3:0]) = 0100, that means I2S_RX is connected to PDMA_CH4. - * |[7:4] |I2S_TXSEL |PDMA I2S TX Selection - * | | |This field defines which PDMA channel is connected to the on-chip peripheral I2S TX. - * | | |Software can configure the TX channel setting by I2S_TXSEL. - * | | |The channel configuration is the same as I2S_RXSEL field. - * | | |Please refer to the explanation of I2S_RXSEL. - * |[11:8] |PWM0_RXSEL|PDMA PWM0 RX Selection - * | | |This filed defines which PDMA channel is connected to the on-chip peripheral PWM0 RX. - * | | |Software can configure the RX channel setting by PWM0_RXSEL. - * | | |The channel configuration is the same as I2S_RXSEL field. - * | | |Please refer to the explanation of I2S_RXSEL. - * |[15:12] |PWM1_RXSEL|PDMA PWM1 RX Selection - * | | |This filed defines which PDMA channel is connected to the on-chip peripheral PWM1 RX. - * | | |Software can configure the RX channel setting by PWM1_RXSEL. - * | | |The channel configuration is the same as I2S_RXSEL field. - * | | |Please refer to the explanation of I2S_RXSEL. - * |[19:16] |PWM2_RXSEL|PDMA PWM2 RX Selection - * | | |This field defines which PDMA channel is connected to the on-chip peripheral PWM2 RX. - * | | |Software can configure the RX channel setting by PWM2_RXSEL. - * | | |The channel configuration is the same as I2S_RXSEL field. - * | | |Please refer to the explanation of I2S_RXSEL. - * |[23:20] |PWM3_RXSEL|PDMA PWM3 RX Selection - * | | |This field defines which PDMA channel is connected to the on-chip peripheral PWM3 RX. - * | | |Software can configure the RX channel setting by PWM3_RXSEL. - * | | |The channel configuration is the same as I2S_RXSEL field. - * | | |Please refer to the explanation of I2S_RXSEL. - */ - - __IO uint32_t GCRCSR; /* Offset: 0x00 PDMA Global Control Register */ - __IO uint32_t PDSSR0; /* Offset: 0x04 PDMA Service Selection Control Register 0 */ - __IO uint32_t PDSSR1; /* Offset: 0x08 PDMA Service Selection Control Register 1 */ - __IO uint32_t GCRISR; /* Offset: 0x0C PDMA Global Interrupt Status Register */ - __IO uint32_t PDSSR2; /* Offset: 0x10 PDMA Service Selection Control Register 2 */ - -} PDMA_GCR_T; - - - - -/** @addtogroup REG_PDMA_BITMASK PDMA Bit Mask - @{ - */ - -/* PDMA CSR Bit Field Definitions */ -#define PDMA_CSR_TRIG_EN_Pos 23 /*!< PDMA_T::CSR: TRIG_EN Position */ -#define PDMA_CSR_TRIG_EN_Msk (1ul << PDMA_CSR_TRIG_EN_Pos) /*!< PDMA_T::CSR: TRIG_EN Mask */ - -#define PDMA_CSR_APB_TWS_Pos 19 /*!< PDMA_T::CSR: APB_TWS Position */ -#define PDMA_CSR_APB_TWS_Msk (3ul << PDMA_CSR_APB_TWS_Pos) /*!< PDMA_T::CSR: APB_TWS Mask */ - -#define PDMA_CSR_DAD_SEL_Pos 6 /*!< PDMA_T::CSR: DAD_SEL Position */ -#define PDMA_CSR_DAD_SEL_Msk (3ul << PDMA_CSR_DAD_SEL_Pos) /*!< PDMA_T::CSR: DAD_SEL Mask */ - -#define PDMA_CSR_SAD_SEL_Pos 4 /*!< PDMA_T::CSR: SAD_SEL Position */ -#define PDMA_CSR_SAD_SEL_Msk (3ul << PDMA_CSR_SAD_SEL_Pos) /*!< PDMA_T::CSR: SAD_SEL Mask */ - -#define PDMA_CSR_MODE_SEL_Pos 2 /*!< PDMA_T::CSR: MODE_SEL Position */ -#define PDMA_CSR_MODE_SEL_Msk (3ul << PDMA_CSR_MODE_SEL_Pos) /*!< PDMA_T::CSR: MODE_SEL Mask */ - -#define PDMA_CSR_SW_RST_Pos 1 /*!< PDMA_T::CSR: SW_RST Position */ -#define PDMA_CSR_SW_RST_Msk (1ul << PDMA_CSR_SW_RST_Pos) /*!< PDMA_T::CSR: SW_RST Mask */ - -#define PDMA_CSR_PDMACEN_Pos 0 /*!< PDMA_T::CSR: PDMACEN Position */ -#define PDMA_CSR_PDMACEN_Msk (1ul << PDMA_CSR_PDMACEN_Pos) /*!< PDMA_T::CSR: PDMACEN Mask */ - -/* PDMA BCR Bit Field Definitions */ -#define PDMA_BCR_BCR_Pos 0 /*!< PDMA_T::BCR: BCR Position */ -#define PDMA_BCR_BCR_Msk (0xFFFFul << PDMA_BCR_BCR_Pos) /*!< PDMA_T::BCR: BCR Mask */ - -/* PDMA POINT Bit Field Definitions */ -#define PDMA_POINT_POINT_Pos 0 /*!< PDMA_T::POINT: POINT Position */ -#define PDMA_POINT_POINT_Msk (0xFul << PDMA_POINT_POINT_Pos) /*!< PDMA_T::POINT: POINT Mask */ - -/* PDMA CBCR Bit Field Definitions */ -#define PDMA_CBCR_CBCR_Pos 0 /*!< PDMA_T::CBCR: CBCR Position */ -#define PDMA_CBCR_CBCR_Msk (0xFFFFul << PDMA_CBCR_CBCR_Pos) /*!< PDMA_T::CBCR: CBCR Mask */ - -/* PDMA IER Bit Field Definitions */ -#define PDMA_IER_BLKD_IE_Pos 1 /*!< PDMA_T::IER: BLKD_IE Position */ -#define PDMA_IER_BLKD_IE_Msk (1ul << PDMA_IER_BLKD_IE_Pos) /*!< PDMA_T::IER: BLKD_IE Mask */ - -#define PDMA_IER_TABORT_IE_Pos 0 /*!< PDMA_T::IER: TABORT_IE Position */ -#define PDMA_IER_TABORT_IE_Msk (1ul << PDMA_IER_TABORT_IE_Pos) /*!< PDMA_T::IER: TABORT_IE Mask */ - -/* PDMA ISR Bit Field Definitions */ -#define PDMA_ISR_BLKD_IF_Pos 1 /*!< PDMA_T::ISR: BLKD_IF Position */ -#define PDMA_ISR_BLKD_IF_Msk (1ul << PDMA_ISR_BLKD_IF_Pos) /*!< PDMA_T::ISR: BLKD_IF Mask */ - -#define PDMA_ISR_TABORT_IF_Pos 0 /*!< PDMA_T::ISR: TABORT_IF Position */ -#define PDMA_ISR_TABORT_IF_Msk (1ul << PDMA_ISR_TABORT_IF_Pos) /*!< PDMA_T::ISR: TABORT_IF Mask */ - -/* PDMA GCRCSR Bit Field Definitions */ -#define PDMA_GCRCSR_CRC_CLK_EN_Pos 24 /*!< PDMA_GCR_T::GCRCSR: CRC_CLK_EN Position */ -#define PDMA_GCRCSR_CRC_CLK_EN_Msk (1ul << PDMA_GCRCSR_CRC_CLK_EN_Pos) /*!< PDMA_GCR_T::GCRCSR: CRC_CLK_EN Mask */ - -#define PDMA_GCRCSR_CLK5_EN_Pos 13 /*!< PDMA_GCR_T::GCRCSR: CLK5_EN Position */ -#define PDMA_GCRCSR_CLK5_EN_Msk (1ul << PDMA_GCRCSR_CLK5_EN_Pos) /*!< PDMA_GCR_T::GCRCSR: CLK5_EN Mask */ - -#define PDMA_GCRCSR_CLK4_EN_Pos 12 /*!< PDMA_GCR_T::GCRCSR: CLK4_EN Position */ -#define PDMA_GCRCSR_CLK4_EN_Msk (1ul << PDMA_GCRCSR_CLK4_EN_Pos) /*!< PDMA_GCR_T::GCRCSR: CLK4_EN Mask */ - -#define PDMA_GCRCSR_CLK3_EN_Pos 11 /*!< PDMA_GCR_T::GCRCSR: CLK3_EN Position */ -#define PDMA_GCRCSR_CLK3_EN_Msk (1ul << PDMA_GCRCSR_CLK3_EN_Pos) /*!< PDMA_GCR_T::GCRCSR: CLK3_EN Mask */ - -#define PDMA_GCRCSR_CLK2_EN_Pos 10 /*!< PDMA_GCR_T::GCRCSR: CLK2_EN Position */ -#define PDMA_GCRCSR_CLK2_EN_Msk (1ul << PDMA_GCRCSR_CLK2_EN_Pos) /*!< PDMA_GCR_T::GCRCSR: CLK2_EN Mask */ - -#define PDMA_GCRCSR_CLK1_EN_Pos 9 /*!< PDMA_GCR_T::GCRCSR: CLK1_EN Position */ -#define PDMA_GCRCSR_CLK1_EN_Msk (1ul << PDMA_GCRCSR_CLK1_EN_Pos) /*!< PDMA_GCR_T::GCRCSR: CLK1_EN Mask */ - -#define PDMA_GCRCSR_CLK0_EN_Pos 8 /*!< PDMA_GCR_T::GCRCSR: CLK0_EN Position */ -#define PDMA_GCRCSR_CLK0_EN_Msk (1ul << PDMA_GCRCSR_CLK0_EN_Pos) /*!< PDMA_GCR_T::GCRCSR: CLK0_EN Mask */ - -/* PDMA PDSSR0 Bit Field Definitions */ -#define PDMA_PDSSR0_SPI2_TXSEL_Pos 20 /*!< PDMA_GCR_T::PDSSR0: SPI2_TXSEL Position */ -#define PDMA_PDSSR0_SPI2_TXSEL_Msk (0xFul << PDMA_PDSSR0_SPI2_TXSEL_Pos) /*!< PDMA_GCR_T::PDSSR0: SPI2_TXSEL Mask */ - -#define PDMA_PDSSR0_SPI2_RXSEL_Pos 16 /*!< PDMA_GCR_T::PDSSR0: SPI2_RXSEL Position */ -#define PDMA_PDSSR0_SPI2_RXSEL_Msk (0xFul << PDMA_PDSSR0_SPI2_RXSEL_Pos) /*!< PDMA_GCR_T::PDSSR0: SPI2_RXSEL Mask */ - -#define PDMA_PDSSR0_SPI1_TXSEL_Pos 12 /*!< PDMA_GCR_T::PDSSR0: SPI1_TXSEL Position */ -#define PDMA_PDSSR0_SPI1_TXSEL_Msk (0xFul << PDMA_PDSSR0_SPI1_TXSEL_Pos) /*!< PDMA_GCR_T::PDSSR0: SPI1_TXSEL Mask */ - -#define PDMA_PDSSR0_SPI1_RXSEL_Pos 8 /*!< PDMA_GCR_T::PDSSR0: SPI1_RXSEL Position */ -#define PDMA_PDSSR0_SPI1_RXSEL_Msk (0xFul << PDMA_PDSSR0_SPI1_RXSEL_Pos) /*!< PDMA_GCR_T::PDSSR0: SPI1_RXSEL Mask */ - -#define PDMA_PDSSR0_SPI0_TXSEL_Pos 4 /*!< PDMA_GCR_T::PDSSR0: SPI0_TXSEL Position */ -#define PDMA_PDSSR0_SPI0_TXSEL_Msk (0xFul << PDMA_PDSSR0_SPI0_TXSEL_Pos) /*!< PDMA_GCR_T::PDSSR0: SPI0_TXSEL Mask */ - -#define PDMA_PDSSR0_SPI0_RXSEL_Pos 0 /*!< PDMA_GCR_T::PDSSR0: SPI0_RXSEL Position */ -#define PDMA_PDSSR0_SPI0_RXSEL_Msk (0xFul << PDMA_PDSSR0_SPI0_RXSEL_Pos) /*!< PDMA_GCR_T::PDSSR0: SPI0_RXSEL Mask */ - -/* PDMA PDSSR1 Bit Field Definitions */ -#define PDMA_PDSSR1_ADC_RXSEL_Pos 24 /*!< PDMA_GCR_T::PDSSR1: ADC_RXSEL Position */ -#define PDMA_PDSSR1_ADC_RXSEL_Msk (0xFul << PDMA_PDSSR1_ADC_RXSEL_Pos) /*!< PDMA_GCR_T::PDSSR1: ADC_RXSEL Mask */ - -#define PDMA_PDSSR1_UART1_TXSEL_Pos 12 /*!< PDMA_GCR_T::PDSSR1: UART1_TXSEL Position */ -#define PDMA_PDSSR1_UART1_TXSEL_Msk (0xFul << PDMA_PDSSR1_UART1_TXSEL_Pos) /*!< PDMA_GCR_T::PDSSR1: UART1_TXSEL Mask */ - -#define PDMA_PDSSR1_UART1_RXSEL_Pos 8 /*!< PDMA_GCR_T::PDSSR1: UART1_RXSEL Position */ -#define PDMA_PDSSR1_UART1_RXSEL_Msk (0xFul << PDMA_PDSSR1_UART1_RXSEL_Pos) /*!< PDMA_GCR_T::PDSSR1: UART1_RXSEL Mask */ - -#define PDMA_PDSSR1_UART0_TXSEL_Pos 4 /*!< PDMA_GCR_T::PDSSR1: UART0_TXSEL Position */ -#define PDMA_PDSSR1_UART0_TXSEL_Msk (0xFul << PDMA_PDSSR1_UART0_TXSEL_Pos) /*!< PDMA_GCR_T::PDSSR1: UART0_TXSEL Mask */ - -#define PDMA_PDSSR1_UART0_RXSEL_Pos 0 /*!< PDMA_GCR_T::PDSSR1: UART0_RXSEL Position */ -#define PDMA_PDSSR1_UART0_RXSEL_Msk (0xFul << PDMA_PDSSR1_UART0_RXSEL_Pos) /*!< PDMA_GCR_T::PDSSR1: UART0_RXSEL Mask */ - -/* PDMA GCRISR Bit Field Definitions */ -#define PDMA_GCRISR_INTR_Pos 31 /*!< PDMA_GCR_T::GCRISR: INTR Position */ -#define PDMA_GCRISR_INTR_Msk (1ul << PDMA_GCRISR_INTR_Pos) /*!< PDMA_GCR_T::GCRISR: INTR Mask */ - -#define PDMA_GCRISR_INTRCRC_Pos 16 /*!< PDMA_GCR_T::GCRISR: INTRCRC Position */ -#define PDMA_GCRISR_INTRCRC_Msk (1ul << PDMA_GCRISR_INTRCRC_Pos) /*!< PDMA_GCR_T::GCRISR: INTRCRC Mask */ - -#define PDMA_GCRISR_INTR5_Pos 5 /*!< PDMA_GCR_T::GCRISR: INTR5 Position */ -#define PDMA_GCRISR_INTR5_Msk (1ul << PDMA_GCRISR_INTR5_Pos) /*!< PDMA_GCR_T::GCRISR: INTR5 Mask */ - -#define PDMA_GCRISR_INTR4_Pos 4 /*!< PDMA_GCR_T::GCRISR: INTR4 Position */ -#define PDMA_GCRISR_INTR4_Msk (1ul << PDMA_GCRISR_INTR4_Pos) /*!< PDMA_GCR_T::GCRISR: INTR4 Mask */ - -#define PDMA_GCRISR_INTR3_Pos 3 /*!< PDMA_GCR_T::GCRISR: INTR3 Position */ -#define PDMA_GCRISR_INTR3_Msk (1ul << PDMA_GCRISR_INTR3_Pos) /*!< PDMA_GCR_T::GCRISR: INTR3 Mask */ - -#define PDMA_GCRISR_INTR2_Pos 2 /*!< PDMA_GCR_T::GCRISR: INTR2 Position */ -#define PDMA_GCRISR_INTR2_Msk (1ul << PDMA_GCRISR_INTR2_Pos) /*!< PDMA_GCR_T::GCRISR: INTR2 Mask */ - -#define PDMA_GCRISR_INTR1_Pos 1 /*!< PDMA_GCR_T::GCRISR: INTR1 Position */ -#define PDMA_GCRISR_INTR1_Msk (1ul << PDMA_GCRISR_INTR1_Pos) /*!< PDMA_GCR_T::GCRISR: INTR1 Mask */ - -#define PDMA_GCRISR_INTR0_Pos 0 /*!< PDMA_GCR_T::GCRISR: INTR0 Position */ -#define PDMA_GCRISR_INTR0_Msk (1ul << PDMA_GCRISR_INTR0_Pos) /*!< PDMA_GCR_T::GCRISR: INTR0 Mask */ - -/* PDMA PDSSR2 Bit Field Definitions */ -#define PDMA_PDSSR2_PWM3_RXSEL_Pos 20 /*!< PDMA_GCR_T::PDSSR2: PWM3_RXSEL Position */ -#define PDMA_PDSSR2_PWM3_RXSEL_Msk (0xFul << PDMA_PDSSR2_PWM3_RXSEL_Pos) /*!< PDMA_GCR_T::PDSSR2: PWM3_RXSEL Mask */ - -#define PDMA_PDSSR2_PWM2_RXSEL_Pos 16 /*!< PDMA_GCR_T::PDSSR2: PWM2_RXSEL Position */ -#define PDMA_PDSSR2_PWM2_RXSEL_Msk (0xFul << PDMA_PDSSR2_PWM2_RXSEL_Pos) /*!< PDMA_GCR_T::PDSSR2: PWM2_RXSEL Mask */ - -#define PDMA_PDSSR2_PWM1_RXSEL_Pos 12 /*!< PDMA_GCR_T::PDSSR2: PWM1_RXSEL Position */ -#define PDMA_PDSSR2_PWM1_RXSEL_Msk (0xFul << PDMA_PDSSR2_PWM1_RXSEL_Pos) /*!< PDMA_GCR_T::PDSSR2: PWM1_RXSEL Mask */ - -#define PDMA_PDSSR2_PWM0_RXSEL_Pos 8 /*!< PDMA_GCR_T::PDSSR2: PWM0_RXSEL Position */ -#define PDMA_PDSSR2_PWM0_RXSEL_Msk (0xFul << PDMA_PDSSR2_PWM0_RXSEL_Pos) /*!< PDMA_GCR_T::PDSSR2: PWM0_RXSEL Mask */ - -#define PDMA_PDSSR2_I2S_TXSEL_Pos 4 /*!< PDMA_GCR_T::PDSSR2: I2S_TXSEL Position */ -#define PDMA_PDSSR2_I2S_TXSEL_Msk (0xFul << PDMA_PDSSR2_I2S_TXSEL_Pos) /*!< PDMA_GCR_T::PDSSR2: I2S_TXSEL Mask */ - -#define PDMA_PDSSR2_I2S_RXSEL_Pos 0 /*!< PDMA_GCR_T::PDSSR2: I2S_RXSEL Position */ -#define PDMA_PDSSR2_I2S_RXSEL_Msk (0xFul << PDMA_PDSSR2_I2S_RXSEL_Pos) /*!< PDMA_GCR_T::PDSSR2: I2S_RXSEL Mask */ -/*@}*/ /* end of group REG_PDMA_BITMASK */ -/*@}*/ /* end of group REG_PDMA */ - - -/*------------------------------ PS2 Controller ------------------------------*/ -/** @addtogroup REG_PS2 PS2 Serial Interface (PS2) - Memory Mapped Structure for PS2 Serial Interface Controller - @{ - */ - -typedef struct -{ - - -/** - * @var PS2_T::PS2CON - * Offset: 0x00 PS/2 Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |PS2EN |Enable PS/2 Device - * | | |Enable PS/2 device controller - * | | |0 = Disabled. - * | | |1 = Enabled. - * |[1] |TXINTEN |Enable Transmit Interrupt - * | | |0 = Data transmit complete interrupt Disabled. - * | | |1 = Data transmit complete interrupt Enabled. - * |[2] |RXINTEN |Enable Receive Interrupt - * | | |0 = Data receive complete interrupt Disabled. - * | | |1 = Data receive complete interrupt Enabled. - * |[6:3] |TXFIFO_DEPTH|Transmit Data FIFO Depth - * | | |There are 16 bytes buffer for data transmit. - * | | |Software can define the FIFO depth from 1 to 16 bytes depends on application needs. - * | | |0 = 1 byte. - * | | |1 = 2 bytes. - * | | |... - * | | |14 = 15 bytes. - * | | |15 = 16 bytes. - * |[7] |ACK |Acknowledge Enable - * | | |0 = Always send acknowledge to host at 12th clock for host to device communication. - * | | |1 = If parity bit error or stop bit is not received correctly, acknowledge bit will not be sent to host at 12th clock. - * |[8] |CLRFIFO |Clear TX FIFO - * | | |Write 1 to this bit to terminate device to host transmission. - * | | |The TXEMPTY(PS2STATUS[7]) bit will be set to 1 and pointer BYTEIDEX(PS2STATUS[11:8]) is reset to 0 regardless there is residue data in buffer or not. - * | | |The buffer content is not been cleared. - * | | |0 = Not active. - * | | |1 = Clear FIFO. - * |[9] |OVERRIDE |Software Override PS/2 CLK/DATA Pin State - * | | |0 = PS2_CLK and PS2_DATA pins are controlled by internal state machine. - * | | |1 = PS2_CLK and PS2_DATA pins are controlled by software. - * |[10] |FPS2CLK |Force PS2CLK Line - * | | |It forces PS2_CLK line high or low regardless of the internal state of the device controller if OVERRIDE(PS2CON[9]) is set to 1. - * | | |0 = Force PS2_CLK line low. - * | | |1 = Force PS2_CLK line high. - * |[11] |FPS2DAT |Force PS2DATA Line - * | | |It forces PS2_DATA high or low regardless of the internal state of the device controller if OVERRIDE (PS2CON[9]) is set to 1. - * | | |0 = Force PS2_DATA low. - * | | |1 = Force PS2_DATA high. - * @var PS2_T::PS2TXDATA0 - * Offset: 0x04 PS/2 Transmit Data Register 0 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |PS2TXDATAx|Transmit Data - * | | |Writing data to this register starts in device to host communication if bus is in IDLE state. - * | | |Software must enable PS2EN(PS2CON[0]) before writing data to TX buffer. - * @var PS2_T::PS2TXDATA1 - * Offset: 0x08 PS/2 Transmit Data Register 1 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |PS2TXDATAx|Transmit Data - * | | |Writing data to this register starts in device to host communication if bus is in IDLE state. - * | | |Software must enable PS2EN(PS2CON[0]) before writing data to TX buffer. - * @var PS2_T::PS2TXDATA2 - * Offset: 0x0C PS/2 Transmit Data Register 2 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |PS2TXDATAx|Transmit Data - * | | |Writing data to this register starts in device to host communication if bus is in IDLE state. - * | | |Software must enable PS2EN(PS2CON[0]) before writing data to TX buffer. - * @var PS2_T::PS2TXDATA3 - * Offset: 0x10 PS/2 Transmit Data Register 3 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |PS2TXDATAx|Transmit Data - * | | |Writing data to this register starts in device to host communication if bus is in IDLE state. - * | | |Software must enable PS2EN(PS2CON[0]) before writing data to TX buffer. - * @var PS2_T::PS2RXDATA - * Offset: 0x14 PS/2 Receive Data Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[7:0] |RXDATA |Received Data - * | | |For host to device communication, after acknowledge bit is sent, the received data is copied from receive shift register to PS2RXDATA register. - * | | |CPU must read this register before next byte reception complete, otherwise the data will be overwritten and RXOVF(PS2STATUS[6]) bit will be set to 1. - * @var PS2_T::PS2STATUS - * Offset: 0x18 PS/2 Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |PS2CLK |CLK Pin State - * | | |This bit reflects the status of the PS2_CLK line after synchronizing. - * |[1] |PS2DATA |DATA Pin State - * | | |This bit reflects the status of the PS2_DATA line after synchronizing and sampling. - * |[2] |FRAMERR |Frame Error - * | | |For host to device communication, this bit sets to 1 if STOP bit (logic 1) is not received. - * | | |If frame error occurs, the PS/2_DATA line may keep at low state after 12th clock. - * | | |At this moment, software overrides PS2_CLK to send clock till PS2_DATA release to high state. - * | | |After that, device sends a "Resend" command to host. - * | | |0 = No frame error. - * | | |1 = Frame error occur. - * | | |Write 1 to clear this bit. - * |[3] |RXPARITY |Received Parity - * | | |This bit reflects the parity bit for the last received data byte (odd parity). - * | | |This bit is read only. - * |[4] |RXBUSY |Receive Busy - * | | |This bit indicates that the PS/2 device is currently receiving data. - * | | |0 = Idle. - * | | |1 = Currently receiving data. - * | | |This bit is read only. - * |[5] |TXBUSY |Transmit Busy - * | | |This bit indicates that the PS/2 device is currently sending data. - * | | |0 = Idle. - * | | |1 = Currently sending data. - * | | |This bit is read only. - * |[6] |RXOVF |RX Buffer Overwrite - * | | |0 = No overwrite. - * | | |1 = Data in PS2RXDATA register is overwritten by new received data. - * | | |Write 1 to clear this bit. - * |[7] |TXEMPTY |TX FIFO Empty - * | | |When software writes data to PS2TXDATA0-3, the TXEMPTY bit is cleared to 0 immediately if PS2EN(PS2CON[0]) is enabled. - * | | |When transmitted data byte number is equal to FIFODEPTH(PS2CON[6:3]) then TXEMPTY bit is set to 1. - * | | |0 = There is data to be transmitted. - * | | |1 = FIFO is empty. - * | | |This bit is read only. - * |[11:8] |BYTEIDX |Byte Index - * | | |It indicates which data byte in transmit data shift register. - * | | |When all data in FIFO is transmitted and it will be cleared to 0. - * | | |This bit is read only. - * | | |BYTEIDX, DATA Transmit , BYTEIDX, DATA Transmit - * | | |0000 , PS2TXDATA0[ 7: 0], 1000 , PS2TXDATA2[ 7: 0], - * | | |0001 , PS2TXDATA0[15: 8], 1001 , PS2TXDATA2[15: 8], - * | | |0010 , PS2TXDATA0[23:16], 1010 , PS2TXDATA2[23:16], - * | | |0011 , PS2TXDATA0[31:24], 1011 , PS2TXDATA2[31:24], - * | | |0100 , PS2TXDATA1[ 7: 0], 1100 , PS2TXDATA3[ 7: 0], - * | | |0101 , PS2TXDATA1[15: 8], 1101 , PS2TXDATA3[15: 8], - * | | |0110 , PS2TXDATA1[23:16], 1110 , PS2TXDATA3[23:16], - * | | |0111 , PS2TXDATA1[31:24], 1111 , PS2TXDATA3[31:24], - * @var PS2_T::PS2INTID - * Offset: 0x1C PS/2 Interrupt Identification Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |RXINT |Receive Interrupt - * | | |This bit is set to 1 when acknowledge bit is sent for Host to device communication. - * | | |Interrupt occurs if RXINTEN(PS2CON[2]) bit is set to 1. - * | | |0 = No interrupt. - * | | |1 = Receive interrupt occurs. - * | | |Write 1 to clear this bit to 0. - * |[1] |TXINT |Transmit Interrupt - * | | |This bit is set to 1 after STOP bit is transmitted. - * | | |Interrupt occur if TXINTEN(PS2CON[1]) bit is set to 1. - * | | |0 = No interrupt. - * | | |1 = Transmit interrupt occurs. - * | | |Write 1 to clear this bit to 0. - */ - - __IO uint32_t PS2CON; /* Offset: 0x00 PS/2 Control Register */ - __IO uint32_t PS2TXDATA0; /* Offset: 0x04 PS/2 Transmit Data Register 0 */ - __IO uint32_t PS2TXDATA1; /* Offset: 0x08 PS/2 Transmit Data Register 1 */ - __IO uint32_t PS2TXDATA2; /* Offset: 0x0C PS/2 Transmit Data Register 2 */ - __IO uint32_t PS2TXDATA3; /* Offset: 0x10 PS/2 Transmit Data Register 3 */ - __IO uint32_t PS2RXDATA; /* Offset: 0x14 PS/2 Receive Data Register */ - __IO uint32_t PS2STATUS; /* Offset: 0x18 PS/2 Status Register */ - __IO uint32_t PS2INTID; /* Offset: 0x1C PS/2 Interrupt Identification Register */ - -} PS2_T; - - - -/** @addtogroup REG_PS2_BITMASK PS2 Bit Mask - @{ - */ - -/* PS2 PS2CON Bit Field Definitions */ -#define PS2_PS2CON_PS2EN_Pos 0 /*!< PS2_T::PS2CON: PS2EN Position */ -#define PS2_PS2CON_PS2EN_Msk (1ul << PS2_PS2CON_PS2EN_Pos) /*!< PS2_T::PS2CON: PS2EN Mask */ - -#define PS2_PS2CON_TXINTEN_Pos 1 /*!< PS2_T::PS2CON: TXINTEN Position */ -#define PS2_PS2CON_TXINTEN_Msk (1ul << PS2_PS2CON_TXINTEN_Pos) /*!< PS2_T::PS2CON: TXINTEN Mask */ - -#define PS2_PS2CON_RXINTEN_Pos 2 /*!< PS2_T::PS2CON: RXINTEN Position */ -#define PS2_PS2CON_RXINTEN_Msk (1ul << PS2_PS2CON_RXINTEN_Pos) /*!< PS2_T::PS2CON: RXINTEN Mask */ - -#define PS2_PS2CON_TXFIFO_DEPTH_Pos 3 /*!< PS2_T::PS2CON: TXFIFO_DEPTH Position */ -#define PS2_PS2CON_TXFIFO_DEPTH_Msk (0xFul << PS2_PS2CON_TXFIFO_DEPTH_Pos) /*!< PS2_T::PS2CON: TXFIFO_DEPTH Mask */ - -#define PS2_PS2CON_ACK_Pos 7 /*!< PS2_T::PS2CON: ACK Position */ -#define PS2_PS2CON_ACK_Msk (1ul << PS2_PS2CON_ACK_Pos) /*!< PS2_T::PS2CON: ACK Mask */ - -#define PS2_PS2CON_CLRFIFO_Pos 8 /*!< PS2_T::PS2CON: CLRFIFO Position */ -#define PS2_PS2CON_CLRFIFO_Msk (1ul << PS2_PS2CON_CLRFIFO_Pos) /*!< PS2_T::PS2CON: CLRFIFO Mask */ - -#define PS2_PS2CON_OVERRIDE_Pos 9 /*!< PS2_T::PS2CON: OVERRIDE Position */ -#define PS2_PS2CON_OVERRIDE_Msk (1ul << PS2_PS2CON_OVERRIDE_Pos) /*!< PS2_T::PS2CON: OVERRIDE Mask */ - -#define PS2_PS2CON_FPS2CLK_Pos 10 /*!< PS2_T::PS2CON: FPS2CLK Position */ -#define PS2_PS2CON_FPS2CLK_Msk (1ul << PS2_PS2CON_FPS2CLK_Pos) /*!< PS2_T::PS2CON: FPS2CLK Mask */ - -#define PS2_PS2CON_FPS2DAT_Pos 11 /*!< PS2_T::PS2CON: FPS2DAT Position */ -#define PS2_PS2CON_FPS2DAT_Msk (1ul << PS2_PS2CON_FPS2DAT_Pos) /*!< PS2_T::PS2CON: FPS2DAT Mask */ - -/* PS/2 PS2RXDATA Bit Field Definitions */ -#define PS2_PS2RXDATA_RXDATA_Pos 0 /*!< PS2_T::PS2RXDATA: RXDATA Position */ -#define PS2_PS2RXDATA_RXDATA_Msk (0xFFul << PS2_PS2RXDATA_RXDATA_Pos) /*!< PS2_T::PS2RXDATA: RXDATA Mask */ - -/* PS/2 PS2STATUS Bit Field Definitions */ -#define PS2_PS2STATUS_PS2CLK_Pos 0 /*!< PS2_T::PS2STATUS: PS2CLK Position */ -#define PS2_PS2STATUS_PS2CLK_Msk (1ul << PS2_PS2STATUS_PS2CLK_Pos) /*!< PS2_T::PS2STATUS: PS2CLK Mask */ - -#define PS2_PS2STATUS_PS2DATA_Pos 1 /*!< PS2_T::PS2STATUS: PS2DATA Position */ -#define PS2_PS2STATUS_PS2DATA_Msk (1ul << PS2_PS2STATUS_PS2DATA_Pos) /*!< PS2_T::PS2STATUS: PS2DATA Mask */ - -#define PS2_PS2STATUS_FRAMERR_Pos 2 /*!< PS2_T::PS2STATUS: FRAMERR Position */ -#define PS2_PS2STATUS_FRAMERR_Msk (1ul << PS2_PS2STATUS_FRAMERR_Pos) /*!< PS2_T::PS2STATUS: FRAMERR Mask */ - -#define PS2_PS2STATUS_RXPARITY_Pos 3 /*!< PS2_T::PS2STATUS: RXPARITY Position */ -#define PS2_PS2STATUS_RXPARITY_Msk (1ul << PS2_PS2STATUS_RXPARITY_Pos) /*!< PS2_T::PS2STATUS: RXPARITY Mask */ - -#define PS2_PS2STATUS_RXBUSY_Pos 4 /*!< PS2_T::PS2STATUS: RXBUSY Position */ -#define PS2_PS2STATUS_RXBUSY_Msk (1ul << PS2_PS2STATUS_RXBUSY_Pos) /*!< PS2_T::PS2STATUS: RXBUSY Mask */ - -#define PS2_PS2STATUS_TXBUSY_Pos 5 /*!< PS2_T::PS2STATUS: TXBUSY Position */ -#define PS2_PS2STATUS_TXBUSY_Msk (1ul << PS2_PS2STATUS_TXBUSY_Pos) /*!< PS2_T::PS2STATUS: TXBUSY Mask */ - -#define PS2_PS2STATUS_RXOVF_Pos 6 /*!< PS2_T::PS2STATUS: RXOVF Position */ -#define PS2_PS2STATUS_RXOVF_Msk (1ul << PS2_PS2STATUS_RXOVF_Pos) /*!< PS2_T::PS2STATUS: RXOVF Mask */ - -#define PS2_PS2STATUS_TXEMPTY_Pos 7 /*!< PS2_T::PS2STATUS: TXEMPTY Position */ -#define PS2_PS2STATUS_TXEMPTY_Msk (1ul << PS2_PS2STATUS_TXEMPTY_Pos) /*!< PS2_T::PS2STATUS: TXEMPTY Mask */ - -#define PS2_PS2STATUS_BYTEIDX_Pos 8 /*!< PS2_T::PS2STATUS: BYTEIDX Position */ -#define PS2_PS2STATUS_BYTEIDX_Msk (0xFul << PS2_PS2STATUS_BYTEIDX_Pos) /*!< PS2_T::PS2STATUS: BYTEIDX Mask */ - -/* PS/2 PS2INTID Bit Field Definitions */ -#define PS2_PS2INTID_RXINT_Pos 0 /*!< PS2_T::PS2INTID: RXINT Position */ -#define PS2_PS2INTID_RXINT_Msk (1ul << PS2_PS2INTID_RXINT_Pos) /*!< PS2_T::PS2INTID: RXINT Mask */ - -#define PS2_PS2INTID_TXINT_Pos 1 /*!< PS2_T::PS2INTID: TXINT Position */ -#define PS2_PS2INTID_TXINT_Msk (1ul << PS2_PS2INTID_TXINT_Pos) /*!< PS2_T::PS2INTID: TXINT Mask */ -/*@}*/ /* end of group REG_PS2_BITMASK */ -/*@}*/ /* end of group REG_PS2 */ - -/*----------------------------- PWM Controller -------------------------------*/ -/** @addtogroup REG_PWM Pulse Width Modulation Controller (PWM) - Memory Mapped Structure for PWM Generator and Capture Timer - @{ - */ - -typedef struct -{ - - -/** - * @var PWM_T::PPR - * Offset: 0x00 PWM Prescaler Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[7:0] |CP01 |Clock Prescaler 0 (PWM-Timer 0 / 1 For Group A) - * | | |Clock input is divided by (CP01 + 1) before it is fed to the corresponding PWM-timer - * | | |If CP01=0, then the clock prescaler 0 output clock will be stopped. - * | | |So corresponding PWM-timer will also be stopped. - * |[15:8] |CP23 |Clock Prescaler 2 (PWM-Timer2 / 3 For Group A) - * | | |Clock input is divided by (CP23 + 1) before it is fed to the corresponding PWM-timer - * | | |If CP23=0, then the clock prescaler 2 output clock will be stopped. - * | | |So corresponding PWM-timer will also be stopped. - * |[23:16] |DZI01 |Dead-Zone Interval For Pair Of Channel 0 And Channel 1 (PWM0 And PWM1 Pair For PWM Group A) - * | | |These 8-bit determine the Dead-zone length. - * | | |The unit time of dead-zone length is received from corresponding CSR bits. - * |[31:24] |DZI23 |Dead-Zone Interval For Pair Of Channel2 And Channel3 (PWM2 And PWM3 Pair For PWM Group A) - * | | |These 8-bit determine the Dead-zone length. - * | | |The unit time of dead-zone length is received from corresponding CSR bits. - * @var PWM_T::CSR - * Offset: 0x04 PWM Clock Source Divider Select Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[2:0] |CSR0 |Timer 0 Clock Source Selection(PWM timer 0 for group A) - * | | |Select clock input for PWM timer, please refer to CSR3. - * |[6:4] |CSR1 |Timer 1 Clock Source Selection(PWM timer 1 for group A) - * | | |Select clock input for PWM timer, please refer to CSR3. - * |[10:8] |CSR2 |Timer 2 Clock Source Selection(PWM timer 2 for group A) - * | | |Select clock input for PWM timer, please refer to CSR3. - * |[14:12] |CSR3 |Timer 3 Clock Source Selection (PWM timer 3 for group A) - * | | |Select clock input for timer. - * | | |000 = Input clock divided by 2. - * | | |001 = Input clock divided by 4. - * | | |010 = Input clock divided by 8. - * | | |011 = Input clock divided by 16. - * | | |100 = Input clock divided by 1. - * @var PWM_T::PCR - * Offset: 0x08 PWM Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |CH0EN |PWM-Timer 0 Enable Bit (PWM Timer 0 For Group A) - * | | |0 = Corresponding PWM-Timer running Stopped. - * | | |1 = Corresponding PWM-Timer start run Enabled. - * |[1] |CH0PINV |PWM-Timer 0 Output Polar Inverse Enable Bit (PWM Timer 0 For Group A) - * | | |0 = PWM0 output polar inverse Disabled. - * | | |1 = PWM0 output polar inverse Enabled. - * |[2] |CH0INV |PWM-Timer 0 Output Inverter Enable Bit (PWM Timer 0 For Group A) - * | | |0 = Inverter Disabled. - * | | |1 = Inverter Enabled. - * |[3] |CH0MOD |PWM-Timer 0 Auto-Reload/One-Shot Mode (PWM Timer 0 For Group A) - * | | |0 = One-shot mode. - * | | |1 = Auto-reload mode. - * | | |Note: If there is a transition at this bit, it will cause CNR0 and CMR0 be cleared. - * |[4] |DZEN01 |Dead-Zone 0 Generator Enable Bit (PWM0 And PWM1 Pair For PWM Group A) - * | | |0 = Disabled. - * | | |1 = Enabled. - * | | |Note: When Dead-zone generator is enabled, the pair of PWM0 and PWM1 becomes a complementary pair for PWM group A. - * |[5] |DZEN23 |Dead-Zone 2 Generator Enable Bit (PWM2 And PWM3 Pair For PWM Group A) - * | | |0 = Dead-zone 2 generator Disabled. - * | | |1 = Dead-zone 2 generator Enabled. - * | | |Note: When Dead-zone generator is enabled, the pair of PWM2 and PWM3 becomes a complementary pair for PWM group A. - * |[8] |CH1EN |PWM-Timer 1 Enable Bit (PWM Timer 1 For Group A) - * | | |0 = Corresponding PWM-Timer running Stopped. - * | | |1 = Corresponding PWM-Timer start run Enabled. - * |[9] |CH1PINV |PWM-Timer 1 Output Polar Inverse Enable Bit (PWM Timer 1 For Group A) - * | | |0 = PWM1 output polar inverse Disabled. - * | | |1 = PWM1 output polar inverse Enabled. - * |[10] |CH1INV |PWM-Timer 1 Output Inverter Enable Bit (PWM Timer 1 For Group A) - * | | |0 = Inverter Disable. - * | | |1 = Inverter Enable. - * |[11] |CH1MOD |PWM-Timer 1 Auto-Reload/One-Shot Mode (PWM Timer 1 For Group A) - * | | |0 = One-shot mode. - * | | |1 = Auto-reload mode. - * | | |Note: If there is a transition at this bit, it will cause CNR1 and CMR1 be cleared. - * |[16] |CH2EN |PWM-Timer 2 Enable Bit (PWM Timer 2 For Group A) - * | | |0 = Corresponding PWM-Timer running Stopped. - * | | |1 = Corresponding PWM-Timer start run Enabled. - * |[17] |CH2PINV |PWM-Timer 2 Output Polar Inverse Enable Bit (PWM Timer 2 For Group A) - * | | |0 = PWM2 output polar inverse Disabled. - * | | |1 = PWM2 output polar inverse Enabled. - * |[18] |CH2INV |PWM-Timer 2 Output Inverter Enable Bit (PWM Timer 2 For Group A) - * | | |0 = Inverter Disabled. - * | | |1 = Inverter Enabled. - * |[19] |CH2MOD |PWM-Timer 2 Auto-Reload/One-Shot Mode (PWM Timer 2 For Group A) - * | | |0 = One-shot mode. - * | | |1 = Auto-reload mode. - * | | |Note: If there is a transition at this bit, it will cause CNR2 and CMR2 be cleared. - * |[24] |CH3EN |PWM-Timer 3 Enable Bit (PWM Timer 3 For Group A) - * | | |0 = Corresponding PWM-Timer running Stopped. - * | | |1 = Corresponding PWM-Timer start run Enabled. - * |[25] |CH3PINV |PWM-Timer 3 Output Polar Inverse Enable (PWM Timer 3 For Group A) - * | | |0 = PWM3 output polar inverse Disable. - * | | |1 = PWM3 output polar inverse Enable. - * |[26] |CH3INV |PWM-Timer 3 Output Inverter Enable Bit (PWM Timer 3 For Group A) - * | | |0 = Inverter Disabled. - * | | |1 = Inverter Enabled. - * |[27] |CH3MOD |PWM-Timer 3 Auto-Reload/One-Shot Mode (PWM Timer 3 For Group A) - * | | |0 = One-shot mode. - * | | |1 = Auto-reload mode. - * | | |Note: If there is a transition at this bit, it will cause CNR3 and CMR3 be cleared. - * |[30] |PWM01TYPE |PWM01 Aligned Type Selection Bit (PWM0 And PWM1 Pair For PWM Group A) - * | | |0 = Edge-aligned type. - * | | |1 = Center-aligned type. - * |[31] |PWM23TYPE |PWM23 Aligned Type Selection Bit (PWM2 And PWM3 Pair For PWM Group A) - * | | |0 = Edge-aligned type. - * | | |1 = Center-aligned type. - * @var PWM_T::CNR0 - * Offset: 0x0C PWM Counter Register 0 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |CNRx |PWM Timer Loaded Value - * | | |CNR determines the PWM period. - * | | |PWM frequency = PWMxy_CLK/[(prescale+1)*(clock divider)*(CNR+1)]; where xy, could be 01 or 23, depends on selected PWM channel. - * | | |For Edge-aligned type: - * | | | Duty ratio = (CMR+1)/(CNR+1). - * | | | CMR >= CNR: PWM output is always high. - * | | | CMR < CNR: PWM low width = (CNR-CMR) unit; PWM high width = (CMR+1) unit. - * | | | CMR = 0: PWM low width = (CNR) unit; PWM high width = 1 unit. - * | | |For Center-aligned type: - * | | | Duty ratio = [(2 x CMR) + 1]/[2 x (CNR+1)]. - * | | | CMR > CNR: PWM output is always high. - * | | | CMR <= CNR: PWM low width = 2 x (CNR-CMR) + 1 unit; PWM high width = (2 x CMR) + 1 unit. - * | | | CMR = 0: PWM low width = 2 x CNR + 1 unit; PWM high width = 1 unit. - * | | |(Unit = one PWM clock cycle). - * | | |Note: Any write to CNR will take effect in next PWM cycle. - * | | |Note: When PWM operating at Center-aligned type, CNR value should be set between 0x0000 to 0xFFFE. - * | | |If CNR equal to 0xFFFF, the PWM will work unpredictable. - * | | |Note: When CNR value is set to 0, PWM output is always high. - * @var PWM_T::CMR0 - * Offset: 0x10 PWM Comparator Register 0 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |CMRx |PWM Comparator Register - * | | |CMR determines the PWM duty. - * | | |PWM frequency = PWMxy_CLK/[(prescale+1)*(clock divider)*(CNR+1)]; where xy, could be 01 or 23, depends on selected PWM channel. - * | | |For Edge-aligned type: - * | | | Duty ratio = (CMR+1)/(CNR+1). - * | | | CMR >= CNR: PWM output is always high. - * | | | CMR < CNR: PWM low width = (CNR-CMR) unit; PWM high width = (CMR+1) unit. - * | | | CMR = 0: PWM low width = (CNR) unit; PWM high width = 1 unit. - * | | |For Center-aligned type: - * | | | Duty ratio = [(2 x CMR) + 1]/[2 x (CNR+1)]. - * | | | CMR > CNR: PWM output is always high. - * | | | CMR <= CNR: PWM low width = 2 x (CNR-CMR) + 1 unit; PWM high width = (2 x CMR) + 1 unit. - * | | | CMR = 0: PWM low width = 2 x CNR + 1 unit; PWM high width = 1 unit. - * | | |(Unit = one PWM clock cycle). - * | | |Note: Any write to CMR will take effect in next PWM cycle. - * @var PWM_T::PDR0 - * Offset: 0x14 PWM Data Register 0 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |PDRx |PWM Data Register - * | | |User can monitor PDR to know the current value in 16-bit counter. - * @var PWM_T::CNR1 - * Offset: 0x18 PWM Counter Register 1 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |CNRx |PWM Timer Loaded Value - * | | |CNR determines the PWM period. - * | | |PWM frequency = PWMxy_CLK/[(prescale+1)*(clock divider)*(CNR+1)]; where xy, could be 01 or 23, depends on selected PWM channel. - * | | |For Edge-aligned type: - * | | | Duty ratio = (CMR+1)/(CNR+1). - * | | | CMR >= CNR: PWM output is always high. - * | | | CMR < CNR: PWM low width = (CNR-CMR) unit; PWM high width = (CMR+1) unit. - * | | | CMR = 0: PWM low width = (CNR) unit; PWM high width = 1 unit. - * | | |For Center-aligned type: - * | | | Duty ratio = [(2 x CMR) + 1]/[2 x (CNR+1)]. - * | | | CMR > CNR: PWM output is always high. - * | | | CMR <= CNR: PWM low width = 2 x (CNR-CMR) + 1 unit; PWM high width = (2 x CMR) + 1 unit. - * | | | CMR = 0: PWM low width = 2 x CNR + 1 unit; PWM high width = 1 unit. - * | | |(Unit = one PWM clock cycle). - * | | |Note: Any write to CNR will take effect in next PWM cycle. - * | | |Note: When PWM operating at Center-aligned type, CNR value should be set between 0x0000 to 0xFFFE. - * | | |If CNR equal to 0xFFFF, the PWM will work unpredictable. - * | | |Note: When CNR value is set to 0, PWM output is always high. - * @var PWM_T::CMR1 - * Offset: 0x1C PWM Comparator Register 1 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |CMRx |PWM Comparator Register - * | | |CMR determines the PWM duty. - * | | |PWM frequency = PWMxy_CLK/[(prescale+1)*(clock divider)*(CNR+1)]; where xy, could be 01 or 23, depends on selected PWM channel. - * | | |For Edge-aligned type: - * | | | Duty ratio = (CMR+1)/(CNR+1). - * | | | CMR >= CNR: PWM output is always high. - * | | | CMR < CNR: PWM low width = (CNR-CMR) unit; PWM high width = (CMR+1) unit. - * | | | CMR = 0: PWM low width = (CNR) unit; PWM high width = 1 unit. - * | | |For Center-aligned type: - * | | | Duty ratio = [(2 x CMR) + 1]/[2 x (CNR+1)]. - * | | | CMR > CNR: PWM output is always high. - * | | | CMR <= CNR: PWM low width = 2 x (CNR-CMR) + 1 unit; PWM high width = (2 x CMR) + 1 unit. - * | | | CMR = 0: PWM low width = 2 x CNR + 1 unit; PWM high width = 1 unit. - * | | |(Unit = one PWM clock cycle). - * | | |Note: Any write to CMR will take effect in next PWM cycle. - * @var PWM_T::PDR1 - * Offset: 0x20 PWM Data Register 1 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |PDRx |PWM Data Register - * | | |User can monitor PDR to know the current value in 16-bit counter. - * @var PWM_T::CNR2 - * Offset: 0x24 PWM Counter Register 2 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |CNRx |PWM Timer Loaded Value - * | | |CNR determines the PWM period. - * | | |PWM frequency = PWMxy_CLK/[(prescale+1)*(clock divider)*(CNR+1)]; where xy, could be 01 or 23, depends on selected PWM channel. - * | | |For Edge-aligned type: - * | | | Duty ratio = (CMR+1)/(CNR+1). - * | | | CMR >= CNR: PWM output is always high. - * | | | CMR < CNR: PWM low width = (CNR-CMR) unit; PWM high width = (CMR+1) unit. - * | | | CMR = 0: PWM low width = (CNR) unit; PWM high width = 1 unit. - * | | |For Center-aligned type: - * | | | Duty ratio = [(2 x CMR) + 1]/[2 x (CNR+1)]. - * | | | CMR > CNR: PWM output is always high. - * | | | CMR <= CNR: PWM low width = 2 x (CNR-CMR) + 1 unit; PWM high width = (2 x CMR) + 1 unit. - * | | | CMR = 0: PWM low width = 2 x CNR + 1 unit; PWM high width = 1 unit. - * | | |(Unit = one PWM clock cycle). - * | | |Note: Any write to CNR will take effect in next PWM cycle. - * | | |Note: When PWM operating at Center-aligned type, CNR value should be set between 0x0000 to 0xFFFE. - * | | |If CNR equal to 0xFFFF, the PWM will work unpredictable. - * | | |Note: When CNR value is set to 0, PWM output is always high. - * @var PWM_T::CMR2 - * Offset: 0x28 PWM Comparator Register 2 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |CMRx |PWM Comparator Register - * | | |CMR determines the PWM duty. - * | | |PWM frequency = PWMxy_CLK/[(prescale+1)*(clock divider)*(CNR+1)]; where xy, could be 01 or 23, depends on selected PWM channel. - * | | |For Edge-aligned type: - * | | | Duty ratio = (CMR+1)/(CNR+1). - * | | | CMR >= CNR: PWM output is always high. - * | | | CMR < CNR: PWM low width = (CNR-CMR) unit; PWM high width = (CMR+1) unit. - * | | | CMR = 0: PWM low width = (CNR) unit; PWM high width = 1 unit. - * | | |For Center-aligned type: - * | | | Duty ratio = [(2 x CMR) + 1]/[2 x (CNR+1)]. - * | | | CMR > CNR: PWM output is always high. - * | | | CMR <= CNR: PWM low width = 2 x (CNR-CMR) + 1 unit; PWM high width = (2 x CMR) + 1 unit. - * | | | CMR = 0: PWM low width = 2 x CNR + 1 unit; PWM high width = 1 unit. - * | | |(Unit = one PWM clock cycle). - * | | |Note: Any write to CMR will take effect in next PWM cycle. - * @var PWM_T::PDR2 - * Offset: 0x2C PWM Data Register 2 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |PDRx |PWM Data Register - * | | |User can monitor PDR to know the current value in 16-bit counter. - * @var PWM_T::CNR3 - * Offset: 0x30 PWM Counter Register 3 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |CNRx |PWM Timer Loaded Value - * | | |CNR determines the PWM period. - * | | |PWM frequency = PWMxy_CLK/[(prescale+1)*(clock divider)*(CNR+1)]; where xy, could be 01 or 23, depends on selected PWM channel. - * | | |For Edge-aligned type: - * | | | Duty ratio = (CMR+1)/(CNR+1). - * | | | CMR >= CNR: PWM output is always high. - * | | | CMR < CNR: PWM low width = (CNR-CMR) unit; PWM high width = (CMR+1) unit. - * | | | CMR = 0: PWM low width = (CNR) unit; PWM high width = 1 unit. - * | | |For Center-aligned type: - * | | | Duty ratio = [(2 x CMR) + 1]/[2 x (CNR+1)]. - * | | | CMR > CNR: PWM output is always high. - * | | | CMR <= CNR: PWM low width = 2 x (CNR-CMR) + 1 unit; PWM high width = (2 x CMR) + 1 unit. - * | | | CMR = 0: PWM low width = 2 x CNR + 1 unit; PWM high width = 1 unit. - * | | |(Unit = one PWM clock cycle). - * | | |Note: Any write to CNR will take effect in next PWM cycle. - * | | |Note: When PWM operating at Center-aligned type, CNR value should be set between 0x0000 to 0xFFFE. - * | | |If CNR equal to 0xFFFF, the PWM will work unpredictable. - * | | |Note: When CNR value is set to 0, PWM output is always high. - * @var PWM_T::CMR3 - * Offset: 0x34 PWM Comparator Register 3 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |CMRx |PWM Comparator Register - * | | |CMR determines the PWM duty. - * | | |PWM frequency = PWMxy_CLK/[(prescale+1)*(clock divider)*(CNR+1)]; where xy, could be 01 or 23, depends on selected PWM channel. - * | | |For Edge-aligned type: - * | | | Duty ratio = (CMR+1)/(CNR+1). - * | | | CMR >= CNR: PWM output is always high. - * | | | CMR < CNR: PWM low width = (CNR-CMR) unit; PWM high width = (CMR+1) unit. - * | | | CMR = 0: PWM low width = (CNR) unit; PWM high width = 1 unit. - * | | |For Center-aligned type: - * | | | Duty ratio = [(2 x CMR) + 1]/[2 x (CNR+1)]. - * | | | CMR > CNR: PWM output is always high. - * | | | CMR <= CNR: PWM low width = 2 x (CNR-CMR) + 1 unit; PWM high width = (2 x CMR) + 1 unit. - * | | | CMR = 0: PWM low width = 2 x CNR + 1 unit; PWM high width = 1 unit. - * | | |(Unit = one PWM clock cycle). - * | | |Note: Any write to CMR will take effect in next PWM cycle. - * @var PWM_T::PDR3 - * Offset: 0x38 PWM Data Register 3 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |PDRx |PWM Data Register - * | | |User can monitor PDR to know the current value in 16-bit counter. - * @var PWM_T::PIER - * Offset: 0x40 PWM Interrupt Enable Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |PWMIE0 |PWM Channel 0 Period Interrupt Enable Bit - * | | |0 = PWM channel 0 interrupt Disabled. - * | | |1 = PWM channel 0 interrupt Enabled. - * |[1] |PWMIE1 |PWM Channel 1 Period Interrupt Enable Bit - * | | |0 = PWM channel 1 interrupt Disabled. - * | | |1 = PWM channel 1 interrupt Enabled. - * |[2] |PWMIE2 |PWM Channel 2 Period Interrupt Enable Bit - * | | |0 = PWM channel 2 interrupt Disabled. - * | | |1 = PWM channel 2 interrupt Enabled. - * |[3] |PWMIE3 |PWM Channel 3 Period Interrupt Enable Bit - * | | |0 = PWM channel 3 interrupt Disabled. - * | | |1 = PWM channel 3 interrupt Enabled. - * |[8] |PWMDIE0 |PWM Channel 0 Duty Interrupt Enable Bit - * | | |0 = PWM channel 0 duty interrupt Disabled. - * | | |1 = PWM channel 0 duty interrupt Enabled. - * |[9] |PWMDIE1 |PWM Channel 1 Duty Interrupt Enable Bit - * | | |0 = PWM channel 1 duty interrupt Disabled. - * | | |1 = PWM channel 1 duty interrupt Enabled. - * |[10] |PWMDIE2 |PWM Channel 2 Duty Interrupt Enable Bit - * | | |0 = PWM channel 2 duty interrupt Disabled. - * | | |1 = PWM channel 2 duty interrupt Enabled. - * |[11] |PWMDIE3 |PWM Channel 3 Duty Interrupt Enable Bit - * | | |0 = PWM channel 3 duty interrupt Disabled. - * | | |1 = PWM channel 3 duty interrupt Enabled. - * |[16] |INT01TYPE |PWM01 Interrupt Period Type Selection Bit (PWM0 And PWM1 Pair For PWM Group A) - * | | |0 = PWMIFn will be set if PWM counter underflow. - * | | |1 = PWMIFn will be set if PWM counter matches CNRn register. - * | | |Note: This bit is effective when PWM in Center-aligned type only. - * |[17] |INT23TYPE |PWM23 Interrupt Period Type Selection Bit (PWM2 And PWM3 Pair For PWM Group A) - * | | |0 = PWMIFn will be set if PWM counter underflow. - * | | |1 = PWMIFn will be set if PWM counter matches CNRn register. - * | | |Note: This bit is effective when PWM in Center-aligned type only. - * @var PWM_T::PIIR - * Offset: 0x44 PWM Interrupt Indication Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |PWMIF0 |PWM Channel 0 Period Interrupt Status - * | | |This bit is set by hardware when PWM0 counter reaches the requirement of interrupt (depend on INT01TYPE bit of PIER register) - * | | |if PWM0 interrupt enable bit (PWMIE0) is 1, This bit can be cleared to 0 by software writing '1'. - * |[1] |PWMIF1 |PWM Channel 1 Period Interrupt Status - * | | |This bit is set by hardware when PWM1 counter reaches the requirement of interrupt (depend on INT01TYPE bit of PIER register) - * | | |if PWM1 interrupt enable bit (PWMIE1) is 1, This bit can be cleared to 0 by software writing '1'. - * |[2] |PWMIF2 |PWM Channel 2 Period Interrupt Status - * | | |This bit is set by hardware when PWM2 counter reaches the requirement of interrupt (depend on INT23TYPE bit of PIER register) - * | | |if PWM2 interrupt enable bit (PWMIE2) is 1, This bit can be cleared to 0 by software writing '1'. - * |[3] |PWMIF3 |PWM Channel 3 Period Interrupt Status - * | | |This bit is set by hardware when PWM3 counter reaches the requirement of interrupt (depend on INT23TYPE bit of PIER register) - * | | |if PWM3 interrupt enable bit (PWMIE3) is 1, This bit can be cleared to 0 by software writing '1'. - * |[8] |PWMDIF0 |PWM Channel 0 Duty Interrupt Flag - * | | |Flag is set by hardware when channel 0 PWM counter down count and reaches CMR0, software can clear this bit by writing a one to it. - * | | |Note: If CMR equal to CNR, this flag is not working. - * |[9] |PWMDIF1 |PWM Channel 1 Duty Interrupt Flag - * | | |Flag is set by hardware when channel 1 PWM counter down count and reaches CMR1, software can clear this bit by writing a one to it. - * | | |Note: If CMR equal to CNR, this flag is not working. - * |[10] |PWMDIF2 |PWM Channel 2 Duty Interrupt Flag - * | | |Flag is set by hardware when channel 2 PWM counter down count and reaches CMR2, software can clear this bit by writing a one to it. - * | | |Note: If CMR equal to CNR, this flag is not working. - * |[11] |PWMDIF3 |PWM Channel 3 Duty Interrupt Flag - * | | |Flag is set by hardware when channel 3 PWM counter down count and reaches CMR3, software can clear this bit by writing a one to it. - * | | |Note: If CMR equal to CNR, this flag is not working. - * @var PWM_T::CCR0 - * Offset: 0x50 PWM Capture Control Register 0 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |INV0 |Channel 0 Inverter Enable Bit - * | | |0 = Inverter Disabled. - * | | |1 = Inverter Enabled. Reverse the input signal from GPIO before fed to Capture timer - * |[1] |CRL_IE0 |Channel 0 Rising Latch Interrupt Enable Bit - * | | |When Enabled, if Capture detects PWM group channel 0 has rising transition, Capture will issue an Interrupt. - * | | |0 = Rising latch interrupt Disabled. - * | | |1 = Rising latch interrupt Enabled. - * |[2] |CFL_IE0 |Channel 0 Falling Latch Interrupt Enable Bit - * | | |When Enabled, if Capture detects PWM group channel 0 has falling transition, Capture will issue an Interrupt. - * | | |0 = Falling latch interrupt Disabled. - * | | |1 = Falling latch interrupt Enabled. - * |[3] |CAPCH0EN |Channel 0 Capture Function Enable Bit - * | | |When Enabled, Capture latched the PWM-counter value and saved to CRLR (Rising latch) and CFLR (Falling latch). - * | | |When Disabled, Capture does not update CRLR and CFLR, and disable PWM group channel 0 Interrupt. - * | | |0 = Capture function on PWM group channel 0 Disabled. - * | | |1 = Capture function on PWM group channel 0 Enabled. - * |[4] |CAPIF0 |Channel 0 Capture Interrupt Indication Flag - * | | |If PWM group channel 0 rising latch interrupt is enabled (CRL_IE0 = 1), a rising transition - * | | |occurs at PWM group channel 0 will result in CAPIF0 to high; Similarly, a falling transition - * | | |will cause CAPIF0 to be set high if PWM group channel 0 falling latch interrupt is enabled (CFL_IE0 = 1). - * | | |This bit can be cleared to 0 by software writing '1'. - * |[6] |CRLRI0 |CRLR0 Latched Indicator Bit - * | | |When PWM group input channel 0 has a rising transition, CRLR0 was latched with the value of PWM down-counter and this bit is set by hardware. - * | | |This bit can be cleared to 0 by software writing '1'. - * |[7] |CFLRI0 |CFLR0 Latched Indicator Bit - * | | |When PWM group input channel 0 has a falling transition, CFLR0 was latched with the value of PWM down-counter and this bit is set by hardware. - * | | |This bit can be cleared to 0 by software writing '1'. - * |[16] |INV1 |Channel 1 Inverter Enable Bit - * | | |0 = Inverter Disabled. - * | | |1 = Inverter Enabled. Reverse the input signal from GPIO before fed to Capture timer - * |[17] |CRL_IE1 |Channel 1 Rising Latch Interrupt Enable Bit - * | | |When Enabled, if Capture detects PWM group channel 1 has rising transition, Capture will issue an Interrupt. - * | | |0 = Rising latch interrupt Disabled. - * | | |1 = Rising latch interrupt Enabled. - * |[18] |CFL_IE1 |Channel 1 Falling Latch Interrupt Enable Bit - * | | |When Enabled, if Capture detects PWM group channel 1 has falling transition, Capture will issue an Interrupt. - * | | |0 = Falling latch interrupt Disabled. - * | | |1 = Falling latch interrupt Enabled. - * |[19] |CAPCH1EN |Channel 1 Capture Function Enable Bit - * | | |When Enabled, Capture latched the PWM-counter and saved to CRLR (Rising latch) and CFLR (Falling latch). - * | | |When Disabled, Capture does not update CRLR and CFLR, and disable PWM group channel 1 Interrupt. - * | | |0 = Capture function on PWM group channel 1 Disabled. - * | | |1 = Capture function on PWM group channel 1 Enabled. - * |[20] |CAPIF1 |Channel 1 Capture Interrupt Indication Flag - * | | |If PWM group channel 1 rising latch interrupt is enabled (CRL_IE1 = 1), a rising transition - * | | |occurs at PWM group channel 1 will result in CAPIF1 to high; Similarly, a falling transition - * | | |will cause CAPIF1 to be set high if PWM group channel 1 falling latch interrupt is enabled (CFL_IE1 = 1). - * | | |This bit can be cleared to 0 by software writing '1'. - * |[22] |CRLRI1 |CRLR1 Latched Indicator Bit - * | | |When PWM group input channel 1 has a rising transition, CRLR1 was latched with the value of PWM down-counter and this bit is set by hardware. - * | | |This bit can be cleared to 0 by software writing '1'. - * |[23] |CFLRI1 |CFLR1 Latched Indicator Bit - * | | |When PWM group input channel 1 has a falling transition, CFLR1 was latched with the value of PWM down-counter and this bit is set by hardware. - * | | |This bit can be cleared to 0 by software writing '1'. - * @var PWM_T::CCR2 - * Offset: 0x54 PWM Capture Control Register 2 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |INV2 |Channel 2 Inverter Enable Bit - * | | |0 = Inverter Disabled. - * | | |1 = Inverter Enabled. Reverse the input signal from GPIO before fed to Capture timer - * |[1] |CRL_IE2 |Channel 2 Rising Latch Interrupt Enable Bit - * | | |When Enabled, if Capture detects PWM group channel 2 has rising transition, Capture will issue an Interrupt. - * | | |0 = Rising latch interrupt Disabled. - * | | |1 = Rising latch interrupt Enabled. - * |[2] |CFL_IE2 |Channel 2 Falling Latch Interrupt Enable Bit - * | | |When Enabled, if Capture detects PWM group channel 2 has falling transition, Capture will issue an Interrupt. - * | | |0 = Falling latch interrupt Disabled. - * | | |1 = Falling latch interrupt Enabled. - * |[3] |CAPCH2EN |Channel 2 Capture Function Enable Bit - * | | |When Enabled, Capture latched the PWM-counter value and saved to CRLR (Rising latch) and CFLR (Falling latch). - * | | |When Disabled, Capture does not update CRLR and CFLR, and disable PWM group channel 2 Interrupt. - * | | |0 = Capture function on PWM group channel 2 Disabled. - * | | |1 = Capture function on PWM group channel 2 Enabled. - * |[4] |CAPIF2 |Channel 2 Capture Interrupt Indication Flag - * | | |If PWM group channel 2 rising latch interrupt is enabled (CRL_IE2=1), a rising transition - * | | |occurs at PWM group channel 2 will result in CAPIF2 to high; Similarly, a falling transition - * | | |will cause CAPIF2 to be set high if PWM group channel 2 falling latch interrupt is enabled (CFL_IE2=1). - * | | |This bit can be cleared to 0 by software writing '1'. - * |[6] |CRLRI2 |CRLR2 Latched Indicator Bit - * | | |When PWM group input channel 2 has a rising transition, CRLR2 was latched with the value of PWM down-counter and this bit is set by hardware. - * | | |This bit can be cleared to 0 by software writing '1'. - * |[7] |CFLRI2 |CFLR2 Latched Indicator Bit - * | | |When PWM group input channel 2 has a falling transition, CFLR2 was latched with the value of PWM down-counter and this bit is set by hardware. - * | | |This bit can be cleared to 0 by software writing '1'. - * |[16] |INV3 |Channel 3 Inverter Enable Bit - * | | |0 = Inverter Disabled. - * | | |1 = Inverter Enabled. Reverse the input signal from GPIO before fed to Capture timer - * |[17] |CRL_IE3 |Channel 3 Rising Latch Interrupt Enable Bit - * | | |When Enabled, if Capture detects PWM group channel 3 has rising transition, Capture will issue an Interrupt. - * | | |0 = Rising latch interrupt Disabled. - * | | |1 = Rising latch interrupt Enabled. - * |[18] |CFL_IE3 |Channel 3 Falling Latch Interrupt Enable Bit - * | | |When Enabled, if Capture detects PWM group channel 3 has falling transition, Capture will issue an Interrupt. - * | | |0 = Falling latch interrupt Disabled. - * | | |1 = Falling latch interrupt Enabled. - * |[19] |CAPCH3EN |Channel 3 Capture Function Enable Bit - * | | |When Enabled, Capture latched the PWM-counter and saved to CRLR (Rising latch) and CFLR (Falling latch). - * | | |When Disabled, Capture does not update CRLR and CFLR, and disable PWM group channel 3 Interrupt. - * | | |0 = Capture function on PWM group channel 3 Disabled. - * | | |1 = Capture function on PWM group channel 3 Enabled. - * |[20] |CAPIF3 |Channel 3 Capture Interrupt Indication Flag - * | | |If PWM group channel 3 rising latch interrupt is enabled (CRL_IE3=1), a rising transition - * | | |occurs at PWM group channel 3 will result in CAPIF3 to high; Similarly, a falling transition - * | | |will cause CAPIF3 to be set high if PWM group channel 3 falling latch interrupt is enabled (CFL_IE3=1). - * | | |This bit can be cleared to 0 by software writing '1'. - * |[22] |CRLRI3 |CRLR3 Latched Indicator Bit - * | | |When PWM group input channel 3 has a rising transition, CRLR3 was latched with the value of PWM down-counter and this bit is set by hardware. - * | | |This bit can be cleared to 0 by software writing '1'. - * |[23] |CFLRI3 |CFLR3 Latched Indicator Bit - * | | |When PWM group input channel 3 has a falling transition, CFLR3 was latched with the value of PWM down-counter and this bit is set by hardware. - * | | |This bit can be cleared to 0 by software writing '1'. - * @var PWM_T::CRLR0 - * Offset: 0x58 PWM Capture Rising Latch Register (Channel 0) - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |CRLRx |Capture Rising Latch Register - * | | |Latch the PWM counter when Channel 0/1/2/3 has rising transition. - * @var PWM_T::CFLR0 - * Offset: 0x5C PWM Capture Falling Latch Register (Channel 0) - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |CFLRx |Capture Falling Latch Register - * | | |Latch the PWM counter when Channel 0/1/2/3 has falling transition. - * @var PWM_T::CRLR1 - * Offset: 0x60 PWM Capture Rising Latch Register (Channel 1) - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |CRLRx |Capture Rising Latch Register - * | | |Latch the PWM counter when Channel 0/1/2/3 has rising transition. - * @var PWM_T::CFLR1 - * Offset: 0x64 PWM Capture Falling Latch Register (Channel 1) - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |CFLRx |Capture Falling Latch Register - * | | |Latch the PWM counter when Channel 0/1/2/3 has falling transition. - * @var PWM_T::CRLR2 - * Offset: 0x68 PWM Capture Rising Latch Register (Channel 2) - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |CRLRx |Capture Rising Latch Register - * | | |Latch the PWM counter when Channel 0/1/2/3 has rising transition. - * @var PWM_T::CFLR2 - * Offset: 0x6C PWM Capture Falling Latch Register (Channel 2) - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |CFLRx |Capture Falling Latch Register - * | | |Latch the PWM counter when Channel 0/1/2/3 has falling transition. - * @var PWM_T::CRLR3 - * Offset: 0x70 PWM Capture Rising Latch Register (Channel 3) - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |CRLRx |Capture Rising Latch Register - * | | |Latch the PWM counter when Channel 0/1/2/3 has rising transition. - * @var PWM_T::CFLR3 - * Offset: 0x74 PWM Capture Falling Latch Register (Channel 3) - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |CFLRx |Capture Falling Latch Register - * | | |Latch the PWM counter when Channel 0/1/2/3 has falling transition. - * @var PWM_T::CAPENR - * Offset: 0x78 PWM Capture Input 0~3 Enable Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[3:0] |CAPENR |Capture Input Enable Register - * | | |There are four capture inputs from pad. Bit0~Bit3 are used to control each input enable or disable. - * | | |If enabled, PWMn multi-function pin input will affect its input capture function; - * | | |If Disabled, PWMn multi-function pin input does not affect input capture function. - * | | |xxx1 = Capture channel 0 is from pin PA.12. - * | | |xx1x = Capture channel 1 is from pin PA.13. - * | | |x1xx = Capture channel 2 is from pin PA.14. - * | | |1xxx = Capture channel 3 is from pin PA.15. - * @var PWM_T::POE - * Offset: 0x7C PWM Output Enable for Channel 0~3 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |PWM0 |Channel 0 Output Enable Register - * | | |0 = PWM channel 0 output to pin Disabled. - * | | |1 = PWM channel 0 output to pin Enabled. - * | | |Note: The corresponding GPIO pin must also be switched to PWM function - * |[1] |PWM1 |Channel 1 Output Enable Register - * | | |0 = PWM channel 1 output to pin Disabled. - * | | |1 = PWM channel 1 output to pin Enabled. - * | | |Note: The corresponding GPIO pin must also be switched to PWM function - * |[2] |PWM2 |Channel 2 Output Enable Register - * | | |0 = PWM channel 2 output to pin Disabled. - * | | |1 = PWM channel 2 output to pin Enabled. - * | | |Note: The corresponding GPIO pin must also be switched to PWM function - * |[3] |PWM3 |Channel 3 Output Enable Register - * | | |0 = Disable PWM channel 3 output to pin. - * | | |1 = Enable PWM channel 3 output to pin. - * | | |Note: The corresponding GPIO pin must also be switched to PWM function - * @var PWM_T::TCON - * Offset: 0x80 PWM Trigger Control for Channel 0~3 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |PWM0TEN |Channel 0 Center-Aligned Trigger Enable Register - * | | |PWM can trigger ADC to start conversion when PWM counter up count to CNR if this bit is set to 1. - * | | |0 = PWM channel 0 trigger ADC function Disabled. - * | | |1 = PWM channel 0 trigger ADC function Enabled. - * | | |Note: This function is only supported when PWM operating at Center-aligned type. - * |[1] |PWM1TEN |Channel 1 Center-Aligned Trigger Enable Register - * | | |PWM can trigger ADC to start conversion when PWM counter up count to CNR if this bit is set to 1. - * | | |0 = PWM channel 1 trigger ADC function Disabled. - * | | |1 = PWM channel 1 trigger ADC function Enabled. - * | | |Note: This function is only supported when PWM operating at Center-aligned type. - * |[2] |PWM2TEN |Channel 2 Center-Aligned Trigger Enable Register - * | | |PWM can trigger ADC to start conversion when PWM counter up count to CNR if this bit is set to 1. - * | | |0 = PWM channel 2 trigger ADC function Disabled. - * | | |1 = PWM channel 2 trigger ADC function Enabled. - * | | |Note: This function is only supported when PWM operating at Center-aligned type. - * |[3] |PWM3TEN |Channel 3 Center-Aligned Trigger Enable Register - * | | |PWM can trigger ADC to start conversion when PWM counter up count to CNR if this bit is set to 1. - * | | |0 = PWM channel 3 trigger ADC function Disabled. - * | | |1 = PWM channel 3 trigger ADC function Enabled. - * | | |Note: This function is only supported when PWM operating at Center-aligned type. - * @var PWM_T::TSTATUS - * Offset: 0x84 PWM Trigger Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |PWM0TF |Channel 0 Center-Aligned Trigger Flag - * | | |For Center-aligned Operating mode, this bit is set to 1 by hardware when PWM counter up counts to CNR if PWM0TEN bit is set to 1. - * | | |After this bit is set to 1, ADC will start conversion if ADC triggered source is selected by PWM. - * | | |This bit can be cleared to 0 by software writing '1'. - * |[1] |PWM1TF |Channel 1 Center-Aligned Trigger Flag - * | | |For Center-aligned Operating mode, this bit is set to 1 by hardware when PWM counter up count to CNR if PWM1TEN bit is set to 1. - * | | |After this bit is set to 1, ADC will start conversion if ADC triggered source is selected by PWM. - * | | |This bit can be cleared to 0 by software writing '1'. - * |[2] |PWM2TF |Channel 2 Center-Aligned Trigger Flag - * | | |For Center-aligned Operating mode, this bit is set to 1 by hardware when PWM counter up count to CNR if PWM2TEN bit is set to 1. - * | | |After this bit is set to 1, ADC will start conversion if ADC triggered source is selected by PWM. - * | | |This bit can be cleared to 0 by software writing '1'. - * |[3] |PWM3TF |Channel 3 Center-Aligned Trigger Flag - * | | |For Center-aligned Operating mode, this bit is set to 1 by hardware when PWM counter up count to CNR if PWM3TEN bit is set to 1. - * | | |After this bit is set to 1, ADC will start conversion if ADC triggered source is selected by PWM. - * | | |This bit can be cleared to 0 by software writing '1'. - * @var PWM_T::SYNCBUSY0 - * Offset: 0x88 PWM0 Synchronous Busy Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |S_BUSY |PWM Synchronous Busy - * | | |When software writes CNR0/CMR0/PPR or switches PWM0 operation mode (PCR[3]), - * | | |PWM will have a busy time to update these values completely because - * | | |PWM clock may be different from system clock domain. - * | | |Software needs to check this busy status before writing CNR0/CMR0/PPR or - * | | |switching PWM0 operation mode (PCR[3]) to make sure previous setting has been updated completely. - * | | |This bit will be set when software writes CNR0/CMR0/PPR or switches PWM0 operation mode (PCR[3]) - * | | |and will be cleared by hardware automatically when PWM update these value completely. - * @var PWM_T::SYNCBUSY1 - * Offset: 0x8C PWM1 Synchronous Busy Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |S_BUSY |PWM Synchronous Busy - * | | |When Software writes CNR1/CMR1/PPR or switches PWM1 operation mode (PCR[11]), - * | | |PWM will have a busy time to update these values completely because - * | | |PWM clock may be different from system clock domain. - * | | |Software needs to check this busy status before writing CNR1/CMR1/PPR or - * | | |switching PWM1 operation mode (PCR[11]) to make sure previous setting has been updated completely. - * | | |This bit will be set when software writes CNR1/CMR1/PPR or switches PWM1 operation mode (PCR[11]) - * | | |and will be cleared by hardware automatically when PWM update these value completely. - * @var PWM_T::SYNCBUSY2 - * Offset: 0x90 PWM2 Synchronous Busy Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |S_BUSY |PWM Synchronous Busy - * | | |When Software writes CNR2/CMR2/PPR or switch PWM2 operation mode (PCR[19]), - * | | |PWM will have a busy time to update these values completely because - * | | |PWM clock may be different from system clock domain. - * | | |Software needs to check this busy status before writing CNR2/CMR2/PPR or - * | | |switching PWM2 operation mode (PCR[19]) to make sure previous setting has been updated completely. - * | | |This bit will be set when software writes CNR2/CMR2/PPR or switch PWM2 operation mode (PCR[19]) - * | | |and will be cleared by hardware automatically when PWM update these value completely. - * @var PWM_T::SYNCBUSY3 - * Offset: 0x94 PWM3 Synchronous Busy Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |S_BUSY |PWM Synchronous Busy - * | | |When Software writes CNR3/CMR3/PPR or switch PWM3 operation mode (PCR[27]), - * | | |PWM will have a busy time to update these values completely because - * | | |PWM clock may be different from system clock domain. - * | | |Software need to check this busy status before writing CNR3/CMR3/PPR or - * | | |switching PWM3 operation mode (PCR[27]) to make sure previous setting has been updated completely. - * | | |This bit will be set when Software writes CNR3/CMR3/PPR or switch PWM3 operation mode (PCR[27]) - * | | |and will be cleared by hardware automatically when PWM update these value completely. - * @var PWM_T::CAPPDMACTL - * Offset: 0xC0 PWM Group A Trigger Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |CAP0PDMAEN |Channel 0 PDMA Enable Bit - * | | |0 = Channel 0 PDMA function Disabled. - * | | |1 = Channel 0 PDMA function Enabled for the channel 0 captured data and transfer to memory. - * |[2:1] |CAP0PDMAMOD |Select CRLR0 or CFLR0 to Transfer PDMA - * | | |00 = Reserved - * | | |01 = CRLR0 - * | | |10 = CFLR0 - * | | |11 = Both CRLR0 and CFLR0 - * |[3] |CAP0RFORDER |Capture channel 0 Rising/Falling Order - * | | |Set this bit to determine whether the CRLR0 or CFLR0 is the first captured data transferred to memory through PDMA when CAP0PDMAMOD =11 - * | | |0 = CFLR0 is the first captured data to memory. - * | | |1 = CRLR0 is the first captured data to memory. - * |[8] |CAP1PDMAEN |Channel 1 PDMA Enable Bit - * | | |0 = Channel 1 PDMA function Disabled. - * | | |1 = Channel 1 PDMA function Enabled for the channel 1 captured data and transfer to memory. - * |[10:9] |CAP1PDMAMOD |Select CRLR1 or CFLR1 to Transfer PDMA - * | | |00 = Reserved - * | | |01 = CRLR1 - * | | |10 = CFLR1 - * | | |11 = Both CRLR1 and CFLR1 - * |[11] |CAP1RFORDER |Capture channel 1 Rising/Falling Order - * | | |Set this bit to determine whether the CRLR1 or CFLR1 is the first captured data transferred to memory through PDMA when CAP1PDMAMOD =11 - * | | |0 = CFLR1 is the first captured data to memory. - * | | |1 = CRLR1 is the first captured data to memory. - * |[16] |CAP2PDMAEN |Channel 2 PDMA Enable Bit - * | | |0 = Channel 2 PDMA function Disabled. - * | | |1 = Channel 2 PDMA function Enabled for the channel 2 captured data and transfer to memory. - * |[18:17] |CAP2PDMAMOD |Select CRLR2 or CFLR2 to Transfer PDMA - * | | |00 = Reserved - * | | |01 = CRLR2 - * | | |10 = CFLR2 - * | | |11 = Both CRLR2 and CFLR2 - * |[19] |CAP2RFORDER |Capture channel 2 Rising/Falling Order - * | | |Set this bit to determine whether the CRLR2 or CFLR2 is the first captured data transferred to memory through PDMA when CAP2PDMAMOD =11 - * | | |0 = CFLR2 is the first captured data to memory. - * | | |1 = CRLR2 is the first captured data to memory. - * |[24] |CAP3PDMAEN |Channel 3 PDMA Enable Bit - * | | |0 = Channel 3 PDMA function Disabled. - * | | |1 = Channel 3 PDMA function Enabled for the channel 3 captured data and transfer to memory. - * |[26:25] |CAP3PDMAMOD |Select CRLR3 or CFLR3 to Transfer PDMA - * | | |00 = Reserved - * | | |01 = CRLR3 - * | | |10 = CFLR3 - * | | |11 = Both CRLR3 and CFLR3 - * |[27] |CAP3RFORDER |Capture channel 3 Rising/Falling Order - * | | |Set this bit to determine whether the CRLR1 or CFLR3 is the first captured data transferred to memory through PDMA when CAP3PDMAMOD =11 - * | | |0 = CFLR3 is the first captured data to memory. - * | | |1 = CRLR3 is the first captured data to memory. - * @var PWM_T::CAP0PDMA - * Offset: 0xC4 PWM Group A PDMA channel 0 DATA Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |CAP0RFPDMA|PDMA data register for channel 0 - * | | |it is the capturing value(CFLR0/CRLR0) for channel 0. - * @var PWM_T::CAP1PDMA - * Offset: 0xC8 PWM Group A PDMA channel 1 DATA Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |CAP1RFPDMA|PDMA data register for channel 1 - * | | |it is the capturing value(CFLR1/CRLR1) for channel 1. - * @var PWM_T::CAP2PDMA - * Offset: 0xCC PWM Group A PDMA channel 2 DATA Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |CAP2RFPDMA|PDMA data register for channel 2 - * | | |it is the capturing value(CFLR2/CRLR2) for channel 2. - * @var PWM_T::CAP3PDMA - * Offset: 0xD0 PWM Group A PDMA channel 3 DATA Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |CAP3RFPDMA|PDMA data register for channel 3 - * | | |it is the capturing value(CFLR3/CRLR3) for channel 3. - */ - - __IO uint32_t PPR; /* Offset: 0x00 PWM Prescaler Register */ - __IO uint32_t CSR; /* Offset: 0x04 PWM Clock Source Divider Select Register */ - __IO uint32_t PCR; /* Offset: 0x08 PWM Control Register */ - __IO uint32_t CNR0; /* Offset: 0x0C PWM Counter Register 0 */ - __IO uint32_t CMR0; /* Offset: 0x10 PWM Comparator Register 0 */ - __I uint32_t PDR0; /* Offset: 0x14 PWM Data Register 0 */ - __IO uint32_t CNR1; /* Offset: 0x18 PWM Counter Register 1 */ - __IO uint32_t CMR1; /* Offset: 0x1C PWM Comparator Register 1 */ - __I uint32_t PDR1; /* Offset: 0x20 PWM Data Register 1 */ - __IO uint32_t CNR2; /* Offset: 0x24 PWM Counter Register 2 */ - __IO uint32_t CMR2; /* Offset: 0x28 PWM Comparator Register 2 */ - __I uint32_t PDR2; /* Offset: 0x2C PWM Data Register 2 */ - __IO uint32_t CNR3; /* Offset: 0x30 PWM Counter Register 3 */ - __IO uint32_t CMR3; /* Offset: 0x34 PWM Comparator Register 3 */ - __I uint32_t PDR3; /* Offset: 0x38 PWM Data Register 3 */ - __I uint32_t RESERVED0[1]; - __IO uint32_t PIER; /* Offset: 0x40 PWM Interrupt Enable Register */ - __IO uint32_t PIIR; /* Offset: 0x44 PWM Interrupt Indication Register */ - __I uint32_t RESERVE1[2]; - __IO uint32_t CCR0; /* Offset: 0x50 PWM Capture Control Register 0 */ - __IO uint32_t CCR2; /* Offset: 0x54 PWM Capture Control Register 2 */ - __IO uint32_t CRLR0; /* Offset: 0x58 PWM Capture Rising Latch Register (Channel 0) */ - __IO uint32_t CFLR0; /* Offset: 0x5C PWM Capture Falling Latch Register (Channel 0) */ - __IO uint32_t CRLR1; /* Offset: 0x60 PWM Capture Rising Latch Register (Channel 1) */ - __IO uint32_t CFLR1; /* Offset: 0x64 PWM Capture Falling Latch Register (Channel 1) */ - __IO uint32_t CRLR2; /* Offset: 0x68 PWM Capture Rising Latch Register (Channel 2) */ - __IO uint32_t CFLR2; /* Offset: 0x6C PWM Capture Falling Latch Register (Channel 2) */ - __IO uint32_t CRLR3; /* Offset: 0x70 PWM Capture Rising Latch Register (Channel 3) */ - __IO uint32_t CFLR3; /* Offset: 0x74 PWM Capture Falling Latch Register (Channel 3) */ - __IO uint32_t CAPENR; /* Offset: 0x78 PWM Capture Input 0~3 Enable Register */ - __IO uint32_t POE; /* Offset: 0x7C PWM Output Enable for Channel 0~3 */ - __IO uint32_t TCON; /* Offset: 0x80 PWM Trigger Control for Channel 0~3 */ - __IO uint32_t TSTATUS; /* Offset: 0x84 PWM Trigger Status Register */ - __IO uint32_t SYNCBUSY0; /* Offset: 0x88 PWM0 Synchronous Busy Status Register */ - __IO uint32_t SYNCBUSY1; /* Offset: 0x8C PWM1 Synchronous Busy Status Register */ - __IO uint32_t SYNCBUSY2; /* Offset: 0x90 PWM2 Synchronous Busy Status Register */ - __IO uint32_t SYNCBUSY3; /* Offset: 0x94 PWM3 Synchronous Busy Status Register */ - __I uint32_t RESERVE2[10]; - __IO uint32_t CAPPDMACTL; /* Offset: 0xC0 PWM Group A Trigger Status Register */ - __IO uint32_t CAP0PDMA; /* Offset: 0xC4 PWM Group A PDMA channel 0 DATA Register */ - __IO uint32_t CAP1PDMA; /* Offset: 0xC8 PWM Group A PDMA channel 1 DATA Register */ - __IO uint32_t CAP2PDMA; /* Offset: 0xCC PWM Group A PDMA channel 2 DATA Register */ - __IO uint32_t CAP3PDMA; /* Offset: 0xD0 PWM Group A PDMA channel 3 DATA Register */ - -} PWM_T; - - - - -/** @addtogroup REG_PWM_BITMASK PWM Bit Mask - @{ - */ - -/* PWM PPR Bit Field Definitions */ -#define PWM_PPR_DZI23_Pos 24 /*!< PWM_T::PPR: DZI23 Position */ -#define PWM_PPR_DZI23_Msk (0xFFul << PWM_PPR_DZI23_Pos) /*!< PWM_T::PPR: DZI23 Mask */ - -#define PWM_PPR_DZI01_Pos 16 /*!< PWM_T::PPR: DZI01 Position */ -#define PWM_PPR_DZI01_Msk (0xFFul << PWM_PPR_DZI01_Pos) /*!< PWM_T::PPR: DZI01 Mask */ - -#define PWM_PPR_CP23_Pos 8 /*!< PWM_T::PPR: CP23 Position */ -#define PWM_PPR_CP23_Msk (0xFFul << PWM_PPR_CP23_Pos) /*!< PWM_T::PPR: CP23 Mask */ - -#define PWM_PPR_CP01_Pos 0 /*!< PWM_T::PPR: CP01 Position */ -#define PWM_PPR_CP01_Msk (0xFFul << PWM_PPR_CP01_Pos) /*!< PWM_T::PPR: CP01 Mask */ - -/* PWM CSR Bit Field Definitions */ -#define PWM_CSR_CSR3_Pos 12 /*!< PWM_T::CSR: CSR3 Position */ -#define PWM_CSR_CSR3_Msk (7ul << PWM_CSR_CSR3_Pos) /*!< PWM_T::CSR: CSR3 Mask */ - -#define PWM_CSR_CSR2_Pos 8 /*!< PWM_T::CSR: CSR2 Position */ -#define PWM_CSR_CSR2_Msk (7ul << PWM_CSR_CSR2_Pos) /*!< PWM_T::CSR: CSR2 Mask */ - -#define PWM_CSR_CSR1_Pos 4 /*!< PWM_T::CSR: CSR1 Position */ -#define PWM_CSR_CSR1_Msk (7ul << PWM_CSR_CSR1_Pos) /*!< PWM_T::CSR: CSR1 Mask */ - -#define PWM_CSR_CSR0_Pos 0 /*!< PWM_T::CSR: CSR0 Position */ -#define PWM_CSR_CSR0_Msk (7ul << PWM_CSR_CSR0_Pos) /*!< PWM_T::CSR: CSR0 Mask */ - -/* PWM PCR Bit Field Definitions */ -#define PWM_PCR_PWM23TYPE_Pos 31 /*!< PWM_T::PCR: PWM23TYPE Position */ -#define PWM_PCR_PWM23TYPE_Msk (1ul << PWM_PCR_PWM23TYPE_Pos) /*!< PWM_T::PCR: PWM23TYPE Mask */ - -#define PWM_PCR_PWM01TYPE_Pos 30 /*!< PWM_T::PCR: PWM01TYPE Position */ -#define PWM_PCR_PWM01TYPE_Msk (1ul << PWM_PCR_PWM01TYPE_Pos) /*!< PWM_T::PCR: PWM01TYPE Mask */ - -#define PWM_PCR_CH3MOD_Pos 27 /*!< PWM_T::PCR: CH3MOD Position */ -#define PWM_PCR_CH3MOD_Msk (1ul << PWM_PCR_CH3MOD_Pos) /*!< PWM_T::PCR: CH3MOD Mask */ - -#define PWM_PCR_CH3INV_Pos 26 /*!< PWM_T::PCR: CH3INV Position */ -#define PWM_PCR_CH3INV_Msk (1ul << PWM_PCR_CH3INV_Pos) /*!< PWM_T::PCR: CH3INV Mask */ - -#define PWM_PCR_CH3PINV_Pos 25 /*!< PWM_T::PCR: CH3PINV Position */ -#define PWM_PCR_CH3PINV_Msk (1ul << PWM_PCR_CH3PINV_Pos) /*!< PWM_T::PCR: CH3PINV Mask */ - -#define PWM_PCR_CH3EN_Pos 24 /*!< PWM_T::PCR: CH3EN Position */ -#define PWM_PCR_CH3EN_Msk (1ul << PWM_PCR_CH3EN_Pos) /*!< PWM_T::PCR: CH3EN Mask */ - -#define PWM_PCR_CH2MOD_Pos 19 /*!< PWM_T::PCR: CH2MOD Position */ -#define PWM_PCR_CH2MOD_Msk (1ul << PWM_PCR_CH2MOD_Pos) /*!< PWM_T::PCR: CH2MOD Mask */ - -#define PWM_PCR_CH2INV_Pos 18 /*!< PWM_T::PCR: CH2INV Position */ -#define PWM_PCR_CH2INV_Msk (1ul << PWM_PCR_CH2INV_Pos) /*!< PWM_T::PCR: CH2INV Mask */ - -#define PWM_PCR_CH2PINV_Pos 17 /*!< PWM_T::PCR: CH2PINV Position */ -#define PWM_PCR_CH2PINV_Msk (1ul << PWM_PCR_CH2PINV_Pos) /*!< PWM_T::PCR: CH2PINV Mask */ - -#define PWM_PCR_CH2EN_Pos 16 /*!< PWM_T::PCR: CH2EN Position */ -#define PWM_PCR_CH2EN_Msk (1ul << PWM_PCR_CH2EN_Pos) /*!< PWM_T::PCR: CH2EN Mask */ - -#define PWM_PCR_CH1MOD_Pos 11 /*!< PWM_T::PCR: CH1MOD Position */ -#define PWM_PCR_CH1MOD_Msk (1ul << PWM_PCR_CH1MOD_Pos) /*!< PWM_T::PCR: CH1MOD Mask */ - -#define PWM_PCR_CH1INV_Pos 10 /*!< PWM_T::PCR: CH1INV Position */ -#define PWM_PCR_CH1INV_Msk (1ul << PWM_PCR_CH1INV_Pos) /*!< PWM_T::PCR: CH1INV Mask */ - -#define PWM_PCR_CH1PINV_Pos 9 /*!< PWM_T::PCR: CH1PINV Position */ -#define PWM_PCR_CH1PINV_Msk (1ul << PWM_PCR_CH1PINV_Pos) /*!< PWM_T::PCR: CH1PINV Mask */ - -#define PWM_PCR_CH1EN_Pos 8 /*!< PWM_T::PCR: CH1EN Position */ -#define PWM_PCR_CH1EN_Msk (1ul << PWM_PCR_CH1EN_Pos) /*!< PWM_T::PCR: CH1EN Mask */ - -#define PWM_PCR_DZEN23_Pos 5 /*!< PWM_T::PCR: DZEN23 Position */ -#define PWM_PCR_DZEN23_Msk (1ul << PWM_PCR_DZEN23_Pos) /*!< PWM_T::PCR: DZEN23 Mask */ - -#define PWM_PCR_DZEN01_Pos 4 /*!< PWM_T::PCR: DZEN01 Position */ -#define PWM_PCR_DZEN01_Msk (1ul << PWM_PCR_DZEN01_Pos) /*!< PWM_T::PCR: DZEN01 Mask */ - -#define PWM_PCR_CH0MOD_Pos 3 /*!< PWM_T::PCR: CH0MOD Position */ -#define PWM_PCR_CH0MOD_Msk (1ul << PWM_PCR_CH0MOD_Pos) /*!< PWM_T::PCR: CH0MOD Mask */ - -#define PWM_PCR_CH0INV_Pos 2 /*!< PWM_T::PCR: CH0INV Position */ -#define PWM_PCR_CH0INV_Msk (1ul << PWM_PCR_CH0INV_Pos) /*!< PWM_T::PCR: CH0INV Mask */ - -#define PWM_PCR_CH0PINV_Pos 1 /*!< PWM_T::PCR: CH0PINV Position */ -#define PWM_PCR_CH0PINV_Msk (1ul << PWM_PCR_CH0PINV_Pos) /*!< PWM_T::PCR: CH0PINV Mask */ - -#define PWM_PCR_CH0EN_Pos 0 /*!< PWM_T::PCR: CH0EN Position */ -#define PWM_PCR_CH0EN_Msk (1ul << PWM_PCR_CH0EN_Pos) /*!< PWM_T::PCR: CH0EN Mask */ - -/* PWM CNR Bit Field Definitions */ -#define PWM_CNR_CNR_Pos 0 /*!< PWM_T::CNR0: CNR Position */ -#define PWM_CNR_CNR_Msk (0xFFFFul << PWM_CNR_CNR_Pos) /*!< PWM_T::CNR0: CNR Mask */ - -/* PWM CMR Bit Field Definitions */ -#define PWM_CMR_CMR_Pos 0 /*!< PWM_T::CMR0: CMR Position */ -#define PWM_CMR_CMR_Msk (0xFFFFul << PWM_CMR_CMR_Pos) /*!< PWM_T::CMR0: CMR Mask */ - -/* PWM PDR Bit Field Definitions */ -#define PWM_PDR_PDR_Pos 0 /*!< PWM_T::PDR0: PDR Position */ -#define PWM_PDR_PDR_Msk (0xFFFFul << PWM_PDR_PDR_Pos) /*!< PWM_T::PDR0: PDR Mask */ - -/* PWM PIER Bit Field Definitions */ - -#define PWM_PIER_INT23TYPE_Pos 17 /*!< PWM_T::PIER: INT23TYPE Position */ -#define PWM_PIER_INT23TYPE_Msk (1ul << PWM_PIER_INT23TYPE_Pos) /*!< PWM_T::PIER: INT23TYPE Mask */ - -#define PWM_PIER_INT01TYPE_Pos 16 /*!< PWM_T::PIER: INT01TYPE Position */ -#define PWM_PIER_INT01TYPE_Msk (1ul << PWM_PIER_INT01TYPE_Pos) /*!< PWM_T::PIER: INT01TYPE Mask */ - -#define PWM_PIER_PWMDIE3_Pos 11 /*!< PWM_T::PIER: PWMDIE3 Position */ -#define PWM_PIER_PWMDIE3_Msk (1ul << PWM_PIER_PWMDIE3_Pos) /*!< PWM_T::PIER: PWMDIE3 Mask */ - -#define PWM_PIER_PWMDIE2_Pos 10 /*!< PWM_T::PIER: PWMDIE2 Position */ -#define PWM_PIER_PWMDIE2_Msk (1ul << PWM_PIER_PWMDIE2_Pos) /*!< PWM_T::PIER: PWMDIE2 Mask */ - -#define PWM_PIER_PWMDIE1_Pos 9 /*!< PWM_T::PIER: PWMDIE1 Position */ -#define PWM_PIER_PWMDIE1_Msk (1ul << PWM_PIER_PWMDIE1_Pos) /*!< PWM_T::PIER: PWMDIE1 Mask */ - -#define PWM_PIER_PWMDIE0_Pos 8 /*!< PWM_T::PIER: PWMDIE0 Position */ -#define PWM_PIER_PWMDIE0_Msk (1ul << PWM_PIER_PWMDIE0_Pos) /*!< PWM_T::PIER: PWMDIE0 Mask */ - -#define PWM_PIER_PWMIE3_Pos 3 /*!< PWM_T::PIER: PWMIE3 Position */ -#define PWM_PIER_PWMIE3_Msk (1ul << PWM_PIER_PWMIE3_Pos) /*!< PWM_T::PIER: PWMIE3 Mask */ - -#define PWM_PIER_PWMIE2_Pos 2 /*!< PWM_T::PIER: PWMIE2 Position */ -#define PWM_PIER_PWMIE2_Msk (1ul << PWM_PIER_PWMIE2_Pos) /*!< PWM_T::PIER: PWMIE2 Mask */ - -#define PWM_PIER_PWMIE1_Pos 1 /*!< PWM_T::PIER: PWMIE1 Position */ -#define PWM_PIER_PWMIE1_Msk (1ul << PWM_PIER_PWMIE1_Pos) /*!< PWM_T::PIER: PWMIE1 Mask */ - -#define PWM_PIER_PWMIE0_Pos 0 /*!< PWM_T::PIER: PWMIE0 Position */ -#define PWM_PIER_PWMIE0_Msk (1ul << PWM_PIER_PWMIE0_Pos) /*!< PWM_T::PIER: PWMIE0 Mask */ - -/* PWM PIIR Bit Field Definitions */ -#define PWM_PIIR_PWMDIF3_Pos 11 /*!< PWM_T::PIIR: PWMDIF3 Position */ -#define PWM_PIIR_PWMDIF3_Msk (1ul << PWM_PIIR_PWMDIF3_Pos) /*!< PWM_T::PIIR: PWMDIF3 Mask */ - -#define PWM_PIIR_PWMDIF2_Pos 10 /*!< PWM_T::PIIR: PWMDIF2 Position */ -#define PWM_PIIR_PWMDIF2_Msk (1ul << PWM_PIIR_PWMDIF2_Pos) /*!< PWM_T::PIIR: PWMDIF2 Mask */ - -#define PWM_PIIR_PWMDIF1_Pos 9 /*!< PWM_T::PIIR: PWMDIF1 Position */ -#define PWM_PIIR_PWMDIF1_Msk (1ul << PWM_PIIR_PWMDIF1_Pos) /*!< PWM_T::PIIR: PWMDIF1 Mask */ - -#define PWM_PIIR_PWMDIF0_Pos 8 /*!< PWM_T::PIIR: PWMDIF0 Position */ -#define PWM_PIIR_PWMDIF0_Msk (1ul << PWM_PIIR_PWMDIF0_Pos) /*!< PWM_T::PIIR: PWMDIF0 Mask */ - -#define PWM_PIIR_PWMIF3_Pos 3 /*!< PWM_T::PIIR: PWMIF3 Position */ -#define PWM_PIIR_PWMIF3_Msk (1ul << PWM_PIIR_PWMIF3_Pos) /*!< PWM_T::PIIR: PWMIF3 Mask */ - -#define PWM_PIIR_PWMIF2_Pos 2 /*!< PWM_T::PIIR: PWMIF2 Position */ -#define PWM_PIIR_PWMIF2_Msk (1ul << PWM_PIIR_PWMIF2_Pos) /*!< PWM_T::PIIR: PWMIF2 Mask */ - -#define PWM_PIIR_PWMIF1_Pos 1 /*!< PWM_T::PIIR: PWMIF1 Position */ -#define PWM_PIIR_PWMIF1_Msk (1ul << PWM_PIIR_PWMIF1_Pos) /*!< PWM_T::PIIR: PWMIF1 Mask */ - -#define PWM_PIIR_PWMIF0_Pos 0 /*!< PWM_T::PIIR: PWMIF0 Position */ -#define PWM_PIIR_PWMIF0_Msk (1ul << PWM_PIIR_PWMIF0_Pos) /*!< PWM_T::PIIR: PWMIF0 Mask */ - -/* PWM CCR0 Bit Field Definitions */ -#define PWM_CCR0_CFLRI1_Pos 23 /*!< PWM_T::CCR0: CFLRI1 Position */ -#define PWM_CCR0_CFLRI1_Msk (1ul << PWM_CCR0_CFLRI1_Pos) /*!< PWM_T::CCR0: CFLRI1 Mask */ - -#define PWM_CCR0_CRLRI1_Pos 22 /*!< PWM_T::CCR0: CRLRI1 Position */ -#define PWM_CCR0_CRLRI1_Msk (1ul << PWM_CCR0_CRLRI1_Pos) /*!< PWM_T::CCR0: CRLRI1 Mask */ - -#define PWM_CCR0_CAPIF1_Pos 20 /*!< PWM_T::CCR0: CAPIF1 Position */ -#define PWM_CCR0_CAPIF1_Msk (1ul << PWM_CCR0_CAPIF1_Pos) /*!< PWM_T::CCR0: CAPIF1 Mask */ - -#define PWM_CCR0_CAPCH1EN_Pos 19 /*!< PWM_T::CCR0: CAPCH1EN Position */ -#define PWM_CCR0_CAPCH1EN_Msk (1ul << PWM_CCR0_CAPCH1EN_Pos) /*!< PWM_T::CCR0: CAPCH1EN Mask */ - -#define PWM_CCR0_CFL_IE1_Pos 18 /*!< PWM_T::CCR0: CFL_IE1 Position */ -#define PWM_CCR0_CFL_IE1_Msk (1ul << PWM_CCR0_CFL_IE1_Pos) /*!< PWM_T::CCR0: CFL_IE1 Mask */ - -#define PWM_CCR0_CRL_IE1_Pos 17 /*!< PWM_T::CCR0: CRL_IE1 Position */ -#define PWM_CCR0_CRL_IE1_Msk (1ul << PWM_CCR0_CRL_IE1_Pos) /*!< PWM_T::CCR0: CRL_IE1 Mask */ - -#define PWM_CCR0_INV1_Pos 16 /*!< PWM_T::CCR0: INV1 Position */ -#define PWM_CCR0_INV1_Msk (1ul << PWM_CCR0_INV1_Pos) /*!< PWM_T::CCR0: INV1 Mask */ - -#define PWM_CCR0_CFLRI0_Pos 7 /*!< PWM_T::CCR0: CFLRI0 Position */ -#define PWM_CCR0_CFLRI0_Msk (1ul << PWM_CCR0_CFLRI0_Pos) /*!< PWM_T::CCR0: CFLRI0 Mask */ - -#define PWM_CCR0_CRLRI0_Pos 6 /*!< PWM_T::CCR0: CRLRI0 Position */ -#define PWM_CCR0_CRLRI0_Msk (1ul << PWM_CCR0_CRLRI0_Pos) /*!< PWM_T::CCR0: CRLRI0 Mask */ - -#define PWM_CCR0_CAPIF0_Pos 4 /*!< PWM_T::CCR0: CAPIF0 Position */ -#define PWM_CCR0_CAPIF0_Msk (1ul << PWM_CCR0_CAPIF0_Pos) /*!< PWM_T::CCR0: CAPIF0 Mask */ - -#define PWM_CCR0_CAPCH0EN_Pos 3 /*!< PWM_T::CCR0: CAPCH0EN Position */ -#define PWM_CCR0_CAPCH0EN_Msk (1ul << PWM_CCR0_CAPCH0EN_Pos) /*!< PWM_T::CCR0: CAPCH0EN Mask */ - -#define PWM_CCR0_CFL_IE0_Pos 2 /*!< PWM_T::CCR0: CFL_IE0 Position */ -#define PWM_CCR0_CFL_IE0_Msk (1ul << PWM_CCR0_CFL_IE0_Pos) /*!< PWM_T::CCR0: CFL_IE0 Mask */ - -#define PWM_CCR0_CRL_IE0_Pos 1 /*!< PWM_T::CCR0: CRL_IE0 Position */ -#define PWM_CCR0_CRL_IE0_Msk (1ul << PWM_CCR0_CRL_IE0_Pos) /*!< PWM_T::CCR0: CRL_IE0 Mask */ - -#define PWM_CCR0_INV0_Pos 0 /*!< PWM_T::CCR0: INV0 Position */ -#define PWM_CCR0_INV0_Msk (1ul << PWM_CCR0_INV0_Pos) /*!< PWM_T::CCR0: INV0 Mask */ - -/* PWM CCR2 Bit Field Definitions */ -#define PWM_CCR2_CFLRI3_Pos 23 /*!< PWM_T::CCR2: CFLRI3 Position */ -#define PWM_CCR2_CFLRI3_Msk (1ul << PWM_CCR2_CFLRI3_Pos) /*!< PWM_T::CCR2: CFLRI3 Mask */ - -#define PWM_CCR2_CRLRI3_Pos 22 /*!< PWM_T::CCR2: CRLRI3 Position */ -#define PWM_CCR2_CRLRI3_Msk (1ul << PWM_CCR2_CRLRI3_Pos) /*!< PWM_T::CCR2: CRLRI3 Mask */ - -#define PWM_CCR2_CAPIF3_Pos 20 /*!< PWM_T::CCR2: CAPIF3 Position */ -#define PWM_CCR2_CAPIF3_Msk (1ul << PWM_CCR2_CAPIF3_Pos) /*!< PWM_T::CCR2: CAPIF3 Mask */ - -#define PWM_CCR2_CAPCH3EN_Pos 19 /*!< PWM_T::CCR2: CAPCH3EN Position */ -#define PWM_CCR2_CAPCH3EN_Msk (1ul << PWM_CCR2_CAPCH3EN_Pos) /*!< PWM_T::CCR2: CAPCH3EN Mask */ - -#define PWM_CCR2_CFL_IE3_Pos 18 /*!< PWM_T::CCR2: CFL_IE3 Position */ -#define PWM_CCR2_CFL_IE3_Msk (1ul << PWM_CCR2_CFL_IE3_Pos) /*!< PWM_T::CCR2: CFL_IE3 Mask */ - -#define PWM_CCR2_CRL_IE3_Pos 17 /*!< PWM_T::CCR2: CRL_IE3 Position */ -#define PWM_CCR2_CRL_IE3_Msk (1ul << PWM_CCR2_CRL_IE3_Pos) /*!< PWM_T::CCR2: CRL_IE3 Mask */ - -#define PWM_CCR2_INV3_Pos 16 /*!< PWM_T::CCR2: INV3 Position */ -#define PWM_CCR2_INV3_Msk (1ul << PWM_CCR2_INV3_Pos) /*!< PWM_T::CCR2: INV3 Mask */ - -#define PWM_CCR2_CFLRI2_Pos 7 /*!< PWM_T::CCR2: CFLRI2 Position */ -#define PWM_CCR2_CFLRI2_Msk (1ul << PWM_CCR2_CFLRI2_Pos) /*!< PWM_T::CCR2: CFLRI2 Mask */ - -#define PWM_CCR2_CRLRI2_Pos 6 /*!< PWM_T::CCR2: CRLRI2 Position */ -#define PWM_CCR2_CRLRI2_Msk (1ul << PWM_CCR2_CRLRI2_Pos) /*!< PWM_T::CCR2: CRLRI2 Mask */ - -#define PWM_CCR2_CAPIF2_Pos 4 /*!< PWM_T::CCR2: CAPIF2 Position */ -#define PWM_CCR2_CAPIF2_Msk (1ul << PWM_CCR2_CAPIF2_Pos) /*!< PWM_T::CCR2: CAPIF2 Mask */ - -#define PWM_CCR2_CAPCH2EN_Pos 3 /*!< PWM_T::CCR2: CAPCH2EN Position */ -#define PWM_CCR2_CAPCH2EN_Msk (1ul << PWM_CCR2_CAPCH2EN_Pos) /*!< PWM_T::CCR2: CAPCH2EN Mask */ - -#define PWM_CCR2_CFL_IE2_Pos 2 /*!< PWM_T::CCR2: CFL_IE2 Position */ -#define PWM_CCR2_CFL_IE2_Msk (1ul << PWM_CCR2_CFL_IE2_Pos) /*!< PWM_T::CCR2: CFL_IE2 Mask */ - -#define PWM_CCR2_CRL_IE2_Pos 1 /*!< PWM_T::CCR2: CRL_IE2 Position */ -#define PWM_CCR2_CRL_IE2_Msk (1ul << PWM_CCR2_CRL_IE2_Pos) /*!< PWM_T::CCR2: CRL_IE2 Mask */ - -#define PWM_CCR2_INV2_Pos 0 /*!< PWM_T::CCR2: INV2 Position */ -#define PWM_CCR2_INV2_Msk (1ul << PWM_CCR2_INV2_Pos) /*!< PWM_T::CCR2: INV2 Mask */ - -/* PWM CRLR Bit Field Definitions */ -#define PWM_CRLR_CRLR_Pos 0 /*!< PWM_T::CRLR0: CRLR Position */ -#define PWM_CRLR_CRLR_Msk (0xFFFFul << PWM_CRLR_CRLR_Pos) /*!< PWM_T::CRLR0: CRLR Mask */ - -/* PWM CFLR Bit Field Definitions */ -#define PWM_CFLR_CFLR_Pos 0 /*!< PWM_T::CFLR0: CFLR Position */ -#define PWM_CFLR_CFLR_Msk (0xFFFFul << PWM_CFLR_CFLR_Pos) /*!< PWM_T::CFLR0: CFLR Mask */ - -/* PWM CAPENR Bit Field Definitions */ -#define PWM_CAPENR_CAPENR_Pos 0 /*!< PWM_T::CAPENR: CAPENR Position */ -#define PWM_CAPENR_CAPENR_Msk (0xFul << PWM_CAPENR_CAPENR_Pos) /*!< PWM_T::CAPENR: CAPENR Mask */ - -/* PWM POE Bit Field Definitions */ -#define PWM_POE_PWM3_Pos 3 /*!< PWM_T::POE: PWM3 Position */ -#define PWM_POE_PWM3_Msk (1ul << PWM_POE_PWM3_Pos) /*!< PWM_T::POE: PWM3 Mask */ - -#define PWM_POE_PWM2_Pos 2 /*!< PWM_T::POE: PWM2 Position */ -#define PWM_POE_PWM2_Msk (1ul << PWM_POE_PWM2_Pos) /*!< PWM_T::POE: PWM2 Mask */ - -#define PWM_POE_PWM1_Pos 1 /*!< PWM_T::POE: PWM1 Position */ -#define PWM_POE_PWM1_Msk (1ul << PWM_POE_PWM1_Pos) /*!< PWM_T::POE: PWM1 Mask */ - -#define PWM_POE_PWM0_Pos 0 /*!< PWM_T::POE: PWM0 Position */ -#define PWM_POE_PWM0_Msk (1ul << PWM_POE_PWM0_Pos) /*!< PWM_T::POE: PWM0 Mask */ - -/* PWM TCON Bit Field Definitions */ - -#define PWM_TCON_PWM3TEN_Pos 3 /*!< PWM_T::TCON: PWM3TEN Position */ -#define PWM_TCON_PWM3TEN_Msk (1ul << PWM_TCON_PWM3TEN_Pos) /*!< PWM_T::TCON: PWM3TEN Mask */ - -#define PWM_TCON_PWM2TEN_Pos 2 /*!< PWM_T::TCON: PWM2TEN Position */ -#define PWM_TCON_PWM2TEN_Msk (1ul << PWM_TCON_PWM2TEN_Pos) /*!< PWM_T::TCON: PWM2TEN Mask */ - -#define PWM_TCON_PWM1TEN_Pos 1 /*!< PWM_T::TCON: PWM1TEN Position */ -#define PWM_TCON_PWM1TEN_Msk (1ul << PWM_TCON_PWM1TEN_Pos) /*!< PWM_T::TCON: PWM1TEN Mask */ - -#define PWM_TCON_PWM0TEN_Pos 0 /*!< PWM_T::TCON: PWM0TEN Position */ -#define PWM_TCON_PWM0TEN_Msk (1ul << PWM_TCON_PWM0TEN_Pos) /*!< PWM_T::TCON: PWM0TEN Mask */ - -/* PWM TSTATUS Bit Field Definitions */ - -#define PWM_TSTATUS_PWM3TF_Pos 3 /*!< PWM_T::TSTATUS: PWM3TF Position */ -#define PWM_TSTATUS_PWM3TF_Msk (1ul << PWM_TSTATUS_PWM3TF_Pos) /*!< PWM_T::TSTATUS: PWM3TF Mask */ - -#define PWM_TSTATUS_PWM2TF_Pos 2 /*!< PWM_T::TSTATUS: PWM2TF Position */ -#define PWM_TSTATUS_PWM2TF_Msk (1ul << PWM_TSTATUS_PWM2TF_Pos) /*!< PWM_T::TSTATUS: PWM2TF Mask */ - -#define PWM_TSTATUS_PWM1TF_Pos 1 /*!< PWM_T::TSTATUS: PWM1TF Position */ -#define PWM_TSTATUS_PWM1TF_Msk (1ul << PWM_TSTATUS_PWM1TF_Pos) /*!< PWM_T::TSTATUS: PWM1TF Mask */ - -#define PWM_TSTATUS_PWM0TF_Pos 0 /*!< PWM_T::TSTATUS: PWM0TF Position */ -#define PWM_TSTATUS_PWM0TF_Msk (1ul << PWM_TSTATUS_PWM0TF_Pos) /*!< PWM_T::TSTATUS: PWM0TF Mask */ - -/* PWM SYNCBUSY0 Bit Field Definitions */ -#define PWM_SYNCBUSY0_S_BUSY_Pos 0 /*!< PWM_T::SYNCBUSY0: S_BUSY Position */ -#define PWM_SYNCBUSY0_S_BUSY_Msk (1ul << PWM_SYNCBUSY0_S_BUSY_Pos) /*!< PWM_T::SYNCBUSY0: S_BUSY Mask */ - -/* PWM SYNCBUSY1 Bit Field Definitions */ -#define PWM_SYNCBUSY1_S_BUSY_Pos 0 /*!< PWM_T::SYNCBUSY1: S_BUSY Position */ -#define PWM_SYNCBUSY1_S_BUSY_Msk (1ul << PWM_SYNCBUSY1_S_BUSY_Pos) /*!< PWM_T::SYNCBUSY1: S_BUSY Mask */ - -/* PWM SYNCBUSY2 Bit Field Definitions */ -#define PWM_SYNCBUSY2_S_BUSY_Pos 0 /*!< PWM_T::SYNCBUSY2: S_BUSY Position */ -#define PWM_SYNCBUSY2_S_BUSY_Msk (1ul << PWM_SYNCBUSY2_S_BUSY_Pos) /*!< PWM_T::SYNCBUSY2: S_BUSY Mask */ - -/* PWM SYNCBUSY3 Bit Field Definitions */ -#define PWM_SYNCBUSY3_S_BUSY_Pos 0 /*!< PWM_T::SYNCBUSY3: S_BUSY Position */ -#define PWM_SYNCBUSY3_S_BUSY_Msk (1ul << PWM_SYNCBUSY3_S_BUSY_Pos) /*!< PWM_T::SYNCBUSY3: S_BUSY Mask */ - -/* PWM CAPPDMACTL Bit Field Definitions */ -#define PWM_CAPPDMACTL_CAP3RFORDER_Pos 27 /*!< PWM_T::CAPPDMACTL: CAP3RFORDER Position */ -#define PWM_CAPPDMACTL_CAP3RFORDER_Msk (1ul << PWM_CAPPDMACTL_CAP3RFORDER_Pos) /*!< PWM_T::CAPPDMACTL: CAP3RFORDER Mask */ - -#define PWM_CAPPDMACTL_CAP3PDMAMOD_Pos 25 /*!< PWM_T::CAPPDMACTL: CAP3PDMAMOD Position */ -#define PWM_CAPPDMACTL_CAP3PDMAMOD_Msk (3ul << PWM_CAPPDMACTL_CAP3PDMAMOD_Pos) /*!< PWM_T::CAPPDMACTL: CAP3PDMAMOD Mask */ - -#define PWM_CAPPDMACTL_CAP3PDMAEN_Pos 24 /*!< PWM_T::CAPPDMACTL: CAP3PDMAEN Position */ -#define PWM_CAPPDMACTL_CAP3PDMAEN_Msk (1ul << PWM_CAPPDMACTL_CAP3PDMAEN_Pos) /*!< PWM_T::CAPPDMACTL: CAP3PDMAEN Mask */ - -#define PWM_CAPPDMACTL_CAP2RFORDER_Pos 19 /*!< PWM_T::CAPPDMACTL: CAP2RFORDER Position */ -#define PWM_CAPPDMACTL_CAP2RFORDER_Msk (1ul << PWM_CAPPDMACTL_CAP2RFORDER_Pos) /*!< PWM_T::CAPPDMACTL: CAP2RFORDER Mask */ - -#define PWM_CAPPDMACTL_CAP2PDMAMOD_Pos 17 /*!< PWM_T::CAPPDMACTL: CAP2PDMAMOD Position */ -#define PWM_CAPPDMACTL_CAP2PDMAMOD_Msk (3ul << PWM_CAPPDMACTL_CAP2PDMAMOD_Pos) /*!< PWM_T::CAPPDMACTL: CAP2PDMAMOD Mask */ - -#define PWM_CAPPDMACTL_CAP2PDMAEN_Pos 16 /*!< PWM_T::CAPPDMACTL: CAP2PDMAEN Position */ -#define PWM_CAPPDMACTL_CAP2PDMAEN_Msk (1ul << PWM_CAPPDMACTL_CAP2PDMAEN_Pos) /*!< PWM_T::CAPPDMACTL: CAP2PDMAEN Mask */ - -#define PWM_CAPPDMACTL_CAP1RFORDER_Pos 11 /*!< PWM_T::CAPPDMACTL: CAP1RFORDER Position */ -#define PWM_CAPPDMACTL_CAP1RFORDER_Msk (1ul << PWM_CAPPDMACTL_CAP1RFORDER_Pos) /*!< PWM_T::CAPPDMACTL: CAP1RFORDER Mask */ - -#define PWM_CAPPDMACTL_CAP1PDMAMOD_Pos 9 /*!< PWM_T::CAPPDMACTL: CAP1PDMAMOD Position */ -#define PWM_CAPPDMACTL_CAP1PDMAMOD_Msk (3ul << PWM_CAPPDMACTL_CAP1PDMAMOD_Pos) /*!< PWM_T::CAPPDMACTL: CAP1PDMAMOD Mask */ - -#define PWM_CAPPDMACTL_CAP1PDMAEN_Pos 8 /*!< PWM_T::CAPPDMACTL: CAP1PDMAEN Position */ -#define PWM_CAPPDMACTL_CAP1PDMAEN_Msk (1ul << PWM_CAPPDMACTL_CAP1PDMAEN_Pos) /*!< PWM_T::CAPPDMACTL: CAP1PDMAEN Mask */ - -#define PWM_CAPPDMACTL_CAP0RFORDER_Pos 3 /*!< PWM_T::CAPPDMACTL: CAP0RFORDER Position */ -#define PWM_CAPPDMACTL_CAP0RFORDER_Msk (1ul << PWM_CAPPDMACTL_CAP0RFORDER_Pos) /*!< PWM_T::CAPPDMACTL: CAP0RFORDER Mask */ - -#define PWM_CAPPDMACTL_CAP0PDMAMOD_Pos 1 /*!< PWM_T::CAPPDMACTL: CAP0PDMAMOD Position */ -#define PWM_CAPPDMACTL_CAP0PDMAMOD_Msk (3ul << PWM_CAPPDMACTL_CAP0PDMAMOD_Pos) /*!< PWM_T::CAPPDMACTL: CAP0PDMAMOD Mask */ - -#define PWM_CAPPDMACTL_CAP0PDMAEN_Pos 0 /*!< PWM_T::CAPPDMACTL: CAP0PDMAEN Position */ -#define PWM_CAPPDMACTL_CAP0PDMAEN_Msk (1ul << PWM_CAPPDMACTL_CAP0PDMAEN_Pos) /*!< PWM_T::CAPPDMACTL: CAP0PDMAEN Mask */ - -/* PWM CAP0PDMA Bit Field Definitions */ -#define PWM_CAP0PDMA_CAP0RFPDMA_Pos 0 /*!< PWM_T::CAP0PDMA: CAP0RFPDMA Position */ -#define PWM_CAP0PDMA_CAP0RFPDMA_Msk (0xFFFFul << PWM_CAP0PDMA_CAP0RFPDMA_Pos) /*!< PWM_T::CAP0PDMA: CAP0RFPDMA Mask */ - -/* PWM CAP1PDMA Bit Field Definitions */ -#define PWM_CAP1PDMA_CAP1RFPDMA_Pos 0 /*!< PWM_T::CAP1PDMA: CAP1RFPDMA Position */ -#define PWM_CAP1PDMA_CAP1RFPDMA_Msk (0xFFFFul << PWM_CAP1PDMA_CAP1RFPDMA_Pos) /*!< PWM_T::CAP1PDMA: CAP1RFPDMA Mask */ - -/* PWM CAP2PDMA Bit Field Definitions */ -#define PWM_CAP2PDMA_CAP2RFPDMA_Pos 0 /*!< PWM_T::CAP2PDMA: CAP2RFPDMA Position */ -#define PWM_CAP2PDMA_CAP2RFPDMA_Msk (0xFFFFul << PWM_CAP2PDMA_CAP2RFPDMA_Pos) /*!< PWM_T::CAP2PDMA: CAP2RFPDMA Mask */ - -/* PWM CAP3PDMA Bit Field Definitions */ -#define PWM_CAP3PDMA_CAP3RFPDMA_Pos 0 /*!< PWM_T::CAP3PDMA: CAP3RFPDMA Position */ -#define PWM_CAP3PDMA_CAP3RFPDMA_Msk (0xFFFFul << PWM_CAP3PDMA_CAP3RFPDMA_Pos) /*!< PWM_T::CAP3PDMA: CAP3RFPDMA Mask */ -/*@}*/ /* end of group REG_PWM_BITMASK */ -/*@}*/ /* end of group REG_PWM */ - -/*------------------------- SPI Interface Controller -------------------------*/ -/** @addtogroup REG_SPI Peripheral Interface Controller (SPI) - Memory Mapped Structure for SPI Controller - @{ - */ - -typedef struct -{ - - -/** - * @var SPI_T::CNTRL - * Offset: 0x00 Control and Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |GO_BUSY |SPI Transfer Control Bit And Busy Status - * | | |0 = Data transfer stopped. - * | | |1 = In Master mode, writing 1 to this bit to start the SPI data transfer; in Slave mode, - * | | | writing 1 to this bit indicates that the slave is ready to communicate with a master. - * | | |If FIFO mode is disabled, during the data transfer, this bit keeps the value of 1. - * | | |As the transfer is finished, this bit will be cleared automatically. - * | | |Software can read this bit to check if the SPI is in busy status. - * | | |In FIFO mode, this bit will be controlled by hardware. - * | | |Software should not modify this bit. - * | | |In Slave mode, this bit always returns 1 when this register is read by software. - * | | |In Master mode, this bit reflects the busy or idle status of SPI. - * | | |Note: - * | | |1. When FIFO mode is disabled, all configurations should be set before writing 1 to this GO_BUSY bit. - * | | |2. When FIFO mode is disabled and the software uses TX or RX PDMA function to transfer data, this bit - * | | | will be cleared after the PDMA finishes the data transfer. - * |[1] |RX_NEG |Receive On Negative Edge - * | | |0 = Received data input signal is latched on the rising edge of SPI bus clock. - * | | |1 = Received data input signal is latched on the falling edge of SPI bus clock. - * |[2] |TX_NEG |Transmit On Negative Edge - * | | |0 = Transmitted data output signal is changed on the rising edge of SPI bus clock. - * | | |1 = Transmitted data output signal is changed on the falling edge of SPI bus clock. - * |[7:3] |TX_BIT_LEN|Transmit Bit Length - * | | |This field specifies how many bits can be transmitted / received in one transaction. - * | | |The minimum bit length is 8 bits and can up to 32 bits. - * | | |TX_BIT_LEN = 0x08 ... 8 bits. - * | | |TX_BIT_LEN = 0x09 ... 9 bits. - * | | |...... - * | | |TX_BIT_LEN = 0x1F ... 31 bits. - * | | |TX_BIT_LEN = 0x00 ... 32 bits. - * |[10] |LSB |Send LSB First - * | | |0 = The MSB, which bit of transmit/receive register depends on the setting of TX_BIT_LEN, is transmitted/received first. - * | | |1 = The LSB, bit 0 of the SPI TX0/1 register, is sent first to the SPI data output pin, and the first bit received from - * | | | the SPI data input pin will be put in the LSB position of the RX register (bit 0 of SPI_RX0/1). - * |[11] |CLKP |Clock Polarity - * | | |0 = SPI bus clock is idle low. - * | | |1 = SPI bus clock is idle high. - * |[15:12] |SP_CYCLE |Suspend Interval (Master Only) - * | | |The four bits provide configurable suspend interval between two successive transmit/receive transaction in a transfer. - * | | |The definition of the suspend interval is the interval between the last clock edge of the preceding transaction word - * | | |and the first clock edge of the following transaction word. - * | | |The default value is 0x3. - * | | |The period of the suspend interval is obtained according to the following equation. - * | | |(SP_CYCLE[3:0] + 0.5) * period of SPI bus clock cycle - * | | |Example: - * | | |SP_CYCLE = 0x0 ... 0.5 SPI bus clock cycle. - * | | |SP_CYCLE = 0x1 ... 1.5 SPI bus clock cycle. - * | | |...... - * | | |SP_CYCLE = 0xE ... 14.5 SPI bus clock cycle. - * | | |SP_CYCLE = 0xF ... 15.5 SPI bus clock cycle. - * | | |If the variable clock function is enabled and the transmit FIFO buffer is not empty, the minimum period of suspend - * | | |interval between the successive transactions is (6.5 + SP_CYCLE) * SPI bus clock cycle. - * |[16] |IF |Unit Transfer Interrupt Flag - * | | |0 = No transaction has been finished since this bit was cleared to 0. - * | | |1 = SPI controller has finished one unit transfer. - * | | |Note: This bit will be cleared by writing 1 to itself. - * |[17] |IE |Unit Transfer Interrupt Enable - * | | |0 = SPI unit transfer interrupt Disabled. - * | | |1 = SPI unit transfer interrupt Enabled. - * |[18] |SLAVE |Slave Mode Enable - * | | |0 = Master mode. - * | | |1 = Slave mode. - * |[19] |REORDER |Byte Reorder Function Enable - * | | |0 = Byte Reorder function Disabled. - * | | |1 = Byte Reorder function Enabled. - * | | |A byte suspend interval will be inserted among each byte. - * | | |The period of the byte suspend interval depends on the setting of SP_CYCLE. - * | | |Note: - * | | |1. Byte Reorder function is only available if TX_BIT_LEN is defined as 16, 24, and 32 bits. - * | | |2. In Slave mode with level-trigger configuration, the slave select pin must be kept at active state during the - * | | | byte suspend interval. - * | | |3. The Byte Reorder function is not supported when the variable bus clock function or Dual I/O mode is enabled. - * |[21] |FIFO |FIFO Mode Enable - * | | |0 = FIFO mode Disabled. - * | | |1 = FIFO mode Enabled. - * | | |Note: - * | | |1. Before enabling FIFO mode, the other related settings should be set in advance. - * | | |2. In Master mode, if the FIFO mode is enabled, the GO_BUSY bit will be set to 1 automatically after writing data - * | | | to the transmit FIFO buffer; the GO_BUSY bit will be cleared to 0 automatically when the SPI controller is in idle. - * | | | If all data stored at transmit FIFO buffer are sent out, the TX_EMPTY bit will be set to 1 and the GO_BUSY bit will be cleared to 0. - * | | |3. After clearing this bit to 0, user must wait for at least 2 peripheral clock periods before setting this bit to 1 again. - * |[22] |TWOB |2-Bit Transfer Mode Enable - * | | |0 = 2-bit Transfer mode Disabled. - * | | |1 = 2-bit Transfer mode Enabled. - * | | |Note: When 2-bit Transfer mode is enabled, the serial transmitted 2-bit data are from SPI_TX1/0, and the received 2-bit data input are put in SPI_RX1/0. - * |[23] |VARCLK_EN |Variable Clock Enable (Master Only) - * | | |0 = SPI clock output frequency is fixed and decided only by the value of DIVIDER. - * | | |1 = SPI clock output frequency is variable. - * | | |The output frequency is decided by the value of VARCLK, DIVIDER, and DIVIDER2. - * | | |Note: When this VARCLK_EN bit is set to 1, the setting of TX_BIT_LEN must be programmed as 0x10 (16-bit mode). - * |[24] |RX_EMPTY |Receive FIFO Buffer Empty Indicator (Read Only) - * | | |It is a mutual mirror bit of SPI_CNTRL[24]. - * | | |0 = Receive FIFO buffer is not empty. - * | | |1 = Receive FIFO buffer is empty. - * |[25] |RX_FULL |Receive FIFO Buffer Full Indicator (Read Only) - * | | |It is a mutual mirror bit of SPI_STATUS[25]. - * | | |0 = Receive FIFO buffer is not full. - * | | |1 = Receive FIFO buffer is full. - * |[26] |TX_EMPTY |Transmit FIFO Buffer Empty Indicator (Read Only) - * | | |It is a mutual mirror bit of SPI_STATUS[26]. - * | | |0 = Transmit FIFO buffer is not empty. - * | | |1 = Transmit FIFO buffer is empty. - * |[27] |TX_FULL |Transmit FIFO Buffer Full Indicator (Read Only) - * | | |It is a mutual mirror bit of SPI_STATUS[27]. - * | | |0 = Transmit FIFO buffer is not full. - * | | |1 = Transmit FIFO buffer is full. - * @var SPI_T::DIVIDER - * Offset: 0x04 Clock Divider Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[7:0] |DIVIDER |Clock Divider 1 Register - * | | |The value in this field is the frequency divider for generating the SPI peripheral clock and the SPI bus clock of SPI master. - * | | |The frequency is obtained according to the following equation. - * | | |If the bit of BCn, SPI_CNTRL2[31], is set to 0, - * | | | SPI peripheral clock frequency = system clock frequency / (DIVIDER + 1) / 2 - * | | |else if BCn is set to 1, - * | | | SPI peripheral clock frequency = SPI peripheral clock source frequency / (DIVIDER + 1) - * | | |The SPI peripheral clock source is defined in the CLKSEL1 register. - * |[23:16] |DIVIDER2 |Clock Divider 2 Register (Master Only) - * | | |The value in this field is the 2nd frequency divider for generating the second clock of the variable clock function. - * | | |The frequency is obtained according to the following equation: - * | | | f_clk2 = SPI peripheral clock frequency / (DIVIDER2 + 1) / 2 - * | | |If the VARCLK_EN bit is cleared to 0, this setting is unmeaning. - * @var SPI_T::SSR - * Offset: 0x08 Slave Select Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[1:0] |SSR |Slave Select Control Bits (Master Only) - * | | |If AUTOSS bit is cleared, writing 1 to any bit of this field sets the proper SPIn_SPISS0/1 - * | | |line to an active state and writing 0 sets the line back to inactive state. - * | | |If the AUTOSS bit is set, writing 0 to any bit location of this field will keep the corresponding - * | | |SPIn_SPISS0/1 line at inactive state; writing 1 to any bit location of this field will select - * | | |appropriate SPIn_SPISS0/1 line to be automatically driven to active state for the duration of the - * | | |transmit/receive, and will be driven to inactive state for the rest of the time. - * | | |The active state of SPIn_SPISS0/1 is specified in SS_LVL. - * | | |Note: SPIn_SPISS0 is defined as the slave select input in Slave mode. - * |[2] |SS_LVL |Slave Select Active Level - * | | |This bit defines the active status of slave select signal (SPIn_SPISS0/1). - * | | |0 = The slave select signal SPIn_SPISS0/1 is active on low-level/falling-edge. - * | | |1 = The slave select signal SPIn_SPISS0/1 is active on high-level/rising-edge. - * |[3] |AUTOSS |Automatic Slave Select Function Enable (Master Only) - * | | |0 = If this bit is cleared, slave select signals will be asserted/de-asserted by setting /clearing - * | | | the corresponding bits of SPI_SSR[1:0]. - * | | |1 = If this bit is set, SPIn_SPISS0/1 signals will be generated automatically. - * | | | It means that device/slave select signal, which is set in SPI_SSR[1:0], will be asserted by the - * | | | SPI controller when transmit/receive is started, and will be de-asserted after each transmit/receive is finished. - * |[4] |SS_LTRIG |Slave Select Level Trigger Enable (Slave Only) - * | | |0 = Slave select signal is edge-trigger. - * | | | This is the default value. - * | | | The SS_LVL bit decides the signal is active after a falling-edge or rising-edge. - * | | |1 = Slave select signal is level-trigger. - * | | | The SS_LVL bit decides the signal is active low or active high. - * |[5] |LTRIG_FLAG|Level Trigger Accomplish Flag - * | | |In Slave mode, this bit indicates whether the received bit number meets the requirement or not after the current transaction done. - * | | |0 = Transferred bit length of one transaction does not meet the specified requirement. - * | | |1 = Transferred bit length meets the specified requirement which defined in TX_BIT_LEN. - * | | |Note: This bit is READ only. - * | | |As the GO_BUSY bit is set to 1 by software, the LTRIG_FLAG will be cleared to 0 after 4 SPI peripheral clock periods plus 1 system clock period. - * | | |In FIFO mode, this bit has no meaning. - * @var SPI_T::RX - * Offset: 0x10/0x14 Data Receive Register 0/1 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |RX |Data Receive Register - * | | |The data receive register holds the datum received from SPI data input pin. - * | | |If FIFO mode is disabled, the last received data can be accessed through software by reading this register. - * | | |If the FIFO bit is set as 1 and the RX_EMPTY bit, SPI_CNTRL[24] or SPI_STATUS[24], is not set to 1, the receive - * | | |FIFO buffer can be accessed through software by reading this register. This is a read-only register. - * @var SPI_T::TX - * Offset: 0x20/0x24 Data Transmit Register 0/1 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |TX |Data Transmit Register - * | | |The data transmit registers hold the data to be transmitted in the next transfer. - * | | |The number of valid bits depends on the setting of transmit bit length field of the SPI_CNTRL register. - * | | |For example, if TX_BIT_LEN is set to 0x08, the bits TX[7:0] will be transmitted in next transfer. - * | | |If TX_BIT_LEN is set to 0x00, the SPI controller will perform a 32-bit transfer. - * | | |Note 1: When the SPI controller is configured as a slave device and FIFO mode is disabled, if the SPI - * | | | controller attempts to transmit data to a master, the transmit data register should be updated - * | | | by software before setting the GO_BUSY bit to 1. - * | | |Note 2: In Master mode, SPI controller will start to transfer after 5 peripheral clock cycles after user writes to this register. - * @var SPI_T::VARCLK - * Offset: 0x34 Variable Clock Pattern Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |VARCLK |Variable Clock Pattern - * | | |This register defines the clock pattern of the SPI transfer. - * | | |If the variable clock function is disabled, this setting is unmeaning. - * @var SPI_T::DMA - * Offset: 0x38 SPI DMA Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |TX_DMA_GO |Transmit DMA Start - * | | |Setting this bit to 1 will start the transmit PDMA process. - * | | |SPI controller will issue request to PDMA controller automatically. - * | | |Hardware will clear this bit to 0 automatically after PDMA transfer done. - * | | |If the SPI transmit PDMA function is used to transfer data, the GO_BUSY bit should not be set to 1 by software. - * | | |The PDMA control logic of SPI controller will set it automatically whenever necessary. - * | | |In Slave mode and when FIFO mode is disabled, the minimal suspend interval between two successive transactions - * | | |must be larger than (8 SPI clock periods + 14 APB clock periods) for edge-trigger mode or - * | | |(9.5 SPI clock periods + 14 APB clock periods) for level-trigger mode. - * | | |If the 2-bit Transfer mode is enabled, additional 18 APB clock periods for the above conditions is required. - * |[1] |RX_DMA_GO |Receive DMA Start - * | | |Setting this bit to 1 will start the receive PDMA process. - * | | |The SPI controller will issue request to PDMA controller automatically when the SPI receive buffer is not empty. - * | | |This bit will be cleared to 0 by hardware automatically after PDMA transfer is done. - * | | |If the software uses the receive PDMA function to access the received data of SPI and does not use the transmit - * | | |PDMA function, the GO_BUSY bit should be set by software. - * | | |Enabling FIFO mode is recommended if the software uses more than one PDMA channel to transfer data. - * | | |In Slave mode and when FIFO mode is disabled, if the software only uses one PDMA channel for SPI receive PDMA - * | | |function and the other PDMA channels are not in use, the minimal suspend interval between two successive - * | | |transactions must be larger than (9 SPI slave peripheral clock periods + 4 APB clock periods) for Edge-trigger - * | | |mode or (9.5 SPI slave peripheral clock periods + 4 APB clock periods) for Level-trigger mode. - * |[2] |PDMA_RST |PDMA Reset - * | | |0 = No effect. - * | | |1 = Reset the PDMA control logic of the SPI controller. This bit will be cleared to 0 automatically. - * @var SPI_T::CNTRL2 - * Offset: 0x3C Control and Status Register 2 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[8] |NOSLVSEL |Slave 3-Wire Mode Enable - * | | |This is used to ignore the slave select signal in Slave mode. - * | | |The SPI controller can work with 3-wire interface including SPIn_CLK, SPIn_MISO, and SPIn_MOSI. - * | | |0 = 4-wire bi-direction interface. - * | | |1 = 3-wire bi-direction interface. - * | | |Note: In Slave 3-wire mode, the SS_LTRIG, SPI_SSR[4] will be set as 1 automatically. - * |[9] |SLV_ABORT |Slave 3-Wire Mode Abort Control - * | | |In normal operation, there is an interrupt event when the received data meet the required bits which defined in TX_BIT_LEN. - * | | |If the received bits are less than the requirement and there is no more SPI clock input over the one transfer time in - * | | |Slave 3-wire mode, the user can set this bit to force the current transfer done and then the user can get a transfer done interrupt event. - * | | |Note: This bit will be cleared to 0 automatically by hardware after it is set to 1 by software. - * |[10] |SSTA_INTEN|Slave 3-Wire Mode Start Interrupt Enable - * | | |Used to enable interrupt when the transfer has started in Slave 3-wire mode. - * | | |If there is no transfer done interrupt over the time period which is defined by user after the transfer start, - * | | |the user can set the SLV_ABORT bit to force the transfer done. - * | | |0 = Transaction start interrupt Disabled. - * | | |1 = Transaction start interrupt Enabled. - * | | |It will be cleared to 0 as the current transfer is done or the SLV_START_INTSTS bit is cleared. - * |[11] |SLV_START_INTSTS|Slave 3-Wire Mode Start Interrupt Status - * | | |This bit indicates if a transaction has started in Slave 3-wire mode. - * | | |It is a mutual mirror bit of SPI_STATUS[11]. - * | | |0 = Slave has not detected any SPI clock transition since the SSTA_INTEN bit was set to 1. - * | | |1 = A transaction has started in Slave 3-wire mode. - * | | |It will be cleared automatically when a transaction is done or by writing 1 to this bit. - * |[12] |DUAL_IO_DIR|Dual I/O Mode Direction Control - * | | |0 = Dual Input mode. - * | | |1 = Dual Output mode. - * |[13] |DUAL_IO_EN|Dual I/O Mode Enable - * | | |0 = Dual I/O mode Disabled. - * | | |1 = Dual I/O mode Enabled. - * |[16] |SS_INT_OPT|Slave Select Inactive Interrupt Option - * | | |This setting is only available if the SPI controller is configured as level trigger slave device. - * | | |0 = As the slave select signal goes to inactive level, the IF bit will NOT be set to 1. - * | | |1 = As the slave select signal goes to inactive level, the IF bit will be set to 1. - * |[31] |BCn |SPI Peripheral Clock Backward Compatible Option - * | | |0 = Backward compatible clock configuration. - * | | |1 = Clock configuration is not backward compatible. - * | | |Refer to the description of SPI_DIVIDER register for details. - * @var SPI_T::FIFO_CTL - * Offset: 0x40 SPI FIFO Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |RX_CLR |Clear Receive FIFO Buffer - * | | |0 = No effect. - * | | |1 = Clear receive FIFO buffer. - * | | |The RX_FULL flag will be cleared to 0 and the RX_EMPTY flag will be set to 1. - * | | |This bit will be cleared to 0 by hardware after it is set to 1 by software. - * |[1] |TX_CLR |Clear Transmit FIFO Buffer - * | | |0 = No effect. - * | | |1 = Clear transmit FIFO buffer. - * | | |The TX_FULL flag will be cleared to 0 and the TX_EMPTY flag will be set to 1. - * | | |This bit will be cleared to 0 by hardware after it is set to 1 by software. - * |[2] |RX_INTEN |Receive Threshold Interrupt Enable - * | | |0 = RX threshold interrupt Disabled. - * | | |1 = RX threshold interrupt Enabled. - * |[3] |TX_INTEN |Transmit Threshold Interrupt Enable - * | | |0 = TX threshold interrupt Disabled. - * | | |1 = TX threshold interrupt Enabled. - * |[6] |RXOV_INTEN|Receive FIFO Overrun Interrupt Enable - * | | |0 = Receive FIFO overrun interrupt Disabled. - * | | |1 = Receive FIFO overrun interrupt Enabled. - * |[21] |TIMEOUT_INTEN|Receive FIFO Time-Out Interrupt Enable - * | | |0 = Time-out interrupt Disabled. - * | | |1 = Time-out interrupt Enabled. - * |[26:24] |RX_THRESHOLD|Receive FIFO Threshold - * | | |If the valid data count of the receive FIFO buffer is larger than the RX_THRESHOLD setting, - * | | |the RX_INTSTS bit will be set to 1, else the RX_INTSTS bit will be cleared to 0. - * |[30:28] |TX_THRESHOLD|Transmit FIFO Threshold - * | | |If the valid data count of the transmit FIFO buffer is less than or equal to the TX_THRESHOLD - * | | |setting, the TX_INTSTS bit will be set to 1, else the TX_INTSTS bit will be cleared to 0. - * @var SPI_T::STATUS - * Offset: 0x44 SPI Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |RX_INTSTS |Receive FIFO Threshold Interrupt Status (Read Only) - * | | |0 = The valid data count within the Rx FIFO buffer is smaller than or equal to the setting value of RX_THRESHOLD. - * | | |1 = The valid data count within the receive FIFO buffer is larger than the setting value of RX_THRESHOLD. - * | | |Note: If RX_INTEN = 1 and RX_INTSTS = 1, the SPI controller will generate a SPI interrupt request. - * |[2] |RX_OVERRUN|Receive FIFO Overrun Status - * | | |When the receive FIFO buffer is full, the follow-up data will be dropped and this bit will be set to 1. - * | | |Note: This bit will be cleared by writing 1 to itself. - * |[4] |TX_INTSTS |Transmit FIFO Threshold Interrupt Status (Read Only) - * | | |0 = The valid data count within the transmit FIFO buffer is larger than the setting value of TX_THRESHOLD. - * | | |1 = The valid data count within the transmit FIFO buffer is less than or equal to the setting value of TX_THRESHOLD. - * | | |Note: If TX_INTEN = 1 and TX_INTSTS = 1, the SPI controller will generate a SPI interrupt request. - * |[11] |SLV_START_INTSTS|Slave Start Interrupt Status - * | | |It is used to dedicate if a transaction has started in Slave 3-wire mode. - * | | |It is a mutual mirror bit of SPI_CNTRL2[11]. - * | | |0 = Slave has not detected any SPI clock transition since the SSTA_INTEN bit was set to 1. - * | | |1 = A transaction has started in Slave 3-wire mode. - * | | |It will be cleared as a transaction is done or by writing 1 to this bit. - * |[15:12] |RX_FIFO_COUNT|Receive FIFO Data Count (Read Only) - * | | |This bit field indicates the valid data count of receive FIFO buffer. - * |[16] |IF |SPI Unit Transfer Interrupt Flag - * | | |It is a mutual mirror bit of SPI_CNTRL[16]. - * | | |0 = No transaction has been finished since this bit was cleared to 0. - * | | |1 = SPI controller has finished one unit transfer. - * | | |Note: This bit will be cleared by writing 1 to itself. - * |[20] |TIMEOUT |Time-Out Interrupt Flag - * | | |0 = No receive FIFO time-out event. - * | | |1 = Receive FIFO buffer is not empty and no read operation on receive FIFO buffer over 64 SPI clock - * | | |period in Master mode or over 576 SPI peripheral clock period in Slave mode. - * | | |When the received FIFO buffer is read by software, the time-out status will be cleared automatically. - * | | |Note: This bit will be cleared by writing 1 to itself. - * |[24] |RX_EMPTY |Receive FIFO Buffer Empty Indicator (Read Only) - * | | |It is a mutual mirror bit of SPI_CNTRL[24]. - * | | |0 = Receive FIFO buffer is not empty. - * | | |1 = Receive FIFO buffer is empty. - * |[25] |RX_FULL |Receive FIFO Buffer Empty Indicator (Read Only) - * | | |It is a mutual mirror bit of SPI_CNTRL[24]. - * | | |0 = Receive FIFO buffer is not empty. - * | | |1 = Receive FIFO buffer is empty. - * |[26] |TX_EMPTY |Transmit FIFO Buffer Empty Indicator (Read Only) - * | | |It is a mutual mirror bit of SPI_CNTRL[26]. - * | | |0 = Transmit FIFO buffer is not empty. - * | | |1 = Transmit FIFO buffer is empty. - * |[27] |TX_FULL |Transmit FIFO Buffer Full Indicator (Read Only) - * | | |It is a mutual mirror bit of SPI_CNTRL[27]. - * | | |0 = Transmit FIFO buffer is not full. - * | | |1 = Transmit FIFO buffer is full. - * |[31:28] |TX_FIFO_COUNT|Transmit FIFO Data Count (Read Only) - * | | |This bit field indicates the valid data count of transmit FIFO buffer. - */ - - __IO uint32_t CNTRL; /* Offset: 0x00 Control and Status Register */ - __IO uint32_t DIVIDER; /* Offset: 0x04 Clock Divider Register */ - __IO uint32_t SSR; /* Offset: 0x08 Slave Select Register */ - __I uint32_t RESERVE0; - __I uint32_t RX[2]; /* Offset: 0x10/0x14 Data Receive Register 0/1 */ - __I uint32_t RESERVE1; - __I uint32_t RESERVE2; - __O uint32_t TX[2]; /* Offset: 0x20/0x24 Data Transmit Register 0/1 */ - __I uint32_t RESERVE3; - __I uint32_t RESERVE4; - __I uint32_t RESERVE5; - __IO uint32_t VARCLK; /* Offset: 0x34 Variable Clock Pattern Register */ - __IO uint32_t DMA; /* Offset: 0x38 SPI DMA Control Register */ - __IO uint32_t CNTRL2; /* Offset: 0x3C Control and Status Register 2 */ - __IO uint32_t FIFO_CTL; /* Offset: 0x40 SPI FIFO Control Register */ - __IO uint32_t STATUS; /* Offset: 0x44 SPI Status Register */ - -} SPI_T; - - - -/** @addtogroup REG_SPI_BITMASK SPI Bit Mask - @{ - */ - -/* SPI_CNTRL Bit Field Definitions */ -#define SPI_CNTRL_TX_FULL_Pos 27 /*!< SPI_T::CNTRL: TX_FULL Position */ -#define SPI_CNTRL_TX_FULL_Msk (1ul << SPI_CNTRL_TX_FULL_Pos) /*!< SPI_T::CNTRL: TX_FULL Mask */ - -#define SPI_CNTRL_TX_EMPTY_Pos 26 /*!< SPI_T::CNTRL: TX_EMPTY Position */ -#define SPI_CNTRL_TX_EMPTY_Msk (1ul << SPI_CNTRL_TX_EMPTY_Pos) /*!< SPI_T::CNTRL: TX_EMPTY Mask */ - -#define SPI_CNTRL_RX_FULL_Pos 25 /*!< SPI_T::CNTRL: RX_FULL Position */ -#define SPI_CNTRL_RX_FULL_Msk (1ul << SPI_CNTRL_RX_FULL_Pos) /*!< SPI_T::CNTRL: RX_FULL Mask */ - -#define SPI_CNTRL_RX_EMPTY_Pos 24 /*!< SPI_T::CNTRL: RX_EMPTY Position */ -#define SPI_CNTRL_RX_EMPTY_Msk (1ul << SPI_CNTRL_RX_EMPTY_Pos) /*!< SPI_T::CNTRL: RX_EMPTY Mask */ - -#define SPI_CNTRL_VARCLK_EN_Pos 23 /*!< SPI_T::CNTRL: VARCLK_EN Position */ -#define SPI_CNTRL_VARCLK_EN_Msk (1ul << SPI_CNTRL_VARCLK_EN_Pos) /*!< SPI_T::CNTRL: VARCLK_EN Mask */ - -#define SPI_CNTRL_TWOB_Pos 22 /*!< SPI_T::CNTRL: TWOB Position */ -#define SPI_CNTRL_TWOB_Msk (1ul << SPI_CNTRL_TWOB_Pos) /*!< SPI_T::CNTRL: TWOB Mask */ - -#define SPI_CNTRL_FIFO_Pos 21 /*!< SPI_T::CNTRL: FIFO Position */ -#define SPI_CNTRL_FIFO_Msk (1ul << SPI_CNTRL_FIFO_Pos) /*!< SPI_T::CNTRL: FIFO Mask */ - -#define SPI_CNTRL_REORDER_Pos 19 /*!< SPI_T::CNTRL: REORDER Position */ -#define SPI_CNTRL_REORDER_Msk (1ul << SPI_CNTRL_REORDER_Pos) /*!< SPI_T::CNTRL: REORDER Mask */ - -#define SPI_CNTRL_SLAVE_Pos 18 /*!< SPI_T::CNTRL: SLAVE Position */ -#define SPI_CNTRL_SLAVE_Msk (1ul << SPI_CNTRL_SLAVE_Pos) /*!< SPI_T::CNTRL: SLAVE Mask */ - -#define SPI_CNTRL_IE_Pos 17 /*!< SPI_T::CNTRL: IE Position */ -#define SPI_CNTRL_IE_Msk (1ul << SPI_CNTRL_IE_Pos) /*!< SPI_T::CNTRL: IE Mask */ - -#define SPI_CNTRL_IF_Pos 16 /*!< SPI_T::CNTRL: IF Position */ -#define SPI_CNTRL_IF_Msk (1ul << SPI_CNTRL_IF_Pos) /*!< SPI_T::CNTRL: IF Mask */ - -#define SPI_CNTRL_SP_CYCLE_Pos 12 /*!< SPI_T::CNTRL: SP_CYCLE Position */ -#define SPI_CNTRL_SP_CYCLE_Msk (0xFul << SPI_CNTRL_SP_CYCLE_Pos) /*!< SPI_T::CNTRL: SP_CYCLE Mask */ - -#define SPI_CNTRL_CLKP_Pos 11 /*!< SPI_T::CNTRL: CLKP Position */ -#define SPI_CNTRL_CLKP_Msk (1ul << SPI_CNTRL_CLKP_Pos) /*!< SPI_T::CNTRL: CLKP Mask */ - -#define SPI_CNTRL_LSB_Pos 10 /*!< SPI_T::CNTRL: LSB Position */ -#define SPI_CNTRL_LSB_Msk (1ul << SPI_CNTRL_LSB_Pos) /*!< SPI_T::CNTRL: LSB Mask */ - -#define SPI_CNTRL_TX_BIT_LEN_Pos 3 /*!< SPI_T::CNTRL: TX_BIT_LEN Position */ -#define SPI_CNTRL_TX_BIT_LEN_Msk (0x1Ful << SPI_CNTRL_TX_BIT_LEN_Pos) /*!< SPI_T::CNTRL: TX_BIT_LEN Mask */ - -#define SPI_CNTRL_TX_NEG_Pos 2 /*!< SPI_T::CNTRL: TX_NEG Position */ -#define SPI_CNTRL_TX_NEG_Msk (1ul << SPI_CNTRL_TX_NEG_Pos) /*!< SPI_T::CNTRL: TX_NEG Mask */ - -#define SPI_CNTRL_RX_NEG_Pos 1 /*!< SPI_T::CNTRL: RX_NEG Position */ -#define SPI_CNTRL_RX_NEG_Msk (1ul << SPI_CNTRL_RX_NEG_Pos) /*!< SPI_T::CNTRL: RX_NEG Mask */ - -#define SPI_CNTRL_GO_BUSY_Pos 0 /*!< SPI_T::CNTRL: GO_BUSY Position */ -#define SPI_CNTRL_GO_BUSY_Msk (1ul << SPI_CNTRL_GO_BUSY_Pos) /*!< SPI_T::CNTRL: GO_BUSY Mask */ - -/* SPI_DIVIDER Bit Field Definitions */ -#define SPI_DIVIDER_DIVIDER2_Pos 16 /*!< SPI_T::DIVIDER: DIVIDER2 Position */ -#define SPI_DIVIDER_DIVIDER2_Msk (0xFFul << SPI_DIVIDER_DIVIDER2_Pos) /*!< SPI_T::DIVIDER: DIVIDER2 Mask */ - -#define SPI_DIVIDER_DIVIDER_Pos 0 /*!< SPI_T::DIVIDER: DIVIDER Position */ -#define SPI_DIVIDER_DIVIDER_Msk (0xFFul << SPI_DIVIDER_DIVIDER_Pos) /*!< SPI_T::DIVIDER: DIVIDER Mask */ - -/* SPI_SSR Bit Field Definitions */ -#define SPI_SSR_LTRIG_FLAG_Pos 5 /*!< SPI_T::SSR: LTRIG_FLAG Position */ -#define SPI_SSR_LTRIG_FLAG_Msk (1ul << SPI_SSR_LTRIG_FLAG_Pos) /*!< SPI_T::SSR: LTRIG_FLAG Mask */ - -#define SPI_SSR_SS_LTRIG_Pos 4 /*!< SPI_T::SSR: SS_LTRIG Position */ -#define SPI_SSR_SS_LTRIG_Msk (1ul << SPI_SSR_SS_LTRIG_Pos) /*!< SPI_T::SSR: SS_LTRIG Mask */ - -#define SPI_SSR_AUTOSS_Pos 3 /*!< SPI_T::SSR: AUTOSS Position */ -#define SPI_SSR_AUTOSS_Msk (1ul << SPI_SSR_AUTOSS_Pos) /*!< SPI_T::SSR: AUTOSS Mask */ - -#define SPI_SSR_SS_LVL_Pos 2 /*!< SPI_T::SSR: SS_LVL Position */ -#define SPI_SSR_SS_LVL_Msk (1ul << SPI_SSR_SS_LVL_Pos) /*!< SPI_T::SSR: SS_LVL Mask */ - -#define SPI_SSR_SSR_Pos 0 /*!< SPI_T::SSR: SSR Position */ -#define SPI_SSR_SSR_Msk (3ul << SPI_SSR_SSR_Pos) /*!< SPI_T::SSR: SSR Mask */ - -/* SPI_DMA Bit Field Definitions */ -#define SPI_DMA_PDMA_RST_Pos 2 /*!< SPI_T::DMA: PDMA_RST Position */ -#define SPI_DMA_PDMA_RST_Msk (1ul << SPI_DMA_PDMA_RST_Pos) /*!< SPI_T::DMA: PDMA_RST Mask */ - -#define SPI_DMA_RX_DMA_GO_Pos 1 /*!< SPI_T::DMA: RX_DMA_GO Position */ -#define SPI_DMA_RX_DMA_GO_Msk (1ul << SPI_DMA_RX_DMA_GO_Pos) /*!< SPI_T::DMA: RX_DMA_GO Mask */ - -#define SPI_DMA_TX_DMA_GO_Pos 0 /*!< SPI_T::DMA: TX_DMA_GO Position */ -#define SPI_DMA_TX_DMA_GO_Msk (1ul << SPI_DMA_TX_DMA_GO_Pos) /*!< SPI_T::DMA: TX_DMA_GO Mask */ - -/* SPI_CNTRL2 Bit Field Definitions */ -#define SPI_CNTRL2_BCn_Pos 31 /*!< SPI_T::CNTRL2: BCn Position */ -#define SPI_CNTRL2_BCn_Msk (1ul << SPI_CNTRL2_BCn_Pos) /*!< SPI_T::CNTRL2: BCn Mask */ - -#define SPI_CNTRL2_SS_INT_OPT_Pos 16 /*!< SPI_T::CNTRL2: SS_INT_OPT Position */ -#define SPI_CNTRL2_SS_INT_OPT_Msk (1ul << SPI_CNTRL2_SS_INT_OPT_Pos) /*!< SPI_T::CNTRL2: SS_INT_OPT Mask */ - -#define SPI_CNTRL2_DUAL_IO_EN_Pos 13 /*!< SPI_T::CNTRL2: DUAL_IO_EN Position */ -#define SPI_CNTRL2_DUAL_IO_EN_Msk (1ul << SPI_CNTRL2_DUAL_IO_EN_Pos) /*!< SPI_T::CNTRL2: DUAL_IO_EN Mask */ - -#define SPI_CNTRL2_DUAL_IO_DIR_Pos 12 /*!< SPI_T::CNTRL2: DUAL_IO_DIR Position */ -#define SPI_CNTRL2_DUAL_IO_DIR_Msk (1ul << SPI_CNTRL2_DUAL_IO_DIR_Pos) /*!< SPI_T::CNTRL2: DUAL_IO_DIR Mask */ - -#define SPI_CNTRL2_SLV_START_INTSTS_Pos 11 /*!< SPI_T::CNTRL2: SLV_START_INTSTS Position */ -#define SPI_CNTRL2_SLV_START_INTSTS_Msk (1ul << SPI_CNTRL2_SLV_START_INTSTS_Pos) /*!< SPI_T::CNTRL2: SLV_START_INTSTS Mask */ - -#define SPI_CNTRL2_SSTA_INTEN_Pos 10 /*!< SPI_T::CNTRL2: SSTA_INTEN Position */ -#define SPI_CNTRL2_SSTA_INTEN_Msk (1ul << SPI_CNTRL2_SSTA_INTEN_Pos) /*!< SPI_T::CNTRL2: SSTA_INTEN Mask */ - -#define SPI_CNTRL2_SLV_ABORT_Pos 9 /*!< SPI_T::CNTRL2: SLV_ABORT Position */ -#define SPI_CNTRL2_SLV_ABORT_Msk (1ul << SPI_CNTRL2_SLV_ABORT_Pos) /*!< SPI_T::CNTRL2: SLV_ABORT Mask */ - -#define SPI_CNTRL2_NOSLVSEL_Pos 8 /*!< SPI_T::CNTRL2: NOSLVSEL Position */ -#define SPI_CNTRL2_NOSLVSEL_Msk (1ul << SPI_CNTRL2_NOSLVSEL_Pos) /*!< SPI_T::CNTRL2: NOSLVSEL Mask */ - -/* SPI_FIFO_CTL Bit Field Definitions */ -#define SPI_FIFO_CTL_TX_THRESHOLD_Pos 28 /*!< SPI_T::FIFO_CTL: TX_THRESHOLD Position */ -#define SPI_FIFO_CTL_TX_THRESHOLD_Msk (7ul << SPI_FIFO_CTL_TX_THRESHOLD_Pos) /*!< SPI_T::FIFO_CTL: TX_THRESHOLD Mask */ - -#define SPI_FIFO_CTL_RX_THRESHOLD_Pos 24 /*!< SPI_T::FIFO_CTL: RX_THRESHOLD Position */ -#define SPI_FIFO_CTL_RX_THRESHOLD_Msk (7ul << SPI_FIFO_CTL_RX_THRESHOLD_Pos) /*!< SPI_T::FIFO_CTL: RX_THRESHOLD Mask */ - -#define SPI_FIFO_CTL_TIMEOUT_INTEN_Pos 21 /*!< SPI_T::FIFO_CTL: TIMEOUT_INTEN Position */ -#define SPI_FIFO_CTL_TIMEOUT_INTEN_Msk (1ul << SPI_FIFO_CTL_TIMEOUT_INTEN_Pos) /*!< SPI_T::FIFO_CTL: TIMEOUT_INTEN Mask */ - -#define SPI_FIFO_CTL_RXOV_INTEN_Pos 6 /*!< SPI_T::FIFO_CTL: RXOV_INTEN Position */ -#define SPI_FIFO_CTL_RXOV_INTEN_Msk (1ul << SPI_FIFO_CTL_RXOV_INTEN_Pos) /*!< SPI_T::FIFO_CTL: RXOV_INTEN Mask */ - -#define SPI_FIFO_CTL_TX_INTEN_Pos 3 /*!< SPI_T::FIFO_CTL: TX_INTEN Position */ -#define SPI_FIFO_CTL_TX_INTEN_Msk (1ul << SPI_FIFO_CTL_TX_INTEN_Pos) /*!< SPI_T::FIFO_CTL: TX_INTEN Mask */ - -#define SPI_FIFO_CTL_RX_INTEN_Pos 2 /*!< SPI_T::FIFO_CTL: RX_INTEN Position */ -#define SPI_FIFO_CTL_RX_INTEN_Msk (1ul << SPI_FIFO_CTL_RX_INTEN_Pos) /*!< SPI_T::FIFO_CTL: RX_INTEN Mask */ - -#define SPI_FIFO_CTL_TX_CLR_Pos 1 /*!< SPI_T::FIFO_CTL: TX_CLR Position */ -#define SPI_FIFO_CTL_TX_CLR_Msk (1ul << SPI_FIFO_CTL_TX_CLR_Pos) /*!< SPI_T::FIFO_CTL: TX_CLR Mask */ - -#define SPI_FIFO_CTL_RX_CLR_Pos 0 /*!< SPI_T::FIFO_CTL: RX_CLR Position */ -#define SPI_FIFO_CTL_RX_CLR_Msk (1ul << SPI_FIFO_CTL_RX_CLR_Pos) /*!< SPI_T::FIFO_CTL: RX_CLR Mask */ - -/* SPI_STATUS Bit Field Definitions */ -#define SPI_STATUS_TX_FIFO_COUNT_Pos 28 /*!< SPI_T::STATUS: TX_FIFO_COUNT Position */ -#define SPI_STATUS_TX_FIFO_COUNT_Msk (0xFul << SPI_STATUS_TX_FIFO_COUNT_Pos) /*!< SPI_T::STATUS: TX_FIFO_COUNT Mask */ - -#define SPI_STATUS_TX_FULL_Pos 27 /*!< SPI_T::STATUS: TX_FULL Position */ -#define SPI_STATUS_TX_FULL_Msk (1ul << SPI_STATUS_TX_FULL_Pos) /*!< SPI_T::STATUS: TX_FULL Mask */ - -#define SPI_STATUS_TX_EMPTY_Pos 26 /*!< SPI_T::STATUS: TX_EMPTY Position */ -#define SPI_STATUS_TX_EMPTY_Msk (1ul << SPI_STATUS_TX_EMPTY_Pos) /*!< SPI_T::STATUS: TX_EMPTY Mask */ - -#define SPI_STATUS_RX_FULL_Pos 25 /*!< SPI_T::STATUS: RX_FULL Position */ -#define SPI_STATUS_RX_FULL_Msk (1ul << SPI_STATUS_RX_FULL_Pos) /*!< SPI_T::STATUS: RX_FULL Mask */ - -#define SPI_STATUS_RX_EMPTY_Pos 24 /*!< SPI_T::STATUS: RX_EMPTY Position */ -#define SPI_STATUS_RX_EMPTY_Msk (1ul << SPI_STATUS_RX_EMPTY_Pos) /*!< SPI_T::STATUS: RX_EMPTY Mask */ - -#define SPI_STATUS_TIMEOUT_Pos 20 /*!< SPI_T::STATUS: TIMEOUT Position */ -#define SPI_STATUS_TIMEOUT_Msk (1ul << SPI_STATUS_TIMEOUT_Pos) /*!< SPI_T::STATUS: TIMEOUT Mask */ - -#define SPI_STATUS_IF_Pos 16 /*!< SPI_T::STATUS: IF Position */ -#define SPI_STATUS_IF_Msk (1ul << SPI_STATUS_IF_Pos) /*!< SPI_T::STATUS: IF Mask */ - -#define SPI_STATUS_RX_FIFO_COUNT_Pos 12 /*!< SPI_T::STATUS: RX_FIFO_COUNT Position */ -#define SPI_STATUS_RX_FIFO_COUNT_Msk (0xFul << SPI_STATUS_RX_FIFO_COUNT_Pos) /*!< SPI_T::STATUS: RX_FIFO_COUNT Mask */ - -#define SPI_STATUS_SLV_START_INTSTS_Pos 11 /*!< SPI_T::STATUS: SLV_START_INTSTS Position */ -#define SPI_STATUS_SLV_START_INTSTS_Msk (1ul << SPI_STATUS_SLV_START_INTSTS_Pos) /*!< SPI_T::STATUS: SLV_START_INTSTS Mask */ - -#define SPI_STATUS_TX_INTSTS_Pos 4 /*!< SPI_T::STATUS: TX_INTSTS Position */ -#define SPI_STATUS_TX_INTSTS_Msk (1ul << SPI_STATUS_TX_INTSTS_Pos) /*!< SPI_T::STATUS: TX_INTSTS Mask */ - -#define SPI_STATUS_RX_OVERRUN_Pos 2 /*!< SPI_T::STATUS: RX_OVERRUN Position */ -#define SPI_STATUS_RX_OVERRUN_Msk (1ul << SPI_STATUS_RX_OVERRUN_Pos) /*!< SPI_T::STATUS: RX_OVERRUN Mask */ - -#define SPI_STATUS_RX_INTSTS_Pos 0 /*!< SPI_T::STATUS: RX_INTSTS Position */ -#define SPI_STATUS_RX_INTSTS_Msk (1ul << SPI_STATUS_RX_INTSTS_Pos) /*!< SPI_T::STATUS: RX_INTSTS Mask */ -/*@}*/ /* end of group REG_SPI_BITMASK */ -/*@}*/ /* end of group REG_SPI */ - - -/*---------------------------- Global Controller -----------------------------*/ -/** @addtogroup REG_SYS System Manger Controller (SYS) - Memory Mapped Structure for System Controller - @{ - */ - - -typedef struct -{ - - - -/** - * @var GCR_T::PDID - * Offset: 0x00 Part Device Identification Number Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |PDID |Part Device Identification Number - * | | |This register reflects device part number code. - * | | |Software can read this register to identify which device is used. - * @var GCR_T::RSTSRC - * Offset: 0x04 System Reset Source Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |RSTS_POR |Power-on Reset Flag - * | | |The RSTS_POR flag is set by the "Reset Signal" from the Power-On Reset (POR) controller or bit CHIP_RST (IPRSTC1[0]) to indicate the previous reset source. - * | | |0 = No reset from POR or CHIP_RST (IPRSTC1[0]). - * | | |1 = Power-on Reset (POR) or CHIP_RST (IPRSTC1[0]) had issued the reset signal to reset the system. - * | | |Note: This bit can be cleared by writing "1" to it. - * |[1] |RSTS_RESET|Reset Pin Reset Flag - * | | |The RSTS_RESET flag is set by the "Reset Signal" from the nRESET Pin to indicate the previous reset source. - * | | |0 = No reset from nRESET pin. - * | | |1 = The Pin nRESET had issued the reset signal to reset the system. - * | | |Note: This bit can be cleared by writing "1" to it. - * |[2] |RSTS_WDT |Watchdog Reset Flag - * | | |The RSTS_WDT flag is set by the "Reset Signal" from the Watchdog Timer to indicate the previous reset source - * | | |0 = No reset from watchdog timer. - * | | |1 = The watchdog timer had issued the reset signal to reset the system. - * | | |Note1: This bit can be cleared by writing "1" to it. - * | | |Note2: - * | | |Watchdog Timer register WTRF (WTCR[2]) bit is set if the system has been reset by WDT time-out reset. - * | | |Window Watchdog Timer register WWDTRF (WWDTSR[1]) bit is set if the system has been reset by WWDT time-out reset. - * |[3] |RSTS_LVR |Low Voltage Reset Flag - * | | |The RSTS_LVR flag is set by the "Reset Signal" from the Low-Voltage-Reset controller to indicate the previous reset source. - * | | |0 = No reset from LVR. - * | | |1 = The LVR controller had issued the reset signal to reset the system. - * | | |Note: This bit can be cleared by writing "1" to it. - * |[4] |RSTS_BOD |Brown-out Detector Reset Flag - * | | |The RSTS_BOD flag is set by the "Reset Signal" from the Brown-out Detector to indicate the previous reset source. - * | | |0 = No reset from BOD. - * | | |1 = The BOD had issued the reset signal to reset the system. - * | | |Note: This bit can be cleared by writing "1" to it. - * |[5] |RSTS_SYS |SYS Reset Flag - * | | |The RSTS_SYS flag is set by the "Reset Signal" from the Cortex-M0 kernel to indicate the previous reset source. - * | | |0 = No reset from Cortex-M0. - * | | |1 = The Cortex-M0 had issued the reset signal to reset the system by writing 1 to bit SYSRESETREQ (AIRCR[2], Application Interrupt and Reset Control Register, address = 0xE000ED0C) in system control registers of Cortex-M0 kernel. - * | | |Note: This bit can be cleared by writing "1" to it. - * |[7] |RSTS_CPU |CPU Reset Flag - * | | |The RSTS_CPU flag is set by hardware if software writes CPU_RST (IPRSTC1[1]) 1 to reset Cortex-M0 CPU kernel and flash Memory Controller (FMC) - * | | |0 = No reset from CPU. - * | | |1 = Cortex-M0 CPU kernel and FMC are reset by software setting CPU_RST (IPRSTC1[1]) to 1. - * | | |Note: This bit can be cleared by writing "1" to it. - * @var GCR_T::IPRSTC1 - * Offset: 0x08 Peripheral Reset Control Register 1 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |CHIP_RST |CHIP One-shot Reset (Write Protect) - * | | |Setting this bit will reset the whole chip, including CPU kernel and all peripherals, and this bit will automatically return to 0 after the 2 clock cycles. - * | | |The CHIP_RST is the same as the POR reset, all the chip controllers are reset and the chip setting from flash are also reload. - * | | |0 = CHIP normal operation. - * | | |1 = CHIP one-shot reset. - * | | |Note: This bit is write protected. Refer to the REGWRPROT register. - * |[1] |CPU_RST |CPU Kernel One-shot Reset (Write Protect) - * | | |Setting this bit will only reset the CPU kernel and Flash Memory Controller(FMC), and this bit will automatically return 0 after the two clock cycles - * | | |0 = CPU normal operation. - * | | |1 = CPU one-shot reset. - * | | |Note: This bit is write protected. Refer to the REGWRPROT register. - * |[2] |PDMA_RST |PDMA Controller Reset (Write Protect) - * | | |Setting this bit to 1 will generate a reset signal to the PDMA. User need to set this bit to 0 to release from reset state. - * | | |0 = PDMA controller normal operation. - * | | |1 = PDMA controller reset. - * | | |Note: This bit is write protected. Refer to the REGWRPROT register. - * @var GCR_T::IPRSTC2 - * Offset: 0x0C Peripheral Reset Control Register 2 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[1] |GPIO_RST |GPIO Controller Reset - * | | |0 = GPIO controller normal operation. - * | | |1 = GPIO controller reset. - * |[2] |TMR0_RST |Timer0 Controller Reset - * | | |0 = Timer0 controller normal operation. - * | | |1 = Timer0 controller reset. - * |[3] |TMR1_RST |Timer1 Controller Reset - * | | |0 = Timer1 controller normal operation. - * | | |1 = Timer1 controller reset. - * |[4] |TMR2_RST |Timer2 Controller Reset - * | | |0 = Timer2 controller normal operation. - * | | |1 = Timer2 controller reset. - * |[5] |TMR3_RST |Timer3 Controller Reset - * | | |0 = Timer3 controller normal operation. - * | | |1 = Timer3 controller reset. - * |[8] |I2C0_RST |I2C0 Controller Reset - * | | |0 = I2C0 controller normal operation. - * | | |1 = I2C0 controller reset. - * |[9] |I2C1_RST |I2C1 Controller Reset - * | | |0 = I2C1 controller normal operation. - * | | |1 = I2C1 controller reset. - * |[12] |SPI0_RST |SPI0 Controller Reset - * | | |0 = SPI0 controller normal operation. - * | | |1 = SPI0 controller reset. - * |[13] |SPI1_RST |SPI1 Controller Reset - * | | |0 = SPI1 controller normal operation. - * | | |1 = SPI1 controller reset. - * |[14] |SPI2_RST |SPI2 Controller Reset - * | | |0 = SPI2 controller normal operation. - * | | |1 = SPI2 controller reset. - * |[16] |UART0_RST |UART0 Controller Reset - * | | |0 = UART0 controller normal operation. - * | | |1 = UART0 controller reset. - * |[17] |UART1_RST |UART1 Controller Reset - * | | |0 = UART1 controller normal operation. - * | | |1 = UART1 controller reset. - * |[20] |PWM03_RST |PWM03 Controller Reset - * | | |0 = PWM03 controller normal operation. - * | | |1 = PWM03 controller reset. - * |[23] |PS2_RST |PS/2 Controller Reset - * | | |0 = PS/2 controller normal operation. - * | | |1 = PS/2 controller reset. - * |[27] |USBD_RST |USB Device Controller Reset - * | | |0 = USB device controller normal operation. - * | | |1 = USB device controller reset. - * |[28] |ADC_RST |ADC Controller Reset - * | | |0 = ADC controller normal operation. - * | | |1 = ADC controller reset. - * |[29] |I2S_RST |I2S Controller Reset - * | | |0 = I2S controller normal operation. - * | | |1 = I2S controller reset. - * @var GCR_T::BODCR - * Offset: 0x18 Brown-out Detector Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |BOD_EN |Brown-out Detector Enable Bit (Write Protect) - * | | |The default value is set by flash controller user configuration register CBODEN (Config0[23]) bit. - * | | |0 = Brown-out Detector function Disabled. - * | | |1 = Brown-out Detector function Enabled. - * | | |Note: This bit is write protected. Refer to the REGWRPROT register. - * |[2:1] |BOD_VL |Brown-out Detector Threshold Voltage Selection (Write Protect) - * | | |The default value is set by flash memory controller user configuration register CBOV (Config0[22:21]) bits. - * | | |00 = Brown-out voltage is 2.2V. - * | | |01 = Brown-out voltage is 2.7V. - * | | |10 = Brown-out voltage is 3.7V. - * | | |11 = Brown-out voltage is 4.4V. - * | | |Note: This bit is write protected. Refer to the REGWRPROT register. - * |[3] |BOD_RSTEN |Brown-out Reset Enable Bit (Write Protect) - * | | |0 = Brown-out "INTERRUPT" function Enabled. - * | | |1 = Brown-out "RESET" function Enabled. - * | | |While the Brown-out Detector function is enabled (BOD_EN high) and BOD reset function is enabled (BOD_RSTEN high), BOD will assert a signal to reset chip when the detected voltage is lower than the threshold (BOD_OUT high). - * | | |Note1: While the BOD function is enabled (BOD_EN high) and BOD interrupt function is enabled (BOD_RSTEN low), BOD will assert an interrupt if BOD_OUT is high. - * | | |BOD interrupt will keep till to the BOD_EN set to 0. - * | | |BOD interrupt can be blocked by disabling the NVIC BOD interrupt or disabling BOD function (set BOD_EN low). - * | | |Note2: The default value is set by flash controller user configuration register CBORST (Config0[20]) bit. - * | | |Note3: This bit is write protected. Refer to the REGWRPROT register. - * |[4] |BOD_INTF |Brown-out Detector Interrupt Flag - * | | |0 = Brown-out Detector does not detect any voltage draft at VDD down through or up through the voltage of BOD_VL setting. - * | | |1 = When Brown-out Detector detects the VDD is dropped down through the voltage of BOD_VL setting or the VDD is raised up through the voltage of BOD_VL setting, this bit is set to 1 and the Brown-out interrupt is requested if Brown-out interrupt is enabled. - * | | |Note: This bit can be cleared to 0 by software writing "1". - * |[5] |BOD_LPM |Brown-out Detector Low Power Mode (Write Protect) - * | | |0 = BOD operated in Normal mode (default). - * | | |1 = BOD Low Power mode Enabled. - * | | |Note1: The BOD consumes about 100 uA in Normal mode, and the low power mode can reduce the current to about 1/10 but slow the BOD response. - * | | |Note2: This bit is write protected. Refer to the REGWRPROT register. - * |[6] |BOD_OUT |Brown-out Detector Output Status - * | | |0 = Brown-out Detector output status is 0. It means the detected voltage is higher than BOD_VL setting or BOD_EN is 0. - * | | |1 = Brown-out Detector output status is 1. It means the detected voltage is lower than BOD_VL setting. If the BOD_EN is 0, BOD function disabled , this bit always responds to 0. - * |[7] |LVR_EN |Low Voltage Reset Enable Bit (Write Protect) - * | | |The LVR function reset the chip when the input power voltage is lower than LVR circuit setting. - * | | |LVR function is enabled by default. - * | | |0 = Low Voltage Reset function Disabled. - * | | |1 = Low Voltage Reset function Enabled - After enabling the bit, the LVR function will be active with 100us delay for LVR output stable (default). - * | | |Note: This bit is write protected. Refer to the REGWRPROT register. - * @var GCR_T::PORCR - * Offset: 0x24 Power-on-Reset Controller Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |POR_DIS_CODE|Power-on-Reset Enable Bis (Write Protect) - * | | |When powered on, the POR circuit generates a reset signal to reset the whole chip function, but noise on the power may cause the POR active again. User can disable internal POR circuit to avoid unpredictable noise to cause chip reset by writing 0x5AA5 to this field. - * | | |The POR function will be active again when this field is set to another value or chip is reset by other reset source, including: nRESET, Watchdog, LVR reset, BOD reset, ICE reset command and the software-chip reset function. - * | | |Note: This bit is write protected. Refer to the REGWRPROT register. - * @var GCR_T::GPA_MFP - * Offset: 0x30 GPIOA Multiple Function and Input Type Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[10] |GPA_MFP10 |PA.10 Pin Function Selection - * | | |Bits PA10_MFP1 (ALT_MFP[12]) and GPA_MFP[10] determine the PA.10 function. - * | | |(PA10_MFP1 (ALT_MFP[12]), GPA_MFP[10]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = I2C1_SDA function is selected. - * | | |(1, 0) = SPI1_MISO0 function is selected. - * | | |(1, 1) = SPI2_MISO0 function is selected. - * |[11] |GPA_MFP11 |PA.11 Pin Function Selection - * | | |Bits PA11_MFP1 (ALT_MFP[11]) and GPA_MFP[11] determine the PA.11 function. - * | | |(PA11_MFP1 (ALT_MFP[11]), GPA_MFP[11]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = I2C1_SCL function is selected. - * | | |(1, 0) = SPI1_CLK function is selected. - * | | |(1, 1) = SPI2_MOSI0 function is selected. - * |[12] |GPA_MFP12 |PA.12 Pin Function Selection - * | | |Bit GPA_MFP[12] determines the PA.12 function. - * | | |0 = GPIO function is selected. - * | | |1 = PWM0 function is selected. - * |[13] |GPA_MFP13 |PA.13 Pin Function Selection - * | | |Bit GPA_MFP[13] determines the PA.13 function. - * | | |0 = GPIO function is selected. - * | | |1 = PWM1 function is selected. - * |[14] |GPA_MFP14 |PA.14 Pin Function Selection - * | | |Bit GPA_MFP[14] determines the PA.14 function. - * | | |0 = GPIO function is selected. - * | | |1 = PWM2 function is selected. - * |[15] |GPA_MFP15 |PA.15 Pin Function Selection - * | | |Bits PA15_MFP1 (ALT_MFP[9]) and GPA_MFP[15] determine the PA.15 function. - * | | |(PA15_MFP1 (ALT_MFP[9]), GPA_MFP[15]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = PWM3 function is selected. - * | | |(1, 0) = CLKO function is selected. - * | | |(1, 1) = I2S_MCLK function is selected. - * |[31:16] |GPA_TYPEn |Schmitt Trigger Function Selection - * | | |0 = GPIOA[15:0] I/O input Schmitt Trigger function Disabled. - * | | |1 = GPIOA[15:0] I/O input Schmitt Trigger function Enabled. - * @var GCR_T::GPB_MFP - * Offset: 0x34 GPIOB Multiple Function and Input Type Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |GPB_MFP0 |PB.0 Pin Function Selection - * | | |Bit GPB_MFP[0] determines the PB.0 function. - * | | |0 = GPIO function is selected. - * | | |1 = UART0_RXD function is selected. - * |[1] |GPB_MFP1 |PB.1 Pin Function Selection - * | | |Bit GPB_MFP[1] determines the PB.1 function. - * | | |0 = GPIO function is selected. - * | | |1 = UART0_TXD0 function is selected. - * |[2] |GPB_MFP2 |PB.2 Pin Function Selection - * | | |Bits PB2_MFP1(ALT_MFP[26]) and GPB_MFP[2] determine the PB.2 function. - * | | |(PB2_MFP1 (ALT_MFP[26]), GPB_MFP[2]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = UART0_nRTS function is selected. - * | | |(1, 1) = TM2_EXT function is selected. - * |[3] |GPB_MFP3 |PB.3 Pin Function Selection - * | | |Bits PB3_MFP1 (ALT_MFP[27]) and GPB_MFP[3] determine the PB.3 function. - * | | |(PB3_MFP1 (ALT_MFP[27]), GPB_MFP[3]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = UART0_nCTS function is selected. - * | | |(1, 1) = TM3_EXT function is selected. - * |[4] |GPB_MFP4 |PB.4 Pin Function Selection - * | | |Bits PB4_MFP1 (ALT_MFP[15]) and GPB_MFP[4] determine the PB.4 function. - * | | |(PB4_MFP1 (ALT_MFP[15]), GPB_MFP[4]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = UART1_RXD function is selected. - * | | |(1, 0) = SPI2_SS0 function is selected. - * | | |(1, 1) = SPI1_SS1 function is selected. - * |[5] |GPB_MFP5 |PB. 5 Pin Function Selection - * | | |Bits PB5_MFP1 (ALT_MFP[18]) and GPB_MFP[5] determine the PB.5 function. - * | | |(PB5_MFP1 (ALT_MFP[18]), GPB_MFP[5]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = UART1_TXD function is selected. - * | | |(1, 1) = SPI2_CLK function is selected. - * |[6] |GPB_MFP6 |PB.6 Pin Function Selection - * | | |Bits PB6_MFP1 (ALT_MFP[17]) and GPB_MFP[6] determine the PB.6 function. - * | | |(PB6_MFP1 (ALT_MFP[17]), GPB_MFP[6]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = UART1_nRTS function is selected. - * | | |(1, 1) = SPI2_MOSI0 function is selected. - * |[7] |GPB_MFP7 |PB.7 Pin Function Selection - * | | |Bits PB7_MFP1 (ALT_MFP[16]) and GPB_MFP[7] determine the PB.7 function. - * | | |(PB7_MFP1 (ALT_MFP[16]), GPB_MFP[7]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = UART1_nCTS function is selected. - * | | |(1, 1) = SPI2_MISO0 function is selected. - * |[8] |GPB_MFP8 |PB.8 Pin Function Selection - * | | |Bit GPB_MFP[8] determines the PB.8 function. - * | | |0 = GPIO function is selected. - * | | |1 = TM0 function is selected. - * |[9] |GPB_MFP9 |PB.9 Pin Function Selection - * | | |Bits PB9_MFP1 (ALT_MFP[1]) and GPB_MFP[9] determine the PB.9 function. - * | | |(PB9_MFP1 (ALT_MFP[1]), GPB_MFP[9]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = TM1 function is selected. - * | | |(1, 0) = PWM1 function is selected. (NUC123xxxAEx Only) - * | | |(1, 1) = SPI1_SS1 function is selected. - * |[10] |GPB_MFP10 |PB.10 Pin Function Selection - * | | |Bit GPB_MFP[10] determines the PB.10 function. - * | | |(PB10_MFP1 (ALT_MFP[0]), GPB_MFP[10]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = TM2 function is selected. - * | | |(1, 1) = SPI0_SS1 function is selected. - * |[12] |GPB_MFP12 |PB.12 Pin Function Selection - * | | |Bits PB12_MFP1 (ALT_MFP[10]) and GPB_MFP[12] determine the PB.12 function. - * | | |(PB12_MFP1 (ALT_MFP[10]), GPB_MFP[12]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI1_SS0 function is selected. - * | | |(1, 1) = CLKO function is selected. - * |[13] |GPB_MFP13 |PB.13 Pin Function Selection - * | | |Bit GPB_MFP[13] determines the PB.13 function. - * | | |0 = GPIO function is selected. - * |[14] |GPB_MFP14 |PB.14 Pin Function Selection - * | | |Bit GPB_MFP[14] determines PB.14 function. - * | | |0 = GPIO function is selected. - * | | |1 = INT0 function is selected. - * |[15] |GPB_MFP15 |PB.15 Pin Function Selection - * | | |Bits PB15_MFP1 (ALT_MFP[24]) and GPB_MFP[15] determine the PB.15 function. - * | | |(PB15_MFP1 (ALT_MFP[24]), GPB_MFP[15]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = INT1 function is selected. - * | | |(1, 1) = TM0_EXT function is selected. - * |[31:16] |GPB_TYPEn |Schmitt Trigger Function Selection - * | | |0 = GPIOB[15:0] I/O input Schmitt Trigger function Disabled. - * | | |1 = GPIOB[15:0] I/O input Schmitt Trigger function Enabled. - * @var GCR_T::GPC_MFP - * Offset: 0x38 GPIOC Multiple Function and Input Type Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |GPC_MFP0 |PC.0 Pin Function Selection - * | | |Bits PC0_MFP1 (ALT_MFP[5]) and GPC_MFP[0] determine the PC.0 function. - * | | |(PC0_MFP1 (ALT_MFP[5]), GPC_MFP[0]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI0_SS0 function is selected. - * | | |(1, 1) = I2S_LRCLK function is selected. - * |[1] |GPC_MFP1 |PC.1 Pin Function Selection - * | | |Bits PC1_MFP1 (ALT_MFP[6]) and GPC_MFP[1] determine the PC.1 function. - * | | |(PC1_MFP1 (ALT_MFP[6]), GPC_MFP[1]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI0_CLK function is selected. - * | | |(1, 1) = I2S_BCLK function is selected. - * |[2] |GPC_MFP2 |PC.2 Pin Function Selection - * | | |Bits PC2_MFP1 (ALT_MFP[7]) and GPC_MFP[2] determine the PC.2 function. - * | | |(PC2_MFP1 (ALT_MFP[7]), GPC_MFP[2]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI0_MISO0 function is selected. - * | | |(1, 1) = I2S_DI function is selected. - * |[3] |GPC_MFP3 |PC.3 Pin Function Selection - * | | |Bits PC3_MFP1 (ALT_MFP[8]) and GPC_MFP[3] determine the PC.3 function. - * | | |(PC3_MFP1 (ALT_MFP[8]), GPC_MFP[3]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI0_MOSI0 function is selected. - * | | |(1, 1) = I2S_DO function is selected. - * |[4] |GPC_MFP4 |PC.4 Pin Function Selection - * | | |Bits PC4_MFP1 (ALT_MFP[29]) and GPC_MFP[4] determine the PC.4 function. - * | | |(PC4_MFP1 (ALT_MFP[29]), GPC_MFP[4]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI0_MISO1 function is selected. - * | | |(1, 1) = UART0_RXD function is selected. - * |[5] |GPC_MFP5 |PC.5 Pin Function Selection - * | | |Bits PC5_MFP1 (ALT_MFP[30]) and GPC_MFP[5] determine the PC.5 function. - * | | |(PC5_MFP1 (ALT_MFP[30]), GPC_MFP[5]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI0_MOSI1 function is selected. - * | | |(1, 1) = UART0_TXD function is selected. - * |[8] |GPC_MFP8 |PC.8 Pin Function Selection - * | | |Bits PC8_MFP1 (ALT_MFP1[23]) and GPC_MFP[8] determine the PC.8 function. - * | | |(PC8_MFP1 (ALT_MFP1[23]), GPC_MFP[8]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI1_SS0 function is selected. - * | | |(1, 1) = PWM0 function is selected. (NUC123xxxAEx Only) - * |[9] |GPC_MFP9 |PC.9 Pin Function Selection - * | | |Bit GPC_MFP[9] determines the PC.9 function. - * | | |0 = GPIO function is selected. - * | | |1 = SPI1_CLK function is selected. - * |[10] |GPC_MFP10 |PC.10 Pin Function Selection - * | | |Bit GPC_MFP[10] determines the PC.10 function. - * | | |0 = GPIO function is selected. - * | | |1 = SPI1_MISO0 function is selected. - * |[11] |GPC_MFP11 |PC.11 Pin Function Selection - * | | |Bit GPC_MFP[11] determines the PC.11 function. - * | | |0 = GPIO function is selected. - * | | |1 = SPI1_MOSI0 function is selected. - * |[12] |GPC_MFP12 |PC.12 Pin Function Selection - * | | |Bits PC12_MFP1 (ALT_MFP[20]) and GPC_MFP[12] determine the PC.12 function. - * | | |(PC12_MFP1 (ALT_MFP[20]), GPC_MFP[12]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI1_MISO1 function is selected. - * | | |(1, 0) = I2S_MCLK function is selected. - * | | |(1, 1) = PWM2 function is selected. - * |[13] |GPC_MFP13 |PC.13 Pin Function Selection - * | | |Bits PC13_MFP1 (ALT_MFP[21]) and GPC_MFP[13] determine the PC.13 function. - * | | |(PC13_MFP1 (ALT_MFP[21]), GPC_MFP[13]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI1_MOSI1 function is selected. - * | | |(1, 0) = CLKO function is selected. - * | | |(1, 1) = PWM3 function is selected. - * |[31:16] |GPC_TYPEn |Schmitt Trigger Function Selection - * | | |0 = GPIOC[15:0] I/O input Schmitt Trigger function Disabled. - * | | |1 = GPIOC[15:0] I/O input Schmitt Trigger function Enabled. - * @var GCR_T::GPD_MFP - * Offset: 0x3C GPIOD Multiple Function and Input Type Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |GPD_MFP0 |PD.0 Pin Function Selection - * | | |Bits PD0_MFP1 (ALT_MFP1[16]) and GPD_MFP[0] determine the PD.0 function. - * | | |(PD0_MFP1 (ALT_MFP1[16]), GPD_MFP[0]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(1, 0) = SPI2_SS0 function is selected. - * | | |(1, 1) = ADC0 function is selected. - * |[1] |GPD_MFP1 |PD.1 Pin Function Selection - * | | |Bits PD1_MFP1 (ALT_MFP1[17]) and GPD_MFP[1] determine the PD.1 function. - * | | |(PD1_MFP1 (ALT_MFP1[17]), GPD_MFP[1]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI0_SS1 function is selected. - * | | |(1, 0) = SPI2_CLK function is selected. - * | | |(1, 1) = ADC1 function is selected. - * |[2] |GPD_MFP2 |PD.2 Pin Function Selection - * | | |Bits PD2_MFP1 (ALT_MFP1[18]) and GPD_MFP[2] determine the PD.2 function. - * | | |(PD2_MFP1 (ALT_MFP1[18]), GPD_MFP[2]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI0_MISO1 function is selected. - * | | |(1, 0) = SPI2_MISO0 function is selected. - * | | |(1, 1) = ADC2 function is selected. - * |[3] |GPD_MFP3 |PD.3 Pin Function Selection - * | | |Bits PD3_MFP1 (ALT_MFP1[19]) and GPD_MFP[3] determine the PD.3 function. - * | | |(PD3_MPF1 (ALT_MFP1[19]), GPD_MFP[3]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI0_MOSI1 function is selected. - * | | |(1, 0) = SPI2_MOSI0 function is selected. - * | | |(1, 1) = ADC3 function is selected. - * |[4] |GPD_MFP4 |PD.4 Pin Function Selection - * | | |Bits PD4_MFP1 (ALT_MFP1[20]) and GPD_MFP[4] determine the PD.4 function. - * | | |(PD4_MFP1 (ALT_MFP1[20]), GPD_MFP[4]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(1, 0) = SPI2_MISO1 function is selected. - * | | |(1, 1) = ADC4 function is selected. - * |[5] |GPD_MFP5 |PD.5 Pin Function Selection - * | | |Bits PD5_MFP1 (ALT_MFP1[21]) and GPD_MFP[5] determine the PD.5 function. - * | | |(PD5_MFP1 (ALT_MFP1[21]), GPD_MFP[5]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(1, 0) = SPI2_MOSI1 function is selected. - * | | |(1, 1) = ADC5 function is selected. - * |[8] |GPD_MFP8 |PD.8 Pin Function Selection - * | | |Bit GPD_MFP[8] determines the PD.8 function. - * | | |0 = GPIO function is selected. - * | | |1 = SPI1_MOSI0 function is selected. - * |[9] |GPD_MFP9 |PD.9 Pin Function Selection - * | | |it GPD_MFP[9] determines the PD.9 function. - * | | |0 = GPIO function is selected. - * |[10] |GPD_MFP10 |PD.10 Pin Function Selection - * | | |Bit GPD_MFP[10] determines the PD.10 function. - * | | |0 = GPIO function is selected. - * | | |1 = CLKO function is selected. - * |[11] |GPD_MFP11 |PD.11 Pin Function Selection - * | | |Bit GPD_MFP[11] determines the PD.11 function. - * | | |0 = GPIO function is selected. - * | | |1 = INT1 function is selected. - * |[31:16] |GPD_TYPEn |Schmitt Trigger Function Selection - * | | |0 = GPIOD[15:0] I/O input Schmitt Trigger function Disabled. - * | | |1 = GPIOD[15:0] I/O input Schmitt Trigger function Enabled. - * @var GCR_T::GPF_MFP - * Offset: 0x44 GPIOF Multiple Function and Input Type Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |GPF_MFP0 |PF.0 Pin Function Selection - * | | |Bit GPF_MFP[0] determines the PF.0 function. - * | | |0 = GPIO function is selected. - * | | |1 = XT1_OUT function is selected. - * | | |Note1: For NUC123xxxANx, the value of this bit is controlled by CGPFMFP (Config0[27]) when power-up, user can write this bit after chip power-up. - * | | |Note2: For NUC123xxxAEx, the value of this bit is controlled by CGPFMFP (Config0[27]). - * |[1] |GPF_MFP1 |PF.1 Pin Function Selection - * | | |Bit GPF_MFP[1] determines the PF.1 function. - * | | |0 = GPIO function is selected. - * | | |1 = XT1_IN function is selected. - * | | |Note1: For NUC123xxxANx, the value of this bit is controlled by CGPFMFP (Config0[27]) when power-up, user can write this bit after chip power-up. - * | | |Note2: For NUC123xxxAEx, the value of this bit is controlled by CGPFMFP (Config0[27]). - * |[2] |GPF_MFP2 |PF.2 Pin Function Selection - * | | |Bits PF2_MFP1 (ALT_MFP1[25:24]) and GPF_MFP[2] determine the PF.2 function. - * | | |(PF2_MFP1 (ALT_MFP1[25:24]), GPF_MFP[2]) value and function mapping are as following list. - * | | |(00, 0) = GPIO function is selected. - * | | |(00, 1) = PS2_DAT function is selected. - * | | |(10, 1) = I2C0_SDA function is selected. - * | | |(11, 1) = ADC6 function is selected. - * | | |The reset value of this bit is 1. - * |[3] |GPF_MFP3 |PF.3 Pin Function Selection - * | | |Bits PF3_MFP1 (ALT_MFP1[27:26]) and GPF_MFP[3] determine the PF.3 function. - * | | |(PF3_MFP1 (ALT_MFP1[27:26]), GPF_MFP[3]) value and function mapping are as following list. - * | | |(00, 0) = GPIO function is selected. - * | | |(00, 1) = PS2_CLK function is selected. - * | | |(10, 1) = I2C0_SCL function is selected. - * | | |(11, 1) = ADC7 function is selected. - * | | |The reset value of this bit is 1. - * |[19:16] |GPF_TYPEn |Schmitt Trigger Function Selection - * | | |0 = GPIOF[3:0] I/O input Schmitt Trigger function Disabled. - * | | |1 = GPIOF[3:0] I/O input Schmitt Trigger function Enabled. - * @var GCR_T::ALT_MFP - * Offset: 0x50 Alternative Multiple Function Pin Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |PB10_MFP1 |PB.10 Pin Alternate Function Selection - * | | |Bit GPB_MFP[10] determines the PB.10 function. - * | | |(PB10_MFP1 (ALT_MFP[0]), GPB_MFP[10]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = TM2 function is selected. - * | | |(1, 1) = SPI0_SS1 function is selected. - * |[1] |PB9_MFP1 |PB.9 Pin Alternate Function Selection - * | | |Bits PB9_MFP1 (ALT_MFP[1]) and GPB_MFP[9] determine the PB.9 function. - * | | |(PB9_MFP1 (ALT_MFP[1]), GPB_MFP[9]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = TM1 function is selected. - * | | |(1, 0) = PWM1 function is selected. (NUC123xxxAEx Only) - * | | |(1, 1) = SPI1_SS1 function is selected. - * |[5] |PC0_MFP1 |PC.0 Pin Alternate Function Selection - * | | |Bits PC0_MFP1 (ALT_MFP[5]) and GPC_MFP[0] determine the PC.0 function. - * | | |(PC0_MFP1 (ALT_MFP[5]), GPC_MFP[0]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI0_SS0 function is selected. - * | | |(1, 1) = I2S_LRCLK function is selected. - * |[6] |PC1_MFP1 |PC.1 Pin Alternate Function Selection - * | | |Bits PC1_MFP1 (ALT_MFP[6]) and GPC_MFP[1] determine the PC.1 function. - * | | |(PC1_MFP1 (ALT_MFP[6]), GPC_MFP[1]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI0_CLK function is selected. - * | | |(1, 1) = I2S_BCLK function is selected. - * |[7] |PC2_MFP1 |PC.2 Pin Alternate Function Selection - * | | |Bits PC2_MFP1 (ALT_MFP[7]) and GPC_MFP[2] determine the PC.2 function. - * | | |(PC2_MFP1 (ALT_MFP[7]), GPC_MFP[2]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI0_MISO0 function is selected. - * | | |(1, 1) = I2S_DI function is selected. - * |[8] |PC3_MFP1 |PC.3 Pin Alternate Function Selection - * | | |Bits PC3_MFP1 (ALT_MFP[8]) and GPC_MFP[3] determine the PC.3 function. - * | | |(PC3_MFP1 (ALT_MFP[8]), GPC_MFP[3]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI0_MOSI0 function is selected. - * | | |(1, 1) = I2S_DO function is selected. - * |[9] |PA15_MFP1 |PA.15 Pin Alternate Function Selection - * | | |Bits PA15_MFP1 (ALT_MFP[9]) and GPA_MFP[15] determine the PA.15 function. - * | | |(PA15_MFP1 (ALT_MFP[9]), GPA_MFP[15]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = PWM3 function is selected. - * | | |(1, 0) = CLKO function is selected. - * | | |(1, 1) = I2S_MCLK function is selected. - * |[10] |PB12_MFP1 |PB.12 Pin Alternate Function Selection - * | | |Bits PB12_MFP1 (ALT_MFP[10]) and GPB_MFP[12] determine the PB.12 function. - * | | |(PB12_MFP1 (ALT_MFP[10]), GPB_MFP[12]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI1_SS0 function is selected. - * | | |(1, 1) = CLKO function is selected. - * |[11] |PA11_MFP1 |PA.11 Pin Alternate Function Selection - * | | |Bits PA11_MFP1 (ALT_MFP[11]) and GPA_MFP[11] determine the PA.11 function. - * | | |(PA11_MFP1 (ALT_MFP[11]), GPA_MFP[11]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = I2C1_SCL function is selected. - * | | |(1, 0) = SPI1_CLK function is selected. - * | | |(1, 1) = SPI2_MOSI0 function is selected. - * |[12] |PA10_MFP1 |PA.10 Pin Alternate Function Selection - * | | |Bits PA10_MFP1 (ALT_MFP[12]) and GPA_MFP[10] determine the PA.10 function. - * | | |(PA10_MFP1 (ALT_MFP[12]), GPA_MFP[10]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = I2C1_SDA function is selected. - * | | |(1, 0) = SPI1_MISO0 function is selected. - * | | |(1, 1) = SPI2_MISO0 function is selected. - * |[15] |PB4_MFP1 |PB.4 Pin Alternate Function Selection - * | | |Bits PB4_MFP1 (ALT_MFP[15]) and GPB_MFP[4] determine the PB.4 function. - * | | |(PB4_MFP1 (ALT_MFP[15]), GPB_MFP[4]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = UART1_RXD function is selected. - * | | |(1, 0) = SPI2_SS0 function is selected. - * | | |(1, 1) = SPI1_SS1 function is selected. - * |[16] |PB7_MFP1 |PB.7 Pin Alternate Function Selection - * | | |Bits PB7_MFP1 (ALT_MFP[16]) and GPB_MFP[7] determine the PB.7 function. - * | | |(PB7_MFP1 (ALT_MFP[16]), GPB_MFP[7]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = UART1_nCTS function is selected. - * | | |(1, 1) = SPI2_MISO0 function is selected. - * |[17] |PB6_MFP1 |PB.6 Pin Alternate Function Selection - * | | |Bits PB6_MFP1 (ALT_MFP[17]) and GPB_MFP[6] determine the PB.6 function. - * | | |(PB6_MFP1 (ALT_MFP[17]), GPB_MFP[6]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = UART1_nRTS function is selected. - * | | |(1, 1) = SPI2_MOSI0 function is selected. - * |[18] |PB5_MFP1 |PB. 5 Pin Alternate Function Selection - * | | |Bits PB5_MFP1 (ALT_MFP[18]) and GPB_MFP[5] determine the PB.5 function. - * | | |(PB5_MFP1 (ALT_MFP[18]), GPB_MFP[5]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = UART1_TXD function is selected. - * | | |(1, 1) = SPI2_CLK function is selected. - * |[20] |PC12_MFP1 |PC.12 Pin Alternate Function Selection - * | | |Bits PC12_MFP1 (ALT_MFP[20]) and GPC_MFP[12] determine the PC.12 function. - * | | |(PC12_MFP1 (ALT_MFP[20]), GPC_MFP[12]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI1_MISO1 function is selected. - * | | |(1, 0) = I2S_MCLK function is selected. - * | | |(1, 1) = PWM2 function is selected. - * |[21] |PC13_MFP1 |PC.13 Pin Alternate Function Selection - * | | |Bits PC13_MFP1 (ALT_MFP[21]) and GPC_MFP[13] determine the PC.13 function. - * | | |(PC13_MFP1 (ALT_MFP[21]), GPC_MFP[13]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI1_MOSI1 function is selected. - * | | |(1, 0) = CLKO function is selected. - * | | |(1, 1) = PWM3 function is selected. - * |[24] |PB15_MFP1 |PB.15 Pin Alternate Function Selection - * | | |Bits PB15_MFP1 (ALT_MFP[24]) and GPB_MFP[15] determine the PB.15 function. - * | | |(PB15_MFP1 (ALT_MFP[24]), GPB_MFP[15]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = INT1 function is selected. - * | | |(1, 1) = TM0_EXT function is selected. - * |[26] |PB2_MFP1 |PB.2 Pin Alternate Function Selection - * | | |Bits PB2_MFP1 (ALT_MFP[26]) and GPB_MFP[2] determine the PB.2 function. - * | | |(PB2_MFP1 (ALT_MFP[26]), GPB_MFP[2]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = UART0_nRTS function is selected. - * | | |(1, 1) = TM2_EXT function is selected. - * |[27] |PB3_MFP1 |PB.3 Pin Alternate Function Selection - * | | |Bits PB3_MFP1 (ALT_MFP[27]) and GPB_MFP[3] determine the PB.3 function. - * | | |(PB3_MFP1 (ALT_MFP[27]), GPB_MFP[3]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = UART0_nCTS function is selected. - * | | |(1, 1) = TM3_EXT function is selected. - * |[29] |PC4_MFP1 |PC.4 Pin Alternate Function Selection - * | | |Bits PC4_MFP1 (ALT_MFP[29]) and GPC_MFP[4] determine the PC.4 function. - * | | |(PC4_MFP1 (ALT_MFP[29]), GPC_MFP[4]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI0_MISO1 function is selected. - * | | |(1, 1) = UART0_RXD function is selected. - * |[30] |PC5_MFP1 |PC.5 Pin Alternate Function Selection - * | | |Bits PC5_MFP1 (ALT_MFP[30]) and GPC_MFP[5] determine the PC.5 function. - * | | |(PC5_MFP1 (ALT_MFP[30]), GPC_MFP[5]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI0_MOSI1 function is selected. - * | | |(1, 1) = UART0_TXD function is selected. - * @var GCR_T::ALT_MFP1 - * Offset: 0x54 Alternative Multiple Function Pin Control Register 1 - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[16] |PD0_MFP1 |PD.0 Pin Alternate Function Selection - * | | |Bits PD0_MFP1 (ALT_MFP1[16]) and GPD_MFP[0] determine the PD.0 function. - * | | |(PD0_MFP1 (ALT_MFP1[16]), GPD_MFP[0]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(1, 0) = SPI2_SS0 function is selected. - * | | |(1, 1) = ADC0 function is selected. - * |[17] |PD1_MFP1 |PD.1 Pin Alternate Function Selection - * | | |Bits PD1_MFP1 (ALT_MFP1[17]) and GPD_MFP[1] determine the PD.1 function. - * | | |(PD1_MFP1 (ALT_MFP1[17]), GPD_MFP[1]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI0_SS1 function is selected. - * | | |(1, 0) = SPI2_CLK function is selected. - * | | |(1, 1) = ADC1 function is selected. - * |[18] |PD2_MFP1 |PD.2 Pin Alternate Function Selection - * | | |Bits PD2_MFP1 (ALT_MFP1[18]) and GPD_MFP[2] determine the PD.2 function. - * | | |(PD2_MFP1 (ALT_MFP1[18]), GPD_MFP[2]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI0_MISO1 function is selected. - * | | |(1, 0) = SPI2_MISO0 function is selected. - * | | |(1, 1) = ADC2 function is selected. - * |[19] |PD3_MFP1 |PD.3 Pin Alternate Function Selection - * | | |Bits PD3_MFP1 (ALT_MFP1[19]) and GPD_MFP[3] determine the PD.3 function. - * | | |(PD3_MPF1 (ALT_MFP1[19]), GPD_MFP[3]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI0_MOSI1 function is selected. - * | | |(1, 0) = SPI2_MOSI0 function is selected. - * | | |(1, 1) = ADC3 function is selected. - * |[20] |PD4_MFP1 |PD.4 Pin Alternate Function Selection - * | | |Bits PD4_MFP1 (ALT_MFP1[20]) and GPD_MFP[4] determine the PD.4 function. - * | | |(PD4_MFP1 (ALT_MFP1[20]), GPD_MFP[4]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(1, 0) = SPI2_MISO1 function is selected. - * | | |(1, 1) = ADC4 function is selected. - * |[21] |PD5_MFP1 |PD.5 Pin Alternate Function Selection - * | | |Bits PD5_MFP1 (ALT_MFP1[21]) and GPD_MFP[5] determine the PD.5 function. - * | | |(PD5_MFP1 (ALT_MFP1[21]), GPD_MFP[5]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(1, 0) = SPI2_MOSI1 function is selected. - * | | |(1, 1) = ADC5 function is selected. - * |[23] |PC8_MFP1 |PC.8 Pin Alternate Function Selection - * | | |Bits PC8_MFP1 (ALT_MFP1[23]) and GPC_MFP[8] determine the PC.8 function. - * | | |(PC8_MFP1 (ALT_MFP1[23]), GPC_MFP[8]) value and function mapping are as following list. - * | | |(0, 0) = GPIO function is selected. - * | | |(0, 1) = SPI1_SS0 function is selected. - * | | |(1, 1) = PWM0 function is selected. (NUC123xxxAEx Only) - * |[25:24] |PF2_MFP1 |PF.2 Pin Alternate Function Selection - * | | |Bits PF2_MFP1 (ALT_MFP1[25:24]) and GPF_MFP[2] determine the PF.2 function. - * | | |(PF2_MFP1(ALT_MFP1 [25:24]), GPF_MFP[2]) value and function mapping are as following list. - * | | |(00, 0) = GPIO function is selected. - * | | |(00, 1) = PS2_DAT function is selected. - * | | |(10, 1) = I2C0_SDA function is selected. - * | | |(11, 1) = ADC6 function is selected. - * |[27:26] |PF3_MFP1 |PF.3 Pin Alternate Function Selection - * | | |Bits PF3_MFP1 (ALT_MFP1[27:26]) and GPF_MFP[3] determine the PF.3 function. - * | | |(PF3_MFP1 (ALT_MFP1[27:26]), GPF_MFP[3]) value and function mapping are as following list. - * | | |(00, 0) = GPIO function is selected. - * | | |(00, 1) = PS2_CLK function is selected. - * | | |(10, 1) = I2C0_SCL function is selected. - * | | |(11, 1) = ADC7 function is selected. - * @var GCR_T::GPA_IOCR - * Offset: 0xC0 GPIOA IO Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[10] |GPA10_DS |PA.10 Pin Driving Strength Selection - * | | |0 = PA.10 strong driving strength mode Disabled. - * | | |1 = PA.10 strong driving strength mode Enabled. - * |[11] |GPA11_DS |PA.11 Pin Driving Strength Selection - * | | |0 = PA.11 strong driving strength mode Disabled. - * | | |1 = PA.11 strong driving strength mode Enabled. - * @var GCR_T::GPB_IOCR - * Offset: 0xC4 GPIOB IO Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[4] |GPB4_DS |PB.4 Pin Driving Strength Selection - * | | |0 = PB.4 strong driving strength mode Disabled. - * | | |1 = PB.4 strong driving strength mode Enabled. - * |[5] |GPB5_DS |PB.5 Pin Driving Strength Selection - * | | |0 = PB.5 strong driving strength mode Disabled. - * | | |1 = PB.5 strong driving strength mode Enabled. - * |[6] |GPB6_DS |PB.6 Pin Driving Strength Selection - * | | |0 = PB.6 strong driving strength mode Disabled. - * | | |1 = PB.6 strong driving strength mode Enabled. - * |[7] |GPB7_DS |PB.7 Pin Driving Strength Selection - * | | |0 = PB.7 strong driving strength mode Disabled. - * | | |1 = PB.7 strong driving strength mode Enabled. - * |[8] |GPB8_DS |PB.8 Pin Driving Strength Selection - * | | |0 = PB.8 strong driving strength mode Disabled. - * | | |1 = PB.8 strong driving strength mode Enabled. - * |[12] |GPB12_DS |PB.12 Pin Driving Strength Selection - * | | |0 = PB.12 strong driving strength mode Disabled. - * | | |1 = PB.12 strong driving strength mode Enabled. - * |[13] |GPB13_DS |PB.13 Pin Driving Strength Selection - * | | |0 = PB.13 strong driving strength mode Disabled. - * | | |1 = PB.13 strong driving strength mode Enabled. - * |[14] |GPB14_DS |PB.14 Pin Driving Strength Selection - * | | |0 = PB.14 strong driving strength mode Disabled. - * | | |1 = PB.14 strong driving strength mode Enabled. - * @var GCR_T::GPD_IOCR - * Offset: 0xCC GPIOD IO Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[8] |GPD8_DS |PD.8 Pin Driving Strength Selection - * | | |0 = PD.8 strong driving strength mode Disabled. - * | | |1 = PD.8 strong driving strength mode Enabled. - * |[9] |GPD9_DS |PD.9 Pin Driving Strength Selection - * | | |0 = PD.9 strong driving strength mode Disabled. - * | | |1 = PD.9 strong driving strength mode Enabled. - * |[10] |GPD10_DS |PD.10 Pin Driving Strength Selection - * | | |0 = PD.10 strong driving strength mode Disabled. - * | | |1 = PD.10 strong driving strength mode Enabled. - * |[11] |GPD11_DS |PD.11 Pin Driving Strength Selection - * | | |0 = PD.11 strong driving strength mode Disabled. - * | | |1 = PD.11 strong driving strength mode Enabled. - * @var GCR_T::REGWRPROT - * Offset: 0x100 Register Write Protect register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |REGPROTDIS|Register Write-Protection Disable index (Read Only) - * | | |1 = Write-protection Disabled for writing protected registers. - * | | |0 = Write-protection Enabled for writing protected registers. - * | | |Any write to the protected register is ignored. - * | | |The Protected registers are: - * | | |IPRSTC1: address 0x5000_0008 - * | | |BODCR: address 0x5000_0018 - * | | |PORCR: address 0x5000_0024 - * | | |PWRCON: address 0x5000_0200 (bit[6] is not protected for power wake-up interrupt clear) - * | | |APBCLK bit[0]: address 0x5000_0208 (bit[0] is watchdog clock enabled) - * | | |CLKSEL0: address 0x5000_0210 (for HCLK and CPU STCLK clock source select) - * | | |CLKSEL1 bit[1:0]: address 0x5000_0214 (for watchdog clock source select) - * | | |ISPCON: address 0x5000_C000 (Flash ISP Control register) - * | | |WTCR: address 0x4000_4000 - * | | |FATCON: address 0x5000_C018 - * |[7:0] |REGWRPROT |Register Write-Protection Code (Write Only) - * | | |Some registers have write-protection function. Writing these registers has to disable the protected function by writing the sequence value "59h", "16h", "88h" to this field. - * | | |After this sequence is completed, the REGPROTDIS bit will be set to 1 and write-protection registers can be normal write. - * @var GCR_T::GPA_MFPH - * Offset: 0x134 GPIOA Multiple Function High Byte Control Register (NUC123xxxAEx Only) - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[10:8] |GPA10_MFP |PA.10 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = I2C1_SDA function is selected. - * | | |010 = SPI1_MISO0 function is selected. - * | | |011 = SPI2_MISO0 function is selected. - * |[14:12] |GPA11_MFP |PA.11 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = I2C1_SCL function is selected. - * | | |010 = SPI1_CLK function is selected. - * | | |011 = SPI2_MOSI0 function is selected. - * |[18:16] |GPA12_MFP |PA.12 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = PWM0 function is selected. - * |[22:20] |GPA13_MFP |PA.13 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = PWM1 function is selected. - * |[26:24] |GPA14_MFP |PA.14 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = PWM2 function is selected. - * |[30:28] |GPA15_MFP |PA.15 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = PWM3 function is selected. - * | | |010 = CLKO function is selected. - * | | |011 = I2S_MCLK function is selected. - * @var GCR_T::GPB_MFPL - * Offset: 0x138 GPIOB Multiple Function Low Byte Control Register (NUC123xxxAEx Only) - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[2:0] |GPB0_MFP |PB.0 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = UART0_RXD function is selected. - * |[6:4] |GPB1_MFP |PB.1 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = UART0_TXD function is selected. - * |[10:8] |GPB2_MFP |PB.2 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = UART0_nRTS function is selected. - * | | |010 = TM2_EXT function is selected. - * |[14:12] |GPB3_MFP |PB.3 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = UART0_nCTS function is selected. - * | | |010 = TM3_EXT function is selected. - * |[18:16] |GPB4_MFP |PB.4 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = UART1_RXD function is selected. - * | | |010 = SPI2_SS0 function is selected. - * | | |010 = SPI1_SS1 function is selected. - * |[22:20] |GPB5_MFP |PB.5 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = UART1_TXD function is selected. - * | | |010 = SPI2_CLK function is selected. - * |[26:24] |GPB6_MFP |PB.6 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = UART1_nRTS function is selected. - * | | |010 = SPI2_MOSI0 function is selected. - * |[30:28] |GPB7_MFP |PB.7 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = UART1_nCTS function is selected. - * | | |010 = SPI2_MISO0 function is selected. - * @var GCR_T::GPB_MFPH - * Offset: 0x13C GPIOB Multiple Function High Byte Control Register (NUC123xxxAEx Only) - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[2:0] |GPB8_MFP |PB.8 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = TM0 function is selected. - * |[6:4] |GPB9_MFP |PB.9 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = TM1 function is selected. - * | | |010 = SPI1_SS1 function is selected. - * | | |011 = PWM1 function is selected. - * |[10:8] |GPB10_MFP |PB.10 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = TM2 function is selected. - * | | |010 = SPI0_SS1 function is selected. - * |[18:16] |GPB12_MFP |PB.12 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = SPI1_SS0 function is selected. - * | | |010 = CLKO function is selected. - * |[22:20] |GPB13_MFP |PB.13 Pin Function Selection - * | | |000 = GPIO function is selected. - * |[26:24] |GPB14_MFP |PB.14 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = INT0 function is selected. - * |[30:28] |GPB15_MFP |PB.15 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = INT1 function is selected. - * | | |010 = TM0_EXT function is selected. - * @var GCR_T::GPC_MFPL - * Offset: 0x140 GPIOC Multiple Function Low Byte Control Register (NUC123xxxAEx Only) - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[2:0] |GPC0_MFP |PC.0 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = SPI0_SS0 function is selected. - * | | |010 = I2S_LRCK function is selected. - * |[6:4] |GPC1_MFP |PC.1 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = SPI0_CLK function is selected. - * | | |001 = I2S_BCLK function is selected. - * |[10:8] |GPC2_MFP |PC.2 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = SPI0_MISO0 function is selected. - * | | |010 = I2S_DI function is selected. - * |[14:12] |GPC3_MFP |PC.3 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = SPI0_MIOSI0 function is selected. - * | | |010 = I2S_DO function is selected. - * |[18:16] |GPC4_MFP |PC.4 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = SPI0_MISO1 function is selected. - * | | |010 = UART0_RXD function is selected. - * |[22:20] |GPC5_MFP |PC.5 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = SPI0_MOSI1 function is selected. - * | | |010 = UART0_TXD function is selected. - * @var GCR_T::GPC_MFPH - * Offset: 0x144 GPIOC Multiple Function High Byte Control Register (NUC123xxxAEx Only) - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[2:0] |GPC8_MFP |PC.8 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = SPI1_SS0 function is selected. - * | | |010 = PWM0 function is selected. - * |[6:4] |GPC9_MFP |PC.9 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = SPI1_CLK function is selected. - * |[10:8] |GPC10_MFP |PC.10 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = SPI1_MISO0 function is selected. - * |[14:12] |GPC11_MFP |PC.11 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = SPI1_MOSI0 function is selected. - * |[18:16] |GPC12_MFP |PC.12 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = SPI1_MISO1 function is selected. - * | | |010 = I2S_MCLK function is selected. - * | | |011 = PWM2 function is selected. - * |[22:20] |GPC13_MFP |PC.13 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = SPI1_MOSI1 function is selected. - * | | |010 = CLKO function is selected. - * | | |011 = PWM3 function is selected. - * @var GCR_T::GPD_MFPL - * Offset: 0x148 GPIOD Multiple Function Low Byte Control Register (NUC123xxxAEx Only) - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[2:0] |GPD0_MFP |PD.0 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = SPI2_SS0 function is selected. - * | | |010 = ADC0 function is selected. - * |[6:4] |GPD1_MFP |PD.1 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = SPI0_SS1 function is selected. - * | | |010 = SPI2_CLK function is selected. - * | | |011 = ADC1 function is selected. - * |[10:8] |GPD2_MFP |PD.2 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = SPI0_MISO1 function is selected. - * | | |010 = SPI2_MISO0 function is selected. - * | | |010 = ADC2 function is selected. - * |[14:12] |GPD3_MFP |PD.3 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = SPI0_MOSI1 function is selected. - * | | |010 = SPI2_MOSI0 function is selected. - * | | |011 = ADC3 function is selected. - * |[18:16] |GPD4_MFP |PD.4 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = SPI2_MISO1 function is selected. - * | | |010 = ADC4 function is selected. - * |[22:20] |GPD5_MFP |PD.5 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = SPI2_MOSI1 function is selected. - * | | |010 = ADC5 function is selected. - * @var GCR_T::GPD_MFPH - * Offset: 0x14C GPIOD Multiple Function High Byte Control Register (NUC123xxxAEx Only) - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[2:0] |GPD8_MFP |PD.8 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = SPI1_MOSI0 function is selected. - * |[6:4] |GPD9_MFP |PD.9 Pin Function Selection - * | | |000 = GPIO function is selected. - * |[10:8] |GPD10_MFP |PD.10 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = CLKO function is selected. - * |[14:12] |GPD11_MFP |PD.11 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = INT1 function is selected. - * @var GCR_T::GPF_MFPL - * Offset: 0x158 GPIOF Multiple Function Low Byte Control Register (NUC123xxxAEx Only) - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[2:0] |GPF0_MFP |PF.0 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = XT1_OUT function is selected. - * |[6:4] |GPF1_MFP |PF.1 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = XT1_IN function is selected. - * |[10:8] |GPF2_MFP |PF.2 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = PS2_DAT function is selected. - * | | |010 = I2C0_SDA function is selected. - * | | |010 = ADC6 function is selected. - * |[14:12] |GPF3_MFP |PF.3 Pin Function Selection - * | | |000 = GPIO function is selected. - * | | |001 = PS2_CLK function is selected. - * | | |010 = I2C0_SCL function is selected. - * | | |011 = ADC7 function is selected. - */ - - __I uint32_t PDID; /* Offset: 0x00 Part Device Identification Number Register */ - __IO uint32_t RSTSRC; /* Offset: 0x04 System Reset Source Register */ - __IO uint32_t IPRSTC1; /* Offset: 0x08 Peripheral Reset Control Register 1 */ - __IO uint32_t IPRSTC2; /* Offset: 0x0C Peripheral Reset Control Register 2 */ - __I uint32_t RESERVE0[2]; - __IO uint32_t BODCR; /* Offset: 0x18 Brown-out Detector Control Register */ - __I uint32_t RESERVE1[2]; - __IO uint32_t PORCR; /* Offset: 0x24 Power-on-Reset Controller Register */ - __I uint32_t RESERVE2[2]; - __IO uint32_t GPA_MFP; /* Offset: 0x30 GPIOA Multiple Function and Input Type Control Register */ - __IO uint32_t GPB_MFP; /* Offset: 0x34 GPIOB Multiple Function and Input Type Control Register */ - __IO uint32_t GPC_MFP; /* Offset: 0x38 GPIOC Multiple Function and Input Type Control Register */ - __IO uint32_t GPD_MFP; /* Offset: 0x3C GPIOD Multiple Function and Input Type Control Register */ - __I uint32_t RESERVE3; - __IO uint32_t GPF_MFP; /* Offset: 0x44 GPIOF Multiple Function and Input Type Control Register */ - __I uint32_t RESERVE4[2]; - __IO uint32_t ALT_MFP; /* Offset: 0x50 Alternative Multiple Function Pin Control Register */ - __IO uint32_t ALT_MFP1; /* Offset: 0x54 Alternative Multiple Function Pin Control Register 1 */ - __I uint32_t RESERVE5[26]; - __IO uint32_t GPA_IOCR; /* Offset: 0xC0 GPIOA IO Control Register */ - __IO uint32_t GPB_IOCR; /* Offset: 0xC4 GPIOB IO Control Register */ - __I uint32_t RESERVE6; - __IO uint32_t GPD_IOCR; /* Offset: 0xCC GPIOD IO Control Register */ - __I uint32_t RESERVE7[12]; - __IO uint32_t REGWRPROT; /* Offset: 0x100 Register Write Protect register */ - __I uint32_t RESERVE8[12]; - __IO uint32_t GPA_MFPH; /* Offset: 0x134 GPIOA Multiple Function High Byte Control Register (NUC123xxxAEx Only) */ - __IO uint32_t GPB_MFPL; /* Offset: 0x138 GPIOB Multiple Function Low Byte Control Register (NUC123xxxAEx Only) */ - __IO uint32_t GPB_MFPH; /* Offset: 0x13C GPIOB Multiple Function High Byte Control Register (NUC123xxxAEx Only) */ - __IO uint32_t GPC_MFPL; /* Offset: 0x140 GPIOC Multiple Function Low Byte Control Register (NUC123xxxAEx Only) */ - __IO uint32_t GPC_MFPH; /* Offset: 0x144 GPIOC Multiple Function High Byte Control Register (NUC123xxxAEx Only) */ - __IO uint32_t GPD_MFPL; /* Offset: 0x148 GPIOD Multiple Function Low Byte Control Register (NUC123xxxAEx Only) */ - __IO uint32_t GPD_MFPH; /* Offset: 0x14C GPIOD Multiple Function High Byte Control Register (NUC123xxxAEx Only) */ - __I uint32_t RESERVE9[2]; - __IO uint32_t GPF_MFPL; /* Offset: 0x158 GPIOF Multiple Function Low Byte Control Register (NUC123xxxAEx Only) */ - -} GCR_T; - - - - -/** @addtogroup REG_SYS_BITMASK SYS Bit Mask - @{ - */ - -/* GCR RSTSRC Bit Field Definitions */ -#define SYS_RSTSRC_RSTS_CPU_Pos 7 /*!< GCR_T::RSTSRC: RSTS_CPU Position */ -#define SYS_RSTSRC_RSTS_CPU_Msk (1ul << SYS_RSTSRC_RSTS_CPU_Pos) /*!< GCR_T::RSTSRC: RSTS_CPU Mask */ - -#define SYS_RSTSRC_RSTS_SYS_Pos 5 /*!< GCR_T::RSTSRC: RSTS_SYS Position */ -#define SYS_RSTSRC_RSTS_SYS_Msk (1ul << SYS_RSTSRC_RSTS_SYS_Pos) /*!< GCR_T::RSTSRC: RSTS_SYS Mask */ - -#define SYS_RSTSRC_RSTS_BOD_Pos 4 /*!< GCR_T::RSTSRC: RSTS_BOD Position */ -#define SYS_RSTSRC_RSTS_BOD_Msk (1ul << SYS_RSTSRC_RSTS_BOD_Pos) /*!< GCR_T::RSTSRC: RSTS_BOD Mask */ - -#define SYS_RSTSRC_RSTS_LVR_Pos 3 /*!< GCR_T::RSTSRC: RSTS_LVR Position */ -#define SYS_RSTSRC_RSTS_LVR_Msk (1ul << SYS_RSTSRC_RSTS_LVR_Pos) /*!< GCR_T::RSTSRC: RSTS_LVR Mask */ - -#define SYS_RSTSRC_RSTS_WDT_Pos 2 /*!< GCR_T::RSTSRC: RSTS_WDT Position */ -#define SYS_RSTSRC_RSTS_WDT_Msk (1ul << SYS_RSTSRC_RSTS_WDT_Pos) /*!< GCR_T::RSTSRC: RSTS_WDT Mask */ - -#define SYS_RSTSRC_RSTS_RESET_Pos 1 /*!< GCR_T::RSTSRC: RSTS_RESET Position */ -#define SYS_RSTSRC_RSTS_RESET_Msk (1ul << SYS_RSTSRC_RSTS_RESET_Pos) /*!< GCR_T::RSTSRC: RSTS_RESET Mask */ - -#define SYS_RSTSRC_RSTS_POR_Pos 0 /*!< GCR_T::RSTSRC: RSTS_POR Position */ -#define SYS_RSTSRC_RSTS_POR_Msk (1ul << SYS_RSTSRC_RSTS_POR_Pos) /*!< GCR_T::RSTSRC: RSTS_POR Mask */ - -/* GCR IPRSTC1 Bit Field Definitions */ -#define SYS_IPRSTC1_PDMA_RST_Pos 2 /*!< GCR_T::IPRSTC1: PDMA_RST Position */ -#define SYS_IPRSTC1_PDMA_RST_Msk (1ul << SYS_IPRSTC1_PDMA_RST_Pos) /*!< GCR_T::IPRSTC1: PDMA_RST Mask */ - -#define SYS_IPRSTC1_CPU_RST_Pos 1 /*!< GCR_T::IPRSTC1: CPU_RST Position */ -#define SYS_IPRSTC1_CPU_RST_Msk (1ul << SYS_IPRSTC1_CPU_RST_Pos) /*!< GCR_T::IPRSTC1: CPU_RST Mask */ - -#define SYS_IPRSTC1_CHIP_RST_Pos 0 /*!< GCR_T::IPRSTC1: CHIP_RST Position */ -#define SYS_IPRSTC1_CHIP_RST_Msk (1ul << SYS_IPRSTC1_CHIP_RST_Pos) /*!< GCR_T::IPRSTC1: CHIP_RST Mask */ - -/* GCR IPRSTC2 Bit Field Definitions */ -#define SYS_IPRSTC2_I2S_RST_Pos 29 /*!< GCR_T::IPRSTC2: I2S_RST Position */ -#define SYS_IPRSTC2_I2S_RST_Msk (1ul << SYS_IPRSTC2_I2S_RST_Pos) /*!< GCR_T::IPRSTC2: I2S_RST Mask */ - -#define SYS_IPRSTC2_ADC_RST_Pos 28 /*!< GCR_T::IPRSTC2: ADC_RST Position */ -#define SYS_IPRSTC2_ADC_RST_Msk (1ul << SYS_IPRSTC2_ADC_RST_Pos) /*!< GCR_T::IPRSTC2: ADC_RST Mask */ - -#define SYS_IPRSTC2_USBD_RST_Pos 27 /*!< GCR_T::IPRSTC2: USBD_RST Position */ -#define SYS_IPRSTC2_USBD_RST_Msk (1ul << SYS_IPRSTC2_USBD_RST_Pos) /*!< GCR_T::IPRSTC2: USBD_RST Mask */ - -#define SYS_IPRSTC2_PS2_RST_Pos 23 /*!< GCR_T::IPRSTC2: PS2_RST Position */ -#define SYS_IPRSTC2_PS2_RST_Msk (1ul << SYS_IPRSTC2_PS2_RST_Pos) /*!< GCR_T::IPRSTC2: PS2_RST Mask */ - -#define SYS_IPRSTC2_PWM03_RST_Pos 20 /*!< GCR_T::IPRSTC2: PWM03_RST Position */ -#define SYS_IPRSTC2_PWM03_RST_Msk (1ul << SYS_IPRSTC2_PWM03_RST_Pos) /*!< GCR_T::IPRSTC2: PWM03_RST Mask */ - -#define SYS_IPRSTC2_UART1_RST_Pos 17 /*!< GCR_T::IPRSTC2: UART1_RST Position */ -#define SYS_IPRSTC2_UART1_RST_Msk (1ul << SYS_IPRSTC2_UART1_RST_Pos) /*!< GCR_T::IPRSTC2: UART1_RST Mask */ - -#define SYS_IPRSTC2_UART0_RST_Pos 16 /*!< GCR_T::IPRSTC2: UART0_RST Position */ -#define SYS_IPRSTC2_UART0_RST_Msk (1ul << SYS_IPRSTC2_UART0_RST_Pos) /*!< GCR_T::IPRSTC2: UART0_RST Mask */ - -#define SYS_IPRSTC2_SPI2_RST_Pos 14 /*!< GCR_T::IPRSTC2: SPI2_RST Position */ -#define SYS_IPRSTC2_SPI2_RST_Msk (1ul << SYS_IPRSTC2_SPI2_RST_Pos) /*!< GCR_T::IPRSTC2: SPI2_RST Mask */ - -#define SYS_IPRSTC2_SPI1_RST_Pos 13 /*!< GCR_T::IPRSTC2: SPI1_RST Position */ -#define SYS_IPRSTC2_SPI1_RST_Msk (1ul << SYS_IPRSTC2_SPI1_RST_Pos) /*!< GCR_T::IPRSTC2: SPI1_RST Mask */ - -#define SYS_IPRSTC2_SPI0_RST_Pos 12 /*!< GCR_T::IPRSTC2: SPI0_RST Position */ -#define SYS_IPRSTC2_SPI0_RST_Msk (1ul << SYS_IPRSTC2_SPI0_RST_Pos) /*!< GCR_T::IPRSTC2: SPI0_RST Mask */ - -#define SYS_IPRSTC2_I2C1_RST_Pos 9 /*!< GCR_T::IPRSTC2: I2C1_RST Position */ -#define SYS_IPRSTC2_I2C1_RST_Msk (1ul << SYS_IPRSTC2_I2C1_RST_Pos) /*!< GCR_T::IPRSTC2: I2C1_RST Mask */ - -#define SYS_IPRSTC2_I2C0_RST_Pos 8 /*!< GCR_T::IPRSTC2: I2C0_RST Position */ -#define SYS_IPRSTC2_I2C0_RST_Msk (1ul << SYS_IPRSTC2_I2C0_RST_Pos) /*!< GCR_T::IPRSTC2: I2C0_RST Mask */ - -#define SYS_IPRSTC2_TMR3_RST_Pos 5 /*!< GCR_T::IPRSTC2: TMR3_RST Position */ -#define SYS_IPRSTC2_TMR3_RST_Msk (1ul << SYS_IPRSTC2_TMR3_RST_Pos) /*!< GCR_T::IPRSTC2: TMR3_RST Mask */ - -#define SYS_IPRSTC2_TMR2_RST_Pos 4 /*!< GCR_T::IPRSTC2: TMR2_RST Position */ -#define SYS_IPRSTC2_TMR2_RST_Msk (1ul << SYS_IPRSTC2_TMR2_RST_Pos) /*!< GCR_T::IPRSTC2: TMR2_RST Mask */ - -#define SYS_IPRSTC2_TMR1_RST_Pos 3 /*!< GCR_T::IPRSTC2: TMR1_RST Position */ -#define SYS_IPRSTC2_TMR1_RST_Msk (1ul << SYS_IPRSTC2_TMR1_RST_Pos) /*!< GCR_T::IPRSTC2: TMR1_RST Mask */ - -#define SYS_IPRSTC2_TMR0_RST_Pos 2 /*!< GCR_T::IPRSTC2: TMR0_RST Position */ -#define SYS_IPRSTC2_TMR0_RST_Msk (1ul << SYS_IPRSTC2_TMR0_RST_Pos) /*!< GCR_T::IPRSTC2: TMR0_RST Mask */ - -#define SYS_IPRSTC2_GPIO_RST_Pos 1 /*!< GCR_T::IPRSTC2: GPIO_RST Position */ -#define SYS_IPRSTC2_GPIO_RST_Msk (1ul << SYS_IPRSTC2_GPIO_RST_Pos) /*!< GCR_T::IPRSTC2: GPIO_RST Mask */ - -/* GCR BODCR Bit Field Definitions */ -#define SYS_BODCR_LVR_EN_Pos 7 /*!< GCR_T::BODCR: LVR_EN Position */ -#define SYS_BODCR_LVR_EN_Msk (1ul << SYS_BODCR_LVR_EN_Pos) /*!< GCR_T::BODCR: LVR_EN Mask */ - -#define SYS_BODCR_BOD_OUT_Pos 6 /*!< GCR_T::BODCR: BOD_OUT Position */ -#define SYS_BODCR_BOD_OUT_Msk (1ul << SYS_BODCR_BOD_OUT_Pos) /*!< GCR_T::BODCR: BOD_OUT Mask */ - -#define SYS_BODCR_BOD_LPM_Pos 5 /*!< GCR_T::BODCR: BOD_LPM Position */ -#define SYS_BODCR_BOD_LPM_Msk (1ul << SYS_BODCR_BOD_LPM_Pos) /*!< GCR_T::BODCR: BOD_LPM Mask */ - -#define SYS_BODCR_BOD_INTF_Pos 4 /*!< GCR_T::BODCR: BOD_INTF Position */ -#define SYS_BODCR_BOD_INTF_Msk (1ul << SYS_BODCR_BOD_INTF_Pos) /*!< GCR_T::BODCR: BOD_INTF Mask */ - -#define SYS_BODCR_BOD_RSTEN_Pos 3 /*!< GCR_T::BODCR: BOD_RSTEN Position */ -#define SYS_BODCR_BOD_RSTEN_Msk (1ul << SYS_BODCR_BOD_RSTEN_Pos) /*!< GCR_T::BODCR: BOD_RSTEN Mask */ - -#define SYS_BODCR_BOD_VL_Pos 1 /*!< GCR_T::BODCR: BOD_VL Position */ -#define SYS_BODCR_BOD_VL_Msk (3ul << SYS_BODCR_BOD_VL_Pos) /*!< GCR_T::BODCR: BOD_VL Mask */ - -#define SYS_BODCR_BOD_EN_Pos 0 /*!< GCR_T::BODCR: BOD_EN Position */ -#define SYS_BODCR_BOD_EN_Msk (1ul << SYS_BODCR_BOD_EN_Pos) /*!< GCR_T::BODCR: BOD_EN Mask */ - -/* GCR PORCR Bit Field Definitions */ -#define SYS_PORCR_POR_DIS_CODE_Pos 0 /*!< GCR_T::PORCR: POR_DIS_CODE Position */ -#define SYS_PORCR_POR_DIS_CODE_Msk (0xFFFFul << SYS_PORCR_POR_DIS_CODE_Pos) /*!< GCR_T::PORCR: POR_DIS_CODE Mask */ - -/* GCR GPAMFP Bit Field Definitions */ -#define SYS_GPA_MFP_GPA_TYPE_Pos 16 /*!< GCR_T::GPA_MFP: GPA_TYPE Position */ -#define SYS_GPA_MFP_GPA_TYPE_Msk (0xFFFFul << SYS_GPA_MFP_GPA_TYPE_Pos) /*!< GCR_T::GPA_MFP: GPA_TYPE Mask */ - -#define SYS_GPA_MFP_GPA_MFP_Pos 0 /*!< GCR_T::GPA_MFP: GPA_MFP Position */ -#define SYS_GPA_MFP_GPA_MFP_Msk (0xFFFFul << SYS_GPA_MFP_GPA_MFP_Pos) /*!< GCR_T::GPA_MFP: GPA_MFP Mask */ - - -/* GCR GPBMFP Bit Field Definitions */ -#define SYS_GPB_MFP_GPB_TYPE_Pos 16 /*!< GCR_T::GPB_MFP: GPB_TYPE Position */ -#define SYS_GPB_MFP_GPB_TYPE_Msk (0xFFFFul << SYS_GPB_MFP_GPB_TYPE_Pos) /*!< GCR_T::GPB_MFP: GPB_TYPE Mask */ - -#define SYS_GPB_MFP_GPB_MFP_Pos 0 /*!< GCR_T::GPB_MFP: GPB_MFP Position */ -#define SYS_GPB_MFP_GPB_MFP_Msk (0xFFFFul << SYS_GPB_MFP_GPB_MFP_Pos) /*!< GCR_T::GPB_MFP: GPB_MFP Mask */ - -/* GCR GPCMFP Bit Field Definitions */ -#define SYS_GPC_MFP_GPC_TYPE_Pos 16 /*!< GCR_T::GPC_MFP: GPC_TYPE Position */ -#define SYS_GPC_MFP_GPC_TYPE_Msk (0xFFFFul << SYS_GPC_MFP_GPC_TYPE_Pos) /*!< GCR_T::GPC_MFP: GPC_TYPE Mask */ - -#define SYS_GPC_MFP_GPC_MFP_Pos 0 /*!< GCR_T::GPC_MFP: GPC_MFP Position */ -#define SYS_GPC_MFP_GPC_MFP_Msk (0xFFFFul << SYS_GPC_MFP_GPC_MFP_Pos) /*!< GCR_T::GPC_MFP: GPC_MFP Mask */ - -/* GCR GPDMFP Bit Field Definitions */ -#define SYS_GPD_MFP_GPD_TYPE_Pos 16 /*!< GCR_T::GPD_MFP: GPD_TYPE Position */ -#define SYS_GPD_MFP_GPD_TYPE_Msk (0xFFFFul << SYS_GPD_MFP_GPD_TYPE_Pos) /*!< GCR_T::GPD_MFP: GPD_TYPE Mask */ - -#define SYS_GPD_MFP_GPD_MFP_Pos 0 /*!< GCR_T::GPD_MFP: GPD_MFP Position */ -#define SYS_GPD_MFP_GPD_MFP_Msk (0xFFFFul << SYS_GPD_MFP_GPD_MFP_Pos) /*!< GCR_T::GPD_MFP: GPD_MFP Mask */ - -/* GCR GPFMFP Bit Field Definitions */ -#define SYS_GPF_MFP_GPF_TYPE_Pos 16 /*!< GCR_T::GPF_MFP: GPF_TYPE Position */ -#define SYS_GPF_MFP_GPF_TYPE_Msk (0xFul << SYS_GPF_MFP_GPF_TYPE_Pos) /*!< GCR_T::GPF_MFP: GPF_TYPE Mask */ - -#define SYS_GPF_MFP_GPF_MFP3_Pos 3 /*!< GCR_T::GPF_MFP: GPF_MFP3 Position */ -#define SYS_GPF_MFP_GPF_MFP3_Msk (1ul << SYS_GPF_MFP_GPF_MFP3_Pos) /*!< GCR_T::GPF_MFP: GPF_MFP3 Mask */ - -#define SYS_GPF_MFP_GPF_MFP2_Pos 2 /*!< GCR_T::GPF_MFP: GPF_MFP2 Position */ -#define SYS_GPF_MFP_GPF_MFP2_Msk (1ul << SYS_GPF_MFP_GPF_MFP2_Pos) /*!< GCR_T::GPF_MFP: GPF_MFP2 Mask */ - -#define SYS_GPF_MFP_GPF_MFP1_Pos 1 /*!< GCR_T::GPF_MFP: GPF_MFP1 Position */ -#define SYS_GPF_MFP_GPF_MFP1_Msk (1ul << SYS_GPF_MFP_GPF_MFP1_Pos) /*!< GCR_T::GPF_MFP: GPF_MFP1 Mask */ - -#define SYS_GPF_MFP_GPF_MFP0_Pos 0 /*!< GCR_T::GPF_MFP: GPF_MFP0 Position */ -#define SYS_GPF_MFP_GPF_MFP0_Msk (1ul << SYS_GPF_MFP_GPF_MFP0_Pos) /*!< GCR_T::GPF_MFP: GPF_MFP0 Mask */ - -/* GCR ALTMFP Bit Field Definitions */ -#define SYS_ALT_MFP_PC5_MFP1_Pos 30 /*!< GCR_T::ALT_MFP: PC5_MFP1 Position */ -#define SYS_ALT_MFP_PC5_MFP1_Msk (1ul << SYS_ALT_MFP_PC5_MFP1_Pos) /*!< GCR_T::ALT_MFP: PC5_MFP1 Mask */ - -#define SYS_ALT_MFP_PC4_MFP1_Pos 29 /*!< GCR_T::ALT_MFP: PC4_MFP1 Position */ -#define SYS_ALT_MFP_PC4_MFP1_Msk (1ul << SYS_ALT_MFP_PC4_MFP1_Pos) /*!< GCR_T::ALT_MFP: PC4_MFP1 Mask */ - -#define SYS_ALT_MFP_PB3_MFP1_Pos 27 /*!< GCR_T::ALT_MFP: PB3_MFP1 Position */ -#define SYS_ALT_MFP_PB3_MFP1_Msk (1ul << SYS_ALT_MFP_PB3_MFP1_Pos) /*!< GCR_T::ALT_MFP: PB3_MFP1 Mask */ - -#define SYS_ALT_MFP_PB2_MFP1_Pos 26 /*!< GCR_T::ALT_MFP: PB2_MFP1 Position */ -#define SYS_ALT_MFP_PB2_MFP1_Msk (1ul << SYS_ALT_MFP_PB2_MFP1_Pos) /*!< GCR_T::ALT_MFP: PB2_MFP1 Mask */ - -#define SYS_ALT_MFP_PB15_MFP1_Pos 24 /*!< GCR_T::ALT_MFP: PB15_MFP1 Position */ -#define SYS_ALT_MFP_PB15_MFP1_Msk (1ul << SYS_ALT_MFP_PB15_MFP1_Pos) /*!< GCR_T::ALT_MFP: PB15_MFP1 Mask */ - -#define SYS_ALT_MFP_PC13_MFP1_Pos 21 /*!< GCR_T::ALT_MFP: PC13_MFP1 Position */ -#define SYS_ALT_MFP_PC13_MFP1_Msk (1ul << SYS_ALT_MFP_PC13_MFP1_Pos) /*!< GCR_T::ALT_MFP: PC13_MFP1 Mask */ - -#define SYS_ALT_MFP_PC12_MFP1_Pos 20 /*!< GCR_T::ALT_MFP: PC12_MFP1 Position */ -#define SYS_ALT_MFP_PC12_MFP1_Msk (1ul << SYS_ALT_MFP_PC12_MFP1_Pos) /*!< GCR_T::ALT_MFP: PC12_MFP1 Mask */ - -#define SYS_ALT_MFP_PB5_MFP1_Pos 18 /*!< GCR_T::ALT_MFP: PB5_MFP1 Position */ -#define SYS_ALT_MFP_PB5_MFP1_Msk (1ul << SYS_ALT_MFP_PB5_MFP1_Pos) /*!< GCR_T::ALT_MFP: PB5_MFP1 Mask */ - -#define SYS_ALT_MFP_PB6_MFP1_Pos 17 /*!< GCR_T::ALT_MFP: PB6_MFP1 Position */ -#define SYS_ALT_MFP_PB6_MFP1_Msk (1ul << SYS_ALT_MFP_PB6_MFP1_Pos) /*!< GCR_T::ALT_MFP: PB6_MFP1 Mask */ - -#define SYS_ALT_MFP_PB7_MFP1_Pos 16 /*!< GCR_T::ALT_MFP: PB7_MFP1 Position */ -#define SYS_ALT_MFP_PB7_MFP1_Msk (1ul << SYS_ALT_MFP_PB7_MFP1_Pos) /*!< GCR_T::ALT_MFP: PB7_MFP1 Mask */ - -#define SYS_ALT_MFP_PB4_MFP1_Pos 15 /*!< GCR_T::ALT_MFP: PB4_MFP1 Position */ -#define SYS_ALT_MFP_PB4_MFP1_Msk (1ul << SYS_ALT_MFP_PB4_MFP1_Pos) /*!< GCR_T::ALT_MFP: PB4_MFP1 Mask */ - -#define SYS_ALT_MFP_PA10_MFP1_Pos 12 /*!< GCR_T::ALT_MFP: PA10_MFP1 Position */ -#define SYS_ALT_MFP_PA10_MFP1_Msk (1ul << SYS_ALT_MFP_PA10_MFP1_Pos) /*!< GCR_T::ALT_MFP: PA10_MFP1 Mask */ - -#define SYS_ALT_MFP_PA11_MFP1_Pos 11 /*!< GCR_T::ALT_MFP: PA11_MFP1 Position */ -#define SYS_ALT_MFP_PA11_MFP1_Msk (1ul << SYS_ALT_MFP_PA11_MFP1_Pos) /*!< GCR_T::ALT_MFP: PA11_MFP1 Mask */ - -#define SYS_ALT_MFP_PB12_MFP1_Pos 10 /*!< GCR_T::ALT_MFP: PB12_MFP1 Position */ -#define SYS_ALT_MFP_PB12_MFP1_Msk (1ul << SYS_ALT_MFP_PB12_MFP1_Pos) /*!< GCR_T::ALT_MFP: PB12_MFP1 Mask */ - -#define SYS_ALT_MFP_PA15_MFP1_Pos 9 /*!< GCR_T::ALT_MFP: A15_MFP1 Position */ -#define SYS_ALT_MFP_PA15_MFP1_Msk (1ul << SYS_ALT_MFP_PA15_MFP1_Pos) /*!< GCR_T::ALT_MFP: A15_MFP1 Mask */ - -#define SYS_ALT_MFP_PC3_MFP1_Pos 8 /*!< GCR_T::ALT_MFP: PC3_MFP1 Position */ -#define SYS_ALT_MFP_PC3_MFP1_Msk (1ul << SYS_ALT_MFP_PC3_MFP1_Pos) /*!< GCR_T::ALT_MFP: PC3_MFP1 Mask */ - -#define SYS_ALT_MFP_PC2_MFP1_Pos 7 /*!< GCR_T::ALT_MFP: PC2_MFP1 Position */ -#define SYS_ALT_MFP_PC2_MFP1_Msk (1ul << SYS_ALT_MFP_PC2_MFP1_Pos) /*!< GCR_T::ALT_MFP: PC2_MFP1 Mask */ - -#define SYS_ALT_MFP_PC1_MFP1_Pos 6 /*!< GCR_T::ALT_MFP: PC1_MFP1 Position */ -#define SYS_ALT_MFP_PC1_MFP1_Msk (1ul << SYS_ALT_MFP_PC1_MFP1_Pos) /*!< GCR_T::ALT_MFP: PC1_MFP1 Mask */ - -#define SYS_ALT_MFP_PC0_MFP1_Pos 5 /*!< GCR_T::ALT_MFP: PC0_MFP1 Position */ -#define SYS_ALT_MFP_PC0_MFP1_Msk (1ul << SYS_ALT_MFP_PC0_MFP1_Pos) /*!< GCR_T::ALT_MFP: PB0_MFP1 Mask */ - -#define SYS_ALT_MFP_PB9_MFP1_Pos 1 /*!< GCR_T::ALT_MFP: PB9_MFP1 Position */ -#define SYS_ALT_MFP_PB9_MFP1_Msk (1ul << SYS_ALT_MFP_PB9_MFP1_Pos) /*!< GCR_T::ALT_MFP: PB9_MFP1 Mask */ - -#define SYS_ALT_MFP_PB10_MFP1_Pos 0 /*!< GCR_T::ALT_MFP: PB10_MFP1 Position */ -#define SYS_ALT_MFP_PB10_MFP1_Msk (1ul << SYS_ALT_MFP_PB10_MFP1_Pos) /*!< GCR_T::ALT_MFP: PB10_MFP1 Mask */ - -/* GCR ALTMFP1 Bit Field Definitions */ -#define SYS_ALT_MFP1_PF3_MFP1_Pos 26 /*!< GCR_T::ALT_MFP1: PF3_MFP1 Position */ -#define SYS_ALT_MFP1_PF3_MFP1_Msk (0x3ul << SYS_ALT_MFP1_PF3_MFP1_Pos) /*!< GCR_T::ALT_MFP1: PF3_MFP1 Mask */ - -#define SYS_ALT_MFP1_PF2_MFP1_Pos 24 /*!< GCR_T::ALT_MFP1: PF2_MFP1 Position */ -#define SYS_ALT_MFP1_PF2_MFP1_Msk (0x3ul << SYS_ALT_MFP1_PF2_MFP1_Pos) /*!< GCR_T::ALT_MFP1: PF2_MFP1 Mask */ - -#define SYS_ALT_MFP1_PC8_MFP1_Pos 23 /*!< GCR_T::ALT_MFP1: PC8_MFP1 Position */ -#define SYS_ALT_MFP1_PC8_MFP1_Msk (1ul << SYS_ALT_MFP1_PC8_MFP1_Pos) /*!< GCR_T::ALT_MFP1: PC8_MFP1 Mask */ - -#define SYS_ALT_MFP1_PD5_MFP1_Pos 21 /*!< GCR_T::ALT_MFP1: PD5_MFP1 Position */ -#define SYS_ALT_MFP1_PD5_MFP1_Msk (1ul << SYS_ALT_MFP1_PD5_MFP1_Pos) /*!< GCR_T::ALT_MFP1: PD5_MFP1 Mask */ - -#define SYS_ALT_MFP1_PD4_MFP1_Pos 20 /*!< GCR_T::ALT_MFP1: PD4_MFP1 Position */ -#define SYS_ALT_MFP1_PD4_MFP1_Msk (1ul << SYS_ALT_MFP1_PD4_MFP1_Pos) /*!< GCR_T::ALT_MFP1: PD4_MFP1 Mask */ - -#define SYS_ALT_MFP1_PD3_MFP1_Pos 19 /*!< GCR_T::ALT_MFP1: PD3_MFP1 Position */ -#define SYS_ALT_MFP1_PD3_MFP1_Msk (1ul << SYS_ALT_MFP1_PD3_MFP1_Pos) /*!< GCR_T::ALT_MFP1: PD3_MFP1 Mask */ - -#define SYS_ALT_MFP1_PD2_MFP1_Pos 18 /*!< GCR_T::ALT_MFP1: PD2_MFP1 Position */ -#define SYS_ALT_MFP1_PD2_MFP1_Msk (1ul << SYS_ALT_MFP1_PD2_MFP1_Pos) /*!< GCR_T::ALT_MFP1: PD2_MFP1 Mask */ - -#define SYS_ALT_MFP1_PD1_MFP1_Pos 17 /*!< GCR_T::ALT_MFP1: PD1_MFP1 Position */ -#define SYS_ALT_MFP1_PD1_MFP1_Msk (1ul << SYS_ALT_MFP1_PD1_MFP1_Pos) /*!< GCR_T::ALT_MFP1: PD1_MFP1 Mask */ - -#define SYS_ALT_MFP1_PD0_MFP1_Pos 16 /*!< GCR_T::ALT_MFP1: PD0_MFP1 Position */ -#define SYS_ALT_MFP1_PD0_MFP1_Msk (1ul << SYS_ALT_MFP1_PD0_MFP1_Pos) /*!< GCR_T::ALT_MFP1: PD0_MFP1 Mask */ - -/* GCR GPA_IOCR Bit Field Definitions */ -#define SYS_GPA_IOCR_GPA11_DS_Pos 11 /*!< GCR_T::GPA_IOCR: GPA11_DS Position */ -#define SYS_GPA_IOCR_GPA11_DS_Msk (0x3ul << SYS_GPA_IOCR_GPA11_DS_Pos) /*!< GCR_T::GPA_IOCR: GPA11_DS Mask */ - -#define SYS_GPA_IOCR_GPA10_DS_Pos 10 /*!< GCR_T::GPA_IOCR: GPA10_DS Position */ -#define SYS_GPA_IOCR_GPA10_DS_Msk (0x3ul << SYS_GPA_IOCR_GPA10_DS_Pos) /*!< GCR_T::GPA_IOCR: GPA10_DS Mask */ - -/* GCR GPB_IOCR Bit Field Definitions */ -#define SYS_GPB_IOCR_GPB14_DS_Pos 14 /*!< GCR_T::GPB_IOCR: GPB14_DS Position */ -#define SYS_GPB_IOCR_GPB14_DS_Msk (0x3ul << SYS_GPB_IOCR_GPB14_DS_Pos) /*!< GCR_T::GPB_IOCR: GPB14_DS Mask */ - -#define SYS_GPB_IOCR_GPB13_DS_Pos 13 /*!< GCR_T::GPB_IOCR: GPB13_DS Position */ -#define SYS_GPB_IOCR_GPB13_DS_Msk (0x3ul << SYS_GPB_IOCR_GPB13_DS_Pos) /*!< GCR_T::GPB_IOCR: GPB13_DS Mask */ - -#define SYS_GPB_IOCR_GPB12_DS_Pos 12 /*!< GCR_T::GPB_IOCR: GPB12_DS Position */ -#define SYS_GPB_IOCR_GPB12_DS_Msk (0x3ul << SYS_GPB_IOCR_GPB12_DS_Pos) /*!< GCR_T::GPB_IOCR: GPB12_DS Mask */ - -#define SYS_GPB_IOCR_GPB8_DS_Pos 8 /*!< GCR_T::GPB_IOCR: GPB8_DS Position */ -#define SYS_GPB_IOCR_GPB8_DS_Msk (0x3ul << SYS_GPB_IOCR_GPB8_DS_Pos) /*!< GCR_T::GPB_IOCR: GPB8_DS Mask */ - -#define SYS_GPB_IOCR_GPB7_DS_Pos 7 /*!< GCR_T::GPB_IOCR: GPB7_DS Position */ -#define SYS_GPB_IOCR_GPB7_DS_Msk (0x3ul << SYS_GPB_IOCR_GPB7_DS_Pos) /*!< GCR_T::GPB_IOCR: GPB7_DS Mask */ - -#define SYS_GPB_IOCR_GPB6_DS_Pos 6 /*!< GCR_T::GPB_IOCR: GPB6_DS Position */ -#define SYS_GPB_IOCR_GPB6_DS_Msk (0x3ul << SYS_GPB_IOCR_GPB6_DS_Pos) /*!< GCR_T::GPB_IOCR: GPB6_DS Mask */ - -#define SYS_GPB_IOCR_GPB5_DS_Pos 5 /*!< GCR_T::GPB_IOCR: GPB5_DS Position */ -#define SYS_GPB_IOCR_GPB5_DS_Msk (0x3ul << SYS_GPB_IOCR_GPB5_DS_Pos) /*!< GCR_T::GPB_IOCR: GPB5_DS Mask */ - -#define SYS_GPB_IOCR_GPB4_DS_Pos 4 /*!< GCR_T::GPB_IOCR: GPB4_DS Position */ -#define SYS_GPB_IOCR_GPB4_DS_Msk (0x3ul << SYS_GPB_IOCR_GPB4_DS_Pos) /*!< GCR_T::GPB_IOCR: GPB4_DS Mask */ - -/* GCR GPD_IOCR Bit Field Definitions */ -#define SYS_GPD_IOCR_GPD11_DS_Pos 11 /*!< GCR_T::GPD_IOCR: GPD11_DS Position */ -#define SYS_GPD_IOCR_GPD11_DS_Msk (0x3ul << SYS_GPD_IOCR_GPD11_DS_Pos) /*!< GCR_T::GPD_IOCR: GPD11_DS Mask */ - -#define SYS_GPD_IOCR_GPD10_DS_Pos 10 /*!< GCR_T::GPD_IOCR: GPD10_DS Position */ -#define SYS_GPD_IOCR_GPD10_DS_Msk (0x3ul << SYS_GPD_IOCR_GPD10_DS_Pos) /*!< GCR_T::GPD_IOCR: GPD10_DS Mask */ - -#define SYS_GPD_IOCR_GPD9_DS_Pos 9 /*!< GCR_T::GPD_IOCR: GPD9_DS Position */ -#define SYS_GPD_IOCR_GPD9_DS_Msk (0x3ul << SYS_GPD_IOCR_GPD9_DS_Pos) /*!< GCR_T::GPD_IOCR: GPD9_DS Mask */ - -#define SYS_GPD_IOCR_GPD8_DS_Pos 8 /*!< GCR_T::GPD_IOCR: GPD8_DS Position */ -#define SYS_GPD_IOCR_GPD8_DS_Msk (0x3ul << SYS_GPD_IOCR_GPD8_DS_Pos) /*!< GCR_T::GPD_IOCR: GPD8_DS Mask */ - -/* GCR REGWRPROT Bit Field Definitions */ -#define SYS_REGWRPROT_REGWRPROT_Pos 0 /*!< GCR_T::REGWRPROT: REGWRPROT Position */ -#define SYS_REGWRPROT_REGWRPROT_Msk (0xFFul << SYS_REGWRPROT_REGWRPROT_Pos) /*!< GCR_T::REGWRPROT: REGWRPROT Mask */ - -#define SYS_REGWRPROT_REGPROTDIS_Pos 0 /*!< GCR_T::REGWRPROT: REGPROTDIS Position */ -#define SYS_REGWRPROT_REGPROTDIS_Msk (1ul << SYS_REGWRPROT_REGPROTDIS_Pos) /*!< GCR_T::REGWRPROT: REGPROTDIS Mask */ - -/* GCR GPA_MFPH Bit Field Definitions */ -#define SYS_GPA_MFPH_GPA15_MFP_Pos 28 /*!< GCR_T::GPA_MFPH: GPA15_MFP Position */ -#define SYS_GPA_MFPH_GPA15_MFP_Msk (0x7ul << SYS_GPA_MFPH_GPA15_MFP_Pos) /*!< GCR_T::GPA_MFPH: GPA15_MFP Mask */ - -#define SYS_GPA_MFPH_GPA14_MFP_Pos 24 /*!< GCR_T::GPA_MFPH: GPA14_MFP Position */ -#define SYS_GPA_MFPH_GPA14_MFP_Msk (0x7ul << SYS_GPA_MFPH_GPA14_MFP_Pos) /*!< GCR_T::GPA_MFPH: GPA14_MFP Mask */ - -#define SYS_GPA_MFPH_GPA13_MFP_Pos 20 /*!< GCR_T::GPA_MFPH: GPA13_MFP Position */ -#define SYS_GPA_MFPH_GPA13_MFP_Msk (0x7ul << SYS_GPA_MFPH_GPA13_MFP_Pos) /*!< GCR_T::GPA_MFPH: GPA13_MFP Mask */ - -#define SYS_GPA_MFPH_GPA12_MFP_Pos 16 /*!< GCR_T::GPA_MFPH: GPA12_MFP Position */ -#define SYS_GPA_MFPH_GPA12_MFP_Msk (0x7ul << SYS_GPA_MFPH_GPA12_MFP_Pos) /*!< GCR_T::GPA_MFPH: GPA12_MFP Mask */ - -#define SYS_GPA_MFPH_GPA11_MFP_Pos 12 /*!< GCR_T::GPA_MFPH: GPA11_MFP Position */ -#define SYS_GPA_MFPH_GPA11_MFP_Msk (0x7ul << SYS_GPA_MFPH_GPA11_MFP_Pos) /*!< GCR_T::GPA_MFPH: GPA11_MFP Mask */ - -#define SYS_GPA_MFPH_GPA10_MFP_Pos 8 /*!< GCR_T::GPA_MFPH: GPA10_MFP Position */ -#define SYS_GPA_MFPH_GPA10_MFP_Msk (0x7ul << SYS_GPA_MFPH_GPA10_MFP_Pos) /*!< GCR_T::GPA_MFPH: GPA10_MFP Mask */ - -/* GCR GPB_MFPL Bit Field Definitions */ -#define SYS_GPB_MFPL_GPB7_MFP_Pos 28 /*!< GCR_T::GPB_MFPL: GPB7_MFP Position */ -#define SYS_GPB_MFPL_GPB7_MFP_Msk (0x7ul << SYS_GPB_MFPL_GPB7_MFP_Pos) /*!< GCR_T::GPB_MFPL: GPB7_MFP Mask */ - -#define SYS_GPB_MFPL_GPB6_MFP_Pos 24 /*!< GCR_T::GPB_MFPL: GPB6_MFP Position */ -#define SYS_GPB_MFPL_GPB6_MFP_Msk (0x7ul << SYS_GPB_MFPL_GPB6_MFP_Pos) /*!< GCR_T::GPB_MFPL: GPB6_MFP Mask */ - -#define SYS_GPB_MFPL_GPB5_MFP_Pos 20 /*!< GCR_T::GPB_MFPL: GPB5_MFP Position */ -#define SYS_GPB_MFPL_GPB5_MFP_Msk (0x7ul << SYS_GPB_MFPL_GPB5_MFP_Pos) /*!< GCR_T::GPB_MFPL: GPB5_MFP Mask */ - -#define SYS_GPB_MFPL_GPB4_MFP_Pos 16 /*!< GCR_T::GPB_MFPL: GPB4_MFP Position */ -#define SYS_GPB_MFPL_GPB4_MFP_Msk (0x7ul << SYS_GPB_MFPL_GPB4_MFP_Pos) /*!< GCR_T::GPB_MFPL: GPB4_MFP Mask */ - -#define SYS_GPB_MFPL_GPB3_MFP_Pos 12 /*!< GCR_T::GPB_MFPL: GPB3_MFP Position */ -#define SYS_GPB_MFPL_GPB3_MFP_Msk (0x7ul << SYS_GPB_MFPL_GPB3_MFP_Pos) /*!< GCR_T::GPB_MFPL: GPB3_MFP Mask */ - -#define SYS_GPB_MFPL_GPB2_MFP_Pos 8 /*!< GCR_T::GPB_MFPL: GPB2_MFP Position */ -#define SYS_GPB_MFPL_GPB2_MFP_Msk (0x7ul << SYS_GPB_MFPL_GPB2_MFP_Pos) /*!< GCR_T::GPB_MFPL: GPB2_MFP Mask */ - -#define SYS_GPB_MFPL_GPB1_MFP_Pos 4 /*!< GCR_T::GPB_MFPL: GPB1_MFP Position */ -#define SYS_GPB_MFPL_GPB1_MFP_Msk (0x7ul << SYS_GPB_MFPL_GPB1_MFP_Pos) /*!< GCR_T::GPB_MFPL: GPB1_MFP Mask */ - -#define SYS_GPB_MFPL_GPB0_MFP_Pos 0 /*!< GCR_T::GPB_MFPL: GPB0_MFP Position */ -#define SYS_GPB_MFPL_GPB0_MFP_Msk (0x7ul << SYS_GPB_MFPL_GPB0_MFP_Pos) /*!< GCR_T::GPB_MFPL: GPB0_MFP Mask */ - -/* GCR GPB_MFPH Bit Field Definitions */ -#define SYS_GPB_MFPH_GPB15_MFP_Pos 28 /*!< GCR_T::GPB_MFPH: GPB15_MFP Position */ -#define SYS_GPB_MFPH_GPB15_MFP_Msk (0x7ul << SYS_GPB_MFPH_GPB15_MFP_Pos) /*!< GCR_T::GPB_MFPH: GPB15_MFP Mask */ - -#define SYS_GPB_MFPH_GPB14_MFP_Pos 24 /*!< GCR_T::GPB_MFPH: GPB14_MFP Position */ -#define SYS_GPB_MFPH_GPB14_MFP_Msk (0x7ul << SYS_GPB_MFPH_GPB14_MFP_Pos) /*!< GCR_T::GPB_MFPH: GPB14_MFP Mask */ - -#define SYS_GPB_MFPH_GPB13_MFP_Pos 20 /*!< GCR_T::GPB_MFPH: GPB13_MFP Position */ -#define SYS_GPB_MFPH_GPB13_MFP_Msk (0x7ul << SYS_GPB_MFPH_GPB13_MFP_Pos) /*!< GCR_T::GPB_MFPH: GPB13_MFP Mask */ - -#define SYS_GPB_MFPH_GPB12_MFP_Pos 16 /*!< GCR_T::GPB_MFPH: GPB12_MFP Position */ -#define SYS_GPB_MFPH_GPB12_MFP_Msk (0x7ul << SYS_GPB_MFPH_GPB12_MFP_Pos) /*!< GCR_T::GPB_MFPH: GPB12_MFP Mask */ - -#define SYS_GPB_MFPH_GPB10_MFP_Pos 8 /*!< GCR_T::GPB_MFPH: GPB10_MFP Position */ -#define SYS_GPB_MFPH_GPB10_MFP_Msk (0x7ul << SYS_GPB_MFPH_GPB10_MFP_Pos) /*!< GCR_T::GPB_MFPH: GPB10_MFP Mask */ - -#define SYS_GPB_MFPH_GPB9_MFP_Pos 4 /*!< GCR_T::GPB_MFPH: GPB9_MFP Position */ -#define SYS_GPB_MFPH_GPB9_MFP_Msk (0x7ul << SYS_GPB_MFPH_GPB9_MFP_Pos) /*!< GCR_T::GPB_MFPH: GPB9_MFP Mask */ - -#define SYS_GPB_MFPH_GPB8_MFP_Pos 0 /*!< GCR_T::GPB_MFPH: GPB8_MFP Position */ -#define SYS_GPB_MFPH_GPB8_MFP_Msk (0x7ul << SYS_GPB_MFPH_GPB8_MFP_Pos) /*!< GCR_T::GPB_MFPH: GPB8_MFP Mask */ - -/* GCR GPC_MFPL Bit Field Definitions */ -#define SYS_GPC_MFPL_GPC5_MFP_Pos 20 /*!< GCR_T::GPC_MFPL: GPC5_MFP Position */ -#define SYS_GPC_MFPL_GPC5_MFP_Msk (0x7ul << SYS_GPC_MFPL_GPC5_MFP_Pos) /*!< GCR_T::GPC_MFPL: GPC5_MFP Mask */ - -#define SYS_GPC_MFPL_GPC4_MFP_Pos 16 /*!< GCR_T::GPC_MFPL: GPC4_MFP Position */ -#define SYS_GPC_MFPL_GPC4_MFP_Msk (0x7ul << SYS_GPC_MFPL_GPC4_MFP_Pos) /*!< GCR_T::GPC_MFPL: GPC4_MFP Mask */ - -#define SYS_GPC_MFPL_GPC3_MFP_Pos 12 /*!< GCR_T::GPC_MFPL: GPC3_MFP Position */ -#define SYS_GPC_MFPL_GPC3_MFP_Msk (0x7ul << SYS_GPC_MFPL_GPC3_MFP_Pos) /*!< GCR_T::GPC_MFPL: GPC3_MFP Mask */ - -#define SYS_GPC_MFPL_GPC2_MFP_Pos 8 /*!< GCR_T::GPC_MFPL: GPC2_MFP Position */ -#define SYS_GPC_MFPL_GPC2_MFP_Msk (0x7ul << SYS_GPC_MFPL_GPC2_MFP_Pos) /*!< GCR_T::GPC_MFPL: GPC2_MFP Mask */ - -#define SYS_GPC_MFPL_GPC1_MFP_Pos 4 /*!< GCR_T::GPC_MFPL: GPC1_MFP Position */ -#define SYS_GPC_MFPL_GPC1_MFP_Msk (0x7ul << SYS_GPC_MFPL_GPC1_MFP_Pos) /*!< GCR_T::GPC_MFPL: GPC1_MFP Mask */ - -#define SYS_GPC_MFPL_GPC0_MFP_Pos 0 /*!< GCR_T::GPC_MFPL: GPC0_MFP Position */ -#define SYS_GPC_MFPL_GPC0_MFP_Msk (0x7ul << SYS_GPC_MFPL_GPC0_MFP_Pos) /*!< GCR_T::GPC_MFPL: GPC0_MFP Mask */ - -/* GCR GPC_MFPH Bit Field Definitions */ -#define SYS_GPC_MFPH_GPC13_MFP_Pos 20 /*!< GCR_T::GPC_MFPH: GPC13_MFP Position */ -#define SYS_GPC_MFPH_GPC13_MFP_Msk (0x7ul << SYS_GPC_MFPH_GPC13_MFP_Pos) /*!< GCR_T::GPC_MFPH: GPC13_MFP Mask */ - -#define SYS_GPC_MFPH_GPC12_MFP_Pos 16 /*!< GCR_T::GPC_MFPH: GPC12_MFP Position */ -#define SYS_GPC_MFPH_GPC12_MFP_Msk (0x7ul << SYS_GPC_MFPH_GPC12_MFP_Pos) /*!< GCR_T::GPC_MFPH: GPC12_MFP Mask */ - -#define SYS_GPC_MFPH_GPC11_MFP_Pos 12 /*!< GCR_T::GPC_MFPH: GPC11_MFP Position */ -#define SYS_GPC_MFPH_GPC11_MFP_Msk (0x7ul << SYS_GPC_MFPH_GPC11_MFP_Pos) /*!< GCR_T::GPC_MFPH: GPC11_MFP Mask */ - -#define SYS_GPC_MFPH_GPC10_MFP_Pos 8 /*!< GCR_T::GPC_MFPH: GPC11_MFP Position */ -#define SYS_GPC_MFPH_GPC10_MFP_Msk (0x7ul << SYS_GPC_MFPH_GPC10_MFP_Pos) /*!< GCR_T::GPC_MFPH: GPC11_MFP Mask */ - -#define SYS_GPC_MFPH_GPC9_MFP_Pos 4 /*!< GCR_T::GPC_MFPH: GPC9_MFP Position */ -#define SYS_GPC_MFPH_GPC9_MFP_Msk (0x7ul << SYS_GPC_MFPH_GPC9_MFP_Pos) /*!< GCR_T::GPC_MFPH: GPC9_MFP Mask */ - -#define SYS_GPC_MFPH_GPC8_MFP_Pos 0 /*!< GCR_T::GPC_MFPH: GPC8_MFP Position */ -#define SYS_GPC_MFPH_GPC8_MFP_Msk (0x7ul << SYS_GPC_MFPH_GPC8_MFP_Pos) /*!< GCR_T::GPC_MFPH: GPC8_MFP Mask */ - -/* GCR GPD_MFPL Bit Field Definitions */ -#define SYS_GPD_MFPL_GPD5_MFP_Pos 20 /*!< GCR_T::GPD_MFPL: GPD5_MFP Position */ -#define SYS_GPD_MFPL_GPD5_MFP_Msk (0x7ul << SYS_GPD_MFPL_GPD5_MFP_Pos) /*!< GCR_T::GPD_MFPL: GPD5_MFP Mask */ - -#define SYS_GPD_MFPL_GPD4_MFP_Pos 16 /*!< GCR_T::GPD_MFPL: GPD4_MFP Position */ -#define SYS_GPD_MFPL_GPD4_MFP_Msk (0x7ul << SYS_GPD_MFPL_GPD4_MFP_Pos) /*!< GCR_T::GPD_MFPL: GPD4_MFP Mask */ - -#define SYS_GPD_MFPL_GPD3_MFP_Pos 12 /*!< GCR_T::GPD_MFPL: GPD3_MFP Position */ -#define SYS_GPD_MFPL_GPD3_MFP_Msk (0x7ul << SYS_GPD_MFPL_GPD3_MFP_Pos) /*!< GCR_T::GPD_MFPL: GPD3_MFP Mask */ - -#define SYS_GPD_MFPL_GPD2_MFP_Pos 8 /*!< GCR_T::GPD_MFPL: GPD2_MFP Position */ -#define SYS_GPD_MFPL_GPD2_MFP_Msk (0x7ul << SYS_GPD_MFPL_GPD2_MFP_Pos) /*!< GCR_T::GPD_MFPL: GPD2_MFP Mask */ - -#define SYS_GPD_MFPL_GPD1_MFP_Pos 4 /*!< GCR_T::GPD_MFPL: GPD1_MFP Position */ -#define SYS_GPD_MFPL_GPD1_MFP_Msk (0x7ul << SYS_GPD_MFPL_GPD1_MFP_Pos) /*!< GCR_T::GPD_MFPL: GPD1_MFP Mask */ - -#define SYS_GPD_MFPL_GPD0_MFP_Pos 0 /*!< GCR_T::GPD_MFPL: GPD0_MFP Position */ -#define SYS_GPD_MFPL_GPD0_MFP_Msk (0x7ul << SYS_GPD_MFPL_GPD0_MFP_Pos) /*!< GCR_T::GPD_MFPL: GPD0_MFP Mask */ - -/* GCR GPD_MFPH Bit Field Definitions */ -#define SYS_GPD_MFPH_GPD11_MFP_Pos 12 /*!< GCR_T::GPD_MFPH: GPD11_MFP Position */ -#define SYS_GPD_MFPH_GPD11_MFP_Msk (0x7ul << SYS_GPD_MFPH_GPD11_MFP_Pos) /*!< GCR_T::GPD_MFPH: GPD11_MFP Mask */ - -#define SYS_GPD_MFPH_GPD10_MFP_Pos 8 /*!< GCR_T::GPD_MFPH: GPD10_MFP Position */ -#define SYS_GPD_MFPH_GPD10_MFP_Msk (0x7ul << SYS_GPD_MFPH_GPD10_MFP_Pos) /*!< GCR_T::GPD_MFPH: GPD10_MFP Mask */ - -#define SYS_GPD_MFPH_GPD9_MFP_Pos 4 /*!< GCR_T::GPD_MFPH: GPD9_MFP Position */ -#define SYS_GPD_MFPH_GPD9_MFP_Msk (0x7ul << SYS_GPD_MFPH_GPD9_MFP_Pos) /*!< GCR_T::GPD_MFPH: GPD9_MFP Mask */ - -#define SYS_GPD_MFPH_GPD8_MFP_Pos 0 /*!< GCR_T::GPD_MFPH: GPD8_MFP Position */ -#define SYS_GPD_MFPH_GPD8_MFP_Msk (0x7ul << SYS_GPD_MFPH_GPD8_MFP_Pos) /*!< GCR_T::GPD_MFPH: GPD8_MFP Mask */ - -/* GCR GPF_MFPL Bit Field Definitions */ -#define SYS_GPF_MFPL_GPF3_MFP_Pos 12 /*!< GCR_T::GPF_MFPL: GPF3_MFP Position */ -#define SYS_GPF_MFPL_GPF3_MFP_Msk (0x7ul << SYS_GPF_MFPL_GPF3_MFP_Pos) /*!< GCR_T::GPF_MFPL: GPF3_MFP Mask */ - -#define SYS_GPF_MFPL_GPF2_MFP_Pos 8 /*!< GCR_T::GPF_MFPL: GPF2_MFP Position */ -#define SYS_GPF_MFPL_GPF2_MFP_Msk (0x7ul << SYS_GPF_MFPL_GPF2_MFP_Pos) /*!< GCR_T::GPF_MFPL: GPF2_MFP Mask */ - -#define SYS_GPF_MFPL_GPF1_MFP_Pos 4 /*!< GCR_T::GPF_MFPL: GPF1_MFP Position */ -#define SYS_GPF_MFPL_GPF1_MFP_Msk (0x7ul << SYS_GPF_MFPL_GPF1_MFP_Pos) /*!< GCR_T::GPF_MFPL: GPF1_MFP Mask */ - -#define SYS_GPF_MFPL_GPF0_MFP_Pos 0 /*!< GCR_T::GPF_MFPL: GPF0_MFP Position */ -#define SYS_GPF_MFPL_GPF0_MFP_Msk (0x7ul << SYS_GPF_MFPL_GPF0_MFP_Pos) /*!< GCR_T::GPF_MFPL: GPF0_MFP Mask */ - - -/*@}*/ /* end of group REG_SYS_BITMASK */ - - - -typedef struct -{ - - -/** - * @var GCR_INT_T::IRQSRC - * Offset: 0x00~0x7C IRQ0~IRQ31 Interrupt Source Identity - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[3:0] |INT_SRC |Interrupt Source - * | | |Define the interrupt sources for interrupt event. - * @var GCR_INT_T::NMISEL - * Offset: 0x80 NMI Source Interrupt Select Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[4:0] |NMI_SEL |NMI Interrupt Source Selection - * | | |The NMI interrupt to Cortex-M0 can be selected from one of the peripheral interrupt by setting NMI_SEL with corresponding interrupt number. - * |[8] |NMI_EN |NMI Interrupt Enable Bit (Write Protect) - * | | |0 = NMI interrupt Disabled. - * | | |1 = NMI interrupt Enabled. - * | | |Note: This bit is write protected bit. Refer to the REGWRPROT register. - * @var GCR_INT_T::MCUIRQ - * Offset: 0x84 MCU Interrupt Request Source Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |MCU_IRQ |MCU IRQ Source Register - * | | |The MCU_IRQ collects all the interrupts from the peripherals and generates the synchronous interrupt to Cortex-M0. There are two modes to generate interrupt to Cortex-M0, Normal mode and Test mode. - * | | |The MCU_IRQ collects all interrupts from each peripheral and synchronizes them and then interrupts the Cortex-M0. - * | | |When the MCU_IRQ[n] is 0: Set MCU_IRQ[n] 1 will generate an interrupt to Cortex_M0 NVIC[n]. - * | | |When the MCU_IRQ[n] is 1 (mean an interrupt is assert), setting 1 to the MCU_IRQ[n] will clear the interrupt and setting MCU_IRQ[n] 0 has no effect. - */ - - __I uint32_t IRQSRC[32]; /* Offset: 0x00~0x7C IRQ0~IRQ31 Interrupt Source Identity */ - __IO uint32_t NMISEL; /* Offset: 0x80 NMI Source Interrupt Select Control Register */ - __IO uint32_t MCUIRQ; /* Offset: 0x84 MCU Interrupt Request Source Register */ - -} GCR_INT_T; - - - -/** @addtogroup REG_INT_BITMASK INT Bit Mask - @{ - */ - -/* INT IRQSRC Bit Field Definitions */ -#define INT_IRQSRC_INT_SRC_Pos 0 /*!< GCR_INT_T::IRQSRC: INT_SRC Position */ -#define INT_IRQSRC_INT_SRC_Msk (0xFul << INT_IRQSRC_INT_SRC_Pos) /*!< GCR_INT_T::IRQSRC: INT_SRC Mask */ - -/* INT NMI_SEL Bit Field Definitions */ -#define INT_NMI_SEL_NMI_EN_Pos 8 /*!< GCR_INT_T::NMISEL: NMI_EN Position */ -#define INT_NMI_SEL_NMI_EN_Msk (1ul << INT_NMI_SEL_NMI_EN_Pos) /*!< GCR_INT_T::NMISEL: NMI_EN Mask */ - -#define INT_NMI_SEL_NMI_SEL_Pos 0 /*!< GCR_INT_T::NMISEL: NMI_SEL Position */ -#define INT_NMI_SEL_NMI_SEL_Msk (0x1Ful << INT_NMI_SEL_NMI_SEL_Pos) /*!< GCR_INT_T::NMISEL: NMI_SEL Mask */ - -/* INT MCUIRQ Bit Field Definitions */ -#define INT_MCUIRQ_MCU_IRQ_Pos 0 /*!< GCR_INT_T::MCUIRQ: MCU_IRQ Position */ -#define INT_MCUIRQ_MCU_IRQ_Msk (0xFFFFFFFFul << INT_MCUIRQ_MCU_IRQ_Pos) /*!< GCR_INT_T::MCUIRQ: MCU_IRQ Mask */ - -/*@}*/ /* end of group REG_SYS_BITMASK */ -/*@}*/ /* end of group REG_SYS*/ - -/*----------------------------- Timer Controller (TMR) -----------------------------*/ -/** @addtogroup REG_TIMER Timer Controller (TIMER) - Memory Mapped Structure for Timer Controller - @{ - */ - -typedef struct -{ - - -/** - * @var TIMER_T::TCSR - * Offset: 0x00 Timer Control and Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[7:0] |PRESCALE |Prescale Counter - * | | |Timer input clock source is divided by (PRESCALE+1) before it is fed to the Timer up counter. - * | | |If this field is 0 (PRESCALE = 0), then there is no scaling. - * |[16] |TDR_EN |Data Load Enable Control - * | | |When TDR_EN is set, TDR (Timer Data Register) will be updated continuously with the 24-bit up-timer value as the timer is counting. - * | | |0 = Timer Data Register update Disabled. - * | | |1 = Timer Data Register update Enabled while Timer counter is active. - * |[23] |WAKE_EN |Wake Up Function Enable Control - * | | |0 = Wake-up trigger event Disabled. - * | | |1 = Wake-up trigger event Enabled. - * |[24] |CTB |Counter Mode Enable Control - * | | |This bit is for external counting pin function enabled. - * | | |When timer is used as an event counter, this bit should be set to 1 and select HCLK as timer clock source. - * | | |0 = External counter mode Disabled. - * | | |1 = External counter mode Enabled. - * |[25] |CACT |Timer Active Status (Read Only) - * | | |This bit indicates the 24-bit up counter status. - * | | |0 = 24-bit up counter is not active. - * | | |1 = 24-bit up counter is active. - * |[26] |CRST |Timer Reset - * | | |0 = No effect. - * | | |1 = Reset 8-bit prescale counter, 24-bit up counter value and CEN bit if CACT is 1. - * |[28:27] |MODE |Timer Operating Mode - * | | |00 = The Timer controller is operated in One-shot mode. - * | | |01 = The Timer controller is operated in Periodic mode. - * | | |10 = The Timer controller is operated in Toggle-output mode. - * | | |11 = The Timer controller is operated in Continuous Counting mode. - * |[29] |IE |Interrupt Enable Control - * | | |0 = Timer Interrupt function Disabled. - * | | |1 = Timer Interrupt function Enabled. - * | | |If this bit is enabled, when the timer interrupt flag (TISR[0] TIF) is set to 1, the timer interrupt signal is generated and inform to CPU. - * |[30] |CEN |Timer Enable Control - * | | |0 = Stops/Suspends counting. - * | | |1 = Starts counting. - * | | |Note1: In stop status, and then set CEN to 1 will enable the 24-bit up counter to keep counting from the last stop counting value. - * | | |Note2: This bit is auto-cleared by hardware in one-shot mode (TCSR [28:27] = 00) when the timer interrupt flag (TISR[0] TIF) is generated. - * |[31] |DBGACK_TMR|ICE Debug Mode Acknowledge Disable (Write Protect) - * | | |0 = ICE debug mode acknowledgment effects TIMER counting. - * | | |TIMER counter will be held while CPU is held by ICE. - * | | |1 = ICE debug mode acknowledgment Disabled. - * | | |TIMER counter will keep going no matter CPU is held by ICE or not. - * @var TIMER_T::TCMPR - * Offset: 0x04 Timer Compare Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[23:0] |TCMP |Timer Compared Value - * | | |TCMP is a 24-bit compared value register. - * | | |When the internal 24-bit up counter value is equal to TCMP value, the TIF flag will set to 1. - * | | |Time-out period = (Period of Timer clock input) * (8-bit PRESCALE + 1) * (24-bit TCMP). - * | | |Note1: Never write 0x0 or 0x1 in TCMP field, or the core will run into unknown state. - * | | |Note2: When timer is operating at continuous counting mode, the 24-bit up counter will keep counting continuously even if user writes a new value into TCMP field. - * | | |But if timer is operating at other modes, the 24-bit up counter will restart counting and using newest TCMP value to be the timer compared value if user writes a new value into TCMP field. - * @var TIMER_T::TISR - * Offset: 0x08 Timer Interrupt Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |TIF |Timer Interrupt Flag - * | | |This bit indicates the interrupt flag status of Timer while TDR value reaches to TCMP value. - * | | |0 = No effect. - * | | |1 = TDR value matches the TCMP value. - * | | |Note: This bit is cleared by writing 1 to it. - * |[1] |TWF |Timer Wake-Up Flag - * | | |This bit indicates the interrupt wake-up flag status of Timer. - * | | |0 = Timer does not cause CPU wake-up. - * | | |1 = CPU wake-up from Idle or Power-down mode if Timer time-out interrupt signal generated. - * | | |Note: This bit is cleared by writing 1 to it. - * @var TIMER_T::TDR - * Offset: 0x0C Timer Data Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[23:0] |TDR |Timer Data Register - * | | |If TDR_EN (TCSR[16]) is set to 1, TDR register will be updated continuously to monitor 24-bit up counter value. - * @var TIMER_T::TCAP - * Offset: 0x10 Timer Capture Data Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[23:0] |TCAP |Timer Capture Data Register - * | | |When TEXIF flag is set to 1, the current TDR value will be auto-loaded into this TCAP filed immediately. - * @var TIMER_T::TEXCON - * Offset: 0x14 Timer External Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |TX_PHASE |Timer External Count Pin Phase Detect Selection - * | | |This bit indicates the detection phase of TMx pin. - * | | |0 = A falling edge of TMx pin will be counted. - * | | |1 = A rising edge of TMx pin will be counted. - * |[2:1] |TEX_EDGE |Timer External Capture Pin Edge Detect Selection - * | | |00 = A 1 to 0 transition on TMx_EXT pin will be detected. - * | | |01 = A 0 to 1 transition on TMx_EXT pin will be detected. - * | | |10 = Either 1 to 0 or 0 to 1 transition on TMx_EXT pin will be detected. - * | | |11 = Reserved. - * |[3] |TEXEN |Timer External Pin Function Enable - * | | |This bit enables the RSTCAPSEL function on the TxEX pin. - * | | |0 = RSTCAPSEL function of TxEX pin will be ignored. - * | | |1 = RSTCAPSEL function of TxEX pin is active. - * |[4] |RSTCAPSEL |Timer External Reset Counter / Timer External Capture Mode Selection - * | | |0 = Transition on TMx_EXT - * | | |pin is using to save the TDR value into TCAP value if TEXIF flag is set to 1. - * | | |1 = Transition on TMx_EXT pin is using to reset the 24-bit up counter. - * |[5] |TEXIEN |Timer External Capture Interrupt Enable Control - * | | |0 = TMx_EXT pin detection Interrupt Disabled. - * | | |1 = TMx_EXT pin detection Interrupt Enabled. - * | | |If TEXIEN enabled, Timer will raise an external capture interrupt signal and inform to CPU while TEXIF flag is set to 1. - * |[6] |TEXDB |Timer External Capture Input Pin De-Bounce Enable Control - * | | |0 = TMx_EXT pin de-bounce Disabled. - * | | |1 = TMx_EXT pin de-bounce Enabled. - * | | |If this bit is enabled, the edge detection of TMx_EXT pin is detected with de-bounce circuit. - * |[7] |TCDB |Timer External Counter Input Pin De-Bounce Enable Control - * | | |0 = TMx pin de-bounce Disabled. - * | | |1 = TMx pin de-bounce Enabled. - * | | |If this bit is enabled, the edge detection of TMx pin is detected with de-bounce circuit. - * @var TIMER_T::TEXISR - * Offset: 0x18 Timer External Interrupt Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |TEXIF |Timer External Capture Interrupt Flag - * | | |This bit indicates the external capture interrupt flag status. - * | | |When TEXEN enabled, TMx_EXT pin selected as external capture function, and a transition on TMx_EXT pin matched the TEX_EDGE setting, this flag will set to 1 by hardware. - * | | |1 = TMx_EXT - * | | |pin interrupt occurred. - * | | |0 = TMx_EXT - * | | |pin interrupt did not occur. - * | | |Note: This bit is cleared by writing 1 to it. - */ - - __IO uint32_t TCSR; /* Offset: 0x00 Timer Control and Status Register */ - __IO uint32_t TCMPR; /* Offset: 0x04 Timer Compare Register */ - __IO uint32_t TISR; /* Offset: 0x08 Timer Interrupt Status Register */ - __I uint32_t TDR; /* Offset: 0x0C Timer Data Register */ - __I uint32_t TCAP; /* Offset: 0x10 Timer Capture Data Register */ - __IO uint32_t TEXCON; /* Offset: 0x14 Timer External Control Register */ - __IO uint32_t TEXISR; /* Offset: 0x18 Timer External Interrupt Status Register */ - -} TIMER_T; - - - - -/** @addtogroup REG_TIMER_BITMASK TIMER Bit Mask - @{ - */ - - -/* TIMER TCSR Bit Field Definitions */ -#define TIMER_TCSR_DBGACK_TMR_Pos 31 /*!< TIMER_T::TCSR: DBGACK_TMR Position */ -#define TIMER_TCSR_DBGACK_TMR_Msk (1ul << TIMER_TCSR_DBGACK_TMR_Pos) /*!< TIMER_T::TCSR: DBGACK_TMR Mask */ - -#define TIMER_TCSR_CEN_Pos 30 /*!< TIMER_T::TCSR: CEN Position */ -#define TIMER_TCSR_CEN_Msk (1ul << TIMER_TCSR_CEN_Pos) /*!< TIMER_T::TCSR: CEN Mask */ - -#define TIMER_TCSR_IE_Pos 29 /*!< TIMER_T::TCSR: IE Position */ -#define TIMER_TCSR_IE_Msk (1ul << TIMER_TCSR_IE_Pos) /*!< TIMER_T::TCSR: IE Mask */ - -#define TIMER_TCSR_MODE_Pos 27 /*!< TIMER_T::TCSR: MODE Position */ -#define TIMER_TCSR_MODE_Msk (0x3ul << TIMER_TCSR_MODE_Pos) /*!< TIMER_T::TCSR: MODE Mask */ - -#define TIMER_TCSR_CRST_Pos 26 /*!< TIMER_T::TCSR: CRST Position */ -#define TIMER_TCSR_CRST_Msk (1ul << TIMER_TCSR_CRST_Pos) /*!< TIMER_T::TCSR: CRST Mask */ - -#define TIMER_TCSR_CACT_Pos 25 /*!< TIMER_T::TCSR: CACT Position */ -#define TIMER_TCSR_CACT_Msk (1ul << TIMER_TCSR_CACT_Pos) /*!< TIMER_T::TCSR: CACT Mask */ - -#define TIMER_TCSR_CTB_Pos 24 /*!< TIMER_T::TCSR: CTB Position */ -#define TIMER_TCSR_CTB_Msk (1ul << TIMER_TCSR_CTB_Pos) /*!< TIMER_T::TCSR: CTB Mask */ - -#define TIMER_TCSR_WAKE_EN_Pos 23 /*!< TIMER_T::TCSR: WAKE_EN Position */ -#define TIMER_TCSR_WAKE_EN_Msk (1ul << TIMER_TCSR_WAKE_EN_Pos) /*!< TIMER_T::TCSR: WAKE_EN Mask */ - -#define TIMER_TCSR_TDR_EN_Pos 16 /*!< TIMER_T::TCSR: TDR_EN Position */ -#define TIMER_TCSR_TDR_EN_Msk (1ul << TIMER_TCSR_TDR_EN_Pos) /*!< TIMER_T::TCSR: TDR_EN Mask */ - -#define TIMER_TCSR_PRESCALE_Pos 0 /*!< TIMER_T::TCSR: PRESCALE Position */ -#define TIMER_TCSR_PRESCALE_Msk (0xFFul << TIMER_TCSR_PRESCALE_Pos) /*!< TIMER_T::TCSR: PRESCALE Mask */ - -/* TIMER TCMPR Bit Field Definitions */ -#define TIMER_TCMP_TCMP_Pos 0 /*!< TIMER_T::TCMPR: TCMP Position */ -#define TIMER_TCMP_TCMP_Msk (0xFFFFFFul << TIMER_TCMP_TCMP_Pos) /*!< TIMER_T::TCMPR: TCMP Mask */ - -/* TIMER TISR Bit Field Definitions */ -#define TIMER_TISR_TWF_Pos 1 /*!< TIMER_T::TISR: TWF Position */ -#define TIMER_TISR_TWF_Msk (1ul << TIMER_TISR_TWF_Pos) /*!< TIMER_T::TISR: TWF Mask */ - -#define TIMER_TISR_TIF_Pos 0 /*!< TIMER_T::TISR: TIF Position */ -#define TIMER_TISR_TIF_Msk (1ul << TIMER_TISR_TIF_Pos) /*!< TIMER_T::TISR: TIF Mask */ - -/* TIMER TDR Bit Field Definitions */ -#define TIMER_TDR_TDR_Pos 0 /*!< TIMER_T::TDR: TDR Position */ -#define TIMER_TDR_TDR_Msk (0xFFFFFFul << TIMER_TDR_TDR_Pos) /*!< TIMER_T::TDR: TDR Mask */ - -/* TIMER TCAP Bit Field Definitions */ -#define TIMER_TCAP_TCAP_Pos 0 /*!< TIMER_T::TCAP: TCAP Position */ -#define TIMER_TCAP_TCAP_Msk (0xFFFFFFul << TIMER_TCAP_TCAP_Pos) /*!< TIMER_T::TCAP: TCAP Mask */ - -/* TIMER TEXCON Bit Field Definitions */ -#define TIMER_TEXCON_TCDB_Pos 7 /*!< TIMER_T::TEXCON: TCDB Position */ -#define TIMER_TEXCON_TCDB_Msk (1ul << TIMER_TEXCON_TCDB_Pos) /*!< TIMER_T::TEXCON: TCDB Mask */ - -#define TIMER_TEXCON_TEXDB_Pos 6 /*!< TIMER_T::TEXCON: TEXDB Position */ -#define TIMER_TEXCON_TEXDB_Msk (1ul << TIMER_TEXCON_TEXDB_Pos) /*!< TIMER_T::TEXCON: TEXDB Mask */ - -#define TIMER_TEXCON_TEXIEN_Pos 5 /*!< TIMER_T::TEXCON: TEXIEN Position */ -#define TIMER_TEXCON_TEXIEN_Msk (1ul << TIMER_TEXCON_TEXIEN_Pos) /*!< TIMER_T::TEXCON: TEXIEN Mask */ - -#define TIMER_TEXCON_RSTCAPSEL_Pos 4 /*!< TIMER_T::TEXCON: RSTCAPSEL Position */ -#define TIMER_TEXCON_RSTCAPSEL_Msk (1ul << TIMER_TEXCON_RSTCAPSEL_Pos) /*!< TIMER_T::TEXCON: RSTCAPSEL Mask */ - -#define TIMER_TEXCON_TEXEN_Pos 3 /*!< TIMER_T::TEXCON: TEXEN Position */ -#define TIMER_TEXCON_TEXEN_Msk (1ul << TIMER_TEXCON_TEXEN_Pos) /*!< TIMER_T::TEXCON: TEXEN Mask */ - -#define TIMER_TEXCON_TEX_EDGE_Pos 1 /*!< TIMER_T::TEXCON: TEX_EDGE Position */ -#define TIMER_TEXCON_TEX_EDGE_Msk (0x3ul << TIMER_TEXCON_TEX_EDGE_Pos) /*!< TIMER_T::TEXCON: TEX_EDGE Mask */ - -#define TIMER_TEXCON_TX_PHASE_Pos 0 /*!< TIMER_T::TEXCON: TX_PHASE Position */ -#define TIMER_TEXCON_TX_PHASE_Msk (1ul << TIMER_TEXCON_TX_PHASE_Pos) /*!< TIMER_T::TEXCON: TX_PHASE Mask */ - -/* TIMER TEXISR Bit Field Definitions */ -#define TIMER_TEXISR_TEXIF_Pos 0 /*!< TIMER_T::TEXISR: TEXIF Position */ -#define TIMER_TEXISR_TEXIF_Msk (1ul << TIMER_TEXISR_TEXIF_Pos) /*!< TIMER_T::TEXISR: TEXIF Mask */ -/*@}*/ /* end of group REG_TIMER_BITMASK */ -/*@}*/ /* end of group REG_TIMER */ - - -/*------------------------- UART Interface Controller ------------------------*/ - -/** @addtogroup REG_UART Universal Asynchronous Receiver/Transmitter Controller (UART) - Memory Mapped Structure for UART Serial Interface Controller - @{ - */ - -typedef struct -{ - - - /** - * @var UART_T::DATA - * Offset: 0x00 UART Data Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[7:0] |DATA |Data Register - * | | |By writing to this register, the UART will send out an 8-bit data through the UART_TXD pin (LSB first). - * | | |By reading this register, the UART will return an 8-bit data received from UART_RXD pin (LSB first). - * @var UART_T::THR - * Offset: 0x00 UART Transmit Holding Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[7:0] | THR |Transmit Holding Register - * | | |By writing to this register, the UART will send out an 8-bit data through the UART_TXD pin (LSB first). - * @var UART_T::RBR - * Offset: 0x00 UART Receive Buffer Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[7:0] |RBR |Receive Buffer Register (Read Only) - * | | |By reading this register, the UART will return the 8-bit data received from UART_RXD pin (LSB first). - * @var UART_T::IER - * Offset: 0x04 UART Interrupt Enable Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |RDA_IEN |Receive Data Available Interrupt Enable Bit - * | | |0 = Receive data available interrupt Disabled. - * | | |1 = Receive data available interrupt Enabled. - * |[1] |THRE_IEN |Transmit Holding Register Empty Interrupt Enable Bit - * | | |0 = Transmit holding register empty interrupt Disabled. - * | | |1 = Transmit holding register empt interrupt Enabled. - * |[2] |RLS_IEN |Receive Line Status Interrupt Enable Bit - * | | |0 = Receive Line Status interrupt Disabled. - * | | |1 = Receive Line Status interrupt Enabled. - * |[3] |MODEM_IEN |Modem Status Interrupt Enable Bit - * | | |0 = Modem status interrupt Disabled. - * | | |1 = Modem status interrupt Enabled. - * |[4] |RTO_IEN |RX Time-out Interrupt Enable Bit - * | | |0 = RX time-out interrupt Disabled. - * | | |1 = RX time-out interrupt Enabled. - * |[5] |BUF_ERR_IEN|Buffer Error Interrupt Enable Bit - * | | |0 = Buffer error interrupt Disabled. - * | | |1 = Buffer error interrupt Enabled. - * |[6] |WAKE_EN |UART Wake-up Function Enable Bit - * | | |0 = UART wake-up function Disabled. - * | | |1 = UART wake-up function Enabled, when chip is in Power-down mode, an external nCTS change will wake up chip from Power-down mode. - * |[11] |TIME_OUT_EN|Receive Buffer Time-out Counter Enable Bit - * | | |0 = Receive Buffer Time-out counter Disabled. - * | | |1 = Receive Buffer Time-out counter Enabled. - * |[12] |AUTO_RTS_EN|nRTS Auto Flow Control Enable Bit - * | | |0 = nRTS auto flow control Disabled. - * | | |1 = nRTS auto flow control Enabled. - * | | |Note: When nRTS auto-flow is enabled, if the number of bytes in the RX FIFO is equal to the RTS_TRI_LEV (UA_FCR [19:16]), the UART will de-assert nRTS signal. - * |[13] |AUTO_CTS_EN|nCTS Auto Flow Control Enable Bit - * | | |0 = nCTS auto flow control Disabled. - * | | |1 = nCTS auto flow control Enabled. - * | | |Note: When nCTS auto-flow is enabled, the UART will send data to external device when nCTS input assert (UART will not send data to device until nCTS is asserted). - * |[14] |DMA_TX_EN |TX DMA Enable Bit - * | | |This bit can enable or disable TX DMA service. - * | | |0 = TX DMA Disabled. - * | | |1 = TX DMA Enabled. - * | | |Note: If RLS_IEN (UA_IER[2]) is enabled and HW_RLS_INT(UA_ISR[26]) is set to 1, the RLS (Receive Line Status) Interrupt is caused. - * | | |If RLS interrupt is caused by Break Error Flag BIF(UA_FSR[6]), Frame Error Flag FEF(UA_FSR[5]) or Parity Error Flag PEF(UA_FSR[4]), UART PDMA transmit request operation is stop. - * | | |Clear Break Error Flag BIF or Frame Error Flag FEF or Parity Error Flag PEF by writing "1" to corresponding BIF, FEF and PEF to make UART PDMA transmit request operation continue. - * |[15] |DMA_RX_EN |RX DMA Enable Bit - * | | |This bit can enable or disable RX DMA service. - * | | |0 = RX DMA Disabled. - * | | |1 = RX DMA Enabled. - * | | |Note: If RLS_IEN (UA_IER[2]) is enabled and HW_RLS_INT(UA_ISR[26]) is set to 1, the RLS (Receive Line Status) Interrupt is caused. - * | | |If RLS interrupt is caused by Break Error Flag BIF(UA_FSR[6]), Frame Error Flag FEF(UA_FSR[5]) or Parity Error Flag PEF(UA_FSR[4]), UART PDMA receive request operation is stop. - * | | |Clear Break Error Flag BIF or Frame Error Flag FEF or Parity Error Flag PEF by writing "1" to corresponding BIF, FEF and PEF to make UART PDMA receive request operation continue. - * @var UART_T::FCR - * Offset: 0x08 UART FIFO Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[1] |RFR |RX Field Software Reset - * | | |When RFR is set, all the byte in the receiver FIFO and RX internal state machine are cleared. - * | | |0 = No effect. - * | | |1 = Reset the RX internal state machine and pointers. - * | | |Note: This bit will automatically clear at least 3 UART peripheral clock cycles. - * |[2] |TFR |TX Field Software Reset - * | | |When TFR is set, all the byte in the transmit FIFO and TX internal state machine are cleared. - * | | |0 = No effect. - * | | |1 = Reset the TX internal state machine and pointers. - * | | |Note: This bit will automatically clear at least 3 UART peripheral clock cycles. - * |[7:4] |RFITL |RX FIFO Interrupt Trigger Level - * | | |When the number of bytes in the received FIFO is equal to the RFITL, the RDA_IF (UA_ISR[0]) will be set (if RDA_IEN(UA_IER [0]) enabled, an interrupt will be generated). - * | | |0000 = RX FIFO Interrupt Trigger Level is 1 byte. - * | | |0001 = RX FIFO Interrupt Trigger Level is 4 bytes. - * | | |0010 = RX FIFO Interrupt Trigger Level is 8 bytes. - * | | |0011 = RX FIFO Interrupt Trigger Level is 14 bytes. - * |[8] |RX_DIS |Receiver Disable - * | | |The receiver is disabled or not. - * | | |0 = Receiver Enabled. - * | | |1 = Receiver Disabled. - * | | |Note: This field is used for RS-485 Normal Multi-drop mode. It should be programmed before RS485_NMM (UA_ALT_CSR [8]) is programmed. - * |[19:16] |RTS_TRI_LEV|nRTS Trigger Level For Auto-flow Control Use - * | | |0000 = nRTS Trigger Level is 1 byte. - * | | |0001 = nRTS Trigger Level is 4 bytes. - * | | |0010 = nRTS Trigger Level is 8 bytes. - * | | |0011 = nRTS Trigger Level is 14 bytes. - * | | |Note: This field is used for nRTS auto-flow control. - * @var UART_T::LCR - * Offset: 0x0C UART Line Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[1:0] |WLS |Word Length Selection - * | | |00 = Word length is 5-bit. - * | | |01 = Word length is 6-bit. - * | | |10 = Word length is 7-bit - * | | |11 = Word length is 8-bit - * |[2] |NSB |Number Of "STOP Bit" - * | | |0 = One " STOP bit" is generated in the transmitted data. - * | | |1 = When select 5-bit word length, 1.5 "STOP bit" is generated in the transmitted data. - * | | |When select 6-,7- and 8-bit word length, 2 "STOP bit" is generated in the transmitted data. - * |[3] |PBE |Parity Bit Enable Bit - * | | |0 = No parity bit. - * | | |1 = Parity bit is generated on each outgoing character and is checked on each incoming data. - * |[4] |EPE |Even Parity Enable Bit - * | | |0 = Odd number of logic 1's is transmitted and checked in each word. - * | | |1 = Even number of logic 1's is transmitted and checked in each word. - * | | |This bit has effect only when PBE (UA_LCR[3]) is set. - * |[5] |SPE |Stick Parity Enable Bit - * | | |0 = Stick parity Disabled. - * | | |1 = If PBE (UA_LCR[3]) and EBE (UA_LCR[4]) are logic 1, the parity bit is transmitted and checked as logic 0. - * | | |If PBE (UA_LCR[3]) is 1 and EBE (UA_LCR[4]) is 0 then the parity bit is transmitted and checked as 1. - * |[6] |BCB |Break Control Bit - * | | |When this bit is set to logic 1, the serial data output (TX) is forced to the Spacing State (logic 0). - * | | |This bit acts only on TX and has no effect on the transmitter logic. - * @var UART_T::MCR - * Offset: 0x10 UART Modem Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[1] |RTS |nRTS (Request-To-Send) Signal Control - * | | |This bit is direct control internal nRTS signal active or not, and then drive the nRTS pin output with LEV_RTS bit configuration. - * | | |0 = nRTS signal is active. - * | | |1 = nRTS signal is inactive. - * | | |Note1: This nRTS signal control bit is not effective when RTS auto-flow control is enabled in UART function mode. - * | | |Note2: This nRTS signal control bit is not effective when RS-485 auto direction mode (AUD) is enabled in RS-485 function mode. - * |[9] |LEV_RTS |nRTS Pin Active Level - * | | |This bit defines the active level state of nRTS pin output. - * | | |0 = nRTS pin output is high level active. - * | | |1 = nRTS pin output is low level active. - * |[13] |RTS_ST |nRTS Pin State (Read Only) - * | | |This bit mirror from nRTS pin output of voltage logic status. - * | | |0 = nRTS pin output is low level voltage logic state. - * | | |1 = nRTS pin output is high level voltage logic state. - * @var UART_T::MSR - * Offset: 0x14 UART Modem Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |DCTSF |Detect nCTS State Change Flag - * | | |This bit is set whenever nCTS input has change state, and it will generate Modem interrupt to CPU when MODEM_IEN (UA_IER [3]) is set to 1. - * | | |0 = nCTS input has not change state. - * | | |1 = nCTS input has change state. - * | | |Note: This bit can be cleared by writing "1" to it. - * |[4] |CTS_ST |nCTS Pin Status (Read Only) - * | | |This bit mirror from CTS pin input of voltage logic status. - * | | |0 = nCTS pin input is low level voltage logic state. - * | | |1 = nCTS pin input is high level voltage logic state. - * | | |Note: This bit echoes when UART Controller peripheral clock is enabled, and nCTS multi-function port is selected. - * |[8] |LEV_CTS |nCTS Pin Active Level - * | | |This bit defines the active level state of nCTS pin input. - * | | |0 = nCTS pin input is high level active. - * | | |1 = nCTS pin input is low level active. - * @var UART_T::FSR - * Offset: 0x18 UART FIFO Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |RX_OVER_IF|RX Overflow Error Interrupt Flag - * | | |This bit is set when RX FIFO overflow. - * | | |If the number of bytes of received data is greater than RX_FIFO (UA_RBR) size, this bit will be set. - * | | |0 = RX FIFO is not overflow. - * | | |1 = RX FIFO is overflow. - * | | |Note: This bit can be cleared by writing "1" to it. - * |[3] |RS485_ADD_DETF|RS-485 Address Byte Detection Flag - * | | |0 = Receiver detects a data that is not an address bit (bit 9 ='1'). - * | | |1 = Receiver detects a data that is an address bit (bit 9 ='1'). - * | | |Note1: This field is used for RS-485 function mode and RS485_ADD_EN (UA_ALT_CSR[15]) is set to 1 to enable Address detection mode . - * | | |Note2: This bit can be cleared by writing "1" to it. - * |[4] |PEF |Parity Error Flag - * | | |This bit is set to logic 1 whenever the received character does not have a valid "parity bit". - * | | |0 = No parity error is generated. - * | | |1 = Parity error is generated. - * | | |Note: This bit can be cleared by writing "1" to it. - * |[5] |FEF |Framing Error Flag - * | | |This bit is set to logic 1 whenever the received character does not have a valid "stop bit" (that is, the stop bit following the last data bit or parity bit is detected as logic 0). - * | | |0 = No framing error is generated. - * | | |1 = Framing error is generated. - * | | |Note: This bit can be cleared by writing "1" to it. - * |[6] |BIF |Break Interrupt Flag - * | | |This bit is set to logic 1 whenever the received data input(RX) is held in the "spacing state" (logic 0) for longer than a full word transmission time (that is, the total time of "start bit" + data bits + parity + stop bits). - * | | |0 = No Break interrupt is generated. - * | | |1 = Break interrupt is generated. - * | | |Note: This bit can be cleared by writing "1" to it. - * |[13:8] |RX_POINTER|RX FIFO Pointer (Read Only) - * | | |This field indicates the RX FIFO Buffer Pointer. - * | | |When UART receives one byte from external device, RX_POINTER increases one. - * | | |When one byte of RX FIFO is read by CPU, RX_POINTER decreases one. - * | | |The Maximum value shown in RX_POINTER is 15. - * | | |When the using level of RX FIFO Buffer equal to 16, the RX_FULL bit is set to 1 and RX_POINTER will show 0. - * | | |As one byte of RX FIFO is read by CPU, the RX_FULL bit is cleared to 0 and RX_POINTER will show 15. - * |[14] |RX_EMPTY |Receiver FIFO Empty (Read Only) - * | | |This bit initiate RX FIFO empty or not. - * | | |0 = RX FIFO is not empty. - * | | |1 = RX FIFO is empty. - * | | |Note: When the last byte of RX FIFO has been read by CPU, hardware sets this bit high. It will be cleared when UART receives any new data. - * |[15] |RX_FULL |Receiver FIFO Full (Read Only) - * | | |This bit initiates RX FIFO is full or not. - * | | |0 = RX FIFO is not full. - * | | |1 = RX FIFO is full. - * | | |Note: This bit is set when the number of usage in RX FIFO Buffer is equal to 16, otherwise is cleared by hardware. - * |[21:16] |TX_POINTER|TX FIFO Pointer (Read Only) - * | | |This field indicates the TX FIFO Buffer Pointer. - * | | |When CPU writes one byte into UA_THR, TX_POINTER increases one. - * | | |When one byte of TX FIFO is transferred to Transmitter Shift Register, TX_POINTER decreases one. - * | | |The Maximum value shown in TX_POINTER is 15. - * | | |When the using level of TX FIFO Buffer equal to 16, the TX_FULL bit is set to 1 and TX_POINTER will show 0. - * | | |As one byte of TX FIFO is transferred to Transmitter Shift Register, the TX_FULL bit is cleared to 0 and TX_POINTER will show 15. - * |[22] |TX_EMPTY |Transmitter FIFO Empty (Read Only) - * | | |This bit indicates TX FIFO empty or not. - * | | |0 = TX FIFO is not empty. - * | | |1 = TX FIFO is empty. - * | | |Note: When the last byte of TX FIFO has been transferred to Transmitter Shift Register, hardware sets this bit high. - * | | |It will be cleared when writing data into THR (TX FIFO not empty). - * |[23] |TX_FULL |Transmitter FIFO Full (Read Only) - * | | |This bit indicates TX FIFO full or not. - * | | |0 = TX FIFO is not full. - * | | |1 = TX FIFO is full. - * | | |Note: This bit is set when the using level of TX FIFO Buffer equal to 16; otherwise, it is cleared by hardware. - * |[24] |TX_OVER_IF|TX Overflow Error Interrupt Flag - * | | |If TX FIFO (UA_THR) is full, an additional write to UA_THR will cause this bit to logic 1. - * | | |0 = TX FIFO is not overflow. - * | | |1 = TX FIFO is overflow. - * | | |Note: This bit can be cleared by writing "1" to it. - * |[28] |TE_FLAG |Transmitter Empty Flag (Read Only) - * | | |This bit is set by hardware when TX FIFO (UA_THR) is empty and the STOP bit of the last byte has been transmitted. - * | | |0 = TX FIFO is not empty or the STOP bit of the last byte has not been transmitted. - * | | |1 = TX FIFO is empty and the STOP bit of the last byte has been transmitted. - * | | |Note: This bit is cleared automatically when TX FIFO is not empty or the last byte transmission has not completed. - * @var UART_T::ISR - * Offset: 0x1C UART Interrupt Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |RDA_IF |Receive Data Available Interrupt Flag (Read Only) - * | | |When the number of bytes in the RX FIFO equals the RFITL (UA_FCR[7:4]) then the RDA_IF (UA_ISR[0]) will be set. - * | | |If RDA_IEN (UA_IER [0]) is enabled, the RDA interrupt will be generated. - * | | |0 = No RDA interrupt flag is generated. - * | | |1 = RDA interrupt flag is generated. - * | | |Note: This bit is read only and it will be cleared when the number of unread bytes of RX FIFO drops below the threshold level RFITL(UA_FCR[7:4]). - * |[1] |THRE_IF |Transmit Holding Register Empty Interrupt Flag (Read Only) - * | | |This bit is set when the last data of TX FIFO is transferred to Transmitter Shift Register. - * | | |If THRE_IEN (UA_IER[1]) is enabled, the THRE interrupt will be generated. - * | | |0 = No THRE interrupt flag is generated. - * | | |1 = THRE interrupt flag is generated. - * | | |Note: This bit is read only and it will be cleared when writing data into THR (TX FIFO not empty). - * |[2] |RLS_IF |Receive Line Interrupt Flag (Read Only) - * | | |This bit is set when the RX receive data have parity error, frame error or break error (at least one of 3 bits, BIF(UA_FSR[6]), FEF(UA_FSR[5]) and PEF(UA_FSR[4]), is set). - * | | |If RLS_IEN (UA_IER[2]) is enabled, the RLS interrupt will be generated. - * | | |0 = No RLS interrupt flag is generated. - * | | |1 = RLS interrupt flag is generated. - * | | |Note1: In RS-485 function mode, this field is set include receiver detect and received address byte character (bit9 = '1') bit. At the same time, the bit of RS485_ADD_DETF (UA_FSR[3]) is also set. - * | | |Note2: This bit is read only and reset to 0 when all bits of BIF (UA_FSR[6]), FEF (UA_FSR[5]) and PEF (UA_FSR[4]) are cleared. - * | | |Note3: In RS-485 function mode, this bit is read only and reset to 0 when all bits of BIF (UA_FSR[6]) , FEF (UA_FSR[5]) and PEF (UA_FSR[4]) and RS485_ADD_DETF (UA_FSR[3]) are cleared. - * |[3] |MODEM_IF |MODEM Interrupt Flag (Read Only) - * | | |This bit is set when the nCTS pin has state change (DCTSF (UA_MSR[0]) = 1). - * | | |If MODEM_IEN (UA_IER[3]) is enabled, the Modem interrupt will be generated. - * | | |0 = No Modem interrupt flag is generated. - * | | |1 = Modem interrupt flag is generated. - * | | |Note: This bit is read only and reset to 0 when bit DCTSF is cleared by a write 1 on DCTSF(UA_MSR[0]). - * |[4] |TOUT_IF |Receive Buffer Time-out Interrupt Flag (Read Only) - * | | |This bit is set when the RX FIFO is not empty and no activities occurred in the RX FIFO and the time-out counter equal to TOIC (UA_TOR[7:0]). - * | | |If TOUT_IEN (UA_IER[4]) is enabled, the Tout interrupt will be generated. - * | | |0 = No Receive Buffer Time-out interrupt flag is generated. - * | | |1 = Receive Buffer Time-out interrupt flag is generated. - * | | |Note: This bit is read only and user can read UA_RBR (RX is in active) to clear it. - * |[5] |BUF_ERR_IF|Buffer Error Interrupt Flag (Read Only) - * | | |This bit is set when the TX FIFO or RX FIFO overflows (TX_OVER_IF (UA_FSR[24]) or RX_OVER_IF (UA_FSR[0]) is set). - * | | |When BUF_ERR_IF (UA_ISR[5])is set, the transfer is not correct. - * | | |If BUF_ERR_IEN (UA_IER[8]) is enabled, the buffer error interrupt will be generated. - * | | |0 = No buffer error interrupt flag is generated. - * | | |1 = Buffer error interrupt flag is generated. - * | | |Note: Note: This bit is cleared if both of RX_OVER_IF (UA_FSR[0]) and TX_OVER_IF (UA_FSR[24]) are cleared to 0 by writing 1 to RX_OVER_IF (UA_FSR[0]) and TX_OVER_IF (UA_FSR[24]). - * |[8] |RDA_INT |Receive Data Available Interrupt Indicator (Read Only) - * | | |This bit is set if RDA_IEN (UA_IER[0]) and RDA_IF (UA_ISR[0]) are both set to 1. - * | | |0 = No RDA interrupt is generated. - * | | |1 = RDA interrupt is generated. - * |[9] |THRE_INT |Transmit Holding Register Empty Interrupt Indicator (Read Only) - * | | |This bit is set if THRE_IEN (UA_IER[1]) and THRE_IF (UA_SR[1]) are both set to 1. - * | | |0 = No THRE interrupt is generated. - * | | |1 = THRE interrupt is generated. - * |[10] |RLS_INT |Receive Line Status Interrupt Indicator (Read Only) - * | | |This bit is set if RLS_IEN (UA_IER[2]) and RLS_IF (UA_ISR[2]) are both set to 1. - * | | |0 = No RLS interrupt is generated. - * | | |1 = RLS interrupt is generated - * |[11] |MODEM_INT |MODEM Status Interrupt Indicator (Read Only) - * | | |This bit is set if MODEM_IEN (UA_IER[3]) and MODEM_IF (UA_ISR[4]) are both set to 1 - * | | |0 = No Modem interrupt is generated. - * | | |1 = Modem interrupt is generated. - * |[12] |TOUT_INT |Receive Buffer Time-out Interrupt Indicator (Read Only) - * | | |This bit is set if TOUT_IEN (UA_IER[4]) and TOUT_IF (UA_ISR[4]) are both set to 1. - * | | |0 = No Receive Buffer Time-out interrupt is generated. - * | | |1 = Receive Buffer Time-out interrupt is generated. - * |[13] |BUF_ERR_INT|Buffer Error Interrupt Indicator (Read Only) - * | | |This bit is set if BUF_ERR_IEN (UA_IER[5]) and BUF_ERR_IF (UA_ISR[5]) are both set to 1. - * | | |0 = No buffer error interrupt is generated . - * | | |1 = Buffer error interrupt is generated. - * |[18] |HW_RLS_IF |In DMA Mode, Receive Line Status Flag (Read Only) - * | | |This bit is set when the RX receive data have parity error, frame error or break error (at least one of 3 bits, BIF (UA_FSR[6]), FEF (UA_FSR[5]) and PEF (UA_FSR[4]) is set). - * | | |If RLS_IEN (UA_IER[2]) is enabled, the RLS interrupt will be generated. - * | | |0 = No RLS interrupt flag is generated in DMA mode. - * | | |1 = RLS interrupt flag is generated in DMA mode. - * | | |Note1: In RS-485 function mode, this field include receiver detect any address byte received address byte character (bit9 = '1') bit. - * | | |Note2: In UART function mode, this bit is read only and reset to 0 when all bits of BIF (UA_FSR[6]) , FEF (UA_FSR[5]) and PEF (UA_FSR[4]) are cleared. - * | | |Note3: In RS-485 function mode, this bit is read only and reset to 0 when all bits of BIF (UA_FSR[6]) , FEF (UA_FSR[5]) and PEF (UA_FSR[4]) and RS485_ADD_DETF (UA_FSR[3]) are cleared. - * |[19] |HW_MODEM_IF|In DMA Mode, MODEM Interrupt Flag (Read Only) - * | | |This bit is set when the CTS pin has state change (DCTSF (US_MSR[0] = 1)). - * | | |If MODEM_IEN (UA_IER[3]) is enabled, the Modem interrupt will be generated. - * | | |0 = No Modem interrupt flag is generated in DMA mode. - * | | |1 = Modem interrupt flag is generated in DMA mode. - * | | |Note: This bit is read only and reset to 0 when the bit DCTSF (US_MSR[0]) is cleared by writing 1 on DCTSF (US_MSR[0]). - * |[20] |HW_TOUT_IF|In DMA Mode, Receive Buffer Time-out Interrupt Flag (Read Only) - * | | |This bit is set when the RX FIFO is not empty and no activities occurred in the RX FIFO and the time-out counter equal to TOIC (UA_TOR[7:0]). - * | | |If TOUT_IEN (UA_IER[4]) is enabled, the Tout interrupt will be generated. - * | | |0 = No Receive Buffer Time-out interrupt flag is generated in DMA mode. - * | | |1 = Receive Buffer Time-out interrupt flag is generated in DMA mode. - * | | |Note: This bit is read only and user can read UA_RBR (RX is in active) to clear it. - * |[21] |HW_BUF_ERR_IF|In DMA Mode, Buffer Error Interrupt Flag (Read Only) - * | | |This bit is set when the TX or RX FIFO overflows (TX_OVER_IF (UA__FSR[24]) or RX_OVER_IF (UA_FSR[0]) is set). - * | | |When BUF_ERR_IF (UA_ISR[5]) is set, the transfer maybe is not correct. - * | | |If BUF_ERR_IEN (UA_IER[5]) is enabled, the buffer error interrupt will be generated. - * | | |0 = No buffer error interrupt flag is generated in DMA mode. - * | | |1 = Buffer error interrupt flag is generated in DMA mode. - * | | |Note: This bit is cleared when both TX_OVER_IF (UA_FSR[24]) and RX_OVER_IF (UA_FSR[0]) are cleared. - * |[26] |HW_RLS_INT|In DMA Mode, Receive Line Status Interrupt Indicator (Read Only) - * | | |This bit is set if RLS_IEN (UA_IER[2]) and HW_RLS_IF (UA_ISR[18]) are both set to 1. - * | | |0 = No RLS interrupt is generated in DMA mode. - * | | |1 = RLS interrupt is generated in DMA mode. - * |[27] |HW_MODEM_INT|In DMA Mode, MODEM Status Interrupt Indicator (Read Only) - * | | |This bit is set if MODEM_IEN (UA_IER[3]) and HW_MODEM_IF (UA_ISR[19]) are both set to 1. - * | | |0 = No Modem interrupt is generated in DMA mode. - * | | |1 = Modem interrupt is generated in DMA mode. - * |[28] |HW_TOUT_INT|In DMA Mode, Receive Buffer Time-out Interrupt Indicator (Read Only) - * | | |This bit is set if TOUT_IEN (UA_IER[4])and HW_TOUT_IF (UA_ISR[20]) are both set to 1. - * | | |0 = No Receive Buffer Time-out interrupt is generated in DMA mode. - * | | |1 = Receive Buffer Time-out interrupt is generated in DMA mode. - * |[29] |HW_BUF_ERR_INT|In DMA Mode, Buffer Error Interrupt Indicator (Read Only) - * | | |This bit is set if BUF_ERR_IEN (UA_IER[5]) and HW_BUF_ERR_IF (UA_ISR[21] )are both set to 1. - * | | |0 = No buffer error interrupt is generated in DMA mode. - * | | |1 = Buffer error interrupt is generated in DMA mode. - * @var UART_T::TOR - * Offset: 0x20 UART Time-out Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[7:0] |TOIC |Time-out Interrupt Comparator - * | | |The time-out counter resets and starts counting (counting clock = baud rate) whenever the RX FIFO receives a new data word if time-out counter is enabled by setting TIME_OUT_EN(UA_IER [11]). - * | | |Once the content of time-out counter is equal to that of time-out interrupt comparator (TOIC (UA_TOR[7:0])), a receiver time-out interrupt (TOUT_INT (UA_ISR[12])) is generated if RTO_IEN (UA_IER[4]). - * | | |A new incoming data word or RX FIFO empty clears TOUT_IF (UA_ISR[4]). - * | | |In order to avoid receiver time-out interrupt generation immediately during one character is being received, TOIC value should be set between 40 and 255. - * | | |Thus, for example, if TOIC is set as 40, the time-out interrupt is generated after four characters are not received when 1 stop bit and no parity check is set for UART transfer. - * |[15:8] |DLY |TX Delay Time Value - * | | |This field is used to programming the transfer delay time between the last stop bit and next start bit. - * @var UART_T::BAUD - * Offset: 0x24 UART Baud Rate Divisor Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[15:0] |BRD |Baud Rate Divider - * | | |The field indicates the baud rate divider. - * |[27:24] |DIVIDER_X |Divider X - * | | |The baud rate divider M = X+1. - * |[28] |DIV_X_ONE |Divider X Equal to 1 - * | | |0 = Divider M is X +1. - * | | |1 = Divider M is 1. - * |[29] |DIV_X_EN |Divider X Enable - * | | |The BRD is Baud Rate Divider, and the baud rate equation is Baud Rate = Clock / [M * (BRD + 2)]; The default value of M is 16. - * | | |0 = Divider X Disabled (the equation of M = 16). - * | | |1 = Divider X Enabled (the equation of M = X+1, but DIVIDER_X [27:24] must >= 8). - * | | |Note: In IrDA mode, this bit must disable. - * @var UART_T::IRCR - * Offset: 0x28 UART IrDA Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[1] |TX_SELECT |IrDA Receiver/Transmitter Selection Enable Bit - * | | |0 = IrDA Transmitter Disabled and Receiver Enabled. - * | | |1 = IrDA Transmitter Enabled and Receiver Disabled. - * |[5] |INV_TX |IrDA inverse Transmitting Output Signal Control - * | | |0 = None inverse transmitting signal. - * | | |1 = Inverse transmitting output signal. - * |[6] |INV_RX |IrDA inverse Receive Input Signal Control - * | | |0 = None inverse receiving input signal. - * | | |1 = Inverse receiving input signal. - * @var UART_T::ALT_CSR - * Offset: 0x2C UART Alternate Control/Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[8] |RS485_NMM |RS-485 Normal Multi-Drop Operation Mode (NMM) - * | | |0 = RS-485 Normal Multi-drop Operation mode (NMM) Disabled. - * | | |1 = RS-485 Normal Multi-drop Operation mode (NMM) Enabled. - * | | |Note: It cannot be active with RS-485_AAD operation mode. - * |[9] |RS485_AAD |RS-485 Auto Address Detection Operation Mode (AAD) - * | | |0 = RS-485 Auto Address Detection Operation mode (AAD) Disabled. - * | | |1 = RS-485 Auto Address Detection Operation mode (AAD) Enabled. - * | | |Note: It cannot be active with RS-485_NMM operation mode. - * |[10] |RS485_AUD |RS-485 Auto Direction Mode (AUD) - * | | |0 = RS-485 Auto Direction Operation mode (AUO) Disabled. - * | | |1 = RS-485 Auto Direction Operation mode (AUO) Enabled. - * | | |Note: It can be active with RS-485_AAD or RS-485_NMM operation mode. - * |[15] |RS485_ADD_EN|RS-485 Address Detection Enable Bit - * | | |This bit is used to enable RS-485 Address Detection mode. - * | | |0 = Address detection mode Disabled. - * | | |1 = Address detection mode Enabled. - * | | |Note: This bit is used for RS-485 any operation mode. - * |[31:24] |ADDR_MATCH|Address Match Value - * | | |This field contains the RS-485 address match values. - * | | |Note: This field is used for RS-485 auto address detection mode. - * @var UART_T::FUN_SEL - * Offset: 0x30 UART Function Select Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[1:0] |FUN_SEL |Function Select Enable - * | | |00 = UART function Enabled. - * | | |10 = IrDA function Enabled. - * | | |11 = RS-485 function Enabled. - */ - - union { - __IO uint32_t DATA; /* Offset: 0x00 UART Data Register */ - __IO uint32_t THR; /* Offset: 0x00 UART Transmit Holding Register */ - __IO uint32_t RBR; /* Offset: 0x00 UART Receive Buffer Register */ - }; - __IO uint32_t IER; /* Offset: 0x04 UART Interrupt Enable Register */ - __IO uint32_t FCR; /* Offset: 0x08 UART FIFO Control Register */ - __IO uint32_t LCR; /* Offset: 0x0C UART Line Control Register */ - __IO uint32_t MCR; /* Offset: 0x10 UART Modem Control Register */ - __IO uint32_t MSR; /* Offset: 0x14 UART Modem Status Register */ - __IO uint32_t FSR; /* Offset: 0x18 UART FIFO Status Register */ - __IO uint32_t ISR; /* Offset: 0x1C UART Interrupt Status Register */ - __IO uint32_t TOR; /* Offset: 0x20 UART Time-out Register */ - __IO uint32_t BAUD; /* Offset: 0x24 UART Baud Rate Divisor Register */ - __IO uint32_t IRCR; /* Offset: 0x28 UART IrDA Control Register */ - __IO uint32_t ALT_CSR; /* Offset: 0x2C UART Alternate Control/Status Register */ - __IO uint32_t FUN_SEL; /* Offset: 0x30 UART Function Select Register */ - -} UART_T; - - - - -/** @addtogroup REG_UART_BITMASK UART Bit Mask - @{ - */ - -/* UART THR Bit Field Definitions */ -#define UART_THR_THR_Pos 0 /*!< UART_T::THR: THR Position */ -#define UART_THR_THR_Msk (0xFul << UART_THR_THR_Pos) /*!< UART_T::THR: THR Mask */ - -/* UART RBR Bit Field Definitions */ -#define UART_RBR_RBR_Pos 0 /*!< UART_T::RBR: RBR Position */ -#define UART_RBR_RBR_Msk (0xFul << UART_RBR_RBR_Pos) /*!< UART_T::RBR: RBR Mask */ - -/* UART IER Bit Field Definitions */ -#define UART_IER_DMA_RX_EN_Pos 15 /*!< UART_T::IER: RX DMA Enable Position */ -#define UART_IER_DMA_RX_EN_Msk (1ul << UART_IER_DMA_RX_EN_Pos) /*!< UART_T::IER: RX DMA Enable Mask */ - -#define UART_IER_DMA_TX_EN_Pos 14 /*!< UART_T::IER: TX DMA Enable Position */ -#define UART_IER_DMA_TX_EN_Msk (1ul << UART_IER_DMA_TX_EN_Pos) /*!< UART_T::IER: TX DMA Enable Mask */ - -#define UART_IER_AUTO_CTS_EN_Pos 13 /*!< UART_T::IER: AUTO_CTS_EN Position */ -#define UART_IER_AUTO_CTS_EN_Msk (1ul << UART_IER_AUTO_CTS_EN_Pos) /*!< UART_T::IER: AUTO_CTS_EN Mask */ - -#define UART_IER_AUTO_RTS_EN_Pos 12 /*!< UART_T::IER: AUTO_RTS_EN Position */ -#define UART_IER_AUTO_RTS_EN_Msk (1ul << UART_IER_AUTO_RTS_EN_Pos) /*!< UART_T::IER: AUTO_RTS_EN Mask */ - -#define UART_IER_TIME_OUT_EN_Pos 11 /*!< UART_T::IER: TIME_OUT_EN Position */ -#define UART_IER_TIME_OUT_EN_Msk (1ul << UART_IER_TIME_OUT_EN_Pos) /*!< UART_T::IER: TIME_OUT_EN Mask */ - -#define UART_IER_WAKE_EN_Pos 6 /*!< UART_T::IER: WAKE_EN Position */ -#define UART_IER_WAKE_EN_Msk (1ul << UART_IER_WAKE_EN_Pos) /*!< UART_T::IER: WAKE_EN Mask */ - -#define UART_IER_BUF_ERR_IEN_Pos 5 /*!< UART_T::IER: BUF_ERR_IEN Position */ -#define UART_IER_BUF_ERR_IEN_Msk (1ul << UART_IER_BUF_ERR_IEN_Pos) /*!< UART_T::IER: BUF_ERR_IEN Mask */ - -#define UART_IER_RTO_IEN_Pos 4 /*!< UART_T::IER: RTO_IEN Position */ -#define UART_IER_RTO_IEN_Msk (1ul << UART_IER_RTO_IEN_Pos) /*!< UART_T::IER: RTO_IEN Mask */ - -#define UART_IER_MODEM_IEN_Pos 3 /*!< UART_T::IER: MODEM_IEN Position */ -#define UART_IER_MODEM_IEN_Msk (1ul << UART_IER_MODEM_IEN_Pos) /*!< UART_T::IER: MODEM_IEN Mask */ - -#define UART_IER_RLS_IEN_Pos 2 /*!< UART_T::IER: RLS_IEN Position */ -#define UART_IER_RLS_IEN_Msk (1ul << UART_IER_RLS_IEN_Pos) /*!< UART_T::IER: RLS_IEN Mask */ - -#define UART_IER_THRE_IEN_Pos 1 /*!< UART_T::IER: THRE_IEN Position */ -#define UART_IER_THRE_IEN_Msk (1ul << UART_IER_THRE_IEN_Pos) /*!< UART_T::IER: THRE_IEN Mask */ - -#define UART_IER_RDA_IEN_Pos 0 /*!< UART_T::IER: RDA_IEN Position */ -#define UART_IER_RDA_IEN_Msk (1ul << UART_IER_RDA_IEN_Pos) /*!< UART_T::IER: RDA_IEN Mask */ - -/* UART FCR Bit Field Definitions */ -#define UART_FCR_RTS_TRI_LEV_Pos 16 /*!< UART_T::FCR: RTS_TRI_LEV Position */ -#define UART_FCR_RTS_TRI_LEV_Msk (0xFul << UART_FCR_RTS_TRI_LEV_Pos) /*!< UART_T::FCR: RTS_TRI_LEV Mask */ - -#define UART_FCR_RX_DIS_Pos 8 /*!< UART_T::FCR: RX_DIS Position */ -#define UART_FCR_RX_DIS_Msk (1ul << UART_FCR_RX_DIS_Pos) /*!< UART_T::FCR: RX_DIS Mask */ - -#define UART_FCR_RFITL_Pos 4 /*!< UART_T::FCR: RFITL Position */ -#define UART_FCR_RFITL_Msk (0xFul << UART_FCR_RFITL_Pos) /*!< UART_T::FCR: RFITL Mask */ - -#define UART_FCR_TFR_Pos 2 /*!< UART_T::FCR: TFR Position */ -#define UART_FCR_TFR_Msk (1ul << UART_FCR_TFR_Pos) /*!< UART_T::FCR: TFR Mask */ - -#define UART_FCR_RFR_Pos 1 /*!< UART_T::FCR: RFR Position */ -#define UART_FCR_RFR_Msk (1ul << UART_FCR_RFR_Pos) /*!< UART_T::FCR: RFR Mask */ - -/* UART LCR Bit Field Definitions */ -#define UART_LCR_BCB_Pos 6 /*!< UART_T::LCR: BCB Position */ -#define UART_LCR_BCB_Msk (1ul << UART_LCR_BCB_Pos) /*!< UART_T::LCR: BCB Mask */ - -#define UART_LCR_SPE_Pos 5 /*!< UART_T::LCR: SPE Position */ -#define UART_LCR_SPE_Msk (1ul << UART_LCR_SPE_Pos) /*!< UART_T::LCR: SPE Mask */ - -#define UART_LCR_EPE_Pos 4 /*!< UART_T::LCR: EPE Position */ -#define UART_LCR_EPE_Msk (1ul << UART_LCR_EPE_Pos) /*!< UART_T::LCR: EPE Mask */ - -#define UART_LCR_PBE_Pos 3 /*!< UART_T::LCR: PBE Position */ -#define UART_LCR_PBE_Msk (1ul << UART_LCR_PBE_Pos) /*!< UART_T::LCR: PBE Mask */ - -#define UART_LCR_NSB_Pos 2 /*!< UART_T::LCR: NSB Position */ -#define UART_LCR_NSB_Msk (1ul << UART_LCR_NSB_Pos) /*!< UART_T::LCR: NSB Mask */ - -#define UART_LCR_WLS_Pos 0 /*!< UART_T::LCR: WLS Position */ -#define UART_LCR_WLS_Msk (0x3ul << UART_LCR_WLS_Pos) /*!< UART_T::LCR: WLS Mask */ - -/* UART MCR Bit Field Definitions */ -#define UART_MCR_RTS_ST_Pos 13 /*!< UART_T::MCR: RTS_ST Position */ -#define UART_MCR_RTS_ST_Msk (1ul << UART_MCR_RTS_ST_Pos) /*!< UART_T::MCR: RTS_ST Mask */ - -#define UART_MCR_LEV_RTS_Pos 9 /*!< UART_T::MCR: LEV_RTS Position */ -#define UART_MCR_LEV_RTS_Msk (1ul << UART_MCR_LEV_RTS_Pos) /*!< UART_T::MCR: LEV_RTS Mask */ - -#define UART_MCR_RTS_Pos 1 /*!< UART_T::MCR: RTS Position */ -#define UART_MCR_RTS_Msk (1ul << UART_MCR_RTS_Pos) /*!< UART_T::MCR: RTS Mask */ - -/* UART MSR Bit Field Definitions */ -#define UART_MSR_LEV_CTS_Pos 8 /*!< UART_T::MSR: LEV_CTS Position */ -#define UART_MSR_LEV_CTS_Msk (1ul << UART_MSR_LEV_CTS_Pos) /*!< UART_T::MSR: LEV_CTS Mask */ - -#define UART_MSR_CTS_ST_Pos 4 /*!< UART_T::MSR: CTS_ST Position */ -#define UART_MSR_CTS_ST_Msk (1ul << UART_MSR_CTS_ST_Pos) /*!< UART_T::MSR: CTS_ST Mask */ - -#define UART_MSR_DCTSF_Pos 0 /*!< UART_T::MSR: DCTST Position */ -#define UART_MSR_DCTSF_Msk (1ul << UART_MSR_DCTSF_Pos) /*!< UART_T::MSR: DCTST Mask */ - - -/* UART FSR Bit Field Definitions */ -#define UART_FSR_TE_FLAG_Pos 28 /*!< UART_T::FSR: TE_FLAG Position */ -#define UART_FSR_TE_FLAG_Msk (1ul << UART_FSR_TE_FLAG_Pos) /*!< UART_T::FSR: TE_FLAG Mask */ - -#define UART_FSR_TX_OVER_IF_Pos 24 /*!< UART_T::FSR: TX_OVER_IF Position */ -#define UART_FSR_TX_OVER_IF_Msk (1ul << UART_FSR_TX_OVER_IF_Pos) /*!< UART_T::FSR: TX_OVER_IF Mask */ - -#define UART_FSR_TX_FULL_Pos 23 /*!< UART_T::FSR: TX_FULL Position */ -#define UART_FSR_TX_FULL_Msk (1ul << UART_FSR_TX_FULL_Pos) /*!< UART_T::FSR: TX_FULL Mask */ - -#define UART_FSR_TX_EMPTY_Pos 22 /*!< UART_T::FSR: TX_EMPTY Position */ -#define UART_FSR_TX_EMPTY_Msk (1ul << UART_FSR_TX_EMPTY_Pos) /*!< UART_T::FSR: TX_EMPTY Mask */ - -#define UART_FSR_TX_POINTER_Pos 16 /*!< UART_T::FSR: TX_POINTER Position */ -#define UART_FSR_TX_POINTER_Msk (0x3Ful << UART_FSR_TX_POINTER_Pos) /*!< UART_T::FSR: TX_POINTER Mask */ - -#define UART_FSR_RX_FULL_Pos 15 /*!< UART_T::FSR: RX_FULL Position */ -#define UART_FSR_RX_FULL_Msk (1ul << UART_FSR_RX_FULL_Pos) /*!< UART_T::FSR: RX_FULL Mask */ - -#define UART_FSR_RX_EMPTY_Pos 14 /*!< UART_T::FSR: RX_EMPTY Position */ -#define UART_FSR_RX_EMPTY_Msk (1ul << UART_FSR_RX_EMPTY_Pos) /*!< UART_T::FSR: RX_EMPTY Mask */ - -#define UART_FSR_RX_POINTER_Pos 8 /*!< UART_T::FSR: RX_POINTERS Position */ -#define UART_FSR_RX_POINTER_Msk (0x3Ful << UART_FSR_RX_POINTER_Pos) /*!< UART_T::FSR: RX_POINTER Mask */ - -#define UART_FSR_BIF_Pos 6 /*!< UART_T::FSR: BIF Position */ -#define UART_FSR_BIF_Msk (1ul << UART_FSR_BIF_Pos) /*!< UART_T::FSR: BIF Mask */ - -#define UART_FSR_FEF_Pos 5 /*!< UART_T::FSR: FEF Position */ -#define UART_FSR_FEF_Msk (1ul << UART_FSR_FEF_Pos) /*!< UART_T::FSR: FEF Mask */ - -#define UART_FSR_PEF_Pos 4 /*!< UART_T::FSR: PEF Position */ -#define UART_FSR_PEF_Msk (1ul << UART_FSR_PEF_Pos) /*!< UART_T::FSR: PEF Mask */ - -#define UART_FSR_RS485_ADD_DETF_Pos 3 /*!< UART_T::FSR: RS485_ADD_DETF Position */ -#define UART_FSR_RS485_ADD_DETF_Msk (1ul << UART_FSR_RS485_ADD_DETF_Pos) /*!< UART_T::FSR: RS485_ADD_DETF Mask */ - -#define UART_FSR_RX_OVER_IF_Pos 0 /*!< UART_T::FSR: RX_OVER_IF Position */ -#define UART_FSR_RX_OVER_IF_Msk (1ul << UART_FSR_RX_OVER_IF_Pos) /*!< UART_T::FSR: RX_OVER_IF Mask */ - -/* UART ISR Bit Field Definitions */ -#define UART_ISR_HW_BUF_ERR_INT_Pos 29 /*!< UART_T::ISR: HW BUF_ERR_INT Position */ -#define UART_ISR_HW_BUF_ERR_INT_Msk (1ul << UART_ISR_HW_BUF_ERR_INT_Pos) /*!< UART_T::ISR: HW BUF_ERR_INT Mask */ - -#define UART_ISR_HW_TOUT_INT_Pos 28 /*!< UART_T::ISR: HW TOUT_INT Position */ -#define UART_ISR_HW_TOUT_INT_Msk (1ul << UART_ISR_HW_TOUT_INT_Pos) /*!< UART_T::ISR: HW TOUT_INT Mask */ - -#define UART_ISR_HW_MODEM_INT_Pos 27 /*!< UART_T::ISR: HW MODEM_INT Position */ -#define UART_ISR_HW_MODEM_INT_Msk (1ul << UART_ISR_HW_MODEM_INT_Pos) /*!< UART_T::ISR: HW MODEM_INT Mask */ - -#define UART_ISR_HW_RLS_INT_Pos 26 /*!< UART_T::ISR: HW RLS_INT Position */ -#define UART_ISR_HW_RLS_INT_Msk (1ul << UART_ISR_HW_RLS_INT_Pos) /*!< UART_T::ISR: HW RLS_INT Position */ - -#define UART_ISR_HW_BUF_ERR_IF_Pos 21 /*!< UART_T::ISR: HW BUF_ERR_IF Position */ -#define UART_ISR_HW_BUF_ERR_IF_Msk (1ul << UART_ISR_HW_BUF_ERR_IF_Pos) /*!< UART_T::ISR: HW BUF_ERR_IF Mask */ - -#define UART_ISR_HW_TOUT_IF_Pos 20 /*!< UART_T::ISR: HW TOUT_IF Position */ -#define UART_ISR_HW_TOUT_IF_Msk (1ul << UART_ISR_HW_TOUT_IFF_Pos) /*!< UART_T::ISR: HW TOUT_IF Mask */ - -#define UART_ISR_HW_MODEM_IF_Pos 19 /*!< UART_T::ISR: HW MODEM_IF Position */ -#define UART_ISR_HW_MODEM_IF_Msk (1ul << UART_ISR_HW_MODEM_IF_Pos) /*!< UART_T::ISR: HW MODEM_IF Mask */ - -#define UART_ISR_HW_RLS_IF_Pos 18 /*!< UART_T::ISR: HW RLS_IF Position */ -#define UART_ISR_HW_RLS_IF_Msk (1ul << UART_ISR_HW_RLS_IF_Pos) /*!< UART_T::ISR: HW RLS_IF Mark */ - -#define UART_ISR_BUF_ERR_INT_Pos 13 /*!< UART_T::ISR: BUF_ERR_INT Position */ -#define UART_ISR_BUF_ERR_INT_Msk (1ul << UART_ISR_BUF_ERR_INT_Pos) /*!< UART_T::ISR: BUF_ERR_INT Mask */ - -#define UART_ISR_TOUT_INT_Pos 12 /*!< UART_T::ISR: TOUT_INT Position */ -#define UART_ISR_TOUT_INT_Msk (1ul << UART_ISR_TOUT_INT_Pos) /*!< UART_T::ISR: TOUT_INT Mask */ - -#define UART_ISR_MODEM_INT_Pos 11 /*!< UART_T::ISR: MODEM_INT Position */ -#define UART_ISR_MODEM_INT_Msk (1ul << UART_ISR_MODEM_INT_Pos) /*!< UART_T::ISR: MODEM_INT Mask */ - -#define UART_ISR_RLS_INT_Pos 10 /*!< UART_T::ISR: RLS_INT Position */ -#define UART_ISR_RLS_INT_Msk (1ul << UART_ISR_RLS_INT_Pos) /*!< UART_T::ISR: RLS_INT Mask */ - -#define UART_ISR_THRE_INT_Pos 9 /*!< UART_T::ISR: THRE_INT Position */ -#define UART_ISR_THRE_INT_Msk (1ul << UART_ISR_THRE_INT_Pos) /*!< UART_T::ISR: THRE_INT Mask */ - -#define UART_ISR_RDA_INT_Pos 8 /*!< UART_T::ISR: RDA_INT Position */ -#define UART_ISR_RDA_INT_Msk (1ul << UART_ISR_RDA_INT_Pos) /*!< UART_T::ISR: RDA_INT Mask */ - -#define UART_ISR_BUF_ERR_IF_Pos 5 /*!< UART_T::ISR: BUF_ERR_IF Position */ -#define UART_ISR_BUF_ERR_IF_Msk (1ul << UART_ISR_BUF_ERR_IF_Pos) /*!< UART_T::ISR: BUF_ERR_IF Mask */ - -#define UART_ISR_TOUT_IF_Pos 4 /*!< UART_T::ISR: TOUT_IF Position */ -#define UART_ISR_TOUT_IF_Msk (1ul << UART_ISR_TOUT_IF_Pos) /*!< UART_T::ISR: TOUT_IF Mask */ - -#define UART_ISR_MODEM_IF_Pos 3 /*!< UART_T::ISR: MODEM_IF Position */ -#define UART_ISR_MODEM_IF_Msk (1ul << UART_ISR_MODEM_IF_Pos) /*!< UART_T::ISR: MODEM_IF Mask */ - -#define UART_ISR_RLS_IF_Pos 2 /*!< UART_T::ISR: RLS_IF Position */ -#define UART_ISR_RLS_IF_Msk (1ul << UART_ISR_RLS_IF_Pos) /*!< UART_T::ISR: RLS_IF Mask */ - -#define UART_ISR_THRE_IF_Pos 1 /*!< UART_T::ISR: THRE_IF Position */ -#define UART_ISR_THRE_IF_Msk (1ul << UART_ISR_THRE_IF_Pos) /*!< UART_T::ISR: THRE_IF Mask */ - -#define UART_ISR_RDA_IF_Pos 0 /*!< UART_T::ISR: RDA_IF Position */ -#define UART_ISR_RDA_IF_Msk (1ul << UART_ISR_RDA_IF_Pos) /*!< UART_T::ISR: RDA_IF Mask */ - - -/* UART TOR Bit Field Definitions */ -#define UART_TOR_DLY_Pos 8 /*!< UART_T::TOR: DLY Position */ -#define UART_TOR_DLY_Msk (0xFFul << UART_TOR_DLY_Pos) /*!< UART_T::TOR: DLY Mask */ - -#define UART_TOR_TOIC_Pos 0 /*!< UART_T::TOR: TOIC Position */ -#define UART_TOR_TOIC_Msk (0xFFul << UART_TOR_TOIC_Pos) - -/* UART BAUD Bit Field Definitions */ -#define UART_BAUD_DIV_X_EN_Pos 29 /*!< UART_T::BAUD: DIV_X_EN Position */ -#define UART_BAUD_DIV_X_EN_Msk (1ul << UART_BAUD_DIV_X_EN_Pos) /*!< UART_T::BAUD: DIV_X_EN Mask */ - -#define UART_BAUD_DIV_X_ONE_Pos 28 /*!< UART_T::BAUD: DIV_X_ONE Position */ -#define UART_BAUD_DIV_X_ONE_Msk (1ul << UART_BAUD_DIV_X_ONE_Pos) /*!< UART_T::BAUD: DIV_X_ONE Mask */ - -#define UART_BAUD_DIVIDER_X_Pos 24 /*!< UART_T::BAUD: DIVIDER_X Position */ -#define UART_BAUD_DIVIDER_X_Msk (0xFul << UART_BAUD_DIVIDER_X_Pos) /*!< UART_T::BAUD: DIVIDER_X Mask */ - -#define UART_BAUD_BRD_Pos 0 /*!< UART_T::BAUD: BRD Position */ -#define UART_BAUD_BRD_Msk (0xFFFFul << UART_BAUD_BRD_Pos) /*!< UART_T::BAUD: BRD Mask */ - -/* UART IRCR Bit Field Definitions */ -#define UART_IRCR_INV_RX_Pos 6 /*!< UART_T::IRCR: INV_RX Position */ -#define UART_IRCR_INV_RX_Msk (1ul << UART_IRCR_INV_RX_Pos) /*!< UART_T::IRCR: INV_RX Mask */ - -#define UART_IRCR_INV_TX_Pos 5 /*!< UART_T::IRCR: INV_TX Position */ -#define UART_IRCR_INV_TX_Msk (1ul << UART_IRCR_INV_TX_Pos) /*!< UART_T::IRCR: INV_TX Mask */ - -#define UART_IRCR_TX_SELECT_Pos 1 /*!< UART_T::IRCR: TX_SELECT Position */ -#define UART_IRCR_TX_SELECT_Msk (1ul << UART_IRCR_TX_SELECT_Pos) /*!< UART_T::IRCR: TX_SELECT Mask */ - -/* UART ALT_CSR Bit Field Definitions */ -#define UART_ALT_CSR_ADDR_MATCH_Pos 24 /*!< UART_T::ALT_CSR: ADDR_MATCH Position */ -#define UART_ALT_CSR_ADDR_MATCH_Msk (0xFFul << UART_ALT_CSR_ADDR_MATCH_Pos) /*!< UART_T::ALT_CSR: ADDR_MATCH Mask */ - -#define UART_ALT_CSR_RS485_ADD_EN_Pos 15 /*!< UART_T::ALT_CSR: RS485_ADD_EN Position */ -#define UART_ALT_CSR_RS485_ADD_EN_Msk (1ul << UART_ALT_CSR_RS485_ADD_EN_Pos) /*!< UART_T::ALT_CSR: RS485_ADD_EN Mask */ - -#define UART_ALT_CSR_RS485_AUD_Pos 10 /*!< UART_T::ALT_CSR: RS485_AUD Position */ -#define UART_ALT_CSR_RS485_AUD_Msk (1ul << UART_ALT_CSR_RS485_AUD_Pos) /*!< UART_T::ALT_CSR: RS485_AUD Mask */ - -#define UART_ALT_CSR_RS485_AAD_Pos 9 /*!< UART_T::ALT_CSR: RS485_AAD Position */ -#define UART_ALT_CSR_RS485_AAD_Msk (1ul << UART_ALT_CSR_RS485_AAD_Pos) /*!< UART_T::ALT_CSR: RS485_AAD Mask */ - -#define UART_ALT_CSR_RS485_NMM_Pos 8 /*!< UART_T::ALT_CSR: RS485_NMM Position */ -#define UART_ALT_CSR_RS485_NMM_Msk (1ul << UART_ALT_CSR_RS485_NMM_Pos) /*!< UART_T::ALT_CSR: RS485_NMM Mask */ - -/* UART FUN_SEL Bit Field Definitions */ -#define UART_FUN_SEL_FUN_SEL_Pos 0 /*!< UART_T::FUN_SEL: FUN_SEL Position */ -#define UART_FUN_SEL_FUN_SEL_Msk (0x3ul << UART_FUN_SEL_FUN_SEL_Pos) /*!< UART_T::FUN_SEL: FUN_SEL Mask */ - -/*@}*/ /* end of group REG_UART_BITMASK */ -/*@}*/ /* end of group REG_UART */ - -/*--------------------------- USB Device Controller --------------------------*/ -/** @addtogroup REG_USBD Universal Serial Bus Device Controller (USBD) - Memory Mapped Structure for USB Device Controller - @{ - */ - - -typedef struct -{ - - -/** - * @var USBD_EP_T::BUFSEG - * Offset: 0x500/0x510/0x520/0x530/0x540/0x550/0x560/0x570 Endpoint 0~7 Buffer Segmentation Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[8:3] |BUFSEG |Endpoint Buffer Segmentation - * | | |It is used to indicate the offset address for each endpoint with the USB SRAM starting address The effective starting address of the endpoint is - * | | |USB_SRAM address + { BUFSEG[8:3], 3'b000} - * | | |Where the USB_SRAM address = USBD_BA+0x100h. - * @var USBD_EP_T::MXPLD - * Offset: 0x504/0x514/0x524/0x534/0x544/0x554/0x564/0x574 Endpoint 0~7 Maximal Payload Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[8:0] |MXPLD |Maximal Payload - * | | |Define the data length which is transmitted to host (IN token) or the actual data length which is received from the host (OUT token). - * | | |It also used to indicate that the endpoint is ready to be transmitted in IN token or received in OUT token. - * | | |(1) When the register is written by CPU, - * | | |For IN token, the value of MXPLD is used to define the data length to be transmitted and indicate the data buffer is ready. - * | | |For OUT token, it means that the controller is ready to receive data from the host and the value of MXPLD is the maximal data length comes from host. - * | | |(2) When the register is read by CPU, - * | | |For IN token, the value of MXPLD is indicated by the data length be transmitted to host - * | | |For OUT token, the value of MXPLD is indicated the actual data length receiving from host. - * | | |Note: Once MXPLD is written, the data packets will be transmitted/received immediately after IN/OUT token arrived. - * @var USBD_EP_T::CFG - * Offset: 0x508/0x518/0x528/0x538/0x548/0x558/0x568/0x578 Endpoint 0~7 Configuration Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[3:0] |EP_NUM |Endpoint Number - * | | |These bits are used to define the endpoint number of the current endpoint. - * |[4] |ISOCH |Isochronous Endpoint - * | | |This bit is used to set the endpoint as Isochronous endpoint, no handshake. - * | | |0 = No Isochronous endpoint. - * | | |1 = Isochronous endpoint. - * |[6:5] |STATE |Endpoint STATE - * | | |00 = Endpoint is Disabled. - * | | |01 = Out endpoint. - * | | |10 = IN endpoint. - * | | |11 = Undefined. - * |[7] |DSQ_SYNC |Data Sequence Synchronization - * | | |0 = DATA0 PID. - * | | |1 = DATA1 PID. - * | | |Note: It is used to specify the DATA0 or DATA1 PID in the following IN token transaction. - * | | |Hardware will toggle automatically in IN token base on the bit. - * |[9] |CSTALL |Clear STALL Response - * | | |0 = Disable the device to clear the STALL handshake in setup stage. - * | | |1 = Clear the device to response STALL handshake in setup stage. - * @var USBD_EP_T::CFGP - * Offset: 0x50C/0x51C/0x52C/0x53C/0x54C/0x55C/0x56C/0x57C Endpoint 0~7 Set Stall and Clear In/Out Ready Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |CLRRDY |Clear Ready - * | | |When the USB_MXPLD register is set by user, it means that the endpoint is ready to transmit or receive data. - * | | |If the user wants to turn off this transaction before the transaction start, users can set this bit to 1 to turn it off and it will be cleared to 0 automatically. - * | | |For IN token, write '1' to clear the IN token had ready to transmit the data to USB. - * | | |For OUT token, write '1' to clear the OUT token had ready to receive the data from USB. - * | | |This bit is write 1 only and is always 0 when it is read back. - * |[1] |SSTALL |Set STALL - * | | |0 = Disable the device to response STALL. - * | | |1 = Set the device to respond STALL automatically. - */ - - __IO uint32_t BUFSEG; /* Offset: 0x500/0x510/0x520/0x530/0x540/0x550/0x560/0x570 Endpoint 0~7 Buffer Segmentation Register */ - __IO uint32_t MXPLD; /* Offset: 0x504/0x514/0x524/0x534/0x544/0x554/0x564/0x574 Endpoint 0~7 Maximal Payload Register */ - __IO uint32_t CFG; /* Offset: 0x508/0x518/0x528/0x538/0x548/0x558/0x568/0x578 Endpoint 0~7 Configuration Register */ - __IO uint32_t CFGP; /* Offset: 0x50C/0x51C/0x52C/0x53C/0x54C/0x55C/0x56C/0x57C Endpoint 0~7 Set Stall and Clear In/Out Ready Control Register */ - -} USBD_EP_T; - - - - - -typedef struct -{ - - -/** - * @var USBD_T::INTEN - * Offset: 0x00 USB Interrupt Enable Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |BUS_IE |Bus Event Interrupt Enable - * | | |0 = BUS event interrupt Disabled. - * | | |1 = BUS event interrupt Enabled. - * |[1] |USB_IE |USB Event Interrupt Enable - * | | |0 = USB event interrupt Disabled. - * | | |1 = USB event interrupt Enabled. - * |[2] |FLDET_IE |Floating Detection Interrupt Enable - * | | |0 = Floating detection Interrupt Disabled. - * | | |1 = Floating detection Interrupt Enabled. - * |[3] |WAKEUP_IE |USB Wake-Up Interrupt Enable - * | | |0 = Wake-up Interrupt Disabled. - * | | |1 = Wake-up Interrupt Enabled. - * |[8] |WAKEUP_EN |Wake-Up Function Enable - * | | |0 = USB wake-up function Disabled. - * | | |1 = USB wake-up function Enabled. - * |[15] |INNAK_EN |Active NAK Function And Its Status In IN Token - * | | |0 = When device responds NAK after receiving IN token, IN NAK status will not be - * | | | updated to USBD_EPSTS register, so that the USB interrupt event will not be asserted. - * | | |1 = IN NAK status will be updated to USBD_EPSTS register and the USB interrupt event - * | | | will be asserted, when the device responds NAK after receiving IN token. - * @var USBD_T::INTSTS - * Offset: 0x04 USB Interrupt Event Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |BUS_STS |BUS Interrupt Status - * | | |The BUS event means that there is one of the suspense or the resume function in the bus. - * | | |0 = No BUS event occurred. - * | | |1 = Bus event occurred; check USB_ATTR[3:0] to know which kind of bus event was occurred, cleared by write 1 to USB_INTSTS[0]. - * |[1] |USB_STS |USB Event Interrupt Status - * | | |The USB event includes the SETUP Token, IN Token, OUT ACK, ISO IN, or ISO OUT events in the bus. - * | | |0 = No USB event occurred. - * | | |1 = USB event occurred, check EPSTS0~7 to know which kind of USB event occurred. - * | | |Cleared by write 1 to USB_INTSTS[1] or EPEVT0~7 and SETUP (USB_INTSTS[31]). - * |[2] |FLDET_STS |Floating Detection Interrupt Status - * | | |0 = There is not attached/detached event in the USB. - * | | |1 = There is attached/detached event in the USB bus and it is cleared by write 1 to USB_INTSTS[2]. - * |[3] |WAKEUP_STS|Wake-Up Interrupt Status - * | | |0 = No Wake-up event occurred. - * | | |1 = Wake-up event occurred, cleared by write 1 to USB_INTSTS[3]. - * |[16] |EPEVT0 |Endpoint 0's USB Event Status - * | | |0 = No event occurred on endpoint 0. - * | | |1 = USB event occurred on Endpoint 0, check USB_EPSTS[10:8] to know which kind of USB event was occurred, cleared by write 1 to USB_INTSTS[16] or USB_INTSTS[1]. - * |[17] |EPEVT1 |Endpoint 1's USB Event Status - * | | |0 = No event occurred on endpoint 1. - * | | |1 = USB event occurred on Endpoint 1, check USB_EPSTS[13:11] to know which kind of USB event was occurred, cleared by write 1 to USB_INTSTS[17] or USB_INTSTS[1]. - * |[18] |EPEVT2 |Endpoint 2's USB Event Status - * | | |0 = No event occurred on endpoint 2. - * | | |1 = USB event occurred on Endpoint 2, check USB_EPSTS[16:14] to know which kind of USB event was occurred, cleared by write 1 to USB_INTSTS[18] or USB_INTSTS[1]. - * |[19] |EPEVT3 |Endpoint 3's USB Event Status - * | | |0 = No event occurred on endpoint 3. - * | | |1 = USB event occurred on Endpoint 3, check USB_EPSTS[19:17] to know which kind of USB event was occurred, cleared by write 1 to USB_INTSTS[19] or USB_INTSTS[1]. - * |[20] |EPEVT4 |Endpoint 4's USB Event Status - * | | |0 = No event occurred on endpoint 4. - * | | |1 = USB event occurred on Endpoint 4, check USB_EPSTS[22:20] to know which kind of USB event was occurred, cleared by write 1 to USB_INTSTS[20] or USB_INTSTS[1]. - * |[21] |EPEVT5 |Endpoint 5's USB Event Status - * | | |0 = No event occurred on endpoint 5. - * | | |1 = USB event occurred on Endpoint 5, check USB_EPSTS[25:23] to know which kind of USB event was occurred, cleared by write 1 to USB_INTSTS[21] or USB_INTSTS[1]. - * |[22] |EPEVT6 |Endpoint 6's USB Event Status - * | | |0 = No event occurred on endpoint 6. - * | | |1 = USB event occurred on Endpoint 6, check USB_EPSTS[28:26] to know which kind of USB event was occurred, cleared by write 1 to USB_INTSTS[22] or USB_INTSTS[1]. - * |[23] |EPEVT7 |Endpoint 7's USB Event Status - * | | |0 = No event occurred on endpoint 7. - * | | |1 = USB event occurred on Endpoint 7, check USB_EPSTS[31:29] to know which kind of USB event was occurred, cleared by write 1 to USB_INTSTS[23] or USB_INTSTS[1]. - * |[31] |SETUP |Setup Event Status - * | | |0 = No Setup event. - * | | |1 = SETUP event occurred, cleared by write 1 to USB_INTSTS[31]. - * @var USBD_T::FADDR - * Offset: 0x08 USB Device Function Address Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[6:0] |FADDR |USB Device Function Address - * @var USBD_T::EPSTS - * Offset: 0x0C USB Endpoint Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[7] |OVERRUN |Overrun - * | | |It indicates that the received data is over the maximum payload number or not. - * | | |0 = No overrun. - * | | |1 = Out Data is more than the Max Payload in MXPLD register or the Setup Data is more than 8 Bytes. - * |[10:8] |EPSTS0 |Endpoint 0 Bus Status - * | | |These bits are used to indicate the current status of this endpoint - * | | |000 = In ACK. - * | | |001 = In NAK. - * | | |010 = Out Packet Data0 ACK. - * | | |110 = Out Packet Data1 ACK. - * | | |011 = Setup ACK. - * | | |111 = Isochronous transfer end. - * |[13:11] |EPSTS1 |Endpoint 1 Bus Status - * | | |These bits are used to indicate the current status of this endpoint - * | | |000 = In ACK. - * | | |001 = In NAK. - * | | |010 = Out Packet Data0 ACK. - * | | |110 = Out Packet Data1 ACK. - * | | |011 = Setup ACK. - * | | |111 = Isochronous transfer end. - * |[16:14] |EPSTS2 |Endpoint 2 Bus Status - * | | |These bits are used to indicate the current status of this endpoint - * | | |000 = In ACK. - * | | |001 = In NAK. - * | | |010 = Out Packet Data0 ACK. - * | | |110 = Out Packet Data1 ACK. - * | | |011 = Setup ACK. - * | | |111 = Isochronous transfer end. - * |[19:17] |EPSTS3 |Endpoint 3 Bus Status - * | | |These bits are used to indicate the current status of this endpoint - * | | |000 = In ACK. - * | | |001 = In NAK. - * | | |010 = Out Packet Data0 ACK. - * | | |110 = Out Packet Data1 ACK. - * | | |011 = Setup ACK. - * | | |111 = Isochronous transfer end. - * |[22:20] |EPSTS4 |Endpoint 4 Bus Status - * | | |These bits are used to indicate the current status of this endpoint - * | | |000 = In ACK. - * | | |001 = In NAK. - * | | |010 = Out Packet Data0 ACK. - * | | |110 = Out Packet Data1 ACK. - * | | |011 = Setup ACK. - * | | |111 = Isochronous transfer end. - * |[25:23] |EPSTS5 |Endpoint 5 Bus Status - * | | |These bits are used to indicate the current status of this endpoint - * | | |000 = In ACK. - * | | |001 = In NAK. - * | | |010 = Out Packet Data0 ACK. - * | | |110 = Out Packet Data1 ACK. - * | | |011 = Setup ACK. - * | | |111 = Isochronous transfer end. - * |[28:26] |EPSTS6 |Endpoint 6 Bus Status - * | | |These bits are used to indicate the current status of this endpoint - * | | |000 = In ACK. - * | | |001 = In NAK. - * | | |010 = Out Packet Data0 ACK. - * | | |110 = Out Packet Data1 ACK. - * | | |011 = Setup ACK. - * | | |111 = Isochronous transfer end. - * |[31:29] |EPSTS7 |Endpoint 7 Bus Status - * | | |These bits are used to indicate the current status of this endpoint - * | | |000 = In ACK. - * | | |001 = In NAK. - * | | |010 = Out Packet Data0 ACK. - * | | |110 = Out Packet Data1 ACK. - * | | |011 = Setup ACK. - * | | |111 = Isochronous transfer end. - * @var USBD_T::ATTR - * Offset: 0x10 USB Bus Status and Attribution Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |USBRST |USB Reset Status - * | | |0 = Bus no reset. - * | | |1 = Bus reset when SE0 (single-ended 0) is presented more than 2.5us. - * | | |Note: This bit is read only. - * |[1] |SUSPEND |Suspend Status - * | | |0 = Bus no suspend. - * | | |1 = Bus idle more than 3ms, either cable is plugged off or host is sleeping. - * | | |Note: This bit is read only. - * |[2] |RESUME |Resume Status - * | | |0 = No bus resume. - * | | |1 = Resume from suspend. - * | | |Note: This bit is read only. - * |[3] |TIMEOUT |Time-Out Status - * | | |0 = No time-out. - * | | |1 = No Bus response more than 18 bits time. - * | | |Note: This bit is read only. - * |[4] |PHY_EN |PHY Transceiver Function Enable - * | | |0 = PHY transceiver function Disabled. - * | | |1 = PHY transceiver function Enabled. - * |[5] |RWAKEUP |Remote Wake-Up - * | | |0 = Release the USB bus from K state. - * | | |1 = Force USB bus to K (USB_D+ low, USB_D- high) state, used for remote wake-up. - * |[7] |USB_EN |USB Controller Enable - * | | |0 = USB Controller Disabled. - * | | |1 = USB Controller Enabled. - * |[8] |DPPU_EN |Pull-Up Resistor On USB_D+ Enable - * | | |0 = Pull-up resistor in USB_D+ pin Disabled. - * | | |1 = Pull-up resistor in USB_D+ pin Enabled. - * |[9] |PWRDN |Power-Down PHY Transceiver, Low Active - * | | |0 = Power-down related circuit of PHY transceiver. - * | | |1 = Turn-on related circuit of PHY transceiver. - * |[10] |BYTEM |CPU Access USB SRAM Size Mode Selection - * | | |0 = Word mode: The size of the transfer from CPU to USB SRAM can be Word only. - * | | |1 = Byte mode: The size of the transfer from CPU to USB SRAM can be Byte only. - * @var USBD_T::FLDET - * Offset: 0x14 USB Floating Detection Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |FLDET |Device Floating Detected - * | | |0 = Controller is not attached into the USB host. - * | | |1 =Controller is attached into the BUS. - * @var USBD_T::STBUFSEG - * Offset: 0x18 Setup Token Buffer Segmentation Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[8:3] |STBUFSEG |Setup Token Buffer Segmentation - * | | |It is used to indicate the offset address for the SETUP token with the USB Device SRAM starting address The effective starting address is - * | | |USB_SRAM address + {STBUFSEG[8:3], 3'b000} - * | | |Where the USB_SRAM address = USBD_BA+0x100h. - * | | |Note: It is used for SETUP token only. - * @var USBD_T::DRVSE0 - * Offset: 0x90 USB Drive SE0 Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |DRVSE0 |Drive Single Ended Zero In USB Bus - * | | |The Single Ended Zero (SE0) is when both lines (USB_D+ and USB_D-) are being pulled low. - * | | |0 = None. - * | | |1 = Force USB PHY transceiver to drive SE0. - */ - - __IO uint32_t INTEN; /* Offset: 0x00 USB Interrupt Enable Register */ - __IO uint32_t INTSTS; /* Offset: 0x04 USB Interrupt Event Status Register */ - __IO uint32_t FADDR; /* Offset: 0x08 USB Device Function Address Register */ - __I uint32_t EPSTS; /* Offset: 0x0C USB Endpoint Status Register */ - __IO uint32_t ATTR; /* Offset: 0x10 USB Bus Status and Attribution Register */ - __I uint32_t FLDET; /* Offset: 0x14 USB Floating Detection Register */ - __IO uint32_t STBUFSEG; /* Offset: 0x18 Setup Token Buffer Segmentation Register */ - __I uint32_t RESERVE0[29]; - __IO uint32_t DRVSE0; /* Offset: 0x90 USB Drive SE0 Control Register */ - __I uint32_t RESERVE2[283]; - USBD_EP_T EP[8]; /* Offset: 0x500 Endpoint 0~7 Control Registers */ - -} USBD_T; - - - - -/** @addtogroup REG_USBD_BITMASK USBD Bit Mask - @{ - */ - -/* USBD INTEN Bit Field Definitions */ -#define USBD_INTEN_INNAK_EN_Pos 15 /*!< USBD_T::INTEN: INNAK_EN Position */ -#define USBD_INTEN_INNAK_EN_Msk (1ul << USBD_INTEN_INNAK_EN_Pos) /*!< USBD_T::INTEN: INNAK_EN Mask */ - -#define USBD_INTEN_WAKEUP_EN_Pos 8 /*!< USBD_T::INTEN: RWAKEUP Position */ -#define USBD_INTEN_WAKEUP_EN_Msk (1ul << USBD_INTEN_WAKEUP_EN_Pos) /*!< USBD_T::INTEN: RWAKEUP Mask */ - -#define USBD_INTEN_WAKEUP_IE_Pos 3 /*!< USBD_T::INTEN: WAKEUP_IE Position */ -#define USBD_INTEN_WAKEUP_IE_Msk (1ul << USBD_INTEN_WAKEUP_IE_Pos) /*!< USBD_T::INTEN: WAKEUP_IE Mask */ - -#define USBD_INTEN_FLDET_IE_Pos 2 /*!< USBD_T::INTEN: FLDET_IE Position */ -#define USBD_INTEN_FLDET_IE_Msk (1ul << USBD_INTEN_FLDET_IE_Pos) /*!< USBD_T::INTEN: FLDET_IE Mask */ - -#define USBD_INTEN_USB_IE_Pos 1 /*!< USBD_T::INTEN: USB_IE Position */ -#define USBD_INTEN_USB_IE_Msk (1ul << USBD_INTEN_USB_IE_Pos) /*!< USBD_T::INTEN: USB_IE Mask */ - -#define USBD_INTEN_BUS_IE_Pos 0 /*!< USBD_T::INTEN: BUS_IE Position */ -#define USBD_INTEN_BUS_IE_Msk (1ul << USBD_INTEN_BUS_IE_Pos) /*!< USBD_T::INTEN: BUS_IE Mask */ - -/* USBD INTSTS Bit Field Definitions */ -#define USBD_INTSTS_SETUP_Pos 31 /*!< USBD_T::INTSTS: SETUP Position */ -#define USBD_INTSTS_SETUP_Msk (1ul << USBD_INTSTS_SETUP_Pos) /*!< USBD_T::INTSTS: SETUP Mask */ - -#define USBD_INTSTS_EPEVT7_Pos 23 /*!< USBD_T::INTSTS: EPEVT7 Position */ -#define USBD_INTSTS_EPEVT7_Msk (0x1ul << USBD_INTSTS_EPEVT7_Pos) /*!< USBD_T::INTSTS: EPEVT7 Mask */ - -#define USBD_INTSTS_EPEVT6_Pos 22 /*!< USBD_T::INTSTS: EPEVT6 Position */ -#define USBD_INTSTS_EPEVT6_Msk (0x1ul << USBD_INTSTS_EPEVT6_Pos) /*!< USBD_T::INTSTS: EPEVT6 Mask */ - -#define USBD_INTSTS_EPEVT5_Pos 21 /*!< USBD_T::INTSTS: EPEVT5 Position */ -#define USBD_INTSTS_EPEVT5_Msk (0x1ul << USBD_INTSTS_EPEVT5_Pos) /*!< USBD_T::INTSTS: EPEVT5 Mask */ - -#define USBD_INTSTS_EPEVT4_Pos 20 /*!< USBD_T::INTSTS: EPEVT4 Position */ -#define USBD_INTSTS_EPEVT4_Msk (0x1ul << USBD_INTSTS_EPEVT4_Pos) /*!< USBD_T::INTSTS: EPEVT4 Mask */ - -#define USBD_INTSTS_EPEVT3_Pos 19 /*!< USBD_T::INTSTS: EPEVT3 Position */ -#define USBD_INTSTS_EPEVT3_Msk (0x1ul << USBD_INTSTS_EPEVT3_Pos) /*!< USBD_T::INTSTS: EPEVT3 Mask */ - -#define USBD_INTSTS_EPEVT2_Pos 18 /*!< USBD_T::INTSTS: EPEVT2 Position */ -#define USBD_INTSTS_EPEVT2_Msk (0x1ul << USBD_INTSTS_EPEVT2_Pos) /*!< USBD_T::INTSTS: EPEVT2 Mask */ - -#define USBD_INTSTS_EPEVT1_Pos 17 /*!< USBD_T::INTSTS: EPEVT1 Position */ -#define USBD_INTSTS_EPEVT1_Msk (0x1ul << USBD_INTSTS_EPEVT1_Pos) /*!< USBD_T::INTSTS: EPEVT1 Mask */ - -#define USBD_INTSTS_EPEVT0_Pos 16 /*!< USBD_T::INTSTS: EPEVT0 Position */ -#define USBD_INTSTS_EPEVT0_Msk (0x1ul << USBD_INTSTS_EPEVT0_Pos) /*!< USBD_T::INTSTS: EPEVT0 Mask */ - -#define USBD_INTSTS_WAKEUP_STS_Pos 3 /*!< USBD_T::INTSTS: WAKEUP_STS Position */ -#define USBD_INTSTS_WAKEUP_STS_Msk (1ul << USBD_INTSTS_WAKEUP_STS_Pos) /*!< USBD_T::INTSTS: WAKEUP_STS Mask */ - -#define USBD_INTSTS_FLDET_STS_Pos 2 /*!< USBD_T::INTSTS: FLDET_STS Position */ -#define USBD_INTSTS_FLDET_STS_Msk (1ul << USBD_INTSTS_FLDET_STS_Pos) /*!< USBD_T::INTSTS: FLDET_STS Mask */ - -#define USBD_INTSTS_USB_STS_Pos 1 /*!< USBD_T::INTSTS: USB_STS Position */ -#define USBD_INTSTS_USB_STS_Msk (1ul << USBD_INTSTS_USB_STS_Pos) /*!< USBD_T::INTSTS: USB_STS Mask */ - -#define USBD_INTSTS_BUS_STS_Pos 0 /*!< USBD_T::INTSTS: BUS_STS Position */ -#define USBD_INTSTS_BUS_STS_Msk (1ul << USBD_INTSTS_BUS_STS_Pos) /*!< USBD_T::INTSTS: BUS_STS Mask */ - -/* USBD FADDR Bit Field Definitions */ -#define USBD_FADDR_FADDR_Pos 0 /*!< USBD_T::FADDR: FADDR Position */ -#define USBD_FADDR_FADDR_Msk (0x7Ful << USBD_FADDR_FADDR_Pos) /*!< USBD_T::FADDR: FADDR Mask */ - -/* USBD EPSTS Bit Field Definitions */ -#define USBD_EPSTS_EPSTS7_Pos 29 /*!< USBD_T::EPSTS: EPSTS7 Position */ -#define USBD_EPSTS_EPSTS7_Msk (7ul << USBD_EPSTS_EPSTS7_Pos) /*!< USBD_T::EPSTS: EPSTS7 Mask */ - -#define USBD_EPSTS_EPSTS6_Pos 26 /*!< USBD_T::EPSTS: EPSTS6 Position */ -#define USBD_EPSTS_EPSTS6_Msk (7ul << USBD_EPSTS_EPSTS6_Pos) /*!< USBD_T::EPSTS: EPSTS6 Mask */ - -#define USBD_EPSTS_EPSTS5_Pos 23 /*!< USBD_T::EPSTS: EPSTS5 Position */ -#define USBD_EPSTS_EPSTS5_Msk (7ul << USBD_EPSTS_EPSTS5_Pos) /*!< USBD_T::EPSTS: EPSTS5 Mask */ - -#define USBD_EPSTS_EPSTS4_Pos 20 /*!< USBD_T::EPSTS: EPSTS4 Position */ -#define USBD_EPSTS_EPSTS4_Msk (7ul << USBD_EPSTS_EPSTS4_Pos) /*!< USBD_T::EPSTS: EPSTS4 Mask */ - -#define USBD_EPSTS_EPSTS3_Pos 17 /*!< USBD_T::EPSTS: EPSTS3 Position */ -#define USBD_EPSTS_EPSTS3_Msk (7ul << USBD_EPSTS_EPSTS3_Pos) /*!< USBD_T::EPSTS: EPSTS3 Mask */ - -#define USBD_EPSTS_EPSTS2_Pos 14 /*!< USBD_T::EPSTS: EPSTS2 Position */ -#define USBD_EPSTS_EPSTS2_Msk (7ul << USBD_EPSTS_EPSTS2_Pos) /*!< USBD_T::EPSTS: EPSTS2 Mask */ - -#define USBD_EPSTS_EPSTS1_Pos 11 /*!< USBD_T::EPSTS: EPSTS1 Position */ -#define USBD_EPSTS_EPSTS1_Msk (7ul << USBD_EPSTS_EPSTS1_Pos) /*!< USBD_T::EPSTS: EPSTS1 Mask */ - -#define USBD_EPSTS_EPSTS0_Pos 8 /*!< USBD_T::EPSTS: EPSTS0 Position */ -#define USBD_EPSTS_EPSTS0_Msk (7ul << USBD_EPSTS_EPSTS0_Pos) /*!< USBD_T::EPSTS: EPSTS0 Mask */ - -#define USBD_EPSTS_OVERRUN_Pos 7 /*!< USBD_T::EPSTS: OVERRUN Position */ -#define USBD_EPSTS_OVERRUN_Msk (1ul << USBD_EPSTS_OVERRUN_Pos) /*!< USBD_T::EPSTS: OVERRUN Mask */ - -/* USBD ATTR Bit Field Definitions */ -#define USBD_ATTR_BYTEM_Pos 10 /*!< USBD_T::ATTR: BYTEM Position */ -#define USBD_ATTR_BYTEM_Msk (1ul << USBD_ATTR_BYTEM_Pos) /*!< USBD_T::ATTR: BYTEM Mask */ - -#define USBD_ATTR_PWRDN_Pos 9 /*!< USBD_T::ATTR: PWRDN Position */ -#define USBD_ATTR_PWRDN_Msk (1ul << USBD_ATTR_PWRDN_Pos) /*!< USBD_T::ATTR: PWRDN Mask */ - -#define USBD_ATTR_DPPU_EN_Pos 8 /*!< USBD_T::ATTR: DPPU_EN Position */ -#define USBD_ATTR_DPPU_EN_Msk (1ul << USBD_ATTR_DPPU_EN_Pos) /*!< USBD_T::ATTR: DPPU_EN Mask */ - -#define USBD_ATTR_USB_EN_Pos 7 /*!< USBD_T::ATTR: USB_EN Position */ -#define USBD_ATTR_USB_EN_Msk (1ul << USBD_ATTR_USB_EN_Pos) /*!< USBD_T::ATTR: USB_EN Mask */ - -#define USBD_ATTR_RWAKEUP_Pos 5 /*!< USBD_T::ATTR: RWAKEUP Position */ -#define USBD_ATTR_RWAKEUP_Msk (1ul << USBD_ATTR_RWAKEUP_Pos) /*!< USBD_T::ATTR: RWAKEUP Mask */ - -#define USBD_ATTR_PHY_EN_Pos 4 /*!< USBD_T::ATTR: PHY_EN Position */ -#define USBD_ATTR_PHY_EN_Msk (1ul << USBD_ATTR_PHY_EN_Pos) /*!< USBD_T::ATTR: PHY_EN Mask */ - -#define USBD_ATTR_TIMEOUT_Pos 3 /*!< USBD_T::ATTR: TIMEOUT Position */ -#define USBD_ATTR_TIMEOUT_Msk (1ul << USBD_ATTR_TIMEOUT_Pos) /*!< USBD_T::ATTR: TIMEOUT Mask */ - -#define USBD_ATTR_RESUME_Pos 2 /*!< USBD_T::ATTR: RESUME Position */ -#define USBD_ATTR_RESUME_Msk (1ul << USBD_ATTR_RESUME_Pos) /*!< USBD_T::ATTR: RESUME Mask */ - -#define USBD_ATTR_SUSPEND_Pos 1 /*!< USBD_T::ATTR: SUSPEND Position */ -#define USBD_ATTR_SUSPEND_Msk (1ul << USBD_ATTR_SUSPEND_Pos) /*!< USBD_T::ATTR: SUSPEND Mask */ - -#define USBD_ATTR_USBRST_Pos 0 /*!< USBD_T::ATTR: USBRST Position */ -#define USBD_ATTR_USBRST_Msk (1ul << USBD_ATTR_USBRST_Pos) /*!< USBD_T::ATTR: USBRST Mask */ - -/* USBD FLDET Bit Field Definitions */ -#define USBD_FLDET_FLDET_Pos 0 /*!< USBD_T::FLDET: FLDET Position */ -#define USBD_FLDET_FLDET_Msk (1ul << USBD_FLDET_FLDET_Pos) /*!< USBD_T::FLDET: FLDET Mask */ - -/* USBD STBUFSEG Bit Field Definitions */ -#define USBD_STBUFSEG_STBUFSEG_Pos 3 /*!< USBD_T::STBUFSEG: STBUFSEG Position */ -#define USBD_STBUFSEG_STBUFSEG_Msk (0x3Ful << USBD_STBUFSEG_STBUFSEG_Pos) /*!< USBD_T::STBUFSEG: STBUFSEG Mask */ - -/* USBD BUFSEG Bit Field Definitions */ -#define USBD_BUFSEG_BUFSEG_Pos 3 /*!< USBD_EP_T::BUFSEG: BUFSEG Position */ -#define USBD_BUFSEG_BUFSEG_Msk (0x3Ful << USBD_BUFSEG_BUFSEG_Pos) /*!< USBD_EP_T::BUFSEG: BUFSEG Mask */ - -/* USBD MXPLD Bit Field Definitions */ -#define USBD_MXPLD_MXPLD_Pos 0 /*!< USBD_EP_T::MXPLD: MXPLD Position */ -#define USBD_MXPLD_MXPLD_Msk (0x1FFul << USBD_MXPLD_MXPLD_Pos) /*!< USBD_EP_T::MXPLD: MXPLD Mask */ - -/* USBD CFG Bit Field Definitions */ -#define USBD_CFG_CSTALL_Pos 9 /*!< USBD_EP_T::CFG: CSTALL Position */ -#define USBD_CFG_CSTALL_Msk (1ul << USBD_CFG_CSTALL_Pos) /*!< USBD_EP_T::CFG: CSTALL Mask */ - -#define USBD_CFG_DSQ_SYNC_Pos 7 /*!< USBD_EP_T::CFG: DSQ_SYNC Position */ -#define USBD_CFG_DSQ_SYNC_Msk (1ul << USBD_CFG_DSQ_SYNC_Pos) /*!< USBD_EP_T::CFG: DSQ_SYNC Mask */ - -#define USBD_CFG_STATE_Pos 5 /*!< USBD_EP_T::CFG: STATE Position */ -#define USBD_CFG_STATE_Msk (3ul << USBD_CFG_STATE_Pos) /*!< USBD_EP_T::CFG: STATE Mask */ - -#define USBD_CFG_ISOCH_Pos 4 /*!< USBD_EP_T::CFG: ISOCH Position */ -#define USBD_CFG_ISOCH_Msk (1ul << USBD_CFG_ISOCH_Pos) /*!< USBD_EP_T::CFG: ISOCH Mask */ - -#define USBD_CFG_EP_NUM_Pos 0 /*!< USBD_EP_T::CFG: EP_NUM Position */ -#define USBD_CFG_EP_NUM_Msk (0xFul << USBD_CFG_EP_NUM_Pos) /*!< USBD_EP_T::CFG: EP_NUM Mask */ - -/* USBD CFGP Bit Field Definitions */ -#define USBD_CFGP_SSTALL_Pos 1 /*!< USBD_EP_T::CFGP: SSTALL Position */ -#define USBD_CFGP_SSTALL_Msk (1ul << USBD_CFGP_SSTALL_Pos) /*!< USBD_EP_T::CFGP: SSTALL Mask */ - -#define USBD_CFGP_CLRRDY_Pos 0 /*!< USBD_EP_T::CFGP: CLRRDY Position */ -#define USBD_CFGP_CLRRDY_Msk (1ul << USBD_CFGP_CLRRDY_Pos) /*!< USBD_EP_T::CFGP: CLRRDY Mask */ - -/* USBD DRVSE0 Bit Field Definitions */ -#define USBD_DRVSE0_DRVSE0_Pos 0 /*!< USBD_T::DRVSE0: DRVSE0 Position */ -#define USBD_DRVSE0_DRVSE0_Msk (1ul << USBD_DRVSE0_DRVSE0_Pos) /*!< USBD_T::DRVSE0: DRVSE0 Mask */ -/*@}*/ /* end of group REG_USBD_BITMASK */ -/*@}*/ /* end of group REG_USBD */ - - -/*----------------------------- Watchdog Timer (WDT) -----------------------------*/ -/** @addtogroup REG_WDT Watch Dog Timer Controller (WDT) - Memory Mapped Structure for Watchdog Timer - @{ - */ - -typedef struct -{ - - -/** - * @var WDT_T::WTCR - * Offset: 0x00 Watchdog Timer Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |WTR |Reset Watchdog Timer Up Counter (Write Protect) - * | | |0 = No effect. - * | | |1 = Reset the internal 18-bit WDT up counter value. - * | | |Note: This bit will be automatically cleared by hardware. - * |[1] |WTRE |Watchdog Timer Reset Enable (Write Protect) - * | | |Setting this bit will enable the WDT time-out reset function if the WDT up counter value has not been cleared after the specific WDT reset delay period expires. - * | | |0 = WDT time-out reset function Disabled. - * | | |1 = WDT time-out reset function Enabled. - * |[2] |WTRF |Watchdog Timer Time-out Reset Flag - * | | |This bit indicates the system has been reset by WDT time-out reset or not. - * | | |0 = WDT time-out reset did not occur. - * | | |1 = WDT time-out reset occurred. - * | | |Note: This bit is cleared by writing 1 to it. - * |[3] |WTIF |Watchdog Timer Time-out Interrupt Flag - * | | |This bit will set to 1 while WDT up counter value reaches the selected WDT time-out interval. - * | | |0 = WDT time-out interrupt did not occur. - * | | |1 = WDT time-out interrupt occurred. - * | | |Note: This bit is cleared by writing 1 to it. - * |[4] |WTWKE |Watchdog Timer Time-out Wake-Up Function Control - * | | |(Write Protect) - * | | |If this bit is set to 1, while WTIF is generated to 1 and WTIE enabled, the WDT time-out interrupt signal will generate a wake-up trigger event to chip. - * | | |0 = Wake-up trigger event Disabled if WDT time-out interrupt signal generated. - * | | |1 = Wake-up trigger event Enabled if WDT time-out interrupt signal generated. - * | | |Note: Chip can be woken-up by WDT time-out interrupt signal generated only if WDT clock source is selected to 10 kHz oscillator. - * |[5] |WTWKF |Watchdog Timer Time-out Wake-Up Flag - * | | |This bit indicates the interrupt wake-up flag status of WDT. - * | | |0 = WDT does not cause chip wake-up. - * | | |1 = Chip wake-up from Idle or Power-down mode if WDT time-out interrupt signal generated. - * | | |Note: This bit is cleared by writing 1 to it. - * |[6] |WTIE |Watchdog Timer Time-out Interrupt Enable Control (Write Protect) - * | | |If this bit is enabled, the WDT time-out interrupt signal is generated and inform to CPU. - * | | |0 = WDT time-out interrupt Disabled. - * | | |1 = WDT time-out interrupt Enabled. - * |[7] |WTE |Watchdog Timer Enable Control (Write Protect) - * | | |0 = WDT Disabled. (This action will reset the internal up counter value.) - * | | |1 = WDT Enabled. - * | | |Note: If CWDTEN (CONFIG0[31] Watchdog Enable) bit is set to 0, this bit is forced as 1 and - * | | | user cannot change this bit to 0. - * |[10:8] |WTIS |Watchdog Timer Time-out Interval Selection (Write Protect) - * | | |These three bits select the time-out interval period for the WDT. - * | | |000 = 24 *TWDT. - * | | |001 = 26 * TWDT. - * | | |010 = 28 * TWDT. - * | | |011 = 210 * TWDT. - * | | |100 = 212 * TWDT. - * | | |101 = 214 * TWDT. - * | | |110 = 216 * TWDT. - * | | |111 = 218 * TWDT. - * |[31] |DBGACK_WDT|ICE Debug Mode Acknowledge Disable Control (Write Protect) - * | | |0 = ICE debug mode acknowledgment effects WDT counting. - * | | |WDT up counter will be held while CPU is held by ICE. - * | | |1 = ICE debug mode acknowledgment Disabled. - * | | |WDT up counter will keep going no matter CPU is held by ICE or not. - * @var WDT_T::WTCRALT - * Offset: 0x04 Watchdog Timer Alternative Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[1:0] |WTRDSEL |Watchdog Timer Reset Delay Selection (Write Protect) - * | | |When WDT time-out happened, user has a time named WDT Reset Delay Period to clear WDT counter to prevent WDT time-out reset happened. - * | | |User can select a suitable value of WDT Reset Delay Period for different WDT time-out period. - * | | |These bits are protected bit. - * | | |It means programming this bit needs to write "59h", "16h", "88h" to address 0x5000_0100 to disable register protection. - * | | |Reference the register REGWRPROT at address GCR_BA+0x100. - * | | |00 = Watchdog Timer Reset Delay Period is 1026 * WDT_CLK. - * | | |01 = Watchdog Timer Reset Delay Period is 130 * WDT_CLK. - * | | |10 = Watchdog Timer Reset Delay Period is 18 * WDT_CLK. - * | | |11 = Watchdog Timer Reset Delay Period is 3 * WDT_CLK. - * | | |Note: This register will be reset to 0 if WDT time-out reset happened. - */ - - __IO uint32_t WTCR; /* Offset: 0x00 Watchdog Timer Control Register */ - __IO uint32_t WTCRALT; /* Offset: 0x04 Watchdog Timer Alternative Control Register */ - -} WDT_T; - - - - -/** @addtogroup REG_WDT_BITMASK WDT Bit Mask - @{ - */ - -/* WDT WTCR Bit Field Definitions */ -#define WDT_WTCR_DBGACK_WDT_Pos 31 /*!< WDT_T::WTCR: DBGACK_WDT Position */ -#define WDT_WTCR_DBGACK_WDT_Msk (1ul << WDT_WTCR_DBGACK_WDT_Pos) /*!< WDT_T::WTCR: DBGACK_WDT Mask */ - -#define WDT_WTCR_WTIS_Pos 8 /*!< WDT_T::WTCR: WTIS Position */ -#define WDT_WTCR_WTIS_Msk (0x7ul << WDT_WTCR_WTIS_Pos) /*!< WDT_T::WTCR: WTIS Mask */ - -#define WDT_WTCR_WTE_Pos 7 /*!< WDT_T::WTCR: WTE Position */ -#define WDT_WTCR_WTE_Msk (1ul << WDT_WTCR_WTE_Pos) /*!< WDT_T::WTCR: WTE Mask */ - -#define WDT_WTCR_WTIE_Pos 6 /*!< WDT_T::WTCR: WTIE Position */ -#define WDT_WTCR_WTIE_Msk (1ul << WDT_WTCR_WTIE_Pos) /*!< WDT_T::WTCR: WTIE Mask */ - -#define WDT_WTCR_WTWKF_Pos 5 /*!< WDT_T::WTCR: WTWKF Position */ -#define WDT_WTCR_WTWKF_Msk (1ul << WDT_WTCR_WTWKF_Pos) /*!< WDT_T::WTCR: WTWKF Mask */ - -#define WDT_WTCR_WTWKE_Pos 4 /*!< WDT_T::WTCR: WTWKE Position */ -#define WDT_WTCR_WTWKE_Msk (1ul << WDT_WTCR_WTWKE_Pos) /*!< WDT_T::WTCR: WTWKE Mask */ - -#define WDT_WTCR_WTIF_Pos 3 /*!< WDT_T::WTCR: WTIF Position */ -#define WDT_WTCR_WTIF_Msk (1ul << WDT_WTCR_WTIF_Pos) /*!< WDT_T::WTCR: WTIF Mask */ - -#define WDT_WTCR_WTRF_Pos 2 /*!< WDT_T::WTCR: WTRF Position */ -#define WDT_WTCR_WTRF_Msk (1ul << WDT_WTCR_WTRF_Pos) /*!< WDT_T::WTCR: WTRF Mask */ - -#define WDT_WTCR_WTRE_Pos 1 /*!< WDT_T::WTCR: WTRE Position */ -#define WDT_WTCR_WTRE_Msk (1ul << WDT_WTCR_WTRE_Pos) /*!< WDT_T::WTCR: WTRE Mask */ - -#define WDT_WTCR_WTR_Pos 0 /*!< WDT_T::WTCR: WTR Position */ -#define WDT_WTCR_WTR_Msk (1ul << WDT_WTCR_WTR_Pos) /*!< WDT_T::WTCR: WTR Mask */ - -/* WDT WTCRALT Bit Field Definitions */ -#define WDT_WTCRALT_WTRDSEL_Pos 0 /*!< WDT_T::WTCRALT: WTRDSEL Position */ -#define WDT_WTCRALT_WTRDSEL_Msk (0x3ul << WDT_WTCRALT_WTRDSEL_Pos) /*!< WDT_T::WTCRALT: WTRDSEL Mask */ -/*@}*/ /* end of group REG_WDT_BITMASK */ -/*@}*/ /* end of group REG_WDT */ - - -/*----------------------------- Window Watchdog Timer (WWDT) -----------------------------*/ -/** @addtogroup REG_WWDT Window Watchdog Timer (WWDT) - Memory Mapped Structure for Window Watchdog Timer - @{ - */ - -typedef struct -{ - - -/** - * @var WWDT_T::WWDTRLD - * Offset: 0x00 Window Watchdog Timer Reload Counter Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[31:0] |WWDTRLD |WWDT Reload Counter Register - * | | |Writing 0x00005AA5 to this register will reload the WWDT counter value to 0x3F. - * | | |Note: User can only write WWDTRLD to reload WWDT counter value when current WWDT - * | | | counter value between 0 and WINCMP. If user writes WWDTRLD when current WWDT - * | | | counter value is larger than WINCMP, WWDT reset signal will generate immediately. - * @var WWDT_T::WWDTCR - * Offset: 0x04 Window Watchdog Timer Control Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |WWDTEN |WWDT Enable Control - * | | |0 = WWDT counter is stopped. - * | | |1 = WWDT counter is starting counting. - * |[1] |WWDTIE |WWDT Interrupt Enable Control - * | | |If this bit is enabled, the WWDT counter compare match interrupt signal is generated and inform to CPU. - * | | |0 = WWDT counter compare match interrupt Disabled. - * | | |1 = WWDT counter compare match interrupt Enabled. - * |[11:8] |PERIODSEL |WWDT Counter Prescale Period Selection - * | | |0000 = Pre-scale is 1; Max time-out period is 1 * 64 * TWWDT. - * | | |0001 = Pre-scale is 2; Max time-out period is 2 * 64 * TWWDT. - * | | |0010 = Pre-scale is 4; Max time-out period is 4 * 64 * TWWDT. - * | | |0011 = Pre-scale is 8; Max time-out period is 8 * 64 * TWWDT. - * | | |0100 = Pre-scale is 16; Max time-out period is 16 * 64 * TWWDT. - * | | |0101 = Pre-scale is 32; Max time-out period is 32 * 64 * TWWDT. - * | | |0110 = Pre-scale is 64; Max time-out period is 64 * 64 * TWWDT. - * | | |0111 = Pre-scale is 128; Max time-out period is 128 * 64 * TWWDT. - * | | |1000 = Pre-scale is 192; Max time-out period is 192 * 64 * TWWDT. - * | | |1001 = Pre-scale is 256; Max time-out period is 256 * 64 * TWWDT. - * | | |1010 = Pre-scale is 384; Max time-out period is 384 * 64 * TWWDT. - * | | |1011 = Pre-scale is 512; Max time-out period is 512 * 64 * TWWDT. - * | | |1100 = Pre-scale is 768; Max time-out period is 768 * 64 * TWWDT. - * | | |1101 = Pre-scale is 1024; Max time-out period is 1024 * 64 * TWWDT. - * | | |1110 = Pre-scale is 1536; Max time-out period is 1536 * 64 * TWWDT. - * | | |1111 = Pre-scale is 2048; Max time-out period is 2048 * 64 * TWWDT. - * |[21:16] |WINCMP |WWDT Window Compare Register - * | | |Set this register to adjust the valid reload window. - * | | |Note: User can only write WWDTRLD to reload WWDT counter value when current WWDT counter value between 0 and WINCMP. - * | | |If user writes WWDTRLD when current WWDT counter value larger than WINCMP, WWDT reset signal will generate immediately. - * |[31] |DBGACK_WWDT|ICE Debug Mode Acknowledge Disable Control - * | | |0 = ICE debug mode acknowledgment effects WWDT counting. - * | | |WWDT down counter will be held while CPU is held by ICE. - * | | |1 = ICE debug mode acknowledgment Disabled. - * | | |WWDT down counter will keep going no matter CPU is held by ICE or not. - * @var WWDT_T::WWDTSR - * Offset: 0x08 Window Watchdog Timer Status Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[0] |WWDTIF |WWDT Compare Match Interrupt Flag - * | | |This bit indicates the interrupt flag status of WWDT while WWDT counter value matches WINCMP value. - * | | |0 = No effect. - * | | |1 = WWDT counter value matches WINCMP value. - * | | |Note: This bit is cleared by writing 1 to it. - * |[1] |WWDTRF |WWDT Time-out Reset Flag - * | | |This bit indicates the system has been reset by WWDT time-out reset or not. - * | | |0 = WWDT time-out reset did not occur. - * | | |1 = WWDT time-out reset occurred. - * | | |Note: This bit is cleared by writing 1 to it. - * @var WWDT_T::WWDTCVR - * Offset: 0x0C Window Watchdog Timer Counter Value Register - * --------------------------------------------------------------------------------------------------- - * |Bits |Field |Descriptions - * | :----: | :----: | :---- | - * |[5:0] |WWDTCVAL |WWDT Counter Value - * | | |WWDTCVAL will be updated continuously to monitor 6-bit down counter value. - */ - - __IO uint32_t WWDTRLD; /* Offset: 0x00 Window Watchdog Timer Reload Counter Register */ - __IO uint32_t WWDTCR; /* Offset: 0x04 Window Watchdog Timer Control Register */ - __IO uint32_t WWDTSR; /* Offset: 0x08 Window Watchdog Timer Status Register */ - __I uint32_t WWDTCVR; /* Offset: 0x0C Window Watchdog Timer Counter Value Register */ - -} WWDT_T; - - - -/** @addtogroup REG_WWDT_BITMASK WWDT Bit Mask - @{ - */ - -/* WWDT WWDTRLD Bit Field Definitions */ -#define WWDT_WWDTRLD_WWDTRLD_Pos 0 /*!< WWDT_T::WWDTRLD: WWDTRLD Position */ -#define WWDT_WWDTRLD_WWDTRLD_Msk (0xFFFFFFFFul << WWDT_WWDTRLD_WWDTRLD_Pos) /*!< WWDT_T::WWDTRLD: WWDTRLD Mask */ - -/* WWDT WWDTCR Bit Field Definitions */ -#define WWDT_WWDTCR_DBGACK_WWDT_Pos 31 /*!< WWDT_T::WWDTCR: DBGACK_WWDT Position */ -#define WWDT_WWDTCR_DBGACK_WWDT_Msk (1ul << WWDT_WWDTCR_DBGACK_WWDT_Pos) /*!< WWDT_T::WWDTCR: DBGACK_WWDT Mask */ - -#define WWDT_WWDTCR_WINCMP_Pos 16 /*!< WWDT_T::WWDTCR: WINCMP Position */ -#define WWDT_WWDTCR_WINCMP_Msk (0x3Ful << WWDT_WWDTCR_WINCMP_Pos) /*!< WWDT_T::WWDTCR: WINCMP Mask */ - -#define WWDT_WWDTCR_PERIODSEL_Pos 8 /*!< WWDT_T::WWDTCR: PERIODSEL Position */ -#define WWDT_WWDTCR_PERIODSEL_Msk (0xFul << WWDT_WWDTCR_PERIODSEL_Pos) /*!< WWDT_T::WWDTCR: PERIODSEL Mask */ - -#define WWDT_WWDTCR_WWDTIE_Pos 1 /*!< WWDT_T::WWDTCR: WWDTIE Position */ -#define WWDT_WWDTCR_WWDTIE_Msk (1ul << WWDT_WWDTCR_WWDTIE_Pos) /*!< WWDT_T::WWDTCR: WWDTIE Mask */ - -#define WWDT_WWDTCR_WWDTEN_Pos 0 /*!< WWDT_T::WWDTCR: WWDTEN Position */ -#define WWDT_WWDTCR_WWDTEN_Msk (1ul << WWDT_WWDTCR_WWDTEN_Pos) /*!< WWDT_T::WWDTCR: WWDTEN Mask */ - -/* WWDT WWDTSR Bit Field Definitions */ -#define WWDT_WWDTSR_WWDTRF_Pos 1 /*!< WWDT_T::WWDTSR: WWDTRF Position */ -#define WWDT_WWDTSR_WWDTRF_Msk (1ul << WWDT_WWDTSR_WWDTRF_Pos) /*!< WWDT_T::WWDTSR: WWDTRF Mask */ - -#define WWDT_WWDTSR_WWDTIF_Pos 0 /*!< WWDT_T::WWDTSR: WWDTIF Position */ -#define WWDT_WWDTSR_WWDTIF_Msk (1ul << WWDT_WWDTSR_WWDTIF_Pos) /*!< WWDT_T::WWDTSR: WWDTIF Mask */ - -/* WWDT WWDTCVR Bit Field Definitions */ -#define WWDT_WWDTCVR_WWDTCVAL_Pos 0 /*!< WWDT_T::WWDTCVR: WWDTRF Position */ -#define WWDT_WWDTCVR_WWDTCVAL_Msk (0x3Ful << WWDT_WWDTCVR_WWDTCVAL_Pos) /*!< WWDT_T::WWDTCVR: WWDTRF Mask */ -/*@}*/ /* end of group REG_WWDT_BITMASK */ -/*@}*/ /* end of group REG_WWDT */ -/*@}*/ /* end of group REGISTER */ - - -/******************************************************************************/ -/* Peripheral memory map */ -/******************************************************************************/ -/** @addtogroup PERIPHERAL_MEM_MAP Peripheral Memory Map - Memory Mapped Structure for Series Peripheral - @{ - */ -/* Peripheral and SRAM base address */ -#define FLASH_BASE (( uint32_t)0x00000000) -#define SRAM_BASE (( uint32_t)0x20000000) -#define AHB_BASE (( uint32_t)0x50000000) -#define APB1_BASE (( uint32_t)0x40000000) -#define APB2_BASE (( uint32_t)0x40100000) - -/* Peripheral memory map */ -#define GPIO_BASE (AHB_BASE + 0x4000) /*!< GPIO Base Address */ -#define PA_BASE (GPIO_BASE ) /*!< GPIO PORTA Base Address */ -#define PB_BASE (GPIO_BASE + 0x0040) /*!< GPIO PORTB Base Address */ -#define PC_BASE (GPIO_BASE + 0x0080) /*!< GPIO PORTC Base Address */ -#define PD_BASE (GPIO_BASE + 0x00C0) /*!< GPIO PORTD Base Address */ -#define PE_BASE (GPIO_BASE + 0x0100) /*!< GPIO PORTE Base Address */ -#define PF_BASE (GPIO_BASE + 0x0140) /*!< GPIO PORTF Base Address */ -#define GPIO_DBNCECON_BASE (GPIO_BASE + 0x0180) /*!< GPIO De-bounce Cycle Control Base Address */ -#define GPIO_PIN_DATA_BASE (GPIO_BASE + 0x0200) /*!< GPIO Pin Data Input/Output Control Base Address */ - - -#define UART0_BASE (APB1_BASE + 0x50000) -#define UART1_BASE (APB2_BASE + 0x50000) -#define UART2_BASE (APB2_BASE + 0x54000) - - -#define TIMER0_BASE (APB1_BASE + 0x10000) /*!< Timer0 Base Address */ -#define TIMER1_BASE (APB1_BASE + 0x10020) /*!< Timer1 Base Address */ -#define TIMER2_BASE (APB2_BASE + 0x10000) /*!< Timer2 Base Address */ -#define TIMER3_BASE (APB2_BASE + 0x10020) /*!< Timer3 Base Address */ - -#define WDT_BASE (APB1_BASE + 0x4000) /*!< Watchdog Timer Base Address */ - -#define WWDT_BASE (APB1_BASE + 0x4100) /*!< Window Watchdog Timer Base Address */ - -#define SPI0_BASE (APB1_BASE + 0x30000) /*!< SPI0 Base Address */ -#define SPI1_BASE (APB1_BASE + 0x34000) /*!< SPI1 Base Address */ -#define SPI2_BASE (APB2_BASE + 0x30000) /*!< SPI2 Base Address */ - -#define I2C0_BASE (APB1_BASE + 0x20000) /*!< I2C0 Base Address */ -#define I2C1_BASE (APB2_BASE + 0x20000) /*!< I2C1 Base Address */ - -#define ADC_BASE (APB1_BASE + 0xE0000) /*!< ADC Base Address */ - -#define CLK_BASE (AHB_BASE + 0x00200) /*!< System Clock Controller Base Address */ - -#define GCR_BASE (AHB_BASE + 0x00000) /*!< System Global Controller Base Address */ - -#define INT_BASE (AHB_BASE + 0x00300) /*!< Interrupt Source Controller Base Address */ - -#define FMC_BASE (AHB_BASE + 0x0C000) - -#define PS2_BASE (APB2_BASE + 0x00000) /*!< PS/2 Base Address */ - -#define USBD_BASE (APB1_BASE + 0x60000) /*!< USBD Base Address */ - -#define PDMA0_BASE (AHB_BASE + 0x08000) /*!< PDMA0 Base Address */ -#define PDMA1_BASE (AHB_BASE + 0x08100) /*!< PDMA1 Base Address */ -#define PDMA2_BASE (AHB_BASE + 0x08200) /*!< PDMA2 Base Address */ -#define PDMA3_BASE (AHB_BASE + 0x08300) /*!< PDMA3 Base Address */ -#define PDMA4_BASE (AHB_BASE + 0x08400) /*!< PDMA4 Base Address */ -#define PDMA5_BASE (AHB_BASE + 0x08500) /*!< PDMA5 Base Address */ - -#define PDMA_GCR_BASE (AHB_BASE + 0x08F00) /*!< PDMA Global Base Address */ - -#define CRC_BASE (AHB_BASE + 0x08E00) /*!< CRC Base Address */ - -#define PWMA_BASE (APB1_BASE + 0x40000) /*!< PWMA Base Address */ - -#define I2S_BASE (APB2_BASE + 0xA0000) /*!< I2S Base Address */ - -/*@}*/ /* end of group PERIPHERAL_MEM_MAP */ - -/******************************************************************************/ -/* Peripheral Definitions */ -/******************************************************************************/ - -/** @addtogroup PERIPHERAL Peripheral Definitions - The Definitions of Peripheral - @{ - */ -#define PA ((GPIO_T *) PA_BASE) /*!< GPIO PORTA Configuration Struct */ -#define PB ((GPIO_T *) PB_BASE) /*!< GPIO PORTB Configuration Struct */ -#define PC ((GPIO_T *) PC_BASE) /*!< GPIO PORTC Configuration Struct */ -#define PD ((GPIO_T *) PD_BASE) /*!< GPIO PORTD Configuration Struct */ -#define PF ((GPIO_T *) PF_BASE) /*!< GPIO PORTF Configuration Struct */ -#define GPIO ((GPIO_DBNCECON_T *) GPIO_DBNCECON_BASE) /*!< Interrupt De-bounce Cycle Control Configuration Struct */ - -#define UART0 ((UART_T *) UART0_BASE) /*!< UART0 Configuration Struct */ -#define UART1 ((UART_T *) UART1_BASE) /*!< UART1 Configuration Struct */ - -#define TIMER0 ((TIMER_T *) TIMER0_BASE) /*!< Timer0 Configuration Struct */ -#define TIMER1 ((TIMER_T *) TIMER1_BASE) /*!< Timer1 Configuration Struct */ -#define TIMER2 ((TIMER_T *) TIMER2_BASE) /*!< Timer2 Configuration Struct */ -#define TIMER3 ((TIMER_T *) TIMER3_BASE) /*!< Timer3 Configuration Struct */ - -#define WDT ((WDT_T *) WDT_BASE) /*!< Watchdog Timer Configuration Struct */ - -#define WWDT ((WWDT_T *) WWDT_BASE) /*!< Window Watchdog Timer Configuration Struct */ - -#define SPI0 ((SPI_T *) SPI0_BASE) /*!< SPI0 Configuration Struct */ -#define SPI1 ((SPI_T *) SPI1_BASE) /*!< SPI1 Configuration Struct */ -#define SPI2 ((SPI_T *) SPI2_BASE) /*!< SPI2 Configuration Struct */ - -#define I2C0 ((I2C_T *) I2C0_BASE) /*!< I2C0 Configuration Struct */ -#define I2C1 ((I2C_T *) I2C1_BASE) /*!< I2C1 Configuration Struct */ - -#define I2S ((I2S_T *) I2S_BASE) /*!< I2S Configuration Struct */ - -#define ADC ((ADC_T *) ADC_BASE) /*!< ADC Configuration Struct */ - -#define CLK ((CLK_T *) CLK_BASE) /*!< System Clock Controller Configuration Struct */ - -#define SYS ((GCR_T *) GCR_BASE) /*!< System Global Controller Configuration Struct */ - -#define SYSINT ((GCR_INT_T *) INT_BASE) /*!< Interrupt Source Controller Configuration Struct */ - -#define FMC ((FMC_T *) FMC_BASE) - -#define PS2 ((PS2_T *) PS2_BASE) /*!< PS/2 Configuration Struct */ - -#define USBD ((USBD_T *) USBD_BASE) /*!< USBD Configuration Struct */ - -#define PDMA0 ((PDMA_T *) PDMA0_BASE) /*!< PDMA0 Configuration Struct */ -#define PDMA1 ((PDMA_T *) PDMA1_BASE) /*!< PDMA1 Configuration Struct */ -#define PDMA2 ((PDMA_T *) PDMA2_BASE) /*!< PDMA2 Configuration Struct */ -#define PDMA3 ((PDMA_T *) PDMA3_BASE) /*!< PDMA3 Configuration Struct */ -#define PDMA4 ((PDMA_T *) PDMA4_BASE) /*!< PDMA4 Configuration Struct */ -#define PDMA5 ((PDMA_T *) PDMA5_BASE) /*!< PDMA5 Configuration Struct */ - -#define PDMA_GCR ((PDMA_GCR_T *) PDMA_GCR_BASE) /*!< PDMA Global Configuration Struct */ - -#define CRC ((CRC_T *) CRC_BASE) /*!< CRC Configuration Struct */ - -#define PWMA ((PWM_T *) PWMA_BASE) /*!< PWMA Configuration Struct */ - -/*@}*/ /* end of group PERIPHERAL */ - -#define UNLOCKREG() do{*((__IO uint32_t *)(GCR_BASE + 0x100)) = 0x59;*((__IO uint32_t *)(GCR_BASE + 0x100)) = 0x16;*((__IO uint32_t *)(GCR_BASE + 0x100)) = 0x88;}while(*((__IO uint32_t *)(GCR_BASE + 0x100))==0) -#define LOCKREG() *((__IO uint32_t *)(GCR_BASE + 0x100)) = 0x00 - -#define REGCOPY(dest, src) *((uint32_t *)&(dest)) = *((uint32_t *)&(src)) -#define CLEAR(dest) *((uint32_t *)&(dest)) = 0 - -//============================================================================= -/** @addtogroup IO_ROUTINE I/O routines - The Declaration of I/O routines - @{ - */ - -typedef volatile unsigned char vu8; ///< Define 8-bit unsigned volatile data type -typedef volatile unsigned short vu16; ///< Define 16-bit unsigned volatile data type -typedef volatile unsigned long vu32; ///< Define 32-bit unsigned volatile data type - -/** - * @brief Get a 8-bit unsigned value from specified address - * @param[in] addr Address to get 8-bit data from - * @return 8-bit unsigned value stored in specified address - */ -#define M8(addr) (*((vu8 *) (addr))) - -/** - * @brief Get a 16-bit unsigned value from specified address - * @param[in] addr Address to get 16-bit data from - * @return 16-bit unsigned value stored in specified address - * @note The input address must be 16-bit aligned - */ -#define M16(addr) (*((vu16 *) (addr))) - -/** - * @brief Get a 32-bit unsigned value from specified address - * @param[in] addr Address to get 32-bit data from - * @return 32-bit unsigned value stored in specified address - * @note The input address must be 32-bit aligned - */ -#define M32(addr) (*((vu32 *) (addr))) - -/** - * @brief Set a 32-bit unsigned value to specified I/O port - * @param[in] port Port address to set 32-bit data - * @param[in] value Value to write to I/O port - * @return None - * @note The output port must be 32-bit aligned - */ -#define outpw(port,value) *((volatile unsigned int *)(port)) = (value) - -/** - * @brief Get a 32-bit unsigned value from specified I/O port - * @param[in] port Port address to get 32-bit data from - * @return 32-bit unsigned value stored in specified I/O port - * @note The input port must be 32-bit aligned - */ -#define inpw(port) (*((volatile unsigned int *)(port))) - -/** - * @brief Set a 16-bit unsigned value to specified I/O port - * @param[in] port Port address to set 16-bit data - * @param[in] value Value to write to I/O port - * @return None - * @note The output port must be 16-bit aligned - */ -#define outps(port,value) *((volatile unsigned short *)(port)) = (value) - -/** - * @brief Get a 16-bit unsigned value from specified I/O port - * @param[in] port Port address to get 16-bit data from - * @return 16-bit unsigned value stored in specified I/O port - * @note The input port must be 16-bit aligned - */ -#define inps(port) (*((volatile unsigned short *)(port))) - -/** - * @brief Set a 8-bit unsigned value to specified I/O port - * @param[in] port Port address to set 8-bit data - * @param[in] value Value to write to I/O port - * @return None - */ -#define outpb(port,value) *((volatile unsigned char *)(port)) = (value) - -/** - * @brief Get a 8-bit unsigned value from specified I/O port - * @param[in] port Port address to get 8-bit data from - * @return 8-bit unsigned value stored in specified I/O port - */ -#define inpb(port) (*((volatile unsigned char *)(port))) - -/** - * @brief Set a 32-bit unsigned value to specified I/O port - * @param[in] port Port address to set 32-bit data - * @param[in] value Value to write to I/O port - * @return None - * @note The output port must be 32-bit aligned - */ -#define outp32(port,value) *((volatile unsigned int *)(port)) = (value) - -/** - * @brief Get a 32-bit unsigned value from specified I/O port - * @param[in] port Port address to get 32-bit data from - * @return 32-bit unsigned value stored in specified I/O port - * @note The input port must be 32-bit aligned - */ -#define inp32(port) (*((volatile unsigned int *)(port))) - -/** - * @brief Set a 16-bit unsigned value to specified I/O port - * @param[in] port Port address to set 16-bit data - * @param[in] value Value to write to I/O port - * @return None - * @note The output port must be 16-bit aligned - */ -#define outp16(port,value) *((volatile unsigned short *)(port)) = (value) - -/** - * @brief Get a 16-bit unsigned value from specified I/O port - * @param[in] port Port address to get 16-bit data from - * @return 16-bit unsigned value stored in specified I/O port - * @note The input port must be 16-bit aligned - */ -#define inp16(port) (*((volatile unsigned short *)(port))) - -/** - * @brief Set a 8-bit unsigned value to specified I/O port - * @param[in] port Port address to set 8-bit data - * @param[in] value Value to write to I/O port - * @return None - */ -#define outp8(port,value) *((volatile unsigned char *)(port)) = (value) - -/** - * @brief Get a 8-bit unsigned value from specified I/O port - * @param[in] port Port address to get 8-bit data from - * @return 8-bit unsigned value stored in specified I/O port - */ -#define inp8(port) (*((volatile unsigned char *)(port))) - -/*@}*/ /* end of group IO_ROUTINE */ - - - - -/** @addtogroup legacy_Constants Legacy Constants - Legacy Constants - @{ -*/ - - -#define E_SUCCESS 0 -#ifndef NULL -#define NULL 0 -#endif - -#define TRUE 1 -#define FALSE 0 - -#define ENABLE 1 -#define DISABLE 0 - -/* Define one bit mask */ -#define BIT0 0x00000001 -#define BIT1 0x00000002 -#define BIT2 0x00000004 -#define BIT3 0x00000008 -#define BIT4 0x00000010 -#define BIT5 0x00000020 -#define BIT6 0x00000040 -#define BIT7 0x00000080 -#define BIT8 0x00000100 -#define BIT9 0x00000200 -#define BIT10 0x00000400 -#define BIT11 0x00000800 -#define BIT12 0x00001000 -#define BIT13 0x00002000 -#define BIT14 0x00004000 -#define BIT15 0x00008000 -#define BIT16 0x00010000 -#define BIT17 0x00020000 -#define BIT18 0x00040000 -#define BIT19 0x00080000 -#define BIT20 0x00100000 -#define BIT21 0x00200000 -#define BIT22 0x00400000 -#define BIT23 0x00800000 -#define BIT24 0x01000000 -#define BIT25 0x02000000 -#define BIT26 0x04000000 -#define BIT27 0x08000000 -#define BIT28 0x10000000 -#define BIT29 0x20000000 -#define BIT30 0x40000000 -#define BIT31 0x80000000 - -/* Byte Mask Definitions */ -#define BYTE0_Msk (0x000000FF) -#define BYTE1_Msk (0x0000FF00) -#define BYTE2_Msk (0x00FF0000) -#define BYTE3_Msk (0xFF000000) - -#define _GET_BYTE0(u32Param) (((u32Param) & BYTE0_Msk) ) /*!< Extract Byte 0 (Bit 0~ 7) from parameter u32Param */ -#define _GET_BYTE1(u32Param) (((u32Param) & BYTE1_Msk) >> 8) /*!< Extract Byte 1 (Bit 8~15) from parameter u32Param */ -#define _GET_BYTE2(u32Param) (((u32Param) & BYTE2_Msk) >> 16) /*!< Extract Byte 2 (Bit 16~23) from parameter u32Param */ -#define _GET_BYTE3(u32Param) (((u32Param) & BYTE3_Msk) >> 24) /*!< Extract Byte 3 (Bit 24~31) from parameter u32Param */ - -/*@}*/ /* end of group legacy_Constants */ - - -/******************************************************************************/ -/* Peripheral header files */ -/******************************************************************************/ -#include "inc\SYS.h" -#include "inc\ADC.h" -#include "inc\FMC.h" -#include "inc\GPIO.h" -#include "inc\I2C.h" -#include "inc\PWM.h" -#include "inc\SPI.h" -#include "inc\TIMER.h" -#include "inc\WDT.h" -#include "inc\WWDT.h" -#include "inc\UART.h" -#include "inc\I2S.h" -#include "inc\USBD.h" -#include "inc\PDMA.h" -#include "inc\PS2.h" -#include "inc\CLK.h" -#include "inc\CRC.h" -#endif - - - diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/NUC123SD4AN0.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/NUC123SD4AN0.h new file mode 100644 index 00000000..ee7bf6cd --- /dev/null +++ b/os/common/ext/CMSIS/Nuvoton/NUMICRO/NUC123SD4AN0.h @@ -0,0 +1,5814 @@ +/**************************************************************************//** + * @file NUC123SD4AN0.h + * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File for + * Device NUC123SD4AN0 + * @version V5.00 + * @date 13. May 2019 + ******************************************************************************/ +/* + * Copyright (c) 2019 /u/KeepItUnder. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef NUC123SD4AN0_H /* ToDo: replace '' with your device name */ +#define NUC123SD4AN0_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* ToDo: replace '' with vendor name; add your doxyGen comment */ +/** @addtogroup NUVOTON + * @{ + */ + + +/* ToDo: replace '' with device name; add your doxyGen comment */ +/** @addtogroup NUC123SD4AN0 + * @{ + */ + + +/** @addtogroup Configuration_of_CMSIS + * @{ + */ + + + +/* =========================================================================================================================== */ +/* ================ Interrupt Number Definition ================ */ +/* =========================================================================================================================== */ + +typedef enum IRQn { +/* ======================================= ARM Cortex-M0 Specific Interrupt Numbers ======================================== */ + +/* ToDo: use this Cortex interrupt numbers if your device is a Cortex-M0 / Cortex-M0+ device */ + Reset_IRQn = -15, /*!< -15 Reset Vector, invoked on Power up and warm reset */ + NonMaskableInt_IRQn = -14, /*!< -14 Non maskable Interrupt, cannot be stopped or preempted */ + HardFault_IRQn = -13, /*!< -13 Hard Fault, all classes of Fault */ + SVCall_IRQn = -5, /*!< -5 System Service Call via SVC instruction */ + PendSV_IRQn = -2, /*!< -2 Pendable request for system service */ + SysTick_IRQn = -1, /*!< -1 System Tick Timer */ + +/* =========================================== Specific Interrupt Numbers ========================================= */ +/* ToDo: add here your device specific external interrupt numbers + according the interrupt handlers defined in startup_Device.s + eg.: Interrupt for Timer#1 TIM1_IRQHandler -> TIM1_IRQn */ +/** + * IRQ numbers + * + * See NUC123 Technical Reference Manual 5.2.3, page 32-33 + */ + BOD_OUT_IRQn = 0, // Brown-out low voltage detected interrupt + WDT_IRQn = 1, // Watchdog/Window Watchdog Timer interrupt + EINT0_IRQn = 2, // External signal interrupt from PB.14 pin + EINT1_IRQn = 3, // External signal interrupt from PB.15 or PD.11 pin + GPAB_IRQn = 4, // External signal interrupt from PA[15:0]/PB[13:0] + GPCDF_IRQn = 5, // External interrupt from PC[15:0]/PD[15:0]/PF[3:0] + PWMA_IRQn = 6, // PWM0, PWM1, PWM2 and PWM3 interrupt + // IRQn = 7, // Reserved + TMR0_IRQn = 8, // Timer 0 interrupt + TMR1_IRQn = 9, // Timer 1 interrupt + TMR2_IRQn = 10, // Timer 2 interrupt + TMR3_IRQn = 11, // Timer 3 interrupt + UART0_IRQn = 12, // UART0 interrupt + UART1_IRQn = 13, // UART1 interrupt + SPI0_IRQn = 14, // SPI0 interrupt + SPI1_IRQn = 15, // SPI1 interrupt + SPI2_IRQn = 16, // SPI2 interrupt + // IRQn = 17, // Reserved + I2C0_IRQn = 18, // I2C0 interrupt + I2C1_IRQn = 19, // I2C1 interrupt + // IRQn = 20, // Reserved + // IRQn = 21, // Reserved + // IRQn = 22, // Reserved + USBD_IRQn = 23, // USB 2.0 FS Device interrupt + PS2_IRQn = 24, // PS/2 interrupt + // IRQn = 25, // Reserved + PDMA_IRQn = 26, // PDMA interrupt + I2S_IRQn = 27, // I2S interrupt + PWRWU_IRQn = 28, // Clock controller interrupt for chip wake-up from Power-down state + ADC_IRQn = 29, // ADC Interrupt + // IRQn = 30, // Reserved + // IRQn = 31, // Reserved +} IRQn_Type; + + + +/* =========================================================================================================================== */ +/* ================ Processor and Core Peripheral Section ================ */ +/* =========================================================================================================================== */ + +/* =========================== Configuration of the Arm Cortex-M4 Processor and Core Peripherals =========================== */ +/* ToDo: set the defines according your Device */ +/* ToDo: define the correct core revision + __CM0_REV if your device is a Cortex-M0 device + __CM3_REV if your device is a Cortex-M3 device + __CM4_REV if your device is a Cortex-M4 device + __CM7_REV if your device is a Cortex-M7 device */ +#define __CM0_REV 0x0201 /*!< Core Revision r2p1 */ + +/* ToDo: define the correct core features for the */ +#define __MPU_PRESENT 1 /*!< Set to 1 if MPU is present */ +#define __VTOR_PRESENT 0 /*!< Set to 1 if VTOR is present */ +#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 __FPU_PRESENT 0 /*!< Set to 1 if FPU is present */ +#define __FPU_DP 0 /*!< Set to 1 if FPU is double precision FPU (default is single precision FPU) */ +#define __ICACHE_PRESENT 0 /*!< Set to 1 if I-Cache is present */ +#define __DCACHE_PRESENT 0 /*!< Set to 1 if D-Cache is present */ +#define __DTCM_PRESENT 0 /*!< Set to 1 if DTCM is present */ + + +/** @} */ /* End of group Configuration_of_CMSIS */ + + +/* ToDo: include the correct core_cm#.h file + core_cm0.h if your device is a CORTEX-M0 device + core_cm3.h if your device is a CORTEX-M3 device + core_cm4.h if your device is a CORTEX-M4 device + core_cm7.h if your device is a CORTEX-M4 device */ +#include /*!< Arm Cortex-M# processor and core peripherals */ +/* ToDo: include your system_.h file + replace '' with your device name */ +#include "system_NUC123SD4AN0.h" /*!< System */ + + +/* ======================================== Start of section using anonymous unions ======================================== */ +#if defined (__CC_ARM) + #pragma push + #pragma anon_unions +#elif defined (__ICCARM__) + #pragma language=extended +#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wc11-extensions" + #pragma clang diagnostic ignored "-Wreserved-id-macro" +#elif defined (__GNUC__) + /* anonymous unions are enabled by default */ +#elif defined (__TMS470__) + /* anonymous unions are enabled by default */ +#elif defined (__TASKING__) + #pragma warning 586 +#elif defined (__CSMC__) + /* anonymous unions are enabled by default */ +#else + #warning Not supported compiler type +#endif + + +/* =========================================================================================================================== */ +/* ================ Device Specific Peripheral Section ================ */ +/* =========================================================================================================================== */ + + +/** @addtogroup NUC123SD4AN0_Peripherals + * @{ + */ + +/* ToDo: add here your device specific peripheral access structure typedefs + following is an example for a timer */ + +/* =========================================================================================================================== */ +/* ================ TMR ================ */ +/* =========================================================================================================================== */ + + +/** + * @brief Timer (TMR) + */ + +// typedef struct +// { /*!< (@ 0x40000000) TIM Structure */ +// __IOM uint32_t TimerLoad; /*!< (@ 0x00000004) Timer Load */ +// __IM uint32_t TimerValue; /*!< (@ 0x00000008) Timer Counter Current Value */ +// __IOM uint32_t TimerControl; /*!< (@ 0x0000000C) Timer Control */ +// __OM uint32_t TimerIntClr; /*!< (@ 0x00000010) Timer Interrupt Clear */ +// __IM uint32_t TimerRIS; /*!< (@ 0x00000014) Timer Raw Interrupt Status */ +// __IM uint32_t TimerMIS; /*!< (@ 0x00000018) Timer Masked Interrupt Status */ +// __IM uint32_t RESERVED[1]; +// __IOM uint32_t TimerBGLoad; /*!< (@ 0x00000020) Background Load Register */ +// } _TMR_TypeDef; + + +/* =========================================================================================================================== */ +/* ================ Clock Controller ================ */ +/* =========================================================================================================================== */ + + +/** + * @brief Clock Controller (CLK) + * + * @description See NUC123 Technical Reference Manual 5.4.7 Register Map, page 106 + * + * CLK_BA = 0x5000_0200 + * + * Struct rearranged from table to track actual locations (without having to specify offsets) + */ +typedef struct { + + __IO uint32_t PWRCON; // CLK_BA+0x00 System Power-down Control Register + __IO uint32_t AHBCLK; // CLK_BA+0x04 AHB Devices Clock Enable Control Register + __IO uint32_t APBCLK; // CLK_BA+0x08 APB Devices Clock Enable Control Register + __IO uint32_t CLKSTATUS; // CLK_BA+0x0C Clock status monitor Register + __IO uint32_t CLKSEL0; // CLK_BA+0x10 Clock Source Select Control Register 0 + __IO uint32_t CLKSEL1; // CLK_BA+0x14 Clock Source Select Control Register 1 + __IO uint32_t CLKDIV; // CLK_BA+0x18 Clock Divider Number Register + __IO uint32_t CLKSEL2; // CLK_BA+0x1C Clock Source Select Control Register 2 + __IO uint32_t PLLCON; // CLK_BA+0x20 PLL Control Register + __IO uint32_t FRQDIV; // CLK_BA+0x24 Frequency Divider Control Register + __I uint32_t RESERVED0; // CLK_BA+0x28 Missing from table + __IO uint32_t APBDIV; // CLK_BA+0x2C APB Divider Control Register + +} CLK_T; + +/** + * @brief Clock Controller (CLK) - Register PWRCON + * + * @description Power-down Control Register (PWRCON) bit defines + * + * See NUC123 Technical Reference Manual 5.4.8 Register Description, page 107-109 + * + * PWRCON = CLK_BA+0x00 + * + * + * XTL12M_EN [0] + * External 4~24 MHz High Speed Crystal Enable (Write-protection Bit) + * + * The bit default value is set by flash controller user configuration register config0 + * [26:24]. When the default clock source is from external 4~24 MHz high speed crystal, + * this bit is set to 1 automatically + * + * 1 = External 4~24 MHz high speed crystal Enabled + * 0 = External 4~24 MHz high speed crystal Disabled + * + * + * OSC22M_EN [2] + * Internal 22.1184 MHz High Speed Oscillator Enable (Write-protection Bit) + * + * 1 = Internal 22.1184 MHz high speed oscillator Enabled. + * 0 = Internal 22.1184 MHz high speed oscillator Disabled. + * + * + * OSC10K_EN [3] + * Internal 10 kHz Low Speed Oscillator Enable (Write-protection Bit) + * + * 1 = Internal 10 kHz low speed oscillator Enabled. + * 0 = Internal 10 kHz low speed oscillator Disabled. + * + * + * PD_WU_DLY [4] + * Enable the Wake-up Delay Counter (Write-protection Bit) + * + * When the chip wakes up from Power-down mode, the clock control will delay certain + * clock cycles to wait system clock stable. + * The delayed clock cycle is 4096 clock cycles when chip work at external 4~24 MHz + * high speed crystal, and 256 clock cycles when chip work at internal 22.1184 MHz high + * speed oscillator. + * + * 1 = Clock cycles delay Enabled. + * 0 = Clock cycles delay Disabled. + * + * + * PD_WU_INT_EN [5] + * Power-down Mode Wake-up Interrupt Enable (Write-protection Bit) + * + * 0 = Disabled. + * 1 = Enabled. + * + * The interrupt will only occur when both PD_WU_STS and PD_WU_INT_EN are high. + * + * + * PD_WU_STS [6] + * Power-down Mode Wake-up Interrupt Status + * + * Set by the "Power-down wake-up event", which indicates that resume from Power-down + * mode has occured. + * + * The flag is set if the GPIO, USB, UART, WDT, CAN, ACMP or BOD wake-up occurred. + * + * Write 1 to clear the bit to zero. + * + * Note: This bit works only when PD_WU_INT_EN (PWRCON[5]) set to 1. + * + * + * PWE_DOWN_EN [7] + * System Power-down Enable Bit (Write-protection Bit) + * + * When this bit is set to 1, the chip Power-down mode is enabled and chip Power-down + * behavior will depend on the PD_WAIT_CPU bit. + * (a) If the PD_WAIT_CPU is 0, the chip enters Power-down mode immediately after the + * PWR_DOWN_EN bit set. + * (b) If the PD_WAIT_CPU is 1, the chip keeps active till the CPU sleep mode is also + * active and then the chip enters Power-down mode + * + * When the chip wakes up from Power-down mode, this bit is auto cleared. User needs to + * set this bit again for next Power-down. + * + * In Power-down mode, external 4~24 MHz high speed crystal and the internal 22.1184MHz + * high speed oscillator will be disabled in this mode, but the internal 10 kHz low + * speed oscillator is not controlled by Power-down mode. + * + * In Power-down mode, the PLL and system clock are disabled, and ignored the clock + * source selection. The clocks of peripheral are not controlled by Power-down mode, if + * the peripheral clock source is from the internal 10 kHz low speed oscillator. + * + * 1 = Chip entering the Power-down mode instantly or wait CPU sleep command - WFI + * 0 = Chip operating normally or chip in Idle mode because of WFI command. + * + * + * PD_WAIT_CPU [8] + * Power-down Entry Conditions Control (Write-protection Bit) + * + * 1 = Chip entering Power-down mode when the both PD_WAIT_CPU and + * PWR_DOWN_EN bits are set to 1 and CPU run WFI instruction. + * 0 = Chip entering Power-down mode when the PWR_DOWN_EN bit is set to 1 + * + * + * See NUC123 Technical Reference Manual, page 109, for Power-Down Mode Control Table + * which contains operating modes for Power-Down. + * + */ + +#define CLK_PWRCON_XTL12M_EN_Pos 0 +#define CLK_PWRCON_XTL12M_EN_Msk (0x01ul << CLK_PWRCON_XTL12M_EN_Pos) +// Bit 1 is Reserved +#define CLK_PWRCON_OSC22M_EN_Pos 2 +#define CLK_PWRCON_OSC22M_EN_Msk (0x01ul << CLK_PWRCON_OSC22M_EN_Pos) +#define CLK_PWRCON_OSC10K_EN_Pos 3 +#define CLK_PWRCON_OSC10K_EN_Msk (0x01ul << CLK_PWRCON_OSC10K_EN_Pos) +#define CLK_PWRCON_PD_WU_DLY_Pos 4 +#define CLK_PWRCON_PD_WU_DLY_Msk (0x01ul << CLK_PWRCON_PD_WU_DLY_Pos) +#define CLK_PWRCON_PD_WU_INT_EN_Pos 5 +#define CLK_PWRCON_PD_WU_INT_EN_Msk (0x01ul << CLK_PWRCON_PD_WU_INT_EN_Pos) +#define CLK_PWRCON_PD_WU_STS_Pos 6 +#define CLK_PWRCON_PD_WU_STS_Msk (0x01ul << CLK_PWRCON_PD_WU_STS_Pos) +#define CLK_PWRCON_PWR_DOWN_EN_Pos 7 +#define CLK_PWRCON_PWR_DOWN_EN_Msk (0x01ul << CLK_PWRCON_PWR_DOWN_EN_Pos) +#define CLK_PWRCON_PD_WAIT_CPU_Pos 8 +#define CLK_PWRCON_PD_WAIT_CPU_Msk (0x01ul << CLK_PWRCON_PD_WAIT_CPU_Pos) +// Bits 9-31 are Reserved + + +/** + * @brief Clock Controller (CLK) - Register AHBCLK + * + * @description AHB Devices Clock Enable Control Register (AHBCLK) bit defines + * + * See NUC123 Technical Reference Manual 5.4.8 Register Description, page 110 + * + * AHBCLK = CLK_BA+0x04 + * + * + * PDMA_EN [1] + * PDMA Controller Clock Enable Control + * + * 1 = PDMA engine clock Enabled. + * 0 = PDMA engine clock Disabled. + * + * + * ISP_EN [2] + * Flash ISP Controller Clock Enable Control + * + * 1 = Flash ISP engine clock Enabled. + * 0 = Flash ISP engine clock Disabled. + * + */ + +// Bit 0 is Reserved. +#define CLK_AHBCLK_PDMA_EN_Pos 1 +#define CLK_AHBCLK_PDMA_EN_Msk (0x01ul << CLK_AHBCLK_PDMA_EN_Pos) +#define CLK_AHBCLK_ISP_EN_Pos 2 +#define CLK_AHBCLK_ISP_EN_Msk (0x01ul << CLK_AHBCLK_ISP_EN_Pos) +//Bits 3-31 are Reserved. + +/** + * @brief Clock Controller (CLK) - Register APBCLK + * + * @description APB Devices Clock Enable Control Register (APBCLK) bit defines + * + * See NUC123 Technical Reference Manual 5.4.8 Register Description, page 111-113 + * + * APBCLK = CLK_BA+0x08 + * + * + * WDT_EN [0] + * Watchdog Timer Clock Enable (Write-protection Bit) + * + * 1 = Watchdog Timer Clock Enabled. + * 0 = Watchdog Timer Clock Disabled. + * + * This bit is the protected bit, which means programming it needs to write "59h", "16h", + * "88h" to address 0x5000_0100 to disable register protection. + * + * Refer to the register REGWRPROT at address GCR_BA+0x100. + * + * + * TMR0_EN [2] + * Timer0 Clock Enable + * + * 1 = Timer0 clock Enabled. + * 0 = Timer0 clock Disabled. + * + * + * TMR1_EN [3] + * Timer1 Clock Enable + * + * 1 = Timer1 clock Enabled. + * 0 = Timer1 clock Disabled. + * + * + * TMR2_EN [4] + * Timer2 Clock Enable + * + * 1 = Timer2 clock Enabled. + * 0 = Timer2 clock Disabled. + * + * + * TMR3_EN [5] + * Timer3 Clock Enable + * + * 1 = Timer3 clock Enabled. + * 0 = Timer3 clock Disabled. + * + * + * FDIV_EN [6] + * Frequency Divider Output Clock Enable + * + * 1 = FDIV clock Enabled. + * 0 = FDIV clock Disabled. + * + * + * I2C0_EN [8] + * I2C0 Clock Enable + * + * 1 = I2C0 clock Enabled. + * 0 = I2C0 clock Disabled. + * + * + * I2C1_EN [9] + * I2C1 Clock Enable + * + * 1 = I2C1 clock Enabled. + * 0 = I2C1 clock Disabled. + * + * + * SPI0_EN [12] + * SPI0 Clock Enable + * + * 1 = SPI0 clock Enabled. + * 0 = SPI0 clock Disabled. + * + * + * SPI1_EN [13] + * SPI1 Clock Enable + * + * 1 = SPI1 clock Enabled. + * 0 = SPI1 clock Disabled. + * + * + * SPI2_EN [14] + * SPI2 Clock Enable + * + * 1 = SPI2 clock Enabled. + * 0 = SPI2 clock Disabled. + * + * + * UART0_EN [16] + * UART0 Clock Enable + * + * 1 = UART0 clock Enabled. + * 0 = UART0 clock Disabled. + * + * + * UART1_EN [16] + * UART1 Clock Enable + * + * 1 = UART1 clock Enabled. + * 0 = UART1 clock Disabled. + * + * + * PWM01_EN [20] + * PWM_01 Clock Enable + * + * 1 = PWM01 clock Enabled. + * 0 = PWM01 clock Disabled. + * + * + * PWM23_EN [21] + * PWM_23 Clock Enable + * + * 1 = PWM23 clock Enabled. + * 0 = PWM23 clock Disabled. + * + * + * USBD_EN [27] + * USB 2.0 FS Device Controller Clock Enable + * + * 1 = USB clock Enabled. + * 0 = USB clock Disabled. + * + * + * ADC_EN [28] + * Analog-Digital-Converter (ADC) Clock Enable + * + * 1 = ADC clock Enabled. + * 0 = ADC clock Disabled. + * + * + * I2S_EN [29] + * I2S Clock Enable + * + * 1 = I2S Clock Enabled. + * 0 = I2S Clock Disabled. + * + * + * PS2_EN [31] + * PS/2 Clock Enable + * + * 1 = PS/2 clock Enabled. + * 0 = PS/2 clock Disabled. + * + */ + +#define CLK_APBCLK_WDT_EN_Pos 0 +#define CLK_APBCLK_WDT_EN_Msk (0x01ul << CLK_APBCLK_WDT_EN_Pos) +// Bit 1 is Reserved. +#define CLK_APBCLK_TMR0_EN_Pos 2 +#define CLK_APBCLK_TMR0_EN_Msk (0x01ul << CLK_APBCLK_TMR0_EN_Pos) +#define CLK_APBCLK_TMR1_EN_Pos 3 +#define CLK_APBCLK_TMR1_EN_Msk (0x01ul << CLK_APBCLK_TMR1_EN_Pos) +#define CLK_APBCLK_TMR2_EN_Pos 4 +#define CLK_APBCLK_TMR2_EN_Msk (0x01ul << CLK_APBCLK_TMR2_EN_Pos) +#define CLK_APBCLK_TMR3_EN_Pos 5 +#define CLK_APBCLK_TMR3_EN_Msk (0x01ul << CLK_APBCLK_TMR3_EN_Pos) +#define CLK_APBCLK_FDIV_EN_Pos 6 +#define CLK_APBCLK_FDIV_EN_Msk (0x01ul << CLK_APBCLK_FDIV_EN_Pos) +// Bit 7 is Reserved. +#define CLK_APBCLK_I2C0_EN_Pos 8 +#define CLK_APBCLK_I2C0_EN_Msk (0x01ul << CLK_APBCLK_I2C0_EN_Pos) +#define CLK_APBCLK_I2C1_EN_Pos 9 +#define CLK_APBCLK_I2C1_EN_Msk (0x01ul << CLK_APBCLK_I2C1_EN_Pos) +// Bits 10-11 are Reserved. +#define CLK_APBCLK_SPI0_EN_Pos 12 +#define CLK_APBCLK_SPI0_EN_Msk (0x01ul << CLK_APBCLK_SPI0_EN_Pos) +#define CLK_APBCLK_SPI1_EN_Pos 13 +#define CLK_APBCLK_SPI1_EN_Msk (0x01ul << CLK_APBCLK_SPI1_EN_Pos) +#define CLK_APBCLK_SPI2_EN_Pos 14 +#define CLK_APBCLK_SPI2_EN_Msk (0x01ul << CLK_APBCLK_SPI2_EN_Pos) +// Bit 15 is Reserved. +#define CLK_APBCLK_UART0_EN_Pos 16 +#define CLK_APBCLK_UART0_EN_Msk (0x01ul << CLK_APBCLK_UART0_EN_Pos) +#define CLK_APBCLK_UART1_EN_Pos 17 +#define CLK_APBCLK_UART1_EN_Msk (0x01ul << CLK_APBCLK_UART1_EN_Pos) +// Bits 18-19 are Reserved. +#define CLK_APBCLK_PWM01_EN_Pos 20 +#define CLK_APBCLK_PWM01_EN_Msk (0x01ul << CLK_APBCLK_PWM01_EN_Pos) +#define CLK_APBCLK_PWM23_EN_Pos 21 +#define CLK_APBCLK_PWM23_EN_Msk (0x01ul << CLK_APBCLK_PWM23_EN_Pos) +// Bits 22-26 are Reserved. +#define CLK_APBCLK_USBD_EN_Pos 27 +#define CLK_APBCLK_USBD_EN_Msk (0x01ul << CLK_APBCLK_USBD_EN_Pos) +#define CLK_APBCLK_ADC_EN_Pos 28 +#define CLK_APBCLK_ADC_EN_Msk (0x01ul << CLK_APBCLK_ADC_EN_Pos) +#define CLK_APBCLK_I2S_EN_Pos 29 +#define CLK_APBCLK_I2S_EN_Msk (0x01ul << CLK_APBCLK_I2S_EN_Pos) +// Bit 30 is Reserved. +#define CLK_APBCLK_PS2_EN_Pos 31 +#define CLK_APBCLK_PS2_EN_Msk (0x01ul << CLK_APBCLK_PS2_EN_Pos) + + +/** + * @brief Clock Controller (CLK) - Register CLKSTATUS + * + * @description Clock Status Register (CLKSTATUS) bit defines + * + * See NUC123 Technical Reference Manual 5.4.8 Register Description, page 114-115 + * + * CLKSTATUS = CLK_BA+0x0C + * + * + * XTL12M_STB [0] + * External 4~24 MHz High Speed Crystal Clock Source Stable Flag + * + * 1 = External 4~24 MHz high speed crystal clock is stable. + * 0 = External 4~24 MHz high speed crystal clock is not stable or disabled. + * + * This is read only bit. + * + * + * PLL_STB [2] + * Internal PLL Clock Source Stable Flag + * + * 1 = Internal PLL clock is stable. + * 0 = Internal PLL clock is not stable or disabled. + * + * This is read only bit. + * + * + * OSC10K_STB [3] + * Internal 10 kHz Low Speed Oscillator Clock Source Stable Flag + * + * 1 = Internal 10 kHz low speed oscillator clock is stable. + * 0 = Internal 10 kHz low speed oscillator clock is not stable or disabled. + * + * This is read only bit. + * + * + * OSC22M_STB [4] + * Internal 22.1184 MHz High Speed Oscillator Clock Source Stable Flag + * + * 1 = Internal 22.1184 MHz high speed oscillator clock is stable. + * 0 = Internal 22.1184 MHz high speed oscillator clock is not stable or disabled. + * + * This is read only bit + * + * + * CLK_SW_FAIL [7] + * Clock Switching Fail Flag (Write-protection Bit) + * + * 1 = Clock switching failed. + * 0 = Clock switching success. + * + * This bit is updated when software switches system clock source. If switch target clock + * is stable, this bit will be set to 0. + * If switch target clock is not stable, this bit will be set to 1. + * + * Write 1 to clear the bit to zero. + * + */ + +#define CLK_CLKSTATUS_XTL12M_STB_Pos 0 +#define CLK_CLKSTATUS_XTL12M_STB_Msk (0x01ul << CLK_CLKSTATUS_XTL12M_STB_Pos) +// Bit 1 is Reserved. +#define CLK_CLKSTATUS_PLL_STB_Pos 2 +#define CLK_CLKSTATUS_PLL_STB_Msk (0x01ul << CLK_CLKSTATUS_PLL_STB_Pos) +#define CLK_CLKSTATUS_OSC10K_STB_Pos 3 +#define CLK_CLKSTATUS_OSC10K_STB_Msk (0x01ul << CLK_CLKSTATUS_OSC10K_STB_Pos) +#define CLK_CLKSTATUS_OSC22M_STB_Pos 4 +#define CLK_CLKSTATUS_OSC22M_STB_Msk (0x01ul << CLK_CLKSTATUS_OSC22M_STB_Pos) +// Bits 5-6 are Reserved. +#define CLK_CLKSTATUS_CLK_SW_FAIL_Pos 7 +#define CLK_CLKSTATUS_CLK_SW_FAIL_Msk (0x01ul << CLK_CLKSTATUS_CLK_SW_FAIL_Pos) +// Bits 8-31 are Reserved. + + +/** + * @brief Clock Controller (CLK) - Register CLKSEL0 + * + * @description Clock Source Select Control Register 0 (CLKSEL0) bit defines + * + * See NUC123 Technical Reference Manual 5.4.8 Register Description, page 116 + * + * CLKSEL0 = CLK_BA+0x10 + * + * + * HCLK_S [0:2] + * HCLK Clock Source Selection (Write-protection Bits) + * + * 000 = Clock source from external 4~24 MHz high speed crystal clock + * 001 = Clock source from PLL clock/2 + * 010 = Clock source from PLL clock + * 011 = Clock source from internal 10 kHz low speed oscillator clock + * 111 = Clock source from internal 22.1184 MHz high speed oscillator clock + * + * Note 1 Before clock switching, the related clock sources (both pre-select and new-select) + * must be turn on. + * Note 2 The 3-bit default value is reloaded from the value of CFOSC (Config0[26:24]) in + * user configuration register of Flash controller by any reset. Therefore the default + * value is either 000b or 111b. + * + * + * STCLK_S [3:5] + * Cortex_M0 SysTick Clock Source Selection (Write-protection Bits) + * + * If SYST_CSR[2]= 0, SysTick uses clock source listed below. + * 000 = Clock source from external 4~24 MHz high speed crystal clock + * 010 = Clock source from external 4~24 MHz high speed crystal clock/2 + * 011 = Clock source from HCLK/2 + * 111 = Clock source from internal 22.1184 MHz high speed oscillator clock/2 + * + * + * All these bits are protected bit, It means programming this bit needs to write + * "59h", "16h", "88h" to address 0x5000_0100 to disable register protection. + * + * Refer to the register REGWRPROT at address GCR_BA+0x100. + * + */ + +/* CLK CLKSEL0 Bit Field Definitions */ +#define CLK_CLKSEL0_HCLK_S_Pos 0 +#define CLK_CLKSEL0_HCLK_S_Msk (0b0111ul << CLK_CLKSEL0_HCLK_S_Pos) +#define CLK_CLKSEL0_STCLK_S_Pos 3 +#define CLK_CLKSEL0_STCLK_S_Msk (0b0111ul << CLK_CLKSEL0_STCLK_S_Pos) +// Bits 4-31 are Reserved. + + +/** + * @brief Clock Controller (CLK) - Register CLKSEL1 + * + * @description Clock Source Select Control Register 1 (CLKSEL1) bit defines + * + * See NUC123 Technical Reference Manual 5.4.8 Register Description, page 117-119 + * + * CLKSEL1 = CLK_BA+0x14 + * + * + * WDT_S [0:1] + * Watchdog Timer Clock Source Selection (Write-protection Bits) + * + * 10 = Clock source from HCLK/2048 clock. + * 11 = Clock source from internal 10 kHz low speed oscillator clock. + * + * These bits are protected bits and programming this needs to write "59h", "16h", "88h" to + * address 0x5000_0100 to disable register protection. + * Refer to the register REGWRPROT at address GCR_BA+0x100. + * + * + * ADC_S [2:3] + * ADC Clock Source Selection + * + * 00 = Clock source from external 4~24 MHz high speed crystal clock + * 01 = Clock source from PLL clock + * 10 = Clock source from HCLK + * 11 = Clock source from internal 22.1184 MHz high speed oscillator clock + * + * + * SPI0_S [4] + * SPI0 Clock Source Selection + * + * 1 = Clock source from HCLK. + * 0 = Clock source from PLL clock. + * + * + * SPI1_S [5] + * SPI1 Clock Source Selection + * + * 1 = Clock source from HCLK. + * 0 = Clock source from PLL clock. + * + * + * SPI2_S [6] + * SPI2 Clock Source Selection + * + * 1 = Clock source from HCLK. + * 0 = Clock source from PLL clock. + * + * + * TMR0_S [8:10] + * TIMER0 Clock Source Selection + * + * 000 = Clock source from external 4~24 MHz high speed crystal clock. + * 010 = Clock source from HCLK. + * 011 = Clock source from external clock source TM0. + * 100 = Clock source from internal 10 kHz low speed oscillator clock. + * 111 = Clock source from internal 22.1184 MHz high speed oscillator clock. + * + * + * TMR1_S [12:14] + * TIMER1 Clock Source Selection + * + * 000 = Clock source from external 4~24 MHz high speed crystal clock. + * 010 = Clock source from HCLK. + * 011 = Clock source from external clock source TM1. + * 100 = Clock source from internal 10 kHz low speed oscillator clock. + * 111 = Clock source from internal 22.1184 MHz high speed oscillator clock. + * + * + * TMR2_S [16:18] + * TIMER2 Clock Source Selection + * + * 000 = Clock source from external 4~24 MHz high speed crystal clock. + * 010 = Clock source from HCLK. + * 011 = Clock source from external clock source TM2. + * 100 = Clock source from internal 10 kHz low speed oscillator clock. + * 111 = Clock source from internal 22.1184 MHz high speed oscillator clock. + * + * + * TMR3_S [20:22] + * TIMER3 Clock Source Selection + * + * 000 = Clock source from external 4~24 MHz high speed crystal clock. + * 010 = Clock source from HCLK. + * 011 = Clock source from external clock source TM3. + * 100 = Clock source from internal 10 kHz low speed oscillator clock. + * 111 = Clock source from internal 22.1184 MHz high speed oscillator clock. + * + * + * UART_S [24:25] + * UART Clock Source Selection + * + * 00 = Clock source from external 4~24 MHz high speed crystal clock. + * 01 = Clock source from PLL clock. + * 11 = Clock source from internal 22.1184 MHz high speed oscillator clock. + * + * + * PWM01_S [28:29] + * PWM0 and PWM1 Clock Source Select Bit [1:0] + * + * PWM0 and PWM1 use the same Engine clock source, and both of them use the same + * prescaler + * + * The Engine clock source of PWM0 and PWM1 is defined by PWM01_S[0:2] and this + * field is combined by CLKSEL2[8] and CLKSEL1[29:28]. + * + * 000 = Clock source from external 4~24 MHz high speed crystal clock. + * 010 = Clock source from HCLK. + * 011 = Clock source from internal 22.1184 MHz high speed oscillator clock. + * 111 = Clock source from internal 10 kHz low speed oscillator clock. + * + * + * PWM23_S [30:31] + * PWM2 and PWM3 Clock Source Select Bit [1:0] + * + * PWM2 and PWM3 use the same Engine clock source, and both of them use the same + * prescaler + * + * The Engine clock source of PWM2 and PWM3 is defined by PWM23_S[0:2] and this + * field is combined by CLKSEL2[9] and CLKSEL1[30:31]. + * + * 000 = Clock source from external 4~24 MHz high speed crystal clock. + * 010 = Clock source from HCLK. + * 011 = Clock source from internal 22.1184 MHz high speed oscillator clock. + * 111 = Clock source from internal 10 kHz low speed oscillator clock. + * + * + * NOTE: Before clock switching, the related clock sources (pre-select and new-select) + * must be turned on. + * + */ + +#define CLK_CLKSEL1_WDT_S_Pos 0 +#define CLK_CLKSEL1_WDT_S_Msk (0b011ul << CLK_CLKSEL1_WDT_S_Pos) +#define CLK_CLKSEL1_ADC_S_Pos 2 +#define CLK_CLKSEL1_ADC_S_Msk (0b011ul << CLK_CLKSEL1_ADC_S_Pos) +#define CLK_CLKSEL1_SPI0_S_Pos 4 +#define CLK_CLKSEL1_SPI0_S_Msk (0b01ul << CLK_CLKSEL1_SPI0_S_Pos) +#define CLK_CLKSEL1_SPI1_S_Pos 5 +#define CLK_CLKSEL1_SPI1_S_Msk (0b01ul << CLK_CLKSEL1_SPI1_S_Pos) +#define CLK_CLKSEL1_SPI2_S_Pos 6 +#define CLK_CLKSEL1_SPI2_S_Msk (0b01ul << CLK_CLKSEL1_SPI2_S_Pos) +// Bit 7 is Reserved. +#define CLK_CLKSEL1_TMR0_S_Pos 8 +#define CLK_CLKSEL1_TMR0_S_Msk (0b0111ul << CLK_CLKSEL1_TMR0_S_Pos) +// Bit 11 is Reserved. +#define CLK_CLKSEL1_TMR1_S_Pos 12 +#define CLK_CLKSEL1_TMR1_S_Msk (0b0111ul << CLK_CLKSEL1_TMR1_S_Pos) +// Bit 15 is Reserved. +#define CLK_CLKSEL1_TMR2_S_Pos 16 +#define CLK_CLKSEL1_TMR2_S_Msk (0b0111ul << CLK_CLKSEL1_TMR2_S_Pos) +// Bit 19 is Reserved. +#define CLK_CLKSEL1_TMR3_S_Pos 20 +#define CLK_CLKSEL1_TMR3_S_Msk (0b0111ul << CLK_CLKSEL1_TMR3_S_Pos) +// Bit 23 is Reserved. +#define CLK_CLKSEL1_UART_S_Pos 24 +#define CLK_CLKSEL1_UART_S_Msk (0b011ul << CLK_CLKSEL1_UART_S_Pos) +// Bits 26-27 are Reserved. +#define CLK_CLKSEL1_PWM01_S_Pos 28 +#define CLK_CLKSEL1_PWM01_S_Msk (0b011ul << CLK_CLKSEL1_PWM01_S_Pos) +#define CLK_CLKSEL1_PWM23_S_Pos 30 +#define CLK_CLKSEL1_PWM23_S_Msk (0b011ul << CLK_CLKSEL1_PWM23_S_Pos) + + +/** + * @brief Clock Controller (CLK) - Register CLKSEL2 + * + * @description Clock Source Select Control Register 2 (CLKSEL2) bit defines + * + * See NUC123 Technical Reference Manual 5.4.8 Register Description, page 120-121 + * + * CLKSEL2 = CLK_BA+0x1C + * + * + * I2S_S [0:1] + * I2S Clock Source Selection + * + * 00 = Clock source from external 4~24 MHz high speed crystal clock. + * 01 = Clock source from HCLK. + * 10 = Clock source from PLL clock. + * 11 = Clock source from internal 22.1184 MHz high speed oscillator clock. + * + * + * FRQDIV_S [2:3] + * Clock Divider Clock Source Selection + * + * 00 = Clock source from external 4~24 MHz high speed crystal clock. + * 01 = Clock source from HCLK. + * 10 = Reserved. + * 11 = Clock source from internal 22.1184 MHz high speed oscillator clock. + * + * + * PWM01_S [2] + * PWM0 and PWM1 Clock Source Select Bit [2] + * + * PWM0 and PWM1 use the same Engine clock source, and both of them use the same + * prescaler. + * + * The Engine clock source of PWM0 and PWM1 is defined by PWM01_S[2:0] and this + * field is combined by CLKSEL2[8] and CLKSEL1[29:28]. + * + * 000 = Clock source from external 4~24 MHz high speed crystal clock. + * 010 = Clock source from HCLK. + * 011 = Clock source from internal 22.1184 MHz high speed oscillator clock. + * 111 = Clock source from internal 10 kHz low speed oscillator clock. + * + * + * PWM23_S [9] + * PWM2 and PWM3 Clock Source Select Bit [2] + * + * PWM2 and PWM3 use the same Engine clock source, and both of them use the same + * prescaler. + * + * The Engine clock source of PWM2 and PWM3 is defined by PWM23_S[2:0] and this + * field is combined by CLKSEL2[9] and CLKSEL1[31:30]. + * + * 000 = Clock source from external 4~24 MHz high speed crystal clock. + * 010 = Clock source from HCLK. + * 011 = Clock source from internal 22.1184 MHz high speed oscillator clock. + * 111 = Clock source from internal 10 kHz low speed oscillator clock. + * + * + * WWDT_S [16:17] + * Windowed-Watchdog Timer Clock Source Selection (Write-protection Bits) + * + * 10 = Clock source from HCLK/2048 clock. + * 11 = Clock source from internal 10 kHz low speed oscillator clock. + * + * + * NOTE: Before clock switching, the related clock sources (pre-select and new-select) + * must be turned on. + * + */ + +#define CLK_CLKSEL2_I2S_S_Pos 0 +#define CLK_CLKSEL2_I2S_S_Msk (0b011ul << CLK_CLKSEL2_I2S_S_Pos) +#define CLK_CLKSEL2_FRQDIV_S_Pos 2 +#define CLK_CLKSEL2_FRQDIV_S_Msk (0b011ul << CLK_CLKSEL2_FRQDIV_S_Pos) +// Bits 4-7 are Reserved. +#define CLK_CLKSEL2_PWM01_S_Pos 8 +#define CLK_CLKSEL2_PWM01_S_Msk (0b01ul << CLK_CLKSEL2_PWM01_S_Pos) +#define CLK_CLKSEL2_PWM23_S_Pos 9 +#define CLK_CLKSEL2_PWM23_S_Msk (0b01ul << CLK_CLKSEL2_PWM23_S_Pos) +// Bits 10-15 are Reserved. +#define CLK_CLKSEL2_WWDT_S_Pos 16 +#define CLK_CLKSEL2_WWDT_S_Msk (0b011ul << CLK_CLKSEL2_WWDT_S_Pos) +// Bits 18-31 are Reserved. + + +/** + * @brief Clock Controller (CLK) - Register CLKDIV + * + * @description Clock Divider Register (CLKDIV) bit defines + * + * See NUC123 Technical Reference Manual 5.4.8 Register Description, page 122 + * + * CLKDIV = CLK_BA+0x18 + * + * + * HCLK_N [0:3] + * HCLK Clock Divide Number from HCLK Clock Source + * + * HCLK clock frequency = (HCLK clock source frequency) / (HCLK_N + 1) + * + * + * USB_N [4:7] + * USB Clock Divide Number from PLL Clock + * + * USB clock frequency = (PLL frequency ) / (USB_N + 1) + * + * + * UART_N [8:11] + * UART Clock Divide Number from UART Clock Source + * + * UART clock frequency = (UART clock source frequency ) / (UART_N + 1) + * + * + * ADC_N [16:23] + * ADC Clock Divide Number from ADC Clock Source + * + * ADC clock frequency = (ADC clock source frequency ) / (ADC_N + 1) + * + */ + +#define CLK_CLKDIV_HCLK_N_Pos 0 +#define CLK_CLKDIV_HCLK_N_Msk (0x0Ful << CLK_CLKDIV_HCLK_N_Pos) +#define CLK_CLKDIV_USB_N_Pos 4 +#define CLK_CLKDIV_USB_N_Msk (0x0Ful << CLK_CLKDIV_USB_N_Pos) +#define CLK_CLKDIV_UART_N_Pos 8 +#define CLK_CLKDIV_UART_N_Msk (0x0Ful << CLK_CLKDIV_UART_N_Pos) +// Bits 12-15 are Reserved. +#define CLK_CLKDIV_ADC_N_Pos 16 +#define CLK_CLKDIV_ADC_N_Msk (0xFFul << CLK_CLKDIV_ADC_N_Pos) +// Bits 24-31 are Reserved. + + +/** + * @brief Clock Controller (CLK) - Register PLLCON + * + * @description PLL Control Register (PLLCON) bit defines + * + * See NUC123 Technical Reference Manual 5.4.8 Register Description, page 123-124 + * + * PLLCON = CLK_BA+0x18 + * + * + * FB_DV [0:8] + * PLL Feedback Divider Control Pins + * + * See formulas on NUC123 Technical Reference Manual, page 124 + * + * + * IN_DV [9:13] + * PLL Input Divider Control Pins + * + * See formulas on NUC123 Technical Reference Manual, page 124 + * + * + * OUT_DV [14:15] + * PLL Output Divider Control Pins + * + * See formulas on NUC123 Technical Reference Manual, page 124 + * + * OUT_DV = "00" : NO = 1 + * OUT_DV = "01" : NO = 2 + * OUT_DV = "10" : NO = 2 + * OUT_DV = "11" : NO = 4 + * + * + * PD [16] + * Power-down Mode + * + * If the PWR_DOWN_EN bit set to 1 in PWRCON register, the PLL will also enter + * Power-down mode. + * + * 0 = PLL is in Normal mode. + * 1 = PLL is in Power-down mode (default). + * + * + * BP [17] + * PLL Bypass Control + * + * 0 = PLL is in Normal mode (default). + * 1 = PLL clock output is the same as clock input (XTALin). + * + * + * OE [18] + * PLL OE (FOUT Enable) Pin Control + * + * 0 = PLL FOUT Enabled. + * 1 = PLL FOUT is fixed low. + * + * + * PLL_SRC [19] + * PLL Source Clock Selection + * + * 1 = PLL source clock from internal 22.1184 MHz high speed oscillator. + * 0 = PLL source clock from external 4~24 MHz high speed crystal. + * + */ + +#define CLK_PLLCON_FB_DV_Pos 0 +#define CLK_PLLCON_FB_DV_Msk (0x1FFul << CLK_PLLCON_FB_DV_Pos) +#define CLK_PLLCON_IN_DV_Pos 9 +#define CLK_PLLCON_IN_DV_Msk (0x01Ful << CLK_PLLCON_IN_DV_Pos) +#define CLK_PLLCON_OUT_DV_Pos 14 +#define CLK_PLLCON_OUT_DV_Msk (0x03ul << CLK_PLLCON_OUT_DV_Pos) +#define CLK_PLLCON_PD_Pos 16 +#define CLK_PLLCON_PD_Msk (0x01ul << CLK_PLLCON_PD_Pos) +#define CLK_PLLCON_BP_Pos 17 +#define CLK_PLLCON_BP_Msk (0x01ul << CLK_PLLCON_BP_Pos) +#define CLK_PLLCON_OE_Pos 18 +#define CLK_PLLCON_OE_Msk (0x01ul << CLK_PLLCON_OE_Pos) +#define CLK_PLLCON_PLL_SRC_Pos 19 +#define CLK_PLLCON_PLL_SRC_Msk (0x01ul << CLK_PLLCON_PLL_SRC_Pos) +// Bits 20-31 are Reserved. + + +/** + * @brief Clock Controller (CLK) - Register FRQDIV + * + * @description Frequency Divider Control Register (FRQDIV) bit defines + * + * See NUC123 Technical Reference Manual 5.4.8 Register Description, page 125 + * + * FRQDIV = CLK_BA+0x24 + * + * + * FSEL [0:3] + * Divider Output Frequency Select Bits + * + * The formula of output frequency is: + * + * Fout = Fin / 2 (N+1) + * Fin is the input clock frequency. + * Fout is the frequency of divider output clock. + * N is the 4-bit value of FSEL[3:0]. + * + * + * DIVIDER_EN [4] + * Frequency Divider Enable Bit + * + * 0 = Frequency Divider Disabled. + * 1 = Frequency Divider Enabled. + * + */ + +#define CLK_FRQDIV_FSEL_Pos 0 +#define CLK_FRQDIV_FSEL_Msk (0x0Ful << CLK_FRQDIV_FSEL_Pos) +#define CLK_FRQDIV_DIVIDER_EN_Pos 4 +#define CLK_FRQDIV_DIVIDER_EN_Msk (0x01ul << CLK_FRQDIV_DIVIDER_EN_Pos) +// Bits 5-31 are Reserved. + + +/** + * @brief Clock Controller (CLK) - Register APBDIV + * + * @description APB Divider Control Register (APBDIV) bit defines + * + * See NUC123 Technical Reference Manual 5.4.8 Register Description, page 125 + * + * APBDIV = CLK_BA+0x24 + * + * + * APBDIV [0] + * APB Divider Enable Bit + * + * 0: PCLK = HCLK + * 1: PCLK = HCLK / 2 + * + */ + +#define CLK_APBDIV_APBDIV_Pos 0 +#define CLK_APBDIV_APBDIV_Msk (0x01ul << CLK_APBDIV_APBDIV_Pos) +// Bits 1-31 are Reserved. + + + +/* =========================================================================================================================== */ +/* ================ System Manager Control ================ */ +/* =========================================================================================================================== */ + +/** + * @brief System Manager Control (GCR) + * + * @description See NUC123 Technical Reference Manual 5.3.4 System Manager Control Registers, page 57 + * + * GCR_BA = 0x5000_0000 + * + * Struct has large sections of reserved space (RESERVED) for other NUC123 Family silicon + * + */ + +typedef struct { + + __I uint32_t PDID; // GCR_BA+0x00 Part Device Identification Number Register + __IO uint32_t RSTSRC; // GCR_BA+0x04 System Reset Source Register + __IO uint32_t IPRSTC1; // GCR_BA+0x08 Peripheral Reset Control Register 1 + __IO uint32_t IPRSTC2; // GCR_BA+0x0C Peripheral Reset Control Register 2 + __I uint32_t RESERVED0[2]; + __IO uint32_t BODCR; // GCR_BA+0x18 Brown-out Detector Control Register + __I uint32_t RESERVED1[2]; + __IO uint32_t PORCR; // GCR_BA+0x24 Power-on-Reset Controller Register + __I uint32_t RESERVED2[2]; + __IO uint32_t GPA_MFP; // GCR_BA+0x30 GPIOA Multiple Function and Input Type Control Register + __IO uint32_t GPB_MFP; // GCR_BA+0x34 GPIOB Multiple Function and Input Type Control Register + __IO uint32_t GPC_MFP; // GCR_BA+0x38 GPIOC Multiple Function and Input Type Control Register + __IO uint32_t GPD_MFP; // GCR_BA+0x3C GPIOD Multiple Function and Input Type Control Register + __I uint32_t RESERVED3; + __IO uint32_t GPF_MFP; // GCR_BA+0x44 GPIOF Multiple Function and Input Type Control Register + __I uint32_t RESERVED4[2]; + __IO uint32_t ALT_MFP; // GCR_BA+0x50 Alternative Multiple Function Pin Control Register + __IO uint32_t ALT_MFP1; // GCR_BA+0x54 Alternative Multiple Function Pin Control Register 1 + __I uint32_t RESERVED5[26]; + __IO uint32_t GPA_IOCR; // GCR_BA+0xC0 GPIOA IO Control Register + __IO uint32_t GPB_IOCR; // GCR_BA+0xC4 GPIOB IO Control Register + __I uint32_t RESERVED6; + __IO uint32_t GPD_IOCR; // GCR_BA+0xCC GPIOD IO Control Register + __I uint32_t RESERVED7[12]; + __IO uint32_t REGWRPROT; // GCR_BA+0x100 Register Write Protect Register + +} GCR_T; + + +/** + * @brief System Manager Controller (SYS) - Register PDID + * + * @description Part Device ID Code Register (PDID) bit defines + * + * See NUC123 Technical Reference Manual 5.3.4 Register Description, page 58 + * + * Part Device Identification Number + * This register reflects the device part number code. S/W can read this register to identify + * which device is used. + * + * PART NUMBER | PACKAGE | FLASH | SRAM | PDID + * ==============|===========|=========|========|============= + * NUC123ZD4AN0 | QFN-33 | 68 | 20 | 0x0001_2355 + * NUC123ZC2AN1 | QFN-33 | 36 | 12 | 0x0001_2345 + * NUC123LD4AN0 | LQFP-48 | 68 | 20 | 0x0001_2335 + * NUC123LC2AN1 | LQFP-48 | 36 | 12 | 0x0001_2325 + * NUC123SD4AN0 | LQFP-64 | 68 | 20 | 0x0001_2315 + * NUC123SC2AN1 | LQFP-64 | 36 | 12 | 0x0001_2305 + * + */ + +#define SYS_PDID_PN_Pos 0 +#define SYS_PDID_PN_Msk (0xFFFFFFFFFFFFFFFFul << SYS_PDID_PN_Pos) + + +/** + * @brief System Manager Controller (SYS) - Register RSTSRC + * + * @description System Reset Source Register (RSTSRC) bit defines + * + * See NUC123 Technical Reference Manual 5.3.4 Register Description, page 59-60 + * + * + * RSTS_POR [0] + * The RSTS_POR flag is set by the "reset signal" from the Power-On Reset (POR) + * controller or bit CHIP_RST (IPRSTC1[0]) to indicate the previous reset source. + * + * 1 = Power-On Reset (POR) or CHIP_RST had issued the reset signal to reset the + * system. + * 0 = No reset from POR or CHIP_RST + * + * RSTS_RESET [1] + * The RSTS_RESET flag is set by the "reset signal" from the /RESET pin to indicate the + * previous reset source. + * + * 1 = Pin /RESET had issued the reset signal to reset the system. + * 0 = No reset from /RESET pin + * + * RSTS_WDT [2] + * The RSTS_WDT flag is set by the "reset signal" from the watchdog timer to indicate the + * previous reset source. + * + * 1 = Watchdog timer had issued the reset signal to reset the system. + * 0 = No reset from watchdog timer + * + * RSTS_LVR [3] + * The RSTS_LVR flag is set by the "reset signal" from the Low-Voltage-Reset controller + * to indicate the previous reset source. + * + * 1 = LVR controller had issued the reset signal to reset the system. + * 0 = No reset from LVR + * + * RSTS_BOD [4] + * The RSTS_BOD flag is set by the "reset signal" from the Brown-out-Detector to + * indicate the previous reset source. + * + * 1 = BOD had issued the reset signal to reset the system + * 0 = No reset from BOD + * + * RSTS_SYS [5] + * The RSTS_SYS flag is set by the "reset signal" from the Cortex_M0 kernel to indicate + * the previous reset source. + * + * 1 = Cortex_M0 had issued the reset signal to reset the system by software writing 1 to + * bit SYSRESETREQ(AIRCR[2], Application Interrupt and Reset Control Register, + * address = 0xE000ED0C) in system control registers of Cortex_M0 kernel. + * 0 = No reset from Cortex_M0 + * + * RSTS_CPU [7] + * The RSTS_CPU flag is set by hardware if software writes CPU_RST (IPRSTC1[1]) 1 to + * reset Cortex-M0 CPU kernel and Flash memory controller (FMC). + * + * 1 = Cortex-M0 CPU kernel and FMC are reset by software setting CPU_RST to 1. + * 0 = No reset from CPU + * + * + * Software can write 1 to any bit to clear to zero. + * + */ + +#define SYS_RSTSRC_RSTS_POR_Pos 0 +#define SYS_RSTSRC_RSTS_POR_Msk (0x01ul << SYS_RSTSRC_RSTS_POR_Pos) +#define SYS_RSTSRC_RSTS_RESET_Pos 1 +#define SYS_RSTSRC_RSTS_RESET_Msk (0x01ul << SYS_RSTSRC_RSTS_RESET_Pos) +#define SYS_RSTSRC_RSTS_WDT_Pos 2 +#define SYS_RSTSRC_RSTS_WDT_Msk (0x01ul << SYS_RSTSRC_RSTS_WDT_Pos) +#define SYS_RSTSRC_RSTS_LVR_Pos 3 +#define SYS_RSTSRC_RSTS_LVR_Msk (0x01ul << SYS_RSTSRC_RSTS_LVR_Pos) +#define SYS_RSTSRC_RSTS_BOD_Pos 4 +#define SYS_RSTSRC_RSTS_BOD_Msk (0x01ul << SYS_RSTSRC_RSTS_BOD_Pos) +#define SYS_RSTSRC_RSTS_SYS_Pos 5 +#define SYS_RSTSRC_RSTS_SYS_Msk (0x01ul << SYS_RSTSRC_RSTS_SYS_Pos) +// Bit 6 is Reserved. +#define SYS_RSTSRC_RSTS_CPU_Pos 7 +#define SYS_RSTSRC_RSTS_CPU_Msk (0x01ul << SYS_RSTSRC_RSTS_CPU_Pos) +// Bits 8-31 are Reserved. + + +/** + * @brief System Manager Controller (SYS) - Register IPRSTC1 + * + * @description Peripheral Reset Control Register1 (IPRSTC1) bit defines + * + * See NUC123 Technical Reference Manual 5.3.4 Register Description, page 61-62 + * + * + * These bits are protected bits, which means programming them requires writing to "59h", "16h", + * and "88h" to address 0x5000_0100 to disable register protection. + * + * Refer to the register REGWRPROT at address GCR_BA+0x100 (See below) + * + * + * CHIP One-shot Reset (Write-protection Bit) + * Setting this bit will reset the whole chip, including CPU kernel and all peripherals, and + * this bit will automatically return to 0 after the 2 clock cycles. + * + * The CHIP_RST is same as the POR reset, all the chip controllers is reset and the chip + * setting from flash are also reload. + * + * 1 = CHIP one-shot reset. + * 0 = CHIP normal operation. + * + * + * CPU kernel one-shot reset (Write-protection Bit) + * Setting this bit will only reset the CPU kernel and Flash Memory Controller(FMC), and + * this bit will automatically return to 0 after the 2 clock cycles + * + * 1 = CPU one-shot reset. + * 0 = CPU normal operation. + * + * + * PDMA Controller Reset (Write-protection Bit) + * Setting this bit to 1 will generate a reset signal to the PDMA. User need to set this bit to + * 0 to release from reset state. + * + * 1 = PDMA controller reset. + * 0 = PDMA controller normal operation. + * + */ + +#define SYS_IPRSTC1_CHIP_RST_Pos 0 +#define SYS_IPRSTC1_CHIP_RST_Msk (0x01ul << SYS_IPRSTC1_CHIP_RST_Pos) +#define SYS_IPRSTC1_CPU_RST_Pos 1 +#define SYS_IPRSTC1_CPU_RST_Msk (0x01ul << SYS_IPRSTC1_CPU_RST_Pos) +#define SYS_IPRSTC1_PDMA_RST_Pos 2 +#define SYS_IPRSTC1_PDMA_RST_Msk (0x01ul << SYS_IPRSTC1_PDMA_RST_Pos) +// Bits 3-31 are Reserved. + + +/** + * @brief System Manager Controller (SYS) - Register IPRSTC2 + * + * @description Peripheral Reset Control Register2 (IPRSTC2) bit defines + * + * See NUC123 Technical Reference Manual 5.3.4 Register Description, page 63-65 + * + * + * GPIO controller Reset + * 1 = GPIO controller reset + * 0 = GPIO controller normal operation + * + * Timer0 controller Reset + * 1 = Timer0 controller reset + * 0 = Timer0 controller normal operation + * + * Timer1 controller Reset + * 1 = Timer1 controller reset + * 0 = Timer1 controller normal operation + * + * Timer2 controller Reset + * 1 = Timer2 controller reset + * 0 = Timer2 controller normal operation + * + * Timer3 controller Reset + * 1 = Timer3 controller reset + * 0 = Timer3 controller normal operation + * + * I2C0 controller Reset + * 1 = I2C0 controller reset + * 0 = I2C0 controller normal operation + * + * I2C1 controller Reset + * 1 = I2C1 controller reset + * 0 = I2C1 controller normal operation + * + * SPI0 controller Reset + * 1 = SPI0 controller reset + * 0 = SPI0 controller normal operation + * + * SPI1 controller Reset + * 1 = SPI1 controller reset + * 0 = SPI1 controller normal operation + * + * SPI2 controller Reset + * 1 = SPI2 controller reset + * 0 = SPI2 controller normal operation + * + * UART0 controller Reset + * 1 = UART0 controller reset + * 0 = UART0 controller normal operation + * + * UART1 controller Reset + * 1 = UART1 controller reset + * 0 = UART1 controller normal operation + * + * USB Device controller Reset + * 1 = USB Device controller reset + * 0 = USB Device controller normal operation + * + * ADC controller Reset + * 1 = ADC controller reset + * 0 = ADC controller normal operation + * + * I2S controller Reset + * 1 = I2S controller reset + * 0 = I2S controller normal operation + * + */ + +// Bit 0 is Reserved. +#define SYS_IPRSTC2_GPIO_RST_Pos 1 +#define SYS_IPRSTC2_GPIO_RST_Msk (0x01ul << SYS_IPRSTC2_GPIO_RST_Pos) +#define SYS_IPRSTC2_TMR0_RST_Pos 2 +#define SYS_IPRSTC2_TMR0_RST_Msk (0x01ul << SYS_IPRSTC2_TMR0_RST_Pos) +#define SYS_IPRSTC2_TMR1_RST_Pos 3 +#define SYS_IPRSTC2_TMR1_RST_Msk (0x01ul << SYS_IPRSTC2_TMR1_RST_Pos) +#define SYS_IPRSTC2_TMR2_RST_Pos 4 +#define SYS_IPRSTC2_TMR2_RST_Msk (0x01ul << SYS_IPRSTC2_TMR2_RST_Pos) +#define SYS_IPRSTC2_TMR3_RST_Pos 5 +#define SYS_IPRSTC2_TMR3_RST_Msk (0x01ul << SYS_IPRSTC2_TMR3_RST_Pos) +// Bits 6-7 are Reserved. +#define SYS_IPRSTC2_I2C0_RST_Pos 8 +#define SYS_IPRSTC2_I2C0_RST_Msk (0x01ul << SYS_IPRSTC2_I2C0_RST_Pos) +#define SYS_IPRSTC2_I2C1_RST_Pos 9 +#define SYS_IPRSTC2_I2C1_RST_Msk (0x01ul << SYS_IPRSTC2_I2C1_RST_Pos) +// Bits 10-11 are Reserved. +#define SYS_IPRSTC2_SPI0_RST_Pos 12 +#define SYS_IPRSTC2_SPI0_RST_Msk (0x01ul << SYS_IPRSTC2_SPI0_RST_Pos) +#define SYS_IPRSTC2_SPI1_RST_Pos 13 +#define SYS_IPRSTC2_SPI1_RST_Msk (0x01ul << SYS_IPRSTC2_SPI1_RST_Pos) +#define SYS_IPRSTC2_SPI2_RST_Pos 14 +#define SYS_IPRSTC2_SPI2_RST_Msk (0x01ul << SYS_IPRSTC2_SPI2_RST_Pos) +// Bit 15 is Reserved. +#define SYS_IPRSTC2_UART0_RST_Pos 16 +#define SYS_IPRSTC2_UART0_RST_Msk (0x01ul << SYS_IPRSTC2_UART0_RST_Pos) +#define SYS_IPRSTC2_UART1_RST_Pos 17 +#define SYS_IPRSTC2_UART1_RST_Msk (0x01ul << SYS_IPRSTC2_UART1_RST_Pos) +// Bits 18-19 are Reserved. +#define SYS_IPRSTC2_PWM03_RST_Pos 20 +#define SYS_IPRSTC2_PWM03_RST_Msk (0x01ul << SYS_IPRSTC2_PWM03_RST_Pos) +// Bits 21-22 are Reserved. +#define SYS_IPRSTC2_PS2_RST_Pos 23 +#define SYS_IPRSTC2_PS2_RST_Msk (0x01ul << SYS_IPRSTC2_PS2_RST_Pos) +// Bits 24-26 are Reserved. +#define SYS_IPRSTC2_USBD_RST_Pos 27 +#define SYS_IPRSTC2_USBD_RST_Msk (0x01ul << SYS_IPRSTC2_USBD_RST_Pos) +#define SYS_IPRSTC2_ADC_RST_Pos 28 +#define SYS_IPRSTC2_ADC_RST_Msk (0x01ul << SYS_IPRSTC2_ADC_RST_Pos) +#define SYS_IPRSTC2_I2S_RST_Pos 29 +#define SYS_IPRSTC2_I2S_RST_Msk (0x01ul << SYS_IPRSTC2_I2S_RST_Pos) +// Bits 30-31 are Reserved. + + +/** + * @brief System Manager Controller (SYS) - Register BODCR + * + * @description Peripheral Brown-out Detector Control Register (BODCR) bit defines + * + * See NUC123 Technical Reference Manual 5.3.4 Register Description, page 66-68 + * + * Part of the BODCR control registers bits are initiated by the flash configuration and part of the + * bits are write-protected. Programming write-protected bits needs to write "59h", "16h", "88h" to + * address 0x5000_0100 to disable register protection. + * Refer to the register REGWRPROT at address GCR_BA+0x100. + * + * BODCR = GCR_BA+0x18 + * + * + * BOD_EN [0] + * Brown-out Detector Enable (Write-protection Bit) + * + * The default value is set by flash controller user configuration register config0 bit[23]. + * + * 1 = Brown-out Detector function Enabled. + * 0 = Brown-out Detector function Disabled. + * + * This bit is a protected bit. + * + * + * BOD_VL [1:2] + * Brown-out Detector Threshold Voltage Selection (Write-protection Bits) + * + * The default value is set by flash controller user configuration register config0 bit[22:21] + * + * BOV_VL[1] | BOV_VL[0] | Brown-out Voltage + * ===========|============|===================== + * 1 | 1 | 4.5 V + * 1 | 0 | 3.8 V + * 0 | 1 | 2.7 V + * 0 | 0 | 2.2 V + * + * + * BOD_RSTEN [3] + * Brown-out Reset Enable (Write-protection Bit) + * + * 1 = Brown-out "RESET" function Enabled. + * While the Brown-out Detector function is enabled (BOD_EN high) and BOD reset + * function is enabled (BOD_RSTEN high), BOD will assert a signal to reset chip when + * the detected voltage is lower than the threshold (BOD_OUT high). + * 0 = Brown-out "INTERRUPT" function Enabled. + * While the BOD function is enabled (BOD_EN high) and BOD interrupt function is + * enabled (BOD_RSTEN low), BOD will assert an interrupt if BOD_OUT is high. BOD + * interrupt will keep till to the BOD_EN set to 0. BOD interrupt can be blocked by + * disabling the NVIC BOD interrupt or disabling BOD function (set BOD_EN low). + * + * The default value is set by flash controller user configuration register config0 bit[20]. + * + * + * BOD_INTF [4] + * Brown-out Detector Interrupt Flag + * + * 1 = When Brown-out Detector detects the VDD is dropped down through the voltage of + * BOD_VL setting or the VDD is raised up through the voltage of BOD_VL setting, this + * bit is set to 1 and the Brown-out interrupt is requested if Brown-out interrupt is enabled. + * 0 = Brown-out Detector does not detect any voltage draft at VDD down through or up + * through the voltage of BOD_VL setting. + * + * Software can write 1 to clear this bit to zero. + * + * + * BOD_LPM [5] + * Brown-out Detector Low power Mode (Write-protection Bit) + * + * 1 = BOD low power mode Enabled. + * 0 = BOD operated in Normal mode (Default). + * + * The BOD consumes about 100 uA in Normal mode, the low power mode can reduce + * the current to about 1/10 but will slow the BOD response. + * + * + * BOD_OUT [6] + * Brown-out Detector Output Status + * + * 1 = Brown-out Detector output status is 1, which means the detected voltage is lower + * than BOD_VL setting. If the BOD_EN is 0, BOD function disabled , this bit always + * responds to 0 + * 0 = Brown-out Detector output status is 0, which means the detected voltage is higher + * than BOD_VL setting or BOD_EN is 0. + * + * + * LVR_EN [7] + * Low Voltage Reset Enable (Write-protection Bit) + * + * The LVR function reset the chip when the input power voltage is lower than LVR circuit + * setting. LVR function is enabled by default. + * + * 1 = Low Voltage Reset function Enabled– After enabling the bit, the LVR function will + * be active with 100uS delay for LVR output stable (Default). + * 0 = Low Voltage Reset function Disabled. + * + * + */ + +#define SYS_BODCR_BOD_EN_Pos 0 +#define SYS_BODCR_BOD_EN_Msk (0x01ul << SYS_BODCR_BOD_EN_Pos) +#define SYS_BODCR_BOD_VL_Pos 1 +#define SYS_BODCR_BOD_VL_Msk (0x03ul << SYS_BODCR_BOD_VL_Pos) +#define SYS_BODCR_BOD_RSTEN_Pos 3 +#define SYS_BODCR_BOD_RSTEN_Msk (0x01ul << SYS_BODCR_BOD_RSTEN_Pos) +#define SYS_BODCR_BOD_INTF_Pos 4 +#define SYS_BODCR_BOD_INTF_Msk (0x01ul << SYS_BODCR_BOD_INTF_Pos) +#define SYS_BODCR_BOD_LPM_Pos 5 +#define SYS_BODCR_BOD_LPM_Msk (0x01ul << SYS_BODCR_BOD_LPM_Pos) +#define SYS_BODCR_BOD_OUT_Pos 6 +#define SYS_BODCR_BOD_OUT_Msk (0x01ul << SYS_BODCR_BOD_OUT_Pos) +#define SYS_BODCR_LVR_EN_Pos 7 +#define SYS_BODCR_LVR_EN_Msk (0x01ul << SYS_BODCR_LVR_EN_Pos) +// Bits 8-31 are Reserved. + + +/** + * @brief System Manager Controller (SYS) - Register PORCR + * + * @description Peripheral Power-On-Reset Control Register (PORCR) bit defines + * + * See NUC123 Technical Reference Manual 5.3.4 Register Description, page 69 + * + * PORCR = GCR_BA+0x24 + * + * POR_DIS_CODE [0:15] + * This register is used for the Power-On-Reset enable control (Write-protection Bits) + * + * When powered on, the POR circuit generates a reset signal to reset the whole chip + * function, but noise on the power may cause the POR active again. User can disable + * internal POR circuit to avoid unpredictable noise to cause chip reset by writing 0x5AA5 + * to this field. + * + * The POR function will become active again when this field is set to another value or + * chip is reset by other reset source, including: + * /RESET, Watchdog, LVR reset, BOD reset, ICE reset command and the software-chip + * reset function + * + * This bit is a protected bit, which means programming it needs to write "59h", "16h", + * "88h" to address 0x5000_0100 to disable register protection. + * + * Refer to the register REGWRPROT at address GCR_BA+0x100. + * + */ + +#define SYS_PORCR_POR_DIS_CODE_Pos 0 +#define SYS_PORCR_POR_DIS_CODE_Msk (0xFFFFul << SYS_PORCR_POR_DIS_CODE_Pos) +// Bits 16-31 are Reserved. + + +/** + * @brief System Manager Controller (SYS) - Register GPA_MFP + * + * @description Peripheral Multi Function Pin GPIOA Control Register (GPA_MFP) bit defines + * + * See NUC123 Technical Reference Manual 5.3.4 Register Description, page 70-71 + * + * GPA_MFP GCR_BA+0x30 + * + */ + +#define SYS_GPA_MFP_GPA_MFP_Pos 0 +#define SYS_GPA_MFP_GPA_MFP_Msk (0xFFFFul << SYS_GPA_MFP_GPA_MFP_Pos) +#define SYS_GPA_MFP_GPA_TYPE_Pos 16 +#define SYS_GPA_MFP_GPA_TYPE_Msk (0xFFFFul << SYS_GPA_MFP_GPA_TYPE_Pos) + +// Available Alternate Function Pins +#define GPA_MFP10 10 +#define GPA_MFP11 11 +#define GPA_MFP12 12 +#define GPA_MFP13 13 +#define GPA_MFP14 14 +#define GPA_MFP15 15 + + +/** + * @brief System Manager Controller (SYS) - Register GPB_MFP + * + * @description Peripheral Multi Function Pin GPIOB Control Register (GPB_MFP) bit defines + * + * See NUC123 Technical Reference Manual 5.3.4 Register Description, page 72-75 + * + * GPB_MFP GCR_BA+0x34 + * + */ + +#define SYS_GPB_MFP_GPB_MFP_Pos 0 +#define SYS_GPB_MFP_GPB_MFP_Msk (0xFFFFul << SYS_GPB_MFP_GPB_MFP_Pos) +#define SYS_GPB_MFP_GPB_TYPE_Pos 16 +#define SYS_GPB_MFP_GPB_TYPE_Msk (0xFFFFul << SYS_GPB_MFP_GPB_TYPE_Pos) + +// Available Alternate Function Pins +#define GPB_MFP0 0 +#define GPB_MFP1 1 +#define GPB_MFP2 2 +#define GPB_MFP3 3 +#define GPB_MFP4 4 +#define GPB_MFP5 5 +#define GPB_MFP6 6 +#define GPB_MFP7 7 +#define GPB_MFP8 8 +#define GPB_MFP9 9 +#define GPB_MFP10 10 +#define GPB_MFP12 12 +#define GPB_MFP13 13 +#define GPB_MFP14 14 +#define GPB_MFP15 15 + + +/** + * @brief System Manager Controller (SYS) - Register GPC_MFP + * + * @description Peripheral Multi Function Pin GPIOC Control Register (GPC_MFP) bit defines + * + * See NUC123 Technical Reference Manual 5.3.4 Register Description, page 76-78 + * + * GPC_MFP GCR_BA+0x38 + * + */ + +#define SYS_GPC_MFP_GPC_MFP_Pos 0 +#define SYS_GPC_MFP_GPC_MFP_Msk (0xFFFFul << SYS_GPC_MFP_GPC_MFP_Pos) +#define SYS_GPC_MFP_GPC_TYPE_Pos 16 +#define SYS_GPC_MFP_GPC_TYPE_Msk (0xFFFFul << SYS_GPC_MFP_GPC_TYPE_Pos) + +// Available Alternate Function Pins +#define GPC_MFP0 0 +#define GPC_MFP1 1 +#define GPC_MFP2 2 +#define GPC_MFP3 3 +#define GPC_MFP4 4 +#define GPC_MFP5 5 +#define GPC_MFP8 8 +#define GPC_MFP9 9 +#define GPC_MFP10 10 +#define GPC_MFP11 11 +#define GPC_MFP12 12 +#define GPC_MFP13 13 + + +/** + * @brief System Manager Controller (SYS) - Register GPD_MFP + * + * @description Peripheral Multi Function Pin GPIOD Control Register (GPD_MFP) bit defines + * + * See NUC123 Technical Reference Manual 5.3.4 Register Description, page 79-81 + * + * GPD_MFP GCR_BA+0x3C + * + */ + +#define SYS_GPD_MFP_GPD_MFP_Pos 0 +#define SYS_GPD_MFP_GPD_MFP_Msk (0xFFFFul << SYS_GPD_MFP_GPD_MFP_Pos) +#define SYS_GPD_MFP_GPD_TYPE_Pos 16 +#define SYS_GPD_MFP_GPD_TYPE_Msk (0xFFFFul << SYS_GPD_MFP_GPD_TYPE_Pos) + +// Available Alternate Function Pins +#define GPD_MFP0 0 +#define GPD_MFP1 1 +#define GPD_MFP2 2 +#define GPD_MFP3 3 +#define GPD_MFP4 4 +#define GPD_MFP5 5 +#define GPD_MFP8 8 +#define GPD_MFP9 9 +#define GPD_MFP10 10 +#define GPD_MFP11 11 + + +/** + * @brief System Manager Controller (SYS) - Register GPF_MFP + * + * @description Peripheral Multi Function Pin GPIOF Control Register (GPF_MFP) bit defines + * + * See NUC123 Technical Reference Manual 5.3.4 Register Description, page 82-83 + * + * GPF_MFP GCR_BA+0x44 + * + */ + +#define SYS_GPF_MFP_GPF_MFP0_Pos 0 +#define SYS_GPF_MFP_GPF_MFP0_Msk (0x01ul << SYS_GPF_MFP_GPF_MFP0_Pos) +#define SYS_GPF_MFP_GPF_MFP1_Pos 1 +#define SYS_GPF_MFP_GPF_MFP1_Msk (0x01ul << SYS_GPF_MFP_GPF_MFP1_Pos) +#define SYS_GPF_MFP_GPF_MFP2_Pos 2 +#define SYS_GPF_MFP_GPF_MFP2_Msk (0x01ul << SYS_GPF_MFP_GPF_MFP2_Pos) +#define SYS_GPF_MFP_GPF_MFP3_Pos 3 +#define SYS_GPF_MFP_GPF_MFP3_Msk (0x01ul << SYS_GPF_MFP_GPF_MFP3_Pos) +// Bits 4 to 15 are Reserved. +#define SYS_GPF_MFP_GPF_TYPE_Pos 16 +#define SYS_GPF_MFP_GPF_TYPE_Msk (0xFul << SYS_GPF_MFP_GPF_TYPE_Pos) +// Bits 20 to 31 are Reserved. + +// Available Alternate Function Pins +#define GPF_MFP0 0 +#define GPF_MFP1 1 +#define GPF_MFP2 2 +#define GPF_MFP3 3 + + +/** + * @brief System Manager Controller (SYS) - Register ALT_MFP + * + * @description Peripheral Alternate Multi Function Pin Control Register (ALT_MFP) bit defines + * + * See NUC123 Technical Reference Manual 5.3.4 Register Description, page 84-89 + * + * ALT_MFP GCR_BA+0x50 + * + */ + +#define SYS_ALT_MFP_PB10_MFP1_Pos 0 +#define SYS_ALT_MFP_PB10_MFP1_Msk (0x01ul << SYS_ALT_MFP_PB10_MFP1_Pos) +#define SYS_ALT_MFP_PB9_MFP1_Pos 1 +#define SYS_ALT_MFP_PB9_MFP1_Msk (0x01ul << SYS_ALT_MFP_PB9_MFP1_Pos) +// Bits 2-4 are Reserved. +#define SYS_ALT_MFP_PC0_MFP1_Pos 5 +#define SYS_ALT_MFP_PC0_MFP1_Msk (0x01ul << SYS_ALT_MFP_PC0_MFP1_Pos) +#define SYS_ALT_MFP_PC1_MFP1_Pos 6 +#define SYS_ALT_MFP_PC1_MFP1_Msk (0x01ul << SYS_ALT_MFP_PC1_MFP1_Pos) +#define SYS_ALT_MFP_PC2_MFP1_Pos 7 +#define SYS_ALT_MFP_PC2_MFP1_Msk (0x01ul << SYS_ALT_MFP_PC2_MFP1_Pos) +#define SYS_ALT_MFP_PC3_MFP1_Pos 8 +#define SYS_ALT_MFP_PC3_MFP1_Msk (0x01ul << SYS_ALT_MFP_PC3_MFP1_Pos) +#define SYS_ALT_MFP_PA15_MFP1_Pos 9 +#define SYS_ALT_MFP_PA15_MFP1_Msk (0x01ul << SYS_ALT_MFP_PA15_MFP1_Pos) +#define SYS_ALT_MFP_PB12_MFP1_Pos 10 +#define SYS_ALT_MFP_PB12_MFP1_Msk (0x01ul << SYS_ALT_MFP_PB12_MFP1_Pos) +#define SYS_ALT_MFP_PA11_MFP1_Pos 11 +#define SYS_ALT_MFP_PA11_MFP1_Msk (0x01ul << SYS_ALT_MFP_PA11_MFP1_Pos) +#define SYS_ALT_MFP_PA10_MFP1_Pos 12 +#define SYS_ALT_MFP_PA10_MFP1_Msk (0x01ul << SYS_ALT_MFP_PA10_MFP1_Pos) +// Bits 13-14 are Reserved. +#define SYS_ALT_MFP_PB4_MFP1_Pos 15 +#define SYS_ALT_MFP_PB4_MFP1_Msk (0x01ul << SYS_ALT_MFP_PB4_MFP1_Pos) +#define SYS_ALT_MFP_PB7_MFP1_Pos 16 +#define SYS_ALT_MFP_PB7_MFP1_Msk (0x01ul << SYS_ALT_MFP_PB7_MFP1_Pos) +#define SYS_ALT_MFP_PB6_MFP1_Pos 17 +#define SYS_ALT_MFP_PB6_MFP1_Msk (0x01ul << SYS_ALT_MFP_PB6_MFP1_Pos) +#define SYS_ALT_MFP_PB5_MFP1_Pos 18 +#define SYS_ALT_MFP_PB5_MFP1_Msk (0x01ul << SYS_ALT_MFP_PB5_MFP1_Pos) +// Bit 19 is Reserved. +#define SYS_ALT_MFP_PC12_MFP1_Pos 20 +#define SYS_ALT_MFP_PC12_MFP1_Msk (0x01ul << SYS_ALT_MFP_PC12_MFP1_Pos) +#define SYS_ALT_MFP_PC13_MFP1_Pos 21 +#define SYS_ALT_MFP_PC13_MFP1_Msk (0x01ul << SYS_ALT_MFP_PC13_MFP1_Pos) +// Bits 22-23 are Reserved. +#define SYS_ALT_MFP_PB15_MFP1_Pos 24 +#define SYS_ALT_MFP_PB15_MFP1_Msk (0x01ul << SYS_ALT_MFP_PB15_MFP1_Pos) +// Bit 25 is Reserved. +#define SYS_ALT_MFP_PB2_MFP1_Pos 26 +#define SYS_ALT_MFP_PB2_MFP1_Msk (0x01ul << SYS_ALT_MFP_PB2_MFP1_Pos) +#define SYS_ALT_MFP_PB3_MFP1_Pos 27 +#define SYS_ALT_MFP_PB3_MFP1_Msk (0x01ul << SYS_ALT_MFP_PB3_MFP1_Pos) +// Bit 28 is Reserved. +#define SYS_ALT_MFP_PC4_MFP1_Pos 29 +#define SYS_ALT_MFP_PC4_MFP1_Msk (0x01ul << SYS_ALT_MFP_PC4_MFP1_Pos) +#define SYS_ALT_MFP_PC5_MFP1_Pos 30 +#define SYS_ALT_MFP_PC5_MFP1_Msk (0x01ul << SYS_ALT_MFP_PC5_MFP1_Pos) +// Bit 31 is Reserved. + + +/** + * @brief System Manager Controller (SYS) - Register ALT_MFP1 + * + * @description Peripheral Alternate Multi Function Pin Control Register1 (ALT_MFP) bit defines + * + * See NUC123 Technical Reference Manual 5.3.4 Register Description, page 90-92 + * + * ALT_MFP1 GCR_BA+0x54 + * + */ + +// Bits 0-15 are Reserved. +#define SYS_ALT_MFP1_PD0_MFP1_Pos 16 +#define SYS_ALT_MFP1_PD0_MFP1_Msk (0x01ul << SYS_ALT_MFP1_PD0_MFP1_Pos) +#define SYS_ALT_MFP1_PD1_MFP1_Pos 17 +#define SYS_ALT_MFP1_PD1_MFP1_Msk (0x01ul << SYS_ALT_MFP1_PD1_MFP1_Pos) +#define SYS_ALT_MFP1_PD2_MFP1_Pos 18 +#define SYS_ALT_MFP1_PD2_MFP1_Msk (0x01ul << SYS_ALT_MFP1_PD2_MFP1_Pos) +#define SYS_ALT_MFP1_PD3_MFP1_Pos 19 +#define SYS_ALT_MFP1_PD3_MFP1_Msk (0x01ul << SYS_ALT_MFP1_PD3_MFP1_Pos) +#define SYS_ALT_MFP1_PD4_MFP1_Pos 20 +#define SYS_ALT_MFP1_PD4_MFP1_Msk (0x01ul << SYS_ALT_MFP1_PD4_MFP1_Pos) +#define SYS_ALT_MFP1_PD5_MFP1_Pos 21 +#define SYS_ALT_MFP1_PD5_MFP1_Msk (0x01ul << SYS_ALT_MFP1_PD5_MFP1_Pos) +// Bit 22 is Reserved. +#define SYS_ALT_MFP1_PC8_MFP1_Pos 23 +#define SYS_ALT_MFP1_PC8_MFP1_Msk (0x01ul << SYS_ALT_MFP1_PC8_MFP1_Pos) +#define SYS_ALT_MFP1_PF2_MFP1_Pos 24 +#define SYS_ALT_MFP1_PF2_MFP1_Msk (0x03ul << SYS_ALT_MFP1_PF2_MFP1_Pos) +// Bit 25 is Reserved. +#define SYS_ALT_MFP1_PF3_MFP1_Pos 26 +#define SYS_ALT_MFP1_PF3_MFP1_Msk (0x03ul << SYS_ALT_MFP1_PF3_MFP1_Pos) +// Bits 27-31 are Reserved. + + +/** + * @brief System Manager Controller (SYS) - Register DFP_CSR + * + * @description Peripheral Dynamic Function Pin Conflict Status Register (DFP_CSR) bit defines + * + * See NUC123 Technical Reference Manual 5.3.4 Register Description, page 93-94 + * + * DFP_CSR GCR_BA+0xA0 + * + * + * DFP0_CST [0] + * Conflict Status of PD.9 + * + * 1 = PD.9 is conflicted. + * 0 = PD.9 worked normally. + * + * DFP1_CST [1] + * Conflict Status of PD.10 + * + * 1 = PD.10 is conflicted. + * 0 = PD.10 worked normally. + * + * DFP2_CST [2] + * Conflict Status of PD.11 + * + * 1 = PD.11 is conflicted. + * 0 = PD.11 worked normally. + * + * DFP3_CST [3] + * Conflict Status of PB.4 + * + * 1 = PB.4 is conflicted. + * 0 = PB.4 worked normally. + * + * DFP4_CST [4] + * Conflict Status of PB.5 + * + * 1 = PB.5 is conflicted. + * 0 = PB.5 worked normally. + * + * DFP5_CST [5] + * Conflict Status of PB.6 + * + * 1 = PB.6 is conflicted. + * 0 = PB.6 worked normally. + * + * DFP6_CST [6] + * Conflict Status of PB.7 + * + * 1 = PB.7 is conflicted. + * 0 = PB.7 worked normally. + * + */ + +#define SYS_DFP_CSR_DFP0_CST_Pos 0 +#define SYS_DFP_CSR_DFP0_CST_Msk (0x01ul << SYS_DFP_CSR_DFP0_CST_Pos) +#define SYS_DFP_CSR_DFP1_CST_Pos 1 +#define SYS_DFP_CSR_DFP1_CST_Msk (0x01ul << SYS_DFP_CSR_DFP1_CST_Pos) +#define SYS_DFP_CSR_DFP2_CST_Pos 2 +#define SYS_DFP_CSR_DFP2_CST_Msk (0x01ul << SYS_DFP_CSR_DFP2_CST_Pos) +#define SYS_DFP_CSR_DFP3_CST_Pos 3 +#define SYS_DFP_CSR_DFP3_CST_Msk (0x01ul << SYS_DFP_CSR_DFP3_CST_Pos) +#define SYS_DFP_CSR_DFP4_CST_Pos 4 +#define SYS_DFP_CSR_DFP4_CST_Msk (0x01ul << SYS_DFP_CSR_DFP4_CST_Pos) +#define SYS_DFP_CSR_DFP5_CST_Pos 5 +#define SYS_DFP_CSR_DFP5_CST_Msk (0x01ul << SYS_DFP_CSR_DFP5_CST_Pos) +#define SYS_DFP_CSR_DFP6_CST_Pos 6 +#define SYS_DFP_CSR_DFP6_CST_Msk (0x01ul << SYS_DFP_CSR_DFP6_CST_Pos) +// Bits 7-31 are Reserved. + + +/** + * @brief System Manager Controller (SYS) - Register GPA_IOCR + * + * @description Peripheral GPIOA IO Control Register (GPA_IOCR) bit defines + * + * See NUC123 Technical Reference Manual 5.3.4 Register Description, page 95 + * + * GPA_IOCR GCR_BA+0xC0 + * + * + * GPA10_DS [10] + * PA.10 Pin Driving Strength Selection + * + * 1 = PA.10 strong driving strength mode Enabled. + * 0 = PA.10 strong driving strength mode Disabled. + * + * GPA11_DS [11] + * PA.11 Pin Driving Strength Selection + * + * 1 = PA.11 strong driving strength mode Enabled. + * 0 = PA.11 strong driving strength mode Disabled. + * + */ + +// Bits 0-9 are Reserved. +#define SYS_GPA_IOCR_GPA10_DS_Pos 10 +#define SYS_GPA_IOCR_GPA10_DS_Msk (0x01ul << SYS_GPA_IOCR_GPA10_DS_Pos) +#define SYS_GPA_IOCR_GPA11_DS_Pos 11 +#define SYS_GPA_IOCR_GPA11_DS_Msk (0x01ul << SYS_GPA_IOCR_GPA11_DS_Pos) +// Bits 12-31 are Reserved. + + +/** + * @brief System Manager Controller (SYS) - Register GPB_IOCR + * + * @description Peripheral GPIOB IO Control Register (GPB_IOCR) bit defines + * + * See NUC123 Technical Reference Manual 5.3.4 Register Description, page 96-97 + * + * GPB_IOCR GCR_BA+0xC4 + * + * + * GPB4_DS [4] + * PB.4 Pin Driving Strength Selection + * + * 1 = PB.4 strong driving strength mode Enabled. + * 0 = PB.4 strong driving strength mode Disabled. + * + * GPB5_DS [5] + * PB.5 Pin Driving Strength Selection + * + * 1 = PB.5 strong driving strength mode Enabled. + * 0 = PB.5 strong driving strength mode Disabled. + * + * GPB6_DS [6] + * PB.6 Pin Driving Strength Selection + * + * 1 = PB.6 strong driving strength mode Enabled. + * 0 = PB.6 strong driving strength mode Disabled. + * + * GPB7_DS [7] + * PB.7 Pin Driving Strength Selection + * + * 1 = PB.7 strong driving strength mode Enabled. + * 0 = PB.7 strong driving strength mode Disabled. + * + * GPB8_DS [8] + * PB.8 Pin Driving Strength Selection + * + * 1 = PB.8 strong driving strength mode Enabled. + * 0 = PB.8 strong driving strength mode Disabled. + * + * GPB12_DS [12] + * PB.12 Pin Driving Strength Selection + * + * 1 = PB.12 strong driving strength mode Enabled. + * 0 = PB.12 strong driving strength mode Disabled. + * + * GPB13_DS [13] + * PB.13 Pin Driving Strength Selection + * + * 1 = PB.13 strong driving strength mode Enabled. + * 0 = PB.13 strong driving strength mode Disabled. + * + * GPB14_DS [14] + * PB.14 Pin Driving Strength Selection + * + * 1 = PB.14 strong driving strength mode Enabled. + * 0 = PB.14 strong driving strength mode Disabled. + * + */ + +// Bits 0-3 are Reserved. +#define SYS_GPB_IOCR_GPB4_DS_Pos 4 +#define SYS_GPB_IOCR_GPB4_DS_Msk (0x01ul << SYS_GPB_IOCR_GPB4_DS_Pos) +#define SYS_GPB_IOCR_GPB5_DS_Pos 5 +#define SYS_GPB_IOCR_GPB5_DS_Msk (0x01ul << SYS_GPB_IOCR_GPB5_DS_Pos) +#define SYS_GPB_IOCR_GPB6_DS_Pos 6 +#define SYS_GPB_IOCR_GPB6_DS_Msk (0x01ul << SYS_GPB_IOCR_GPB6_DS_Pos) +#define SYS_GPB_IOCR_GPB7_DS_Pos 7 +#define SYS_GPB_IOCR_GPB7_DS_Msk (0x01ul << SYS_GPB_IOCR_GPB7_DS_Pos) +#define SYS_GPB_IOCR_GPB8_DS_Pos 8 +#define SYS_GPB_IOCR_GPB8_DS_Msk (0x01ul << SYS_GPB_IOCR_GPB8_DS_Pos) +// Bits 9-11 are Reserved. +#define SYS_GPB_IOCR_GPB12_DS_Pos 12 +#define SYS_GPB_IOCR_GPB12_DS_Msk (0x01ul << SYS_GPB_IOCR_GPB12_DS_Pos) +#define SYS_GPB_IOCR_GPB13_DS_Pos 13 +#define SYS_GPB_IOCR_GPB13_DS_Msk (0x01ul << SYS_GPB_IOCR_GPB13_DS_Pos) +#define SYS_GPB_IOCR_GPB14_DS_Pos 14 +#define SYS_GPB_IOCR_GPB14_DS_Msk (0x01ul << SYS_GPB_IOCR_GPB14_DS_Pos) +// Bits 15-31 are Reserved. + + +/** + * @brief System Manager Controller (SYS) - Register GPD_IOCR + * + * @description Peripheral GPIOD IO Control Register (GPD_IOCR) bit defines + * + * See NUC123 Technical Reference Manual 5.3.4 Register Description, page 98 + * + * GPD_IOCR GCR_BA+0xCC + * + * + * GPD8_DS [8] + * PD.8 Pin Driving Strength Selection + * + * 1 = PD.8 strong driving strength mode Enabled. + * 0 = PD.8 strong driving strength mode Disabled. + * + * GPD9_DS [9] + * PD.9 Pin Driving Strength Selection + * + * 1 = PD.9 strong driving strength mode Enabled. + * 0 = PD.9 strong driving strength mode Disabled. + * + * GPD10_DS [10] + * PD.10 Pin Driving Strength Selection + * + * 1 = PD.10 strong driving strength mode Enabled. + * 0 = PD.10 strong driving strength mode Disabled. + * + * GPD11_DS [11] + * PD.11 Pin Driving Strength Selection + * + * 1 = PD.11 strong driving strength mode Enabled. + * 0 = PD.11 strong driving strength mode Disabled. + * + */ + +// Bits 0-7 are Reserved. +#define SYS_GPD_IOCR_GPD8_DS_Pos 8 +#define SYS_GPD_IOCR_GPD8_DS_Msk (0x01ul << SYS_GPD_IOCR_GPD8_DS_Pos) +#define SYS_GPD_IOCR_GPD9_DS_Pos 9 +#define SYS_GPD_IOCR_GPD9_DS_Msk (0x01ul << SYS_GPD_IOCR_GPD9_DS_Pos) +#define SYS_GPD_IOCR_GPD10_DS_Pos 10 +#define SYS_GPD_IOCR_GPD10_DS_Msk (0x01ul << SYS_GPD_IOCR_GPD10_DS_Pos) +#define SYS_GPD_IOCR_GPD11_DS_Pos 11 +#define SYS_GPD_IOCR_GPD11_DS_Msk (0x01ul << SYS_GPD_IOCR_GPD11_DS_Pos) +// Bits 12-31 are Reserved. + + +/** + * @brief System Manager Controller (SYS) - Register REGWRPROT + * + * @description Register Write-Protection Control Register (REGWRPROT) bit defines + * + * See NUC123 Technical Reference Manual 5.3.4 Register Description, page 99 + * + * REGWRPROT GCR_BA+0x100 + * + * Some of the system control registers need to be protected to avoid inadvertent write and disturb + * the chip operation. These system control registers are protected after the power-on reset till user + * to disable register protection. For user to program these protected registers, a register protection + * disable sequence needs to be followed by a special programming. The register protection disable + * sequence is writing the data "59h", "16h" "88h" to the register REGWRPROT address at + * 0x5000_0100 continuously. Any different data value, different sequence or any other write to + * other address during these three data writing will abort the whole sequence. + * + * After the protection is disabled, user can check the protection disable bit at address 0x5000_0100 + * bit0, 1 is protection disable, and 0 is protection enable. Then user can update the target protected + * register value and then write any data to the address "0x5000_0100" to enable register protection. + * + * This register is write for disable/enable register protection and read for the REGPROTDIS status + * + * + * REGPROTDIS [0] + * Register Write-Protection Disable index (Read Only) + * + * 1 = Write-protection Disabled for writing protected registers. + * 0 = Write-protection Enabled for writing protected registers. Any write to the protected + * register is ignored. + * + * The Protected registers are: + * IPRSTC1: address 0x5000_0008 + * BODCR: address 0x5000_0018 + * PORCR: address 0x5000_0024 + * PWRCON: address 0x5000_0200 (bit[6] is not protected for power wake-up interrupt clear) + * APBCLK bit[0]: address 0x5000_0208 (bit[0] is watchdog clock enabled) + * CLKSEL0: address 0x5000_0210 (for HCLK and CPU STCLK clock source select) + * CLKSEL1 bit[1:0]: address 0x5000_0214 (for watchdog clock source select) + * ISPCON: address 0x5000_C000 (Flash ISP Control register) + * WTCR: address 0x4000_4000 + * FATCON: address 0x5000_C018 + * + * + * REGWRPROT [0:7] + * Register Write-Protection Code (Write Only) + * + * Some registers have write-protection function. Writing these registers has to disable + * the protected function by writing the sequence value "59h", "16h", "88h" to this field. + * After this sequence is completed, the REGPROTDIS bit will be set to 1 and write- + * protection registers can be normal write. + * + */ + +#define SYS_REGWRPROT_REGPROTDIS_Pos 0 +#define SYS_REGWRPROT_REGPROTDIS_Msk (0x01ul << SYS_REGWRPROT_REGPROTDIS_Pos) +#define SYS_REGWRPROT_REGWRPROT_Pos 0 +#define SYS_REGWRPROT_REGWRPROT_Msk (0xFFul << SYS_REGWRPROT_REGWRPROT_Pos) +// Bits 8-31 are Reserved. + + +/* =========================================================================================================================== */ +/* ================ USBD Controller ================ */ +/* =========================================================================================================================== */ + + +/** + * @brief USBD Controller (USBD) + * + * @description See NUC123 Technical Reference Manual 5.6.5 Register Map, page 158-160 + * + * USB_BA = 0x4006_0000 + * + * + * There are large swathes of registers included in the NUC123 Technical Reference Manual + * that are NOT NEEDED by this implementation - so are not included in this header. They + * are marked in this struct as RESERVED sections - to allow for future updates as needed. + * + * The main USBD_T struct contains a set of EndPoint structs (USBD_EP_T) - maximum of 8 + * for the NUC123SD4AN0 MCU. + * + * USBD EndPoint Registers [EndPoint 0~7] + * + * EP0 Registers = USB_BA+0x500 + * EP1 Registers = USB_BA+0x510 + * EP2 Registers = USB_BA+0x520 + * EP3 Registers = USB_BA+0x530 + * EP4 Registers = USB_BA+0x540 + * EP5 Registers = USB_BA+0x550 + * EP6 Registers = USB_BA+0x560 + * EP7 Registers = USB_BA+0x570 + * + * + * SRAM = USB_BA+0x100 -> USB_BA+0x2FF [512 Bytes] + * + * The SRAM is used for the endpoints buffers for all 8 endpoints. + * + * Refer to section 5.4.4.7 for the endpoint SRAM structure and its description. + * + */ + +typedef struct { + + __IO uint32_t BUFSEG; // Endpoint 0~7 Buffer Segmentation Register + __IO uint32_t MXPLD; // Endpoint 0~7 Maximal Payload Register + __IO uint32_t CFG; // Endpoint 0~7 Configuration Register + __IO uint32_t CFGP; // Endpoint 0~7 Set Stall and Clear In/Out Ready Control Register + +} USBD_EP_T; + +typedef struct { + + __IO uint32_t INTEN; // USB_BA + 0x00 USB Interrupt Enable Register + __IO uint32_t INTSTS; // USB_BA + 0x04 USB Interrupt Event Status Register + __IO uint32_t FADDR; // USB_BA + 0x08 USB Device Function Address Register + __I uint32_t EPSTS; // USB_BA + 0x0C USB Endpoint Status Register + __IO uint32_t ATTR; // USB_BA + 0x10 USB Bus Status and Attribution Register + __I uint32_t FLDET; // USB_BA + 0x14 USB Floating Detection Register + __IO uint32_t STBUFSEG; // USB_BA + 0x18 Setup Token Buffer Segmentation Register + __I uint32_t RESERVED0[29]; + __IO uint32_t DRVSE0; // USB_BA + 0x90 USB Drive SE0 Control Register + __I uint32_t RESERVED2[283]; + USBD_EP_T EP[8]; // USB_BA + 0x500 Endpoint 0~7 Control Registers + +} USBD_T; + + +/** + * @brief USB Device Controller (USBD) - Register USBD_INTEN + * + * @description USB Interrupt Enable Register (USBD_INTEN) bit defines + * + * See NUC123 Technical Reference Manual 5.6.6 Register Description, page 161-162 + * + * USBD_INTEN = USB_BA+0x000 + * + * + * BUS_IE [0] + * Bus Event Interrupt Enable + * + * 1 = BUS event interrupt Enabled. + * 0 = BUS event interrupt Disabled. + * + * + * USB_IE [1] + * USB Event Interrupt Enable + * + * 1 = USB event interrupt Enabled. + * 0 = USB event interrupt Disabled. + * + * + * FLDET_IE [2] + * Floating Detected Interrupt Enable + * + * 1 = Floating detect Interrupt Enabled. + * 0 = Floating detect Interrupt Disabled. + * + * + * WAKEUP_IE [3] + * USB Wake-up Interrupt Enable + * + * 1 = Wake-up Interrupt Enabled. + * 0 = Wake-up Interrupt Disabled. + * + * + * WAKEUP_EN [8] + * Wake-up Function Enable + * + * 1 = USB wake-up function Enabled. + * 0 = USB wake-up function Disabled. + * + * + * INNAK_EN [15] + * Active NAK Function and its Status in IN Token + * + * 1 = NAK status is updated into the endpoint status register, USB_EPSTS, when it is + * set to 1 and there is NAK response in IN token. It also enables the interrupt event + * when the device responds NAK after receiving IN token + * 0 = NAK status wasn‟t updated into the endpoint status register when it was set to 0. + * It also disables the interrupt event when device responds NAK after receiving IN + * token + * + * + */ + +#define USBD_INTEN_BUS_IE_Pos 0 +#define USBD_INTEN_BUS_IE_Msk (0x01ul << USBD_INTEN_BUS_IE_Pos) +#define USBD_INTEN_USB_IE_Pos 1 +#define USBD_INTEN_USB_IE_Msk (0x01ul << USBD_INTEN_USB_IE_Pos) +#define USBD_INTEN_FLDET_IE_Pos 2 +#define USBD_INTEN_FLDET_IE_Msk (0x01ul << USBD_INTEN_FLDET_IE_Pos) +#define USBD_INTEN_WAKEUP_IE_Pos 3 +#define USBD_INTEN_WAKEUP_IE_Msk (0x01ul << USBD_INTEN_WAKEUP_IE_Pos) +// Bits 4-7 are Reserved. +#define USBD_INTEN_WAKEUP_EN_Pos 8 +#define USBD_INTEN_WAKEUP_EN_Msk (0x01ul << USBD_INTEN_WAKEUP_EN_Pos) +// Bits 9-14 are Reserved. +#define USBD_INTEN_INNAK_EN_Pos 15 +#define USBD_INTEN_INNAK_EN_Msk (0x01ul << USBD_INTEN_INNAK_EN_Pos) +// Bits 16-31 are Reserved. + + +/** + * @brief USB Device Controller (USBD) - Register USBD_INTSTS + * + * @description USB Interrupt Event Status Register (USBD_INTSTS) bit defines + * + * See NUC123 Technical Reference Manual 5.6.6 Register Description, page 163-165 + * + * USBD_INTSTS = USB_BA+0x004 + * + * + * BUS_STS [0] + * BUS Interrupt Status + * + * The BUS event means that there is one of the suspense or the resume function in the bus. + * + * 1 = Bus event occurred. + * Check USBD_ATTR[3:0] to know which kind of bus event has occurred. + * Clear event by writing 1 to USBD_INTSTS[0]. + * 0 = No BUS event occurred. + * + * + * USB_STS [1] + * USB event Interrupt Status + * + * The USB event includes the Setup Token, IN Token, OUT ACK, ISO IN, or ISO OUT + * events in the bus. + * + * 1 = USB event occurred + * Check EPSTS0~7[2:0] to know which kind of USB event has occured. + * Clear event by writing 1 to USBD_INTSTS[1] or EPSTS0~7 and SETUP (USBD_INTSTS[31]) + * 0 = No USB event occurred. + * + * + * FLDET_STS [2] + * Floating Detected Interrupt Status + * + * 1 = There is attached/detached event in the USB bus. + * Cleared by writing 1 to USBD_INTSTS[2]. + * 0 = There is not attached/detached event in the USB. + * + * + * WAKEUP_STS [3] + * Wake-up Interrupt Status + * + * 1 = Wake-up event occurred, cleared by writing 1 to USBD_INTSTS[3] + * 0 = No Wake-up event occurred. + * + * + * EPEVT0 [16] + * Endpoint 0's USB Event Status + * + * 1 = USB event occurred on Endpoint 0, check USBD_EPSTS[10:8] to know which kind + * of USB event has occurred. + * Cleared by writing 1 to USBD_INTSTS[16] or USBD_INTSTS[1] + * 0 = No event occurred on Endpoint 0. + * + * + * EPEVT1 [17] + * Endpoint 1's USB Event Status + * + * 1 = USB event occurred on Endpoint 1, check USBD_EPSTS[13:11] to know which kind + * of USB event has occurred. + * Cleared by writing 1 to USBD_INTSTS[17] or USBD_INTSTS[1] + * 0 = No event occurred on Endpoint 1. + * + * + * EPEVT2 [18] + * Endpoint 2's USB Event Status + * + * 1 = USB event occurred on Endpoint 2, check USBD_EPSTS[14:16] to know which kind + * of USB event has occurred. + * Cleared by writing 1 to USBD_INTSTS[18] or USBD_INTSTS[1] + * 0 = No event occurred on Endpoint 2. + * + * + * EPEVT3 [19] + * Endpoint 3's USB Event Status + * + * 1 = USB event occurred on Endpoint 3, check USBD_EPSTS[17:19] to know which kind + * of USB event has occurred. + * Cleared by writing 1 to USBD_INTSTS[19] or USBD_INTSTS[1] + * 0 = No event occurred on Endpoint 3. + * + * + * EPEVT4 [20] + * Endpoint 4's USB Event Status + * + * 1 = USB event occurred on Endpoint 4, check USBD_EPSTS[20:22] to know which kind + * of USB event has occurred. + * Cleared by writing 1 to USBD_INTSTS[20] or USBD_INTSTS[1] + * 0 = No event occurred on Endpoint 4. + * + * + * EPEVT5 [21] + * Endpoint 5's USB Event Status + * + * 1 = USB event occurred on Endpoint 5, check USBD_EPSTS[23:25] to know which kind + * of USB event has occurred. + * Cleared by writing 1 to USBD_INTSTS[21] or USBD_INTSTS[1] + * 0 = No event occurred on Endpoint 5. + * + * + * EPEVT6 [22] + * Endpoint 6's USB Event Status + * + * 1 = USB event occurred on Endpoint 6, check USBD_EPSTS[26:28] to know which kind + * of USB event has occurred. + * Cleared by writing 1 to USBD_INTSTS[22] or USBD_INTSTS[1] + * 0 = No event occurred on Endpoint 6. + * + * + * EPEVT7 [23] + * Endpoint 7's USB Event Status + * + * 1 = USB event occurred on Endpoint 7, check USBD_EPSTS[29:31] to know which kind + * of USB event has occurred. + * Cleared by writing 1 to USBD_INTSTS[23] or USBD_INTSTS[1] + * 0 = No event occurred on Endpoint 7. + * + * + * SETUP [31] + * Setup Event Status + * + * 1 = Setup event occurred. Cleared by writing 1 to USBD_INTSTS[31]. + * 0 = No Setup event. + * + */ + +#define USBD_INTSTS_BUS_STS_Pos 0 +#define USBD_INTSTS_BUS_STS_Msk (0x01ul << USBD_INTSTS_BUS_STS_Pos) +#define USBD_INTSTS_USB_STS_Pos 1 +#define USBD_INTSTS_USB_STS_Msk (0x01ul << USBD_INTSTS_USB_STS_Pos) +#define USBD_INTSTS_FLDET_STS_Pos 2 +#define USBD_INTSTS_FLDET_STS_Msk (0x01ul << USBD_INTSTS_FLDET_STS_Pos) +#define USBD_INTSTS_WAKEUP_STS_Pos 3 +#define USBD_INTSTS_WAKEUP_STS_Msk (0x01ul << USBD_INTSTS_WAKEUP_STS_Pos) +// Bits 4-15 are Reserved. +#define USBD_INTSTS_EPEVT0_Pos 16 +#define USBD_INTSTS_EPEVT0_Msk (0x1ul << USBD_INTSTS_EPEVT0_Pos) +#define USBD_INTSTS_EPEVT1_Pos 17 +#define USBD_INTSTS_EPEVT1_Msk (0x1ul << USBD_INTSTS_EPEVT1_Pos) +#define USBD_INTSTS_EPEVT2_Pos 18 +#define USBD_INTSTS_EPEVT2_Msk (0x1ul << USBD_INTSTS_EPEVT2_Pos) +#define USBD_INTSTS_EPEVT3_Pos 19 +#define USBD_INTSTS_EPEVT3_Msk (0x1ul << USBD_INTSTS_EPEVT3_Pos) +#define USBD_INTSTS_EPEVT4_Pos 20 +#define USBD_INTSTS_EPEVT4_Msk (0x1ul << USBD_INTSTS_EPEVT4_Pos) +#define USBD_INTSTS_EPEVT5_Pos 21 +#define USBD_INTSTS_EPEVT5_Msk (0x1ul << USBD_INTSTS_EPEVT5_Pos) +#define USBD_INTSTS_EPEVT6_Pos 22 +#define USBD_INTSTS_EPEVT6_Msk (0x1ul << USBD_INTSTS_EPEVT6_Pos) +#define USBD_INTSTS_EPEVT7_Pos 23 +#define USBD_INTSTS_EPEVT7_Msk (0x1ul << USBD_INTSTS_EPEVT7_Pos) +// Bits 24-30 are Reserved. +#define USBD_INTSTS_SETUP_Pos 31 +#define USBD_INTSTS_SETUP_Msk (0x01ul << USBD_INTSTS_SETUP_Pos) + + +/** + * @brief USB Device Controller (USBD) - Register USBD_FADDR + * + * @description USB Interrupt Event Status Register (USBD_FADDR) bit defines + * + * See NUC123 Technical Reference Manual 5.6.6 Register Description, page 166 + * + * USBD_FADDR = USB_BA+0x008 + * + * + * FADDR [0:6] + * USB Device Function Address + * + * A seven-bit value used as the address of the device on the USB BUS + * + */ + +#define USBD_FADDR_FADDR_Pos 0 +#define USBD_FADDR_FADDR_Msk (0x07Ful << USBD_FADDR_FADDR_Pos) +// Bits 7-31 are Reserved. + + +/** + * @brief USB Device Controller (USBD) - Register USBD_EPSTS + * + * @description USB Endpoint Status Register (USBD_EPSTS) bit defines + * + * See NUC123 Technical Reference Manual 5.6.6 Register Description, page 167-169 + * + * USBD_EPSTS = USB_BA+0x00C + * + * + * OVERRUN [7] + * Overrun + * + * Indicates that the received data is larger than the maximum payload number. + * + * 1 = Out data is more than the Max Payload in MXPLD register or the Setup data is + * more than 8 bytes. + * 0 = No overrun. + * + * + * EPSTS0~7 [8:10]/[11:13]/[14:16]/[17:19]/[20:22]/[23:25]/[26:28]/[29:31] + * Endpoint 0~7 Bus Status + * + * These bits are used to indicate the current status of this endpoint. + * + * 000 = In ACK + * 001 = In NAK + * 010 = Out Packet Data0 ACK + * 110 = Out Packet Data1 ACK + * 011 = Setup ACK + * 111 = Isochronous transfer end + * + */ + +// Bits 0-6 are Reserved. +#define USBD_EPSTS_OVERRUN_Pos 7 +#define USBD_EPSTS_OVERRUN_Msk (0b01ul << USBD_EPSTS_OVERRUN_Pos) +#define USBD_EPSTS_EPSTS0_Pos 8 +#define USBD_EPSTS_EPSTS0_Msk (0b0111ul << USBD_EPSTS_EPSTS0_Pos) +#define USBD_EPSTS_EPSTS1_Pos 11 +#define USBD_EPSTS_EPSTS1_Msk (0b0111ul << USBD_EPSTS_EPSTS1_Pos) +#define USBD_EPSTS_EPSTS2_Pos 14 +#define USBD_EPSTS_EPSTS2_Msk (0b0111ul << USBD_EPSTS_EPSTS2_Pos) +#define USBD_EPSTS_EPSTS3_Pos 17 +#define USBD_EPSTS_EPSTS3_Msk (0b0111ul << USBD_EPSTS_EPSTS3_Pos) +#define USBD_EPSTS_EPSTS4_Pos 20 +#define USBD_EPSTS_EPSTS4_Msk (0b0111ul << USBD_EPSTS_EPSTS4_Pos) +#define USBD_EPSTS_EPSTS5_Pos 23 +#define USBD_EPSTS_EPSTS5_Msk (0b0111ul << USBD_EPSTS_EPSTS5_Pos) +#define USBD_EPSTS_EPSTS6_Pos 26 +#define USBD_EPSTS_EPSTS6_Msk (0b0111ul << USBD_EPSTS_EPSTS6_Pos) +#define USBD_EPSTS_EPSTS7_Pos 29 +#define USBD_EPSTS_EPSTS7_Msk (0b0111ul << USBD_EPSTS_EPSTS7_Pos) + + +/** + * @brief USB Device Controller (USBD) - Register USBD_ATTR + * + * @description USB Bus Status and Attribution Register (USBD_ATTR) bit defines + * + * See NUC123 Technical Reference Manual 5.6.6 Register Description, page 170-171 + * + * USBD_ATTR = USB_BA+0x010 + * + * + * USBRST [0] + * USB Reset Status (Read Only) + * + * 1 = Bus reset when SE0 (single-ended 0) more than 2.5 us. + * 0 = No bus reset. + * + * + * SUSPEND [1] + * Suspend Status (Read Only) + * + * 1 = Bus idle more than 3ms, either cable is unplugged or host is sleeping + * 0 = No bus suspend. + * + * + * RESUME [2] + * Resume Status (Read Only) + * + * 1 = Resume from suspend. + * 0 = No bus resume. + * + * + * TIME-OUT [3] + * Time Out Status (Read Only) + * + * 1 = No Bus response for more than 18 bits/units time. + * 0 = No time-out. + * + * + * PHY_EN [4] + * PHY Transceiver Function Enable + * + * 1 = PHY transceiver function Enabled. + * 0 = PHY transceiver function Disabled. + * + * + * RWAKEUP [5] + * Remote Wake-up + * + * 1 = Force USB bus to K (USB_DP low, USB_DM: high) state, used for remote wake-up. + * 0 = Release the USB bus from K state. + * + * + * USB_EN [7] + * USB Controller Enable + * + * 1 = USB Controller Enabled. + * 0 = USB Controller Disabled. + * + * + * DPPU_EN [8] + * Pull-up resistor on USB_DP enable + * + * 1 = Pull-up resistor in USB_DP bus Enabled. + * 0 = Pull-up resistor in USB_DP bus Disabled. + * + * + * PWRDN [9] + * Power-down PHY Transceiver, Low Active + * + * 1 = Power-up related circuit of PHY transceiver. + * 0 = Power-down related circuit of PHY transceiver. + * + * + * BYTEM [10] + * CPU access USB SRAM Size Mode Selection + * + * 1 = Byte Mode: The size of the transfer from CPU to USB SRAM must be Byte-wide. + * 0 = Word Mode: The size of the transfer from CPU to USB SRAM must be Word-wide. + * + */ + +#define USBD_ATTR_USBRST_Pos 0 +#define USBD_ATTR_USBRST_Msk (0x01ul << USBD_ATTR_USBRST_Pos) +#define USBD_ATTR_SUSPEND_Pos 1 +#define USBD_ATTR_SUSPEND_Msk (0x01ul << USBD_ATTR_SUSPEND_Pos) +#define USBD_ATTR_RESUME_Pos 2 +#define USBD_ATTR_RESUME_Msk (0x01ul << USBD_ATTR_RESUME_Pos) +#define USBD_ATTR_TIMEOUT_Pos 3 +#define USBD_ATTR_TIMEOUT_Msk (0x01ul << USBD_ATTR_TIMEOUT_Pos) +#define USBD_ATTR_PHY_EN_Pos 4 +#define USBD_ATTR_PHY_EN_Msk (0x01ul << USBD_ATTR_PHY_EN_Pos) +#define USBD_ATTR_RWAKEUP_Pos 5 +#define USBD_ATTR_RWAKEUP_Msk (0x01ul << USBD_ATTR_RWAKEUP_Pos) +// Bit 6 is Reserved. +#define USBD_ATTR_USB_EN_Pos 7 +#define USBD_ATTR_USB_EN_Msk (0x01ul << USBD_ATTR_USB_EN_Pos) +#define USBD_ATTR_DPPU_EN_Pos 8 +#define USBD_ATTR_DPPU_EN_Msk (0x01ul << USBD_ATTR_DPPU_EN_Pos) +#define USBD_ATTR_PWRDN_Pos 9 +#define USBD_ATTR_PWRDN_Msk (0x01ul << USBD_ATTR_PWRDN_Pos) +#define USBD_ATTR_BYTEM_Pos 10 +#define USBD_ATTR_BYTEM_Msk (0x01ul << USBD_ATTR_BYTEM_Pos) +// Bits 11-31 are Reserved. + + +/** + * @brief USB Device Controller (USBD) - Register USBD_FLDET + * + * @description USB Device Floating Detection Register (USBD_FLDET) bit defines + * + * See NUC123 Technical Reference Manual 5.6.6 Register Description, page 172 + * + * USBD_FLDET = USB_BA+0x014 + * + * + * FLDET [0] + * Device Floating Detected + * + * 1 = Controller is attached to the BUS. + * 0 = Controller isn't attached to the USB host. + * + */ + +#define USBD_FLDET_FLDET_Pos 0 +#define USBD_FLDET_FLDET_Msk (0x01ul << USBD_FLDET_FLDET_Pos) +// Bits 1-31 are Reserved. + + +/** + * @brief USB Device Controller (USBD) - Register USBD_BUFSEG + * + * @description Setup Token Buffer Segmentation Register (USBD_BUFSEG) bit defines + * + * See NUC123 Technical Reference Manual 5.6.6 Register Description, page 173 + * + * USBD_BUFSEG = USB_BA+0x018 + * + * + * BUFSEG [3:8] + * Used to indicate the offset address for the Setup token with the USB SRAM + * starting address. + * + * The effective starting address is: + * USBD_SRAM address + { BUFSEG[8:3], 3‟b000} + * Where the USBD_SRAM address = USB_BA+0x100h. + * + * Note: This is ONLY used for Setup token. + * + */ + +// Bits 0-2 are Reserved. +#define USBD_STBUFSEG_STBUFSEG_Pos 3 +#define USBD_STBUFSEG_STBUFSEG_Msk (0x03Ful << USBD_STBUFSEG_STBUFSEG_Pos) +// Bits 9-31 are Reserved. + + +/** + * @brief USB Device Controller (USBD) - Register USBD_BUFSEG0~7 + * + * @description Buffer Segmentation Register (USBD_BUFSEG0~7) bit defines + * + * See NUC123 Technical Reference Manual 5.6.6 Register Description, page 174-175 + * + * USBD_BUFSEG0 = USB_BA+0x500 + * USBD_BUFSEG1 = USB_BA+0x510 + * USBD_BUFSEG2 = USB_BA+0x520 + * USBD_BUFSEG3 = USB_BA+0x530 + * USBD_BUFSEG4 = USB_BA+0x540 + * USBD_BUFSEG5 = USB_BA+0x550 + * USBD_BUFSEG6 = USB_BA+0x560 + * USBD_BUFSEG7 = USB_BA+0x570 + * + * + * BUFSEG [3:8] + * Used to indicate the offset address for each endpoint with the USB SRAM + * starting address. + * + * The effective starting address is: + * USBD_SRAM address + { BUFSEG[8:3], 3‟b000} + * Where the USBD_SRAM address = USB_BA+0x100h. + * + */ + +// Bits 0-2 are Reserved. +#define USBD_BUFSEG_BUFSEG_Pos 3 +#define USBD_BUFSEG_BUFSEG_Msk (0x03Ful << USBD_BUFSEG_BUFSEG_Pos) +// Bits 9-31 are Reserved. + + +/** + * @brief USB Device Controller (USBD) - Register USBD_MXPLD0~7 + * + * @description Maximal Payload Register (USBD_MXPLD0~7) bit defines + * + * See NUC123 Technical Reference Manual 5.6.6 Register Description, page 176-177 + * + * USBD_MXPLD0 = USB_BA+0x504 + * USBD_MXPLD1 = USB_BA+0x514 + * USBD_MXPLD2 = USB_BA+0x524 + * USBD_MXPLD3 = USB_BA+0x534 + * USBD_MXPLD4 = USB_BA+0x544 + * USBD_MXPLD5 = USB_BA+0x554 + * USBD_MXPLD6 = USB_BA+0x564 + * USBD_MXPLD7 = USB_BA+0x574 + * + * MXPLD [0:8] + * Maximal Payload + * + * It is used to define the data length which is transmitted to host (IN token) or the actual + * data length which is received from the host (OUT token). It is also used to indicate + * that the endpoint is ready to be transmitted in IN token or received in OUT token. + * + * (1) When the register is written by CPU, + * For IN token, the value of MXPLD is used to define the data length to be transmitted + * and indicate the data buffer is ready. + * For OUT token, it means that the controller is ready to receive data from the host and + * the value of MXPLD is the maximal data length comes from host. + * (2) When the register is read by CPU, + * For IN token, the value of MXPLD indicates the data length be transmitted to host + * For OUT token, the value of MXPLD indicates the actual data length receiving from host. + * + * Note: Once MXPLD is written, the data packets will be transmitted/received + * immediately after IN/OUT token arrived. + * + */ + +#define USBD_MXPLD_MXPLD_Pos 0 +#define USBD_MXPLD_MXPLD_Msk (0x1FFul << USBD_MXPLD_MXPLD_Pos) +// Bits 9-31 are Reserved. + + +/** + * @brief USB Device Controller (USBD) - Register USBD_CFG0~7 + * + * @description Endpoint Configuration Register (USBD_CFG0~7) bit defines + * + * See NUC123 Technical Reference Manual 5.6.6 Register Description, page 178-179 + * + * USBD_CFG0 = USB_BA+0x508 + * USBD_CFG1 = USB_BA+0x518 + * USBD_CFG2 = USB_BA+0x528 + * USBD_CFG3 = USB_BA+0x538 + * USBD_CFG4 = USB_BA+0x548 + * USBD_CFG5 = USB_BA+0x558 + * USBD_CFG6 = USB_BA+0x568 + * USBD_CFG7 = USB_BA+0x578 + * + * + * EP_NUM [0:3] + * Endpoint Number + * + * These bits are used to define the endpoint number of the current endpoint. + * + * + * ISOCH [4] + * Isochronous Endpoint + * + * This bit is used to set the endpoint as Isochronous endpoint - no handshake. + * + * 1 = Isochronous endpoint + * 0 = No Isochronous endpoint + * + * + * STATE [5:6] + * Endpoint STATE + * + * 00 = Endpoint Disabled + * 01 = Out endpoint + * 10 = IN endpoint + * 11 = Undefined + * + * + * DSQ_SYNC [7] + * Data Sequence Synchronization + * + * 1 = DATA1 PID + * 0 = DATA0 PID + * + * It is used to specify the DATA0 or DATA1 PID in the following IN token transaction. + * H/W will toggle automatically in IN token - based on this bit. + * + * + * CSTALL [9] + * Clear STALL Response + * + * 1 = Clear the device to respond STALL handshake in the setup stage. + * 0 = Device Disabled to clear the STALL handshake in the setup stage. + * + */ + +#define USBD_CFG_EP_NUM_Pos 0 +#define USBD_CFG_EP_NUM_Msk (0xFul << USBD_CFG_EP_NUM_Pos) +#define USBD_CFG_ISOCH_Pos 4 +#define USBD_CFG_ISOCH_Msk (0x01ul << USBD_CFG_ISOCH_Pos) +#define USBD_CFG_STATE_Pos 5 +#define USBD_CFG_STATE_Msk (0x03ul << USBD_CFG_STATE_Pos) +#define USBD_CFG_DSQ_SYNC_Pos 7 +#define USBD_CFG_DSQ_SYNC_Msk (0x01ul << USBD_CFG_DSQ_SYNC_Pos) +// Bit 8 is Reserved. +#define USBD_CFG_CSTALL_Pos 9 +#define USBD_CFG_CSTALL_Msk (0x01ul << USBD_CFG_CSTALL_Pos) +// Bits 10-31 are Reserved. + + +/** + * @brief USB Device Controller (USBD) - Register USBD_CFGP0~7 + * + * @description Extra Configuration Register (USBD_CFGP0~7) bit defines + * + * See NUC123 Technical Reference Manual 5.6.6 Register Description, page 180-181 + * + * USBD_CFGP0 = USB_BA+0x50C + * USBD_CFGP1 = USB_BA+0x51C + * USBD_CFGP2 = USB_BA+0x52C + * USBD_CFGP3 = USB_BA+0x53C + * USBD_CFGP4 = USB_BA+0x54C + * USBD_CFGP5 = USB_BA+0x55C + * USBD_CFGP6 = USB_BA+0x56C + * USBD_CFGP7 = USB_BA+0x57C + * + * + * CLRRDY [0] + * Clear Ready + * + * When the MXPLD register is set by user, it means that the endpoint is ready to + * transmit or receive data. If the user wants to turn off this transaction before the + * transaction start, user can set this bit to 1 to turn it off, which is then automatically + * cleared to 0. + * + * For IN token, writing 1 is used to clear the IN token - ready to transmit data to USB. + * For OUT token, writing 1 is used to clear the OUT token - ready to receive data from USB. + * + * This bit is written 1 only and is always 0 when it is read back. + * + * + * SSTALL [1] + * Set STALL + * + * 1 = Set the device to respond STALL automatically. + * 0 = Device Disabled from responding to STALL. + * + */ + +#define USBD_CFGP_CLRRDY_Pos 0 +#define USBD_CFGP_CLRRDY_Msk (0x01ul << USBD_CFGP_CLRRDY_Pos) +#define USBD_CFGP_SSTALL_Pos 1 +#define USBD_CFGP_SSTALL_Msk (0x01ul << USBD_CFGP_SSTALL_Pos) +// Bits 2-31 are Reserved. + + +/** + * @brief USB Device Controller (USBD) - Register USBD_DRVSE0 + * + * @description USB Drive SE0 Register (USBD_DRVSE0) bit defines + * + * See NUC123 Technical Reference Manual 5.6.6 Register Description, page 182 + * + * USBD_DRVSE0 = USB_BA+0x090 + * + * + * DRVSE0 [0] + * Drive Single Ended Zero in USB Bus + * + * The Single Ended Zero (SE0) is when both lines (USB_DP and USB_DM) are being + * pulled low. + * + * 1 = Force USB PHY transceiver to drive SE0 + * 0 = None + * + * + */ + +#define USBD_DRVSE0_DRVSE0_Pos 0 +#define USBD_DRVSE0_DRVSE0_Msk (0x01ul << USBD_DRVSE0_DRVSE0_Pos) +// Bits 1-31 are Reserved. + + +/** + * @brief USB Device Controller (USBD) - Register USBD_PDMA + * + * @description USB PDMA Controller Register (USBD_PDMA) bit defines + * + * See NUC123 Technical Reference Manual 5.6.6 Register Description, page 183 + * + * USBD_PDMA = USB_BA+0x0A4 + * + * + * PDMA_RW [0] + * PDMA Read/Write + * + * 1 = The PDMA will read data from USB buffer to memory + * 0 = The PDMA will read data from memory to USB buffer + * + * + * PDMA_EN [1] + * PDMA Function Enable + * + * 1 = The PDMA function in USB is active + * 0 = The PDMA function is not active + * + * This bit will be automatically cleared after the PDMA transfer completes. + * + */ + + +#define USBD_PDMA_PDMA_RW_Pos 0 +#define USBD_PDMA_PDMA_RW_Msk (0x01ul << USBD_PDMA_PDMA_RW_Pos) +#define USBD_PDMA_PDMA_EN_Pos 1 +#define USBD_PDMA_PDMA_EN_Msk (0x01ul << USBD_PDMA_PDMA_EN_Pos) +// Bits 2-31 are Reserved. + + + +/* =========================================================================================================================== */ +/* ================ GPIO Controller ================ */ +/* =========================================================================================================================== */ + + +/** + * @brief GPIO Controller (GPIO) + * + * @description See NUC123 Technical Reference Manual 5.7.4 Register Map, page 187-190 + * + * GP_BA = 0x5000_4000 + * + * Struct rearranged from table to track actual locations (without having to specify offsets) + * + * GPIO_T Struct is per-GPIO port, with offsets of: + * + * GPIOA = GP_BA+0x000 + * GPIOB = GP_BA+0x040 + * GPIOC = GP_BA+0x080 + * GPIOD = GP_BA+0x0C0 + * GPIOF = GP_BA+0x140 + * + * DBNCECON = GP_BA+0x180 + * + * Note: DBNCECON in separate struct due to unary nature of register, compared to multiple nature of GPIO_T-based GPIO ports + * + * There are separate DOUTs for each GPIO Port Pin (A10-A15, B0-B15, C0-C5:C8-C13, D0-D5:D8-D11, F0-F3) but these are NOT + * NOT represented here as defines, other than the GPIO_PIN_DATA_BASE defining their start location. + */ +typedef struct { + + __IO uint32_t PMD; // GP_BA + GPIO + 0x00 GPIO Port [A/B/C/D/F] Pin I/O Mode Control + __IO uint32_t OFFD; // GP_BA + GPIO + 0x04 GPIO Port [A/B/C/D/F] Pin Digital Input Path Disable Control + __IO uint32_t DOUT; // GP_BA + GPIO + 0x08 GPIO Port [A/B/C/D/F] Data Output Value + __IO uint32_t DMASK; // GP_BA + GPIO + 0x0C GPIO Port [A/B/C/D/F] Data Output Write Mask + __I uint32_t PIN; // GP_BA + GPIO + 0x10 GPIO Port [A/B/C/D/F] Pin Value + __IO uint32_t DBEN; // GP_BA + GPIO + 0x14 GPIO Port [A/B/C/D/F] De-bounce Enable + __IO uint32_t IMD; // GP_BA + GPIO + 0x18 GPIO Port [A/B/C/D/F] Interrupt Mode Control + __IO uint32_t IEN; // GP_BA + GPIO + 0x1C GPIO Port [A/B/C/D/F] Interrupt Enable + __IO uint32_t ISRC; // GP_BA + GPIO + 0x20 GPIO Port [A/B/C/D/F] Interrupt Source Flag + +} GPIO_T; + + +typedef struct { + + __IO uint32_t DBNCECON; // GP_BA + 0x180 External Interrupt De-bounce Control + +} GPIO_DBNCECON_T; + +/** + * @brief GPIO Controller (GPIO) - Register PMD + * + * @description GPIO Port [A/B/C/D/F] I/O Mode Control (PMD) bit defines + * + * See NUC123 Technical Reference Manual 5.7.5 Register Description, page 191 + * + * + * GPIOx I/O Pin[n] Mode Control + * + * 00 = GPIO port [n] pin is in INPUT mode + * 01 = GPIO port [n] pin is in OUTPUT mode + * 10 = GPIO port [n] pin is in Open-Drain mode + * 11 = GPIO port [n] pin is in Quasi-bidirectional mode + * + * GPIOA: valid n are 15~10. Others are reserved. + * GPIOB: valid n are 15~12, 10~0. Others are reserved. + * GPIOC: valid n are 13~8, 5~0. Others are reserved. + * GPIOD: valid n are 11~8, 5~0. Others are reserved. + * GPIOF: valid n are 3~0. Others are reserved. + * + */ + +#define GPIO_PMD_PMD0_Pos 0 +#define GPIO_PMD_PMD0_Msk (0b011ul << GPIO_PMD_PMD0_Pos) +#define GPIO_PMD_PMD1_Pos 2 +#define GPIO_PMD_PMD1_Msk (0b011ul << GPIO_PMD_PMD1_Pos) +#define GPIO_PMD_PMD2_Pos 4 +#define GPIO_PMD_PMD2_Msk (0b011ul << GPIO_PMD_PMD2_Pos) +#define GPIO_PMD_PMD3_Pos 6 +#define GPIO_PMD_PMD3_Msk (0b011ul << GPIO_PMD_PMD3_Pos) +#define GPIO_PMD_PMD4_Pos 8 +#define GPIO_PMD_PMD4_Msk (0b011ul << GPIO_PMD_PMD4_Pos) +#define GPIO_PMD_PMD5_Pos 10 +#define GPIO_PMD_PMD5_Msk (0b011ul << GPIO_PMD_PMD5_Pos) +#define GPIO_PMD_PMD6_Pos 12 +#define GPIO_PMD_PMD6_Msk (0b011ul << GPIO_PMD_PMD6_Pos) +#define GPIO_PMD_PMD7_Pos 14 +#define GPIO_PMD_PMD7_Msk (0b011ul << GPIO_PMD_PMD7_Pos) +#define GPIO_PMD_PMD8_Pos 16 +#define GPIO_PMD_PMD8_Msk (0b011ul << GPIO_PMD_PMD8_Pos) +#define GPIO_PMD_PMD9_Pos 18 +#define GPIO_PMD_PMD9_Msk (0b011ul << GPIO_PMD_PMD9_Pos) +#define GPIO_PMD_PMD10_Pos 20 +#define GPIO_PMD_PMD10_Msk (0b011ul << GPIO_PMD_PMD10_Pos) +#define GPIO_PMD_PMD11_Pos 22 +#define GPIO_PMD_PMD11_Msk (0b011ul << GPIO_PMD_PMD11_Pos) +#define GPIO_PMD_PMD12_Pos 24 +#define GPIO_PMD_PMD12_Msk (0b011ul << GPIO_PMD_PMD12_Pos) +#define GPIO_PMD_PMD13_Pos 26 +#define GPIO_PMD_PMD13_Msk (0b011ul << GPIO_PMD_PMD13_Pos) +#define GPIO_PMD_PMD14_Pos 28 +#define GPIO_PMD_PMD14_Msk (0b011ul << GPIO_PMD_PMD14_Pos) +#define GPIO_PMD_PMD15_Pos 30 +#define GPIO_PMD_PMD15_Msk (0b011ul << GPIO_PMD_PMD15_Pos) + +/** + * @brief GPIO Controller (GPIO) - Register OFFD + * + * @description GPIO Port [A/B/C/D/F] OFF Digital Input Path Enable (OFFD) bit defines + * + * See NUC123 Technical Reference Manual 5.7.5 Register Description, page 192 + * + * GPIOx I/O Pin[n] OFF Digital Input Path Enable + * + * Each of these bits is used to control if the input path of corresponding GPIO pin is + * disabled. If input is analog signal, user can OFF digital input path to avoid creepage + * + * 1 = IO digital input path Disabled (digital input tied to low). + * 0 = IO digital input path Enabled. + * + * GPIOA: valid n are 15~10. Others are reserved. + * GPIOB: valid n are 15~12, 10~0. Others are reserved. + * GPIOC: valid n are 13~8, 5~0. Others are reserved. + * GPIOD: valid n are 11~8, 5~0. Others are reserved. + * GPIOF: valid n are 3~0. Others are reserved. + * + */ + +// Bits 0-15 are Reserved +// Bits 16-31 +#define GPIO_OFFD_OFFD_Pos 16 +#define GPIO_OFFD_OFFD_Msk (0xFFFFul << GPIO_OFFD_OFFD_Pos) + +/** + * @brief GPIO Controller (GPIO) - Register DOUT + * + * @description GPIO Port [A/B/C/D/F] Output Value (DOUT) bit defines + * + * See NUC123 Technical Reference Manual 5.7.5 Register Description, page 193 + * + * GPIOx Pin[n] Output Value + * + * Each of these bits control the status of a GPIO pin when the GPIO pin is configures + * as output, open-drain and quasi-mode. + * + * 1 = GPIO port [A/B/C/DF] Pin[n] will drive High if the GPIO pin is configures as output, + * open-drain and quasi-mode. + * 0 = GPIO port [A/B/C/D/ F] Pin[n] will drive Low if the GPIO pin is configures as + * output, open-drain and quasi-mode. + * + * GPIOA: valid n are 15~10. Others are reserved. + * GPIOB: valid n are 15~12, 10~0. Others are reserved. + * GPIOC: valid n are 13~8, 5~0. Others are reserved. + * GPIOD: valid n are 11~8, 5~0. Others are reserved. + * GPIOF: valid n are 3~0. Others are reserved. + * + */ + +// Bits 0-15 +#define GPIO_DOUT_DOUT_Pos 0 +#define GPIO_DOUT_DOUT_Msk (0xFFFFul << GPIO_DOUT_DOUT_Pos) +// Bits 16-31 are Reserved + + +/** + * @brief GPIO Controller (GPIO) - Register DMASK + * + * @description GPIO Port [A/B/C/D/F] Data Output Write Mask (DMASK) bit defines + * + * See NUC123 Technical Reference Manual 5.7.5 Register Description, page 194 + * + * GPIO Port [A/B/C/D/F] Data Output Write Mask + * + * These bits are used to protect the corresponding register of GPIOx_DOUT bit[n]. + * When set the DMASK bit[n] to 1, the corresponding GPIOx_DOUT[n] bit is protected. + * The write signal is masked, write data to the protect bit is ignored + * + * 1 = The corresponding GPIOx_DOUT[n] bit is protected + * 0 = The corresponding GPIOx_DOUT[n] bit can be updated + * + * IMPORTANT + * ========= + * This function only protect corresponding GPIOx_DOUT[n] bit, and WILL NOT + * protect corresponding bit control registers (GPIOAx_DOUT, GPIOBx_DOUT, + * GPIOCx_DOUT, GPIODx_DOUT and GPIOFx_DOUT) found later in the memory map. + * + * GPIOA: valid n are 15~10. Others are reserved. + * GPIOB: valid n are 15~12, 10~0. Others are reserved. + * GPIOC: valid n are 13~8, 5~0. Others are reserved. + * GPIOD: valid n are 11~8, 5~0. Others are reserved. + * GPIOF: valid n are 3~0. Others are reserved. + * + */ + +// Bits 0-15 +#define GPIO_DMASK_DMASK_Pos 0 +#define GPIO_DMASK_DMASK_Msk (0xFFFFul << GPIO_DMASK_DMASK_Pos) +// Bits 16-31 are Reserved. + +/** + * @brief GPIO Controller (GPIO) - Register PIN + * + * @description GPIO Port [A/B/C/D/F] Pin Value (PIN) bit defines + * + * See NUC123 Technical Reference Manual 5.7.5 Register Description, page 195 + * + * GPIO Port [A/B/C/D/F] Pin Values + * + * Each bit of the register reflects the actual status of the respective GPIO pin If bit is 1, + * it indicates the corresponding pin status is high, else the pin status is low + * + * GPIOA: valid n are 15~10. Others are reserved. + * GPIOB: valid n are 15~12, 10~0. Others are reserved. + * GPIOC: valid n are 13~8, 5~0. Others are reserved. + * GPIOD: valid n are 11~8, 5~0. Others are reserved. + * GPIOF: valid n are 3~0. Others are reserved. + * + */ + +// Bits 0-15 +#define GPIO_PIN_PIN_Pos 0 +#define GPIO_PIN_PIN_Msk (0xFFFFul << GPIO_PIN_PIN_Pos) +// Bits 16-31 are Reserved. + +/** + * @brief GPIO Controller (GPIO) - Register DBEN + * + * @description GPIO Port [A/B/C/D/F] De-bounce Enable (DBEN) bit defines + * + * See NUC123 Technical Reference Manual 5.7.5 Register Description, page 196 + * + * GPIO Port [A/B/C/D/F] Input Signal De-bounce Enable + * + * DBEN[n] is used to enable the de-bounce function for each corresponding bit. + * If the input signal pulse width can't be sampled by continuous two de-bounce + * sample cycle The input signal transition is seen as the signal bounce and + * will not trigger the interrupt. + * + * The de-bounce clock source is controlled by DBNCECON[4], one de-bounce sample + * cycle is controlled by DBNCECON[3:0] + * + * The DBEN[n] is used for "edge-trigger" interrupt only, and ignored for "level trigger" + * interrupt + * + * 1 = The bit[n] de-bounce function is enabled + * 0 = The bit[n] de-bounce function is disabled + * + * The de-bounce function is ONLY valid for edge triggered interrupt. If the interrupt mode + * is level triggered, the de-bounce enable bit is ignored. + * + * GPIOA: valid n are 15~10. Others are reserved. + * GPIOB: valid n are 15~12, 10~0. Others are reserved. + * GPIOC: valid n are 13~8, 5~0. Others are reserved. + * GPIOD: valid n are 11~8, 5~0. Others are reserved. + * GPIOF: valid n are 3~0. Others are reserved. + * + */ + +// Bits 0-15 +#define GPIO_DBEN_DBEN_Pos 0 +#define GPIO_DBEN_DBEN_Msk (0xFFFFul << GPIO_DBEN_DBEN_Pos) +// Bits 16-31 are Reserved. + +/** + * @brief GPIO Controller (GPIO) - Register IMD + * + * @description GPIO Port [A/B/C/D/F] Interrupt Mode Control (IMD) bit defines + * + * See NUC123 Technical Reference Manual 5.7.5 Register Description, page 197 + * + * GPIO Port [A/B/C/D/F] Edge or Level Detection Interrupt Control + * + * IMD[n] is used to choose between a level trigger or an edge trigger intterupt. + * + * If the interrupt is by edge trigger, the trigger source can be controlled by de-bounce. + * If the interrupt is by level trigger, the input source is sampled during one HCLK clock + * and then generates the interrupt. + * + * 1 = Level trigger interrupt. + * 0 = Edge trigger interrupt. + * + * If pin is set as a level trigger interrupt, only one level can be set on the registers + * GPIOx_IEN. If both levels are set to trigger an interrupt, the setting is ignored and no + * interrupt will occur. + * + * The de-bounce function is ONLY valid for edge triggered interrupt. If the interrupt mode + * is level triggered, the de-bounce enable bit is ignored. + * + * GPIOA: Valid n are 15~10. Others are reserved. + * GPIOB: Valid n are 15~12, 10~0. Others are reserved. + * GPIOC: Valid n are 13~8, 5~0. Others are reserved. + * GPIOD: Valid n are 11~8, 5~0. Others are reserved. + * GPIOF: valid n are 3~0. Others are reserved. + * + */ + +// Bits 0-15 +#define GPIO_IMD_IMD_Pos 0 +#define GPIO_IMD_IMD_Msk (0xFFFFul << GPIO_IMD_IMD_Pos) +// Bits 16-31 are Reserved. + +/** + * @brief GPIO Controller (GPIO) - Register IEN + * + * @description GPIO Port [A/B/C/D/F] Interrupt Enable Control (IEN) bit defines + * + * See NUC123 Technical Reference Manual 5.7.5 Register Description, page 199-200 + * + * IR_EN[n] + * ======== + * GPIO Port [A/B/C/D/F] Interrupt Enable by Input Rising Edge or Input Level High + * + * IR_EN[n] is used to enable the interrupt for each of the corresponding input + * GPIO_PIN[n]. Set bit to 1 also enable the pin wake-up function + * + * When the IR_EN[n] bit is set to 1: + * + * If the interrupt is level triggered, the input PIN[n] state at level "high" will generate the + * interrupt. + * If the interrupt is edge triggered, the input PIN[n] state changes from "low-to-high" will + * generate the interrupt. + * + * 1 = PIN[n] level-high or low-to-high interrupt Enabled. + * 0 = PIN[n] level-high or low-to-high interrupt Disabled. + * + * + * IF_EN[n] + * ======== + * GPIO Port [A/B/C/D/F] Interrupt Enable by Input Falling Edge or Input Level Low + * + * IF_EN[n] is used to enable the interrupt for each of the corresponding input + * GPIO_PIN[n]. Set bit to 1 also enable the pin wake-up function + * + * When set the IF_EN[n] bit to 1: + * + * If the interrupt is level triggered, the input PIN[n] state at level "low" will generate the + * interrupt. + * If the interrupt is edge triggered, the input PIN[n] state changes from "high-to-low" will + * generate the interrupt. + * + * 1 = PIN[n] state low-level or high-to-low change interrupt Enabled. + * 0 = PIN[n] state low-level or high-to-low change interrupt Disabled. + * + * + * GPIOA: Valid n are 15~10. Others are reserved. + * GPIOB: Valid n are 15~12, 10~0. Others are reserved. + * GPIOC: Valid n are 13~8, 5~0. Others are reserved. + * GPIOD: Valid n are 11~8, 5~0. Others are reserved. + * GPIOF: Valid n are 3~0. Others are reserved. + * + */ + +// IF_EN[n] +// Bits 0-15 +#define GPIO_IEN_IF_EN_Pos 0 +#define GPIO_IEN_IF_EN_Msk (0xFFFFul << GPIO_IEN_IF_EN_Pos) +// IR_EN[n] +// Bits 16-31 +#define GPIO_IEN_IR_EN_Pos 16 +#define GPIO_IEN_IR_EN_Msk (0xFFFFul << GPIO_IEN_IR_EN_Pos) + +/** + * @brief GPIO Controller (GPIO) - Register ISRC + * + * @description GPIO Port [A/B/C/D/F] Interrupt Trigger Source (ISRC) bit defines + * + * See NUC123 Technical Reference Manual 5.7.5 Register Description, page 201 + * + * GPIO Port [A/B/C/D/F] Interrupt Trigger Source Indicator + * + * On Read: + * 1 = Indicates GPIOx[n] generate an interrupt. + * 0 = No interrupt at GPIOx[n]. + * + * On Write : + * 1= Clear the corresponding pending interrupt. + * 0= No action. + * + * GPIOA: Valid n are 15~10. Others are reserved. + * GPIOB: Valid n are 15~12, 10~0. Others are reserved. + * GPIOC: Valid n are 13~8, 5~0. Others are reserved. + * GPIOD: Valid n are 11~8, 5~0. Others are reserved. + * GPIOF: Valid n are 3~0. Others are reserved. + * + */ +// Bits 0-15 +#define GPIO_ISRC_ISRC_Pos 0 +#define GPIO_ISRC_ISRC_Msk (0xFFFFul << GPIO_ISRC_ISRC_Pos) +// Bits 16-31 are Reserved. + +/** + * @brief GPIO Controller (GPIO) - Register DBNCECON + * + * @description GPIO Port [A/B/C/D/F] Interrupt De-bounce Cycle Control (DBNCECON) bit defines + * + * See NUC123 Technical Reference Manual 5.7.5 Register Description, page 202-203 + * + * DBNCECON = GP_BA+0x180 + * + * + * ICLK_ON + * ======= + * + * Interrupt clock On mode + * Setting this bit to 0 will disable the interrupt generate circuit clock if the pin[n] interrupt + * is disabled + * + * 1 = Interrupt generated circuit clock always Enabled. + * 0 = Clock Disabled if the GPIOA/B/C/D/F[n] interrupt is disabled. + * + * DBCLKSRC + * ======== + * De-bounce counter clock source select + * + * 1 = De-bounce counter clock source is the internal 10 kHz low speed oscillator. + * 0 = De-bounce counter clock source is the HCLK. + * + * DBCLKSEL + * ======== + * De-bounce sampling cycle selection + * + * 0 Sample interrupt input once per 1 clocks + * 1 Sample interrupt input once per 2 clocks + * 2 Sample interrupt input once per 4 clocks + * 3 Sample interrupt input once per 8 clocks + * 4 Sample interrupt input once per 16 clocks + * 5 Sample interrupt input once per 32 clocks + * 6 Sample interrupt input once per 64 clocks + * 7 Sample interrupt input once per 128 clocks + * 8 Sample interrupt input once per 256 clocks + * 9 Sample interrupt input once per 2*256 clocks + * 10 Sample interrupt input once per 4*256clocks + * 11 Sample interrupt input once per 8*256 clocks + * 12 Sample interrupt input once per 16*256 clocks + * 13 Sample interrupt input once per 32*256 clocks + * 14 Sample interrupt input once per 64*256 clocks + * 15 Sample interrupt input once per 128*256 clocks + * + */ + +// DBCLKSEL [0:3] +#define GPIO_DBNCECON_DBCLKSEL_Pos 0 +#define GPIO_DBNCECON_DBCLKSEL_Msk (0x0Ful << GPIO_DBNCECON_DBCLKSEL_Pos) +// DBCLKSRC [4] +#define GPIO_DBNCECON_DBCLKSRC_Pos 4 +#define GPIO_DBNCECON_DBCLKSRC_Msk (0x01ul << GPIO_DBNCECON_DBCLKSRC_Pos) +// ICLK_ON [5] +#define GPIO_DBNCECON_ICLK_ON_Pos 5 +#define GPIO_DBNCECON_ICLK_ON_Msk (0x01ul << GPIO_DBNCECON_ICLK_ON_Pos) +// Bits 6-31 are Reserved. + + +/* =========================================================================================================================== */ +/* ================ PWM Controller ================ */ +/* =========================================================================================================================== */ + +/** + * @brief PWM Controller (PWM) + * + * @description See NUC123 Technical Reference Manual 5.9.5 Register Map, page 243-244 + * + * PWMA_BA = 0x4004_0000 (PWM group A) + * + * Struct has several reserved sections for future expansion (the memory-mapped peripherals have these gaps) + * + * PWM_T Struct is for PWM Group A on the NUC123SD4AN0 - other NUMICRO family processors have more than one group. + * + */ + +typedef struct { + + __IO uint32_t PPR; // PWMA_BA + 0x00 PWM Group A Prescaler Register + __IO uint32_t CSR; // PWMA_BA + 0x04 PWM Group A Clock Source Divider Select Register + __IO uint32_t PCR; // PWMA_BA + 0x08 PWM Group A Control Register + __IO uint32_t CNR0; // PWMA_BA + 0x0C PWM Group A Counter Register 0 + __IO uint32_t CMR0; // PWMA_BA + 0x10 PWM Group A Comparator Register 0 + __I uint32_t PDR0; // PWMA_BA + 0x14 PWM Group A Data Register 0 + __IO uint32_t CNR1; // PWMA_BA + 0x18 PWM Group A Counter Register 1 + __IO uint32_t CMR1; // PWMA_BA + 0x1C PWM Group A Comparator Register 1 + __I uint32_t PDR1; // PWMA_BA + 0x20 PWM Group A Data Register 1 + __IO uint32_t CNR2; // PWMA_BA + 0x24 PWM Group A Counter Register 2 + __IO uint32_t CMR2; // PWMA_BA + 0x28 PWM Group A Comparator Register 2 + __I uint32_t PDR2; // PWMA_BA + 0x2C PWM Group A Data Register 2 + __IO uint32_t CNR3; // PWMA_BA + 0x30 PWM Group A Counter Register 3 + __IO uint32_t CMR3; // PWMA_BA + 0x34 PWM Group A Comparator Register 3 + __I uint32_t PDR3; // PWMA_BA + 0x38 PWM Group A Data Register 3 + __I uint32_t RESERVED0[1]; + __IO uint32_t PIER; // PWMA_BA + 0x40 PWM Group A Interrupt Enable Register + __IO uint32_t PIIR; // PWMA_BA + 0x44 PWM Group A Interrupt Indication Register + __I uint32_t RESERVED1[2]; + __IO uint32_t CCR0; // PWMA_BA + 0x50 PWM Group A Capture Control Register 0 + __IO uint32_t CCR2; // PWMA_BA + 0x54 PWM Group A Capture Control Register 2 + __IO uint32_t CRLR0; // PWMA_BA + 0x58 PWM Group A Capture Rising Latch Register (Channel 0) + __IO uint32_t CFLR0; // PWMA_BA + 0x5C PWM Group A Capture Falling Latch Register (Channel 0) + __IO uint32_t CRLR1; // PWMA_BA + 0x60 PWM Group A Capture Rising Latch Register (Channel 1) + __IO uint32_t CFLR1; // PWMA_BA + 0x64 PWM Group A Capture Falling Latch Register (Channel 1) + __IO uint32_t CRLR2; // PWMA_BA + 0x68 PWM Group A Capture Rising Latch Register (Channel 2) + __IO uint32_t CFLR2; // PWMA_BA + 0x6C PWM Group A Capture Falling Latch Register (Channel 2) + __IO uint32_t CRLR3; // PWMA_BA + 0x70 PWM Group A Capture Rising Latch Register (Channel 3) + __IO uint32_t CFLR3; // PWMA_BA + 0x74 PWM Group A Capture Falling Latch Register (Channel 3) + __IO uint32_t CAPENR; // PWMA_BA + 0x78 PWM Group A Capture Input 0~3 Enable Register + __IO uint32_t POE; // PWMA_BA + 0x7C PWM Group A Output Enable for Channel 0~3 + __IO uint32_t TCON; // PWMA_BA + 0x80 PWM Group A Trigger Control for Channel 0~3 + __IO uint32_t TSTATUS; // PWMA_BA + 0x84 PWM Group A Trigger Status Register + __IO uint32_t SYNCBUSY0; // PWMA_BA + 0x88 PWM Group A [PWM0] Synchronous Busy Status Register + __IO uint32_t SYNCBUSY1; // PWMA_BA + 0x8C PWM Group A [PWM1] Synchronous Busy Status Register + __IO uint32_t SYNCBUSY2; // PWMA_BA + 0x90 PWM Group A [PWM2] Synchronous Busy Status Register + __IO uint32_t SYNCBUSY3; // PWMA_BA + 0x94 PWM Group A [PWM3] Synchronous Busy Status Register + __I uint32_t RESERVE2[10]; + __IO uint32_t CAPPDMACTL; // PWMA_BA + 0xC0 PWM Group A Trigger Status Register + __IO uint32_t CAP0PDMA; // PWMA_BA + 0xC4 PWM Group A PDMA channel 0 DATA Register + __IO uint32_t CAP1PDMA; // PWMA_BA + 0xC8 PWM Group A PDMA channel 1 DATA Register + __IO uint32_t CAP2PDMA; // PWMA_BA + 0xCC PWM Group A PDMA channel 2 DATA Register + __IO uint32_t CAP3PDMA; // PWMA_BA + 0xD0 PWM Group A PDMA channel 3 DATA Register + +} PWM_T; + + +/** + * @brief PWM Controller (PWM) - Register PPR + * + * @description PWM Group A Prescalar Register (PPR) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 245 + * + * PPR = PWMA_BA+0x00 + * + * + * CP01 [0:7] + * Clock Prescaler 0 (PWM-timer 0 / 1 for Group A) + * + * Clock input is divided by (CP01 + 1) before it is fed to the corresponding PWM-timer. + * If CP01 = 0, the clock prescaler 0 output clock will be stopped. Thus the corresponding + * PWM timer will also be stopped. + * + * + * CP23 [8:15] + * Clock Prescaler 2 (PWM Timer2 / 3 for Group A) + * + * Clock input is divided by (CP23 + 1) before it is fed to the corresponding PWM-timer. + * If CP23 = 0, the clock prescaler 2 output clock will be stopped. Thus the corresponding + * PWM timer will also be stopped. + * + * + * DZI01 [16:23] + * Dead-zone Interval for Pair of Channel 0 and Channel 1 (PWM0 and PWM1 Pair + * for PWM Group A). These 8 bits determine dead-zone length. + * + * + * DZI23 [24:31] + * Dead-zone Interval for Pair of Channel 2 and Channel 3 (PWM2 and PWM3 Pair + * for PWM Group A). These 8 bits determine dead-zone length. + * + * For both DZI01 and DZI23: + * The unit time of dead-zone length is received from corresponding CSR bits. + * + */ + +/* PWM PPR Bit Field Definitions */ + +#define PWM_PPR_CP01_Pos 0 +#define PWM_PPR_CP01_Msk (0xFFul << PWM_PPR_CP01_Pos) +#define PWM_PPR_CP23_Pos 8 +#define PWM_PPR_CP23_Msk (0xFFul << PWM_PPR_CP23_Pos) +#define PWM_PPR_DZI01_Pos 16 +#define PWM_PPR_DZI01_Msk (0xFFul << PWM_PPR_DZI01_Pos) +#define PWM_PPR_DZI23_Pos 24 +#define PWM_PPR_DZI23_Msk (0xFFul << PWM_PPR_DZI23_Pos) + + +/** + * @brief PWM Controller (PWM) - Register CSR + * + * @description PWM Group A Clock Selection Register (CSR) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 246-247 + * + * CSR = PWMA_BA+0x04 + * + * + * CSR0 [0:2] + * PWM Timer 0 Clock Source Selection (PWM Timer 0 for Group A and PWM Timer + * 4 for Group B) + * + * Select clock input for PWM timer. + * + * CSRn [High->Low] | Input Clock Divided by + * ==================|========================= + * 100 | 1 + * 000 | 2 + * 001 | 4 + * 010 | 8 + * 011 | 16 + * + * + * CSR1 [0:2] + * PWM Timer 0 Clock Source Selection (PWM Timer 1 for Group A) + * + * Select clock input for PWM timer. + * + * CSR1 [High->Low] | Input Clock Divided by + * ==================|========================= + * 100 | 1 + * 000 | 2 + * 001 | 4 + * 010 | 8 + * 011 | 16 + * + * + * CSR2 [0:2] + * PWM Timer 2 Clock Source Selection (PWM Timer 2 for Group A) + * + * Select clock input for PWM timer. + * + * CSR2 [High->Low] | Input Clock Divided by + * ==================|========================= + * 100 | 1 + * 000 | 2 + * 001 | 4 + * 010 | 8 + * 011 | 16 + * + * + * CSR3 [12:14] + * PWM Timer 0 Clock Source Selection (PWM Timer 0 for Group A) + * + * Select clock input for PWM timer. + * + * CSR3 [High->Low] | Input Clock Divided by + * ==================|========================= + * 100 | 1 + * 000 | 2 + * 001 | 4 + * 010 | 8 + * 011 | 16 + * + */ + +#define PWM_CSR_CSR0_Pos 0 +#define PWM_CSR_CSR0_Msk (0b0111ul << PWM_CSR_CSR0_Pos) +// Bit 3 is Reserved. +#define PWM_CSR_CSR1_Pos 4 +#define PWM_CSR_CSR1_Msk (0b0111ul << PWM_CSR_CSR1_Pos) +// Bit 7 is Reserved. +#define PWM_CSR_CSR2_Pos 8 +#define PWM_CSR_CSR2_Msk (0b0111ul << PWM_CSR_CSR2_Pos) +// Bit 11 is Reserved. +#define PWM_CSR_CSR3_Pos 12 +#define PWM_CSR_CSR3_Msk (0b0111ul << PWM_CSR_CSR3_Pos) +// Bits 15-31 are Reserved. + + +/** + * @brief PWM Controller (PWM) - Register PCR + * + * @description PWM Group A Control Register (PCR) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 248-250 + * + * PCR = PWMA_BA+0x08 + * + * + * CH0EN [0] + * PWM-Timer 0 Enable (PWM timer 0 for group A) + * + * 1 = Corresponding PWM-Timer Start Run Enabled. + * 0 = Corresponding PWM-Timer Running Stopped. + * + * + * CH0PINV [1] + * PWM-Timer 0 Output Polar Inverse Enable (PWM Timer 0 for Group A) + * + * 1 = PWM0 output polar inverse Enabled. + * 0 = PWM0 output polar inverse Disabled. + * + * + * CH0INV [2] + * PWM-Timer 0 Output Inverter Enable (PWM Timer 0 for Group A) + * + * 1 = Inverter Enabled. + * 0 = Inverter Disabled. + * + * + * CH0MOD [3] + * PWM-Timer 0 Auto-reload/One-Shot Mode (PWM Timer 0 for Group A) + * + * 1 = Auto-reload mode. + * 0 = One-shot mode. + * + * Note: If there is a transition at this bit, it will cause CNR0 and CMR0 be clear. + * + * + * DZEN01 [4] + * Dead-Zone 0 Generator Enable (PWM0 and PWM1 Pair for PWM Group A ) + * + * 1 = Enabled. + * 0 = Disabled. + * + * Note: When dead-zone generator is enabled, the pair of PWM0 and PWM1 becomes a + * complementary pair for PWM group A. + * + * + * DZEN23 [5] + * Dead-Zone 2 Generator Enable (PWM2 and PWM3 Pair for PWM Group A) + * + * 1 = Enabled. + * 0 = Disabled. + * + * Note: When dead-zone generator is enabled, the pair of PWM2 and PWM3 becomes a + * complementary pair for PWM group A. + * + * + * CH1EN [8] + * PWM-Timer 1 Enable (PWM timer 1 for group A) + * + * 1 = Corresponding PWM-Timer Start Run Enabled. + * 0 = Corresponding PWM-Timer Running Stopped. + * + * + * CH1PINV [9] + * PWM-Timer 1 Output Polar Inverse Enable (PWM Timer 1 for Group A) + * + * 1 = PWM1 output polar inverse Enabled. + * 0 = PWM1 output polar inverse Disabled. + * + * + * CH1INV [10] + * PWM-Timer 1 Output Inverter Enable (PWM Timer 1 for Group A) + * + * 1 = Inverter Enabled. + * 0 = Inverter Disabled. + * + * + * CH1MOD [11] + * PWM-Timer 1 Auto-reload/One-Shot Mode (PWM Timer 1 for Group A) + * + * 1 = Auto-reload mode. + * 0 = One-shot mode. + * + * Note: If there is a transition at this bit, it will cause CNR1 and CMR1 be clear. + * + * + * CH2EN [16] + * PWM-Timer 2 Enable (PWM timer 2 for group A) + * + * 1 = Corresponding PWM-Timer Start Run Enabled. + * 0 = Corresponding PWM-Timer Running Stopped. + * + * + * CH2PINV [17] + * PWM-Timer 2 Output Polar Inverse Enable (PWM Timer 2 for Group A) + * + * 1 = PWM2 output polar inverse Enabled. + * 0 = PWM2 output polar inverse Disabled. + * + * + * CH2INV [18] + * PWM-Timer 2 Output Inverter Enable (PWM Timer 2 for Group A) + * + * 1 = Inverter Enabled. + * 0 = Inverter Disabled. + * + * + * CH2MOD [19] + * PWM-Timer 2 Auto-reload/One-Shot Mode (PWM Timer 2 for Group A) + * + * 1 = Auto-reload mode. + * 0 = One-shot mode. + * + * Note: If there is a transition at this bit, it will cause CNR2 and CMR2 be clear. + * + * + * CH3EN [24] + * PWM-Timer 3 Enable (PWM timer 3 for group A) + * + * 1 = Corresponding PWM-Timer Start Run Enabled. + * 0 = Corresponding PWM-Timer Running Stopped. + * + * + * CH3PINV [25] + * PWM-Timer 3 Output Polar Inverse Enable (PWM Timer 3 for Group A) + * + * 1 = PWM3 output polar inverse Enabled. + * 0 = PWM3 output polar inverse Disabled. + * + * + * CH3INV [26] + * PWM-Timer 3 Output Inverter Enable (PWM Timer 3 for Group A) + * + * 1 = Inverter Enabled. + * 0 = Inverter Disabled. + * + * + * CH3MOD [27] + * PWM-Timer 3 Auto-reload/One-Shot Mode (PWM Timer 3 for Group A) + * + * 1 = Auto-reload mode. + * 0 = One-shot mode. + * + * Note: If there is a transition at this bit, it will cause CNR3 and CMR3 be clear. + * + * + * PWMTYPE01 [30] + * PWM01 Aligned Type Selection Bit (PWM0 and PWM1 Pair for PWM Group A) + * + * 0 = Edge-aligned type. + * 1 = Center-aligned type. + * + * + * PWMTYPE23 [31] + * PWM23 Aligned Type Selection Bit (PWM2 and PWM3 Pair for PWM Group A) + * + * 0 = Edge-aligned type. + * 1 = Center-aligned type. + * + */ + +#define PWM_PCR_CH0EN_Pos 0 +#define PWM_PCR_CH0EN_Msk (0x01ul << PWM_PCR_CH0EN_Pos) +#define PWM_PCR_CH0PINV_Pos 1 +#define PWM_PCR_CH0PINV_Msk (0x01ul << PWM_PCR_CH0PINV_Pos) +#define PWM_PCR_CH0INV_Pos 2 +#define PWM_PCR_CH0INV_Msk (0x01ul << PWM_PCR_CH0INV_Pos) +#define PWM_PCR_CH0MOD_Pos 3 +#define PWM_PCR_CH0MOD_Msk (0x01ul << PWM_PCR_CH0MOD_Pos) +#define PWM_PCR_DZEN01_Pos 4 +#define PWM_PCR_DZEN01_Msk (0x01ul << PWM_PCR_DZEN01_Pos) +#define PWM_PCR_DZEN23_Pos 5 +#define PWM_PCR_DZEN23_Msk (0x01ul << PWM_PCR_DZEN23_Pos) +// Bits 6-7 are Reserved. +#define PWM_PCR_CH1EN_Pos 8 +#define PWM_PCR_CH1EN_Msk (0x01ul << PWM_PCR_CH1EN_Pos) +#define PWM_PCR_CH1PINV_Pos 9 +#define PWM_PCR_CH1PINV_Msk (0x01ul << PWM_PCR_CH1PINV_Pos) +#define PWM_PCR_CH1INV_Pos 10 +#define PWM_PCR_CH1INV_Msk (0x01ul << PWM_PCR_CH1INV_Pos) +#define PWM_PCR_CH1MOD_Pos 11 +#define PWM_PCR_CH1MOD_Msk (0x01ul << PWM_PCR_CH1MOD_Pos) +// Bits 12-15 are Reserved. +#define PWM_PCR_CH2EN_Pos 16 +#define PWM_PCR_CH2EN_Msk (0x01ul << PWM_PCR_CH2EN_Pos) +#define PWM_PCR_CH2PINV_Pos 17 +#define PWM_PCR_CH2PINV_Msk (0x01ul << PWM_PCR_CH2PINV_Pos) +#define PWM_PCR_CH2INV_Pos 18 +#define PWM_PCR_CH2INV_Msk (0x01ul << PWM_PCR_CH2INV_Pos) +#define PWM_PCR_CH2MOD_Pos 19 +#define PWM_PCR_CH2MOD_Msk (0x01ul << PWM_PCR_CH2MOD_Pos) +// Bits 20-23 are Reserved. +#define PWM_PCR_CH3EN_Pos 24 +#define PWM_PCR_CH3EN_Msk (0x01ul << PWM_PCR_CH3EN_Pos) +#define PWM_PCR_CH3PINV_Pos 25 +#define PWM_PCR_CH3PINV_Msk (0x01ul << PWM_PCR_CH3PINV_Pos) +#define PWM_PCR_CH3INV_Pos 26 +#define PWM_PCR_CH3INV_Msk (0x01ul << PWM_PCR_CH3INV_Pos) +#define PWM_PCR_CH3MOD_Pos 27 +#define PWM_PCR_CH3MOD_Msk (0x01ul << PWM_PCR_CH3MOD_Pos) +// Bits 28-29 are Reserved. +#define PWM_PCR_PWM01TYPE_Pos 30 +#define PWM_PCR_PWM01TYPE_Msk (0x01ul << PWM_PCR_PWM01TYPE_Pos) +#define PWM_PCR_PWM23TYPE_Pos 31 +#define PWM_PCR_PWM23TYPE_Msk (0x01ul << PWM_PCR_PWM23TYPE_Pos) + + +/** + * @brief PWM Controller (PWM) - Register CNR [0/1/2/3] + * + * @description PWM Group A Counter Register (CNR) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 251-252 + * + * CNR0 = PWMA_BA+0x0C + * CNR1 = PWMA_BA+0x18 + * CNR2 = PWMA_BA+0x24 + * CNR3 = PWMA_BA+0x30 + * + * + * PWM Timer Loaded Value + * CNR determines the PWM period. + * + * PWM frequency = PWMxy_CLK/[(prescale+1)*(clock divider)*(CNR+1)] + * where xy could be 01, 23, depending on the selected PWM channel. + * + * For Edge-aligned mode: + * - Duty ratio = (CMR+1)/(CNR+1). + * - CMR >= CNR: PWM output is always high. + * - CMR < CNR: PWM low width = (CNR-CMR) unit; PWM high width = (CMR+1) unit. + * - CMR = 0: PWM low width = (CNR) unit; PWM high width = 1 unit + * + * For Center-aligned mode: + * - Duty ratio = [(2 x CMR) + 1]/[2 x (CNR+1)]. + * - CMR > CNR: PWM output is always high. + * - CMR <= CNR: PWM low width = 2 x (CNR-CMR) + 1 unit; PWM high width = (2 x CMR) + 1 unit. + * - CMR = 0: PWM low width = 2 x CNR + 1 unit; PWM high width = 1 unit + * + * (1 Unit = one PWM clock cycle) + * + * + * Note: Any write to CNR will take effect in the next PWM cycle. + * Note: When CNR value is set to 0, PWM output is always high. + * + * Note: When PWM operating at center-aligned type, CNR value should be set between + * 0x0000 to 0xFFFE. If CNR equal to 0xFFFF, the PWM will work unpredictable. + * + * Note: This one define should be used with the correct CNRn memory map offset from above. + * + */ + +#define PWM_CNR_CNR_Pos 0 +#define PWM_CNR_CNR_Msk (0xFFFFul << PWM_CNR_CNR_Pos) +// Bits 16-31 are Reserved. + +/** + * @brief PWM Controller (PWM) - Register CMR [0/1/2/3] + * + * @description PWM Group A Comparator Register (CMR) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 253 + * + * CMR0 = PWMA_BA+0x10 + * CMR1 = PWMA_BA+0x1C + * CMR2 = PWMA_BA+0x28 + * CMR3 = PWMA_BA+0x34 + * + * + * PWM Comparator Register + * CMR determines the PWM duty. + * + * PWM frequency = PWMxy_CLK/[(prescale+1)*(clock divider)*(CNR+1)]; where xy + * could be 01, 23, 45 or 67, depending on the selected PWM channel. + * + * For Edge-aligned mode: + * - Duty ratio = (CMR+1)/(CNR+1). + * - CMR >= CNR: PWM output is always high. + * - CMR < CNR: PWM low width = (CNR-CMR) unit; PWM high width = (CMR+1) unit. + * - CMR = 0: PWM low width = (CNR) unit; PWM high width = 1 unit + * + * For Center-aligned mode: + * - Duty ratio = [(2 x CMR) + 1]/[2 x (CNR+1)]. + * - CMR > CNR: PWM output is always high. + * - CMR <= CNR: PWM low width = 2 x (CNR-CMR) + 1 unit; PWM high width = (2 x CMR) + 1 unit. + * - CMR = 0: PWM low width = 2 x CNR + 1 unit; PWM high width = 1 unit + * + * (1 Unit = one PWM clock cycle) + * + * Note: Any write to CMR will take effect in the next PWM cycle. + * + * Note: This one define should be used with the correct CMRn memory map offset from above. + * + */ + +#define PWM_CMR_CMR_Pos 0 +#define PWM_CMR_CMR_Msk (0xFFFFul << PWM_CMR_CMR_Pos) +// Bits 16-31 are Reserved. + + +/** + * @brief PWM Controller (PWM) - Register PDR [0/1/2/3] + * + * @description PWM Group A Data Register (PDR) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 254 + * + * PDR0 = PWMA_BA+0x14 + * PDR1 = PWMA_BA+0x20 + * PDR2 = PWMA_BA+0x2C + * PDR3 = PWMA_BA+0x38 + * + * + * PWM Data Register + * Software can monitor PDR to know the current value of the 16-bit down counter. + * + * Note: This one define should be used with the correct PDRn memory map offset from above. + * + */ + +#define PWM_PDR_PDR_Pos 0 +#define PWM_PDR_PDR_Msk (0xFFFFul << PWM_PDR_PDR_Pos) +// Bits 16-31 are Reserved. + + +/** + * @brief PWM Controller (PWM) - Register PIER + * + * @description PWM Group A Interrupt Enable Register (PIER) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 255-256 + * + * PIER = PWMA_BA+0x40 + * + * + * PWMIE0 [0] + * PWM Channel 0 Interrupt Enable + * + * 1 = Enabled. + * 0 = Disabled. + * + * + * PWMIE1 [1] + * PWM Channel 1 Interrupt Enable + * + * 1 = Enabled. + * 0 = Disabled. + * + * + * PWMIE2 [2] + * PWM Channel 2 Interrupt Enable + * + * 1 = Enabled. + * 0 = Disabled. + * + * + * PWMIE3 [3] + * PWM Channel 3 Interrupt Enable + * + * 1 = Enabled. + * 0 = Disabled. + * + * + * PWMDIE0 [8] + * PWM Channel 0 Duty Interrupt Enable + * + * 1 = Enabled. + * 0 = Disabled. + * + * + * PWMDIE1 [9] + * PWM Channel 1 Duty Interrupt Enable + * + * 1 = Enabled. + * 0 = Disabled. + * + * + * PWMDIE2 [10] + * PWM Channel 2 Duty Interrupt Enable + * + * 1 = Enabled. + * 0 = Disabled. + * + * + * PWMDIE3 [11] + * PWM Channel 3 Duty Interrupt Enable + * + * 1 = Enabled. + * 0 = Disabled. + * + * + * INTTYPE01 [16] + * PWM01 Interrupt Type Selection Bit (PWM0 and PWM1 Pair for PWM Group A) + * + * 1 = PWMIFn will be set if PWM counter matches CNRn register. + * 0 = PWMIFn will be set if PWM counter underflow. + * + * Note: This bit is effective when PWM in central align mode only. + * + * + * INTTYPE23 [17] + * PWM12 Interrupt Type Selection Bit (PWM2 and PWM3 Pair for PWM Group A) + * + * 1 = PWMIFn will be set if PWM counter matches CNRn register. + * 0 = PWMIFn will be set if PWM counter underflow. + * + * Note: This bit is effective when PWM in central align mode only. + * + */ + +#define PWM_PIER_PWMIE0_Pos 0 +#define PWM_PIER_PWMIE0_Msk (0x01ul << PWM_PIER_PWMIE0_Pos) +#define PWM_PIER_PWMIE1_Pos 1 +#define PWM_PIER_PWMIE1_Msk (0x01ul << PWM_PIER_PWMIE1_Pos) +#define PWM_PIER_PWMIE2_Pos 2 +#define PWM_PIER_PWMIE2_Msk (0x01ul << PWM_PIER_PWMIE2_Pos) +#define PWM_PIER_PWMIE3_Pos 3 +#define PWM_PIER_PWMIE3_Msk (0x01ul << PWM_PIER_PWMIE3_Pos) +// Bits 4-7 are Reserved. +#define PWM_PIER_PWMDIE0_Pos 8 +#define PWM_PIER_PWMDIE0_Msk (0x01ul << PWM_PIER_PWMDIE0_Pos) +#define PWM_PIER_PWMDIE1_Pos 9 +#define PWM_PIER_PWMDIE1_Msk (0x01ul << PWM_PIER_PWMDIE1_Pos) +#define PWM_PIER_PWMDIE2_Pos 10 +#define PWM_PIER_PWMDIE2_Msk (0x01ul << PWM_PIER_PWMDIE2_Pos) +#define PWM_PIER_PWMDIE3_Pos 11 +#define PWM_PIER_PWMDIE3_Msk (0x01ul << PWM_PIER_PWMDIE3_Pos) +// Bits 12-15 are Reserved. +#define PWM_PIER_INT01TYPE_Pos 16 +#define PWM_PIER_INT01TYPE_Msk (0x01ul << PWM_PIER_INT01TYPE_Pos) +#define PWM_PIER_INT23TYPE_Pos 17 +#define PWM_PIER_INT23TYPE_Msk (0x01ul << PWM_PIER_INT23TYPE_Pos) +// Bits 18-31 are Reserved. + + +/** + * @brief PWM Controller (PWM) - Register PIIR + * + * @description PWM Group A Interrupt Indication Register (PIIR) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 257-258 + * + * PIIR = PWMA_BA+0x44 + * + * + * PWMIF0 [0] + * PWM channel 0 Interrupt Status + * + * This bit is set by hardware when PWM0 counter reaches the requirement of interrupt + * (depending on INTTYPE01 bit of PIER register) if PWM0 interrupt enable bit (PWMIE0) + * is 1, software can write 1 to clear this bit to zero. + * + * + * PWMIF1 [1] + * PWM channel 1 Interrupt Status + * + * This bit is set by hardware when PWM1 counter reaches the requirement of interrupt + * (depending on INTTYPE01 bit of PIER register) if PWM1 interrupt enable bit (PWMIE1) + * is 1, software can write 1 to clear this bit to zero. + * + * + * PWMIF2 [2] + * PWM channel 2 Interrupt Status + * + * This bit is set by hardware when PWM2 counter reaches the requirement of interrupt + * (depending on INTTYPE23 bit of PIER register) if PWM2 interrupt enable bit (PWMIE2) + * is 1, software can write 1 to clear this bit to zero. + * + * + * PWMIF3 [3] + * PWM channel 3 Interrupt Status + * + * This bit is set by hardware when PWM3 counter reaches the requirement of interrupt + * (depending on INTTYPE23 bit of PIER register) if PWM3 interrupt enable bit (PWMIE3) + * is 1, software can write 1 to clear this bit to zero. + * + * + * PWMDIF0 [8] + * PWM channel 0 Duty Interrupt Flag + * + * Flag is set by hardware when channel 0 PWM counter down-count and reaches CMR0. + * Software can clear this bit by writing a 1. + * + * Note: If CMR is equal to CNR, this flag will not function. + * + * + * PWMDIF1 [9] + * PWM channel 1 Duty Interrupt Flag + * + * Flag is set by hardware when channel 1 PWM counter down-count and reaches CMR1. + * Software can clear this bit by writing a 1. + * + * Note: If CMR is equal to CNR, this flag will not function. + * + * + * PWMDIF2 [10] + * PWM channel 2 Duty Interrupt Flag + * + * Flag is set by hardware when channel 2 PWM counter down-count and reaches CMR2. + * Software can clear this bit by writing a 1. + * + * Note: If CMR is equal to CNR, this flag will not function. + * + * + * PWMDIF3 [11] + * PWM channel 3 Duty Interrupt Flag + * + * Flag is set by hardware when channel 3 PWM counter down-count and reaches CMR3. + * Software can clear this bit by writing a 1. + * + * Note: If CMR is equal to CNR, this flag will not function. + * + */ + +#define PWM_PIIR_PWMIF0_Pos 0 +#define PWM_PIIR_PWMIF0_Msk (0x01ul << PWM_PIIR_PWMIF0_Pos) +#define PWM_PIIR_PWMIF1_Pos 1 +#define PWM_PIIR_PWMIF1_Msk (0x01ul << PWM_PIIR_PWMIF1_Pos) +#define PWM_PIIR_PWMIF2_Pos 2 +#define PWM_PIIR_PWMIF2_Msk (0x01ul << PWM_PIIR_PWMIF2_Pos) +#define PWM_PIIR_PWMIF3_Pos 3 +#define PWM_PIIR_PWMIF3_Msk (0x01ul << PWM_PIIR_PWMIF3_Pos) +// Bits 4-7 are Reserved. +#define PWM_PIIR_PWMDIF0_Pos 8 +#define PWM_PIIR_PWMDIF0_Msk (0x01ul << PWM_PIIR_PWMDIF0_Pos) +#define PWM_PIIR_PWMDIF1_Pos 9 +#define PWM_PIIR_PWMDIF1_Msk (0x01ul << PWM_PIIR_PWMDIF1_Pos) +#define PWM_PIIR_PWMDIF2_Pos 10 +#define PWM_PIIR_PWMDIF2_Msk (0x01ul << PWM_PIIR_PWMDIF2_Pos) +#define PWM_PIIR_PWMDIF3_Pos 11 +#define PWM_PIIR_PWMDIF3_Msk (0x01ul << PWM_PIIR_PWMDIF3_Pos) +// Bits 12-31 are Reserved. + + +/** + * @brief PWM Controller (PWM) - Register CCR0 + * + * @description PWM Group A Capture Control Register (CCR0) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 259-261 + * + * CCR0 = PWMA_BA+0x50 + * + * + * INV0 [0] + * Channel 0 Inverter Enable + * + * 1 = Inverter Enabled. Reverse the input signal from GPIO before fed to Capture timer + * 0 = Inverter Disabled + * + * + * CRL_IE0 [1] + * Channel 0 Rising Latch Interrupt Enable + * + * 1 = Rising latch interrupt Enabled. + * 0 = Rising latch interrupt Disabled. + * + * When Enabled, if capture detects PWM group channel 0 has rising transition, capture + * issues an Interrupt. + * + * + * CFL_IE0 [2] + * Channel 0 Falling Latch Interrupt Enable + * + * 1 = Falling latch interrupt Enabled. + * 0 = Falling latch interrupt Disabled. + * + * When Enabled, if capture detects PWM group channel 0 has falling transition, capture + * issues an Interrupt. + * + * + * CAPCH0EN [3] + * Channel 0 Capture Function Enable + * + * 1 = Capture function on PWM group channel 0 Enabled. + * 0 = Capture function on PWM group channel 0 Disabled. + * + * When Enabled, Capture latched the PWM-counter value and saved to CRLR (Rising + * latch) and CFLR (Falling latch). + * When Disabled, capture does not update CRLR and CFLR, and disable PWM group + * channel 0 Interrupt. + * + * + * CAPIF0 [4] + * Channel 0 Capture Interrupt Indication Flag + * + * If PWM group channel 0 rising latch interrupt is enabled (CRL_IE0=1), a rising + * transition occurs at PWM group channel 0 will result in CAPIF0 to high. + * A falling transition will cause CAPIF0 to be set high if PWM group channel 0 falling latch + * interrupt is enabled (CFL_IE0=1). + * + * Write 1 to clear this bit. + * + * + * CRLRI0 [6] + * CRLR0 Latched Indicator Bit + * + * When PWM group input channel 0 has a rising transition, CRLR0 was latched with the + * value of PWM down-counter and this bit is set by hardware. + * Software can write 0 to clear this bit if BCn bit is 0, and can write 1 to clear this + * bit if BCn bit is 1. + * + * + * CFLRI0 [7] + * CFLR0 Latched Indicator Bit + * + * When PWM group input channel 0 has a falling transition, CFLR0 was latched with the + * value of PWM down-counter and this bit is set by hardware. + * Software can write 0 to clear this bit if BCn bit is 0, and can write 1 to clear this + * bit if BCn bit is 1. + * + * + * INV1 [16] + * Channel 1 Inverter Enable + * + * 1 = Inverter Enabled. Reverse the input signal from GPIO before fed to Capture timer + * 0 = Inverter Disabled + * + * + * CRL_IE1 [17] + * Channel 1 Rising Latch Interrupt Enable + * + * 1 = Rising latch interrupt Enabled. + * 0 = Rising latch interrupt Disabled. + * + * When Enabled, if capture detects PWM group channel 1 has rising transition, capture + * issues an Interrupt. + * + * + * CFL_IE1 [18] + * Channel 1 Falling Latch Interrupt Enable + * + * 1 = Falling latch interrupt Enabled. + * 0 = Falling latch interrupt Disabled. + * + * When Enabled, if capture detects PWM group channel 1 has falling transition, capture + * issues an Interrupt. + * + * + * CAPCH1EN [19] + * Channel 1 Capture Function Enable + * + * 1 = Capture function on PWM group channel 1 Enabled. + * 0 = Capture function on PWM group channel 1 Disabled. + * + * When Enabled, Capture latched the PWM-counter value and saved to CRLR (Rising + * latch) and CFLR (Falling latch). + * When Disabled, capture does not update CRLR and CFLR, and disable PWM group + * channel 1 Interrupt. + * + * + * CAPIF1 [20] + * Channel 1 Capture Interrupt Indication Flag + * + * If PWM group channel 1 rising latch interrupt is enabled (CRL_IE1=1), a rising + * transition occurs at PWM group channel 1 will result in CAPIF1 to high. + * A falling transition will cause CAPIF1 to be set high if PWM group channel 1 falling latch + * interrupt is enabled (CFL_IE1=1). + * + * Write 1 to clear this bit. + * + * + * CRLRI1 [22] + * CRLR1 Latched Indicator Bit + * + * When PWM group input channel 1 has a rising transition, CRLR1 was latched with the + * value of PWM down-counter and this bit is set by hardware. + * Software can write 0 to clear this bit if BCn bit is 0, and can write 1 to clear this + * bit if BCn bit is 1. + * + * + * CFLRI1 [23] + * CFLR1 Latched Indicator Bit + * + * When PWM group input channel 1 has a falling transition, CFLR1 was latched with the + * value of PWM down-counter and this bit is set by hardware. + * Software can write 0 to clear this bit if BCn bit is 0, and can write 1 to clear this + * bit if BCn bit is 1. + * + */ + +#define PWM_CCR0_INV0_Pos 0 +#define PWM_CCR0_INV0_Msk (0x01ul << PWM_CCR0_INV0_Pos) +#define PWM_CCR0_CRL_IE0_Pos 1 +#define PWM_CCR0_CRL_IE0_Msk (0x01ul << PWM_CCR0_CRL_IE0_Pos) +#define PWM_CCR0_CFL_IE0_Pos 2 +#define PWM_CCR0_CFL_IE0_Msk (0x01ul << PWM_CCR0_CFL_IE0_Pos) +#define PWM_CCR0_CAPCH0EN_Pos 3 +#define PWM_CCR0_CAPCH0EN_Msk (0x01ul << PWM_CCR0_CAPCH0EN_Pos) +#define PWM_CCR0_CAPIF0_Pos 4 +#define PWM_CCR0_CAPIF0_Msk (0x01ul << PWM_CCR0_CAPIF0_Pos) +// Bit 5 is Reserved. +#define PWM_CCR0_CRLRI0_Pos 6 +#define PWM_CCR0_CRLRI0_Msk (0x01ul << PWM_CCR0_CRLRI0_Pos) +#define PWM_CCR0_CFLRI0_Pos 7 +#define PWM_CCR0_CFLRI0_Msk (0x01ul << PWM_CCR0_CFLRI0_Pos) +// Bits 8-15 are Reserved. +#define PWM_CCR0_INV1_Pos 16 +#define PWM_CCR0_INV1_Msk (0x01ul << PWM_CCR0_INV1_Pos) +#define PWM_CCR0_CRL_IE1_Pos 17 +#define PWM_CCR0_CRL_IE1_Msk (0x01ul << PWM_CCR0_CRL_IE1_Pos) +#define PWM_CCR0_CFL_IE1_Pos 18 +#define PWM_CCR0_CFL_IE1_Msk (0x01ul << PWM_CCR0_CFL_IE1_Pos) +#define PWM_CCR0_CAPCH1EN_Pos 19 +#define PWM_CCR0_CAPCH1EN_Msk (0x01ul << PWM_CCR0_CAPCH1EN_Pos) +#define PWM_CCR0_CAPIF1_Pos 20 +#define PWM_CCR0_CAPIF1_Msk (0x01ul << PWM_CCR0_CAPIF1_Pos) +// Bit 21 is Reserved. +#define PWM_CCR0_CRLRI1_Pos 22 +#define PWM_CCR0_CRLRI1_Msk (0x01ul << PWM_CCR0_CRLRI1_Pos) +#define PWM_CCR0_CFLRI1_Pos 23 +#define PWM_CCR0_CFLRI1_Msk (0x01ul << PWM_CCR0_CFLRI1_Pos) +// Bits 24-31 are Reserved. + + +/** + * @brief PWM Controller (PWM) - Register CCR2 + * + * @description PWM Group A Capture Control Register (CCR2) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 262-264 + * + * CCR2 = PWMA_BA+0x54 + * + * + * INV2 [0] + * Channel 2 Inverter Enable + * + * 1 = Inverter Enabled. Reverse the input signal from GPIO before fed to Capture timer + * 0 = Inverter Disabled + * + * + * CRL_IE2 [1] + * Channel 2 Rising Latch Interrupt Enable + * + * 1 = Rising latch interrupt Enabled. + * 0 = Rising latch interrupt Disabled. + * + * When Enabled, if capture detects PWM group channel 2 has rising transition, capture + * issues an Interrupt. + * + * + * CFL_IE2 [2] + * Channel 2 Falling Latch Interrupt Enable + * + * 1 = Falling latch interrupt Enabled. + * 0 = Falling latch interrupt Disabled. + * + * When Enabled, if capture detects PWM group channel 2 has falling transition, capture + * issues an Interrupt. + * + * + * CAPCH2EN [3] + * Channel 2 Capture Function Enable + * + * 1 = Capture function on PWM group channel 2 Enabled. + * 0 = Capture function on PWM group channel 2 Disabled. + * + * When Enabled, Capture latched the PWM-counter value and saved to CRLR (Rising + * latch) and CFLR (Falling latch). + * When Disabled, capture does not update CRLR and CFLR, and disable PWM group + * channel 2 Interrupt. + * + * + * CAPIF2 [4] + * Channel 2 Capture Interrupt Indication Flag + * + * If PWM group channel 2 rising latch interrupt is enabled (CRL_IE2=1), a rising + * transition occurs at PWM group channel 2 will result in CAPIF2 to high. + * A falling transition will cause CAPIF2 to be set high if PWM group channel 2 falling latch + * interrupt is enabled (CFL_IE2=1). + * + * Write 1 to clear this bit. + * + * + * CRLRI2 [6] + * CRLR2 Latched Indicator Bit + * + * When PWM group input channel 2 has a rising transition, CRLR2 was latched with the + * value of PWM down-counter and this bit is set by hardware. + * Software can write 0 to clear this bit if BCn bit is 0, and can write 1 to clear this + * bit if BCn bit is 1. + * + * + * CFLRI2 [7] + * CFLR2 Latched Indicator Bit + * + * When PWM group input channel 2 has a falling transition, CFLR2 was latched with the + * value of PWM down-counter and this bit is set by hardware. + * Software can write 0 to clear this bit if BCn bit is 0, and can write 1 to clear this + * bit if BCn bit is 1. + * + * + * INV3 [16] + * Channel 3 Inverter Enable + * + * 1 = Inverter Enabled. Reverse the input signal from GPIO before fed to Capture timer + * 0 = Inverter Disabled + * + * + * CRL_IE3 [17] + * Channel 3 Rising Latch Interrupt Enable + * + * 1 = Rising latch interrupt Enabled. + * 0 = Rising latch interrupt Disabled. + * + * When Enabled, if capture detects PWM group channel 3 has rising transition, capture + * issues an Interrupt. + * + * + * CFL_IE3 [18] + * Channel 3 Falling Latch Interrupt Enable + * + * 1 = Falling latch interrupt Enabled. + * 0 = Falling latch interrupt Disabled. + * + * When Enabled, if capture detects PWM group channel 3 has falling transition, capture + * issues an Interrupt. + * + * + * CAPCH3EN [19] + * Channel 3 Capture Function Enable + * + * 1 = Capture function on PWM group channel 3 Enabled. + * 0 = Capture function on PWM group channel 3 Disabled. + * + * When Enabled, Capture latched the PWM-counter value and saved to CRLR (Rising + * latch) and CFLR (Falling latch). + * When Disabled, capture does not update CRLR and CFLR, and disable PWM group + * channel 3 Interrupt. + * + * + * CAPIF3 [20] + * Channel 3 Capture Interrupt Indication Flag + * + * If PWM group channel 3 rising latch interrupt is enabled (CRL_IE3=1), a rising + * transition occurs at PWM group channel 3 will result in CAPIF3 to high. + * A falling transition will cause CAPIF3 to be set high if PWM group channel 3 falling latch + * interrupt is enabled (CFL_IE3=1). + * + * Write 1 to clear this bit. + * + * + * CRLRI3 [22] + * CRLR3 Latched Indicator Bit + * + * When PWM group input channel 3 has a rising transition, CRLR3 was latched with the + * value of PWM down-counter and this bit is set by hardware. + * Software can write 0 to clear this bit if BCn bit is 0, and can write 1 to clear this + * bit if BCn bit is 1. + * + * + * CFLRI3 [23] + * CFLR3 Latched Indicator Bit + * + * When PWM group input channel 3 has a falling transition, CFLR3 was latched with the + * value of PWM down-counter and this bit is set by hardware. + * Software can write 0 to clear this bit if BCn bit is 0, and can write 1 to clear this + * bit if BCn bit is 1. + * + */ + +#define PWM_CCR2_INV2_Pos 0 +#define PWM_CCR2_INV2_Msk (0x01ul << PWM_CCR2_INV2_Pos) +#define PWM_CCR2_CRL_IE2_Pos 1 +#define PWM_CCR2_CRL_IE2_Msk (0x01ul << PWM_CCR2_CRL_IE2_Pos) +#define PWM_CCR2_CFL_IE2_Pos 2 +#define PWM_CCR2_CFL_IE2_Msk (0x01ul << PWM_CCR2_CFL_IE2_Pos) +#define PWM_CCR2_CAPCH2EN_Pos 3 +#define PWM_CCR2_CAPCH2EN_Msk (0x01ul << PWM_CCR2_CAPCH2EN_Pos) +#define PWM_CCR2_CAPIF2_Pos 4 +#define PWM_CCR2_CAPIF2_Msk (0x01ul << PWM_CCR2_CAPIF2_Pos) +// Bit 5 is Reserved. +#define PWM_CCR2_CRLRI2_Pos 6 +#define PWM_CCR2_CRLRI2_Msk (0x01ul << PWM_CCR2_CRLRI2_Pos) +#define PWM_CCR2_CFLRI2_Pos 7 +#define PWM_CCR2_CFLRI2_Msk (0x01ul << PWM_CCR2_CFLRI2_Pos) +// Bits 8-15 are Reserved. +#define PWM_CCR2_INV3_Pos 16 +#define PWM_CCR2_INV3_Msk (0x01ul << PWM_CCR2_INV3_Pos) +#define PWM_CCR2_CRL_IE3_Pos 17 +#define PWM_CCR2_CRL_IE3_Msk (0x01ul << PWM_CCR2_CRL_IE3_Pos) +#define PWM_CCR2_CFL_IE3_Pos 18 +#define PWM_CCR2_CFL_IE3_Msk (0x01ul << PWM_CCR2_CFL_IE3_Pos) +#define PWM_CCR2_CAPCH3EN_Pos 19 +#define PWM_CCR2_CAPCH3EN_Msk (0x01ul << PWM_CCR2_CAPCH3EN_Pos) +#define PWM_CCR2_CAPIF3_Pos 20 +#define PWM_CCR2_CAPIF3_Msk (0x01ul << PWM_CCR2_CAPIF3_Pos) +// Bit 21 is Reserved. +#define PWM_CCR2_CRLRI3_Pos 22 +#define PWM_CCR2_CRLRI3_Msk (0x01ul << PWM_CCR2_CRLRI3_Pos) +#define PWM_CCR2_CFLRI3_Pos 23 +#define PWM_CCR2_CFLRI3_Msk (0x01ul << PWM_CCR2_CFLRI3_Pos) +// Bits 24-31 are Reserved. + + +/** + * @brief PWM Controller (PWM) - Register CRLR [0/1/2/3] + * + * @description PWM Group A Capture Rising Latch Register (CRLR) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 265 + * + * CRLR0 = PWMA_BA+0x58 + * CRLR1 = PWMA_BA+0x60 + * CRLR2 = PWMA_BA+0x68 + * CRLR3 = PWMA_BA+0x70 + * + * + * Capture Rising Latch Register + * Latch the PWM counter when Channel 0/1/2/3 has a Rising transition. + * + * Note: This one define should be used with the correct CRLRn memory map offset from above. + * + */ + +#define PWM_CRLR_CRLR_Pos 0 +#define PWM_CRLR_CRLR_Msk (0xFFFFul << PWM_CRLR_CRLR_Pos) +// Bits 16-31 are Reserved. + + +/** + * @brief PWM Controller (PWM) - Register CFLR [0/1/2/3] + * + * @description PWM Group A Capture Falling Latch Register (CFLR) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 266 + * + * CFLR0 = PWMA_BA+0x5C + * CFLR1 = PWMA_BA+0x64 + * CFLR2 = PWMA_BA+0x6C + * CFLR3 = PWMA_BA+0x74 + * + * + * Capture Falling Latch Register + * Latch the PWM counter when Channel 0/1/2/3 has a Falling transition. + * + * Note: This one define should be used with the correct CFLRn memory map offset from above. + * + */ + +#define PWM_CFLR_CFLR_Pos 0 +#define PWM_CFLR_CFLR_Msk (0xFFFFul << PWM_CFLR_CFLR_Pos) +// Bits 16-31 are Reserved. + + +/** + * @brief PWM Controller (PWM) - Register CAPENR + * + * @description PWM Group A Capture Input Enable Register (CAPENR) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 267 + * + * CAPENR = PWMA_BA+0x78 + * + * + * Capture Input Enable Register + * + * There are four capture inputs from pad. Bit0~Bit3 are used to control each input enable + * or disable. + * + * 0 = Disabled (PWMx multi-function pin input does not affect input capture function.) + * 1 = Enabled (PWMx multi-function pin input will affect its input capture function.) + * + * Bit 3210 for PWM group A + * Bit xxx1 -> Capture channel 0 is from pin PA.12 + * Bit xx1x -> Capture channel 1 is from pin PA.13 + * Bit x1xx -> Capture channel 2 is from pin PA.14 + * Bit 1xxx -> Capture channel 3 is from pin PA.15 + * + */ + +#define PWM_CAPENR_CAPENR_Pos 0 +#define PWM_CAPENR_CAPENR_Msk (0x0Ful << PWM_CAPENR_CAPENR_Pos) +// Bits 4-31 are Reserved. + + +/** + * @brief PWM Controller (PWM) - Register POE + * + * @description PWM Group A Output Enable Register (POE) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 268 + * + * POE = PWMA_BA+0x7C + * + * + * PWM0 [0] + * Channel 0 Output Enable Register + * + * 1 = PWM channel 0 output to pin Enabled. + * 0 = PWM channel 0 output to pin Disabled. + * + * + * PWM1 [1] + * Channel 1 Output Enable Register + * + * 1 = PWM channel 1 output to pin Enabled. + * 0 = PWM channel 1 output to pin Disabled. + * + * + * PWM2 [2] + * Channel 2 Output Enable Register + * + * 1 = PWM channel 2 output to pin Enabled. + * 0 = PWM channel 2 output to pin Disabled. + * + * + * PWM3 [3] + * Channel 3 Output Enable Register + * + * 1 = PWM channel 3 output to pin Enabled. + * 0 = PWM channel 3 output to pin Disabled. + * + * Note: The corresponding GPIO pin must also be switched to PWM function for + * each needed PWM channel. + * + */ + +#define PWM_POE_PWM0_Pos 0 +#define PWM_POE_PWM0_Msk (0x01ul << PWM_POE_PWM0_Pos) +#define PWM_POE_PWM1_Pos 1 +#define PWM_POE_PWM1_Msk (0x01ul << PWM_POE_PWM1_Pos) +#define PWM_POE_PWM2_Pos 2 +#define PWM_POE_PWM2_Msk (0x01ul << PWM_POE_PWM2_Pos) +#define PWM_POE_PWM3_Pos 3 +#define PWM_POE_PWM3_Msk (0x01ul << PWM_POE_PWM3_Pos) +// Bits 4-31 are Reserved. + + +/** + * @brief PWM Controller (PWM) - Register TCON + * + * @description PWM Group A Trigger Control Register (TCON) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 269-270 + * + * TCON = PWMA_BA+0x80 + * + * + * PWM0TEN [0] + * Channel 0 Center-Aligned Trigger Enable Register + * + * 1 = PWM channel 0 trigger ADC function Enabled. + * 0 = PWM channel 0 trigger ADC function Disabled. + * + * PWM can trigger ADC to start conversion when PWM counter counts up to CNR + * if this bit is set to 1. + * + * + * PWM1TEN [1] + * Channel 1 Center-Aligned Trigger Enable Register + * + * 1 = PWM channel 1 trigger ADC function Enabled. + * 0 = PWM channel 1 trigger ADC function Disabled. + * + * PWM can trigger ADC to start conversion when PWM counter counts up to CNR + * if this bit is set to 1. + * + * + * PWM2TEN [2] + * Channel 2 Center-Aligned Trigger Enable Register + * + * 1 = PWM channel 2 trigger ADC function Enabled. + * 0 = PWM channel 2 trigger ADC function Disabled. + * + * PWM can trigger ADC to start conversion when PWM counter counts up to CNR + * if this bit is set to 1. + * + * + * PWM3TEN [3] + * Channel 3 Center-Aligned Trigger Enable Register + * + * 1 = PWM channel 3 trigger ADC function Enabled. + * 0 = PWM channel 3 trigger ADC function Disabled. + * + * PWM can trigger ADC to start conversion when PWM counter counts up to CNR + * if this bit is set to 1. + * + * + * Note: These functions are only supported when the relevant PWM is operating in + * Center-aligned mode. + * + */ + +#define PWM_TCON_PWM0TEN_Pos 0 +#define PWM_TCON_PWM0TEN_Msk (0x01ul << PWM_TCON_PWM0TEN_Pos) +#define PWM_TCON_PWM1TEN_Pos 1 +#define PWM_TCON_PWM1TEN_Msk (0x01ul << PWM_TCON_PWM1TEN_Pos) +#define PWM_TCON_PWM2TEN_Pos 2 +#define PWM_TCON_PWM2TEN_Msk (0x01ul << PWM_TCON_PWM2TEN_Pos) +#define PWM_TCON_PWM3TEN_Pos 3 +#define PWM_TCON_PWM3TEN_Msk (0x01ul << PWM_TCON_PWM3TEN_Pos) +// Bits 4-31 are Reserved. + + +/** + * @brief PWM Controller (PWM) - Register TSTATUS + * + * @description PWM Group A Trigger Status Register (TSTATUS) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 271 + * + * TSTATUS = PWMA_BA+0x84 + * + * + * PWM0TF [0] + * Channel 0 Center-aligned Trigger Flag + * + * For Center-aligned operating mode, this bit is set to 1 by hardware when PWM + * counter up count to CNR if PWM0TEN bit is set to 1. After this bit is set to 1, ADC + * will start conversion if ADC triggered source is selected by PWM. + * + * + * PWM1TF [1] + * Channel 1 Center-aligned Trigger Flag + * + * For Center-aligned operating mode, this bit is set to 1 by hardware when PWM + * counter up count to CNR if PWM1TEN bit is set to 1. After this bit is set to 1, ADC + * will start conversion if ADC triggered source is selected by PWM. + * + * + * PWM2TF [2] + * Channel 2 Center-aligned Trigger Flag + * + * For Center-aligned operating mode, this bit is set to 1 by hardware when PWM + * counter up count to CNR if PWM2TEN bit is set to 1. After this bit is set to 1, ADC + * will start conversion if ADC triggered source is selected by PWM. + * + * + * PWM3TF [3] + * Channel 3 Center-aligned Trigger Flag + * + * For Center-aligned operating mode, this bit is set to 1 by hardware when PWM + * counter up count to CNR if PWM3TEN bit is set to 1. After this bit is set to 1, ADC + * will start conversion if ADC triggered source is selected by PWM. + * + * + * Software can write 1 to each of these bits to clear. + * + */ + +#define PWM_TSTATUS_PWM0TF_Pos 0 +#define PWM_TSTATUS_PWM0TF_Msk (0x01ul << PWM_TSTATUS_PWM0TF_Pos) +#define PWM_TSTATUS_PWM1TF_Pos 1 +#define PWM_TSTATUS_PWM1TF_Msk (0x01ul << PWM_TSTATUS_PWM1TF_Pos) +#define PWM_TSTATUS_PWM2TF_Pos 2 +#define PWM_TSTATUS_PWM2TF_Msk (0x01ul << PWM_TSTATUS_PWM2TF_Pos) +#define PWM_TSTATUS_PWM3TF_Pos 3 +#define PWM_TSTATUS_PWM3TF_Msk (0x01ul << PWM_TSTATUS_PWM3TF_Pos) +// Bits 4-31 are Reserved. + + +/** + * @brief PWM Controller (PWM) - Register SYNCBUSY0 + * + * @description PWM Group A PWM0 Sync Busy Status Register (SYNCBUSY0) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 272 + * + * SYNCBUSY0 = PWMA_BA+0x88 + * + * + * PWM Synchronous Busy + * + * When software writes CNR0/CMR0/PPR or switch PWM0 operation mode + * (PCR[3]), PWM will have a busy time to update these values completely because + * PWM clock may be different from system clock domain. Software needs to check + * this busy status before writes CNR0/CMR0/PPR or switch PWM0 operation mode + * (PCR[3]) to make sure previous setting has been update completely. + * + * This bit will be set when software write CNR0/CMR0/PPR or switch PWM0 + * operation mode (PCR[3]) and will be cleared by hardware automatically when + * PWM update these value completely. + * + */ + +#define PWM_SYNCBUSY0_S_BUSY_Pos 0 +#define PWM_SYNCBUSY0_S_BUSY_Msk (0x01ul << PWM_SYNCBUSY0_S_BUSY_Pos) + + +/** + * @brief PWM Controller (PWM) - Register SYNCBUSY1 + * + * @description PWM Group A PWM1 Sync Busy Status Register (SYNCBUSY1) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 273 + * + * SYNCBUSY1 = PWMA_BA+0x8C + * + * + * PWM Synchronous Busy + * + * When software writes CNR1/CMR1/PPR or switch PWM1 operation mode + * (PCR[11]), PWM will have a busy time to update these values completely because + * PWM clock may be different from system clock domain. Software needs to check + * this busy status before writes CNR1/CMR1/PPR or switch PWM1 operation mode + * (PCR[11]) to make sure previous setting has been update completely. + * + * This bit will be set when software write CNR1/CMR1/PPR or switch PWM1 + * operation mode (PCR[11]) and will be cleared by hardware automatically when + * PWM update these value completely. + * + */ + +#define PWM_SYNCBUSY1_S_BUSY_Pos 0 +#define PWM_SYNCBUSY1_S_BUSY_Msk (0x01ul << PWM_SYNCBUSY1_S_BUSY_Pos) + + +/** + * @brief PWM Controller (PWM) - Register SYNCBUSY2 + * + * @description PWM Group A PWM2 Sync Busy Status Register (SYNCBUSY2) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 274 + * + * SYNCBUSY2 = PWMA_BA+0x90 + * + * + * PWM Synchronous Busy + * + * When software writes CNR2/CMR2/PPR or switch PWM2 operation mode + * (PCR[19]), PWM will have a busy time to update these values completely because + * PWM clock may be different from system clock domain. Software needs to check + * this busy status before writes CNR2/CMR2/PPR or switch PWM2 operation mode + * (PCR[19]) to make sure previous setting has been update completely. + * + * This bit will be set when software write CNR2/CMR2/PPR or switch PWM2 + * operation mode (PCR[19]) and will be cleared by hardware automatically when + * PWM update these value completely. + * + */ + +#define PWM_SYNCBUSY2_S_BUSY_Pos 0 +#define PWM_SYNCBUSY2_S_BUSY_Msk (0x01ul << PWM_SYNCBUSY2_S_BUSY_Pos) + + +/** + * @brief PWM Controller (PWM) - Register SYNCBUSY3 + * + * @description PWM Group A PWM3 Sync Busy Status Register (SYNCBUSY3) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 275 + * + * SYNCBUSY3 = PWMA_BA+0x94 + * + * + * PWM Synchronous Busy + * + * When software writes CNR3/CMR3/PPR or switch PWM3 operation mode + * (PCR[27]), PWM will have a busy time to update these values completely because + * PWM clock may be different from system clock domain. Software needs to check + * this busy status before writes CNR3/CMR3/PPR or switch PWM3 operation mode + * (PCR[27]) to make sure previous setting has been update completely. + * + * This bit will be set when software write CNR3/CMR3PPR or switch PWM3 + * operation mode (PCR[27]) and will be cleared by hardware automatically when + * PWM update these value completely. + * + */ + +#define PWM_SYNCBUSY3_S_BUSY_Pos 0 +#define PWM_SYNCBUSY3_S_BUSY_Msk (0x01ul << PWM_SYNCBUSY3_S_BUSY_Pos) + + +/** + * @brief PWM Controller (PWM) - Register CAPPDMACTL + * + * @description PWM Group A PDMA Control Register (CAPPDMACTL) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 276-277 + * + * CAPPDMACTL = PWMA_BA+0xC0 + * + * + * CAP0PDMAEN [0] + * Channel 0 PDMA Enable + * + * 1 = Channel 0 PDMA function Enabled for the channel 0 captured data and + * transfer to memory. + * 0 = Channel 0 PDMA function Disabled. + * + * + * CAP0PDMAMOD [1:2] + * Select CRLR0 or CFLR0 to Transfer PDMA + * + * 00 = Reserved + * 01 = CFLR0 + * 10 = CRLR0 + * 11 = Both CRLR0 and CFLR0 + * + * + * CAP0RFORDER [3] + * Set this bit to determine whether the CRLR0 or CFLR0 is the first captured + * data transferred to memory through PDMA when CAP0PDMAMOD =11 + * + * 1 = CRLR0 is the first captured data to memory. + * 0 = CFLR0 is the first captured data to memory. + * + * + * CAP1PDMAEN [8] + * Channel 1 PDMA Enable + * + * 1 = Channel 1 PDMA function Enabled for the channel 1 captured data and + * transfer to memory. + * 0 = Channel 1 PDMA function Disabled. + * + * + * CAP1PDMAMOD [9:10] + * Select CRLR1 or CFLR1 to Transfer PDMA + * + * 00 = Reserved + * 01 = CFLR1 + * 10 = CRLR1 + * 11 = Both CRLR1 and CFLR1 + * + * + * CAP1RFORDER [11] + * Set this bit to determine whether the CRLR1 or CFLR1 is the first captured + * data transferred to memory through PDMA when CAP1PDMAMOD =11 + * + * 1 = CRLR1 is the first captured data to memory. + * 0 = CFLR1 is the first captured data to memory. + * + * + * CAP2PDMAEN [16] + * Channel 2 PDMA Enable + * + * 1 = Channel 2 PDMA function Enabled for the channel 2 captured data and + * transfer to memory. + * 0 = Channel 2 PDMA function Disabled. + * + * + * CAP2PDMAMOD [17:18] + * Select CRLR2 or CFLR2 to Transfer PDMA + * + * 00 = Reserved + * 01 = CFLR2 + * 10 = CRLR2 + * 11 = Both CRLR2 and CFLR2 + * + * + * CAP2RFORDER [19] + * Set this bit to determine whether the CRLR2 or CFLR2 is the first captured + * data transferred to memory through PDMA when CAP2PDMAMOD =11 + * + * 1 = CRLR2 is the first captured data to memory. + * 0 = CFLR2 is the first captured data to memory. + * + * + * CAP3PDMAEN [24] + * Channel 3 PDMA Enable + * + * 1 = Channel 3 PDMA function Enabled for the channel 3 captured data and + * transfer to memory. + * 0 = Channel 3 PDMA function Disabled. + * + * + * CAP3PDMAMOD [25:26] + * Select CRLR3 or CFLR3 to Transfer PDMA + * + * 00 = Reserved + * 01 = CFLR3 + * 10 = CRLR3 + * 11 = Both CRLR3 and CFLR3 + * + * + * CAP3RFORDER [3] + * Set this bit to determine whether the CRLR3 or CFLR3 is the first captured + * data transferred to memory through PDMA when CAP3PDMAMOD =11 + * + * 1 = CRLR3 is the first captured data to memory. + * 0 = CFLR3 is the first captured data to memory. + * + */ + +/* PWM CAPPDMACTL Bit Field Definitions */ +#define PWM_CAPPDMACTL_CAP0PDMAEN_Pos 0 +#define PWM_CAPPDMACTL_CAP0PDMAEN_Msk (0x01ul << PWM_CAPPDMACTL_CAP0PDMAEN_Pos) +#define PWM_CAPPDMACTL_CAP0PDMAMOD_Pos 1 +#define PWM_CAPPDMACTL_CAP0PDMAMOD_Msk (0x03ul << PWM_CAPPDMACTL_CAP0PDMAMOD_Pos) +#define PWM_CAPPDMACTL_CAP0RFORDER_Pos 3 +#define PWM_CAPPDMACTL_CAP0RFORDER_Msk (0x01ul << PWM_CAPPDMACTL_CAP0RFORDER_Pos) +// Bits 4-7 are Reserved. +#define PWM_CAPPDMACTL_CAP1PDMAEN_Pos 8 +#define PWM_CAPPDMACTL_CAP1PDMAEN_Msk (0x01ul << PWM_CAPPDMACTL_CAP1PDMAEN_Pos) +#define PWM_CAPPDMACTL_CAP1PDMAMOD_Pos 9 +#define PWM_CAPPDMACTL_CAP1PDMAMOD_Msk (0x03ul << PWM_CAPPDMACTL_CAP1PDMAMOD_Pos) +#define PWM_CAPPDMACTL_CAP1RFORDER_Pos 11 +#define PWM_CAPPDMACTL_CAP1RFORDER_Msk (0x01ul << PWM_CAPPDMACTL_CAP1RFORDER_Pos) +// Bits 12-15 are Reserved. +#define PWM_CAPPDMACTL_CAP2PDMAEN_Pos 16 +#define PWM_CAPPDMACTL_CAP2PDMAEN_Msk (0x01ul << PWM_CAPPDMACTL_CAP2PDMAEN_Pos) +#define PWM_CAPPDMACTL_CAP2PDMAMOD_Pos 17 +#define PWM_CAPPDMACTL_CAP2PDMAMOD_Msk (0x03ul << PWM_CAPPDMACTL_CAP2PDMAMOD_Pos) +#define PWM_CAPPDMACTL_CAP2RFORDER_Pos 19 +#define PWM_CAPPDMACTL_CAP2RFORDER_Msk (0x01ul << PWM_CAPPDMACTL_CAP2RFORDER_Pos) +// Bits 20-23 are Reserved. +#define PWM_CAPPDMACTL_CAP3PDMAEN_Pos 24 +#define PWM_CAPPDMACTL_CAP3PDMAEN_Msk (0x01ul << PWM_CAPPDMACTL_CAP3PDMAEN_Pos) +#define PWM_CAPPDMACTL_CAP3PDMAMOD_Pos 25 +#define PWM_CAPPDMACTL_CAP3PDMAMOD_Msk (0x03ul << PWM_CAPPDMACTL_CAP3PDMAMOD_Pos) +#define PWM_CAPPDMACTL_CAP3RFORDER_Pos 27 +#define PWM_CAPPDMACTL_CAP3RFORDER_Msk (0x01ul << PWM_CAPPDMACTL_CAP3RFORDER_Pos) +// Bits 28-31 are Reserved. + + +/** + * @brief PWM Controller (PWM) - Register CAP0PDMA + * + * @description PWM Group A PDMA Data Register0 (CAP0PDMA) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 278 + * + * CAP0PDMA = PWMA_BA+0xC4 + * + * + * CAP0RFPDMA + * PDMA data register for channel 0 + * This is the capture value (CFLR0/CRLR0) for channel 0 + * + */ + +#define PWM_CAP0PDMA_CAP0RFPDMA_Pos 0 +#define PWM_CAP0PDMA_CAP0RFPDMA_Msk (0xFFFFul << PWM_CAP0PDMA_CAP0RFPDMA_Pos) +// Bits 16-31 are Reserved. + + +/** + * @brief PWM Controller (PWM) - Register CAP1PDMA + * + * @description PWM Group A PDMA Data Register1 (CAP1PDMA) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 279 + * + * CAP1PDMA = PWMA_BA+0xC8 + * + * + * CAP1RFPDMA + * PDMA data register for channel 1 + * This is the capture value (CFLR1/CRLR1) for channel 1 + * + */ + +#define PWM_CAP1PDMA_CAP1RFPDMA_Pos 0 +#define PWM_CAP1PDMA_CAP1RFPDMA_Msk (0xFFFFul << PWM_CAP1PDMA_CAP1RFPDMA_Pos) +// Bits 16-31 are Reserved. + + +/** + * @brief PWM Controller (PWM) - Register CAP2PDMA + * + * @description PWM Group A PDMA Data Register2 (CAP2PDMA) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 280 + * + * CAP2PDMA = PWMA_BA+0xCC + * + * + * CAP2RFPDMA + * PDMA data register for channel 2 + * This is the capture value (CFLR2/CRLR2) for channel 2 + * + */ + +#define PWM_CAP2PDMA_CAP2RFPDMA_Pos 0 +#define PWM_CAP2PDMA_CAP2RFPDMA_Msk (0xFFFFul << PWM_CAP2PDMA_CAP2RFPDMA_Pos) +// Bits 16-31 are Reserved. + + +/** + * @brief PWM Controller (PWM) - Register CAP3PDMA + * + * @description PWM Group A PDMA Data Register3 (CAP3PDMA) bit defines + * + * See NUC123 Technical Reference Manual 5.9.6 Register Description, page 281 + * + * CAP3PDMA = PWMA_BA+0xD0 + * + * + * CAP3RFPDMA + * PDMA data register for channel 3 + * This is the capture value (CFLR3/CRLR3) for channel 3 + * + */ + +#define PWM_CAP3PDMA_CAP3RFPDMA_Pos 0 +#define PWM_CAP3PDMA_CAP3RFPDMA_Msk (0xFFFFul << PWM_CAP3PDMA_CAP3RFPDMA_Pos) +// Bits 16-31 are Reserved. + + +/* PWM-Timer Start Procedure +The following procedure is recommended for starting a PWM drive: +1. Set clock selector (CSR) +2. Set prescaler (PPR) +3. Set inverter on/off, dead-zone generator on/off, auto-reload/one-shot mode and stop +PWM-timer (PCR) +4. Set comparator register (CMR) for setting PWM duty. +5. Set PWM down-counter register (CNR) for setting PWM period. +6. Set interrupt enable register (PIER) +7. Set the corresponding GPIO pins as PWM function (enable POE and disable CAPENR) +for the corresponding PWM channel. +8. Enable PWM timer start running (set CHxEN = 1 in PCR) + */ + + + +/* =========================================================================================================================== */ +/* ================ TIMER Controller ================ */ +/* =========================================================================================================================== */ + + +/** + * @brief TIMER Controller (TIMER) + * + * @description See NUC123 Technical Reference Manual 5.11.5 Register Map, page 325-326 + * + * TMR_BA01 = 0x4001_0000 + * TMR_BA23 = 0x4011_0000 + * + * Struct rearranged from table to track actual locations (without having to specify offsets) + * + * TIMER_T Struct is per-TMR pair (TMR01, TMR23). + * + */ + +typedef struct { + + __IO uint32_t TCSR; // TMR_BAxx + 0x00 Timer Control and Status Register + __IO uint32_t TCMPR; // TMR_BAxx + 0x04 Timer Compare Register + __IO uint32_t TISR; // TMR_BAxx + 0x08 Timer Interrupt Status Register + __I uint32_t TDR; // TMR_BAxx + 0x0C Timer Data Register + __I uint32_t TCAP; // TMR_BAxx + 0x10 Timer Capture Data Register + __IO uint32_t TEXCON; // TMR_BAxx + 0x14 Timer External Control Register + __IO uint32_t TEXISR; // TMR_BAxx + 0x18 Timer External Interrupt Status Register + +} TIMER_T; + + +/** + * @brief TIMER Controller (TIMER) - Register TCSR + * + * @description TIMER [0/1/2/3] Timer Control and Status Register (TCSR) bit defines + * + * See NUC123 Technical Reference Manual 5.11.6 Register Description, page 327-329 + * + * TCSR0 = TMR_BA01+0x00 + * TCSR1 = TMR_BA01+0x20 + * TCSR2 = TMR_BA23+0x00 + * TCSR3 = TMR_BA23+0x20 + * + * + * PRESCALE [0:7] + * Pre-scale Counter + * + * Clock input is divided by PRESCALE+1 before it is fed to the counter. + * If PRESCALE = 0, there is no scaling. + * + * + * TDR_EN [16] + * Data Load Enable + * + * When TDR_EN is set, TDR (Timer Data Register) will be updated continuously with the + * 24-bit up-timer value as the timer is counting. + * + * 1 = Timer Data Register update Enabled. + * 0 = Timer Data Register update Disabled. + * + * + * WAKEN [23] + * Wake-up Enable + * + * When WAKE_EN is set and the TIF is set, the timer controller will generator a wake-up + * trigger event to CPU. + * + * 0 = Wake-up trigger event Disabled. + * 1 = Wake-up trigger event Enabled. + * + * + * CTB [24] + * Counter Mode Enable Bit + * + * This bit is the counter mode enable bit. When Timer is used as an event counter, this + * bit should be set to 1 and Timer will work as an event counter. The counter detect + * phase can be selected as rising/falling edge of external pin by TX_PHASE field. + * + * 1 = Counter mode Enabled. + * 0 = Counter mode Disabled. + * + * + * CACT [25] + * Timer Active Status Bit (Read only) + * + * This bit indicates the up-timer status. + * + * 0 = Timer is not active + * 1 = Timer is active + * + * + * CRST [26] + * Timer Reset Bit + * + * Set this bit will reset the 24-bit up-timer, 8-bit pre-scale counter and also force CEN + * to 0. + * + * 0 = No effect + * 1 = Reset Timer's 8-bit pre-scale counter, internal 24-bit up-timer and CEN bit + * + * + * MODE [27:28] + * Timer Operating Mode + * + * 00 = The timer is operating at the one-shot mode. The associated + * interrupt signal is generated once (if IE is enabled) and CEN is + * automatically cleared by hardware. + * 01 = The timer is operating at the periodic mode. The associated + * interrupt signal is generated periodically (if IE is enabled). + * 10 = The timer is operating at the toggle mode. The interrupt signal is + * generated periodically (if IE is enabled). And the associated + * signal (tout) is changing back and forth with 50% duty cycle. + * 11 = The timer is operating at continuous counting mode. The + * associated interrupt signal is generated when TDR = TCMPR (if + * IE is enabled). However, the 24-bit up-timer counts continuously. + * + * + * IE [29] + * Interrupt Enable Bit + * + * 1 = Timer Interrupt Enabled + * 0 = Timer Interrupt Disabled + * + * If timer interrupt is enabled, the timer asserts its interrupt signal when the associated + * up-timer value is equal to TCMPR. + * + * + * CEN [30] + * Timer Enable Bit + * + * 1 = Starts counting + * 0 = Stops/Suspends counting + * + * Note1: If CEN is in stop and then CEN is set to 1, the 24-bit up-timer will keep + * counting up from the last stop counting value. + * Note2: This bit is auto-cleared by hardware in one-shot mode (MODE [27:28] = 00) + * when the associated timer interrupt is generated (IE [29] = 1). + * + * + * DBGACK_TMR [31] + * ICE Debug mode Acknowledge Disable (Write-protection Bit) + * + * 0 = ICE debug mode acknowledgement effects TIMER counting. + * TIMER counter will be held while ICE debug mode acknowledged. + * 1 = ICE debug mode acknowledgement disabled. + * TIMER counter will keep going regardless of ICE debug mode acknowledgement. + * + */ + +#define TIMER_TCSR_PRESCALE_Pos 0 +#define TIMER_TCSR_PRESCALE_Msk (0xFFul << TIMER_TCSR_PRESCALE_Pos) +// Bits 8-15 are Reserved. +#define TIMER_TCSR_TDR_EN_Pos 16 +#define TIMER_TCSR_TDR_EN_Msk (0x01ul << TIMER_TCSR_TDR_EN_Pos) +// Bits 17-22 are Reserved. +#define TIMER_TCSR_WAKE_EN_Pos 23 +#define TIMER_TCSR_WAKE_EN_Msk (0x01ul << TIMER_TCSR_WAKE_EN_Pos) +#define TIMER_TCSR_CTB_Pos 24 +#define TIMER_TCSR_CTB_Msk (0x01ul << TIMER_TCSR_CTB_Pos) +#define TIMER_TCSR_CACT_Pos 25 +#define TIMER_TCSR_CACT_Msk (0x01ul << TIMER_TCSR_CACT_Pos) +#define TIMER_TCSR_CRST_Pos 26 +#define TIMER_TCSR_CRST_Msk (0x01ul << TIMER_TCSR_CRST_Pos) +#define TIMER_TCSR_MODE_Pos 27 +#define TIMER_TCSR_MODE_Msk (0x03ul << TIMER_TCSR_MODE_Pos) +#define TIMER_TCSR_IE_Pos 29 +#define TIMER_TCSR_IE_Msk (0x01ul << TIMER_TCSR_IE_Pos) +#define TIMER_TCSR_CEN_Pos 30 +#define TIMER_TCSR_CEN_Msk (0x01ul << TIMER_TCSR_CEN_Pos) +#define TIMER_TCSR_DBGACK_TMR_Pos 31 +#define TIMER_TCSR_DBGACK_TMR_Msk (0x01ul << TIMER_TCSR_DBGACK_TMR_Pos) + + +/** + * @brief TIMER Controller (TIMER) - Register TCMP + * + * @description TIMER [0/1/2/3] Timer Compare Register (TCMP) bit defines + * + * See NUC123 Technical Reference Manual 5.11.6 Register Description, page 330 + * + * TCMPR0 = TMR_BA01+0x04 + * TCMPR1 = TMR_BA01+0x24 + * TCMPR2 = TMR_BA23+0x04 + * TCMPR3 = TMR_BA23+0x24 + * + * + * TCMP [0:23] + * Timer Compared Value + * + * TCMP is a 24-bit compared register. When the internal 24-bit up-timer counts and its + * value is equal to TCMP value, a Timer Interrupt is requested if the timer interrupt is + * enabled with TCSR.IE[29]=1. The TCMP value defines the timer counting cycle time. + * Time out period = (Period of timer clock input) * (8-bit PRESCALE + 1) * (24-bit TCMP) + * + * Note1: Never write 0x0 or 0x1 in TCMP, or the core will run into unknown state. + * Note2: When timer is operating in continuous counting mode, the 24-bit up-timer will + * count continuously if software writes a new value into TCMP. If timer is operating in + * other modes, the 24-bit up-timer will restart counting and will use the newest TCMP value + * to be the compared value if the software has written a new value into TCMP. + * + */ + +#define TIMER_TCMP_TCMP_Pos 0 +#define TIMER_TCMP_TCMP_Msk (0xFFFFFFul << TIMER_TCMP_TCMP_Pos) +// Bits 24-31 are Reserved. + + +/** + * @brief TIMER Controller (TIMER) - Register TISR + * + * @description TIMER [0/1/2/3] Timer Interrupt Status Register (TISR) bit defines + * + * See NUC123 Technical Reference Manual 5.11.6 Register Description, page 331 + * + * TISR0 = TMR_BA01+0x08 + * TISR1 = TMR_BA01+0x28 + * TISR2 = TMR_BA23+0x08 + * TISR3 = TMR_BA23+0x28 + * + * + * TIF [0] + * Timer Interrupt Flag + * + * This bit indicates the interrupt status of timer. + * The TIF bit is set by hardware when the up counting value of internal 24-bit up-timer + * matches the timer compared value (TCMP). It is cleared by writing 1 to this bit. + * + * + * TWF [1] + * Timer Wakeup Flag + * + * If timer causes CPU wakes up from power-down mode, this bit will be set to high. + * It must be cleared by software with a write 1 to this bit. + * + * 0 = Timer does not cause CPU wakeup. + * 1 = CPU wakes up from sleep or power-down mode by timer time-out. + * + * + */ + +#define TIMER_TISR_TIF_Pos 0 +#define TIMER_TISR_TIF_Msk (0x01ul << TIMER_TISR_TIF_Pos) +#define TIMER_TISR_TWF_Pos 1 +#define TIMER_TISR_TWF_Msk (0x01ul << TIMER_TISR_TWF_Pos) +// Bits 2-31 are Reserved. + + +/** + * @brief TIMER Controller (TIMER) - Register TDR + * + * @description TIMER [0/1/2/3] Timer Data Register (TDR) bit defines + * + * See NUC123 Technical Reference Manual 5.11.6 Register Description, page 332 + * + * TDR0 = TMR_BA01+0x0C + * TDR1 = TMR_BA01+0x2C + * TDR2 = TMR_BA23+0x0C + * TDR3 = TMR_BA23+0x2C + * + * + * TDR [0:23] + * Timer Data Register + * + * 1. CTB (TCSR[24] ) = 0: + * TDR is 24- bits up timer value. + * User can read TDR for getting current 24- bits up timer value if + * TCSR[24] = is set to 0 + * 2. CTB (TCSR[24] ) = 1: + * TDR is 24- bits up event counter value. + * User can read TDR for getting current 24- bits up event counter value + * if TCSR[24] is 1 + * + */ + +#define TIMER_TDR_TDR_Pos 0 +#define TIMER_TDR_TDR_Msk (0xFFFFFFul << TIMER_TDR_TDR_Pos) +// Bits 24-31 are Reserved. + + +/** + * @brief TIMER Controller (TIMER) - Register TCAP + * + * @description TIMER [0/1/2/3] Timer Capture Data Register (TCAP) bit defines + * + * See NUC123 Technical Reference Manual 5.11.6 Register Description, page 333 + * + * TCAP0 = TMR_BA01+0x10 + * TCAP1 = TMR_BA01+0x30 + * TCAP2 = TMR_BA23+0x10 + * TCAP3 = TMR_BA23+0x30 + * + * + * TCAP [0:23] + * Timer Capture Data Register + * + * When TEXEN (TEXCON[3]) is set, RSTCAPn(TTXCON[4]) is 0, and the transition + * on the TEX pins associated TEX_EDGE(TEXCON[2:1]) setting has occurred - + * the internal 24-bit up-timer value will be loaded into TCAP. + * + * User can read this register for the counter value. + * + */ + +#define TIMER_TCAP_TCAP_Pos 0 +#define TIMER_TCAP_TCAP_Msk (0xFFFFFFul << TIMER_TCAP_TCAP_Pos) +// Bits 24-31 are Reserved. + + +/** + * @brief TIMER Controller (TIMER) - Register TEXCON + * + * @description TIMER [0/1/2/3] Timer External Control Register (TEXCON) bit defines + * + * See NUC123 Technical Reference Manual 5.11.6 Register Description, page 334-335 + * + * TEXCON0 = TMR_BA01+0x14 + * TEXCON1 = TMR_BA01+0x34 + * TEXCON2 = TMR_BA23+0x14 + * TEXCON3 = TMR_BA23+0x34 + * + * + * TX_PHASE [0] + * Timer External Count Phase + * + * This bit indicates the external count pin phase. + * + * 1 = A rising edge of external count pin will be counted. + * 0 = A falling edge of external count pin will be counted. + * + * + * TEX_EDGE [1:2] + * Timer External Pin Edge Detect + * + * 00 = 1 to 0 transition on TEX will be detected. + * 01 = 0 to 1 transition on TEX will be detected. + * 10 = Either 1 to 0 or 0 to 1 transition on TEX will be detected. + * 11 = Reserved. + * + * + * TEXEN [3] + * Timer External Pin Enable + * + * This bit enables the reset/capture function on the TEX pin. + * + * 1 = Transition detected on the TEX pin will result in capture or reset of timer counter. + * 0 = TEX pin will be ignored. + * + * + * RSTCAPn [4] + * Timer External Reset Counter/Capture Mode Selection + * + * 1 = TEX transition is used as the timer counter reset function. + * 0 = TEX transition is used as the timer capture function. + * + * + * TEXIEN [5] + * Timer External Interrupt Enable Bit + * + * 1 = Timer external interrupt Enabled. + * 0 = Timer external interrupt Disabled. + * + * If timer external interrupt is enabled, the timer asserts its external interrupt signal + * which issent to NVIC to inform CPU when the transition on the TEX pins associated with + * TEX_EDGE(TEXCON[2:1]) setting has happened. + * + * For example, while TEXIEN = 1, TEXEN = 1, and TEX_EDGE = 00, a 1 to 0 transition + * on the TEX pin will cause the TEXIF(TEXISR[0]) interrupt flag to be set, then the + * interrupt signal is generated and sent to NVIC to inform MCU. + * + * + * TEXDB [6] + * Timer External Capture Pin De-bounce Enable Bit + * + * 1 = De-bounce Enabled. + * 0 = De-bounce Disabled. + * + * If this bit is enabled, the edge of T0EX~T3EX pin is detected with de-bounce circuit. + * + * + * TCDB [7] + * Timer Counter Pin De-bounce Enable Bit + * + * 1 = De-bounce Enabled. + * 0 = De-bounce Disabled. + * + * If this bit is enabled, the edge of TM0~TM3 pin is detected with de-bounce circuit. + * + */ + +#define TIMER_TEXCON_TX_PHASE_Pos 0 +#define TIMER_TEXCON_TX_PHASE_Msk (0x01ul << TIMER_TEXCON_TX_PHASE_Pos) +#define TIMER_TEXCON_TEX_EDGE_Pos 1 +#define TIMER_TEXCON_TEX_EDGE_Msk (0x03ul << TIMER_TEXCON_TEX_EDGE_Pos) +#define TIMER_TEXCON_TEXEN_Pos 3 +#define TIMER_TEXCON_TEXEN_Msk (0x01ul << TIMER_TEXCON_TEXEN_Pos) +#define TIMER_TEXCON_RSTCAPSEL_Pos 4 +#define TIMER_TEXCON_RSTCAPSEL_Msk (0x01ul << TIMER_TEXCON_RSTCAPSEL_Pos) +#define TIMER_TEXCON_TEXIEN_Pos 5 +#define TIMER_TEXCON_TEXIEN_Msk (0x01ul << TIMER_TEXCON_TEXIEN_Pos) +#define TIMER_TEXCON_TEXDB_Pos 6 +#define TIMER_TEXCON_TEXDB_Msk (0x01ul << TIMER_TEXCON_TEXDB_Pos) +#define TIMER_TEXCON_TCDB_Pos 7 +#define TIMER_TEXCON_TCDB_Msk (0x01ul << TIMER_TEXCON_TCDB_Pos) +// Bits 8-31 are Reserved. + + +/** + * @brief TIMER Controller (TIMER) - Register TEXISR + * + * @description TIMER [0/1/2/3] Timer External Interrupt Status Register (TEXISR) bit defines + * + * See NUC123 Technical Reference Manual 5.11.6 Register Description, page 336 + * + * TEXISR0 = TMR_BA01+0x18 + * TEXISR1 = TMR_BA01+0x38 + * TEXISR2 = TMR_BA23+0x18 + * TEXISR3 = TMR_BA23+0x38 + * + * + * TEXIF [0] + * Timer External Interrupt Flag + * + * This bit indicates the external interrupt status of Timer. + * This bit is set by hardware when TEXEN (TEXCON[3]) is to 1, and the transition on + * the TEX pins associated with TEX_EDGE (TEXCON[2:1]) setting has occurred. + * + * It is cleared by writing 1 to this bit. + * + * For example, while TEXEN = 1, and TEX_EDGE = 00, a 1 to 0 transition on the TEX + * pin causes the TEXIF bit to be set. + * + */ + +#define TIMER_TEXISR_TEXIF_Pos 0 +#define TIMER_TEXISR_TEXIF_Msk (0x01ul << TIMER_TEXISR_TEXIF_Pos) +// Bits 1-31 are Reserved. + + +/*@}*/ /* end of group NUC123SD4AN0_Peripherals */ + +/* ========================================= End of section using anonymous unions ========================================= */ +#if defined (__CC_ARM) + #pragma pop +#elif defined (__ICCARM__) + /* leave anonymous unions enabled */ +#elif (__ARMCC_VERSION >= 6010050) + #pragma clang diagnostic pop +#elif defined (__GNUC__) + /* anonymous unions are enabled by default */ +#elif defined (__TMS470__) + /* anonymous unions are enabled by default */ +#elif defined (__TASKING__) + #pragma warning restore +#elif defined (__CSMC__) + /* anonymous unions are enabled by default */ +#else + #warning Not supported compiler type +#endif + + +/* =========================================================================================================================== */ +/* ================ Device Specific Peripheral Address Map ================ */ +/* =========================================================================================================================== */ + + +/* ToDo: add here your device peripherals base addresses + following is an example for timer */ +/** @addtogroup Device_Peripheral_peripheralAddr + * @{ + * + * See NUC123 Technical Reference Manual 5.1.2 System Memory Map, pages 29-30 + * + */ + +/* Peripheral and SRAM base address */ +// #define _FLASH_BASE (0x00000000UL) /*!< (FLASH ) Base Address */ +// #define _SRAM_BASE (0x20000000UL) /*!< (SRAM ) Base Address */ +// #define _PERIPH_BASE (0x40000000UL) /*!< (Peripheral) Base Address */ +#define FLASH_BASE (0x00000000ul) +#define SRAM_BASE (0x20000000ul) +#define AHB_BASE (0x50000000ul) +#define APB1_BASE (0x40000000ul) +#define APB2_BASE (0x40100000ul) + +/* Peripheral memory map */ +// #define TIM0_BASE (_PERIPH_BASE) /*!< (Timer0 ) Base Address */ +// #define TIM1_BASE (_PERIPH_BASE + 0x0800) /*!< (Timer1 ) Base Address */ +// #define TIM2_BASE (_PERIPH_BASE + 0x1000) /*!< (Timer2 ) Base Address */ +#define GCR_BASE (AHB_BASE+0x00000) // System Global Controller Base Address +#define CLK_BASE (AHB_BASE+0x00200) // System Clock Controller Base Address +#define INT_BASE (AHB_BASE+0x00300) // Interrupt Source Controller Base Address + +#define GPIO_BASE (AHB_BASE+0x4000) // GPIO Base Address +#define PA_BASE (GPIO_BASE+0x0000) // GPIO PORTA Base Address +#define PB_BASE (GPIO_BASE+0x0040) // GPIO PORTB Base Address +#define PC_BASE (GPIO_BASE+0x0080) // GPIO PORTC Base Address +#define PD_BASE (GPIO_BASE+0x00C0) // GPIO PORTD Base Address +#define PF_BASE (GPIO_BASE+0x0140) // GPIO PORTF Base Address +#define DBNCECON_BASE (GPIO_BASE+0x0180) // GPIO De-bounce Cycle Control Base Address +#define GPIO_PIN_DATA_BASE (GPIO_BASE+0x0200) // GPIO Pin Data Input/Output Control Base Address + +// #define WDT_BASE (APB1_BASE+0x4000) // Watchdog Timer Base Address +// #define WWDT_BASE (APB1_BASE+0x4100) // Window Watchdog Timer Base Address + +#define TIMER0_BASE (APB1_BASE+0x10000) // Timer0 Base Address +#define TIMER1_BASE (APB1_BASE+0x10020) // Timer1 Base Address +#define TIMER2_BASE (APB2_BASE+0x10000) // Timer2 Base Address +#define TIMER3_BASE (APB2_BASE+0x10020) // Timer3 Base Address + +#define SPI0_BASE (APB1_BASE+0x30000) // SPI0 Base Address +#define SPI1_BASE (APB1_BASE+0x34000) // SPI1 Base Address +#define SPI2_BASE (APB2_BASE+0x30000) // SPI2 Base Address + +#define PWMA_BASE (APB1_BASE+0x40000) // PWMA Base Address */ + +// #define UART0_BASE (APB1_BASE+0x50000) // UART0 Base Address +// #define UART1_BASE (APB2_BASE+0x50000) // UART1 Base Address + +#define USBD_BASE (APB1_BASE+0x60000) // USBD Base Address + +/** @} */ /* End of group Device_Peripheral_peripheralAddr */ + + +/* =========================================================================================================================== */ +/* ================ Peripheral declaration ================ */ +/* =========================================================================================================================== */ + + +/* ToDo: add here your device peripherals pointer definitions + following is an example for timer */ +/** @addtogroup Device_Peripheral_declaration + * @{ + */ + +// #define _TIM0 ((_TMR_TypeDef *) TIM0_BASE) +// #define _TIM1 ((_TMR_TypeDef *) TIM0_BASE) +// #define _TIM2 ((_TMR_TypeDef *) TIM0_BASE) + + +#define SYS ((GCR_T *) GCR_BASE) +#define CLK ((CLK_T *) CLK_BASE) +#define SYSINT ((GCR_INT_T *) INT_BASE) + +#define PA ((GPIO_T *) PA_BASE) +#define PB ((GPIO_T *) PB_BASE) +#define PC ((GPIO_T *) PC_BASE) +#define PD ((GPIO_T *) PD_BASE) +#define PF ((GPIO_T *) PF_BASE) +#define GPIO_DBNCE ((GPIO_DBNCECON_T *) DBNCECON_BASE) + +// #define WDT ((WDT_T *) WDT_BASE) +// #define WWDT ((WWDT_T *) WWDT_BASE) + +#define TIMER0 ((TIMER_T *) TIMER0_BASE) +#define TIMER1 ((TIMER_T *) TIMER1_BASE) +#define TIMER2 ((TIMER_T *) TIMER2_BASE) +#define TIMER3 ((TIMER_T *) TIMER3_BASE) + +#define PWMA ((PWM_T *) PWMA_BASE) + +#define SPI0 ((SPI_T *) SPI0_BASE) +#define SPI1 ((SPI_T *) SPI1_BASE) +#define SPI2 ((SPI_T *) SPI2_BASE) + +// #define UART0 ((UART_T *) UART0_BASE) +// #define UART1 ((UART_T *) UART1_BASE) + +#define USBD ((USBD_T *) USBD_BASE) + +/* + * |Module index |Clock source |Divider | + * | :---------------- | :------------------------------------| :--------------------- | + * |\ref WDT_MODULE |\ref CLK_CLKSEL1_WDT_S_LIRC | x | + * |\ref WDT_MODULE |\ref CLK_CLKSEL1_WDT_S_HCLK_DIV2048 | x | + * |\ref ADC_MODULE |\ref CLK_CLKSEL1_ADC_S_HXT |\ref CLK_CLKDIV_ADC(x) | + * |\ref ADC_MODULE |\ref CLK_CLKSEL1_ADC_S_PLL |\ref CLK_CLKDIV_ADC(x) | + * |\ref ADC_MODULE |\ref CLK_CLKSEL1_ADC_S_HCLK |\ref CLK_CLKDIV_ADC(x) | + * |\ref ADC_MODULE |\ref CLK_CLKSEL1_ADC_S_HIRC |\ref CLK_CLKDIV_ADC(x) | + * |\ref SPI0_MODULE |\ref CLK_CLKSEL1_SPI0_S_HCLK | x | + * |\ref SPI0_MODULE |\ref CLK_CLKSEL1_SPI0_S_PLL | x | + * |\ref SPI1_MODULE |\ref CLK_CLKSEL1_SPI1_S_HCLK | x | + * |\ref SPI1_MODULE |\ref CLK_CLKSEL1_SPI1_S_PLL | x | + * |\ref SPI2_MODULE |\ref CLK_CLKSEL1_SPI2_S_HCLK | x | + * |\ref SPI2_MODULE |\ref CLK_CLKSEL1_SPI2_S_PLL | x | + * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0_S_HXT | x | + * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0_S_HCLK | x | + * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0_S_EXT_TRG | x | + * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0_S_LIRC | x | + * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0_S_HIRC | x | + * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1_S_HXT | x | + * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1_S_HCLK | x | + * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1_S_EXT_TRG | x | + * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1_S_LIRC | x | + * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1_S_HIRC | x | + * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2_S_HXT | x | + * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2_S_HCLK | x | + * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2_S_EXT_TRG | x | + * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2_S_LIRC | x | + * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2_S_HIRC | x | + * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3_S_HXT | x | + * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3_S_HCLK | x | + * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3_S_EXT_TRG | x | + * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3_S_LIRC | x | + * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3_S_HIRC | x | + * |\ref UART0_MODULE |\ref CLK_CLKSEL1_UART_S_HXT |\ref CLK_CLKDIV_UART(x) | + * |\ref UART0_MODULE |\ref CLK_CLKSEL1_UART_S_PLL |\ref CLK_CLKDIV_UART(x) | + * |\ref UART0_MODULE |\ref CLK_CLKSEL1_UART_S_HIRC |\ref CLK_CLKDIV_UART(x) | + * |\ref UART1_MODULE |\ref CLK_CLKSEL1_UART_S_HXT |\ref CLK_CLKDIV_UART(x) | + * |\ref UART1_MODULE |\ref CLK_CLKSEL1_UART_S_PLL |\ref CLK_CLKDIV_UART(x) | + * |\ref UART1_MODULE |\ref CLK_CLKSEL1_UART_S_HIRC |\ref CLK_CLKDIV_UART(x) | + * |\ref PWM01_MODULE |\ref CLK_CLKSEL12_PWM01_S_HXT | x | + * |\ref PWM01_MODULE |\ref CLK_CLKSEL12_PWM01_S_HCLK | x | + * |\ref PWM01_MODULE |\ref CLK_CLKSEL12_PWM01_S_HIRC | x | + * |\ref PWM01_MODULE |\ref CLK_CLKSEL12_PWM01_S_LIRC | x | + * |\ref PWM23_MODULE |\ref CLK_CLKSEL12_PWM23_S_HXT | x | + * |\ref PWM23_MODULE |\ref CLK_CLKSEL12_PWM23_S_HCLK | x | + * |\ref PWM23_MODULE |\ref CLK_CLKSEL12_PWM23_S_HIRC | x | + * |\ref PWM23_MODULE |\ref CLK_CLKSEL12_PWM23_S_LIRC | x | + * |\ref I2S_MODULE |\ref CLK_CLKSEL2_I2S_S_HXT | x | + * |\ref I2S_MODULE |\ref CLK_CLKSEL2_I2S_S_PLL | x | + * |\ref I2S_MODULE |\ref CLK_CLKSEL2_I2S_S_HCLK | x | + * |\ref I2S_MODULE |\ref CLK_CLKSEL2_I2S_S_HIRC | x | + * |\ref FDIV_MODULE |\ref CLK_CLKSEL2_FRQDIV_S_HXT | x | + * |\ref FDIV_MODULE |\ref CLK_CLKSEL2_FRQDIV_S_HCLK | x | + * |\ref FDIV_MODULE |\ref CLK_CLKSEL2_FRQDIV_S_HIRC | x | + * |\ref WWDT_MODULE |\ref CLK_CLKSEL2_WWDT_S_HCLK_DIV2048 | x | + * |\ref WWDT_MODULE |\ref CLK_CLKSEL2_WWDT_S_LIRC | x | + * |\ref USBD_MODULE | x |\ref CLK_CLKDIV_USB(x) | +*/ +typedef enum ModuleNum { + + WDT_ModuleNum = 0, + ADC_ModuleNum = 1, + SPI0_ModuleNum, + SPI1_ModuleNum, + SPI2_ModuleNum, + TMR0_ModuleNum, + TMR1_ModuleNum, + TMR2_ModuleNum, + TMR3_ModuleNum, + UART0_ModuleNum, + UART1_ModuleNum, + PWM01_ModuleNum, + PWM23_ModuleNum, + I2S_ModuleNum, + FDIV_ModuleNum, + WWDT_ModuleNum, + USBD_ModuleNum, + I2C0_ModuleNum, + I2C1_ModuleNum, + PS2_ModuleNum, + PDMA_ModuleNum, + ISP_ModuleNum + +} ModuleNum_Type; + + +/* =========================================================================================================================== */ +/* ================ Peripheral Register Operations ================ */ +/* =========================================================================================================================== */ + +#ifndef NULL +#define NULL 0 +#endif + +#define UNLOCKREG() do{*((__IO uint32_t *)(GCR_BASE + 0x100)) = 0x59;*((__IO uint32_t *)(GCR_BASE + 0x100)) = 0x16;*((__IO uint32_t *)(GCR_BASE + 0x100)) = 0x88;}while(*((__IO uint32_t *)(GCR_BASE + 0x100))==0) +#define LOCKREG() *((__IO uint32_t *)(GCR_BASE + 0x100)) = 0x00 + +#define REGCOPY(dest, src) *((uint32_t *)&(dest)) = *((uint32_t *)&(src)) +#define CLEAR(dest) *((uint32_t *)&(dest)) = 0 + +#define MEM32(addr) (*((volatile unsigned long *) (addr))) + + +/* =========================================================================================================================== */ +/* ================ Peripheral includes ================ */ +/* =========================================================================================================================== */ + + + +/** @} */ /* End of group NUC123SD4AN0 */ + +/** @} */ /* End of group NUVOTON */ + +#ifdef __cplusplus +} +#endif + + + +#endif /* NUC123SD4AN0_H */ \ No newline at end of file diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/adc.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/adc.h deleted file mode 100644 index 6412af75..00000000 --- a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/adc.h +++ /dev/null @@ -1,342 +0,0 @@ -/**************************************************************************//** - * @file adc.h - * @version V3.00 - * $Revision: 7 $ - * $Date: 15/07/02 11:21a $ - * @brief NUC123 Series ADC Driver Header File - * - * @note - * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. - * - ******************************************************************************/ -#ifndef __ADC_H__ -#define __ADC_H__ - -#include "NUC123.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - -/** @addtogroup Standard_Driver Standard Driver - @{ -*/ - -/** @addtogroup ADC_Driver ADC Driver - @{ -*/ - -/** @addtogroup ADC_EXPORTED_CONSTANTS ADC Exported Constants - @{ -*/ -/*---------------------------------------------------------------------------------------------------------*/ -/* ADCR Constant Definitions */ -/*---------------------------------------------------------------------------------------------------------*/ -#define ADC_ADCR_ADEN_CONVERTER_DISABLE (0UL<ADCHER = ((adc)->ADCHER & ~ADC_ADCHER_PRESEL_Msk) | (u32Source)) - -/** - * @brief Enable PDMA transfer. - * @param[in] adc The pointer of the specified ADC module - * @return None - * @details Enable PDMA to transfer the conversion data. - * @note While enable PDMA transfer, software must set ADIE = 0 to disable interrupt. - */ -#define ADC_ENABLE_PDMA(adc) ((adc)->ADCR |= ADC_ADCR_PTEN_Msk) - -/** - * @brief Disable PDMA transfer. - * @param[in] adc The pointer of the specified ADC module - * @return None - * @details Disable PDMA to transfer the conversion data. - */ -#define ADC_DISABLE_PDMA(adc) ((adc)->ADCR &= ~ADC_ADCR_PTEN_Msk) - -/** - * @brief Get conversion data of specified channel. - * @param[in] adc The pointer of the specified ADC module. - * @param[in] u32ChNum ADC Channel, valid value are from 0 to 7. - * @return 16-bit data. - * @details Read RSLT bit field to get conversion data. - */ -#define ADC_GET_CONVERSION_DATA(adc, u32ChNum) ((adc)->ADDR[(u32ChNum)] & ADC_ADDR_RSLT_Msk) - -/** - * @brief Return the user-specified interrupt flags. - * @param[in] adc The pointer of the specified ADC module. - * @param[in] u32Mask The combination of following interrupt status bits. Each bit corresponds to a interrupt status. - * Valid values are: - * - \ref ADC_ADF_INT :Convert complete interrupt flag. - * - \ref ADC_CMP0_INT :Comparator 0 interrupt flag. - * - \ref ADC_CMP1_INT :Comparator 1 interrupt flag. - * @return User specified interrupt flags. - * @details Get the status of the ADC interrupt flag. - */ -#define ADC_GET_INT_FLAG(adc, u32Mask) ((adc)->ADSR & (u32Mask)) - -/** - * @brief This macro clear the selected interrupt status bits. - * @param[in] adc The pointer of the specified ADC module. - * @param[in] u32Mask The combination of following interrupt status bits. Each bit corresponds to a interrupt status. - * Valid values are: - * - \ref ADC_ADF_INT :Convert complete interrupt flag. - * - \ref ADC_CMP0_INT :Comparator 0 interrupt flag. - * - \ref ADC_CMP1_INT :Comparator 1 interrupt flag. - * @return None - * @details ADF (ADSR[0])/CMPF0 (ADSR[1])/CMPF0 (ADSR[2]) can be cleared by writing 1 to itself. - */ -#define ADC_CLR_INT_FLAG(adc, u32Mask) ((adc)->ADSR = (u32Mask)) - -/** - * @brief Get the busy state of ADC. - * @param[in] adc The pointer of the specified ADC module. - * @retval 0 ADC is not busy. - * @retval 1 ADC is busy. - * @details BUSY(ADSR[3])is mirror of as ADST bit (ADCR[11]). - */ -#define ADC_IS_BUSY(adc) ((adc)->ADSR & ADC_ADSR_BUSY_Msk ? 1 : 0) - -/** - * @brief Check if the ADC conversion data is over written or not. - * @param[in] adc The pointer of the specified ADC module. - * @param[in] u32ChNum ADC Channel, valid value are from 0 to 7. - * @retval 0 ADC data is not overrun. - * @retval 1 ADC data is overrun. - * @details OVERRUN (ADSR[23:16]) is a mirror to OVERRUN (ADDR0~7[16]). - */ -#define ADC_IS_DATA_OVERRUN(adc, u32ChNum) ((adc)->ADSR & (0x1 << (ADC_ADSR_OVERRUN_Pos + (u32ChNum))) ? 1 : 0) - -/** - * @brief Check if the ADC conversion data is valid or not. - * @param[in] adc The pointer of the specified ADC module. - * @param[in] u32ChNum ADC Channel, valid value are from 0 to 7. - * @retval 0 ADC data is not valid. - * @retval 1 ADC data is valid. - * @details VALID (ADDR0~7[17]) is set to 1 when corresponding channel analog input conversion is completed and cleared by hardware after ADDR register is read. - */ -#define ADC_IS_DATA_VALID(adc, u32ChNum) ((adc)->ADSR & (0x1 << (ADC_ADSR_VALID_Pos + (u32ChNum))) ? 1 : 0) - -/** - * @brief Power down ADC module. - * @param[in] adc The pointer of the specified ADC module. - * @return None - * @details Disable A/D converter analog circuit for saving power consumption. - * @note None - */ -#define ADC_POWER_DOWN(adc) ((adc)->ADCR &= ~ADC_ADCR_ADEN_Msk) - -/** - * @brief Power on ADC module. - * @param[in] adc The pointer of the specified ADC module. - * @return None - * @details Before starting A/D conversion function, ADEN bit (ADCR[0]) should be set to 1. - */ -#define ADC_POWER_ON(adc) ((adc)->ADCR |= ADC_ADCR_ADEN_Msk) - -/** - * @brief Configure the comparator 0 and enable it. - * @param[in] adc The pointer of the specified ADC module. - * @param[in] u32ChNum Specifies the source channel, valid value are from 0 to 7. - * @param[in] u32Condition Specifies the compare condition. Valid values are: - * - \ref ADC_ADCMPR_CMPCOND_LESS_THAN :The compare condition is "less than the compare value". - * - \ref ADC_ADCMPR_CMPCOND_GREATER_OR_EQUAL :The compare condition is "greater than or equal to the compare value. - * @param[in] u32Data Specifies the compare value, valid value are between 0 ~ 0x3FF. - * @param[in] u32MatchCount Specifies the match count setting, valid values are between 1~16. - * @return None - * @details For example, ADC_ENABLE_CMP0(ADC, 5, ADC_ADCMPR_CMPCOND_GREATER_OR_EQUAL, 0x200, 10); - * Means ADC will assert comparator 0 flag if channel 5 conversion result is greater or - * equal to 0x200 for 10 times continuously. - * \hideinitializer - */ -#define ADC_ENABLE_CMP0(adc, \ - u32ChNum, \ - u32Condition, \ - u32Data, \ - u32MatchCount) ((adc)->ADCMPR[0] = ((u32ChNum) << ADC_ADCMPR_CMPCH_Pos) | \ - (u32Condition) | \ - ((u32Data) << ADC_ADCMPR_CMPD_Pos) | \ - (((u32MatchCount) - 1) << ADC_ADCMPR_CMPMATCNT_Pos) |\ - ADC_ADCMPR_CMPEN_Msk) - -/** - * @brief Disable comparator 0. - * @param[in] adc The pointer of the specified ADC module. - * @return None - * @details Set CMPEN (ADCMPR0[0]) to 0 to disable ADC controller to compare CMPD (ADCMPR0[25:16]). - */ -#define ADC_DISABLE_CMP0(adc) ((adc)->ADCMPR[0] = 0) - -/** - * @brief Configure the comparator 1 and enable it. - * @param[in] adc The pointer of the specified ADC module. - * @param[in] u32ChNum Specifies the source channel, valid value are from 0 to 7. - * @param[in] u32Condition Specifies the compare condition. Valid values are: - * - \ref ADC_ADCMPR_CMPCOND_LESS_THAN :The compare condition is "less than the compare value". - * - \ref ADC_ADCMPR_CMPCOND_GREATER_OR_EQUAL :The compare condition is "greater than or equal to the compare value. - * @param[in] u32Data Specifies the compare value, valid value are between 0 ~ 0x3FF. - * @param[in] u32MatchCount Specifies the match count setting, valid values are between 1~16. - * @return None - * @details For example, ADC_ENABLE_CMP1(ADC, 5, ADC_ADCMPR_CMPCOND_GREATER_OR_EQUAL, 0x200, 10); - * Means ADC will assert comparator 1 flag if channel 5 conversion result is greater or - * equal to 0x200 for 10 times continuously. - * \hideinitializer - */ -#define ADC_ENABLE_CMP1(adc, \ - u32ChNum, \ - u32Condition, \ - u32Data, \ - u32MatchCount) ((adc)->ADCMPR[1] = ((u32ChNum) << ADC_ADCMPR_CMPCH_Pos) | \ - (u32Condition) | \ - ((u32Data) << ADC_ADCMPR_CMPD_Pos) | \ - (((u32MatchCount) - 1) << ADC_ADCMPR_CMPMATCNT_Pos) |\ - ADC_ADCMPR_CMPEN_Msk) - -/** - * @brief Disable comparator 1. - * @param[in] adc The pointer of the specified ADC module. - * @return None - * @details Set CMPEN (ADCMPR1[0]) to 0 to disable ADC controller to compare CMPD (ADCMPR1[25:16]). - */ -#define ADC_DISABLE_CMP1(adc) ((adc)->ADCMPR[1] = 0) - -/** - * @brief Set ADC input channel. - * @param[in] adc The pointer of the specified ADC module. - * @param[in] u32Mask Channel enable bit. Each bit corresponds to a input channel. Bit 0 is channel 0, bit 1 is channel 1..., bit 7 is channel 7. - * @return None - * @details Enabled channel will be converted while ADC starts. - * @note NUC123 series MCU ADC can only convert 1 channel at a time. If more than 1 channels are enabled, only channel - * with smallest number will be convert. - */ -#define ADC_SET_INPUT_CHANNEL(adc, u32Mask) ((adc)->ADCHER = ((adc)->ADCHER & ~ADC_ADCHER_CHEN_Msk) | (u32Mask)) - -/** - * @brief Start the A/D conversion. - * @param[in] adc The pointer of the specified ADC module. - * @return None - * @details ADST (ADCR[11]) can be set to 1 from three sources: software, PWM Center-aligned trigger and external pin STADC. - */ -#define ADC_START_CONV(adc) ((adc)->ADCR |= ADC_ADCR_ADST_Msk) - -/** - * @brief Stop the A/D conversion. - * @param[in] adc The pointer of the specified ADC module. - * @return None - * @details ADST (ADCR[11]) will be cleared to 0 by hardware automatically at the ends of single mode and single-cycle scan mode. - * In continuous scan mode, A/D conversion is continuously performed until software writes 0 to this bit or chip reset. - */ -#define ADC_STOP_CONV(adc) ((adc)->ADCR &= ~ADC_ADCR_ADST_Msk) - -void ADC_Open(ADC_T *adc, - uint32_t u32InputMode, - uint32_t u32OpMode, - uint32_t u32ChMask); -void ADC_Close(ADC_T *adc); -void ADC_EnableHWTrigger(ADC_T *adc, - uint32_t u32Source, - uint32_t u32Param); -void ADC_DisableHWTrigger(ADC_T *adc); -void ADC_EnableInt(ADC_T *adc, uint32_t u32Mask); -void ADC_DisableInt(ADC_T *adc, uint32_t u32Mask); - - - -/*@}*/ /* end of group ADC_EXPORTED_FUNCTIONS */ - -/*@}*/ /* end of group ADC_Driver */ - -/*@}*/ /* end of group Standard_Driver */ - -#ifdef __cplusplus -} -#endif - -#endif //__ADC_H__ - -/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/clk.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/clk.h deleted file mode 100644 index c66cdd26..00000000 --- a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/clk.h +++ /dev/null @@ -1,409 +0,0 @@ -/**************************************************************************//** - * @file clk.h - * @version V3.0 - * $Revision: 16 $ - * $Date: 15/07/02 11:21a $ - * @brief NUC123 Series Clock Control Driver Header File - * - * @note - * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. - * - ******************************************************************************/ -#ifndef __CLK_H__ -#define __CLK_H__ - -#ifdef __cplusplus -extern "C" -{ -#endif - -/** @addtogroup Standard_Driver Standard Driver - @{ -*/ - -/** @addtogroup CLK_Driver CLK Driver - @{ -*/ - -/** @addtogroup CLK_EXPORTED_CONSTANTS CLK Exported Constants - @{ -*/ - -#define FREQ_25MHZ 25000000 -#define FREQ_50MHZ 50000000 -#define FREQ_72MHZ 72000000 -#define FREQ_100MHZ 100000000 -#define FREQ_200MHZ 200000000 - - -/*---------------------------------------------------------------------------------------------------------*/ -/* CLKSEL0 constant definitions. */ -/*---------------------------------------------------------------------------------------------------------*/ -#define CLK_CLKSEL0_HCLK_S_HXT (0x0UL<>30) & 0x3) /*!< Calculate APBCLK offset on MODULE index, 0x0:AHBCLK, 0x1:APBCLK */ -#define MODULE_CLKSEL(x) (((x) >>28) & 0x3) /*!< Calculate CLKSEL offset on MODULE index, 0x0:CLKSEL0, 0x1:CLKSEL1, 0x2:CLKSEL2 */ -#define MODULE_CLKSEL_Msk(x) (((x) >>25) & 0x7) /*!< Calculate CLKSEL mask offset on MODULE index */ -#define MODULE_CLKSEL_Pos(x) (((x) >>20) & 0x1f) /*!< Calculate CLKSEL position offset on MODULE index */ -#define MODULE_CLKDIV(x) (((x) >>18) & 0x3) /*!< Calculate APBCLK CLKDIV on MODULE index, 0x0:CLKDIV */ -#define MODULE_CLKDIV_Msk(x) (((x) >>10) & 0xff) /*!< Calculate CLKDIV mask offset on MODULE index */ -#define MODULE_CLKDIV_Pos(x) (((x) >>5 ) & 0x1f) /*!< Calculate CLKDIV position offset on MODULE index */ -#define MODULE_IP_EN_Pos(x) (((x) >>0 ) & 0x1f) /*!< Calculate APBCLK offset on MODULE index */ -#define MODULE_NoMsk 0x0 /*!< Not mask on MODULE index */ -#define NA MODULE_NoMsk /*!< Not Available */ - -#define MODULE_APBCLK_ENC(x) (((x) & 0x03) << 30) /*!< MODULE index, 0x0:AHBCLK, 0x1:APBCLK */ -#define MODULE_CLKSEL_ENC(x) (((x) & 0x03) << 28) /*!< CLKSEL offset on MODULE index, 0x0:CLKSEL0, 0x1:CLKSEL1, 0x2:CLKSEL2 */ -#define MODULE_CLKSEL_Msk_ENC(x) (((x) & 0x07) << 25) /*!< CLKSEL mask offset on MODULE index */ -#define MODULE_CLKSEL_Pos_ENC(x) (((x) & 0x1f) << 20) /*!< CLKSEL position offset on MODULE index */ -#define MODULE_CLKDIV_ENC(x) (((x) & 0x03) << 18) /*!< APBCLK CLKDIV on MODULE index, 0x0:CLKDIV */ -#define MODULE_CLKDIV_Msk_ENC(x) (((x) & 0xff) << 10) /*!< CLKDIV mask offset on MODULE index */ -#define MODULE_CLKDIV_Pos_ENC(x) (((x) & 0x1f) << 5) /*!< CLKDIV position offset on MODULE index */ -#define MODULE_IP_EN_Pos_ENC(x) (((x) & 0x1f) << 0) /*!< APBCLK offset on MODULE index */ - - -#define PDMA_MODULE (MODULE_APBCLK_ENC( 0)|MODULE_IP_EN_Pos_ENC(CLK_AHBCLK_PDMA_EN_Pos) |\ - MODULE_CLKSEL_ENC(NA)|MODULE_CLKSEL_Msk_ENC(NA)|MODULE_CLKSEL_Pos_ENC(NA)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< PDMA Module */ -#define ISP_MODULE (MODULE_APBCLK_ENC( 0)|MODULE_IP_EN_Pos_ENC(CLK_AHBCLK_ISP_EN_Pos) |\ - MODULE_CLKSEL_ENC(NA)|MODULE_CLKSEL_Msk_ENC(NA)|MODULE_CLKSEL_Pos_ENC(NA)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< ISP Module */ - -#define WDT_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_WDT_EN_Pos) |\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC( 0)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< WDT Module */ -#define TMR0_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_TMR0_EN_Pos) |\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 7)|MODULE_CLKSEL_Pos_ENC( 8)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< TMR0 Module */ -#define TMR1_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_TMR1_EN_Pos) |\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 7)|MODULE_CLKSEL_Pos_ENC(12)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< TMR1 Module */ -#define TMR2_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_TMR2_EN_Pos) |\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 7)|MODULE_CLKSEL_Pos_ENC(16)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< TMR2 Module */ -#define TMR3_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_TMR3_EN_Pos) |\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 7)|MODULE_CLKSEL_Pos_ENC(20)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< TMR3 Module */ -#define FDIV_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_FDIV_EN_Pos) |\ - MODULE_CLKSEL_ENC( 2)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC( 2)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< FDIV Module */ - -#define I2C0_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_I2C0_EN_Pos) |\ - MODULE_CLKSEL_ENC(NA)|MODULE_CLKSEL_Msk_ENC(NA)|MODULE_CLKSEL_Pos_ENC(NA)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< I2C0 Module */ -#define I2C1_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_I2C1_EN_Pos) |\ - MODULE_CLKSEL_ENC(NA)|MODULE_CLKSEL_Msk_ENC(NA)|MODULE_CLKSEL_Pos_ENC(NA)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< I2C1 Module */ -#define SPI0_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_SPI0_EN_Pos) |\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 1)|MODULE_CLKSEL_Pos_ENC( 4)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< SPI0 Module */ -#define SPI1_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_SPI1_EN_Pos) |\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 1)|MODULE_CLKSEL_Pos_ENC( 5)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< SPI1 Module */ -#define SPI2_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_SPI2_EN_Pos) |\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 1)|MODULE_CLKSEL_Pos_ENC( 6)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< SPI2 Module */ - -#define UART0_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_UART0_EN_Pos)|\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC(24)|\ - MODULE_CLKDIV_ENC( 0)|MODULE_CLKDIV_Msk_ENC(0x0F)|MODULE_CLKDIV_Pos_ENC( 8)) /*!< UART0 Module */ -#define UART1_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_UART1_EN_Pos)|\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC(24)|\ - MODULE_CLKDIV_ENC( 0)|MODULE_CLKDIV_Msk_ENC(0x0F)|MODULE_CLKDIV_Pos_ENC( 8)) /*!< UART1 Module */ - -#define PWM01_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_PWM01_EN_Pos)|\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC(28)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< PWM01 Module */ -#define PWM23_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_PWM23_EN_Pos)|\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC(30)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< PWM23 Module */ -#define USBD_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_USBD_EN_Pos) |\ - MODULE_CLKSEL_ENC(NA)|MODULE_CLKSEL_Msk_ENC(NA)|MODULE_CLKSEL_Pos_ENC(NA)|\ - MODULE_CLKDIV_ENC( 0)|MODULE_CLKDIV_Msk_ENC(0x0F)|MODULE_CLKDIV_Pos_ENC(4)) /*!< USBD Module */ -#define ADC_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_ADC_EN_Pos) |\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC( 2)|\ - MODULE_CLKDIV_ENC( 0)|MODULE_CLKDIV_Msk_ENC(0xFF)|MODULE_CLKDIV_Pos_ENC(16)) /*!< ADC Module */ -#define I2S_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_I2S_EN_Pos) |\ - MODULE_CLKSEL_ENC( 2)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC( 0)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< I2S Module */ -#define PS2_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_PS2_EN_Pos) |\ - MODULE_CLKSEL_ENC(NA)|MODULE_CLKSEL_Msk_ENC(NA)|MODULE_CLKSEL_Pos_ENC(NA)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< PS2 Module */ - -#define WWDT_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_WDT_EN_Pos) |\ - MODULE_CLKSEL_ENC( 2)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC(16)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< WWDT Module */ - -/*@}*/ /* end of group CLK_EXPORTED_CONSTANTS */ - - -/** @addtogroup CLK_EXPORTED_FUNCTIONS CLK Exported Functions - @{ -*/ - - -/** - * @brief Get PLL clock frequency - * @param None - * @return PLL frequency - * @details This function get PLL frequency. The frequency unit is Hz. - */ -__STATIC_INLINE uint32_t CLK_GetPLLClockFreq(void) -{ - uint32_t u32PllFreq = 0, u32PllReg; - uint32_t u32FIN, u32NF, u32NR, u32NO; - uint8_t au8NoTbl[4] = {1, 2, 2, 4}; - - u32PllReg = CLK->PLLCON; - - if(u32PllReg & (CLK_PLLCON_PD_Msk | CLK_PLLCON_OE_Msk)) - return 0; /* PLL is in power down mode or fix low */ - - if(u32PllReg & CLK_PLLCON_PLL_SRC_HIRC) - u32FIN = __HIRC; /* PLL source clock from HIRC */ - else - u32FIN = __HXT; /* PLL source clock from HXT */ - - if(u32PllReg & CLK_PLLCON_BP_Msk) - return u32FIN; /* PLL is in bypass mode */ - - /* PLL is output enabled in normal work mode */ - u32NO = au8NoTbl[((u32PllReg & CLK_PLLCON_OUT_DV_Msk) >> CLK_PLLCON_OUT_DV_Pos)]; - u32NF = ((u32PllReg & CLK_PLLCON_FB_DV_Msk) >> CLK_PLLCON_FB_DV_Pos) + 2; - u32NR = ((u32PllReg & CLK_PLLCON_IN_DV_Msk) >> CLK_PLLCON_IN_DV_Pos) + 2; - - /* u32FIN is shifted 2 bits to avoid overflow */ - u32PllFreq = (((u32FIN >> 2) * u32NF) / (u32NR * u32NO) << 2); - - return u32PllFreq; -} - -/** - * @brief This function execute delay function. - * @param[in] us Delay time. The Max value is 2^24 / CPU Clock(MHz). Ex: - * 72MHz => 233016us, 50MHz => 335544us, - 48MHz => 349525us, 28MHz => 699050us ... - * @return None - * @details Use the SysTick to generate the delay time and the UNIT is in us. - * The SysTick clock source is from HCLK, i.e the same as system core clock. - * User can use SystemCoreClockUpdate() to calculate CyclesPerUs automatically before using this function. - */ -__STATIC_INLINE void CLK_SysTickDelay(uint32_t us) -{ - SysTick->LOAD = us * CyclesPerUs; - SysTick->VAL = (0x00); - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; - - /* Waiting for down-count to zero */ - while((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0); - - /* Disable SysTick counter */ - SysTick->CTRL = 0; -} - - -void CLK_DisableCKO(void); -void CLK_EnableCKO(uint32_t u32ClkSrc, uint32_t u32ClkDiv, uint32_t u32ClkDivBy1En); -void CLK_PowerDown(void); -void CLK_Idle(void); -uint32_t CLK_GetHXTFreq(void); -uint32_t CLK_GetHCLKFreq(void); -uint32_t CLK_GetPCLKFreq(void); -uint32_t CLK_GetCPUFreq(void); -uint32_t CLK_SetCoreClock(uint32_t u32Hclk); -void CLK_SetHCLK(uint32_t u32ClkSrc, uint32_t u32ClkDiv); -void CLK_SetModuleClock(uint32_t u32ModuleIdx, uint32_t u32ClkSrc, uint32_t u32ClkDiv); -void CLK_SetSysTickClockSrc(uint32_t u32ClkSrc); -void CLK_EnableXtalRC(uint32_t u32ClkMask); -void CLK_DisableXtalRC(uint32_t u32ClkMask); -void CLK_EnableModuleClock(uint32_t u32ModuleIdx); -void CLK_DisableModuleClock(uint32_t u32ModuleIdx); -uint32_t CLK_EnablePLL(uint32_t u32PllClkSrc, uint32_t u32PllFreq); -void CLK_DisablePLL(void); -uint32_t CLK_WaitClockReady(uint32_t u32ClkMask); -void CLK_EnableSysTick(uint32_t u32ClkSrc, uint32_t u32Count); -void CLK_DisableSysTick(void); - - -/*@}*/ /* end of group CLK_EXPORTED_FUNCTIONS */ - -/*@}*/ /* end of group CLK_Driver */ - -/*@}*/ /* end of group Standard_Driver */ - - - -#endif //__CLK_H__ - - - -/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/crc.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/crc.h deleted file mode 100644 index 8c78e63f..00000000 --- a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/crc.h +++ /dev/null @@ -1,165 +0,0 @@ -/**************************************************************************//** - * @file crc.h - * @version V3.00 - * $Revision: 5 $ - * $Date: 15/07/02 11:21a $ - * @brief NUC123 series CRC driver header file - * - * @note - * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. - *****************************************************************************/ -#ifndef __CRC_H__ -#define __CRC_H__ - -#ifdef __cplusplus -extern "C" -{ -#endif - - -/** @addtogroup Standard_Driver Standard Driver - @{ -*/ - -/** @addtogroup CRC_Driver CRC Driver - @{ -*/ - -/** @addtogroup CRC_EXPORTED_CONSTANTS CRC Exported Constants - @{ -*/ -/*---------------------------------------------------------------------------------------------------------*/ -/* CRC Polynomial Mode Constant Definitions */ -/*---------------------------------------------------------------------------------------------------------*/ -#define CRC_CCITT 0x00000000UL /*!DMAIER |= (u32Mask)) - -/** - * @brief Disable CRC Interrupt - * - * @param[in] u32Mask Interrupt mask. Valid values are: - * - \ref CRC_DMAIER_CRC_BLKD_IE_Msk - * - \ref CRC_DMAIER_CRC_TABORT_IE_Msk - * - * @return None - * - * @details This macro disable the specify CRC interrupt function by u32Mask setting. - */ -#define CRC_DISABLE_INT(u32Mask) (CRC->DMAIER &= ~(u32Mask)) - -/** - * @brief Get CRC Interrupt Flag - * - * @param None - * - * @return Interrupt Flag Status - * - * @details This macro gets the CRC interrupt flags. - */ -#define CRC_GET_INT_FLAG() ((uint32_t)(CRC->DMAISR)) - -/** - * @brief Clear CRC Interrupt Flag - * - * @param[in] u32Mask Interrupt mask. Valid values are: - * - \ref CRC_DMAISR_CRC_BLKD_IF_Msk - * - \ref CRC_DMAISR_CRC_TABORT_IF_Msk - * - * @return None - * - * @details This macro clear the specify CRC interrupt flag by u32Mask setting. - */ -#define CRC_CLR_INT_FLAG(u32Mask) (CRC->DMAISR = (u32Mask)) - -/** - * @brief Set CRC seed value - * - * @param[in] u32Seed Seed value - * - * @return None - * - * @details This macro set CRC seed value. - * - * @note User must to setting CRC_RST (CRC_CTL[1] CRC Engine Reset) to reload the new seed value - * to CRC controller. - */ -#define CRC_SET_SEED(u32Seed) { CRC->SEED = (u32Seed); CRC->CTL |= CRC_CTL_CRC_RST_Msk; } - -/** - * @brief Get CRC Seed value - * - * @param None - * - * @return Seed Value - * - * @details This macro gets the current CRC seed value. - */ -#define CRC_GET_SEED() ((uint32_t)(CRC->SEED)) - -/** - * @brief CRC write data - * - * @param[in] u32Data write data - * - * @return None - * - * @details User can write data directly by this macro to perform CRC operation. - */ -#define CRC_WRITE_DATA(u32Data) (CRC->WDATA = (u32Data)) - - -/*********************************************************************/ -void CRC_Open(uint32_t u32Mode, uint32_t u32Attribute, uint32_t u32Seed, uint32_t u32DataLen); -void CRC_StartDMATransfer(uint32_t u32SrcAddr, uint32_t u32ByteCount); -uint32_t CRC_GetChecksum(void); - -/*@}*/ /* end of group CRC_EXPORTED_FUNCTIONS */ - -/*@}*/ /* end of group CRC_Driver */ - -/*@}*/ /* end of group Standard_Driver */ - -#ifdef __cplusplus -} -#endif - -#endif //__CRC_H__ - -/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/fmc.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/fmc.h deleted file mode 100644 index 5592901f..00000000 --- a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/fmc.h +++ /dev/null @@ -1,480 +0,0 @@ -/**************************************************************************//** - * @file FMC.h - * @version V3.0 - * $Revision: 10 $ - * $Date: 15/07/02 11:21a $ - * @brief NUC123 Series Flash Memory Controller Driver Header File - * - * @note - * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. - * - ******************************************************************************/ -#ifndef __FMC_H__ -#define __FMC_H__ - -#include "NUC123.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - -/** @addtogroup Standard_Driver Standard Driver - @{ -*/ - -/** @addtogroup FMC_Driver FMC Driver - @{ -*/ - -/** @addtogroup FMC_EXPORTED_CONSTANTS FMC Exported Constants - @{ -*/ - - -/*---------------------------------------------------------------------------------------------------------*/ -/* Define Base Address */ -/*---------------------------------------------------------------------------------------------------------*/ -#define FMC_APROM_BASE 0x00000000UL /*!< APROM Base Address */ -#define FMC_LDROM_BASE 0x00100000UL /*!< LDROM Base Address */ -#define FMC_CONFIG_BASE 0x00300000UL /*!< CONFIG Base Address */ - -#define FMC_FLASH_PAGE_SIZE 0x200 /*!< Flash Page Size (512 Bytes) */ -#define FMC_LDROM_SIZE 0x1000 /*!< LDROM Size (4K Bytes) */ - -/*---------------------------------------------------------------------------------------------------------*/ -/* ISPCON constant definitions */ -/*---------------------------------------------------------------------------------------------------------*/ -#define FMC_ISPCON_BS_LDROM 0x2 /*!< ISPCON setting to select to boot from LDROM */ -#define FMC_ISPCON_BS_APROM 0x0 /*!< ISPCON setting to select to boot from APROM */ - -/*---------------------------------------------------------------------------------------------------------*/ -/* ISPCMD constant definitions */ -/*---------------------------------------------------------------------------------------------------------*/ -#define FMC_ISPCMD_READ 0x00 /*!< ISP Command: Read Flash */ -#define FMC_ISPCMD_PROGRAM 0x21 /*!< ISP Command: Program Flash */ -#define FMC_ISPCMD_PAGE_ERASE 0x22 /*!< ISP Command: Page Erase Flash */ -#define FMC_ISPCMD_VECMAP 0x2e /*!< ISP Command: Set VECMAP */ -#define FMC_ISPCMD_READ_UID 0x04 /*!< ISP Command: Read Unique ID */ -#define FMC_ISPCMD_READ_CID 0x0B /*!< ISP Command: Read Company ID */ -#define FMC_ISPCMD_READ_DID 0x0C /*!< ISP Command: Read Device ID */ - - -/*@}*/ /* end of group FMC_EXPORTED_CONSTANTS */ - -/** @addtogroup FMC_EXPORTED_FUNCTIONS FMC Exported Functions - @{ -*/ - -/*---------------------------------------------------------------------------------------------------------*/ -/* FMC Macro Definitions */ -/*---------------------------------------------------------------------------------------------------------*/ -/** - * @brief Enable ISP Function - * - * @param None - * - * @return None - * - * @details This function will set ISPEN bit of ISPCON control register to enable ISP function. - * - */ -#define FMC_ENABLE_ISP() (FMC->ISPCON |= FMC_ISPCON_ISPEN_Msk) - - -/** - * @brief Disable ISP Function - * - * @param None - * - * @return None - * - * @details This function will clear ISPEN bit of ISPCON control register to disable ISP function. - * - */ -#define FMC_DISABLE_ISP() (FMC->ISPCON &= ~FMC_ISPCON_ISPEN_Msk) - - -/** - * @brief Enable LDROM Update Function - * - * @param None - * - * @return None - * - * @details This function will set LDUEN bit of ISPCON control register to enable LDROM update function. - * User needs to set LDUEN bit before they can update LDROM. - * - */ -#define FMC_ENABLE_LD_UPDATE() (FMC->ISPCON |= FMC_ISPCON_LDUEN_Msk) - - - -/** - * @brief Disable LDROM Update Function - * - * @param None - * - * @return None - * - * @details This function will set ISPEN bit of ISPCON control register to disable LDROM update function. - * - */ -#define FMC_DISABLE_LD_UPDATE() (FMC->ISPCON &= ~FMC_ISPCON_LDUEN_Msk) /*!< Disable LDROM Update Function */ - - - -/** - * @brief Enable User Configuration Update Function - * - * @param None - * - * @return None - * - * @details This function will set CFGUEN bit of ISPCON control register to enable User Configuration update function. - * User needs to set CFGUEN bit before they can update User Configuration area. - * - */ -#define FMC_ENABLE_CFG_UPDATE() (FMC->ISPCON |= FMC_ISPCON_CFGUEN_Msk) - -/** - * @brief Disable User Configuration Update Function - * - * @param None - * - * @return None - * - * @details This function will clear CFGUEN bit of ISPCON control register to disable User Configuration update function. - * - */ -#define FMC_DISABLE_CFG_UPDATE() (FMC->ISPCON &= ~FMC_ISPCON_CFGUEN_Msk) /*!< Disable CONFIG Update Function */ - - -/** - * @brief Enable APROM Update Function - * - * @param None - * - * @return None - * - * @details This function will set APUEN bit of ISPCON control register to enable APROM update function. - * User needs to set APUEN bit before they can update APROM in APROM boot mode. - * - */ -#define FMC_ENABLE_AP_UPDATE() (FMC->ISPCON |= FMC_ISPCON_APUEN_Msk) - - -/** - * @brief Disable APROM Update Function - * - * @param None - * - * @return None - * - * @details This function will clear APUEN bit of ISPCON control register to disable APROM update function. - * - */ -#define FMC_DISABLE_AP_UPDATE() (FMC->ISPCON &= ~FMC_ISPCON_APUEN_Msk) /*!< Disable APROM Update Function */ - -/** - * @brief Get ISP fail flag - * - * @param None - * - * @retval 0 Previous ISP command execution result is successful - * @retval 1 Previous ISP command execution result is fail - * - * @details ISPFF flag of ISPCON is used to indicate ISP command success or fail. - * This function will return the ISPFF flag to identify ISP command OK or fail. - * - */ -#define FMC_GET_FAIL_FLAG() ((FMC->ISPCON & FMC_ISPCON_ISPFF_Msk) ? 1 : 0) - - -/** - * @brief Select booting from APROM - * - * @param None - * - * @return None - * - * @details If MCU is working without IAP, user need to set BS bit of ISPCON and reset CPU to execute the code of LDROM/APROM. - * This function is used to set BS bit of ISPCON to boot to APROM. - * - * @note To valid new BS bit setting, user also need to trigger CPU reset or System Reset Request after setting BS bit. - * - */ -#define FMC_SET_APROM_BOOT() (FMC->ISPCON &= ~FMC_ISPCON_BS_Msk) - -/** - * @brief Select booting from APROM - * - * @param None - * - * @return None - * - * @details If MCU is working without IAP, user need to set/clear BS bit of ISPCON and reset CPU to execute the code of APROM/LDROM. - * This function is used to clear BS bit of ISPCON to boot to LDROM. - * - * @note To valid new BS bit setting, user also need to trigger CPU reset or System Reset Request after clear BS bit. - * - */ -#define FMC_SET_LDROM_BOOT() (FMC->ISPCON |= FMC_ISPCON_BS_Msk) - - -/*---------------------------------------------------------------------------------------------------------*/ -/* inline functions */ -/*---------------------------------------------------------------------------------------------------------*/ -/** - * @brief Program 32-bit data into specified address of flash - * - * @param[in] u32addr Flash address include APROM, LDROM, Data Flash, and CONFIG - * @param[in] u32data 32-bit Data to program - * - * @return None - * - * @details To program word data into Flash include APROM, LDROM, Data Flash, and CONFIG. - * The corresponding functions in CONFIG are listed in FMC section of Technical Reference Manual. - * - */ -static __INLINE void FMC_Write(uint32_t u32addr, uint32_t u32data) -{ - FMC->ISPCMD = FMC_ISPCMD_PROGRAM; /* Set ISP Command Code */ - FMC->ISPADR = u32addr; /* Set Target ROM Address. The address must be word alignment. */ - FMC->ISPDAT = u32data; /* Set Data to Program */ - FMC->ISPTRG = 0x1; /* Trigger to start ISP procedure */ - __ISB(); /* To make sure ISP/CPU be Synchronized */ - while(FMC->ISPTRG); /* Waiting for ISP Done */ -} - -/** - * @brief Read 32-bit Data from specified address of flash - * - * @param[in] u32addr Flash address include APROM, LDROM, Data Flash, and CONFIG - * - * @return The data of specified address - * - * @details To read word data from Flash include APROM, LDROM, Data Flash, and CONFIG. - * - */ -static __INLINE uint32_t FMC_Read(uint32_t u32addr) -{ - FMC->ISPCMD = FMC_ISPCMD_READ; /* Set ISP Command Code */ - FMC->ISPADR = u32addr; /* Set Target ROM Address. The address must be word alignment. */ - FMC->ISPTRG = 0x1; /* Trigger to start ISP procedure */ - __ISB(); /* To make sure ISP/CPU be Synchronized */ - while(FMC->ISPTRG); /* Waiting for ISP Done */ - - return FMC->ISPDAT; -} - - -/** - * @brief Flash page erase - * - * @param[in] u32addr Flash address including APROM, LDROM, Data Flash, and CONFIG - * - * @details To do flash page erase. The target address could be APROM, LDROM, Data Flash, or CONFIG. - * The page size is 512 bytes. - * - * @retval 0 Success - * @retval -1 Erase failed - * - */ -static __INLINE int32_t FMC_Erase(uint32_t u32addr) -{ - FMC->ISPCMD = FMC_ISPCMD_PAGE_ERASE; /* Set ISP Command Code */ - FMC->ISPADR = u32addr; /* Set Target ROM Address. The address must be page alignment. */ - FMC->ISPTRG = 0x1; /* Trigger to start ISP procedure */ - __ISB(); /* To make sure ISP/CPU be Synchronized */ - while(FMC->ISPTRG); /* Waiting for ISP Done */ - - /* Check ISPFF flag to know whether erase OK or fail. */ - if(FMC->ISPCON & FMC_ISPCON_ISPFF_Msk) - { - FMC->ISPCON |= FMC_ISPCON_ISPFF_Msk; - return -1; - } - return 0; -} - -/** - * @brief Read Unique ID - * - * @param[in] u8index UID index. 0 = UID[31:0], 1 = UID[63:32], 2 = UID[95:64] - * - * @return The 32-bit unique ID data of specified UID index. - * - * @details To read out 96-bit Unique ID. - * - */ -static __INLINE uint32_t FMC_ReadUID(uint8_t u8index) -{ - FMC->ISPCMD = FMC_ISPCMD_READ_UID; /* Set ISP Command Code */ - FMC->ISPADR = (u8index << 2); /* Set UID Address. It must be word alignment. */ - FMC->ISPTRG = 0x1; /* Trigger to start ISP procedure */ - __ISB(); /* To make sure ISP/CPU be Synchronized */ - while(FMC->ISPTRG); /* Waiting for ISP Done */ - - return FMC->ISPDAT; -} - - -/** - * @brief Read company ID - * - * @param None - * - * @return The company ID (32-bit) - * - * @details The company ID of Nuvoton is fixed to be 0xDA - * - */ -static __INLINE uint32_t FMC_ReadCID(void) -{ - FMC->ISPCMD = FMC_ISPCMD_READ_CID; /* Set ISP Command Code */ - FMC->ISPADR = 0x0; /* Must keep 0x0 when read CID */ - FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk; /* Trigger to start ISP procedure */ - __ISB(); /* To make sure ISP/CPU be Synchronized */ - while(FMC->ISPTRG & FMC_ISPTRG_ISPGO_Msk) ; /* Waiting for ISP Done */ - - return FMC->ISPDAT; -} - - -/** - * @brief Read device ID - * - * @param None - * - * @return The device ID (32-bit) - * - * @details This function is used to read device ID. - * - */ -static __INLINE uint32_t FMC_ReadDID(void) -{ - FMC->ISPCMD = FMC_ISPCMD_READ_DID; /* Set ISP Command Code */ - FMC->ISPADR = 0; /* Must keep 0x0 when read DID */ - FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk; /* Trigger to start ISP procedure */ - __ISB(); /* To make sure ISP/CPU be Synchronized */ - while(FMC->ISPTRG & FMC_ISPTRG_ISPGO_Msk); /* Waiting for ISP Done */ - - return FMC->ISPDAT; -} - - - -/** - * @brief Read product ID - * - * @param None - * - * @return The product ID (32-bit) - * - * @details This function is used to read product ID. - * - */ -static __INLINE uint32_t FMC_ReadPID(void) -{ - FMC->ISPCMD = FMC_ISPCMD_READ_DID; /* Set ISP Command Code */ - FMC->ISPADR = 0x04; /* Must keep 0x4 when read PID */ - FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk; /* Trigger to start ISP procedure */ - __ISB(); /* To make sure ISP/CPU be Synchronized */ - while(FMC->ISPTRG & FMC_ISPTRG_ISPGO_Msk); /* Waiting for ISP Done */ - - return FMC->ISPDAT; -} - -/** - * @brief To read UCID - * - * @param[in] u32Index Index of the UCID to read. u32Index must be 0, 1, 2, or 3. - * - * @return The UCID of specified index - * - * @details This function is used to read unique chip ID (UCID). - * - */ -static __INLINE uint32_t FMC_ReadUCID(uint32_t u32Index) -{ - FMC->ISPCMD = FMC_ISPCMD_READ_UID; /* Set ISP Command Code */ - FMC->ISPADR = (0x04 * u32Index) + 0x10; /* The UCID is at offset 0x10 with word alignment. */ - FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk; /* Trigger to start ISP procedure */ - __ISB(); /* To make sure ISP/CPU be Synchronized */ - while(FMC->ISPTRG & FMC_ISPTRG_ISPGO_Msk); /* Waiting for ISP Done */ - - return FMC->ISPDAT; -} - - - -/** - * @brief Set vector mapping address - * - * @param[in] u32PageAddr The page address to remap to address 0x0. The address must be page alignment. - * - * @return None - * - * @details This function is used to set VECMAP to map specified page to vector page (0x0). - * - * @note - * VECMAP only valid when new IAP function is enabled. (CBS = 10'b or 00'b) - * - */ -static __INLINE void FMC_SetVectorPageAddr(uint32_t u32PageAddr) -{ - FMC->ISPCMD = FMC_ISPCMD_VECMAP; /* Set ISP Command Code */ - FMC->ISPADR = u32PageAddr; /* The address of specified page which will be map to address 0x0. It must be page alignment. */ - FMC->ISPTRG = 0x1; /* Trigger to start ISP procedure */ - __ISB(); /* To make sure ISP/CPU be Synchronized */ - while(FMC->ISPTRG); /* Waiting for ISP Done */ -} - - -/** - * @brief Get current vector mapping address. - * - * @param None - * - * @return The current vector mapping address. - * - * @details To get VECMAP value which is the page address for remapping to vector page (0x0). - * - * @note - * VECMAP only valid when new IAP function is enabled. (CBS = 10'b or 00'b) - * - */ -static __INLINE uint32_t FMC_GetVECMAP(void) -{ - return (FMC->ISPSTA & FMC_ISPSTA_VECMAP_Msk); -} - -extern void FMC_Open(void); -extern void FMC_Close(void); -extern void FMC_EnableAPUpdate(void); -extern void FMC_DisableAPUpdate(void); -extern void FMC_EnableConfigUpdate(void); -extern void FMC_DisableConfigUpdate(void); -extern void FMC_EnableLDUpdate(void); -extern void FMC_DisableLDUpdate(void); -extern int32_t FMC_ReadConfig(uint32_t *u32Config, uint32_t u32Count); -extern int32_t FMC_WriteConfig(uint32_t *u32Config, uint32_t u32Count); -extern void FMC_SetBootSource(int32_t i32BootSrc); -extern int32_t FMC_GetBootSource(void); -extern uint32_t FMC_ReadDataFlashBaseAddr(void); - -/*@}*/ /* end of group FMC_EXPORTED_FUNCTIONS */ - -/*@}*/ /* end of group FMC_Driver */ - -/*@}*/ /* end of group Standard_Driver */ - -#ifdef __cplusplus -} -#endif - - -#endif - diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/gpio.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/gpio.h deleted file mode 100644 index ad34654b..00000000 --- a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/gpio.h +++ /dev/null @@ -1,457 +0,0 @@ -/**************************************************************************//** - * @file GPIO.h - * @version V3.00 - * $Revision: 13 $ - * $Date: 15/07/02 11:21a $ - * @brief NUC123 Series General Purpose I/O Driver Header File - * - * @note - * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. - * - ******************************************************************************/ -#ifndef __GPIO_H__ -#define __GPIO_H__ - -#ifdef __cplusplus -extern "C" -{ -#endif - - -/** @addtogroup Standard_Driver Standard Driver - @{ -*/ - -/** @addtogroup GPIO_Driver GPIO Driver - @{ -*/ - -/** @addtogroup GPIO_EXPORTED_CONSTANTS GPIO Exported Constants - @{ -*/ -#define GPIO_PIN_MAX 16 /*!< Specify Maximum Pins of Each GPIO Port */ - -/*---------------------------------------------------------------------------------------------------------*/ -/* PMD Constant Definitions */ -/*---------------------------------------------------------------------------------------------------------*/ -#define GPIO_PMD_INPUT 0x0UL /*!< Input Mode */ -#define GPIO_PMD_OUTPUT 0x1UL /*!< Output Mode */ -#define GPIO_PMD_OPEN_DRAIN 0x2UL /*!< Open-Drain Mode */ -#define GPIO_PMD_QUASI 0x3UL /*!< Quasi-bidirectional Mode */ - -/*---------------------------------------------------------------------------------------------------------*/ -/* GPIO Interrupt Type Constant Definitions */ -/*---------------------------------------------------------------------------------------------------------*/ -#define GPIO_INT_RISING 0x00010000UL /*!< Interrupt enable by Input Rising Edge */ -#define GPIO_INT_FALLING 0x00000001UL /*!< Interrupt enable by Input Falling Edge */ -#define GPIO_INT_BOTH_EDGE 0x00010001UL /*!< Interrupt enable by both Rising Edge and Falling Edge */ -#define GPIO_INT_HIGH 0x01010000UL /*!< Interrupt enable by Level-High */ -#define GPIO_INT_LOW 0x01000001UL /*!< Interrupt enable by Level-Level */ - -/*---------------------------------------------------------------------------------------------------------*/ -/* IMD Constant Definitions */ -/*---------------------------------------------------------------------------------------------------------*/ -#define GPIO_IMD_EDGE 0UL /*!< IMD Setting for Edge Trigger Mode */ -#define GPIO_IMD_LEVEL 1UL /*!< IMD Setting for Edge Level Mode */ - -/*---------------------------------------------------------------------------------------------------------*/ -/* DBNCECON Constant Definitions */ -/*---------------------------------------------------------------------------------------------------------*/ -#define GPIO_INT_CLK_ON 0x00000020UL /*!< DBNCECON setting for all IO pins edge detection circuit is always active after reset */ -#define GPIO_INT_CLK_OFF 0x00000000UL /*!< DBNCECON setting for edge detection circuit is active only if IO pin corresponding GPIOx_IEN bit is set to 1 */ - -#define GPIO_DBCLKSRC_LIRC 0x00000010UL /*!< DBNCECON setting for de-bounce counter clock source is the internal 10 kHz */ -#define GPIO_DBCLKSRC_HCLK 0x00000000UL /*!< DBNCECON setting for de-bounce counter clock source is the HCLK */ - -#define GPIO_DBCLKSEL_1 0x00000000UL /*!< DBNCECON setting for sampling cycle = 1 clocks */ -#define GPIO_DBCLKSEL_2 0x00000001UL /*!< DBNCECON setting for sampling cycle = 2 clocks */ -#define GPIO_DBCLKSEL_4 0x00000002UL /*!< DBNCECON setting for sampling cycle = 4 clocks */ -#define GPIO_DBCLKSEL_8 0x00000003UL /*!< DBNCECON setting for sampling cycle = 8 clocks */ -#define GPIO_DBCLKSEL_16 0x00000004UL /*!< DBNCECON setting for sampling cycle = 16 clocks */ -#define GPIO_DBCLKSEL_32 0x00000005UL /*!< DBNCECON setting for sampling cycle = 32 clocks */ -#define GPIO_DBCLKSEL_64 0x00000006UL /*!< DBNCECON setting for sampling cycle = 64 clocks */ -#define GPIO_DBCLKSEL_128 0x00000007UL /*!< DBNCECON setting for sampling cycle = 128 clocks */ -#define GPIO_DBCLKSEL_256 0x00000008UL /*!< DBNCECON setting for sampling cycle = 256 clocks */ -#define GPIO_DBCLKSEL_512 0x00000009UL /*!< DBNCECON setting for sampling cycle = 512 clocks */ -#define GPIO_DBCLKSEL_1024 0x0000000AUL /*!< DBNCECON setting for sampling cycle = 1024 clocks */ -#define GPIO_DBCLKSEL_2048 0x0000000BUL /*!< DBNCECON setting for sampling cycle = 2048 clocks */ -#define GPIO_DBCLKSEL_4096 0x0000000CUL /*!< DBNCECON setting for sampling cycle = 4096 clocks */ -#define GPIO_DBCLKSEL_8192 0x0000000DUL /*!< DBNCECON setting for sampling cycle = 8192 clocks */ -#define GPIO_DBCLKSEL_16384 0x0000000EUL /*!< DBNCECON setting for sampling cycle = 16384 clocks */ -#define GPIO_DBCLKSEL_32768 0x0000000FUL /*!< DBNCECON setting for sampling cycle = 32768 clocks */ - - -/* Define GPIO Pin Data Input/Output. It could be used to control each I/O pin by pin address mapping. - Example 1: - - PA10 = 1; - - It is used to set GPIO PA.10 to high; - - Example 2: - - if (PA10) - PA10 = 0; - - If GPIO PA.10 pin status is high, then set GPIO PA.10 data output to low. - */ -#define GPIO_PIN_DATA(port, pin) (*((volatile uint32_t *)((GPIO_PIN_DATA_BASE+(0x40*(port))) + ((pin)<<2)))) -#define PA10 GPIO_PIN_DATA(0, 10) /*!< Specify PA.10 Pin Data Input/Output */ -#define PA11 GPIO_PIN_DATA(0, 11) /*!< Specify PA.11 Pin Data Input/Output */ -#define PA12 GPIO_PIN_DATA(0, 12) /*!< Specify PA.12 Pin Data Input/Output */ -#define PA13 GPIO_PIN_DATA(0, 13) /*!< Specify PA.13 Pin Data Input/Output */ -#define PA14 GPIO_PIN_DATA(0, 14) /*!< Specify PA.14 Pin Data Input/Output */ -#define PA15 GPIO_PIN_DATA(0, 15) /*!< Specify PA.15 Pin Data Input/Output */ -#define PB0 GPIO_PIN_DATA(1, 0 ) /*!< Specify PB.0 Pin Data Input/Output */ -#define PB1 GPIO_PIN_DATA(1, 1 ) /*!< Specify PB.1 Pin Data Input/Output */ -#define PB2 GPIO_PIN_DATA(1, 2 ) /*!< Specify PB.2 Pin Data Input/Output */ -#define PB3 GPIO_PIN_DATA(1, 3 ) /*!< Specify PB.3 Pin Data Input/Output */ -#define PB4 GPIO_PIN_DATA(1, 4 ) /*!< Specify PB.4 Pin Data Input/Output */ -#define PB5 GPIO_PIN_DATA(1, 5 ) /*!< Specify PB.5 Pin Data Input/Output */ -#define PB6 GPIO_PIN_DATA(1, 6 ) /*!< Specify PB.6 Pin Data Input/Output */ -#define PB7 GPIO_PIN_DATA(1, 7 ) /*!< Specify PB.7 Pin Data Input/Output */ -#define PB8 GPIO_PIN_DATA(1, 8 ) /*!< Specify PB.8 Pin Data Input/Output */ -#define PB9 GPIO_PIN_DATA(1, 9 ) /*!< Specify PB.9 Pin Data Input/Output */ -#define PB10 GPIO_PIN_DATA(1, 10) /*!< Specify PB.10 Pin Data Input/Output */ -#define PB12 GPIO_PIN_DATA(1, 12) /*!< Specify PB.12 Pin Data Input/Output */ -#define PB13 GPIO_PIN_DATA(1, 13) /*!< Specify PB.13 Pin Data Input/Output */ -#define PB14 GPIO_PIN_DATA(1, 14) /*!< Specify PB.14 Pin Data Input/Output */ -#define PB15 GPIO_PIN_DATA(1, 15) /*!< Specify PB.15 Pin Data Input/Output */ -#define PC0 GPIO_PIN_DATA(2, 0 ) /*!< Specify PC.0 Pin Data Input/Output */ -#define PC1 GPIO_PIN_DATA(2, 1 ) /*!< Specify PC.1 Pin Data Input/Output */ -#define PC2 GPIO_PIN_DATA(2, 2 ) /*!< Specify PC.2 Pin Data Input/Output */ -#define PC3 GPIO_PIN_DATA(2, 3 ) /*!< Specify PC.3 Pin Data Input/Output */ -#define PC4 GPIO_PIN_DATA(2, 4 ) /*!< Specify PC.4 Pin Data Input/Output */ -#define PC5 GPIO_PIN_DATA(2, 5 ) /*!< Specify PC.5 Pin Data Input/Output */ -#define PC8 GPIO_PIN_DATA(2, 8 ) /*!< Specify PC.8 Pin Data Input/Output */ -#define PC9 GPIO_PIN_DATA(2, 9 ) /*!< Specify PC.9 Pin Data Input/Output */ -#define PC10 GPIO_PIN_DATA(2, 10) /*!< Specify PC.10 Pin Data Input/Output */ -#define PC11 GPIO_PIN_DATA(2, 11) /*!< Specify PC.11 Pin Data Input/Output */ -#define PC12 GPIO_PIN_DATA(2, 12) /*!< Specify PC.12 Pin Data Input/Output */ -#define PC13 GPIO_PIN_DATA(2, 13) /*!< Specify PC.13 Pin Data Input/Output */ -#define PD0 GPIO_PIN_DATA(3, 0 ) /*!< Specify PD.0 Pin Data Input/Output */ -#define PD1 GPIO_PIN_DATA(3, 1 ) /*!< Specify PD.1 Pin Data Input/Output */ -#define PD2 GPIO_PIN_DATA(3, 2 ) /*!< Specify PD.2 Pin Data Input/Output */ -#define PD3 GPIO_PIN_DATA(3, 3 ) /*!< Specify PD.3 Pin Data Input/Output */ -#define PD4 GPIO_PIN_DATA(3, 4 ) /*!< Specify PD.4 Pin Data Input/Output */ -#define PD5 GPIO_PIN_DATA(3, 5 ) /*!< Specify PD.5 Pin Data Input/Output */ -#define PD8 GPIO_PIN_DATA(3, 8 ) /*!< Specify PD.8 Pin Data Input/Output */ -#define PD9 GPIO_PIN_DATA(3, 9 ) /*!< Specify PD.9 Pin Data Input/Output */ -#define PD10 GPIO_PIN_DATA(3, 10) /*!< Specify PD.10 Pin Data Input/Output */ -#define PD11 GPIO_PIN_DATA(3, 11) /*!< Specify PD.11 Pin Data Input/Output */ -#define PF0 GPIO_PIN_DATA(5, 0 ) /*!< Specify PF.0 Pin Data Input/Output */ -#define PF1 GPIO_PIN_DATA(5, 1 ) /*!< Specify PF.1 Pin Data Input/Output */ -#define PF2 GPIO_PIN_DATA(5, 2 ) /*!< Specify PF.2 Pin Data Input/Output */ -#define PF3 GPIO_PIN_DATA(5, 3 ) /*!< Specify PF.3 Pin Data Input/Output */ - - -/*@}*/ /* end of group GPIO_EXPORTED_CONSTANTS */ - - -/** @addtogroup GPIO_EXPORTED_FUNCTIONS GPIO Exported Functions - @{ -*/ - -/** - * @brief Clear GPIO Pin Interrupt Flag - * - * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. - * @param[in] u32PinMask The single or multiple pins of specified GPIO port. \n - * It could be BIT10 ~ BIT15 for PA GPIO port. \n - * It could be BIT0 ~ BIT10 and BIT12 ~ BIT15 for PB GPIO port. \n - * It could be BIT0 ~ BIT5 and BIT8 ~ BIT13 for PC GPIO port. \n - * It could be BIT0 ~ BIT5 and BIT8 ~ BIT11 for PD GPIO port. \n - * It could be BIT0 ~ BIT3 for PF GPIO port. - * - * @return None - * - * @details Clear the interrupt status of specified GPIO pin. - */ -#define GPIO_CLR_INT_FLAG(port, u32PinMask) ((port)->ISRC = (u32PinMask)) - -/** - * @brief Disable Pin De-bounce Function - * - * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. - * @param[in] u32PinMask The single or multiple pins of specified GPIO port. \n - * It could be BIT10 ~ BIT15 for PA GPIO port. \n - * It could be BIT0 ~ BIT10 and BIT12 ~ BIT15 for PB GPIO port. \n - * It could be BIT0 ~ BIT5 and BIT8 ~ BIT13 for PC GPIO port. \n - * It could be BIT0 ~ BIT5 and BIT8 ~ BIT11 for PD GPIO port. \n - * It could be BIT0 ~ BIT3 for PF GPIO port. - * - * @return None - * - * @details Disable the interrupt de-bounce function of specified GPIO pin. - */ -#define GPIO_DISABLE_DEBOUNCE(port, u32PinMask) ((port)->DBEN &= ~(u32PinMask)) - -/** - * @brief Enable Pin De-bounce Function - * - * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. - * @param[in] u32PinMask The single or multiple pins of specified GPIO port. \n - * It could be BIT10 ~ BIT15 for PA GPIO port. \n - * It could be BIT0 ~ BIT10 and BIT12 ~ BIT15 for PB GPIO port. \n - * It could be BIT0 ~ BIT5 and BIT8 ~ BIT13 for PC GPIO port. \n - * It could be BIT0 ~ BIT5 and BIT8 ~ BIT11 for PD GPIO port. \n - * It could be BIT0 ~ BIT3 for PF GPIO port. - * - * @return None - * - * @details Enable the interrupt de-bounce function of specified GPIO pin. - */ -#define GPIO_ENABLE_DEBOUNCE(port, u32PinMask) ((port)->DBEN |= (u32PinMask)) - -/** - * @brief Disable I/O Digital Input Path - * - * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. - * @param[in] u32PinMask The single or multiple pins of specified GPIO port. \n - * It could be BIT10 ~ BIT15 for PA GPIO port. \n - * It could be BIT0 ~ BIT10 and BIT12 ~ BIT15 for PB GPIO port. \n - * It could be BIT0 ~ BIT5 and BIT8 ~ BIT13 for PC GPIO port. \n - * It could be BIT0 ~ BIT5 and BIT8 ~ BIT11 for PD GPIO port. \n - * It could be BIT0 ~ BIT3 for PF GPIO port. - * - * @return None - * - * @details Disable I/O digital input path of specified GPIO pin. - */ -#define GPIO_DISABLE_DIGITAL_PATH(port, u32PinMask) ((port)->OFFD |= ((u32PinMask)<<16)) - -/** - * @brief Enable I/O Digital Input Path - * - * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. - * @param[in] u32PinMask The single or multiple pins of specified GPIO port \n. - * It could be BIT10 ~ BIT15 for PA GPIO port. \n - * It could be BIT0 ~ BIT10 and BIT12 ~ BIT15 for PB GPIO port. \n - * It could be BIT0 ~ BIT5 and BIT8 ~ BIT13 for PC GPIO port. \n - * It could be BIT0 ~ BIT5 and BIT8 ~ BIT11 for PD GPIO port. \n - * It could be BIT0 ~ BIT3 for PF GPIO port. - * - * @return None - * - * @details Enable I/O digital input path of specified GPIO pin. - */ -#define GPIO_ENABLE_DIGITAL_PATH(port, u32PinMask) ((port)->OFFD &= ~((u32PinMask)<<16)) - -/** - * @brief Disable I/O DOUT mask - * - * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. - * @param[in] u32PinMask The single or multiple pins of specified GPIO port. \n - * It could be BIT10 ~ BIT15 for PA GPIO port. \n - * It could be BIT0 ~ BIT10 and BIT12 ~ BIT15 for PB GPIO port. \n - * It could be BIT0 ~ BIT5 and BIT8 ~ BIT13 for PC GPIO port. \n - * It could be BIT0 ~ BIT5 and BIT8 ~ BIT11 for PD GPIO port. \n - * It could be BIT0 ~ BIT3 for PF GPIO port. - * - * @return None - * - * @details Disable I/O DOUT mask of specified GPIO pin. - */ -#define GPIO_DISABLE_DOUT_MASK(port, u32PinMask) ((port)->DMASK &= ~(u32PinMask)) - -/** - * @brief Enable I/O DOUT mask - * - * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. - * @param[in] u32PinMask The single or multiple pins of specified GPIO port. \n - * It could be BIT10 ~ BIT15 for PA GPIO port. \n - * It could be BIT0 ~ BIT10 and BIT12 ~ BIT15 for PB GPIO port. \n - * It could be BIT0 ~ BIT5 and BIT8 ~ BIT13 for PC GPIO port. \n - * It could be BIT0 ~ BIT5 and BIT8 ~ BIT11 for PD GPIO port. \n - * It could be BIT0 ~ BIT3 for PF GPIO port. - * - * @return None - * - * @details Enable I/O DOUT mask of specified GPIO pin. - */ -#define GPIO_ENABLE_DOUT_MASK(port, u32PinMask) ((port)->DMASK |= (u32PinMask)) - -/** - * @brief Get GPIO Pin Interrupt Flag - * - * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. - * @param[in] u32PinMask The single or multiple pins of specified GPIO port. \n - * It could be BIT10 ~ BIT15 for PA GPIO port. \n - * It could be BIT0 ~ BIT10 and BIT12 ~ BIT15 for PB GPIO port. \n - * It could be BIT0 ~ BIT5 and BIT8 ~ BIT13 for PC GPIO port. \n - * It could be BIT0 ~ BIT5 and BIT8 ~ BIT11 for PD GPIO port. \n - * It could be BIT0 ~ BIT3 for PF GPIO port. - * - * @retval 0 No interrupt at specified GPIO pin - * @retval 1 The specified GPIO pin generate an interrupt - * - * @details Get the interrupt status of specified GPIO pin. - */ -#define GPIO_GET_INT_FLAG(port, u32PinMask) ((port)->ISRC & (u32PinMask)) - -/** - * @brief Set De-bounce Sampling Cycle Time - * - * @param[in] u32ClkSrc The de-bounce counter clock source. It could be : - * - \ref GPIO_DBCLKSRC_HCLK - * - \ref GPIO_DBCLKSRC_LIRC - * @param[in] u32ClkSel The de-bounce sampling cycle selection. It could be : - * - \ref GPIO_DBCLKSEL_1 - * - \ref GPIO_DBCLKSEL_2 - * - \ref GPIO_DBCLKSEL_4 - * - \ref GPIO_DBCLKSEL_8 - * - \ref GPIO_DBCLKSEL_16 - * - \ref GPIO_DBCLKSEL_32 - * - \ref GPIO_DBCLKSEL_64 - * - \ref GPIO_DBCLKSEL_128 - * - \ref GPIO_DBCLKSEL_256 - * - \ref GPIO_DBCLKSEL_512 - * - \ref GPIO_DBCLKSEL_1024 - * - \ref GPIO_DBCLKSEL_2048 - * - \ref GPIO_DBCLKSEL_4096 - * - \ref GPIO_DBCLKSEL_8192 - * - \ref GPIO_DBCLKSEL_16384 - * - \ref GPIO_DBCLKSEL_32768 - * - * @return None - * - * @details Set the interrupt de-bounce sampling cycle time based on the debounce counter clock source. \n - * Example: _GPIO_SET_DEBOUNCE_TIME(GPIO_DBNCECON_DBCLKSRC_LIRC, GPIO_DBCLKSEL_4). \n - * It's meaning the De-debounce counter clock source is internal 10 KHz and sampling cycle selection is 4. \n - * Then the target de-bounce sampling cycle time is (4)*(1/(10*1000)) s = 4*0.0001 s = 400 us, - * and system will sampling interrupt input once per 400 us. - */ -#define GPIO_SET_DEBOUNCE_TIME(u32ClkSrc, u32ClkSel) (GPIO->DBNCECON = (GPIO_DBNCECON_ICLK_ON_Msk | (u32ClkSrc) | (u32ClkSel))) - -/** - * @brief Get GPIO Port IN Data - * - * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. - * - * @return The specified port data - * - * @details Get the PIN register of specified GPIO port. - */ -#define GPIO_GET_IN_DATA(port) ((port)->PIN) - -/** - * @brief Set GPIO Port OUT Data - * - * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. - * @param[in] u32Data GPIO port data. - * - * @return None - * - * @details Set the Data into specified GPIO port. - */ -#define GPIO_SET_OUT_DATA(port, u32Data) ((port)->DOUT = (u32Data)) - -/** - * @brief Toggle Specified GPIO pin - * - * @param[in] u32Pin Pxy - * - * @return None - * - * @details Toggle the specified GPIO pint. - */ -#define GPIO_TOGGLE(u32Pin) ((u32Pin) ^= 1) - -/** - * @brief Enable External GPIO Interrupt 0 - * - * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. - * @param[in] u32Pin The pin of specified GPIO port. \n - * It could be 10 ~ 15 for PA GPIO port. \n - * It could be 0 ~ 10 and 12 ~ 15 for PB GPIO port. \n - * It could be 0 ~ 5 and 8 ~ 13 for PC GPIO port. \n - * It could be 0 ~ 5 and 8 ~ 11 for PD GPIO port. \n - * It could be 0 ~ 3 for PF GPIO port. - * @param[in] u32IntAttribs The interrupt attribute of specified GPIO pin. It could be \n - * - \ref GPIO_INT_RISING - * - \ref GPIO_INT_FALLING - * - \ref GPIO_INT_BOTH_EDGE - * - \ref GPIO_INT_HIGH - * - \ref GPIO_INT_LOW - * - * @return None - * - * @details This function is used to enable specified GPIO pin interrupt. - */ -#define GPIO_EnableEINT0 GPIO_EnableInt - - -/** - * @brief Disable External GPIO Interrupt 0 - * - * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. - * @param[in] u32Pin The pin of specified GPIO port. \n - * It could be 10 ~ 15 for PA GPIO port. \n - * It could be 0 ~ 10 and 12 ~ 15 for PB GPIO port. \n - * It could be 0 ~ 5 and 8 ~ 13 for PC GPIO port. \n - * It could be 0 ~ 5 and 8 ~ 11 for PD GPIO port. \n - * It could be 0 ~ 3 for PF GPIO port. - * - * @return None - * - * @details This function is used to enable specified GPIO pin interrupt. - */ -#define GPIO_DisableEINT0 GPIO_DisableInt - - -/** - * @brief Enable External GPIO Interrupt 1 - * - * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. - * @param[in] u32Pin The pin of specified GPIO port. \n - * It could be 10 ~ 15 for PA GPIO port. \n - * It could be 0 ~ 10 and 12 ~ 15 for PB GPIO port. \n - * It could be 0 ~ 5 and 8 ~ 13 for PC GPIO port. \n - * It could be 0 ~ 5 and 8 ~ 11 for PD GPIO port. \n - * It could be 0 ~ 3 for PF GPIO port. - * @param[in] u32IntAttribs The interrupt attribute of specified GPIO pin. It could be \n - * GPIO_INT_RISING, GPIO_INT_FALLING, GPIO_INT_BOTH_EDGE, GPIO_INT_HIGH, GPIO_INT_LOW. - * - * @return None - * - * @details This function is used to enable specified GPIO pin interrupt. - */ -#define GPIO_EnableEINT1 GPIO_EnableInt - - -/** - * @brief Disable External GPIO Interrupt 1 - * - * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. - * @param[in] u32Pin The pin of specified GPIO port. \n - * It could be 10 ~ 15 for PA GPIO port. \n - * It could be 0 ~ 10 and 12 ~ 15 for PB GPIO port. \n - * It could be 0 ~ 5 and 8 ~ 13 for PC GPIO port. \n - * It could be 0 ~ 5 and 8 ~ 11 for PD GPIO port. \n - * It could be 0 ~ 3 for PF GPIO port. - * - * @return None - * - * @details This function is used to enable specified GPIO pin interrupt. - */ -#define GPIO_DisableEINT1 GPIO_DisableInt - - -void GPIO_SetMode(GPIO_T *port, uint32_t u32PinMask, uint32_t u32Mode); -void GPIO_EnableInt(GPIO_T *port, uint32_t u32Pin, uint32_t u32IntAttribs); -void GPIO_DisableInt(GPIO_T *port, uint32_t u32Pin); - - -/*@}*/ /* end of group GPIO_EXPORTED_FUNCTIONS */ - -/*@}*/ /* end of group GPIO_Driver */ - -/*@}*/ /* end of group Standard_Driver */ - -#ifdef __cplusplus -} -#endif - -#endif //__GPIO_H__ - -/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/i2c.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/i2c.h deleted file mode 100644 index 36e04b7b..00000000 --- a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/i2c.h +++ /dev/null @@ -1,211 +0,0 @@ -/**************************************************************************//** - * @file I2C.h - * @version V3.0 - * $Revision: 10 $ - * $Date: 16/06/22 11:46a $ - * @brief NUC123 Series I2C Driver Header File - * - * @note - * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. - * - ******************************************************************************/ -#ifndef __I2C_H__ -#define __I2C_H__ - -#include "NUC123.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - -/** @addtogroup Standard_Driver Standard Driver - @{ -*/ - -/** @addtogroup I2C_Driver I2C Driver - @{ -*/ - -/** @addtogroup I2C_EXPORTED_CONSTANTS I2C Exported Constants - @{ -*/ - -/*---------------------------------------------------------------------------------------------------------*/ -/* I2CON constant definitions. */ -/*---------------------------------------------------------------------------------------------------------*/ -#define I2C_I2CON_STA_STO_SI 0x38UL /*!< I2CON setting for I2C control bits. It would set STA, STO and SI bits */ -#define I2C_I2CON_STA_STO_SI_AA 0x3CUL /*!< I2CON setting for I2C control bits. It would set STA, STO, SI and AA bits */ -#define I2C_I2CON_STA_SI 0x28UL /*!< I2CON setting for I2C control bits. It would set STA and SI bits */ -#define I2C_I2CON_STA_SI_AA 0x2CUL /*!< I2CON setting for I2C control bits. It would set STA, SI and AA bits */ -#define I2C_I2CON_STO_SI 0x18UL /*!< I2CON setting for I2C control bits. It would set STO and SI bits */ -#define I2C_I2CON_STO_SI_AA 0x1CUL /*!< I2CON setting for I2C control bits. It would set STO, SI and AA bits */ -#define I2C_I2CON_SI 0x08UL /*!< I2CON setting for I2C control bits. It would set SI bit */ -#define I2C_I2CON_SI_AA 0x0CUL /*!< I2CON setting for I2C control bits. It would set SI and AA bits */ -#define I2C_I2CON_STA 0x20UL /*!< I2CON setting for I2C control bits. It would set STA bit */ -#define I2C_I2CON_STO 0x10UL /*!< I2CON setting for I2C control bits. It would set STO bit */ -#define I2C_I2CON_AA 0x04UL /*!< I2CON setting for I2C control bits. It would set AA bit */ - -#define I2C_GCMODE_ENABLE 1 /*!< Enable I2C GC Mode */ -#define I2C_GCMODE_DISABLE 0 /*!< Disable I2C GC Mode */ - -/*@}*/ /* end of group I2C_EXPORTED_CONSTANTS */ - -/** @addtogroup I2C_EXPORTED_FUNCTIONS I2C Exported Functions - @{ -*/ -/** - * @brief The macro is used to set I2C bus condition at One Time - * - * @param[in] i2c Specify I2C port - * @param[in] u8Ctrl A byte writes to I2C control register - * - * @return None - * - * @details Set I2CON register to control I2C bus conditions of START, STOP, SI, ACK. - */ -#define I2C_SET_CONTROL_REG(i2c, u8Ctrl) ((i2c)->I2CON = ((i2c)->I2CON & ~0x3c) | (u8Ctrl)) - -/** - * @brief The macro is used to set START condition of I2C Bus - * - * @param[in] i2c Specify I2C port - * - * @return None - * - * @details Set the I2C bus START condition in I2CON register. - */ -#define I2C_START(i2c) ((i2c)->I2CON = ((i2c)->I2CON | I2C_I2CON_SI_Msk) | I2C_I2CON_STA_Msk) - -/** - * @brief The macro is used to set STOP condition of I2C Bus - * - * @param[in] i2c Specify I2C port - * - * @return None - * - * @details Set the I2C bus STOP condition in I2CON register. - */ -#define I2C_STOP(i2c) ((i2c)->I2CON = ((i2c)->I2CON | I2C_I2CON_SI_Msk) | I2C_I2CON_STO_Msk) - -/** - * @brief The macro is used to wait I2C bus status get ready - * - * @param[in] i2c Specify I2C port - * - * @return None - * - * @details When a new status is presented of I2C bus, the SI flag will be set in I2CON register. - */ -#define I2C_WAIT_READY(i2c) while(!((i2c)->I2CON & I2C_I2CON_SI_Msk)) - -/** - * @brief The macro is used to Read I2C Bus Data Register - * - * @param[in] i2c Specify I2C port - * - * @return A byte of I2C data register - * - * @details I2C controller read data from bus and save it in I2CDAT register. - */ -#define I2C_GET_DATA(i2c) ((i2c)->I2CDAT) - -/** - * @brief Write a Data to I2C Data Register - * - * @param[in] i2c Specify I2C port - * @param[in] u8Data A byte that writes to data register - * - * @return None - * - * @details When write a data to I2CDAT register, the I2C controller will shift it to I2C bus. - */ -#define I2C_SET_DATA(i2c, u8Data) ((i2c)->I2CDAT = (u8Data)) - -/** - * @brief Get I2C Bus status code - * - * @param[in] i2c Specify I2C port - * - * @return I2C status code - * - * @details To get this status code to monitor I2C bus event. - */ -#define I2C_GET_STATUS(i2c) ((i2c)->I2CSTATUS) - -/** - * @brief Get Time-out flag from I2C Bus - * - * @param[in] i2c Specify I2C port - * - * @retval 0 I2C Bus time-out is not happened - * @retval 1 I2C Bus time-out is happened - * - * @details When I2C bus occurs time-out event, the time-out flag will be set. - */ -#define I2C_GET_TIMEOUT_FLAG(i2c) ( ((i2c)->I2CTOC & I2C_I2CTOC_TIF_Msk) == I2C_I2CTOC_TIF_Msk ? 1:0 ) - -/** - * @brief To get wake-up flag from I2C Bus - * - * @param[in] i2c Specify I2C port - * - * @retval 0 Chip is not woken-up from power-down mode - * @retval 1 Chip is woken-up from power-down mode - * - * @details I2C bus occurs wake-up event, wake-up flag will be set. - */ -#define I2C_GET_WAKEUP_FLAG(i2c) ( ((i2c)->I2CWKUPSTS & I2C_I2CWKUPSTS_WKUPIF_Msk) == I2C_I2CWKUPSTS_WKUPIF_Msk ? 1:0 ) - -/** - * @brief To clear wake-up flag - * - * @param[in] i2c Specify I2C port - * - * @return None - * - * @details If wake-up flag is set, use this macro to clear it. - */ -#define I2C_CLEAR_WAKEUP_FLAG(i2c) ((i2c)->I2CWKUPSTS |= I2C_I2CWKUPSTS_WKUPIF_Msk) - -void I2C_ClearTimeoutFlag(I2C_T *i2c); -void I2C_Close(I2C_T *i2c); -void I2C_Trigger(I2C_T *i2c, uint8_t u8Start, uint8_t u8Stop, uint8_t u8Si, uint8_t u8Ack); -void I2C_DisableInt(I2C_T *i2c); -void I2C_EnableInt(I2C_T *i2c); -uint32_t I2C_GetBusClockFreq(I2C_T *i2c); -uint32_t I2C_SetBusClockFreq(I2C_T *i2c, uint32_t u32BusClock); -uint32_t I2C_GetIntFlag(I2C_T *i2c); -uint32_t I2C_GetStatus(I2C_T *i2c); -uint32_t I2C_Open(I2C_T *i2c, uint32_t u32BusClock); -uint8_t I2C_GetData(I2C_T *i2c); -void I2C_SetSlaveAddr(I2C_T *i2c, uint8_t u8SlaveNo, uint8_t u8SlaveAddr, uint8_t u8GCMode); -void I2C_SetSlaveAddrMask(I2C_T *i2c, uint8_t u8SlaveNo, uint8_t u8SlaveAddrMask); -void I2C_EnableTimeout(I2C_T *i2c, uint8_t u8LongTimeout); -void I2C_DisableTimeout(I2C_T *i2c); -void I2C_EnableWakeup(I2C_T *i2c); -void I2C_DisableWakeup(I2C_T *i2c); -void I2C_SetData(I2C_T *i2c, uint8_t u8Data); -uint8_t I2C_WriteByte(I2C_T *i2c, uint8_t u8SlaveAddr, const uint8_t data); -uint32_t I2C_WriteMultiBytes(I2C_T *i2c, uint8_t u8SlaveAddr, const uint8_t *data, uint32_t u32wLen); -uint8_t I2C_WriteByteOneReg(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, const uint8_t data); -uint32_t I2C_WriteMultiBytesOneReg(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, const uint8_t *data, uint32_t u32wLen); -uint8_t I2C_WriteByteTwoRegs(I2C_T *i2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr, const uint8_t data); -uint32_t I2C_WriteMultiBytesTwoRegs(I2C_T *i2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr, const uint8_t *data, uint32_t u32wLen); -uint8_t I2C_ReadByte(I2C_T *i2c, uint8_t u8SlaveAddr); -uint32_t I2C_ReadMultiBytes(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t *rdata, uint32_t u32rLen); -uint8_t I2C_ReadByteOneReg(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr); -uint32_t I2C_ReadMultiBytesOneReg(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, uint8_t *rdata, uint32_t u32rLen); -uint8_t I2C_ReadByteTwoRegs(I2C_T *i2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr); -uint32_t I2C_ReadMultiBytesTwoRegs(I2C_T *i2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr, uint8_t *rdata, uint32_t u32rLen); -/*@}*/ /* end of group I2C_EXPORTED_FUNCTIONS */ - -/*@}*/ /* end of group I2C_Driver */ - -/*@}*/ /* end of group Standard_Driver */ - -#ifdef __cplusplus -} -#endif -#endif //__I2C_H__ diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/i2s.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/i2s.h deleted file mode 100644 index 1daf3bbd..00000000 --- a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/i2s.h +++ /dev/null @@ -1,319 +0,0 @@ -/**************************************************************************//** - * @file i2s.h - * @version V3.0 - * $Revision: 6 $ - * $Date: 15/07/02 11:21a $ - * @brief NUC123 series I2S driver header file - * - * @note - * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. - ******************************************************************************/ -#ifndef __I2S_H__ -#define __I2S_H__ - -#include "NUC123.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -/** @addtogroup Standard_Driver Standard Driver - @{ -*/ - -/** @addtogroup I2S_Driver I2S Driver - @{ -*/ - -/** @addtogroup I2S_EXPORTED_CONSTANTS I2S Exported Constants - @{ -*/ -#define I2S_DATABIT_8 (0 << I2S_CON_WORDWIDTH_Pos) /*!< I2S data width is 8-bit */ -#define I2S_DATABIT_16 (1 << I2S_CON_WORDWIDTH_Pos) /*!< I2S data width is 16-bit */ -#define I2S_DATABIT_24 (2 << I2S_CON_WORDWIDTH_Pos) /*!< I2S data width is 24-bit */ -#define I2S_DATABIT_32 (3 << I2S_CON_WORDWIDTH_Pos) /*!< I2S data width is 32-bit */ - -/* Audio Format */ -#define I2S_MONO I2S_CON_MONO_Msk /*!< Mono channel */ -#define I2S_STEREO 0 /*!< Stereo channel */ - -/* I2S Data Format */ -#define I2S_FORMAT_MSB I2S_CON_FORMAT_Msk /*!< MSB data format */ -#define I2S_FORMAT_I2S 0 /*!< I2S data format */ -#define I2S_FORMAT_PCM_A I2S_CON_PCM_Msk /*!< PCM mode A data format */ -#define I2S_FORMAT_PCM_B (I2S_CON_PCM_Msk|I2S_CON_FORMAT_Msk) /*!< PCM mode B data format */ - -/* I2S Operation mode */ -#define I2S_MODE_SLAVE I2S_CON_SLAVE_Msk /*!< As slave mode */ -#define I2S_MODE_MASTER 0 /*!< As master mode */ - -/* I2S FIFO Threshold */ -#define I2S_FIFO_TX_LEVEL_WORD_0 0 /*!< TX threshold is 0 word */ -#define I2S_FIFO_TX_LEVEL_WORD_1 (1 << I2S_CON_TXTH_Pos) /*!< TX threshold is 1 word */ -#define I2S_FIFO_TX_LEVEL_WORD_2 (2 << I2S_CON_TXTH_Pos) /*!< TX threshold is 2 words */ -#define I2S_FIFO_TX_LEVEL_WORD_3 (3 << I2S_CON_TXTH_Pos) /*!< TX threshold is 3 words */ -#define I2S_FIFO_TX_LEVEL_WORD_4 (4 << I2S_CON_TXTH_Pos) /*!< TX threshold is 4 words */ -#define I2S_FIFO_TX_LEVEL_WORD_5 (5 << I2S_CON_TXTH_Pos) /*!< TX threshold is 5 words */ -#define I2S_FIFO_TX_LEVEL_WORD_6 (6 << I2S_CON_TXTH_Pos) /*!< TX threshold is 6 words */ -#define I2S_FIFO_TX_LEVEL_WORD_7 (7 << I2S_CON_TXTH_Pos) /*!< TX threshold is 7 words */ - -#define I2S_FIFO_RX_LEVEL_WORD_1 0 /*!< RX threshold is 1 word */ -#define I2S_FIFO_RX_LEVEL_WORD_2 (1 << I2S_CON_RXTH_Pos) /*!< RX threshold is 2 words */ -#define I2S_FIFO_RX_LEVEL_WORD_3 (2 << I2S_CON_RXTH_Pos) /*!< RX threshold is 3 words */ -#define I2S_FIFO_RX_LEVEL_WORD_4 (3 << I2S_CON_RXTH_Pos) /*!< RX threshold is 4 words */ -#define I2S_FIFO_RX_LEVEL_WORD_5 (4 << I2S_CON_RXTH_Pos) /*!< RX threshold is 5 words */ -#define I2S_FIFO_RX_LEVEL_WORD_6 (5 << I2S_CON_RXTH_Pos) /*!< RX threshold is 6 words */ -#define I2S_FIFO_RX_LEVEL_WORD_7 (6 << I2S_CON_RXTH_Pos) /*!< RX threshold is 7 words */ -#define I2S_FIFO_RX_LEVEL_WORD_8 (7 << I2S_CON_RXTH_Pos) /*!< RX threshold is 8 words */ - -/* I2S Record Channel */ -#define I2S_MONO_RIGHT 0 /*!< Record mono right channel */ -#define I2S_MONO_LEFT I2S_CON_RXLCH_Msk /*!< Record mono left channel */ - -/* I2S Channel */ -#define I2S_RIGHT 0 /*!< Select right channel */ -#define I2S_LEFT 1 /*!< Select left channel */ - -/*@}*/ /* end of group I2S_EXPORTED_CONSTANTS */ - -/** @addtogroup I2S_EXPORTED_FUNCTIONS I2S Exported Functions - @{ -*/ -/*---------------------------------------------------------------------------------------------------------*/ -/* inline functions */ -/*---------------------------------------------------------------------------------------------------------*/ -/** - * @brief Enable zero cross detection function. - * @param[in] i2s The pointer of the specified I2S module. - * @param[in] u32ChMask The mask for left or right channel. Valid values are: - * - \ref I2S_RIGHT - * - \ref I2S_LEFT - * @return None - * @details This function will set RCHZCEN or LCHZCEN bit of I2SCON register to enable zero cross detection function. - */ -static __INLINE void I2S_ENABLE_TX_ZCD(I2S_T *i2s, uint32_t u32ChMask) -{ - if(u32ChMask == I2S_RIGHT) - i2s->CON |= I2S_CON_RCHZCEN_Msk; - else - i2s->CON |= I2S_CON_LCHZCEN_Msk; -} - -/** - * @brief Disable zero cross detection function. - * @param[in] i2s The pointer of the specified I2S module. - * @param[in] u32ChMask The mask for left or right channel. Valid values are: - * - \ref I2S_RIGHT - * - \ref I2S_LEFT - * @return None - * @details This function will clear RCHZCEN or LCHZCEN bit of I2SCON register to disable zero cross detection function. - */ -static __INLINE void I2S_DISABLE_TX_ZCD(I2S_T *i2s, uint32_t u32ChMask) -{ - if(u32ChMask == I2S_RIGHT) - i2s->CON &= ~I2S_CON_RCHZCEN_Msk; - else - i2s->CON &= ~I2S_CON_LCHZCEN_Msk; -} - -/** - * @brief Enable I2S TX DMA function. - * @param[in] i2s The pointer of the specified I2S module. - * @return None - * @details This macro will set TXDMA bit of I2SCON register to transmit data with PDMA. - */ -#define I2S_ENABLE_TXDMA(i2s) ( (i2s)->CON |= I2S_CON_TXDMA_Msk ) - -/** - * @brief Disable I2S TX DMA function. - * @param[in] i2s The pointer of the specified I2S module. - * @return None - * @details This macro will clear TXDMA bit of I2SCON register to disable TX DMA function. - */ -#define I2S_DISABLE_TXDMA(i2s) ( (i2s)->CON &= ~I2S_CON_TXDMA_Msk ) - -/** - * @brief Enable I2S RX DMA function. - * @param[in] i2s The pointer of the specified I2S module. - * @return None - * @details This macro will set RXDMA bit of I2SCON register to receive data with PDMA. - */ -#define I2S_ENABLE_RXDMA(i2s) ( (i2s)->CON |= I2S_CON_RXDMA_Msk ) - -/** - * @brief Disable I2S RX DMA function. - * @param[in] i2s The pointer of the specified I2S module. - * @return None - * @details This macro will clear RXDMA bit of I2SCON register to disable RX DMA function. - */ -#define I2S_DISABLE_RXDMA(i2s) ( (i2s)->CON &= ~I2S_CON_RXDMA_Msk ) - -/** - * @brief Enable I2S TX function. - * @param[in] i2s The pointer of the specified I2S module. - * @return None - * @details This macro will set TXEN bit of I2SCON register to enable I2S TX function. - */ -#define I2S_ENABLE_TX(i2s) ( (i2s)->CON |= I2S_CON_TXEN_Msk ) - -/** - * @brief Disable I2S TX function. - * @param[in] i2s The pointer of the specified I2S module. - * @return None - * @details This macro will clear TXEN bit of I2SCON register to disable I2S TX function. - */ -#define I2S_DISABLE_TX(i2s) ( (i2s)->CON &= ~I2S_CON_TXEN_Msk ) - -/** - * @brief Enable I2S RX function. - * @param[in] i2s The pointer of the specified I2S module. - * @return None - * @details This macro will set RXEN bit of I2SCON register to enable I2S RX function. - */ -#define I2S_ENABLE_RX(i2s) ( (i2s)->CON |= I2S_CON_RXEN_Msk ) - -/** - * @brief Disable I2S RX function. - * @param[in] i2s The pointer of the specified I2S module. - * @return None - * @details This macro will clear RXEN bit of I2SCON register to disable I2S RX function. - */ -#define I2S_DISABLE_RX(i2s) ( (i2s)->CON &= ~I2S_CON_RXEN_Msk ) - -/** - * @brief Enable TX Mute function. - * @param[in] i2s The pointer of the specified I2S module. - * @return None - * @details This macro will set MUTE bit of I2SCON register to enable I2S TX mute function. - */ -#define I2S_ENABLE_TX_MUTE(i2s) ( (i2s)->CON |= I2S_CON_MUTE_Msk ) - -/** - * @brief Disable TX Mute function. - * @param[in] i2s The pointer of the specified I2S module. - * @return None - * @details This macro will clear MUTE bit of I2SCON register to disable I2S TX mute function. - */ -#define I2S_DISABLE_TX_MUTE(i2s) ( (i2s)->CON &= ~I2S_CON_MUTE_Msk ) - -/** - * @brief Clear TX FIFO. - * @param[in] i2s The pointer of the specified I2S module. - * @return None - * @details This macro will clear TX FIFO. The internal TX FIFO pointer will be reset to FIFO start point. - */ -#define I2S_CLR_TX_FIFO(i2s) ( (i2s)->CON |= I2S_CON_CLR_TXFIFO_Msk ) - -/** - * @brief Clear RX FIFO. - * @param[in] i2s The pointer of the specified I2S module. - * @return None - * @details This macro will clear RX FIFO. The internal RX FIFO pointer will be reset to FIFO start point. - */ -#define I2S_CLR_RX_FIFO(i2s) ( (i2s)->CON |= I2S_CON_CLR_RXFIFO_Msk ) - -/** - * @brief This function sets the recording source channel when mono mode is used. - * @param[in] i2s The pointer of the specified I2S module. - * @param[in] u32Ch Left or right channel. Valid values are: - * - \ref I2S_MONO_LEFT - * - \ref I2S_MONO_RIGHT - * @return None - * @details This function selects the recording source channel of monaural mode. - */ -static __INLINE void I2S_SET_MONO_RX_CHANNEL(I2S_T *i2s, uint32_t u32Ch) -{ - u32Ch == I2S_MONO_LEFT ? - (i2s->CON |= I2S_CON_RXLCH_Msk) : - (i2s->CON &= ~I2S_CON_RXLCH_Msk); -} - -/** - * @brief Write data to I2S TX FIFO. - * @param[in] i2s The pointer of the specified I2S module. - * @param[in] u32Data The value written to TX FIFO. - * @return None - * @details This macro will write a value to TX FIFO. - */ -#define I2S_WRITE_TX_FIFO(i2s, u32Data) ( (i2s)->TXFIFO = (u32Data) ) - -/** - * @brief Read RX FIFO. - * @param[in] i2s The pointer of the specified I2S module. - * @return The value read from RX FIFO. - * @details This function will return a value read from RX FIFO. - */ -#define I2S_READ_RX_FIFO(i2s) ( (i2s)->RXFIFO ) - -/** - * @brief Get the interrupt flag. - * @param[in] i2s The pointer of the specified I2S module. - * @param[in] u32Mask The mask value for all interrupt flags. Valid values are: - * - \ref I2S_STATUS_LZCF_Msk - * - \ref I2S_STATUS_RZCF_Msk - * - \ref I2S_STATUS_TXTHF_Msk - * - \ref I2S_STATUS_TXOVF_Msk - * - \ref I2S_STATUS_TXUDF_Msk - * - \ref I2S_STATUS_RXTHF_Msk - * - \ref I2S_STATUS_RXOVF_Msk - * - \ref I2S_STATUS_RXUDF_Msk - * - \ref I2S_STATUS_I2STXINT_Msk - * - \ref I2S_STATUS_I2SRXINT_Msk - * - \ref I2S_STATUS_I2SINT_Msk - * @return The interrupt flags specified by the u32mask parameter. - * @details This macro will return the combination flags of I2SSTATUS register. The flags are specified by the u32mask parameter. - */ -#define I2S_GET_INT_FLAG(i2s, u32Mask) ( (i2s)->STATUS & (u32Mask) ) - -/** - * @brief Clear the interrupt flag. - * @param[in] i2s The pointer of the specified I2S module. - * @param[in] u32Mask The mask value for all interrupt flags. Valid values are: - * - \ref I2S_STATUS_LZCF_Msk - * - \ref I2S_STATUS_RZCF_Msk - * - \ref I2S_STATUS_TXOVF_Msk - * - \ref I2S_STATUS_TXUDF_Msk - * - \ref I2S_STATUS_RXOVF_Msk - * - \ref I2S_STATUS_RXUDF_Msk - * @return None - * @details This macro will clear the interrupt flags specified by the u32mask parameter. - */ -#define I2S_CLR_INT_FLAG(i2s, u32Mask) ( (i2s)->STATUS = (u32Mask) ) - -/** - * @brief Get transmit FIFO level - * @param[in] i2s The pointer of the specified I2S module. - * @return TX FIFO level - * @details This macro will return the number of available words in TX FIFO. - */ -#define I2S_GET_TX_FIFO_LEVEL(i2s) ( (((i2s)->STATUS & I2S_STATUS_TX_LEVEL_Msk) >> I2S_STATUS_TX_LEVEL_Pos) & 0xF ) - -/** - * @brief Get receive FIFO level - * @param[in] i2s The pointer of the specified I2S module. - * @return RX FIFO level - * @details This macro will return the number of available words in RX FIFO. - */ -#define I2S_GET_RX_FIFO_LEVEL(i2s) ( (((i2s)->STATUS & I2S_STATUS_RX_LEVEL_Msk) >> I2S_STATUS_RX_LEVEL_Pos) & 0xF ) - - -/* Function prototype declaration */ -uint32_t I2S_Open(I2S_T *i2s, uint32_t u32MasterSlave, uint32_t u32SampleRate, uint32_t u32WordWidth, uint32_t u32Channels, uint32_t u32DataFormat); -void I2S_Close(I2S_T *i2s); -void I2S_EnableInt(I2S_T *i2s, uint32_t u32Mask); -void I2S_DisableInt(I2S_T *i2s, uint32_t u32Mask); -uint32_t I2S_EnableMCLK(I2S_T *i2s, uint32_t u32BusClock); -void I2S_DisableMCLK(I2S_T *i2s); - -/*@}*/ /* end of group I2S_EXPORTED_FUNCTIONS */ - - -/*@}*/ /* end of group I2S_Driver */ - -/*@}*/ /* end of group Standard_Driver */ - -#endif - -/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ - diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/pdma.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/pdma.h deleted file mode 100644 index 58ba5156..00000000 --- a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/pdma.h +++ /dev/null @@ -1,198 +0,0 @@ -/**************************************************************************//** - * @file PDMA.h - * @version V1.00 - * $Revision: 6 $ - * $Date: 15/07/02 11:21a $ - * @brief NUC123 Series PDMA Controller Driver Header File - * - * @note - * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. - * - ******************************************************************************/ -#ifndef __PDMA_H__ -#define __PDMA_H__ - -#include "NUC123.h" - - -/** @addtogroup Standard_Driver Standard Driver - * @{ - */ - -/** @addtogroup PDMA_Driver PDMA Driver - * @{ - */ - -/** @addtogroup PDMA_EXPORTED_CONSTANTS PDMA Exported Constants - @{ -*/ - -/*---------------------------------------------------------------------------------------------------------*/ -/* Data Width Constant Definitions */ -/*---------------------------------------------------------------------------------------------------------*/ -#define PDMA_WIDTH_8 0x00080000UL /*!GCRISR)) - -/** - * @brief Get PDMA Channel Interrupt Status - * - * @param[in] u32Ch Selected DMA channel - * - * @return Interrupt Status - * - * @details This macro gets the channel interrupt status. - */ -#define PDMA_GET_CH_INT_STS(u32Ch) (*((__IO uint32_t *)((uint32_t)&PDMA0->ISR + (uint32_t)((u32Ch)*0x100)))) - -/** - * @brief Clear PDMA Channel Interrupt Flag - * - * @param[in] u32Ch Selected DMA channel - * @param[in] u32Mask Interrupt Mask - * - * @return None - * - * @details This macro clear the channel interrupt flag. - */ -#define PDMA_CLR_CH_INT_FLAG(u32Ch, u32Mask) (*((__IO uint32_t *)((uint32_t)&PDMA0->ISR + (uint32_t)((u32Ch)*0x100))) = (u32Mask)) - -/** - * @brief Check Channel Status - * - * @param[in] u32Ch The selected channel - * - * @retval 0 The selected channel is idle - * @retval 1 The selected channel is busy - * - * @details Check the selected channel is busy or not. - */ -#define PDMA_IS_CH_BUSY(u32Ch) ((*((__IO uint32_t *)((uint32_t)&PDMA0->CSR +(uint32_t)((u32Ch)*0x100)))&PDMA_CSR_TRIG_EN_Msk)? 1 : 0) - -/** - * @brief Set Source Address - * - * @param[in] u32Ch The selected channel - * @param[in] u32Addr The selected address - * - * @return None - * - * @details This macro set the selected channel source address. - */ -#define PDMA_SET_SRC_ADDR(u32Ch, u32Addr) (*((__IO uint32_t *)((uint32_t)&PDMA0->SAR + (uint32_t)((u32Ch)*0x100))) = (u32Addr)) - -/** - * @brief Set Destination Address - * - * @param[in] u32Ch The selected channel - * @param[in] u32Addr The selected address - * - * @return None - * - * @details This macro set the selected channel destination address. - */ -#define PDMA_SET_DST_ADDR(u32Ch, u32Addr) (*((__IO uint32_t *)((uint32_t)&PDMA0->DAR + (uint32_t)((u32Ch)*0x100))) = (u32Addr)) - -/** - * @brief Set Transfer Count - * - * @param[in] u32Ch The selected channel - * @param[in] u32Count Transfer Count - * - * @return None - * - * @details This macro set the selected channel transfer count. - * \hideinitializer - */ -#define PDMA_SET_TRANS_CNT(u32Ch, u32Count) { \ - if (((uint32_t)*((__IO uint32_t *)((uint32_t)&PDMA0->CSR + (uint32_t)((u32Ch)*0x100))) & PDMA_CSR_APB_TWS_Msk) == PDMA_WIDTH_32) \ - *((__IO uint32_t *)((uint32_t)&PDMA0->BCR + (uint32_t)((u32Ch)*0x100))) = ((u32Count) << 2); \ - else if (((uint32_t)*((__IO uint32_t *)((uint32_t)&PDMA0->CSR + (uint32_t)((u32Ch)*0x100))) & PDMA_CSR_APB_TWS_Msk) == PDMA_WIDTH_8) \ - *((__IO uint32_t *)((uint32_t)&PDMA0->BCR + (uint32_t)((u32Ch)*0x100))) = (u32Count); \ - else if (((uint32_t)*((__IO uint32_t *)((uint32_t)&PDMA0->CSR + (uint32_t)((u32Ch)*0x100))) & PDMA_CSR_APB_TWS_Msk) == PDMA_WIDTH_16) \ - *((__IO uint32_t *)((uint32_t)&PDMA0->BCR + (uint32_t)((u32Ch)*0x100))) = ((u32Count) << 1); \ -} - -/** - * @brief Stop the channel - * - * @param[in] u32Ch The selected channel - * - * @return None - * - * @details This macro stop the selected channel. - */ -#define PDMA_STOP(u32Ch) (*((__IO uint32_t *)((uint32_t)&PDMA0->CSR + (uint32_t)((u32Ch)*0x100))) &= ~PDMA_CSR_PDMACEN_Msk) - -void PDMA_Open(uint32_t u32Mask); -void PDMA_Close(void); -void PDMA_SetTransferCnt(uint32_t u32Ch, uint32_t u32Width, uint32_t u32TransCount); -void PDMA_SetTransferAddr(uint32_t u32Ch, uint32_t u32SrcAddr, uint32_t u32SrcCtrl, uint32_t u32DstAddr, uint32_t u32DstCtrl); -void PDMA_SetTransferMode(uint32_t u32Ch, uint32_t u32Periphral, uint32_t u32ScatterEn, uint32_t u32DescAddr); -void PDMA_Trigger(uint32_t u32Ch); -void PDMA_EnableInt(uint32_t u32Ch, uint32_t u32Mask); -void PDMA_DisableInt(uint32_t u32Ch, uint32_t u32Mask); - - -/** - * @} End of PDMA Device Function Interface - */ - -/** - * @} End of Function Interface - */ - -/** - * @} End of PDMA_Driver - */ - - -#endif // __PDMA_H__ diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/ps2.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/ps2.h deleted file mode 100644 index af43c2a2..00000000 --- a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/ps2.h +++ /dev/null @@ -1,254 +0,0 @@ -/**************************************************************************//** - * @file PS2.h - * @version V3.00 - * $Revision: 5 $ - * $Date: 15/07/02 11:21a $ - * @brief NUC123 Series PS/2 Driver Header File - * - * @note - * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. - ******************************************************************************/ -#ifndef __PS2_H__ -#define __PS2_H__ - -/*---------------------------------------------------------------------------------------------------------*/ -/* Include related headers */ -/*---------------------------------------------------------------------------------------------------------*/ -#include "NUC123.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - -/** @addtogroup Standard_Driver Standard Driver - @{ -*/ - -/** @addtogroup PS2_Driver PS2 Driver - @{ -*/ - - -/** @addtogroup PS2_EXPORTED_FUNCTIONS PS2 Exported Functions - @{ -*/ - -/*---------------------------------------------------------------------------------------------------------*/ -/* Define Macros and functions */ -/*---------------------------------------------------------------------------------------------------------*/ - -/** - * @brief To Set PS/2 Tx FIFO length - * - * @param[in] u32Count Tx FIFO length - * - * @return None - * - * @details Before PS/2 data transmit, program needs to set the FIFO depth. - * \hideinitializer - */ -#define PS2_SET_TX_BYTE_CNT(u32Count) (PS2->PS2CON = (PS2->PS2CON & ~PS2_PS2CON_TXFIFO_DEPTH_Msk) \ - | (((u32Count)-1) << PS2_PS2CON_TXFIFO_DEPTH_Pos)) - -/** - * @brief This function use to Get PS/2 Status - * - * @param None - * - * @return PS/2 bus status - * - * @details To get PS/2 bus status which are about Byte index, Tx/Rx status, Error status and PS/2 line status. - */ -#define PS2_GET_STATUS() (PS2->PS2STATUS) - -/** - * @brief This function is used to Clear PS/2 Status - * - * @param[in] u32Mask Clear the specified status of PS/2 module: - * 1. PS2D_PS2STATUS_FRAMERR_Msk 2. PS2D_PS2STATUS_RXOVF_Msk - * - * @return None - * - * @details To clear PS/2 bus status which are about Byte index, TX/RX status, Error status, PS/2 line status. - */ -#define PS2_CLR_STATUS(u32Mask) (PS2->PS2STATUS = (u32Mask)) - -/** - * @brief This function is used to Clear PS/2 Tx FIFO - * - * @param None - * - * @return None - * - * @details Write 1 to terminate PS/2 device to host transmission. - * - * @note Write 1 is always clear Tx FIFO, and need write 0 to STOP the clear action. - */ -__STATIC_INLINE void PS2_CLEAR_TX_FIFO(void) -{ - PS2->PS2CON |= PS2_PS2CON_CLRFIFO_Msk; - PS2->PS2CON &= ~PS2_PS2CON_CLRFIFO_Msk; -} - -/** - * @brief This function is used to Clear PS2 Rx interrupt - * - * @param None - * - * @return None - * - * @details To disable PS/2 receive interrupt occurs. - */ -#define PS2_CLR_RX_INT_FLAG() (PS2->PS2INTID = PS2_PS2INTID_RXINT_Msk) - -/** - * @brief This function is used to Clear PS/2 Tx Interrupt - * - * @param None - * - * @return None - * - * @details To disable PS/2 transmit interrupt occurs. - */ -#define PS2_CLR_TX_INT_FLAG() (PS2->PS2INTID = PS2_PS2INTID_TXINT_Msk) - -/** - * @brief This function is used to Get PS/2 Interrupt - * - * @param[in] u32IntFlag Interrupt flag of PS2D_PS2INTID_TXINT_Msk, PS2D_PS2INTID_RXINT_Msk - * - * @retval 1 Interrupt occurs - * @retval 0 Interrupt not occurs - * - * @details To check PS/2 bus interrupt occur from TX or RX - */ -#define PS2_GET_INT_FLAG(u32IntFlag) ((PS2->PS2INTID & (u32IntFlag))?1:0) - -/** - * @brief Disable PS2CLK and PS2DATA pins override. - * - * @param None - * - * @return None - * - * @details To disable the override control of PS2CLK and PS2DATA pins. - */ -#define PS2_DISABLE_OVERRIDE() (PS2->PS2CON &= ~PS2_PS2CON_OVERRIDE_Msk) - -/** - * @brief Enable PS2CLK and PS2DATA pins Override. - * - * @param None - * - * @return None - * - * @details TO enable the override control of PS2CLK and PS2DATA pins. - */ -#define PS2_ENABLE_OVERRIDE() (PS2->PS2CON |= PS2_PS2CON_OVERRIDE_Msk) - -/** - * @brief This function is used to Get Indicates which data byte in transmit data shift register - * - * @param None - * - * @return The indicates which data byte in transmit data shift register. - * - * @details To get a indication which a data byte in the data shift register. - */ -#define PS2_GET_TX_BYTE_INDEX() ((PS2->PS2STATUS & PS2_PS2STATUS_BYTEIDX_Msk) >> PS2_PS2STATUS_BYTEIDX_Pos) - -/** - * @brief This function is used to set PS2DATA Pin low. - * - * @param None - * - * @return None - * - * @details To control the PS2DATA pin state to low. - */ -#define PS2_SET_DATA_LOW() (PS2->PS2CON &= ~PS2_PS2CON_FPS2DAT_Msk) - -/** - * @brief This function is used to set PS2DATA Pin high - * - * @param None - * - * @return None - * - * @details To control the PS2DATA pin state to high. - */ -#define PS2_SET_DATA_HIGH() (PS2->PS2CON |= PS2_PS2CON_FPS2DAT_Msk) - -/** - * @brief This function is used to set PS2CLK Pin low. - * - * @param None - * - * @return None - * - * @details To control the PS2CLK pin state to low. - */ -#define PS2_SET_CLK_LOW() (PS2->PS2CON &= ~PS2_PS2CON_FPS2CLK_Msk) - -/** - * @brief This function is used to set PS2CLK Pin high. - * - * @param None - * - * @return None - * - * @details To control the PS2CLK pin state to high. - */ -#define PS2_SET_CLK_HIGH() (PS2->PS2CON |= PS2_PS2CON_FPS2CLK_Msk) - -/** - * @brief Disable always sends acknowledge - * - * @param None - * - * @return None - * - * @details If parity error or Stop bit is not received correctly, acknowledge will not be sent to host at 12th clock. - */ -#define PS2_DISABLE_ACK_ALWAYS() (PS2->PS2CON |= PS2_PS2CON_ACK_Msk) - -/** - * @brief Always sends acknowledge - * - * @param None - * - * @return None - * - * @details Always send acknowledge to host at 12th clock for host to device communication. - */ -#define PS2_ENABLE_ACK_ALWAYS() (PS2->PS2CON &= ~PS2_PS2CON_ACK_Msk) - - -/*---------------------------------------------------------------------------------------------------------*/ -/* Define Function Prototypes */ -/*---------------------------------------------------------------------------------------------------------*/ - -void PS2_Open(void); -void PS2_Close(void); -uint8_t PS2_Read(void); -int32_t PS2_Write(uint32_t *pu32Buf, uint32_t u32ByteCount); -void PS2_EnableInt(uint32_t u32Mask); -void PS2_DisableInt(uint32_t u32Mask); - - -/*@}*/ /* end of group PS2_EXPORTED_FUNCTIONS */ - -/*@}*/ /* end of group PS2_Driver */ - -/*@}*/ /* end of group Standard_Driver */ - -#ifdef __cplusplus -} -#endif - -#endif //__PS2_H__ - -/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ - diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/pwm.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/pwm.h deleted file mode 100644 index 74120bc7..00000000 --- a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/pwm.h +++ /dev/null @@ -1,230 +0,0 @@ -/**************************************************************************//** - * @file pwm.h - * @version V3.00 - * $Revision: 5 $ - * $Date: 15/07/02 11:21a $ - * @brief NUC123 series PWM driver header file - * - * @note - * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. - *****************************************************************************/ -#ifndef __PWM_H__ -#define __PWM_H__ - -#ifdef __cplusplus -extern "C" -{ -#endif - - -/** @addtogroup Standard_Driver Standard Driver - @{ -*/ - -/** @addtogroup PWM_Driver PWM Driver - @{ -*/ - -/** @addtogroup PWM_EXPORTED_CONSTANTS PWM Exported Constants - @{ -*/ -#define PWM_CHANNEL_NUM (4) /*!< PWM channel number */ -#define PWM_CLK_DIV_1 (4UL) /*!< PWM clock divide by 1 */ -#define PWM_CLK_DIV_2 (0UL) /*!< PWM clock divide by 2 */ -#define PWM_CLK_DIV_4 (1UL) /*!< PWM clock divide by 4 */ -#define PWM_CLK_DIV_8 (2UL) /*!< PWM clock divide by 8 */ -#define PWM_CLK_DIV_16 (3UL) /*!< PWM clock divide by 16 */ -#define PWM_EDGE_ALIGNED (0UL) /*!< PWM working in edge aligned type */ -#define PWM_CENTER_ALIGNED (1UL) /*!< PWM working in center aligned type */ -#define PWM_PERIOD_INT_UNDERFLOW (0) /*!< PWM period interrupt triggered if counter underflow */ -#define PWM_PERIOD_INT_MATCH_CNR (PWM_PIER_INT01TYPE_Msk) /*!< PWM period interrupt triggered if counter match CNR */ -#define PWM_CAPTURE_INT_RISING_LATCH (PWM_CCR0_CRL_IE0_Msk) /*!< PWM capture interrupt if channel has rising transition */ -#define PWM_CAPTURE_INT_FALLING_LATCH (PWM_CCR0_CFL_IE0_Msk) /*!< PWM capture interrupt if channel has falling transition */ -/*---------------------------------------------------------------------------------------------------------*/ -/* PWM Group channel number constants definitions */ -/*---------------------------------------------------------------------------------------------------------*/ -#define PWM_CH0 0x0 /*!< PWM Group A channel 0 */ -#define PWM_CH1 0x1 /*!< PWM Group A channel 1 */ -#define PWM_CH2 0x2 /*!< PWM Group A channel 2 */ -#define PWM_CH3 0x3 /*!< PWM Group A channel 3 */ -#define PWM_CCR_MASK 0x000F000F /*!< PWM CCR0/CCR2 bit0~3 and bit16~19 mask */ - -/*@}*/ /* end of group PWM_EXPORTED_CONSTANTS */ - - -/** @addtogroup PWM_EXPORTED_FUNCTIONS PWM Exported Functions - @{ -*/ - -/** - * @brief Enable output inverter of specified channel(s) - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel - * Bit 0 represents channel 0, bit 1 represents channel 1... - * @return None - * @details This macro is used to enable capture input inverter for specified channel(s). - * \hideinitializer - */ -#define PWM_ENABLE_OUTPUT_INVERTER(pwm, u32ChannelMask) \ - do{ \ - int i;\ - (pwm)->PCR &= ~(PWM_PCR_CH0INV_Msk|PWM_PCR_CH1INV_Msk|PWM_PCR_CH2INV_Msk|PWM_PCR_CH3INV_Msk);\ - for(i = 0; i < 4; i++) { \ - if((u32ChannelMask) & (1 << i)) \ - (pwm)->PCR |= (PWM_PCR_CH0INV_Msk << (PWM_PCR_CH0INV_Pos * (i * 4))); \ - } \ - }while(0) - -/** - * @brief Get captured rising data of specified channel - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @return The timer counter, 0~0xFFFF - * @details This macro is used to get captured rising data for specified channel. - */ -#define PWM_GET_CAPTURE_RISING_DATA(pwm, u32ChannelNum) (*((__IO uint32_t *) ((((uint32_t)&((pwm)->CRLR0)) + (u32ChannelNum) * 8)))) - -/** - * @brief Get captured falling data of specified channel - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @return The timer counter, 0~0xFFFF - * @details This macro is used to get captured falling data for specified channel. - */ -#define PWM_GET_CAPTURE_FALLING_DATA(pwm, u32ChannelNum) (*((__IO uint32_t *) ((((uint32_t)&((pwm)->CFLR0)) + (u32ChannelNum) * 8)))) - -/** - * @brief Set the prescaler of the selected channel - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @param[in] u32Prescaler Clock prescaler of specified channel. Valid values are between 1 ~ 0xFF - * @return None - * @details This macro is used to set timer pre-scale for specified channel. - * @note If u32Prescaler = 0, corresponding PWM-timer will be stopped. - * @note If u32Prescaler = x (x not equal to 0), it means Clock input is divided by (x + 1) before it is fed to the corresponding PWM counter. - */ -#define PWM_SET_PRESCALER(pwm, u32ChannelNum, u32Prescaler) \ - ((pwm)->PPR = ((pwm)->PPR & ~(PWM_PPR_CP01_Msk << (((u32ChannelNum) >> 1) * 8))) | ((u32Prescaler) << (((u32ChannelNum) >> 1) * 8))) - -/** - * @brief Set the divider of the selected channel - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @param[in] u32Divider Clock divider of specified channel. Valid values are - * - \ref PWM_CLK_DIV_1 - * - \ref PWM_CLK_DIV_2 - * - \ref PWM_CLK_DIV_4 - * - \ref PWM_CLK_DIV_8 - * - \ref PWM_CLK_DIV_16 - * @return None - * @details This macro is used to set Timer clock source divider selection for specified channel. - */ -#define PWM_SET_DIVIDER(pwm, u32ChannelNum, u32Divider) \ - ((pwm)->CSR = ((pwm)->CSR & ~(PWM_CSR_CSR0_Msk << ((u32ChannelNum) * 4))) | ((u32Divider) << ((u32ChannelNum) * 4))) - -/** - * @brief Set the duty of the selected channel - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @param[in] u32CMR Duty of specified channel. Valid values are between 0~0xFFFF - * @return None - * @details This macro is used to set PWM Comparator value for specified channel. - * @note This new setting will take effect on next PWM period. - */ -#define PWM_SET_CMR(pwm, u32ChannelNum, u32CMR) (*((__IO uint32_t *) ((((uint32_t)&((pwm)->CMR0)) + (u32ChannelNum) * 12))) = (u32CMR)) - -/** - * @brief Set the period of the selected channel - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @param[in] u32CNR Period of specified channel. Valid values are between 0~0xFFFF - * @return None - * @details This macro is used to set timer loaded value(CNR) for specified channel.\n - * Loaded value determines the PWM period. - * @note This new setting will take effect on next PWM period. - * @note PWM counter will stop if period length set to 0. - */ -#define PWM_SET_CNR(pwm, u32ChannelNum, u32CNR) (*((__IO uint32_t *) ((((uint32_t)&((pwm)->CNR0)) + (u32ChannelNum) * 12))) = (u32CNR)) - -/** - * @brief Set the PWM aligned type - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel - * Bit 0 represents channel 0, bit 1 represents channel 1... - * @param[in] u32AlignedType PWM aligned type, valid values are: - * - \ref PWM_EDGE_ALIGNED - * - \ref PWM_CENTER_ALIGNED - * @return None - * @details This macro is used to set the PWM aligned type. - * @note PWM trigger ADC function is only supported when PWM operating at Center-aligned type. - * \hideinitializer - */ -#define PWM_SET_ALIGNED_TYPE(pwm, u32ChannelMask, u32AlignedType) \ - do{ \ - int i; \ - for(i = 0; i < 4; i++) { \ - if((u32ChannelMask) & (1 << i)) \ - (pwm)->PCR = ((pwm)->PCR & ~(PWM_PCR_PWM01TYPE_Msk << (i >> 1))) | ((u32AlignedType) << (PWM_PCR_PWM01TYPE_Pos + (i >> 1))); \ - } \ - }while(0) - - -uint32_t PWM_ConfigCaptureChannel(PWM_T *pwm, - uint32_t u32ChannelNum, - uint32_t u32UnitTimeNsec, - uint32_t u32CaptureEdge); -uint32_t PWM_ConfigOutputChannel(PWM_T *pwm, - uint32_t u32ChannelNum, - uint32_t u32Frequncy, - uint32_t u32DutyCycle); -void PWM_Start(PWM_T *pwm, uint32_t u32ChannelMask); -void PWM_Stop(PWM_T *pwm, uint32_t u32ChannelMask); -void PWM_ForceStop(PWM_T *pwm, uint32_t u32ChannelMask); -void PWM_EnableADCTrigger(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Condition); -void PWM_DisableADCTrigger(PWM_T *pwm, uint32_t u32ChannelNum); -void PWM_ClearADCTriggerFlag(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Condition); -uint32_t PWM_GetADCTriggerFlag(PWM_T *pwm, uint32_t u32ChannelNum); -void PWM_EnableCapture(PWM_T *pwm, uint32_t u32ChannelMask); -void PWM_DisableCapture(PWM_T *pwm, uint32_t u32ChannelMask); -void PWM_EnableOutput(PWM_T *pwm, uint32_t u32ChannelMask); -void PWM_DisableOutput(PWM_T *pwm, uint32_t u32ChannelMask); -void PWM_EnablePDMA(PWM_T *pwm, uint32_t u32ChannelMask, uint32_t u32RisingFirst); -void PWM_DisablePDMA(PWM_T *pwm, uint32_t u32ChannelMask); -void PWM_EnableDeadZone(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Duration); -void PWM_DisableDeadZone(PWM_T *pwm, uint32_t u32ChannelNum); -void PWM_EnableCaptureInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Edge); -void PWM_DisableCaptureInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Edge); -void PWM_ClearCaptureIntFlag(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Edge); -uint32_t PWM_GetCaptureIntFlag(PWM_T *pwm, uint32_t u32ChannelNum); -void PWM_EnableDutyInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32IntDutyType); -void PWM_DisableDutyInt(PWM_T *pwm, uint32_t u32ChannelNum); -void PWM_ClearDutyIntFlag(PWM_T *pwm, uint32_t u32ChannelNum); -uint32_t PWM_GetDutyIntFlag(PWM_T *pwm, uint32_t u32ChannelNum); -void PWM_EnablePeriodInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32IntPeriodType); -void PWM_DisablePeriodInt(PWM_T *pwm, uint32_t u32ChannelNum); -void PWM_ClearPeriodIntFlag(PWM_T *pwm, uint32_t u32ChannelNum); -uint32_t PWM_GetPeriodIntFlag(PWM_T *pwm, uint32_t u32ChannelNum); - - - -/*@}*/ /* end of group PWM_EXPORTED_FUNCTIONS */ - -/*@}*/ /* end of group PWM_Driver */ - -/*@}*/ /* end of group Standard_Driver */ - -#ifdef __cplusplus -} -#endif - -#endif //__PWM_H__ - -/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/spi.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/spi.h deleted file mode 100644 index 02bfe30b..00000000 --- a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/spi.h +++ /dev/null @@ -1,381 +0,0 @@ -/**************************************************************************//** - * @file spi.h - * @version V3.0 - * $Revision: 11 $ - * $Date: 15/07/02 3:18p $ - * @brief NUC123 Series SPI Driver Header File - * - * @note - * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. - * - ******************************************************************************/ -#ifndef __SPI_H__ -#define __SPI_H__ - -#ifdef __cplusplus -extern "C" -{ -#endif - - -/** @addtogroup Standard_Driver Standard Driver - @{ -*/ - -/** @addtogroup SPI_Driver SPI Driver - @{ -*/ - -/** @addtogroup SPI_EXPORTED_CONSTANTS SPI Exported Constants - @{ -*/ - -#define SPI_MODE_0 (SPI_CNTRL_TX_NEG_Msk) /*!< CLKP=0; RX_NEG=0; TX_NEG=1 */ -#define SPI_MODE_1 (SPI_CNTRL_RX_NEG_Msk) /*!< CLKP=0; RX_NEG=1; TX_NEG=0 */ -#define SPI_MODE_2 (SPI_CNTRL_CLKP_Msk | SPI_CNTRL_RX_NEG_Msk) /*!< CLKP=1; RX_NEG=1; TX_NEG=0 */ -#define SPI_MODE_3 (SPI_CNTRL_CLKP_Msk | SPI_CNTRL_TX_NEG_Msk) /*!< CLKP=1; RX_NEG=0; TX_NEG=1 */ - -#define SPI_SLAVE (SPI_CNTRL_SLAVE_Msk) /*!< Set as slave */ -#define SPI_MASTER (0x0) /*!< Set as master */ - -#define SPI_SS0 (1<CNTRL2 |= SPI_CNTRL2_SLV_ABORT_Msk) - -/** - * @brief Clear the Slave 3-wire mode start interrupt flag. - * @param[in] spi The pointer of the specified SPI module. - * @return None. - * @details Write 1 to SLV_START_INTSTS bit of SPI_STATUS register to clear the Slave 3-wire mode start interrupt flag. - */ -#define SPI_CLR_3WIRE_START_INT_FLAG(spi) ((spi)->STATUS = SPI_STATUS_SLV_START_INTSTS_Msk) - -/** - * @brief Clear the unit transfer interrupt flag. - * @param[in] spi The pointer of the specified SPI module. - * @return None. - * @details Write 1 to IF bit of SPI_STATUS register to clear the unit transfer interrupt flag. - */ -#define SPI_CLR_UNIT_TRANS_INT_FLAG(spi) ((spi)->STATUS = SPI_STATUS_IF_Msk) - -/** - * @brief Disable 2-bit Transfer mode. - * @param[in] spi The pointer of the specified SPI module. - * @return None. - * @details Clear TWOB bit of SPI_CNTRL register to disable 2-bit Transfer mode. - */ -#define SPI_DISABLE_2BIT_MODE(spi) ((spi)->CNTRL &= ~SPI_CNTRL_TWOB_Msk) - -/** - * @brief Disable Slave 3-wire mode. - * @param[in] spi The pointer of the specified SPI module. - * @return None. - * @details Clear NOSLVSEL bit of SPI_CNTRL2 register to disable Slave 3-wire mode. - */ -#define SPI_DISABLE_3WIRE_MODE(spi) ((spi)->CNTRL2 &= ~SPI_CNTRL2_NOSLVSEL_Msk) - -/** - * @brief Disable Dual I/O mode. - * @param[in] spi The pointer of the specified SPI module. - * @return None. - * @details Clear DUAL_IO_EN bit of SPI_CNTRL2 register to disable Dual I/O mode. - */ -#define SPI_DISABLE_DUAL_MODE(spi) ((spi)->CNTRL2 &= ~SPI_CNTRL2_DUAL_IO_EN_Msk) - -/** - * @brief Enable 2-bit Transfer mode. - * @param[in] spi The pointer of the specified SPI module. - * @return None. - * @details Set TWOB bit of SPI_CNTRL register to enable 2-bit Transfer mode. - */ -#define SPI_ENABLE_2BIT_MODE(spi) ((spi)->CNTRL |= SPI_CNTRL_TWOB_Msk) - -/** - * @brief Enable Slave 3-wire mode. - * @param[in] spi The pointer of the specified SPI module. - * @return None. - * @details Set NOSLVSEL bit of SPI_CNTRL2 register to enable Slave 3-wire mode. - * Only available in Slave mode. - */ -#define SPI_ENABLE_3WIRE_MODE(spi) ((spi)->CNTRL2 |= SPI_CNTRL2_NOSLVSEL_Msk) - -/** - * @brief Enable Dual input mode. - * @param[in] spi The pointer of the specified SPI module. - * @return None. - * @details Clear DUAL_IO_DIR bit and set DUAL_IO_EN bit of SPI_CNTRL2 register to enable Dual input mode. - */ -#define SPI_ENABLE_DUAL_INPUT_MODE(spi) ((spi)->CNTRL2 = ((spi)->CNTRL2 & (~SPI_CNTRL2_DUAL_IO_DIR_Msk)) | SPI_CNTRL2_DUAL_IO_EN_Msk) - -/** - * @brief Enable Dual output mode. - * @param[in] spi The pointer of the specified SPI module. - * @return None. - * @details Set DUAL_IO_DIR bit and DUAL_IO_EN bit of SPI_CNTRL2 register to enable Dual output mode. - */ -#define SPI_ENABLE_DUAL_OUTPUT_MODE(spi) ((spi)->CNTRL2 |= (SPI_CNTRL2_DUAL_IO_EN_Msk | SPI_CNTRL2_DUAL_IO_DIR_Msk)) - -/** - * @brief Trigger RX PDMA function. - * @param[in] spi The pointer of the specified SPI module. - * @return None. - * @details Set RX_DMA_GO bit of SPI_DMA register to enable RX PDMA transfer function. - */ -#define SPI_TRIGGER_RX_PDMA(spi) ((spi)->DMA |= SPI_DMA_RX_DMA_GO_Msk) - -/** - * @brief Trigger TX PDMA function. - * @param[in] spi The pointer of the specified SPI module. - * @return None. - * @details Set TX_DMA_GO bit of SPI_DMA register to enable TX PDMA transfer function. - */ -#define SPI_TRIGGER_TX_PDMA(spi) ((spi)->DMA |= SPI_DMA_TX_DMA_GO_Msk) - -/** - * @brief Get the count of available data in RX FIFO. - * @param[in] spi The pointer of the specified SPI module. - * @return The count of available data in RX FIFO. - * @details Read RX_FIFO_COUNT (SPI_STATUS[15:12]) to get the count of available data in RX FIFO. - */ -#define SPI_GET_RX_FIFO_COUNT(spi) (((spi)->STATUS & SPI_STATUS_RX_FIFO_COUNT_Msk) >> SPI_STATUS_RX_FIFO_COUNT_Pos) - -/** - * @brief Get the RX FIFO empty flag. - * @param[in] spi The pointer of the specified SPI module. - * @retval 0 RX FIFO is not empty. - * @retval 1 RX FIFO is empty. - * @details Read RX_EMPTY bit of SPI_STATUS register to get the RX FIFO empty flag. - */ -#define SPI_GET_RX_FIFO_EMPTY_FLAG(spi) (((spi)->STATUS & SPI_STATUS_RX_EMPTY_Msk)>>SPI_STATUS_RX_EMPTY_Pos) - -/** - * @brief Get the TX FIFO empty flag. - * @param[in] spi The pointer of the specified SPI module. - * @retval 0 TX FIFO is not empty. - * @retval 1 TX FIFO is empty. - * @details Read TX_EMPTY bit of SPI_STATUS register to get the TX FIFO empty flag. - */ -#define SPI_GET_TX_FIFO_EMPTY_FLAG(spi) (((spi)->STATUS & SPI_STATUS_TX_EMPTY_Msk)>>SPI_STATUS_TX_EMPTY_Pos) - -/** - * @brief Get the TX FIFO full flag. - * @param[in] spi The pointer of the specified SPI module. - * @retval 0 TX FIFO is not full. - * @retval 1 TX FIFO is full. - * @details Read TX_FULL bit of SPI_STATUS register to get the TX FIFO full flag. - */ -#define SPI_GET_TX_FIFO_FULL_FLAG(spi) (((spi)->STATUS & SPI_STATUS_TX_FULL_Msk)>>SPI_STATUS_TX_FULL_Pos) - -/** - * @brief Get the datum read from RX0 register. - * @param[in] spi The pointer of the specified SPI module. - * @return Data in RX0 register. - * @details Read SPI_RX0 register to get the received datum. - */ -#define SPI_READ_RX0(spi) ((spi)->RX[0]) - -/** - * @brief Get the datum read from RX1 register. - * @param[in] spi The pointer of the specified SPI module. - * @return Data in RX1 register. - * @details Read SPI_RX1 register to get the received datum. - */ -#define SPI_READ_RX1(spi) ((spi)->RX[1]) - -/** - * @brief Write datum to TX0 register. - * @param[in] spi The pointer of the specified SPI module. - * @param[in] u32TxData The datum which user attempt to transfer through SPI bus. - * @return None. - * @details Write u32TxData to TX0 register. - */ -#define SPI_WRITE_TX0(spi, u32TxData) ((spi)->TX[0] = (u32TxData)) - -/** - * @brief Write datum to TX1 register. - * @param[in] spi The pointer of the specified SPI module. - * @param[in] u32TxData The datum which user attempt to transfer through SPI bus. - * @return None. - * @details Write u32TxData to TX1 register. - */ -#define SPI_WRITE_TX1(spi, u32TxData) ((spi)->TX[1] = (u32TxData)) - -/** - * @brief Set SPIn_SS0, SPIn_SS1 pin to high or low state. - * @param[in] spi The pointer of the specified SPI module. - * @param[in] ss0 0 = Set SPIn_SS0 to low. 1 = Set SPIn_SS0 to high. - * @param[in] ss1 0 = Set SPIn_SS1 to low. 1 = Set SPIn_SS1 to high. - * @return None. - * @details Disable automatic slave selection function and set SPIn_SS0/SPIn_SS1 pin to specified high/low state. - * Only available in Master mode. - */ -#define SPI_SET_SS_LEVEL(spi, ss0, ss1) ((spi)->SSR = ((spi)->SSR & ~(SPI_SSR_AUTOSS_Msk|SPI_SSR_SS_LVL_Msk|SPI_SSR_SSR_Msk)) | (((ss1)^1) << 1) | ((ss0)^1)) - -/** - * @brief Set SPIn_SS0 pin to high state. - * @param[in] spi The pointer of the specified SPI module. - * @return None. - * @details Disable automatic slave selection function and set SPIn_SS0 pin to high state. Only available in Master mode. - */ -#define SPI_SET_SS0_HIGH(spi) ((spi)->SSR = ((spi)->SSR & ~(SPI_SSR_AUTOSS_Msk|SPI_SSR_SS_LVL_Msk|SPI_SS0))) - -/** - * @brief Set SPIn_SS1 pin to high state. - * @param[in] spi The pointer of the specified SPI module. - * @return None. - * @details Disable automatic slave selection function and set SPIn_SS1 pin to high state. Only available in Master mode. - */ -#define SPI_SET_SS1_HIGH(spi) ((spi)->SSR = ((spi)->SSR & ~(SPI_SSR_AUTOSS_Msk|SPI_SSR_SS_LVL_Msk|SPI_SS1))) - -/** - * @brief Set SPIn_SS0 pin to low state. - * @param[in] spi The pointer of the specified SPI module. - * @return None. - * @details Disable automatic slave selection function and set SPIn_SS0 pin to low state. Only available in Master mode. - */ -#define SPI_SET_SS0_LOW(spi) ((spi)->SSR = ((spi)->SSR & ~(SPI_SSR_AUTOSS_Msk|SPI_SSR_SS_LVL_Msk|SPI_SS0)) | SPI_SS0) - -/** - * @brief Set SPIn_SS1 pin to low state. - * @param[in] spi The pointer of the specified SPI module. - * @return None. - * @details Disable automatic slave selection function and set SPIn_SS1 pin to low state. Only available in Master mode. - */ -#define SPI_SET_SS1_LOW(spi) ((spi)->SSR = ((spi)->SSR & ~(SPI_SSR_AUTOSS_Msk|SPI_SSR_SS_LVL_Msk|SPI_SS1)) | SPI_SS1) - -/** - * @brief Enable Byte Reorder function. - * @param[in] spi The pointer of the specified SPI module. - * @return None. - * @details Set REORDER bit of SPI_CNTRL register to enable Byte Reorder function. - */ -#define SPI_ENABLE_BYTE_REORDER(spi) ((spi)->CNTRL |= SPI_CNTRL_REORDER_Msk) - -/** - * @brief Disable Byte Reorder function. - * @param[in] spi The pointer of the specified SPI module. - * @return None. - * @details Clear REORDER bit of SPI_CNTRL register to disable Byte Reorder function. - */ -#define SPI_DISABLE_BYTE_REORDER(spi) ((spi)->CNTRL &= ~SPI_CNTRL_REORDER_Msk) - -/** - * @brief Set the length of suspend interval. - * @param[in] spi The pointer of the specified SPI module. - * @param[in] u32SuspCycle Decides the length of suspend interval. It could be 0 ~ 15. - * @return None. - * @details Set the length of suspend interval according to u32SuspCycle. - * The length of suspend interval is ((u32SuspCycle + 0.5) * the length of one SPI bus clock cycle). - * Only available in Master mode. - */ -#define SPI_SET_SUSPEND_CYCLE(spi, u32SuspCycle) ((spi)->CNTRL = ((spi)->CNTRL & ~SPI_CNTRL_SP_CYCLE_Msk) | ((u32SuspCycle) << SPI_CNTRL_SP_CYCLE_Pos)) - -/** - * @brief Set the SPI transfer sequence with LSB first. - * @param[in] spi The pointer of the specified SPI module. - * @return None. - * @details Set LSB bit of SPI_CNTRL register to set the SPI transfer sequence with LSB first. - */ -#define SPI_SET_LSB_FIRST(spi) ((spi)->CNTRL |= SPI_CNTRL_LSB_Msk) - -/** - * @brief Set the SPI transfer sequence with MSB first. - * @param[in] spi The pointer of the specified SPI module. - * @return None. - * @details Clear LSB bit of SPI_CNTRL register to set the SPI transfer sequence with MSB first. - */ -#define SPI_SET_MSB_FIRST(spi) ((spi)->CNTRL &= ~SPI_CNTRL_LSB_Msk) - -/** - * @brief Set the data width of a SPI transaction. - * @param[in] spi The pointer of the specified SPI module. - * @param[in] u32Width The bit width of transfer data. - * @return None. - * @details The data width can be 8 ~ 32 bits. - */ -#define SPI_SET_DATA_WIDTH(spi, u32Width) ((spi)->CNTRL = ((spi)->CNTRL & ~SPI_CNTRL_TX_BIT_LEN_Msk) | (((u32Width)&0x1F) << SPI_CNTRL_TX_BIT_LEN_Pos)) - -/** - * @brief Get the SPI busy state. - * @param[in] spi The pointer of the specified SPI module. - * @retval 0 SPI controller is not busy. - * @retval 1 SPI controller is busy. - * @details This macro will return the busy state of SPI controller. - */ -#define SPI_IS_BUSY(spi) ( ((spi)->CNTRL & SPI_CNTRL_GO_BUSY_Msk)>>SPI_CNTRL_GO_BUSY_Pos ) - -/** - * @brief Set the GO_BUSY bit to trigger SPI transfer. - * @param[in] spi The pointer of the specified SPI module. - * @return None. - * @details If FIFO mode is disabled, user can use this macro to trigger the data transfer after all configuration is ready. - * If FIFO mode is enabled, user should not use this macro to trigger the data transfer. SPI controller will trigger the data transfer - * automatically after user write to SPI_TX0/1 register. - */ -#define SPI_TRIGGER(spi) ((spi)->CNTRL |= SPI_CNTRL_GO_BUSY_Msk) - - - -/* Function prototype declaration */ -uint32_t SPI_Open(SPI_T *spi, uint32_t u32MasterSlave, uint32_t u32SPIMode, uint32_t u32DataWidth, uint32_t u32BusClock); -void SPI_Close(SPI_T *spi); -void SPI_ClearRxFIFO(SPI_T *spi); -void SPI_ClearTxFIFO(SPI_T *spi); -void SPI_DisableAutoSS(SPI_T *spi); -void SPI_EnableAutoSS(SPI_T *spi, uint32_t u32SSPinMask, uint32_t u32ActiveLevel); -uint32_t SPI_SetBusClock(SPI_T *spi, uint32_t u32BusClock); -void SPI_EnableFIFO(SPI_T *spi, uint32_t u32TxThreshold, uint32_t u32RxThreshold); -void SPI_DisableFIFO(SPI_T *spi); -uint32_t SPI_GetBusClock(SPI_T *spi); -void SPI_EnableInt(SPI_T *spi, uint32_t u32Mask); -void SPI_DisableInt(SPI_T *spi, uint32_t u32Mask); -uint32_t SPI_GetIntFlag(SPI_T *spi, uint32_t u32Mask); -void SPI_ClearIntFlag(SPI_T *spi, uint32_t u32Mask); -uint32_t SPI_GetStatus(SPI_T *spi, uint32_t u32Mask); - - - -/** - * @} End of SPI Device Function Interface - */ - -/** - * @} End of NUC123 Function Interface - */ - -/** - * @} End of Standard_Driver - */ - - -#endif - diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/sys.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/sys.h deleted file mode 100644 index 22778f2b..00000000 --- a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/sys.h +++ /dev/null @@ -1,1368 +0,0 @@ -/**************************************************************************//** - * @file sys.h - * @version V3.00 - * $Revision: 41 $ - * $Date: 15/07/02 11:21a $ - * @brief NUC123 Series SYS Driver Header File - * - * @note - * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. - * - ******************************************************************************/ -#ifndef __SYS_H__ -#define __SYS_H__ - -#ifdef __cplusplus -extern "C" -{ -#endif - -/** @addtogroup Standard_Driver Standard Driver - @{ -*/ - -/** @addtogroup SYS_Driver SYS Driver - @{ -*/ - -/** @addtogroup SYS_EXPORTED_CONSTANTS SYS Exported Constants - @{ -*/ - - -/*---------------------------------------------------------------------------------------------------------*/ -/* Module Reset Control Resister constant definitions. */ -/*---------------------------------------------------------------------------------------------------------*/ -#define PDMA_RST ((0x0<<24) | SYS_IPRSTC1_PDMA_RST_Pos ) /*!< PDMA reset is one of the SYS_ResetModule parameter */ -#define GPIO_RST ((0x4<<24) | SYS_IPRSTC2_GPIO_RST_Pos ) /*!< GPIO reset is one of the SYS_ResetModule parameter */ -#define TMR0_RST ((0x4<<24) | SYS_IPRSTC2_TMR0_RST_Pos ) /*!< TMR0 reset is one of the SYS_ResetModule parameter */ -#define TMR1_RST ((0x4<<24) | SYS_IPRSTC2_TMR1_RST_Pos ) /*!< TMR1 reset is one of the SYS_ResetModule parameter */ -#define TMR2_RST ((0x4<<24) | SYS_IPRSTC2_TMR2_RST_Pos ) /*!< TMR2 reset is one of the SYS_ResetModule parameter */ -#define TMR3_RST ((0x4<<24) | SYS_IPRSTC2_TMR3_RST_Pos ) /*!< TMR3 reset is one of the SYS_ResetModule parameter */ -#define I2C0_RST ((0x4<<24) | SYS_IPRSTC2_I2C0_RST_Pos ) /*!< I2C0 reset is one of the SYS_ResetModule parameter */ -#define I2C1_RST ((0x4<<24) | SYS_IPRSTC2_I2C1_RST_Pos ) /*!< I2C1 reset is one of the SYS_ResetModule parameter */ -#define SPI0_RST ((0x4<<24) | SYS_IPRSTC2_SPI0_RST_Pos ) /*!< SPI0 reset is one of the SYS_ResetModule parameter */ -#define SPI1_RST ((0x4<<24) | SYS_IPRSTC2_SPI1_RST_Pos ) /*!< SPI1 reset is one of the SYS_ResetModule parameter */ -#define SPI2_RST ((0x4<<24) | SYS_IPRSTC2_SPI2_RST_Pos ) /*!< SPI2 reset is one of the SYS_ResetModule parameter */ -#define UART0_RST ((0x4<<24) | SYS_IPRSTC2_UART0_RST_Pos ) /*!< UART0 reset is one of the SYS_ResetModule parameter */ -#define UART1_RST ((0x4<<24) | SYS_IPRSTC2_UART1_RST_Pos ) /*!< UART1 reset is one of the SYS_ResetModule parameter */ -#define PWM03_RST ((0x4<<24) | SYS_IPRSTC2_PWM03_RST_Pos ) /*!< PWM03 reset is one of the SYS_ResetModule parameter */ -#define PS2_RST ((0x4<<24) | SYS_IPRSTC2_PS2_RST_Pos ) /*!< PS2 reset is one of the SYS_ResetModule parameter */ -#define USBD_RST ((0x4<<24) | SYS_IPRSTC2_USBD_RST_Pos ) /*!< USBD reset is one of the SYS_ResetModule parameter */ -#define ADC_RST ((0x4<<24) | SYS_IPRSTC2_ADC_RST_Pos ) /*!< ADC reset is one of the SYS_ResetModule parameter */ -#define I2S_RST ((0x4<<24) | SYS_IPRSTC2_I2S_RST_Pos ) /*!< I2S reset is one of the SYS_ResetModule parameter */ - - -/*---------------------------------------------------------------------------------------------------------*/ -/* Brown Out Detector Threshold Voltage Selection constant definitions. */ -/*---------------------------------------------------------------------------------------------------------*/ -#define SYS_BODCR_BOD_RST_EN (1UL<GPA_MFP &= ~(SYS_GPA_MFP_PA10_Msk | SYS_GPA_MFP_PA11_Msk); - SYS->ALT_MFP &= ~(SYS_ALT_MFP_PA10_Msk | SYS_ALT_MFP_PA11_Msk); - - SYS->GPA_MFP |= (SYS_GPA_MFP_PA10_I2C1_SDA | SYS_GPA_MFP_PA11_I2C1_SCL); - SYS->ALT_MFP |= (SYS_ALT_MFP_PA10_I2C1_SDA | SYS_ALT_MFP_PA11_I2C1_SCL); -*/ - -//PA.10 -#define SYS_GPA_MFP_PA10_GPIO 0x00000000UL /*!< GPA_MFP PA.10 setting for GPIO */ -#define SYS_ALT_MFP_PA10_GPIO 0x00000000UL /*!< ALT_MFP PA.10 setting for GPIO */ -#define SYS_ALT_MFP1_PA10_GPIO NULL /*!< No ALT_MFP1 setting for PA.10 */ - -#define SYS_GPA_MFP_PA10_I2C1_SDA (1UL<<10) /*!< GPA_MFP PA.10 setting for I2C1_SDA */ -#define SYS_ALT_MFP_PA10_I2C1_SDA 0x00000000UL /*!< ALT_MFP PA.10 setting for I2C1_SDA */ -#define SYS_ALT_MFP1_PA10_I2C1_SDA NULL /*!< No ALT_MFP1 setting for PA.10 */ - -#define SYS_GPA_MFP_PA10_SPI1_MISO0 0x00000000UL /*!< GPA_MFP PA.10 setting for SPI1_MISO0 */ -#define SYS_ALT_MFP_PA10_SPI1_MISO0 (1UL<<12) /*!< ALT_MFP PA.10 setting for SPI1_MISO0 */ -#define SYS_ALT_MFP1_PA10_SPI1_MISO0 NULL /*!< No ALT_MFP1 setting for PA.10 */ - -#define SYS_GPA_MFP_PA10_SPI2_MISO0 (1UL<<10) /*!< GPA_MFP PA.10 setting for SPI2_MISO0 */ -#define SYS_ALT_MFP_PA10_SPI2_MISO0 (1UL<<12) /*!< ALT_MFP PA.10 setting for SPI2_MISO0 */ -#define SYS_ALT_MFP1_PA10_SPI2_MISO0 NULL /*!< No ALT_MFP1 setting for PA.10 */ - -#define SYS_GPA_MFP_PA10_Msk (1UL<<10) /*!< GPA_MFP PA.10 mask */ -#define SYS_ALT_MFP_PA10_Msk (1UL<<12) /*!< ALT_MFP PA.10 mask */ -#define SYS_ALT_MFP1_PA10_Msk NULL /*!< No ALT_MFP1 PA.10 mask */ - -//PA.11 -#define SYS_GPA_MFP_PA11_GPIO 0x00000000UL /*!< GPA_MFP PA.11 setting for GPIO */ -#define SYS_ALT_MFP_PA11_GPIO 0x00000000UL /*!< ALT_MFP PA.11 setting for GPIO */ -#define SYS_ALT_MFP1_PA11_GPIO NULL /*!< No ALT_MFP1 setting for PA.11 */ - -#define SYS_GPA_MFP_PA11_I2C1_SCL (1UL<<11) /*!< GPA_MFP PA.11 setting for I2C1_SCL */ -#define SYS_ALT_MFP_PA11_I2C1_SCL 0x00000000UL /*!< ALT_MFP PA.11 setting for I2C1_SCL */ -#define SYS_ALT_MFP1_PA11_I2C1_SCL NULL /*!< No ALT_MFP1 setting for PA.11 */ - -#define SYS_GPA_MFP_PA11_SPI1_CLK 0x00000000UL /*!< GPA_MFP PA.11 setting for SPI1_CLK */ -#define SYS_ALT_MFP_PA11_SPI1_CLK (1UL<<11) /*!< ALT_MFP PA.11 setting for SPI1_CLK */ -#define SYS_ALT_MFP1_PA11_SPI1_CLK NULL /*!< No ALT_MFP1 setting for PA.11 */ - -#define SYS_GPA_MFP_PA11_SPI2_MOSI0 (1UL<<11) /*!< GPA_MFP PA.11 setting for MOSI20 */ -#define SYS_ALT_MFP_PA11_SPI2_MOSI0 (1UL<<11) /*!< ALT_MFP PA.11 setting for MOSI20 */ -#define SYS_ALT_MFP1_PA11_SPI2_MOSI0 NULL /*!< No ALT_MFP1 setting for PA.11 */ - -#define SYS_GPA_MFP_PA11_Msk (1UL<<11) /*!< GPA_MFP PA.11 mask */ -#define SYS_ALT_MFP_PA11_Msk (1UL<<11) /*!< ALT_MFP PA.11 mask */ -#define SYS_ALT_MFP1_PA11_Msk NULL /*!< No ALT_MFP1 PA.11 mask */ - -//PA.12 -#define SYS_GPA_MFP_PA12_GPIO 0x00000000UL /*!< GPA_MFP PA.12 setting for GPIO */ -#define SYS_ALT_MFP_PA12_GPIO NULL /*!< No ALT_MFP setting for PA.12 */ -#define SYS_ALT_MFP1_PA12_GPIO NULL /*!< No ALT_MFP1 setting for PA.12 */ - -#define SYS_GPA_MFP_PA12_PWM0 (1UL<<12) /*!< GPA_MFP PA.12 setting for PWM0 */ -#define SYS_ALT_MFP_PA12_PWM0 NULL /*!< No ALT_MFP setting for PA.12 */ -#define SYS_ALT_MFP1_PA12_PWM0 NULL /*!< No ALT_MFP1 setting for PA.12 */ - -#define SYS_GPA_MFP_PA12_Msk (1UL<<12) /*!< GPA_MFP PA.12 mask */ -#define SYS_ALT_MFP_PA12_Msk NULL /*!< No ALT_MFP PA.12 mask */ -#define SYS_ALT_MFP1_PA12_Msk NULL /*!< No ALT_MFP1 PA.12 mask */ - -//PA.13 -#define SYS_GPA_MFP_PA13_GPIO 0x00000000UL /*!< GPA_MFP PA.13 setting for GPIO */ -#define SYS_ALT_MFP_PA13_GPIO NULL /*!< no ALT_MFP setting for PA.13 */ -#define SYS_ALT_MFP1_PA13_GPIO NULL /*!< No ALT_MFP1 setting for PA.13 */ - -#define SYS_GPA_MFP_PA13_PWM1 (1UL<<13) /*!< GPA_MFP PA.13 setting for PWM1 */ -#define SYS_ALT_MFP_PA13_PWM1 NULL /*!< no ALT_MFP setting for PA.13 */ -#define SYS_ALT_MFP1_PA13_PWM1 NULL /*!< No ALT_MFP1 setting for PA.13 */ - -#define SYS_GPA_MFP_PA13_Msk (1UL<<13) /*!< GPA_MFP PA.13 mask */ -#define SYS_ALT_MFP_PA13_Msk NULL /*!< no ALT_MFP PA.13 mask */ -#define SYS_ALT_MFP1_PA13_Msk NULL /*!< No ALT_MFP1 PA.13 mask */ - -//PA.14 -#define SYS_GPA_MFP_PA14_GPIO 0x00000000UL /*!< GPA_MFP PA.14 setting for GPIO */ -#define SYS_ALT_MFP_PA14_GPIO NULL /*!< No ALT_MFP setting for PA.14 */ -#define SYS_ALT_MFP1_PA14_GPIO NULL /*!< No ALT_MFP1 setting for PA.14 */ - -#define SYS_GPA_MFP_PA14_PWM2 (1UL<<14) /*!< GPA_MFP PA.14 setting for PWM2 */ -#define SYS_ALT_MFP_PA14_PWM2 NULL /*!< No ALT_MFP setting for PA.14 */ -#define SYS_ALT_MFP1_PA14_PWM2 NULL /*!< No ALT_MFP1 setting for PA.14 */ - -#define SYS_GPA_MFP_PA14_Msk (1UL<<14) /*!< GPA_MFP PA.14 mask */ -#define SYS_ALT_MFP_PA14_Msk NULL /*!< No ALT_MFP PA.14 mask */ -#define SYS_ALT_MFP1_PA14_Msk NULL /*!< No ALT_MFP1 PA.14 mask */ - -//PA.15 -#define SYS_GPA_MFP_PA15_GPIO 0x00000000UL /*!< GPA_MFP PA.15 setting for GPIO */ -#define SYS_ALT_MFP_PA15_GPIO 0x00000000UL /*!< ALT_MFP PA.15 setting for GPIO */ -#define SYS_ALT_MFP1_PA15_GPIO NULL /*!< No ALT_MFP1 setting for PA.15 */ - -#define SYS_GPA_MFP_PA15_PWM3 (1UL<<15) /*!< GPA_MFP PA.15 setting for PWM3 */ -#define SYS_ALT_MFP_PA15_PWM3 0x00000000UL /*!< ALT_MFP PA.15 setting for PWM3 */ -#define SYS_ALT_MFP1_PA15_PWM3 NULL /*!< No ALT_MFP1 setting for PA.15 */ - -#define SYS_GPA_MFP_PA15_CLKO 0x00000000UL /*!< GPA_MFP PA.15 setting for CLKO */ -#define SYS_ALT_MFP_PA15_CLKO (1UL<<9) /*!< ALT_MFP PA.15 setting for CLKO */ -#define SYS_ALT_MFP1_PA15_CLKO NULL /*!< No ALT_MFP1 setting for PA.15 */ - -#define SYS_GPA_MFP_PA15_I2S_MCLK (1UL<<15) /*!< GPA_MFP PA.15 setting for I2S_MCLK */ -#define SYS_ALT_MFP_PA15_I2S_MCLK (1UL<<9) /*!< ALT_MFP PA.15 setting for I2S_MCLK */ -#define SYS_ALT_MFP1_PA15_I2S_MCLK NULL /*!< No ALT_MFP1 setting for PA.15 */ - -#define SYS_GPA_MFP_PA15_Msk (1UL<<15) /*!< GPA_MFP PA.15 mask */ -#define SYS_ALT_MFP_PA15_Msk (1UL<<9) /*!< ALT_MFP PA.15 mask */ -#define SYS_ALT_MFP1_PA15_Msk NULL /*!< No ALT_MFP1 PA.15 mask */ - -//PB.0 -#define SYS_GPB_MFP_PB0_GPIO 0x00000000UL /*!< GPB_MFP PB.0 setting for GPIO */ -#define SYS_ALT_MFP_PB0_GPIO NULL /*!< No ALT_MFP setting for PB.0 */ -#define SYS_ALT_MFP1_PB0_GPIO NULL /*!< No ALT_MFP1 setting for PB.0 */ - -#define SYS_GPB_MFP_PB0_UART0_RXD (1UL<<0) /*!< GPB_MFP PB.0 setting for UART0_RXD */ -#define SYS_ALT_MFP_PB0_UART0_RXD NULL /*!< No ALT_MFP setting for PB.0 */ -#define SYS_ALT_MFP1_PB0_UART0_RXD NULL /*!< No ALT_MFP1 setting for PB.0 */ - -#define SYS_GPB_MFP_PB0_Msk (1UL<<0) /*!< GPB_MFP PB.0 mask */ -#define SYS_ALT_MFP_PB0_Msk NULL /*!< No ALT_MFP PB.0 mask */ -#define SYS_ALT_MFP1_PB0_Msk NULL /*!< No ALT_MFP1 PB.0 mask */ - -//PB.1 -#define SYS_GPB_MFP_PB1_GPIO 0x00000000UL /*!< GPB_MFP PB.1 setting for GPIO */ -#define SYS_ALT_MFP_PB1_GPIO NULL /*!< No ALT_MFP setting for PB.1 */ -#define SYS_ALT_MFP1_PB1_GPIO NULL /*!< No ALT_MFP1 setting for PB.1 */ - -#define SYS_GPB_MFP_PB1_UART0_TXD (1UL<<1) /*!< GPB_MFP PB.1 setting for UART0_TXD */ -#define SYS_ALT_MFP_PB1_UART0_TXD NULL /*!< No ALT_MFP setting for PB.1 */ -#define SYS_ALT_MFP1_PB1_UART0_TXD NULL /*!< No ALT_MFP1 setting for PB.1 */ - -#define SYS_GPB_MFP_PB1_Msk (1UL<<1) /*!< GPB_MFP PB.1 mask */ -#define SYS_ALT_MFP_PB1_Msk NULL /*!< No ALT_MFP PB.1 mask */ -#define SYS_ALT_MFP1_PB1_Msk NULL /*!< No ALT_MFP1 PB.1 mask */ - -//PB.2 -#define SYS_GPB_MFP_PB2_GPIO 0x00000000UL /*!< GPB_MFP PB.2 setting for GPIO */ -#define SYS_ALT_MFP_PB2_GPIO 0x00000000UL /*!< ALT_MFP PB.2 setting for GPIO */ -#define SYS_ALT_MFP1_PB2_GPIO NULL /*!< No ALT_MFP1 setting for PB.2 */ - -#define SYS_GPB_MFP_PB2_UART0_nRTS (1UL<<2) /*!< GPB_MFP PB.2 setting for UART0_nRTS */ -#define SYS_ALT_MFP_PB2_UART0_nRTS 0x00000000UL /*!< ALT_MFP PB.2 setting for UART0_nRTS */ -#define SYS_ALT_MFP1_PB2_UART0_nRTS NULL /*!< No ALT_MFP1 setting for PB.2 */ - -#define SYS_GPB_MFP_PB2_TM2_EXT (1UL<<2) /*!< GPB_MFP PB.2 setting for TM2_EXT */ -#define SYS_ALT_MFP_PB2_TM2_EXT (1UL<<26) /*!< ALT_MFP PB.2 setting for TM2_EXT */ -#define SYS_ALT_MFP1_PB2_TM2_EXT NULL /*!< No ALT_MFP1 setting for PB.2 */ - -#define SYS_GPB_MFP_PB2_Msk (1UL<<2) /*!< GPB_MFP PB.2 mask */ -#define SYS_ALT_MFP_PB2_Msk (1UL<<26) /*!< ALT_MFP PB.2 mask */ -#define SYS_ALT_MFP1_PB2_Msk NULL /*!< No ALT_MFP1 PB.2 mask */ - -//PB.3 -#define SYS_GPB_MFP_PB3_GPIO 0x00000000UL /*!< GPB_MFP PB.3 setting for GPIO */ -#define SYS_ALT_MFP_PB3_GPIO 0x00000000UL /*!< ALT_MFP PB.3 setting for GPIO */ -#define SYS_ALT_MFP1_PB3_GPIO NULL /*!< No ALT_MFP1 setting for PB.3 */ - -#define SYS_GPB_MFP_PB3_UART0_nCTS (1UL<<3) /*!< GPB_MFP PB.3 setting for UART0_nCTS */ -#define SYS_ALT_MFP_PB3_UART0_nCTS 0x00000000UL /*!< ALT_MFP PB.3 setting for UART0_nCTS */ -#define SYS_ALT_MFP1_PB3_UART0_nCTS NULL /*!< No ALT_MFP1 setting for PB.3 */ - -#define SYS_GPB_MFP_PB3_TM3_EXT (1UL<<3) /*!< GPB_MFP PB.3 setting for TM3_EXT */ -#define SYS_ALT_MFP_PB3_TM3_EXT (1UL<<27) /*!< ALT_MFP PB.3 setting for TM3_EXT */ -#define SYS_ALT_MFP1_PB3_TM3_EXT NULL /*!< No ALT_MFP1 setting for PB.3 */ - -#define SYS_GPB_MFP_PB3_Msk (1UL<<3) /*!< GPB_MFP PB.3 mask */ -#define SYS_ALT_MFP_PB3_Msk (1UL<<27) /*!< ALT_MFP PB.3 mask */ -#define SYS_ALT_MFP1_PB3_Msk NULL /*!< No ALT_MFP1 PB.3 mask */ - -//PB.4 -#define SYS_GPB_MFP_PB4_GPIO 0x00000000UL /*!< GPB_MFP PB.4 setting for GPIO */ -#define SYS_ALT_MFP_PB4_GPIO 0x00000000UL /*!< ALT_MFP PB.4 setting for GPIO */ -#define SYS_ALT_MFP1_PB4_GPIO NULL /*!< No ALT_MFP1 setting for PB.4 */ - -#define SYS_GPB_MFP_PB4_UART1_RXD (1UL<<4) /*!< GPB_MFP PB.4 setting for UART1_RXD */ -#define SYS_ALT_MFP_PB4_UART1_RXD 0x00000000UL /*!< ALT_MFP PB.4 setting for UART1_RXD */ -#define SYS_ALT_MFP1_PB4_UART1_RXD NULL /*!< No ALT_MFP1 setting for PB.4 */ - -#define SYS_GPB_MFP_PB4_SPI2_SS0 0x00000000UL /*!< GPB_MFP PB.4 setting for SPI2_SS0 */ -#define SYS_ALT_MFP_PB4_SPI2_SS0 (1UL<<15) /*!< ALT_MFP PB.4 setting for SPI2_SS0 */ -#define SYS_ALT_MFP1_PB4_SPI2_SS0 NULL /*!< No ALT_MFP1 setting for PB.4 */ - -#define SYS_GPB_MFP_PB4_SPI1_SS1 (1UL<<4) /*!< GPB_MFP PB.4 setting for SPI1_SS1 */ -#define SYS_ALT_MFP_PB4_SPI1_SS1 (1UL<<15) /*!< ALT_MFP PB.4 setting for SPI1_SS1 */ -#define SYS_ALT_MFP1_PB4_SPI1_SS1 NULL /*!< No ALT_MFP1 setting for PB.4 */ - -#define SYS_GPB_MFP_PB4_Msk (1UL<<4) /*!< GPB_MFP PB.4 mask */ -#define SYS_ALT_MFP_PB4_Msk (1UL<<15) /*!< ALT_MFP PB.4 mask */ -#define SYS_ALT_MFP1_PB4_Msk NULL /*!< No ALT_MFP1 PB.4 mask */ - -//PB.5 -#define SYS_GPB_MFP_PB5_GPIO 0x00000000UL /*!< GPB_MFP PB.5 setting for GPIO */ -#define SYS_ALT_MFP_PB5_GPIO 0x00000000UL /*!< ALT_MFP PB.5 setting for GPIO */ -#define SYS_ALT_MFP1_PB5_GPIO NULL /*!< No ALT_MFP1 setting for PB.5 */ - -#define SYS_GPB_MFP_PB5_UART1_TXD (1UL<<5) /*!< GPB_MFP PB.5 setting for UART1_TXD */ -#define SYS_ALT_MFP_PB5_UART1_TXD 0x00000000UL /*!< ALT_MFP PB.5 setting for UART1_TXD */ -#define SYS_ALT_MFP1_PB5_UART1_TXD NULL /*!< No ALT_MFP1 setting for PB.5 */ - -#define SYS_GPB_MFP_PB5_SPI2_CLK (1UL<<5) /*!< GPB_MFP PB.5 setting for SPI2_CLK */ -#define SYS_ALT_MFP_PB5_SPI2_CLK (1UL<<18) /*!< ALT_MFP PB.5 setting for SPI2_CLK */ -#define SYS_ALT_MFP1_PB5_SPI2_CLK NULL /*!< No ALT_MFP1 setting for PB.5 */ - -#define SYS_GPB_MFP_PB5_Msk (1UL<<5) /*!< GPB_MFP PB.5 mask */ -#define SYS_ALT_MFP_PB5_Msk (1UL<<18) /*!< ALT_MFP PB.5 mask */ -#define SYS_ALT_MFP1_PB5_Msk NULL /*!< No ALT_MFP1 PB.5 mask */ - -//PB.6 -#define SYS_GPB_MFP_PB6_GPIO 0x00000000UL /*!< GPB_MFP PB.6 setting for GPIO */ -#define SYS_ALT_MFP_PB6_GPIO 0x00000000UL /*!< ALT_MFP PB.6 setting for GPIO */ -#define SYS_ALT_MFP1_PB6_GPIO NULL /*!< No ALT_MFP1 setting for PB.6 */ - -#define SYS_GPB_MFP_PB6_UART1_nRTS (1UL<<6) /*!< GPB_MFP PB.6 setting for UART1_nRTS */ -#define SYS_ALT_MFP_PB6_UART1_nRTS 0x00000000UL /*!< ALT_MFP PB.6 setting for UART1_nRTS */ -#define SYS_ALT_MFP1_PB6_UART1_nRTS NULL /*!< No ALT_MFP1 setting for PB.6 */ - -#define SYS_GPB_MFP_PB6_SPI2_MOSI0 (1UL<<6) /*!< GPB_MFP PB.6 setting for SPI2_MOSI0 */ -#define SYS_ALT_MFP_PB6_SPI2_MOSI0 (1UL<<17) /*!< ALT_MFP PB.6 setting for SPI2_MOSI0 */ -#define SYS_ALT_MFP1_PB6_SPI2_MOSI0 NULL /*!< No ALT_MFP1 setting for PB.6 */ - -#define SYS_GPB_MFP_PB6_Msk (1UL<<6) /*!< GPB_MFP PB.6 mask */ -#define SYS_ALT_MFP_PB6_Msk (1UL<<17) /*!< ALT_MFP PB.6 mask */ -#define SYS_ALT_MFP1_PB6_Msk NULL /*!< No ALT_MFP1 PB.6 mask */ - -//PB.7 -#define SYS_GPB_MFP_PB7_GPIO 0x00000000UL /*!< GPB_MFP PB.7 setting for GPIO */ -#define SYS_ALT_MFP_PB7_GPIO 0x00000000UL /*!< ALT_MFP PB.7 setting for GPIO */ -#define SYS_ALT_MFP1_PB7_GPIO NULL /*!< No ALT_MFP1 setting for PB.7 */ - -#define SYS_GPB_MFP_PB7_UART1_nCTS (1UL<<7) /*!< GPB_MFP PB.7 setting for UART1_nCTS */ -#define SYS_ALT_MFP_PB7_UART1_nCTS 0x00000000UL /*!< ALT_MFP PB.7 setting for UART1_nCTS */ -#define SYS_ALT_MFP1_PB7_UART1_nCTS NULL /*!< No ALT_MFP1 setting for PB.7 */ - -#define SYS_GPB_MFP_PB7_SPI2_MISO0 (1UL<<7) /*!< GPB_MFP PB.7 setting for SPI2_MISO0 */ -#define SYS_ALT_MFP_PB7_SPI2_MISO0 (1UL<<16) /*!< ALT_MFP PB.7 setting for SPI2_MISO0 */ -#define SYS_ALT_MFP1_PB7_SPI2_MISO0 NULL /*!< No ALT_MFP1 setting for PB.7 */ - -#define SYS_GPB_MFP_PB7_Msk (1UL<<7) /*!< GPB_MFP PB.7 mask */ -#define SYS_ALT_MFP_PB7_Msk (1UL<<16) /*!< ALT_MFP PB.7 mask */ -#define SYS_ALT_MFP1_PB7_Msk NULL /*!< No ALT_MFP1 PB.7 mask */ - -//PB.8 -#define SYS_GPB_MFP_PB8_GPIO 0x00000000UL /*!< GPB_MFP PB.8 setting for GPIO */ -#define SYS_ALT_MFP_PB8_GPIO NULL /*!< No ALT_MFP setting for PB.8 */ -#define SYS_ALT_MFP1_PB8_GPIO NULL /*!< No ALT_MFP1 setting for PB.8 */ - -#define SYS_GPB_MFP_PB8_TM0 (1UL<<8) /*!< GPB_MFP PB.8 setting for TM0 */ -#define SYS_ALT_MFP_PB8_TM0 NULL /*!< No ALT_MFP setting for PB.8 */ -#define SYS_ALT_MFP1_PB8_TM0 NULL /*!< No ALT_MFP1 setting for PB.8 */ - -#define SYS_GPB_MFP_PB8_Msk (1UL<<8) /*!< GPB_MFP PB.8 mask */ -#define SYS_ALT_MFP_PB8_Msk NULL /*!< No ALT_MFP PB.8 mask */ -#define SYS_ALT_MFP1_PB8_Msk NULL /*!< No ALT_MFP1 PB.8 mask */ - -//PB.9 -#define SYS_GPB_MFP_PB9_GPIO 0x00000000UL /*!< GPB_MFP PB.9 setting for GPIO */ -#define SYS_ALT_MFP_PB9_GPIO 0x00000000UL /*!< ALT_MFP PB.9 setting for GPIO */ -#define SYS_ALT_MFP1_PB9_GPIO NULL /*!< No ALT_MFP1 setting for PB.9 */ - -#define SYS_GPB_MFP_PB9_TM1 (1UL<<9) /*!< GPB_MFP PB.9 setting for TM1 */ -#define SYS_ALT_MFP_PB9_TM1 0x00000000UL /*!< ALT_MFP PB.9 setting for TM1 */ -#define SYS_ALT_MFP1_PB9_TM1 NULL /*!< No ALT_MFP1 setting for PB.9 */ - -#define SYS_GPB_MFP_PB9_SPI1_SS1 (1UL<<9) /*!< GPB_MFP PB.9 setting for SPI1_SS1 */ -#define SYS_ALT_MFP_PB9_SPI1_SS1 (1UL<<1) /*!< ALT_MFP PB.9 setting for SPI1_SS1 */ -#define SYS_ALT_MFP1_PB9_SPI1_SS1 NULL /*!< No ALT_MFP1 setting for PB.9 */ - -#define SYS_GPB_MFP_PB9_PWM1 0x00000000UL /*!< GPB_MFP PB.9 setting for PWM1 (NUC123xxxAEx only) */ -#define SYS_ALT_MFP_PB9_PWM1 (1UL<<1) /*!< ALT_MFP PB.9 setting for PWM1 (NUC123xxxAEx only) */ -#define SYS_ALT_MFP1_PB9_PWM1 NULL /*!< No ALT_MFP1 setting for PB.9 */ - -#define SYS_GPB_MFP_PB9_Msk (1UL<<9) /*!< GPB_MFP PB.9 mask */ -#define SYS_ALT_MFP_PB9_Msk (1UL<<1) /*!< ALT_MFP PB.9 mask */ -#define SYS_ALT_MFP1_PB9_Msk NULL /*!< No ALT_MFP1 PB.9 mask */ - -//PB.10 -#define SYS_GPB_MFP_PB10_GPIO 0x00000000UL /*!< GPB_MFP PB.10 setting for GPIO */ -#define SYS_ALT_MFP_PB10_GPIO 0x00000000UL /*!< ALT_MFP PB.10 setting for GPIO */ -#define SYS_ALT_MFP1_PB10_GPIO NULL /*!< No ALT_MFP1 setting for PB.10 */ - -#define SYS_GPB_MFP_PB10_TM2 (1UL<<10) /*!< GPB_MFP PB.10 setting for TM2 */ -#define SYS_ALT_MFP_PB10_TM2 0x00000000UL /*!< ALT_MFP PB.10 setting for TM2 */ -#define SYS_ALT_MFP1_PB10_TM2 NULL /*!< No ALT_MFP1 setting for PB.10 */ - -#define SYS_GPB_MFP_PB10_SPI0_SS1 (1UL<<10) /*!< GPB_MFP PB.10 setting for SPI0_SS1 */ -#define SYS_ALT_MFP_PB10_SPI0_SS1 (1UL<<0) /*!< ALT_MFP PB.10 setting for SPI0_SS1 */ -#define SYS_ALT_MFP1_PB10_SPI0_SS1 NULL /*!< No ALT_MFP1 setting for PB.10 */ - -#define SYS_GPB_MFP_PB10_Msk (1UL<<10) /*!< GPB_MFP PB.10 mask */ -#define SYS_ALT_MFP_PB10_Msk (1UL<<0) /*!< ALT_MFP PB.10 mask */ -#define SYS_ALT_MFP1_PB10_Msk NULL /*!< No ALT_MFP1 PB.10 mask */ - -//PB.12 -#define SYS_GPB_MFP_PB12_GPIO 0x00000000UL /*!< GPB_MFP PB.12 setting for GPIO */ -#define SYS_ALT_MFP_PB12_GPIO 0x00000000UL /*!< ALT_MFP PB.12 setting for GPIO */ -#define SYS_ALT_MFP1_PB12_GPIO NULL /*!< No ALT_MFP1 setting for PB.12 */ - -#define SYS_GPB_MFP_PB12_SPI1_SS0 (1UL<<12) /*!< GPB_MFP PB.12 setting for SPI1_SS0 */ -#define SYS_ALT_MFP_PB12_SPI1_SS0 0x00000000UL /*!< ALT_MFP PB.12 setting for SPI1_SS0 */ -#define SYS_ALT_MFP1_PB12_SPI1_SS0 NULL /*!< No ALT_MFP1 setting for PB.12 */ - -#define SYS_GPB_MFP_PB12_CLKO (1UL<<12) /*!< GPB_MFP PB.12 setting for CLKO */ -#define SYS_ALT_MFP_PB12_CLKO (1UL<<10) /*!< ALT_MFP PB.12 setting for CLKO */ -#define SYS_ALT_MFP1_PB12_CLKO NULL /*!< No ALT_MFP1 setting for PB.12 */ - -#define SYS_GPB_MFP_PB12_Msk (1UL<<12) /*!< GPB_MFP PB.12 mask */ -#define SYS_ALT_MFP_PB12_Msk (1UL<<10) /*!< ALT_MFP PB.12 mask */ -#define SYS_ALT_MFP1_PB12_Msk NULL /*!< No ALT_MFP1 PB.12 mask */ - -//PB.13 -#define SYS_GPB_MFP_PB13_GPIO 0x00000000UL /*!< GPB_MFP PB.13 setting for GPIO */ -#define SYS_ALT_MFP_PB13_GPIO NULL /*!< No ALT_MFP setting for PB.13 */ -#define SYS_ALT_MFP1_PB13_GPIO NULL /*!< No ALT_MFP1 setting for PB.13 */ - -#define SYS_GPB_MFP_PB13_Msk (1UL<<13) /*!< GPB_MFP PB.13 mask */ -#define SYS_ALT_MFP_PB13_Msk NULL /*!< No ALT_MFP PB.13 mask */ -#define SYS_ALT_MFP1_PB13_Msk NULL /*!< No ALT_MFP1 PB.13 mask */ - -//PB.14 -#define SYS_GPB_MFP_PB14_GPIO 0x00000000UL /*!< GPB_MFP PB.14 setting for GPIO */ -#define SYS_ALT_MFP_PB14_GPIO NULL /*!< No ALT_MFP setting for PB.14 */ -#define SYS_ALT_MFP1_PB14_GPIO NULL /*!< No ALT_MFP1 setting for PB.14 */ - -#define SYS_GPB_MFP_PB14_INT0 (1UL<<14) /*!< GPB_MFP PB.14 setting for INT0 */ -#define SYS_ALT_MFP_PB14_INT0 NULL /*!< No ALT_MFP setting for PB.14 */ -#define SYS_ALT_MFP1_PB14_INT0 NULL /*!< No ALT_MFP1 setting for PB.14 */ - -#define SYS_GPB_MFP_PB14_Msk (1UL<<14) /*!< GPB_MFP PB.14 mask */ -#define SYS_ALT_MFP_PB14_Msk NULL /*!< No ALT_MFP PB.14 mask */ -#define SYS_ALT_MFP1_PB14_Msk NULL /*!< No ALT_MFP1 PB.14 mask */ - -//PB.15 -#define SYS_GPB_MFP_PB15_GPIO 0x00000000UL /*!< GPB_MFP PB.15 setting for GPIO */ -#define SYS_ALT_MFP_PB15_GPIO 0x00000000UL /*!< ALT_MFP PB.15 setting for GPIO */ -#define SYS_ALT_MFP1_PB15_GPIO NULL /*!< No ALT_MFP1 setting for PB.15 */ - -#define SYS_GPB_MFP_PB15_INT1 (1UL<<15) /*!< GPB_MFP PB.15 setting for INT1 */ -#define SYS_ALT_MFP_PB15_INT1 0x00000000UL /*!< ALT_MFP PB.15 setting for INT1 */ -#define SYS_ALT_MFP1_PB15_INT1 NULL /*!< No ALT_MFP1 setting for PB.15 */ - -#define SYS_GPB_MFP_PB15_TM0_EXT (1UL<<15) /*!< GPB_MFP PB.15 setting for TM0_EXT */ -#define SYS_ALT_MFP_PB15_TM0_EXT (1UL<<24) /*!< ALT_MFP PB.15 setting for TM0_EXT */ -#define SYS_ALT_MFP1_PB15_TM0_EXT NULL /*!< No ALT_MFP1 setting for PB.15 */ - -#define SYS_GPB_MFP_PB15_Msk (1UL<<15) /*!< GPB_MFP PB.15 mask */ -#define SYS_ALT_MFP_PB15_Msk (1UL<<24) /*!< ALT_MFP PB.15 mask */ -#define SYS_ALT_MFP1_PB15_Msk NULL /*!< No ALT_MFP1 PB.15 mask */ - -//PC.0 -#define SYS_GPC_MFP_PC0_GPIO 0x00000000UL /*!< GPB_MFP PC.0 setting for GPIO */ -#define SYS_ALT_MFP_PC0_GPIO 0x00000000UL /*!< ALT_MFP PC.0 setting for GPIO */ -#define SYS_ALT_MFP1_PC0_GPIO NULL /*!< No ALT_MFP1 setting for PC.0 */ - -#define SYS_GPC_MFP_PC0_SPI0_SS0 (1UL<<0) /*!< GPB_MFP PC.0 setting for SPI0_SS0 */ -#define SYS_ALT_MFP_PC0_SPI0_SS0 0x00000000UL /*!< ALT_MFP PC.0 setting for SPI0_SS0 */ -#define SYS_ALT_MFP1_PC0_SPI0_SS0 NULL /*!< No ALT_MFP1 setting for PC.0 */ - -#define SYS_GPC_MFP_PC0_I2S_LRCLK (1UL<<0) /*!< GPB_MFP PC.0 setting for I2S_LRCLK */ -#define SYS_ALT_MFP_PC0_I2S_LRCLK (1UL<<5) /*!< ALT_MFP PC.0 setting for I2S_LRCLK */ -#define SYS_ALT_MFP1_PC0_I2S_LRCLK NULL /*!< No ALT_MFP1 setting for PC.0 */ - -#define SYS_GPC_MFP_PC0_Msk (1UL<<0) /*!< GPC_MFP PC.0 mask */ -#define SYS_ALT_MFP_PC0_Msk (1UL<<5) /*!< ALT_MFP PC.0 mask */ -#define SYS_ALT_MFP1_PC0_Msk NULL /*!< No ALT_MFP1 PC.0 mask */ - -//PC.1 -#define SYS_GPC_MFP_PC1_GPIO 0x00000000UL /*!< GPC_MFP PC.1 setting for GPIO */ -#define SYS_ALT_MFP_PC1_GPIO 0x00000000UL /*!< ALT_MFP PC.1 setting for GPIO */ -#define SYS_ALT_MFP1_PC1_GPIO NULL /*!< No ALT_MFP1 setting for PC.1 */ - -#define SYS_GPC_MFP_PC1_SPI0_CLK (1UL<<1) /*!< GPC_MFP PC.1 setting for SPI0_CLK */ -#define SYS_ALT_MFP_PC1_SPI0_CLK 0x00000000UL /*!< ALT_MFP PC.1 setting for SPI0_CLK */ -#define SYS_ALT_MFP1_PC1_SPI0_CLK NULL /*!< No ALT_MFP1 setting for PC.1 */ - -#define SYS_GPC_MFP_PC1_I2S_BCLK (1UL<<1) /*!< GPC_MFP PC.1 setting for I2S_BCLK */ -#define SYS_ALT_MFP_PC1_I2S_BCLK (1UL<<6) /*!< ALT_MFP PC.1 setting for I2S_BCLK */ -#define SYS_ALT_MFP1_PC1_I2S_BCLK NULL /*!< No ALT_MFP1 setting for PC.1 */ - -#define SYS_GPC_MFP_PC1_Msk (1UL<<1) /*!< GPC_MFP PC.1 mask */ -#define SYS_ALT_MFP_PC1_Msk (1UL<<6) /*!< ALT_MFP PC.1 mask */ -#define SYS_ALT_MFP1_PC1_Msk NULL /*!< No ALT_MFP1 PC.1 mask */ - -//PC.2 -#define SYS_GPC_MFP_PC2_GPIO 0x00000000UL /*!< GPC_MFP PC.2 setting for GPIO */ -#define SYS_ALT_MFP_PC2_GPIO 0x00000000UL /*!< ALT_MFP PC.2 setting for GPIO */ -#define SYS_ALT_MFP1_PC2_GPIO NULL /*!< No ALT_MFP1 setting for PC.2 */ - -#define SYS_GPC_MFP_PC2_SPI0_MISO0 (1UL<<2) /*!< GPC_MFP PC.2 setting for SPI0_MISO0 */ -#define SYS_ALT_MFP_PC2_SPI0_MISO0 0x00000000UL /*!< ALT_MFP PC.2 setting for SPI0_MISO0 */ -#define SYS_ALT_MFP1_PC2_SPI0_MISO0 NULL /*!< No ALT_MFP1 setting for PC.2 */ - -#define SYS_GPC_MFP_PC2_I2S_DI (1UL<<2) /*!< GPC_MFP PC.2 setting for I2S_DI */ -#define SYS_ALT_MFP_PC2_I2S_DI (1UL<<7) /*!< ALT_MFP PC.2 setting for I2S_DI */ -#define SYS_ALT_MFP1_PC2_I2S_DI NULL /*!< No ALT_MFP1 setting for PC.2 */ - -#define SYS_GPC_MFP_PC2_Msk (1UL<<2) /*!< GPC_MFP PC.2 mask */ -#define SYS_ALT_MFP_PC2_Msk (1UL<<7) /*!< ALT_MFP PC.2 mask */ -#define SYS_ALT_MFP1_PC2_Msk NULL /*!< No ALT_MFP1 PC.2 mask */ - -//PC.3 -#define SYS_GPC_MFP_PC3_GPIO 0x00000000UL /*!< GPC_MFP PC.3 setting for GPIO */ -#define SYS_ALT_MFP_PC3_GPIO 0x00000000UL /*!< ALT_MFP PC.3 setting for GPIO */ -#define SYS_ALT_MFP1_PC3_GPIO NULL /*!< No ALT_MFP1 setting for PC.3 */ - -#define SYS_GPC_MFP_PC3_SPI0_MOSI0 (1UL<<3) /*!< GPC_MFP PC.3 setting for SPI0_MOSI0 */ -#define SYS_ALT_MFP_PC3_SPI0_MOSI0 0x00000000UL /*!< ALT_MFP PC.3 setting for SPI0_MOSI0 */ -#define SYS_ALT_MFP1_PC3_SPI0_MOSI0 NULL /*!< No ALT_MFP1 setting for PC.3 */ - -#define SYS_GPC_MFP_PC3_I2S_DO (1UL<<3) /*!< GPC_MFP PC.3 setting for I2S_DO */ -#define SYS_ALT_MFP_PC3_I2S_DO (1UL<<8) /*!< ALT_MFP PC.3 setting for I2S_DO */ -#define SYS_ALT_MFP1_PC3_I2S_DO NULL /*!< No ALT_MFP1 setting for PC.3 */ - -#define SYS_GPC_MFP_PC3_Msk (1UL<<3) /*!< GPC_MFP PC.3 mask */ -#define SYS_ALT_MFP_PC3_Msk (1UL<<8) /*!< ALT_MFP PC.3 mask */ -#define SYS_ALT_MFP1_PC3_Msk NULL /*!< No ALT_MFP1 PC.3 mask */ - -//PC.4 -#define SYS_GPC_MFP_PC4_GPIO 0x00000000UL /*!< GPC_MFP PC.4 setting for GPIO */ -#define SYS_ALT_MFP_PC4_GPIO 0x00000000UL /*!< ALT_MFP PC.4 setting for GPIO */ -#define SYS_ALT_MFP1_PC4_GPIO NULL /*!< No ALT_MFP1 setting for PC.4 */ - -#define SYS_GPC_MFP_PC4_SPI0_MISO1 (1UL<<4) /*!< GPC_MFP PC.4 setting for SPI0_MISO1 */ -#define SYS_ALT_MFP_PC4_SPI0_MISO1 0x00000000UL /*!< ALT_MFP PC.4 setting for SPI0_MISO1 */ -#define SYS_ALT_MFP1_PC4_SPI0_MISO1 NULL /*!< No ALT_MFP1 setting for PC.4 */ - -#define SYS_GPC_MFP_PC4_UART0_RXD (1UL<<4) /*!< GPC_MFP PC.4 setting for UART0_RXD */ -#define SYS_ALT_MFP_PC4_UART0_RXD (1UL<<29) /*!< ALT_MFP PC.4 setting for UART0_RXD */ -#define SYS_ALT_MFP1_PC4_UART0_RXD NULL /*!< No ALT_MFP1 setting for PC.4 */ - -#define SYS_GPC_MFP_PC4_Msk (1UL<<4) /*!< GPC_MFP PC.4 mask */ -#define SYS_ALT_MFP_PC4_Msk (1UL<<29) /*!< ALT_MFP PC.4 mask */ -#define SYS_ALT_MFP1_PC4_Msk NULL /*!< No ALT_MFP1 PC.4 mask */ - -//PC.5 -#define SYS_GPC_MFP_PC5_GPIO 0x00000000UL /*!< GPC_MFP PC.5 setting for GPIO */ -#define SYS_ALT_MFP_PC5_GPIO 0x00000000UL /*!< ALT_MFP PC.5 setting for GPIO */ -#define SYS_ALT_MFP1_PC5_GPIO NULL /*!< No ALT_MFP1 setting for PC.5 */ - -#define SYS_GPC_MFP_PC5_SPI0_MOSI1 (1UL<<5) /*!< GPC_MFP PC.5 setting for SPI0_MOSI1 */ -#define SYS_ALT_MFP_PC5_SPI0_MOSI1 0x00000000UL /*!< ALT_MFP PC.5 setting for SPI0_MOSI1 */ -#define SYS_ALT_MFP1_PC5_SPI0_MOSI1 NULL /*!< No ALT_MFP1 setting for PC.5 */ - -#define SYS_GPC_MFP_PC5_UART0_TXD (1UL<<5) /*!< GPC_MFP PC.5 setting for UART0_TXD */ -#define SYS_ALT_MFP_PC5_UART0_TXD (1UL<<30) /*!< ALT_MFP PC.5 setting for UART0_TXD */ -#define SYS_ALT_MFP1_PC5_UART0_TXD NULL /*!< No ALT_MFP1 setting for PC.5 */ - -#define SYS_GPC_MFP_PC5_Msk (1UL<<5) /*!< GPC_MFP PC.5 mask */ -#define SYS_ALT_MFP_PC5_Msk (1UL<<30) /*!< ALT_MFP PC.5 mask */ -#define SYS_ALT_MFP1_PC5_Msk NULL /*!< No ALT_MFP1 PC.5 mask */ - -//PC.8 -#define SYS_GPC_MFP_PC8_GPIO 0x00000000UL /*!< GPC_MFP PC.8 setting for GPIO */ -#define SYS_ALT_MFP_PC8_GPIO NULL /*!< No ALT_MFP setting for PC.8 */ -#define SYS_ALT_MFP1_PC8_GPIO 0x00000000UL /*!< ALT_MFP1 PC.8 setting for GPIO */ - -#define SYS_GPC_MFP_PC8_SPI1_SS0 (1UL<<8) /*!< GPC_MFP PC.8 setting for SPI1_SS0 */ -#define SYS_ALT_MFP_PC8_SPI1_SS0 NULL /*!< No ALT_MFP setting for PC.8 */ -#define SYS_ALT_MFP1_PC8_SPI1_SS0 0x00000000UL /*!< ALT_MFP1 PC.8 setting for SPI1_SS0 */ - -#define SYS_GPC_MFP_PC8_PWM0 (1UL<<8) /*!< GPC_MFP PC.8 setting for PWM0 (NUC123xxxAEx only) */ -#define SYS_ALT_MFP_PC8_PWM0 NULL /*!< No ALT_MFP setting for PC.8 */ -#define SYS_ALT_MFP1_PC8_PWM0 (1UL<<23) /*!< ALT_MFP1 PC.8 setting for PWM0 (NUC123xxxAEx only) */ - -#define SYS_GPC_MFP_PC8_Msk (1UL<<8) /*!< GPC_MFP PC.8 mask */ -#define SYS_ALT_MFP_PC8_Msk NULL /*!< No ALT_MFP PC.8 mask */ -#define SYS_ALT_MFP1_PC8_Msk (1UL<<23) /*!< ALT_MFP1 PC.8 mask */ - -//PC.9 -#define SYS_GPC_MFP_PC9_GPIO 0x00000000UL /*!< GPC_MFP PC.9 setting for GPIO */ -#define SYS_ALT_MFP_PC9_GPIO NULL /*!< No ALT_MFP setting for PC.9 */ -#define SYS_ALT_MFP1_PC9_GPIO NULL /*!< No ALT_MFP1 setting for PC.9 */ - -#define SYS_GPC_MFP_PC9_SPI1_CLK (1UL<<9) /*!< GPC_MFP PC.9 setting for SPI1_CLK */ -#define SYS_ALT_MFP_PC9_SPI1_CLK NULL /*!< No ALT_MFP setting for PC.9 */ -#define SYS_ALT_MFP1_PC9_SPI1_CLK NULL /*!< No ALT_MFP1 setting for PC.9 */ - -#define SYS_GPC_MFP_PC9_Msk (1UL<<9) /*!< GPC_MFP PC.9 mask */ -#define SYS_ALT_MFP_PC9_Msk NULL /*!< No ALT_MFP PC.9 mask */ -#define SYS_ALT_MFP1_PC9_Msk NULL /*!< No ALT_MFP1 PC.9 mask */ - -//PC.10 -#define SYS_GPC_MFP_PC10_GPIO 0x00000000UL /*!< GPC_MFP PC.10 setting for GPIO */ -#define SYS_ALT_MFP_PC10_GPIO NULL /*!< No ALT_MFP setting for PC.10 */ -#define SYS_ALT_MFP1_PC10_GPIO NULL /*!< No ALT_MFP1 setting for PC.10 */ - -#define SYS_GPC_MFP_PC10_SPI1_MISO0 (1UL<<10) /*!< GPC_MFP PC.10 setting for SPI1_MISO0 */ -#define SYS_ALT_MFP_PC10_SPI1_MISO0 NULL /*!< No ALT_MFP setting for PC.10 */ -#define SYS_ALT_MFP1_PC10_SPI1_MISO0 NULL /*!< No ALT_MFP1 setting for PC.10 */ - -#define SYS_GPC_MFP_PC10_Msk (1UL<<10) /*!< GPC_MFP PC.10 mask */ -#define SYS_ALT_MFP_PC10_Msk NULL /*!< No ALT_MFP PC.10 mask */ -#define SYS_ALT_MFP1_PC10_Msk NULL /*!< No ALT_MFP1 PC.10 mask */ - -//PC.11 -#define SYS_GPC_MFP_PC11_GPIO 0x00000000UL /*!< GPC_MFP PC.11 setting for GPIO */ -#define SYS_ALT_MFP_PC11_GPIO NULL /*!< No ALT_MFP setting for PC.11 */ -#define SYS_ALT_MFP1_PC11_GPIO NULL /*!< No ALT_MFP1 setting for PC.11 */ - -#define SYS_GPC_MFP_PC11_SPI1_MOSI0 (1UL<<11) /*!< GPC_MFP PC.11 setting for SPI1_MOSI0 */ -#define SYS_ALT_MFP_PC11_SPI1_MOSI0 NULL /*!< No ALT_MFP setting for PC.11 */ -#define SYS_ALT_MFP1_PC11_SPI1_MOSI0 NULL /*!< No ALT_MFP1 setting for PC.11 */ - -#define SYS_GPC_MFP_PC11_Msk (1UL<<11) /*!< GPC_MFP PC.11 mask */ -#define SYS_ALT_MFP_PC11_Msk NULL /*!< No ALT_MFP PC.11 mask */ -#define SYS_ALT_MFP1_PC11_Msk NULL /*!< No ALT_MFP1 PC.11 mask */ - -//PC.12 -#define SYS_GPC_MFP_PC12_GPIO 0x00000000UL /*!< GPC_MFP PC.12 setting for GPIO */ -#define SYS_ALT_MFP_PC12_GPIO 0x00000000UL /*!< ALT_MFP PC.12 setting for GPIO */ -#define SYS_ALT_MFP1_PC12_GPIO NULL /*!< No ALT_MFP1 setting for PC.12 */ - -#define SYS_GPC_MFP_PC12_SPI1_MISO1 (1UL<<12) /*!< GPC_MFP PC.12 setting for SPI1_MISO1 */ -#define SYS_ALT_MFP_PC12_SPI1_MISO1 0x00000000UL /*!< ALT_MFP PC.12 setting for SPI1_MISO1 */ -#define SYS_ALT_MFP1_PC12_SPI1_MISO1 NULL /*!< No ALT_MFP1 setting for PC.12 */ - -#define SYS_GPC_MFP_PC12_I2S_MCLK 0x00000000UL /*!< GPC_MFP PC.12 setting for I2S_MCLK */ -#define SYS_ALT_MFP_PC12_I2S_MCLK (1UL<<20) /*!< ALT_MFP PC.12 setting for I2S_MCLK */ -#define SYS_ALT_MFP1_PC12_I2S_MCLK NULL /*!< No ALT_MFP1 setting for PC.12 */ - -#define SYS_GPC_MFP_PC12_PWM2 (1UL<<12) /*!< GPC_MFP PC.12 setting for PWM2 */ -#define SYS_ALT_MFP_PC12_PWM2 (1UL<<20) /*!< ALT_MFP PC.12 setting for PWM2 */ -#define SYS_ALT_MFP1_PC12_PWM2 NULL /*!< No ALT_MFP1 setting for PC.12 */ - -#define SYS_GPC_MFP_PC12_Msk (1UL<<12) /*!< GPC_MFP PC.12 mask */ -#define SYS_ALT_MFP_PC12_Msk (1UL<<20) /*!< ALT_MFP PC.12 mask */ -#define SYS_ALT_MFP1_PC12_Msk NULL /*!< No ALT_MFP1 PC.12 mask */ - -//PC.13 -#define SYS_GPC_MFP_PC13_GPIO 0x00000000UL /*!< GPC_MFP PC.13 setting for GPIO */ -#define SYS_ALT_MFP_PC13_GPIO 0x00000000UL /*!< ALT_MFP PC.13 setting for GPIO */ -#define SYS_ALT_MFP1_PC13_GPIO NULL /*!< No ALT_MFP1 setting for PC.13 */ - -#define SYS_GPC_MFP_PC13_SPI1_MOSI1 (1UL<<13) /*!< GPC_MFP PC.13 setting for SPI1_MOSI1 */ -#define SYS_ALT_MFP_PC13_SPI1_MOSI1 0x00000000UL /*!< ALT_MFP PC.13 setting for SPI1_MOSI1 */ -#define SYS_ALT_MFP1_PC13_SPI1_MOSI1 NULL /*!< No ALT_MFP1 setting for PC.13 */ - -#define SYS_GPC_MFP_PC13_CLKO 0x00000000UL /*!< GPC_MFP PC.13 setting for CLKO */ -#define SYS_ALT_MFP_PC13_CLKO (1UL<<21) /*!< ALT_MFP PC.13 setting for CLKO */ -#define SYS_ALT_MFP1_PC13_CLKO NULL /*!< No ALT_MFP1 setting for PC.13 */ - -#define SYS_GPC_MFP_PC13_PWM3 (1UL<<13) /*!< GPC_MFP PC.13 setting for PWM3 */ -#define SYS_ALT_MFP_PC13_PWM3 (1UL<<21) /*!< ALT_MFP PC.13 setting for PWM3 */ -#define SYS_ALT_MFP1_PC13_PWM3 NULL /*!< No ALT_MFP1 setting for PC.13 */ - -#define SYS_GPC_MFP_PC13_Msk (1UL<<13) /*!< GPC_MFP PC.13 mask */ -#define SYS_ALT_MFP_PC13_Msk (1UL<<21) /*!< ALT_MFP PC.13 mask */ -#define SYS_ALT_MFP1_PC13_Msk NULL /*!< No ALT_MFP1 PC.13 mask */ - -//PD.0 -#define SYS_GPD_MFP_PD0_GPIO 0x00000000UL /*!< GPD_MFP PD.0 setting for GPIO */ -#define SYS_ALT_MFP_PD0_GPIO NULL /*!< No ALT_MFP setting for PD.0 */ -#define SYS_ALT_MFP1_PD0_GPIO 0x00000000UL /*!< ALT_MFP1 PD.0 setting for GPIO */ - -#define SYS_GPD_MFP_PD0_SPI2_SS0 0x00000000UL /*!< GPD_MFP PD.0 setting for SPI2_SS0 */ -#define SYS_ALT_MFP_PD0_SPI2_SS0 NULL /*!< No ALT_MFP setting for PD.0 */ -#define SYS_ALT_MFP1_PD0_SPI2_SS0 (1UL<<16) /*!< ALT_MFP1 PD.0 setting for SPI2_SS0 */ - -#define SYS_GPD_MFP_PD0_ADC0 (1UL<<0) /*!< GPD_MFP PD.0 setting for ADC0 */ -#define SYS_ALT_MFP_PD0_ADC0 NULL /*!< No ALT_MFP setting for PD.0 */ -#define SYS_ALT_MFP1_PD0_ADC0 (1UL<<16) /*!< ALT_MFP1 PD.0 setting for ADC0 */ - -#define SYS_GPD_MFP_PD0_Msk (1UL<<0) /*!< GPD_MFP PD.0 mask */ -#define SYS_ALT_MFP_PD0_Msk NULL /*!< No ALT_MFP PD.0 mask */ -#define SYS_ALT_MFP1_PD0_Msk (1UL<<16) /*!< ALT_MFP1 PD.0 mask */ - -//PD.1 -#define SYS_GPD_MFP_PD1_GPIO 0x00000000UL /*!< GPD_MFP PD.1 setting for GPIO */ -#define SYS_ALT_MFP_PD1_GPIO NULL /*!< No ALT_MFP setting for PD.1 */ -#define SYS_ALT_MFP1_PD1_GPIO 0x00000000UL /*!< ALT_MFP1 PD.1 setting for GPIO */ - -#define SYS_GPD_MFP_PD1_SPI0_SS1 (1UL<<1) /*!< GPD_MFP PD.1 setting for SPI0_SS1 */ -#define SYS_ALT_MFP_PD1_SPI0_SS1 NULL /*!< No ALT_MFP setting for PD.1 */ -#define SYS_ALT_MFP1_PD1_SPI0_SS1 0x00000000UL /*!< ALT_MFP1 PD.1 setting for SPI0_SS1 */ - -#define SYS_GPD_MFP_PD1_SPI2_CLK 0x00000000UL /*!< GPD_MFP PD.1 setting for SPI2_CLK */ -#define SYS_ALT_MFP_PD1_SPI2_CLK NULL /*!< No ALT_MFP setting for PD.1 */ -#define SYS_ALT_MFP1_PD1_SPI2_CLK (1UL<<17) /*!< ALT_MFP1 PD.1 setting for SPI2_CLK */ - -#define SYS_GPD_MFP_PD1_ADC1 (1UL<<1) /*!< GPD_MFP PD.1 setting for ADC1 */ -#define SYS_ALT_MFP_PD1_ADC1 NULL /*!< No ALT_MFP setting for PD.1 */ -#define SYS_ALT_MFP1_PD1_ADC1 (1UL<<17) /*!< ALT_MFP1 PD.1 setting for ADC1 */ - -#define SYS_GPD_MFP_PD1_Msk (1UL<<1) /*!< GPD_MFP PD.1 mask */ -#define SYS_ALT_MFP_PD1_Msk NULL /*!< No ALT_MFP PD.1 mask */ -#define SYS_ALT_MFP1_PD1_Msk (1UL<<17) /*!< ALT_MFP1 PD.1 mask */ - -//PD.2 -#define SYS_GPD_MFP_PD2_GPIO 0x00000000UL /*!< GPD_MFP PD.2 setting for GPIO */ -#define SYS_ALT_MFP_PD2_GPIO NULL /*!< No ALT_MFP setting for PD.2 */ -#define SYS_ALT_MFP1_PD2_GPIO 0x00000000UL /*!< ALT_MFP1 PD.2 setting for GPIO */ - -#define SYS_GPD_MFP_PD2_SPI0_MISO1 (1UL<<2) /*!< GPD_MFP PD.2 setting for SPI0_MISO1 */ -#define SYS_ALT_MFP_PD2_SPI0_MISO1 NULL /*!< No ALT_MFP setting for PD.2 */ -#define SYS_ALT_MFP1_PD2_SPI0_MISO1 0x00000000UL /*!< ALT_MFP1 PD.2 setting for SPI0_MISO1 */ - -#define SYS_GPD_MFP_PD2_SPI2_MISO0 0x00000000UL /*!< GPD_MFP PD.2 setting for SPI2_MISO0 */ -#define SYS_ALT_MFP_PD2_SPI2_MISO0 NULL /*!< No ALT_MFP setting for PD.2 */ -#define SYS_ALT_MFP1_PD2_SPI2_MISO0 (1UL<<18) /*!< ALT_MFP1 PD.2 setting for SPI2_MISO0 */ - -#define SYS_GPD_MFP_PD2_ADC2 (1UL<<2) /*!< GPD_MFP PD.2 setting for ADC2 */ -#define SYS_ALT_MFP_PD2_ADC2 NULL /*!< No ALT_MFP setting for PD.2 */ -#define SYS_ALT_MFP1_PD2_ADC2 (1UL<<18) /*!< ALT_MFP1 PD.2 setting for ADC2 */ - -#define SYS_GPD_MFP_PD2_Msk (1UL<<2) /*!< GPD_MFP PD.2 mask */ -#define SYS_ALT_MFP_PD2_Msk NULL /*!< No ALT_MFP PD.2 mask */ -#define SYS_ALT_MFP1_PD2_Msk (1UL<<18) /*!< ALT_MFP1 PD.2 mask */ - -//PD.3 -#define SYS_GPD_MFP_PD3_GPIO 0x00000000UL /*!< GPD_MFP PD.3 setting for GPIO */ -#define SYS_ALT_MFP_PD3_GPIO NULL /*!< No ALT_MFP setting for PD.3 */ -#define SYS_ALT_MFP1_PD3_GPIO 0x00000000UL /*!< ALT_MFP1 PD.3 setting for GPIO */ - -#define SYS_GPD_MFP_PD3_SPI0_MOSI1 (1UL<<3) /*!< GPD_MFP PD.3 setting for SPI0_MOSI1 */ -#define SYS_ALT_MFP_PD3_SPI0_MOSI1 NULL /*!< No ALT_MFP setting for PD.3 */ -#define SYS_ALT_MFP1_PD3_SPI0_MOSI1 0x00000000UL /*!< ALT_MFP1 PD.3 setting for SPI0_MOSI1 */ - -#define SYS_GPD_MFP_PD3_SPI2_MOSI0 0x00000000UL /*!< GPD_MFP PD.3 setting for SPI2_MOSI0 */ -#define SYS_ALT_MFP_PD3_SPI2_MOSI0 NULL /*!< No ALT_MFP setting for PD.3 */ -#define SYS_ALT_MFP1_PD3_SPI2_MOSI0 (1UL<<19) /*!< ALT_MFP1 PD.3 setting for SPI2_MOSI0 */ - -#define SYS_GPD_MFP_PD3_ADC3 (1UL<<3) /*!< GPD_MFP PD.3 setting for ADC3 */ -#define SYS_ALT_MFP_PD3_ADC3 NULL /*!< No ALT_MFP setting for PD.3 */ -#define SYS_ALT_MFP1_PD3_ADC3 (1UL<<19) /*!< ALT_MFP1 PD.3 setting for ADC3 */ - -#define SYS_GPD_MFP_PD3_Msk (1UL<<3) /*!< GPD_MFP PD.3 mask */ -#define SYS_ALT_MFP_PD3_Msk NULL /*!< No ALT_MFP PD.3 mask */ -#define SYS_ALT_MFP1_PD3_Msk (1UL<<19) /*!< ALT_MFP1 PD.3 mask */ - -//PD.4 -#define SYS_GPD_MFP_PD4_GPIO 0x00000000UL /*!< GPD_MFP PD.4 setting for GPIO */ -#define SYS_ALT_MFP_PD4_GPIO NULL /*!< No ALT_MFP setting for PD.4 */ -#define SYS_ALT_MFP1_PD4_GPIO 0x00000000UL /*!< ALT_MFP1 PD.4 setting for GPIO */ - -#define SYS_GPD_MFP_PD4_SPI2_MISO1 0x00000000UL /*!< GPD_MFP PD.4 setting for SPI2_MISO1 */ -#define SYS_ALT_MFP_PD4_SPI2_MISO1 NULL /*!< No ALT_MFP setting for PD.4 */ -#define SYS_ALT_MFP1_PD4_SPI2_MISO1 (1UL<<20) /*!< ALT_MFP1 PD.4 setting for SPI2_MISO1 */ - -#define SYS_GPD_MFP_PD4_ADC4 (1UL<<4) /*!< GPD_MFP PD.4 setting for ADC4 */ -#define SYS_ALT_MFP_PD4_ADC4 NULL /*!< No ALT_MFP setting for PD.4 */ -#define SYS_ALT_MFP1_PD4_ADC4 (1UL<<20) /*!< ALT_MFP1 PD.4 setting for ADC4 */ - -#define SYS_GPD_MFP_PD4_Msk (1UL<<4) /*!< GPD_MFP PD.4 mask */ -#define SYS_ALT_MFP_PD4_Msk NULL /*!< No ALT_MFP PD.4 mask */ -#define SYS_ALT_MFP1_PD4_Msk (1UL<<20) /*!< ALT_MFP1 PD.4 mask */ - -//PD.5 -#define SYS_GPD_MFP_PD5_GPIO 0x00000000UL /*!< GPD_MFP PD.5 setting for GPIO */ -#define SYS_ALT_MFP_PD5_GPIO NULL /*!< No ALT_MFP setting for PD.5 */ -#define SYS_ALT_MFP1_PD5_GPIO 0x00000000UL /*!< ALT_MFP1 PD.5 setting for GPIO */ - -#define SYS_GPD_MFP_PD5_SPI2_MOSI1 0x00000000UL /*!< GPD_MFP PD.5 setting for SPI2_MOSI1 */ -#define SYS_ALT_MFP_PD5_SPI2_MOSI1 NULL /*!< No ALT_MFP setting for PD.5 */ -#define SYS_ALT_MFP1_PD5_SPI2_MOSI1 (1UL<<21) /*!< ALT_MFP1 PD.5 setting for SPI2_MOSI1 */ - -#define SYS_GPD_MFP_PD5_ADC5 (1UL<<5) /*!< GPD_MFP PD.5 setting for ADC5 */ -#define SYS_ALT_MFP_PD5_ADC5 NULL /*!< No ALT_MFP setting for PD.5 */ -#define SYS_ALT_MFP1_PD5_ADC5 (1UL<<21) /*!< ALT_MFP1 PD.5 setting for ADC5 */ - -#define SYS_GPD_MFP_PD5_Msk (1UL<<5) /*!< GPD_MFP PD.5 mask */ -#define SYS_ALT_MFP_PD5_Msk NULL /*!< No ALT_MFP PD.5 mask */ -#define SYS_ALT_MFP1_PD5_Msk (1UL<<21) /*!< ALT_MFP1 PD.5 mask */ - -//PD.8 -#define SYS_GPD_MFP_PD8_GPIO 0x00000000UL /*!< GPD_MFP PD.8 setting for GPIO */ -#define SYS_ALT_MFP_PD8_GPIO NULL /*!< No ALT_MFP setting for PD.8 */ -#define SYS_ALT_MFP1_PD8_GPIO NULL /*!< No ALT_MFP1 setting for PD.8 */ - -#define SYS_GPD_MFP_PD8_SPI1_MOSI0 (1UL<<8) /*!< GPD_MFP PD.8 setting for SPI1_MOSI0 */ -#define SYS_ALT_MFP_PD8_SPI1_MOSI0 NULL /*!< No ALT_MFP setting for PD.8 */ -#define SYS_ALT_MFP1_PD8_SPI1_MOSI0 NULL /*!< No ALT_MFP1 setting for PD.8 */ - -#define SYS_GPD_MFP_PD8_Msk (1UL<<8) /*!< GPD_MFP PD.8 mask */ -#define SYS_ALT_MFP_PD8_Msk NULL /*!< No ALT_MFP PD.8 mask */ -#define SYS_ALT_MFP1_PD8_Msk NULL /*!< No ALT_MFP1 PD.8 mask */ - -//PD.9 -#define SYS_GPD_MFP_PD9_GPIO 0x00000000UL /*!< GPD_MFP PD.9 setting for GPIO */ -#define SYS_ALT_MFP_PD9_GPIO NULL /*!< No ALT_MFP setting for PD.9 */ -#define SYS_ALT_MFP1_PD9_GPIO NULL /*!< No ALT_MFP1 setting for PD.9 */ - -#define SYS_GPD_MFP_PD9_Msk (1UL<<9) /*!< GPD_MFP PD.9 mask */ -#define SYS_ALT_MFP_PD9_Msk NULL /*!< No ALT_MFP PD.9 mask */ -#define SYS_ALT_MFP1_PD9_Msk NULL /*!< No ALT_MFP1 PD.9 mask */ - -//PD.10 -#define SYS_GPD_MFP_PD10_GPIO 0x00000000UL /*!< GPD_MFP PD.10 setting for GPIO */ -#define SYS_ALT_MFP_PD10_GPIO NULL /*!< No ALT_MFP setting for PD.10 */ -#define SYS_ALT_MFP1_PD10_GPIO NULL /*!< No ALT_MFP1 setting for PD.10 */ - -#define SYS_GPD_MFP_PD10_CLKO (1UL<<10) /*!< GPD_MFP PD.10 setting for CLKO */ -#define SYS_ALT_MFP_PD10_CLKO NULL /*!< No ALT_MFP setting for PD.10 */ -#define SYS_ALT_MFP1_PD10_CLKO NULL /*!< No ALT_MFP1 setting for PD.10 */ - -#define SYS_GPD_MFP_PD10_Msk (1UL<<10) /*!< GPD_MFP PD.10 mask */ -#define SYS_ALT_MFP_PD10_Msk NULL /*!< No ALT_MFP PD.10 mask */ -#define SYS_ALT_MFP1_PD10_Msk NULL /*!< No ALT_MFP1 PD.10 mask */ - -//PD.11 -#define SYS_GPD_MFP_PD11_GPIO 0x00000000UL /*!< GPD_MFP PD.11 setting for GPIO */ -#define SYS_ALT_MFP_PD11_GPIO NULL /*!< No ALT_MFP setting for PD.11 */ -#define SYS_ALT_MFP1_PD11_GPIO NULL /*!< No ALT_MFP1 setting for PD.11 */ - -#define SYS_GPD_MFP_PD11_INT1 (1UL<<11) /*!< GPD_MFP PD.11 setting for INT1 */ -#define SYS_ALT_MFP_PD11_INT1 NULL /*!< No ALT_MFP setting for PD.11 */ -#define SYS_ALT_MFP1_PD11_INT1 NULL /*!< No ALT_MFP1 setting for PD.11 */ - -#define SYS_GPD_MFP_PD11_Msk (1UL<<11) /*!< GPD_MFP PD.11 mask */ -#define SYS_ALT_MFP_PD11_Msk NULL /*!< No ALT_MFP PD.11 mask */ -#define SYS_ALT_MFP1_PD11_Msk NULL /*!< No ALT_MFP1 PD.11 mask */ - -//PF.0 -#define SYS_GPF_MFP_PF0_GPIO 0x00000000UL /*!< GPF_MFP PF.0 setting for GPIO */ -#define SYS_ALT_MFP_PF0_GPIO NULL /*!< No ALT_MFP setting for PF.0 */ -#define SYS_ALT_MFP1_PF0_GPIO NULL /*!< No ALT_MFP1 setting for PF.0 */ - -#define SYS_GPF_MFP_PF0_XT1_OUT (1UL<<0) /*!< GPF_MFP PF.0 setting for XT1_OUT */ -#define SYS_ALT_MFP_PF0_XT1_OUT NULL /*!< No ALT_MFP setting for PF.0 */ -#define SYS_ALT_MFP1_PF0_XT1_OUT NULL /*!< No ALT_MFP1 setting for PF.0 */ - -#define SYS_GPF_MFP_PF0_Msk (1UL<<0) /*!< GPF_MFP PF.0 mask */ -#define SYS_ALT_MFP_PF0_Msk NULL /*!< No ALT_MFP PF.0 mask */ -#define SYS_ALT_MFP1_PF0_Msk NULL /*!< No ALT_MFP1 PF.0 mask */ - -//PF.1 -#define SYS_GPF_MFP_PF1_GPIO 0x00000000UL /*!< GPF_MFP PF.1 setting for GPIO */ -#define SYS_ALT_MFP_PF1_GPIO NULL /*!< No ALT_MFP setting for PF.1 */ -#define SYS_ALT_MFP1_PF1_GPIO NULL /*!< No ALT_MFP1 setting for PF.1 */ - -#define SYS_GPF_MFP_PF1_XT1_IN (1UL<<1) /*!< GPF_MFP PF.1 setting for XT1_IN */ -#define SYS_ALT_MFP_PF1_XT1_IN NULL /*!< No ALT_MFP setting for PF.1 */ -#define SYS_ALT_MFP1_PF1_XT1_IN NULL /*!< No ALT_MFP1 setting for PF.1 */ - -#define SYS_GPF_MFP_PF1_Msk (1UL<<1) /*!< GPF_MFP PF.1 mask */ -#define SYS_ALT_MFP_PF1_Msk NULL /*!< No ALT_MFP PF.1 mask */ -#define SYS_ALT_MFP1_PF1_Msk NULL /*!< No ALT_MFP1 PF.1 mask */ - -//PF.2 -#define SYS_GPF_MFP_PF2_GPIO 0x00000000UL /*!< GPF_MFP PF.2 setting for GPIO */ -#define SYS_ALT_MFP_PF2_GPIO NULL /*!< No ALT_MFP setting for PF.2 */ -#define SYS_ALT_MFP1_PF2_GPIO 0x00000000UL /*!< ALT_MFP1 PF.2 setting for GPIO */ - -#define SYS_GPF_MFP_PF2_PS2_DAT (1UL<<2) /*!< GPF_MFP PF.2 setting for PS2_DAT */ -#define SYS_ALT_MFP_PF2_PS2_DAT NULL /*!< No ALT_MFP setting for PF.2 */ -#define SYS_ALT_MFP1_PF2_PS2_DAT 0x00000000UL /*!< ALT_MFP1 PF.2 setting for PS2_DAT */ - -#define SYS_GPF_MFP_PF2_I2C0_SDA (1UL<<2) /*!< GPF_MFP PF.2 setting for I2C0_SDA */ -#define SYS_ALT_MFP_PF2_I2C0_SDA NULL /*!< No ALT_MFP setting for PF.2 */ -#define SYS_ALT_MFP1_PF2_I2C0_SDA (0x2UL<<24) /*!< ALT_MFP1 PF.2 setting for I2C0_SDA */ - -#define SYS_GPF_MFP_PF2_ADC6 (1UL<<2) /*!< GPF_MFP PF.2 setting for ADC6 */ -#define SYS_ALT_MFP_PF2_ADC6 NULL /*!< No ALT_MFP setting for PF.2 */ -#define SYS_ALT_MFP1_PF2_ADC6 (0x3UL<<24) /*!< ALT_MFP1 PF.2 setting for ADC6 */ - -#define SYS_GPF_MFP_PF2_Msk (1UL<<2) /*!< GPF_MFP PF.2 mask */ -#define SYS_ALT_MFP_PF2_Msk NULL /*!< No ALT_MFP PF.2 mask */ -#define SYS_ALT_MFP1_PF2_Msk (0x3UL<<24) /*!< ALT_MFP1 PF.2 mask */ - -//PF.3 -#define SYS_GPF_MFP_PF3_GPIO 0x00000000UL /*!< GPF_MFP PF.3 setting for GPIO */ -#define SYS_ALT_MFP_PF3_GPIO NULL /*!< No ALT_MFP setting for PF.3 */ -#define SYS_ALT_MFP1_PF3_GPIO 0x00000000UL /*!< ALT_MFP1 PF.3 setting for GPIO */ - -#define SYS_GPF_MFP_PF3_PS2_CLK (1UL<<3) /*!< GPF_MFP PF.3 setting for PS2_CLK */ -#define SYS_ALT_MFP_PF3_PS2_CLK NULL /*!< No ALT_MFP setting for PF.3 */ -#define SYS_ALT_MFP1_PF3_PS2_CLK 0x00000000UL /*!< ALT_MFP1 PF.3 setting for PS2_CLK */ - -#define SYS_GPF_MFP_PF3_I2C0_SCL (1UL<<3) /*!< GPF_MFP PF.3 setting for I2C0_SCL */ -#define SYS_ALT_MFP_PF3_I2C0_SCL NULL /*!< No ALT_MFP setting for PF.3 */ -#define SYS_ALT_MFP1_PF3_I2C0_SCL (0x2UL<<26) /*!< ALT_MFP1 PF.3 setting for I2C0_SCL */ - -#define SYS_GPF_MFP_PF3_ADC7 (1UL<<3) /*!< GPF_MFP PF.3 setting for ADC7 */ -#define SYS_ALT_MFP_PF3_ADC7 NULL /*!< No ALT_MFP setting for PF.3 */ -#define SYS_ALT_MFP1_PF3_ADC7 (0x3UL<<26) /*!< ALT_MFP1 PF.3 setting for ADC7 */ - -#define SYS_GPF_MFP_PF3_Msk (1UL<<3) /*!< GPF_MFP PF.3 mask */ -#define SYS_ALT_MFP_PF3_Msk NULL /*!< No ALT_MFP PF.3 mask */ -#define SYS_ALT_MFP1_PF3_Msk (0x3UL<<26) /*!< ALT_MFP1 PF.3 mask */ - - -/*---------------------------------------------------------------------------------------------------------*/ -/* New Multi-Function constant definitions. (NUC123xxxAEx only) */ -/*---------------------------------------------------------------------------------------------------------*/ - -/* How to use below #define? -Example: If user want to set PA.10 as I2C1_SDA and PA.11 as I2C1_SCL in initial function, - user can issue following command to achieve it. - - SYS->GPA_MFPH &= ~(SYS_GPA_MFPH_GPA10_MFP_Msk | SYS_GPA_MFPH_GPA11_MFP_Msk); - SYS->GPA_MFPH |= (SYS_GPA_MFPH_GPA10_MFP_I2C1_SDA | SYS_GPA_MFPH_GPA11_MFP_I2C1_SCL); -*/ - -//GPA10_MFP -#define SYS_GPA_MFPH_GPA10_MFP_GPIO (0x0UL<BODCR |= SYS_BODCR_BOD_INTF_Msk) - -/** - * @brief Set Brown-out detector function to normal mode - * @param None - * @return None - * @details This macro set Brown-out detector to normal mode. - * The register write-protection function should be disabled before using this macro. - */ -#define SYS_CLEAR_BOD_LPM() (SYS->BODCR &= ~SYS_BODCR_BOD_LPM_Msk) - -/** - * @brief Disable Brown-out detector function - * @param None - * @return None - * @details This macro disable Brown-out detector function. - * The register write-protection function should be disabled before using this macro. - */ -#define SYS_DISABLE_BOD() (SYS->BODCR &= ~SYS_BODCR_BOD_EN_Msk) - -/** - * @brief Enable Brown-out detector function - * @param None - * @return None - * @details This macro enable Brown-out detector function. - * The register write-protection function should be disabled before using this macro. - */ -#define SYS_ENABLE_BOD() (SYS->BODCR |= SYS_BODCR_BOD_EN_Msk) - -/** - * @brief Get Brown-out detector interrupt flag - * @param None - * @retval 0 Brown-out detect interrupt flag is not set. - * @retval >=1 Brown-out detect interrupt flag is set. - * @details This macro get Brown-out detector interrupt flag. - */ -#define SYS_GET_BOD_INT_FLAG() (SYS->BODCR & SYS_BODCR_BOD_INTF_Msk) - -/** - * @brief Get Brown-out detector status - * @param None - * @retval 0 System voltage is higher than BOD threshold voltage setting or BOD function is disabled. - * @retval >=1 System voltage is lower than BOD threshold voltage setting. - * @details This macro get Brown-out detector output status. - * If the BOD function is disabled, this function always return 0. - */ -#define SYS_GET_BOD_OUTPUT() (SYS->BODCR & SYS_BODCR_BOD_OUT_Msk) - -/** - * @brief Enable Brown-out detector interrupt function - * @param None - * @return None - * @details This macro enable Brown-out detector interrupt function. - * The register write-protection function should be disabled before using this macro. - */ -#define SYS_DISABLE_BOD_RST() (SYS->BODCR &= ~SYS_BODCR_BOD_RSTEN_Msk) - -/** - * @brief Enable Brown-out detector reset function - * @param None - * @return None - * @details This macro enable Brown-out detect reset function. - * The register write-protection function should be disabled before using this macro. - */ -#define SYS_ENABLE_BOD_RST() (SYS->BODCR |= SYS_BODCR_BOD_RSTEN_Msk) - -/** - * @brief Set Brown-out detector function low power mode - * @param None - * @return None - * @details This macro set Brown-out detector to low power mode. - * The register write-protection function should be disabled before using this macro. - */ -#define SYS_SET_BOD_LPM() (SYS->BODCR |= SYS_BODCR_BOD_LPM_Msk) - -/** - * @brief Set Brown-out detector voltage level - * @param[in] u32Level is Brown-out voltage level. Including : - * - \ref SYS_BODCR_BOD_VL_4_5V - * - \ref SYS_BODCR_BOD_VL_3_8V - * - \ref SYS_BODCR_BOD_VL_2_7V - * - \ref SYS_BODCR_BOD_VL_2_2V - * @return None - * @details This macro set Brown-out detector voltage level. - * The write-protection function should be disabled before using this macro. - */ -#define SYS_SET_BOD_LEVEL(u32Level) (SYS->BODCR = (SYS->BODCR & ~SYS_BODCR_BOD_VL_Msk) | (u32Level)) - -/** - * @brief Get reset source is from Brown-out detector reset - * @param None - * @retval 0 Previous reset source is not from Brown-out detector reset - * @retval >=1 Previous reset source is from Brown-out detector reset - * @details This macro get previous reset source is from Brown-out detect reset or not. - */ -#define SYS_IS_BOD_RST() (SYS->RSTSRC & SYS_RSTSRC_RSTS_BOD_Msk) - -/** - * @brief Get reset source is from CPU reset - * @param None - * @retval 0 Previous reset source is not from CPU reset - * @retval >=1 Previous reset source is from CPU reset - * @details This macro get previous reset source is from CPU reset. - */ -#define SYS_IS_CPU_RST() (SYS->RSTSRC & SYS_RSTSRC_RSTS_CPU_Msk) - -/** - * @brief Get reset source is from Low-Voltage-Reset - * @param None - * @retval 0 Previous reset source is not from Low-Voltage-Reset - * @retval >=1 Previous reset source is from Low-Voltage-Reset - * @details This macro get previous reset source is from Low-Voltage-Reset. - */ -#define SYS_IS_LVR_RST() (SYS->RSTSRC & SYS_RSTSRC_RSTS_LVR_Msk) - -/** - * @brief Get reset source is from Power-on Reset - * @param None - * @retval 0 Previous reset source is not from Power-on Reset - * @retval >=1 Previous reset source is from Power-on Reset - * @details This macro get previous reset source is from Power-on Reset. - */ -#define SYS_IS_POR_RST() (SYS->RSTSRC & SYS_RSTSRC_RSTS_POR_Msk) - -/** - * @brief Get reset source is from reset pin reset - * @param None - * @retval 0 Previous reset source is not from reset pin reset - * @retval >=1 Previous reset source is from reset pin reset - * @details This macro get previous reset source is from reset pin reset. - */ -#define SYS_IS_RSTPIN_RST() (SYS->RSTSRC & SYS_RSTSRC_RSTS_RESET_Msk) - -/** - * @brief Get reset source is from system reset - * @param None - * @retval 0 Previous reset source is not from system reset - * @retval >=1 Previous reset source is from system reset - * @details This macro get previous reset source is from system reset. - */ -#define SYS_IS_SYSTEM_RST() (SYS->RSTSRC & SYS_RSTSRC_RSTS_SYS_Msk) - -/** - * @brief Get reset source is from window watch dog reset - * @param None - * @retval 0 Previous reset source is not from window watch dog reset - * @retval >=1 Previous reset source is from window watch dog reset - * @details This macro get previous reset source is from window watch dog reset. - */ -#define SYS_IS_WDT_RST() (SYS->RSTSRC & SYS_RSTSRC_RSTS_WDT_Msk) - -/** - * @brief Disable Low-Voltage-Reset function - * @param None - * @return None - * @details This macro disable Low-Voltage-Reset function. - * The register write-protection function should be disabled before using this macro. - */ -#define SYS_DISABLE_LVR() (SYS->BODCR &= ~SYS_BODCR_LVR_EN_Msk) - -/** - * @brief Enable Low-Voltage-Reset function - * @param None - * @return None - * @details This macro enable Low-Voltage-Reset function. - * The register write-protection function should be disabled before using this macro. - */ -#define SYS_ENABLE_LVR() (SYS->BODCR |= SYS_BODCR_LVR_EN_Msk) - -/** - * @brief Disable Power-on Reset function - * @param None - * @return None - * @details This macro disable Power-on Reset function. - * The register write-protection function should be disabled before using this macro. - */ -#define SYS_DISABLE_POR() (SYS->PORCR = 0x5AA5) - -/** - * @brief Enable Power-on Reset function - * @param None - * @return None - * @details This macro enable Power-on Reset function. - * The register write-protection function should be disabled before using this macro. - */ -#define SYS_ENABLE_POR() (SYS->PORCR = 0) - -/** - * @brief Clear reset source flag - * @param[in] u32RstSrc is reset source. Including: - * - \ref SYS_RSTSRC_RSTS_CPU_Msk - * - \ref SYS_RSTSRC_RSTS_SYS_Msk - * - \ref SYS_RSTSRC_RSTS_BOD_Msk - * - \ref SYS_RSTSRC_RSTS_LVR_Msk - * - \ref SYS_RSTSRC_RSTS_WDT_Msk - * - \ref SYS_RSTSRC_RSTS_RESET_Msk - * - \ref SYS_RSTSRC_RSTS_POR_Msk - * @return None - * @details This macro clear reset source flag. - */ -#define SYS_CLEAR_RST_SOURCE(u32RstSrc) (SYS->RSTSRC = (u32RstSrc) ) - - -/** - * @brief Enable register write-protection function - * @param None - * @return None - * @details This function enable register write-protection function. - * To lock the protected register to forbid write access. - */ -static __INLINE void SYS_LockReg(void) -{ - SYS->REGWRPROT = 0; -} - -/** - * @brief Disable register write-protection function - * @param None - * @return None - * @details This function disable register write-protection function. - * To unlock the protected register to allow write access. - * - */ -static __INLINE void SYS_UnlockReg(void) -{ - while(SYS->REGWRPROT != SYS_REGWRPROT_REGPROTDIS_Msk) - { - SYS->REGWRPROT = 0x59; - SYS->REGWRPROT = 0x16; - SYS->REGWRPROT = 0x88; - } -} - - -void SYS_ClearResetSrc(uint32_t u32Src); -uint32_t SYS_GetBODStatus(void); -uint32_t SYS_GetResetSrc(void); -uint32_t SYS_IsRegLocked(void); -uint32_t SYS_ReadPDID(void); -void SYS_ResetChip(void); -void SYS_ResetCPU(void); -void SYS_ResetModule(uint32_t u32ModuleIndex); -void SYS_EnableBOD(int32_t i32Mode, uint32_t u32BODLevel); -void SYS_DisableBOD(void); - - -/*@}*/ /* end of group SYS_EXPORTED_FUNCTIONS */ - -/*@}*/ /* end of group SYS_Driver */ - -/*@}*/ /* end of group Standard_Driver */ - - -#ifdef __cplusplus -} -#endif - -#endif //__SYS_H__ - -/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/timer.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/timer.h deleted file mode 100644 index 20bf954c..00000000 --- a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/timer.h +++ /dev/null @@ -1,393 +0,0 @@ -/**************************************************************************//** - * @file timer.h - * @version V3.00 - * $Revision: 7 $ - * $Date: 15/07/02 11:21a $ - * @brief NUC123 series Timer driver header file - * - * @note - * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. - *****************************************************************************/ -#ifndef __TIMER_H__ -#define __TIMER_H__ - -#ifdef __cplusplus -extern "C" -{ -#endif - - -/** @addtogroup Standard_Driver Standard Driver - @{ -*/ - -/** @addtogroup TIMER_Driver TIMER Driver - @{ -*/ - -/** @addtogroup TIMER_EXPORTED_CONSTANTS TIMER Exported Constants - @{ -*/ - -#define TIMER_ONESHOT_MODE (0UL << TIMER_TCSR_MODE_Pos) /*!< Timer working in one-shot mode */ -#define TIMER_PERIODIC_MODE (1UL << TIMER_TCSR_MODE_Pos) /*!< Timer working in periodic mode */ -#define TIMER_TOGGLE_MODE (2UL << TIMER_TCSR_MODE_Pos) /*!< Timer working in toggle-output mode */ -#define TIMER_CONTINUOUS_MODE (3UL << TIMER_TCSR_MODE_Pos) /*!< Timer working in continuous counting mode */ -#define TIMER_CAPTURE_FREE_COUNTING_MODE (0UL << TIMER_TEXCON_RSTCAPSEL_Pos) /*!< Timer capture event to get timer counter value */ -#define TIMER_CAPTURE_COUNTER_RESET_MODE (1UL << TIMER_TEXCON_RSTCAPSEL_Pos) /*!< Timer capture event to reset timer counter */ -#define TIMER_CAPTURE_FALLING_EDGE (0UL << TIMER_TEXCON_TEX_EDGE_Pos) /*!< Falling edge trigger timer capture */ -#define TIMER_CAPTURE_RISING_EDGE (1UL << TIMER_TEXCON_TEX_EDGE_Pos) /*!< Rising edge trigger timer capture */ -#define TIMER_CAPTURE_FALLING_AND_RISING_EDGE (2UL << TIMER_TEXCON_TEX_EDGE_Pos) /*!< Both falling and rising edge trigger timer capture */ -#define TIMER_COUNTER_FALLING_EDGE (0UL << TIMER_TEXCON_TX_PHASE_Pos) /*!< Counter increase on falling edge */ -#define TIMER_COUNTER_RISING_EDGE (1UL << TIMER_TEXCON_TX_PHASE_Pos) /*!< Counter increase on rising edge */ - -/*@}*/ /* end of group TIMER_EXPORTED_CONSTANTS */ - - -/** @addtogroup TIMER_EXPORTED_FUNCTIONS TIMER Exported Functions - @{ -*/ - -/** - * @brief Set Timer Compare Value - * - * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. - * @param[in] u32Value Timer compare value. Valid values are between 2 to 0xFFFFFF. - * - * @return None - * - * @details This macro is used to set new Timer compared value. - */ -#define TIMER_SET_CMP_VALUE(timer, u32Value) ((timer)->TCMPR = (u32Value)) - -/** - * @brief Set Timer Prescale Value - * - * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. - * @param[in] u32Value Timer prescale value. Valid values are between 0 to 0xFF. - * - * @return None - * - * @details This macro is used to set new Timer prescale value. - * @note Clock input is divided by (prescale + 1) before it is fed into timer. - */ -#define TIMER_SET_PRESCALE_VALUE(timer, u32Value) ((timer)->TCSR = ((timer)->TCSR & ~TIMER_TCSR_PRESCALE_Msk) | (u32Value)) - -/** - * @brief Check specify Timer Status - * - * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. - * - * @retval 0 Timer 24-bit up counter is inactive - * @retval 1 Timer 24-bit up counter is active - * - * @details This macro is used to check if specify Timer channel is inactive or active. - */ -#define TIMER_IS_ACTIVE(timer) ((timer)->TCSR & TIMER_TCSR_CACT_Msk ? 1 : 0) - -/** - * @brief Start Timer Counting - * - * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. - * - * @return None - * - * @details This function is used to start Timer counting. - */ -static __INLINE void TIMER_Start(TIMER_T *timer) -{ - timer->TCSR |= TIMER_TCSR_CEN_Msk; -} - -/** - * @brief Stop Timer Counting - * - * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. - * - * @return None - * - * @details This function is used to stop/suspend Timer counting. - */ -static __INLINE void TIMER_Stop(TIMER_T *timer) -{ - timer->TCSR &= ~TIMER_TCSR_CEN_Msk; -} - -/** - * @brief Enable Timer Interrupt Wakeup Function - * - * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. - * - * @return None - * - * @details This function is used to enable the Timer interrupt wake-up function. - * @note To wake the system from Power-down mode, timer clock source must be ether LXT or LIRC. - */ -static __INLINE void TIMER_EnableWakeup(TIMER_T *timer) -{ - timer->TCSR |= TIMER_TCSR_WAKE_EN_Msk; -} - -/** - * @brief Disable Timer Wakeup Function - * - * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. - * - * @return None - * - * @details This function is used to disable the Timer interrupt wake-up function. - */ -static __INLINE void TIMER_DisableWakeup(TIMER_T *timer) -{ - timer->TCSR &= ~TIMER_TCSR_WAKE_EN_Msk; -} - -/** - * @brief Enable Capture Pin De-bounce - * - * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. - * - * @return None - * - * @details This function is used to enable the capture pin detection de-bounce function. - */ -static __INLINE void TIMER_EnableCaptureDebounce(TIMER_T *timer) -{ - timer->TEXCON |= TIMER_TEXCON_TEXDB_Msk; -} - -/** - * @brief Disable Capture Pin De-bounce - * - * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. - * - * @return None - * - * @details This function is used to disable the capture pin detection de-bounce function. - */ -static __INLINE void TIMER_DisableCaptureDebounce(TIMER_T *timer) -{ - timer->TEXCON &= ~TIMER_TEXCON_TEXDB_Msk; -} - -/** - * @brief Enable Counter Pin De-bounce - * - * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. - * - * @return None - * - * @details This function is used to enable the counter pin detection de-bounce function. - */ -static __INLINE void TIMER_EnableEventCounterDebounce(TIMER_T *timer) -{ - timer->TEXCON |= TIMER_TEXCON_TCDB_Msk; -} - -/** - * @brief Disable Counter Pin De-bounce - * - * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. - * - * @return None - * - * @details This function is used to disable the counter pin detection de-bounce function. - */ -static __INLINE void TIMER_DisableEventCounterDebounce(TIMER_T *timer) -{ - timer->TEXCON &= ~TIMER_TEXCON_TCDB_Msk; -} - -/** - * @brief Enable Timer Time-out Interrupt - * - * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. - * - * @return None - * - * @details This function is used to enable the Timer time-out interrupt function. - */ -static __INLINE void TIMER_EnableInt(TIMER_T *timer) -{ - timer->TCSR |= TIMER_TCSR_IE_Msk; -} - -/** - * @brief Disable Timer Time-out Interrupt - * - * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. - * - * @return None - * - * @details This function is used to disable the Timer time-out interrupt function. - */ -static __INLINE void TIMER_DisableInt(TIMER_T *timer) -{ - timer->TCSR &= ~TIMER_TCSR_IE_Msk; -} - -/** - * @brief Enable Capture Interrupt - * - * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. - * - * @return None - * - * @details This function is used to enable the Timer capture trigger interrupt function. - */ -static __INLINE void TIMER_EnableCaptureInt(TIMER_T *timer) -{ - timer->TEXCON |= TIMER_TEXCON_TEXIEN_Msk; -} - -/** - * @brief Disable Capture Interrupt - * - * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. - * - * @return None - * - * @details This function is used to disable the Timer capture trigger interrupt function. - */ -static __INLINE void TIMER_DisableCaptureInt(TIMER_T *timer) -{ - timer->TEXCON &= ~TIMER_TEXCON_TEXIEN_Msk; -} - -/** - * @brief Get Timer Time-out Interrupt Flag - * - * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. - * - * @retval 0 Timer time-out interrupt did not occur - * @retval 1 Timer time-out interrupt occurred - * - * @details This function indicates Timer time-out interrupt occurred or not. - */ -static __INLINE uint32_t TIMER_GetIntFlag(TIMER_T *timer) -{ - return (timer->TISR & TIMER_TISR_TIF_Msk ? 1 : 0); -} - -/** - * @brief Clear Timer time-out Interrupt Flag - * - * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. - * - * @return None - * - * @details This function clears Timer time-out interrupt flag. - */ -static __INLINE void TIMER_ClearIntFlag(TIMER_T *timer) -{ - timer->TISR = TIMER_TISR_TIF_Msk; -} - -/** - * @brief Get Timer Capture Interrupt Flag - * - * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. - * - * @retval 0 Timer capture interrupt did not occur - * @retval 1 Timer capture interrupt occurred - * - * @details This function indicates Timer capture interrupt occurred or not. - */ -static __INLINE uint32_t TIMER_GetCaptureIntFlag(TIMER_T *timer) -{ - return timer->TEXISR; -} - -/** - * @brief Clear Timer capture Interrupt Flag - * - * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. - * - * @return None - * - * @details This function clears Timer capture interrupt flag. - */ -static __INLINE void TIMER_ClearCaptureIntFlag(TIMER_T *timer) -{ - timer->TEXISR = TIMER_TEXISR_TEXIF_Msk; -} - -/** - * @brief Get Timer Wakeup Flag - * - * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. - * - * @retval 0 Timer did not wake up system - * @retval 1 Timer Timer wake up system - * - * @details This function indicates Timer has waked up system or not. - */ -static __INLINE uint32_t TIMER_GetWakeupFlag(TIMER_T *timer) -{ - return (timer->TISR & TIMER_TISR_TWF_Msk ? 1 : 0); -} - -/** - * @brief Clear Timer Wake-up Flag - * - * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. - * - * @return None - * - * @details This function clears the Timer wake-up system flag. - */ -static __INLINE void TIMER_ClearWakeupFlag(TIMER_T *timer) -{ - timer->TISR = TIMER_TISR_TWF_Msk; -} - -/** - * @brief Get Capture value - * - * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. - * - * @return Capture Value - * - * @details This function reports the current timer capture data value. - */ -static __INLINE uint32_t TIMER_GetCaptureData(TIMER_T *timer) -{ - return timer->TCAP; -} - -/** - * @brief Get Counter value - * - * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. - * - * @return Counter Value - * - * @details This function reports the current 24-bit timer counter value. - */ -static __INLINE uint32_t TIMER_GetCounter(TIMER_T *timer) -{ - return timer->TDR; -} - -uint32_t TIMER_Open(TIMER_T *timer, uint32_t u32Mode, uint32_t u32Freq); -void TIMER_Close(TIMER_T *timer); -void TIMER_Delay(TIMER_T *timer, uint32_t u32Usec); -void TIMER_EnableCapture(TIMER_T *timer, uint32_t u32CapMode, uint32_t u32Edge); -void TIMER_DisableCapture(TIMER_T *timer); -void TIMER_EnableEventCounter(TIMER_T *timer, uint32_t u32Edge); -void TIMER_DisableEventCounter(TIMER_T *timer); -uint32_t TIMER_GetModuleClock(TIMER_T *timer); - -/*@}*/ /* end of group TIMER_EXPORTED_FUNCTIONS */ - -/*@}*/ /* end of group TIMER_Driver */ - -/*@}*/ /* end of group Standard_Driver */ - -#ifdef __cplusplus -} -#endif - -#endif //__TIMER_H__ - -/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/uart.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/uart.h deleted file mode 100644 index fb6a7f35..00000000 --- a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/uart.h +++ /dev/null @@ -1,427 +0,0 @@ -/**************************************************************************//** - * @file UART.h - * @version V3.0 - * $Revision: 15 $ - * $Date: 15/07/02 11:21a $ - * @brief NUC123 Series UART Interface Controller Driver Header File - * - * @note - * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. - * - ******************************************************************************/ -#ifndef __UART_H__ -#define __UART_H__ - - -#ifdef __cplusplus -extern "C" -{ -#endif - - -/** @addtogroup Standard_Driver Standard Driver - @{ -*/ - -/** @addtogroup UART_Driver UART Driver - @{ -*/ - -/** @addtogroup UART_EXPORTED_CONSTANTS UART Exported Constants - @{ -*/ - -/*---------------------------------------------------------------------------------------------------------*/ -/* UART FIFO size constants definitions */ -/*---------------------------------------------------------------------------------------------------------*/ - -#define UART0_FIFO_SIZE 16 /*!< UART0 supports separated receive/transmit 16/16 bytes entry FIFO */ -#define UART1_FIFO_SIZE 16 /*!< UART1 supports separated receive/transmit 16/16 bytes entry FIFO */ - -/*---------------------------------------------------------------------------------------------------------*/ -/* UA_FCR constants definitions */ -/*---------------------------------------------------------------------------------------------------------*/ - -#define UART_FCR_RFITL_1BYTE (0x0 << UART_FCR_RFITL_Pos) /*!< UA_FCR setting to set RX FIFO Trigger Level to 1 byte */ -#define UART_FCR_RFITL_4BYTES (0x1 << UART_FCR_RFITL_Pos) /*!< UA_FCR setting to set RX FIFO Trigger Level to 4 bytes */ -#define UART_FCR_RFITL_8BYTES (0x2 << UART_FCR_RFITL_Pos) /*!< UA_FCR setting to set RX FIFO Trigger Level to 8 bytes */ -#define UART_FCR_RFITL_14BYTES (0x3 << UART_FCR_RFITL_Pos) /*!< UA_FCR setting to set RX FIFO Trigger Level to 14 bytes */ - -#define UART_FCR_RTS_TRI_LEV_1BYTE (0x0 << UART_FCR_RTS_TRI_LEV_Pos) /*!< UA_FCR setting to set RTS Trigger Level to 1 byte */ -#define UART_FCR_RTS_TRI_LEV_4BYTES (0x1 << UART_FCR_RTS_TRI_LEV_Pos) /*!< UA_FCR setting to set RTS Trigger Level to 4 bytes */ -#define UART_FCR_RTS_TRI_LEV_8BYTES (0x2 << UART_FCR_RTS_TRI_LEV_Pos) /*!< UA_FCR setting to set RTS Trigger Level to 8 bytes */ -#define UART_FCR_RTS_TRI_LEV_14BYTES (0x3 << UART_FCR_RTS_TRI_LEV_Pos) /*!< UA_FCR setting to set RTS Trigger Level to 14 bytes */ - -/*---------------------------------------------------------------------------------------------------------*/ -/* UA_LCR constants definitions */ -/*---------------------------------------------------------------------------------------------------------*/ -#define UART_WORD_LEN_5 (0) /*!< UA_LCR setting to set UART word length to 5 bits */ -#define UART_WORD_LEN_6 (1) /*!< UA_LCR setting to set UART word length to 6 bits */ -#define UART_WORD_LEN_7 (2) /*!< UA_LCR setting to set UART word length to 7 bits */ -#define UART_WORD_LEN_8 (3) /*!< UA_LCR setting to set UART word length to 8 bits */ - -#define UART_PARITY_NONE (0x0 << UART_LCR_PBE_Pos) /*!< UA_LCR setting to set UART as no parity */ -#define UART_PARITY_ODD (0x1 << UART_LCR_PBE_Pos) /*!< UA_LCR setting to set UART as odd parity */ -#define UART_PARITY_EVEN (0x3 << UART_LCR_PBE_Pos) /*!< UA_LCR setting to set UART as even parity */ -#define UART_PARITY_MARK (0x5 << UART_LCR_PBE_Pos) /*!< UA_LCR setting to keep parity bit as '1' */ -#define UART_PARITY_SPACE (0x7 << UART_LCR_PBE_Pos) /*!< UA_LCR setting to keep parity bit as '0' */ - -#define UART_STOP_BIT_1 (0x0 << UART_LCR_NSB_Pos) /*!< UA_LCR setting for one stop bit */ -#define UART_STOP_BIT_1_5 (0x1 << UART_LCR_NSB_Pos) /*!< UA_LCR setting for 1.5 stop bit when 5-bit word length */ -#define UART_STOP_BIT_2 (0x1 << UART_LCR_NSB_Pos) /*!< UA_LCR setting for two stop bit when 6, 7, 8-bit word length */ - - -/*---------------------------------------------------------------------------------------------------------*/ -/* UART RTS LEVEL TRIGGER constants definitions */ -/*---------------------------------------------------------------------------------------------------------*/ -#define UART_RTS_IS_LOW_LEV_ACTIVE (0x1 << UART_MCR_LEV_RTS_Pos) /*!< Set RTS is Low Level Active */ -#define UART_RTS_IS_HIGH_LEV_ACTIVE (0x0 << UART_MCR_LEV_RTS_Pos) /*!< Set RTS is High Level Active */ - -/*---------------------------------------------------------------------------------------------------------*/ -/* UA_IRCR constants definitions */ -/*---------------------------------------------------------------------------------------------------------*/ -#define UART_IRCR_TX_SELECT (0x1 << UART_IRCR_TX_SELECT_Pos) /*!< Set IrDA function Tx mode */ -#define UART_IRCR_RX_SELECT (0x0 << UART_IRCR_TX_SELECT_Pos) /*!< Set IrDA function Rx mode */ - -/*---------------------------------------------------------------------------------------------------------*/ -/* UA_FUNC_SEL constants definitions */ -/*---------------------------------------------------------------------------------------------------------*/ -#define UART_FUNC_SEL_UART (0x0 << UART_FUN_SEL_FUN_SEL_Pos) /*!< UA_FUNC_SEL setting to set UART Function (Default) */ -#define UART_FUNC_SEL_IrDA (0x2 << UART_FUN_SEL_FUN_SEL_Pos) /*!< UA_FUNC_SEL setting to set IrDA Function */ -#define UART_FUNC_SEL_RS485 (0x3 << UART_FUN_SEL_FUN_SEL_Pos) /*!< UA_FUNC_SEL setting to set RS485 Function */ - -/*---------------------------------------------------------------------------------------------------------*/ -/* UART BAUDRATE MODE constants definitions */ -/*---------------------------------------------------------------------------------------------------------*/ -#define UART_BAUD_MODE0 (0) /*!< Set UART Baudrate Mode is Mode0 */ -#define UART_BAUD_MODE2 (UART_BAUD_DIV_X_EN_Msk | UART_BAUD_DIV_X_ONE_Msk) /*!< Set UART Baudrate Mode is Mode2 */ - - -/*@}*/ /* end of group UART_EXPORTED_CONSTANTS */ - - -/** @addtogroup UART_EXPORTED_FUNCTIONS UART Exported Functions - @{ -*/ - - -/** - * @brief Calculate UART baudrate mode0 divider - * - * @param[in] u32SrcFreq UART clock frequency - * @param[in] u32BaudRate Baudrate of UART module - * - * @return UART baudrate mode0 divider - * - * @details This macro calculate UART baudrate mode0 divider. - */ -#define UART_BAUD_MODE0_DIVIDER(u32SrcFreq, u32BaudRate) ((((u32SrcFreq) + ((u32BaudRate)*8)) / (u32BaudRate) >> 4)-2) - -/** - * @brief Calculate UART baudrate mode2 divider - * - * @param[in] u32SrcFreq UART clock frequency - * @param[in] u32BaudRate Baudrate of UART module - * - * @return UART baudrate mode2 divider - * - * @details This macro calculate UART baudrate mode2 divider. - */ -#define UART_BAUD_MODE2_DIVIDER(u32SrcFreq, u32BaudRate) ((((u32SrcFreq) + ((u32BaudRate)/2)) / (u32BaudRate))-2) - - -/** - * @brief Write data - * - * @param[in] uart The pointer of the specified UART module - * @param[in] u8Data Data byte to transmit - * - * @return None - * - * @details This macro write Data to Tx data register. - */ -#define UART_WRITE(uart, u8Data) ((uart)->THR = (u8Data)) - -/** - * @brief Read data - * - * @param[in] uart The pointer of the specified UART module - * - * @return The oldest data byte in RX FIFO - * - * @details This macro read Rx data register. - */ -#define UART_READ(uart) ((uart)->RBR) - - -/** - * @brief Get Tx empty - * - * @param[in] uart The pointer of the specified UART module - * - * @retval 0 Tx FIFO is not empty - * @retval >=1 Tx FIFO is empty - * - * @details This macro get Tx empty register value. - */ -#define UART_GET_TX_EMPTY(uart) ((uart)->FSR & UART_FSR_TX_EMPTY_Msk) - - -/** - * @brief Get Rx empty - * - * @param[in] uart The pointer of the specified UART module - * - * @retval 0 Rx FIFO is not empty - * @retval >=1 Rx FIFO is empty - * - * @details This macro get Rx empty register value. - */ -#define UART_GET_RX_EMPTY(uart) ((uart)->FSR & UART_FSR_RX_EMPTY_Msk) - -/** - * @brief Check specified uart port transmission is over. - * - * @param[in] uart The pointer of the specified UART module - * - * @retval 0 Transmission is not over. - * @retval 1 Transmission is over. - * - * @details This macro return if Tx FIFO is empty and specified uart port transmission is over nor not. - */ -#define UART_IS_TX_EMPTY(uart) (((uart)->FSR & UART_FSR_TE_FLAG_Msk) >> UART_FSR_TE_FLAG_Pos) - - -/** - * @brief Wait specified uart port transmission is over - * - * @param[in] uart The pointer of the specified UART module - * - * @return None - * - * @details This macro wait specified uart port transmission is over. - */ -#define UART_WAIT_TX_EMPTY(uart) while(!((((uart)->FSR) & UART_FSR_TE_FLAG_Msk) >> UART_FSR_TE_FLAG_Pos)) - -/** - * @brief Check RX is ready or not - * - * @param[in] uart The pointer of the specified UART module - * - * @retval 0 The number of bytes in the RX FIFO is less than the RFITL - * @retval 1 The number of bytes in the RX FIFO equals or larger than RFITL - * - * @details This macro check receive data available interrupt flag is set or not. - */ -#define UART_IS_RX_READY(uart) (((uart)->ISR & UART_ISR_RDA_IF_Msk)>>UART_ISR_RDA_IF_Pos) - - -/** - * @brief Check TX FIFO is full or not - * - * @param[in] uart The pointer of the specified UART module - * - * @retval 1 TX FIFO is full - * @retval 0 TX FIFO is not full - * - * @details This macro check TX FIFO is full or not. - */ -#define UART_IS_TX_FULL(uart) (((uart)->FSR & UART_FSR_TX_FULL_Msk)>>UART_FSR_TX_FULL_Pos) - -/** - * @brief Check RX FIFO is full or not - * - * @param[in] uart The pointer of the specified UART module - * - * @retval 1 RX FIFO is full - * @retval 0 RX FIFO is not full - * - * @details This macro check RX FIFO is full or not. - */ -#define UART_IS_RX_FULL(uart) (((uart)->FSR & UART_FSR_RX_FULL_Msk)>>UART_FSR_RX_FULL_Pos) - - -/** - * @brief Get Tx full register value - * - * @param[in] uart The pointer of the specified UART module - * - * @retval 0 Tx FIFO is not full. - * @retval >=1 Tx FIFO is full. - * - * @details This macro get Tx full register value. - */ -#define UART_GET_TX_FULL(uart) ((uart)->FSR & UART_FSR_TX_FULL_Msk) - - -/** - * @brief Get Rx full register value - * - * @param[in] uart The pointer of the specified UART module - * - * @retval 0 Rx FIFO is not full. - * @retval >=1 Rx FIFO is full. - * - * @details This macro get Rx full register value. - */ -#define UART_GET_RX_FULL(uart) ((uart)->FSR & UART_FSR_RX_FULL_Msk) - - -/** - * @brief Enable specified UART interrupt - * - * @param[in] uart The pointer of the specified UART module - * @param[in] u32eIntSel Interrupt type select - * - UART_IER_WAKE_EN_Msk : Wakeup interrupt - * - UART_IER_BUF_ERR_IEN_Msk : Buffer Error interrupt - * - UART_IER_TOUT_IEN_Msk : Rx time-out interrupt - * - UART_IER_MODEM_IEN_Msk : Modem interrupt - * - UART_IER_RLS_IEN_Msk : Rx Line status interrupt - * - UART_IER_THRE_IEN_Msk : Tx empty interrupt - * - UART_IER_RDA_IEN_Msk : Rx ready interrupt - * - * @return None - * - * @details This macro enable specified UART interrupt. - */ -#define UART_ENABLE_INT(uart, u32eIntSel) ((uart)->IER |= (u32eIntSel)) - - -/** - * @brief Disable specified UART interrupt - * - * @param[in] uart The pointer of the specified UART module - * @param[in] u32eIntSel Interrupt type select - * - UART_IER_WAKE_EN_Msk : Wakeup interrupt - * - UART_IER_BUF_ERR_IEN_Msk : Buffer Error interrupt - * - UART_IER_TOUT_IEN_Msk : Rx time-out interrupt - * - UART_IER_MODEM_IEN_Msk : Modem interrupt - * - UART_IER_RLS_IEN_Msk : Rx Line status interrupt - * - UART_IER_THRE_IEN_Msk : Tx empty interrupt - * - UART_IER_RDA_IEN_Msk : Rx ready interrupt - * @return None - * - * @details This macro enable specified UART interrupt. - */ -#define UART_DISABLE_INT(uart, u32eIntSel) ((uart)->IER &= ~ (u32eIntSel)) - - -/** - * @brief Get specified interrupt indicator status - * - * @param[in] uart The pointer of the specified UART module. - * @param[in] u32eIntTypeFlag Interrupt Type Flag, should be - * - UART_ISR_HW_BUF_ERR_INT_Msk : In DMA Mode, Buffer Error Interrupt Indicator - * - UART_ISR_HW_TOUT_INT_Msk : In DMA Mode, Rx Time-out Interrupt Indicator - * - UART_ISR_HW_MODEM_INT_Msk : In DMA Mode, MODEM Status Interrupt Indicator - * - UART_ISR_HW_RLS_INT_Msk : In DMA Mode, Rx Line Status Interrupt Indicator - * - UART_ISR_HW_BUF_ERR_IF_Msk : In DMA Mode, Buffer Error Interrupt Flag - * - UART_ISR_HW_TOUT_IF_Msk : In DMA Mode, Rx Time-out Interrupt Flag - * - UART_ISR_HW_MODEM_IF_Msk : In DMA Mode, MODEM Status Interrupt Flag - * - UART_ISR_HW_RLS_IF_Msk : In DMA Mode, Rx Line Status Interrupt Flag - * - UART_ISR_LIN_INT_Msk : LIN Bus Interrupt Indicator - * - UART_ISR_BUF_ERR_INT_Msk : Buffer Error Interrupt Indicator - * - UART_ISR_TOUT_INT_Msk : Rx Time-out Interrupt Indicator - * - UART_ISR_MODEM_INT_Msk : MODEM Status Interrupt Indicator - * - UART_ISR_RLS_INT_Msk : Rx Line Status Interrupt Indicator - * - UART_ISR_THRE_INT_Msk : Tx Empty Interrupt Indicator - * - UART_ISR_RDA_INT_Msk : Rx Ready Interrupt Indicator - * - UART_ISR_LIN_IF_Msk : LIN Bus Interrupt Flag - * - UART_ISR_BUF_ERR_IF_Msk : Buffer Error Interrupt Flag - * - UART_ISR_TOUT_IF_Msk : Rx Time-out Interrupt Flag - * - UART_ISR_MODEM_IF_Msk : MODEM Status Interrupt Flag - * - UART_ISR_RLS_IF_Msk : Rx Line Status Interrupt Flag - * - UART_ISR_THRE_IF_Msk : Tx Empty Interrupt Flag - * - UART_ISR_RDA_IF_Msk : Rx Ready Interrupt Flag - * - * @retval 0 The specified interrupt is not happened. - * 1 The specified interrupt is happened. - * - * @details This macro get specified interrupt flag or interrupt indicator status. - */ -#define UART_GET_INT_FLAG(uart,u32eIntTypeFlag) (((uart)->ISR & (u32eIntTypeFlag))?1:0) - - -/** - * @brief Set RTS pin to low - * - * @param[in] uart The pointer of the specified UART module - * - * @return None - * - * @details This macro set RTS pin to low. - */ -__STATIC_INLINE void UART_CLEAR_RTS(UART_T* uart) -{ - (uart)->MCR |= UART_MCR_LEV_RTS_Msk; - (uart)->MCR &= ~UART_MCR_RTS_Msk; -} - -/** - * @brief Set RTS pin to high - * - * @param[in] uart The pointer of the specified UART module - * @return None - * - * @details This macro set RTS pin to high. - */ -__STATIC_INLINE void UART_SET_RTS(UART_T* uart) -{ - (uart)->MCR |= UART_MCR_LEV_RTS_Msk | UART_MCR_RTS_Msk; -} - - -/** - * @brief Clear RS-485 Address Byte Detection Flag - * - * @param[in] uart The pointer of the specified UART module - * - * @return None - * - * @details This macro clear RS-485 address byte detection flag. - */ -#define UART_RS485_CLEAR_ADDR_FLAG(uart) ((uart)->FSR = UART_FSR_RS485_ADD_DETF_Msk) - - -/** - * @brief Get RS-485 Address Byte Detection Flag - * - * @param[in] uart The pointer of the specified UART module - * - * @retval 0 Receiver detects a data that is not an address bit. - * @retval 1 Receiver detects a data that is an address bit. - * - * @details This macro get RS-485 address byte detection flag. - */ -#define UART_RS485_GET_ADDR_FLAG(uart) (((uart)->FSR & UART_FSR_RS485_ADD_DETF_Msk) >> UART_FSR_RS485_ADD_DETF_Pos) - - -void UART_ClearIntFlag(UART_T* uart , uint32_t u32InterruptFlag); -void UART_Close(UART_T* uart); -void UART_DisableFlowCtrl(UART_T* uart); -void UART_DisableInt(UART_T* uart, uint32_t u32InterruptFlag); -void UART_EnableFlowCtrl(UART_T* uart); -void UART_EnableInt(UART_T* uart, uint32_t u32InterruptFlag); -void UART_Open(UART_T* uart, uint32_t u32baudrate); -uint32_t UART_Read(UART_T* uart, uint8_t *pu8RxBuf, uint32_t u32ReadBytes); -void UART_SetLine_Config(UART_T* uart, uint32_t u32baudrate, uint32_t u32data_width, uint32_t u32parity, uint32_t u32stop_bits); -void UART_SetTimeoutCnt(UART_T* uart, uint32_t u32TOC); -void UART_SelectIrDAMode(UART_T* uart, uint32_t u32Buadrate, uint32_t u32Direction); -void UART_SelectRS485Mode(UART_T* uart, uint32_t u32Mode, uint32_t u32Addr); -uint32_t UART_Write(UART_T* uart, uint8_t *pu8TxBuf, uint32_t u32WriteBytes); - - -/*@}*/ /* end of group UART_EXPORTED_FUNCTIONS */ - -/*@}*/ /* end of group UART_Driver */ - -/*@}*/ /* end of group Standard_Driver */ - -#ifdef __cplusplus -} -#endif - -#endif //__UART_H__ - -/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ - diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/usbd.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/usbd.h deleted file mode 100644 index 1b5d0a88..00000000 --- a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/usbd.h +++ /dev/null @@ -1,663 +0,0 @@ -/**************************************************************************//** - * @file usbd.h - * @version V3.0 - * $Revision: 18 $ - * $Date: 15/09/03 11:15a $ - * @brief NUC123 series USB driver header file - * - * @note - * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. - * - ******************************************************************************/ - -#ifndef __USBD_H__ -#define __USBD_H__ - - -/** @addtogroup Standard_Driver Standard Driver - @{ -*/ - -/** @addtogroup USBD_Driver USBD Driver - @{ -*/ - -/** @addtogroup USBD_EXPORTED_STRUCTS USBD Exported Structs - @{ -*/ - - -typedef struct s_usbd_info -{ - const uint8_t *gu8DevDesc; /*!< Pointer for USB Device Descriptor */ - const uint8_t *gu8ConfigDesc; /*!< Pointer for USB Configuration Descriptor */ - const uint8_t **gu8StringDesc; /*!< Pointer for USB String Descriptor pointers */ - const uint8_t **gu8HidReportDesc; /*!< Pointer for USB HID Report Descriptor */ - const uint32_t *gu32HidReportSize; /*!< Pointer for HID Report descriptor Size */ - const uint32_t *gu32ConfigHidDescIdx; /*!< Pointer for HID Descriptor start index */ - -} S_USBD_INFO_T; - -extern const S_USBD_INFO_T gsInfo; - -/*@}*/ /* end of group USBD_EXPORTED_STRUCTS */ - - - -/** @addtogroup USBD_EXPORTED_CONSTANTS USBD Exported Constants - @{ -*/ - -#define USBD_BUF_BASE (USBD_BASE+0x100) - - - -#define USBD_MAX_EP 8 - -#define EP0 0 /*!< Endpoint 0 */ -#define EP1 1 /*!< Endpoint 1 */ -#define EP2 2 /*!< Endpoint 2 */ -#define EP3 3 /*!< Endpoint 3 */ -#define EP4 4 /*!< Endpoint 4 */ -#define EP5 5 /*!< Endpoint 5 */ -#define EP6 6 /*!< Endpoint 6 */ -#define EP7 7 /*!< Endpoint 7 */ - - -/*! b, then return a. Otherwise, return b. - */ -#define Maximum(a,b) ((a)>(b) ? (a) : (b)) - - -/** - * @brief Compare two input numbers and return minimum one - * - * @param[in] a First number to be compared - * @param[in] b Second number to be compared - * - * @return Minimum value between a and b - * - * @details If a < b, then return a. Otherwise, return b. - */ -#define Minimum(a,b) ((a)<(b) ? (a) : (b)) - - -/** - * @brief Enable USB - * - * @param None - * - * @return None - * - * @details To set USB ATTR control register to enable USB and PHY. - * - */ -#define USBD_ENABLE_USB() ((uint32_t)(USBD->ATTR |= (USBD_USB_EN|USBD_PHY_EN))) - -/** - * @brief Disable USB - * - * @param None - * - * @return None - * - * @details To set USB ATTR control register to disable USB. - * - */ -#define USBD_DISABLE_USB() ((uint32_t)(USBD->ATTR &= ~USBD_USB_EN)) - -/** - * @brief Enable USB PHY - * - * @param None - * - * @return None - * - * @details To set USB ATTR control register to enable USB PHY. - * - */ -#define USBD_ENABLE_PHY() ((uint32_t)(USBD->ATTR |= USBD_PHY_EN)) - -/** - * @brief Disable USB PHY - * - * @param None - * - * @return None - * - * @details To set USB ATTR control register to disable USB PHY. - * - */ -#define USBD_DISABLE_PHY() ((uint32_t)(USBD->ATTR &= ~USBD_PHY_EN)) - -/** - * @brief Enable SE0. Force USB PHY transceiver to drive SE0. - * - * @param None - * - * @return None - * - * @details Set DRVSE0 bit of USB_DRVSE0 register to enable software-disconnect function. Force USB PHY transceiver to drive SE0 to bus. - * - */ -#define USBD_SET_SE0() ((uint32_t)(USBD->DRVSE0 |= USBD_DRVSE0)) - -/** - * @brief Disable SE0 - * - * @param None - * - * @return None - * - * @details Clear DRVSE0 bit of USB_DRVSE0 register to disable software-disconnect function. - * - */ -#define USBD_CLR_SE0() ((uint32_t)(USBD->DRVSE0 &= ~USBD_DRVSE0)) - -/** - * @brief Set USB device address - * - * @param[in] addr The USB device address. - * - * @return None - * - * @details Write USB device address to USB_FADDR register. - * - */ -#define USBD_SET_ADDR(addr) (USBD->FADDR = (addr)) - -/** - * @brief Get USB device address - * - * @param None - * - * @return USB device address - * - * @details Read USB_FADDR register to get USB device address. - * - */ -#define USBD_GET_ADDR() ((uint32_t)(USBD->FADDR)) - -/** - * @brief Enable USB interrupt function - * - * @param[in] intr The combination of the specified interrupt enable bits. - * Each bit corresponds to a interrupt enable bit. - * This parameter decides which interrupts will be enabled. - * (USBD_INT_WAKEUP, USBD_INT_FLDET, USBD_INT_USB, USBD_INT_BUS) - * - * @return None - * - * @details Enable USB related interrupt functions specified by intr parameter. - * - */ -#define USBD_ENABLE_INT(intr) (USBD->INTEN |= (intr)) - -/** - * @brief Get interrupt status - * - * @param None - * - * @return The value of USB_INTSTS register - * - * @details Return all interrupt flags of USB_INTSTS register. - * - */ -#define USBD_GET_INT_FLAG() ((uint32_t)(USBD->INTSTS)) - -/** - * @brief Clear USB interrupt flag - * - * @param[in] flag The combination of the specified interrupt flags. - * Each bit corresponds to a interrupt source. - * This parameter decides which interrupt flags will be cleared. - * (USBD_INTSTS_WAKEUP, USBD_INTSTS_FLDET, USBD_INTSTS_BUS, USBD_INTSTS_USB) - * - * @return None - * - * @details Clear USB related interrupt flags specified by flag parameter. - * - */ -#define USBD_CLR_INT_FLAG(flag) (USBD->INTSTS = (flag)) - -/** - * @brief Get endpoint status - * - * @param None - * - * @return The value of USB_EPSTS register. - * - * @details Return all endpoint status. - * - */ -#define USBD_GET_EP_FLAG() ((uint32_t)(USBD->EPSTS)) - -/** - * @brief Get USB bus state - * - * @param None - * - * @return The value of USB_ATTR[3:0]. - * Bit 0 indicates USB bus reset status. - * Bit 1 indicates USB bus suspend status. - * Bit 2 indicates USB bus resume status. - * Bit 3 indicates USB bus time-out status. - * - * @details Return USB_ATTR[3:0] for USB bus events. - * - */ -#define USBD_GET_BUS_STATE() ((uint32_t)(USBD->ATTR & 0xf)) - -/** - * @brief Check cable connection state - * - * @param None - * - * @retval 0 USB cable is not attached. - * @retval 1 USB cable is attached. - * - * @details Check the connection state by FLDET bit of USB_FLDET register. - * - */ -#define USBD_IS_ATTACHED() ((uint32_t)(USBD->FLDET & USBD_FLDET_FLDET_Msk)) - -/** - * @brief Stop USB transaction of the specified endpoint ID - * - * @param[in] ep The USB endpoint ID. NUC123 supports 8 hardware endpoint ID. This parameter could be 0 ~ 7. - * - * @return None - * - * @details Write 1 to CLRRDY bit of USB_CFGPx register to stop USB transaction of the specified endpoint ID. - * - */ -#define USBD_STOP_TRANSACTION(ep) (*((__IO uint32_t *) ((uint32_t)&USBD->EP[0].CFGP + (uint32_t)((ep) << 4))) |= USBD_CFGP_CLRRDY_Msk) - -/** - * @brief Set USB DATA1 PID for the specified endpoint ID - * - * @param[in] ep The USB endpoint ID. NUC123 supports 8 hardware endpoint ID. This parameter could be 0 ~ 7. - * - * @return None - * - * @details Set DSQ_SYNC bit of USB_CFGx register to specify the DATA1 PID for the following IN token transaction. - * Base on this setting, hardware will toggle PID between DATA0 and DATA1 automatically for IN token transactions. - * - */ -#define USBD_SET_DATA1(ep) (*((__IO uint32_t *) ((uint32_t)&USBD->EP[0].CFG + (uint32_t)((ep) << 4))) |= USBD_CFG_DSQ_SYNC_Msk) - -/** - * @brief Set USB DATA0 PID for the specified endpoint ID - * - * @param[in] ep The USB endpoint ID. NUC123 supports 8 hardware endpoint ID. This parameter could be 0 ~ 7. - * - * @return None - * - * @details Clear DSQ_SYNC bit of USB_CFGx register to specify the DATA0 PID for the following IN token transaction. - * Base on this setting, hardware will toggle PID between DATA0 and DATA1 automatically for IN token transactions. - * - */ -#define USBD_SET_DATA0(ep) (*((__IO uint32_t *) ((uint32_t)&USBD->EP[0].CFG + (uint32_t)((ep) << 4))) &= (~USBD_CFG_DSQ_SYNC_Msk)) - -/** - * @brief Set USB payload size (IN data) - * - * @param[in] ep The USB endpoint ID. NUC123 supports 8 hardware endpoint ID. This parameter could be 0 ~ 7. - * - * @param[in] size The transfer length. - * - * @return None - * - * @details This macro will write the transfer length to USB_MXPLDx register for IN data transaction. - * - */ -#define USBD_SET_PAYLOAD_LEN(ep, size) (*((__IO uint32_t *) ((uint32_t)&USBD->EP[0].MXPLD + (uint32_t)((ep) << 4))) = (size)) - -/** - * @brief Get USB payload size (OUT data) - * - * @param[in] ep The USB endpoint ID. NUC123 supports 8 hardware endpoint ID. This parameter could be 0 ~ 7. - * - * @return The value of USB_MXPLDx register. - * - * @details Get the data length of OUT data transaction by reading USB_MXPLDx register. - * - */ -#define USBD_GET_PAYLOAD_LEN(ep) ((uint32_t)*((__IO uint32_t *) ((uint32_t)&USBD->EP[0].MXPLD + (uint32_t)((ep) << 4)))) - -/** - * @brief Configure endpoint - * - * @param[in] ep The USB endpoint ID. NUC123 supports 8 hardware endpoint ID. This parameter could be 0 ~ 7. - * - * @param[in] config The USB configuration. - * - * @return None - * - * @details This macro will write config parameter to USB_CFGx register of specified endpoint ID. - * - */ -#define USBD_CONFIG_EP(ep, config) (*((__IO uint32_t *) ((uint32_t)&USBD->EP[0].CFG + (uint32_t)((ep) << 4))) = (config)) - -/** - * @brief Set USB endpoint buffer - * - * @param[in] ep The USB endpoint ID. NUC123 supports 8 hardware endpoint ID. This parameter could be 0 ~ 7. - * - * @param[in] offset The SRAM offset. - * - * @return None - * - * @details This macro will set the SRAM offset for the specified endpoint ID. - * - */ -#define USBD_SET_EP_BUF_ADDR(ep, offset) (*((__IO uint32_t *) ((uint32_t)&USBD->EP[0].BUFSEG + (uint32_t)((ep) << 4))) = (offset)) - -/** - * @brief Get the offset of the specified USB endpoint buffer - * - * @param[in] ep The USB endpoint ID. NUC123 supports 8 hardware endpoint ID. This parameter could be 0 ~ 7. - * - * @return The offset of the specified endpoint buffer. - * - * @details This macro will return the SRAM offset of the specified endpoint ID. - * - */ -#define USBD_GET_EP_BUF_ADDR(ep) ((uint32_t)*((__IO uint32_t *) ((uint32_t)&USBD->EP[0].BUFSEG + (uint32_t)((ep) << 4)))) - -/** - * @brief Set USB endpoint stall state - * - * @param[in] ep The USB endpoint ID. NUC123 supports 8 hardware endpoint ID. This parameter could be 0 ~ 7. - * - * @return None - * - * @details Set USB endpoint stall state for the specified endpoint ID. Endpoint will respond STALL token automatically. - * - */ -#define USBD_SET_EP_STALL(ep) (*((__IO uint32_t *) ((uint32_t)&USBD->EP[0].CFGP + (uint32_t)((ep) << 4))) |= USBD_CFGP_SSTALL_Msk) - -/** - * @brief Clear USB endpoint stall state - * - * @param[in] ep The USB endpoint ID. NUC123 supports 8 hardware endpoint ID. This parameter could be 0 ~ 7. - * - * @return None - * - * @details Clear USB endpoint stall state for the specified endpoint ID. Endpoint will respond ACK/NAK token. - */ -#define USBD_CLR_EP_STALL(ep) (*((__IO uint32_t *) ((uint32_t)&USBD->EP[0].CFGP + (uint32_t)((ep) << 4))) &= ~USBD_CFGP_SSTALL_Msk) - -/** - * @brief Get USB endpoint stall state - * - * @param[in] ep The USB endpoint ID. NUC123 supports 8 hardware endpoint ID. This parameter could be 0 ~ 7. - * - * @retval 0 USB endpoint is not stalled. - * @retval Others USB endpoint is stalled. - * - * @details Get USB endpoint stall state of the specified endpoint ID. - * - */ -#define USBD_GET_EP_STALL(ep) (*((__IO uint32_t *) ((uint32_t)&USBD->EP[0].CFGP + (uint32_t)((ep) << 4))) & USBD_CFGP_SSTALL_Msk) - -/** - * @brief To support byte access between USB SRAM and system SRAM - * - * @param[in] dest Destination pointer. - * - * @param[in] src Source pointer. - * - * @param[in] size Byte count. - * - * @return None - * - * @details This function will copy the number of data specified by size and src parameters to the address specified by dest parameter. - * - */ -static __INLINE void USBD_MemCopy(uint8_t *dest, uint8_t *src, int32_t size) -{ - while(size--) *dest++ = *src++; -} - - -/** - * @brief Set USB endpoint stall state - * - * @param[in] epnum USB endpoint number - * - * @return None - * - * @details Set USB endpoint stall state. Endpoint will respond STALL token automatically. - * - */ -static __INLINE void USBD_SetStall(uint8_t epnum) -{ - uint32_t u32CfgAddr; - uint32_t u32Cfg; - int i; - - for(i = 0; i < USBD_MAX_EP; i++) - { - u32CfgAddr = (uint32_t)(i << 4) + (uint32_t)&USBD->EP[0].CFG; /* USBD_CFG0 */ - u32Cfg = *((__IO uint32_t *)(u32CfgAddr)); - - if((u32Cfg & 0xf) == epnum) - { - u32CfgAddr = (uint32_t)(i << 4) + (uint32_t)&USBD->EP[0].CFGP; /* USBD_CFGP0 */ - u32Cfg = *((__IO uint32_t *)(u32CfgAddr)); - - *((__IO uint32_t *)(u32CfgAddr)) = (u32Cfg | USBD_CFGP_SSTALL); - break; - } - } -} - -/** - * @brief Clear USB endpoint stall state - * - * @param[in] epnum USB endpoint number - * - * @return None - * - * @details Clear USB endpoint stall state. Endpoint will respond ACK/NAK token. - */ -static __INLINE void USBD_ClearStall(uint8_t epnum) -{ - uint32_t u32CfgAddr; - uint32_t u32Cfg; - int i; - - for(i = 0; i < USBD_MAX_EP; i++) - { - u32CfgAddr = (uint32_t)(i << 4) + (uint32_t)&USBD->EP[0].CFG; /* USBD_CFG0 */ - u32Cfg = *((__IO uint32_t *)(u32CfgAddr)); - - if((u32Cfg & 0xf) == epnum) - { - u32CfgAddr = (uint32_t)(i << 4) + (uint32_t)&USBD->EP[0].CFGP; /* USBD_CFGP0 */ - u32Cfg = *((__IO uint32_t *)(u32CfgAddr)); - - *((__IO uint32_t *)(u32CfgAddr)) = (u32Cfg & ~USBD_CFGP_SSTALL); - break; - } - } -} - -/** - * @brief Get USB endpoint stall state - * - * @param[in] epnum USB endpoint number - * - * @retval 0 USB endpoint is not stalled. - * @retval Others USB endpoint is stalled. - * - * @details Get USB endpoint stall state. - * - */ -static __INLINE uint32_t USBD_GetStall(uint8_t epnum) -{ - uint32_t u32CfgAddr; - uint32_t u32Cfg; - int i; - - for(i = 0; i < USBD_MAX_EP; i++) - { - u32CfgAddr = (uint32_t)(i << 4) + (uint32_t)&USBD->EP[0].CFG; /* USBD_CFG0 */ - u32Cfg = *((__IO uint32_t *)(u32CfgAddr)); - - if((u32Cfg & 0xf) == epnum) - { - u32CfgAddr = (uint32_t)(i << 4) + (uint32_t)&USBD->EP[0].CFGP; /* USBD_CFGP0 */ - break; - } - } - - return ((*((__IO uint32_t *)(u32CfgAddr))) & USBD_CFGP_SSTALL); -} - - -extern volatile uint8_t g_usbd_RemoteWakeupEn; - -typedef void (*VENDOR_REQ)(void); /*!< Functional pointer type declaration for Vendor class */ -typedef void (*CLASS_REQ)(void); /*!< Functional pointer type declaration for USB class request callback handler */ -typedef void (*SET_INTERFACE_REQ)(void); /*!< Functional pointer type declaration for USB set interface request callback handler */ -typedef void (*SET_CONFIG_CB)(void); /*!< Functional pointer type declaration for USB set configuration request callback handler */ - -/*--------------------------------------------------------------------*/ -void USBD_Open(const S_USBD_INFO_T *param, CLASS_REQ pfnClassReq, SET_INTERFACE_REQ pfnSetInterface); -void USBD_Start(void); -void USBD_GetSetupPacket(uint8_t *buf); -void USBD_ProcessSetupPacket(void); -void USBD_StandardRequest(void); -void USBD_PrepareCtrlIn(uint8_t *pu8Buf, uint32_t u32Size); -void USBD_CtrlIn(void); -void USBD_PrepareCtrlOut(uint8_t *pu8Buf, uint32_t u32Size); -void USBD_CtrlOut(void); -void USBD_SwReset(void); -void USBD_SetVendorRequest(VENDOR_REQ pfnVendorReq); -void USBD_SetConfigCallback(SET_CONFIG_CB pfnSetConfigCallback); -void USBD_LockEpStall(uint32_t u32EpBitmap); - -/*@}*/ /* end of group USBD_EXPORTED_FUNCTIONS */ - -/*@}*/ /* end of group USBD_Driver */ - -/*@}*/ /* end of group Standard_Driver */ - - -#endif //__USBD_H__ - -/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/wdt.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/wdt.h deleted file mode 100644 index a7e04a81..00000000 --- a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/wdt.h +++ /dev/null @@ -1,200 +0,0 @@ -/**************************************************************************//** - * @file wdt.h - * @version V3.00 - * $Revision: 3 $ - * $Date: 15/07/02 11:21a $ - * @brief NUC123 series WDT driver header file - * - * @note - * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. - *****************************************************************************/ -#ifndef __WDT_H__ -#define __WDT_H__ - -#ifdef __cplusplus -extern "C" -{ -#endif - - -/** @addtogroup Standard_Driver Standard Driver - @{ -*/ - -/** @addtogroup WDT_Driver WDT Driver - @{ -*/ - -/** @addtogroup WDT_EXPORTED_CONSTANTS WDT Exported Constants - @{ -*/ -/*---------------------------------------------------------------------------------------------------------*/ -/* WTCR Constants Definitions */ -/*---------------------------------------------------------------------------------------------------------*/ -#define WDT_TIMEOUT_2POW4 (0UL << WDT_WTCR_WTIS_Pos) /*!< Setting WDT time-out interval to 2^4 * WDT clocks */ -#define WDT_TIMEOUT_2POW6 (1UL << WDT_WTCR_WTIS_Pos) /*!< Setting WDT time-out interval to 2^6 * WDT clocks */ -#define WDT_TIMEOUT_2POW8 (2UL << WDT_WTCR_WTIS_Pos) /*!< Setting WDT time-out interval to 2^8 * WDT clocks */ -#define WDT_TIMEOUT_2POW10 (3UL << WDT_WTCR_WTIS_Pos) /*!< Setting WDT time-out interval to 2^10 * WDT clocks */ -#define WDT_TIMEOUT_2POW12 (4UL << WDT_WTCR_WTIS_Pos) /*!< Setting WDT time-out interval to 2^12 * WDT clocks */ -#define WDT_TIMEOUT_2POW14 (5UL << WDT_WTCR_WTIS_Pos) /*!< Setting WDT time-out interval to 2^14 * WDT clocks */ -#define WDT_TIMEOUT_2POW16 (6UL << WDT_WTCR_WTIS_Pos) /*!< Setting WDT time-out interval to 2^16 * WDT clocks */ -#define WDT_TIMEOUT_2POW18 (7UL << WDT_WTCR_WTIS_Pos) /*!< Setting WDT time-out interval to 2^18 * WDT clocks */ - -/*---------------------------------------------------------------------------------------------------------*/ -/* WTCRALT Constants Definitions */ -/*---------------------------------------------------------------------------------------------------------*/ -#define WDT_RESET_DELAY_1026CLK (0UL << WDT_WTCRALT_WTRDSEL_Pos) /*!< Setting WDT reset delay period to 1026 * WDT clocks */ -#define WDT_RESET_DELAY_130CLK (1UL << WDT_WTCRALT_WTRDSEL_Pos) /*!< Setting WDT reset delay period to 130 * WDT clocks */ -#define WDT_RESET_DELAY_18CLK (2UL << WDT_WTCRALT_WTRDSEL_Pos) /*!< Setting WDT reset delay period to 18 * WDT clocks */ -#define WDT_RESET_DELAY_3CLK (3UL << WDT_WTCRALT_WTRDSEL_Pos) /*!< Setting WDT reset delay period to 3 * WDT clocks */ - -/*@}*/ /* end of group WDT_EXPORTED_CONSTANTS */ - - -/** @addtogroup WDT_EXPORTED_FUNCTIONS WDT Exported Functions - @{ -*/ - -/** - * @brief Clear WDT Reset System Flag - * - * @param None - * - * @return None - * - * @details This macro clear WDT time-out reset system flag. - */ -#define WDT_CLEAR_RESET_FLAG() (WDT->WTCR = (WDT->WTCR & ~(WDT_WTCR_WTIF_Msk | WDT_WTCR_WTWKF_Msk)) | WDT_WTCR_WTRF_Msk) - -/** - * @brief Clear WDT Time-out Interrupt Flag - * - * @param None - * - * @return None - * - * @details This macro clear WDT time-out interrupt flag. - */ -#define WDT_CLEAR_TIMEOUT_INT_FLAG() (WDT->WTCR = (WDT->WTCR & ~(WDT_WTCR_WTRF_Msk | WDT_WTCR_WTWKF_Msk)) | WDT_WTCR_WTIF_Msk) - -/** - * @brief Clear WDT Wake-up Flag - * - * @param None - * - * @return None - * - * @details This macro clear WDT time-out wake-up system flag. - */ -#define WDT_CLEAR_TIMEOUT_WAKEUP_FLAG() (WDT->WTCR = (WDT->WTCR & ~(WDT_WTCR_WTRF_Msk | WDT_WTCR_WTIF_Msk)) | WDT_WTCR_WTWKF_Msk) - -/** - * @brief Get WDT Time-out Reset Flag - * - * @param None - * - * @retval 0 WDT did not cause system reset - * @retval 1 WDT caused system reset - * - * @details This macro indicate WDT time-out to reset system or not. - */ -#define WDT_GET_RESET_FLAG() ((WDT->WTCR & WDT_WTCR_WTRF_Msk)? 1 : 0) - -/** - * @brief Get WDT Time-out Interrupt Flag - * - * @param None - * - * @retval 0 WDT time-out interrupt did not occur - * @retval 1 WDT time-out interrupt occurred - * - * @details This macro indicate WDT time-out interrupt occurred or not. - */ -#define WDT_GET_TIMEOUT_INT_FLAG() ((WDT->WTCR & WDT_WTCR_WTIF_Msk)? 1 : 0) - -/** - * @brief Get WDT Time-out Wake-up Flag - * - * @param None - * - * @retval 0 WDT did not wake up system - * @retval 1 WDT waked up system - * - * @details This macro indicate WDT time-out waked system up or not - */ -#define WDT_GET_TIMEOUT_WAKEUP_FLAG() ((WDT->WTCR & WDT_WTCR_WTWKF_Msk)? 1 : 0) - -/** - * @brief Reset WDT Counter - * - * @param None - * - * @return None - * - * @details This macro is used to reset 18-bit WDT counter. - * @note If WDT is activated and enabled to reset system, user must reset WDT counter \n - * before WDT time-out plus reset delay reached. Or WDT generate a reset signal. - */ -#define WDT_RESET_COUNTER() (WDT->WTCR = (WDT->WTCR & ~(WDT_WTCR_WTIF_Msk | WDT_WTCR_WTWKF_Msk | WDT_WTCR_WTRF_Msk)) | WDT_WTCR_WTR_Msk) - -/** - * @brief Stop WDT Counting - * - * @param None - * - * @return None - * - * @details This function stops WDT counting and disable WDT module. - */ -static __INLINE void WDT_Close(void) -{ - WDT->WTCR = 0; - return; -} - -/** - * @brief Enable WDT Time-out Interrupt - * - * @param None - * - * @return None - * - * @details This function enable the WDT time-out interrupt. - */ -static __INLINE void WDT_EnableInt(void) -{ - WDT->WTCR |= WDT_WTCR_WTIE_Msk; - return; -} - -/** - * @brief Disable WDT Time-out Interrupt - * - * @param None - * - * @return None - * - * @details This function disables the WDT time-out interrupt. - */ -static __INLINE void WDT_DisableInt(void) -{ - // Do not touch write 1 clear bits - WDT->WTCR &= ~(WDT_WTCR_WTIE_Msk | WDT_WTCR_WTRF_Msk | WDT_WTCR_WTIF_Msk | WDT_WTCR_WTWKF_Msk); - return; -} - -void WDT_Open(uint32_t u32TimeoutInterval, uint32_t u32ResetDelay, uint32_t u32EnableReset, uint32_t u32EnableWakeup); - -/*@}*/ /* end of group WDT_EXPORTED_FUNCTIONS */ - -/*@}*/ /* end of group WDT_Driver */ - -/*@}*/ /* end of group Standard_Driver */ - -#ifdef __cplusplus -} -#endif - -#endif //__WDT_H__ - -/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/wwdt.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/wwdt.h deleted file mode 100644 index 7ef7814e..00000000 --- a/os/common/ext/CMSIS/Nuvoton/NUMICRO/inc/wwdt.h +++ /dev/null @@ -1,144 +0,0 @@ -/**************************************************************************//** - * @file wwdt.h - * @version V3.00 - * $Revision: 3 $ - * $Date: 15/07/02 11:21a $ - * @brief WWDT driver header file - * - * @note - * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. - *****************************************************************************/ -#ifndef __WWDT_H__ -#define __WWDT_H__ - -#ifdef __cplusplus -extern "C" -{ -#endif - - -/** @addtogroup Standard_Driver Standard Driver - @{ -*/ - -/** @addtogroup WWDT_Driver WWDT Driver - @{ -*/ - -/** @addtogroup WWDT_EXPORTED_CONSTANTS WWDT Exported Constants - @{ -*/ -/*---------------------------------------------------------------------------------------------------------*/ -/* WWDTCR Constants Definitions */ -/*---------------------------------------------------------------------------------------------------------*/ -#define WWDT_PRESCALER_1 (0 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 1 * (64*WWDT_CLK) */ -#define WWDT_PRESCALER_2 (1 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 2 * (64*WWDT_CLK) */ -#define WWDT_PRESCALER_4 (2 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 4 * (64*WWDT_CLK) */ -#define WWDT_PRESCALER_8 (3 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 8 * (64*WWDT_CLK) */ -#define WWDT_PRESCALER_16 (4 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 16 * (64*WWDT_CLK) */ -#define WWDT_PRESCALER_32 (5 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 32 * (64*WWDT_CLK) */ -#define WWDT_PRESCALER_64 (6 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 64 * (64*WWDT_CLK) */ -#define WWDT_PRESCALER_128 (7 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 128 * (64*WWDT_CLK) */ -#define WWDT_PRESCALER_192 (8 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 192 * (64*WWDT_CLK) */ -#define WWDT_PRESCALER_256 (9 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 256 * (64*WWDT_CLK) */ -#define WWDT_PRESCALER_384 (10 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 384 * (64*WWDT_CLK) */ -#define WWDT_PRESCALER_512 (11 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 512 * (64*WWDT_CLK) */ -#define WWDT_PRESCALER_768 (12 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 768 * (64*WWDT_CLK) */ -#define WWDT_PRESCALER_1024 (13 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 1024 * (64*WWDT_CLK) */ -#define WWDT_PRESCALER_1536 (14 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 1536 * (64*WWDT_CLK) */ -#define WWDT_PRESCALER_2048 (15 << WWDT_WWDTCR_PERIODSEL_Pos) /*!< Select max time-out period to 2048 * (64*WWDT_CLK) */ - -#define WWDT_RELOAD_WORD (0x00005AA5) /*!< Fill this value to WWDTRLD register to reload WWDT counter */ - -/*@}*/ /* end of group WWDT_EXPORTED_CONSTANTS */ - - -/** @addtogroup WWDT_EXPORTED_FUNCTIONS WWDT Exported Functions - @{ -*/ - -/** - * @brief Clear WWDT Reset System Flag - * - * @param None - * - * @return None - * - * @details This macro is used to clear WWDT counter time-out reset system flag. - */ -#define WWDT_CLEAR_RESET_FLAG() (WWDT->WWDTSR = WWDT_WWDTSR_WWDTRF_Msk) - -/** - * @brief Clear WWDT Compared Match Interrupt Flag - * - * @param None - * - * @return None - * - * @details This macro is used to clear WWDT counter compare match interrupt flag. - */ -#define WWDT_CLEAR_INT_FLAG() (WWDT->WWDTSR = WWDT_WWDTSR_WWDTIF_Msk) - -/** - * @brief Get WWDT Reset Flag - * - * @param None - * - * @retval 0 WWDT did not cause system reset - * @retval 1 WWDT counter time-out caused system reset - * - * @details This macro is used to indicate WWDT counter time-out reset system flag. - */ -#define WWDT_GET_RESET_FLAG() ((WWDT->WWDTSR & WWDT_WWDTSR_WWDTRF_Msk)? 1:0) - -/** - * @brief Get WWDT Compared Match Interrupt Flag - * - * @param None - * - * @retval 0 WWDT counter compare match interrupt did not occur - * @retval 1 WWDT counter compare match interrupt occurred - * - * @details This macro is used to indicate WWDT counter compare match interrupt occurred or not. - */ -#define WWDT_GET_INT_FLAG() ((WWDT->WWDTSR & WWDT_WWDTSR_WWDTIF_Msk)? 1:0) - -/** - * @brief Get WWDT Counter value - * - * @param None - * - * @return WWDT Counter Value - * - * @details This macro to reflects the current WWDT counter value. - */ -#define WWDT_GET_COUNTER() (WWDT->WWDTCVR) - -/** - * @brief Reload WWDT Counter - * - * @param None - * - * @return None - * - * @details This macro is used to reload the WWDT counter value to 0x3F. - * @note After WWDT enabled, user must reload WWDT counter while current counter is less than compare value \n - * and larger than 0, otherwise WWDT will cause system reset immediately. - */ -#define WWDT_RELOAD_COUNTER() (WWDT->WWDTRLD = WWDT_RELOAD_WORD) - -void WWDT_Open(uint32_t u32PreScale, uint32_t u32CmpValue, uint32_t u32EnableInt); - -/*@}*/ /* end of group WWDT_EXPORTED_FUNCTIONS */ - -/*@}*/ /* end of group WWDT_Driver */ - -/*@}*/ /* end of group Standard_Driver */ - -#ifdef __cplusplus -} -#endif - -#endif //__WWDT_H__ - -/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/system_NUC123.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/system_NUC123.h deleted file mode 100644 index 2d1b4562..00000000 --- a/os/common/ext/CMSIS/Nuvoton/NUMICRO/system_NUC123.h +++ /dev/null @@ -1,65 +0,0 @@ -/**************************************************************************//** - * @file system_NUC123.h - * @version V3.0 - * $Revision: 5 $ - * $Date: 15/07/02 11:21a $ - * @brief NUC123 Series CMSIS System Header File - * - * @note - * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. - * - ******************************************************************************/ -#ifndef __SYSTEM_NUC123_H -#define __SYSTEM_NUC123_H - -#ifdef __cplusplus -extern "C" { -#endif -/*---------------------------------------------------------------------------------------------------------*/ -/* Macro Definition */ -/*---------------------------------------------------------------------------------------------------------*/ -#ifndef DEBUG_PORT -# define DEBUG_PORT UART0 /*!< Select Debug Port which is used for retarget.c to output debug message to UART */ -#endif - -/*---------------------------------------------------------------------------- - Define SYSCLK - *----------------------------------------------------------------------------*/ -#define __HXT (12000000UL) /*!< External Crystal Clock Frequency */ -#define __LXT (32768UL) /*!< External Crystal Clock Frequency 32.768KHz */ -#define __HIRC (22118400UL) /*!< Internal 22M RC Oscillator Frequency */ -#define __LIRC (10000UL) /*!< Internal 10K RC Oscillator Frequency */ -#define __HSI (50000000UL) /*!< PLL default output is 50MHz */ - -extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ -extern uint32_t CyclesPerUs; /*!< Cycles per micro second */ -extern uint32_t PllClock; /*!< PLL Output Clock Frequency */ - -/** - * Initialize the system - * - * @param none - * @return none - * - * @brief Setup the microcontroller system - * Initialize GPIO directions and values - */ -extern void SystemInit(void); - - -/** - * Update SystemCoreClock variable - * - * @param none - * @return none - * - * @brief Updates the SystemCoreClock with current core Clock - * retrieved from CPU registers. - */ -extern void SystemCoreClockUpdate(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/os/common/ext/CMSIS/Nuvoton/NUMICRO/system_NUC123SD4AN0.h b/os/common/ext/CMSIS/Nuvoton/NUMICRO/system_NUC123SD4AN0.h new file mode 100644 index 00000000..34532b69 --- /dev/null +++ b/os/common/ext/CMSIS/Nuvoton/NUMICRO/system_NUC123SD4AN0.h @@ -0,0 +1,75 @@ + /**************************************************************************//** + * @file system_NUC123SD4AN0.h + * @brief CMSIS Cortex-M0 Device Peripheral Access Layer Header File for + * Device NUC123SD4AN0 + * @version V5.00 + * @date 13. May 2019 + ******************************************************************************/ +/* + * Copyright (c) 2019 /u/KeepItUnder. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef SYSTEM_NUC123SD4AN0_H /* ToDo: replace '' with your device name */ +#define SYSTEM_NUC123SD4AN0_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/** + * Frequency Defines + * + * See NUC123 Technical Reference Manual 5.4.2, page 103 + * + */ + +#define __HXT (12000000ul) // PCB-mounted High Frequency Crystal (12MHz) +#define __HIRC (22118400ul) // Internal MCU-block HF Oscillator Frequency (22.1184MHz) +#define __LXT (32768ul) // PCB-mounted Low Frequency Crystal (32kHz) +#define __LIRC (10000ul) // Internal MCU-block LF Oscillator Frequency (10kHz) +#define __HSI (50000000ul) // PLL clock (50MHz) + + +extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ +extern uint32_t CyclesPerUs; /*!< Cycles per micro second */ +extern uint32_t PllClock; /*!< PLL Output Clock Frequency */ + + +/** + \brief Setup the microcontroller system. + + Initialize the System and update the SystemCoreClock variable. + */ +extern void SystemInit (void); + +/** + \brief Update SystemCoreClock variable. + + Updates the SystemCoreClock with current core Clock retrieved from cpu registers. + */ +extern void SystemCoreClockUpdate (void); + +extern void SystemUnlockReg (void); + + +#ifdef __cplusplus +} +#endif + +#endif /* SYSTEM_NUC123SD4AN0_H */ \ No newline at end of file diff --git a/os/common/startup/ARMCMx/devices/NUC123SD4AN0/cmparams.h b/os/common/startup/ARMCMx/devices/NUC123SD4AN0/cmparams.h index 0af36474..7472c201 100644 --- a/os/common/startup/ARMCMx/devices/NUC123SD4AN0/cmparams.h +++ b/os/common/startup/ARMCMx/devices/NUC123SD4AN0/cmparams.h @@ -1,5 +1,5 @@ /* - ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio + Copyright (C) 2019 /u/KeepItUnder Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -64,7 +64,8 @@ /* Including the device CMSIS header. Note, we are not using the definitions from this header because we need this file to be usable also from assembler source files. We verify that the info matches instead.*/ -#include "NUC123.h" +// #include "NUC123.h" +#include "NUC123SD4AN0.h" /*lint -save -e9029 [10.4] Signedness comes from external files, it is unpredictable but gives no problems.*/ diff --git a/os/hal/ports/NUMICRO/LLD/CLKv1/clk.c b/os/hal/ports/NUMICRO/LLD/CLKv1/clk.c deleted file mode 100644 index c199a9cb..00000000 --- a/os/hal/ports/NUMICRO/LLD/CLKv1/clk.c +++ /dev/null @@ -1,678 +0,0 @@ -/**************************************************************************//** - * @file clk.c - * @version V3.00 - * $Revision: 26 $ - * $Date: 15/10/30 8:44a $ - * @brief NUC123 series CLK driver source file - * - * @note - * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. - *****************************************************************************/ - -#include "NUC123.h" - -/** @addtogroup Standard_Driver Standard Driver - @{ -*/ - -/** @addtogroup CLK_Driver CLK Driver - @{ -*/ - -/** @addtogroup CLK_EXPORTED_FUNCTIONS CLK Exported Functions - @{ -*/ - -/** - * @brief Disable frequency output function - * @param None - * @return None - * @details This function disable frequency output function. - */ -void CLK_DisableCKO(void) -{ - /* Disable CKO clock source */ - CLK_DisableModuleClock(FDIV_MODULE); -} - -/** - * @brief This function enable frequency divider module clock. - * enable frequency divider clock function and configure frequency divider. - * @param[in] u32ClkSrc is frequency divider function clock source. Including : - * - \ref CLK_CLKSEL2_FRQDIV_S_HXT - * - \ref CLK_CLKSEL2_FRQDIV_S_HCLK - * - \ref CLK_CLKSEL2_FRQDIV_S_HIRC - * @param[in] u32ClkDiv is divider output frequency selection. - * @param[in] u32ClkDivBy1En is not supported. - * @return None - * - * @details Output selected clock to CKO. The output clock frequency is divided by u32ClkDiv. - * The formula is: - * CKO frequency = (Clock source frequency) / 2^(u32ClkDiv + 1) - * This function is just used to set CKO clock. - * User must enable I/O for CKO clock output pin by themselves. - */ -void CLK_EnableCKO(uint32_t u32ClkSrc, uint32_t u32ClkDiv, uint32_t u32ClkDivBy1En) -{ - /* CKO = clock source / 2^(u32ClkDiv + 1) */ - CLK->FRQDIV = (CLK_FRQDIV_DIVIDER_EN_Msk | u32ClkDiv) ; - - /* Enable CKO clock source */ - CLK_EnableModuleClock(FDIV_MODULE); - - /* Select CKO clock source */ - CLK_SetModuleClock(FDIV_MODULE, u32ClkSrc, 0); -} - -/** - * @brief Enter to Power-down mode - * @param None - * @return None - * @details This function is used to let system enter to Power-down mode. - * The register write-protection function should be disabled before using this function. - */ -void CLK_PowerDown(void) -{ - /* Set the processor uses deep sleep as its low power mode */ - SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; - - /* Set system Power-down enabled and Power-down entry condition */ - CLK->PWRCON |= (CLK_PWRCON_PWR_DOWN_EN_Msk | CLK_PWRCON_PD_WAIT_CPU_Msk); - - /* Chip enter Power-down mode after CPU run WFI instruction */ - __WFI(); -} - -/** - * @brief Enter to Idle mode - * @param None - * @return None - * @details This function let system enter to Idle mode. - * The register write-protection function should be disabled before using this function. - */ -void CLK_Idle(void) -{ - /* Set the processor uses sleep as its low power mode */ - //SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk; - - /* Set chip in idle mode because of WFI command */ - //CLK->PWRCON &= ~CLK_PWRCON_PWR_DOWN_EN_Msk; - - /* Chip enter idle mode after CPU run WFI instruction */ - //__WFI(); -} - -/** - * @brief Get external high speed crystal clock frequency - * @param None - * @return External high frequency crystal frequency - * @details This function get external high frequency crystal frequency. The frequency unit is Hz. - */ -uint32_t CLK_GetHXTFreq(void) -{ - if(CLK->PWRCON & CLK_PWRCON_XTL12M_EN_Msk) - return __HXT; - else - return 0; -} - -/** - * @brief Get HCLK frequency - * @param None - * @return HCLK frequency - * @details This function get HCLK frequency. The frequency unit is Hz. - */ -uint32_t CLK_GetHCLKFreq(void) -{ - SystemCoreClockUpdate(); - return SystemCoreClock; -} - -/** - * @brief Get PCLK frequency - * @param None - * @return PCLK frequency - * @details This function get PCLK frequency. The frequency unit is Hz. - */ -uint32_t CLK_GetPCLKFreq(void) -{ - SystemCoreClockUpdate(); - if(CLK->APBDIV & CLK_APBDIV_APBDIV_Msk) - return SystemCoreClock / 2; - else - return SystemCoreClock; -} - -/** - * @brief Get CPU frequency - * @param None - * @return CPU frequency - * @details This function get CPU frequency. The frequency unit is Hz. - */ -uint32_t CLK_GetCPUFreq(void) -{ - SystemCoreClockUpdate(); - return SystemCoreClock; -} - -/** - * @brief Set HCLK frequency - * @param[in] u32Hclk is HCLK frequency. The range of u32Hclk is 25 MHz ~ 72 MHz. - * @return HCLK frequency - * @details This function is used to set HCLK frequency. The frequency unit is Hz. - * It would configure PLL frequency to 50MHz ~ 144MHz, - * set HCLK clock divider as 2 and switch HCLK clock source to PLL. - * The register write-protection function should be disabled before using this function. - */ -uint32_t CLK_SetCoreClock(uint32_t u32Hclk) -{ - uint32_t u32HIRCSTB; - - /* Read HIRC clock source stable flag */ - u32HIRCSTB = CLK->CLKSTATUS & CLK_CLKSTATUS_OSC22M_STB_Msk; - - /* The range of u32Hclk is 25 MHz ~ 72 MHz */ - if(u32Hclk > FREQ_72MHZ) - u32Hclk = FREQ_72MHZ; - if(u32Hclk < FREQ_25MHZ) - u32Hclk = FREQ_25MHZ; - - /* Switch HCLK clock source to HIRC clock for safe */ - CLK->PWRCON |= CLK_PWRCON_OSC22M_EN_Msk; - CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk); - CLK->CLKSEL0 |= CLK_CLKSEL0_HCLK_S_Msk; - CLK->CLKDIV &= (~CLK_CLKDIV_HCLK_N_Msk); - - /* Configure PLL setting if HXT clock is stable */ - if(CLK->CLKSTATUS & CLK_CLKSTATUS_XTL12M_STB_Msk) - u32Hclk = CLK_EnablePLL(CLK_PLLCON_PLL_SRC_HXT, (u32Hclk << 1)); - - /* Configure PLL setting if HXT clock is not stable */ - else - { - u32Hclk = CLK_EnablePLL(CLK_PLLCON_PLL_SRC_HIRC, (u32Hclk << 1)); - - /* Read HIRC clock source stable flag */ - u32HIRCSTB = CLK->CLKSTATUS & CLK_CLKSTATUS_OSC22M_STB_Msk; - } - - /* Select HCLK clock source to PLL, - Select HCLK clock source divider as 2 - and update system core clock - */ - CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_PLL, CLK_CLKDIV_HCLK(2)); - - /* Disable HIRC if HIRC is disabled before setting core clock */ - if( u32HIRCSTB == 0 ) - CLK->PWRCON &= ~CLK_PWRCON_OSC22M_EN_Msk; - - /* Return actually HCLK frequency is PLL frequency divide 2 */ - return u32Hclk >> 1; -} - -/** - * @brief Set HCLK clock source and HCLK clock divider - * @param[in] u32ClkSrc is HCLK clock source. Including : - * - \ref CLK_CLKSEL0_HCLK_S_HXT - * - \ref CLK_CLKSEL0_HCLK_S_PLL_DIV2 - * - \ref CLK_CLKSEL0_HCLK_S_PLL - * - \ref CLK_CLKSEL0_HCLK_S_LIRC - * - \ref CLK_CLKSEL0_HCLK_S_HIRC - * @param[in] u32ClkDiv is HCLK clock divider. Including : - * - \ref CLK_CLKDIV_HCLK(x) - * @return None - * @details This function set HCLK clock source and HCLK clock divider. - * The register write-protection function should be disabled before using this function. - */ -void CLK_SetHCLK(uint32_t u32ClkSrc, uint32_t u32ClkDiv) -{ - uint32_t u32HIRCSTB; - - /* Read HIRC clock source stable flag */ - u32HIRCSTB = CLK->CLKSTATUS & CLK_CLKSTATUS_OSC22M_STB_Msk; - - /* Switch to HIRC for Safe. Avoid HCLK too high when applying new divider. */ - CLK->PWRCON |= CLK_CLKSTATUS_OSC22M_STB_Msk; - CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk); - CLK->CLKSEL0 = (CLK->CLKSEL0 & (~CLK_CLKSEL0_HCLK_S_Msk)) | CLK_CLKSEL0_HCLK_S_HIRC; - - /* Apply new Divider */ - CLK->CLKDIV = (CLK->CLKDIV & (~CLK_CLKDIV_HCLK_N_Msk)) | u32ClkDiv; - - /* Switch HCLK to new HCLK source */ - CLK->CLKSEL0 = (CLK->CLKSEL0 & (~CLK_CLKSEL0_HCLK_S_Msk)) | u32ClkSrc; - - /* Update System Core Clock */ - SystemCoreClockUpdate(); - - /* Disable HIRC if HIRC is disabled before switching HCLK source */ - if( u32HIRCSTB == 0 ) - CLK->PWRCON &= ~CLK_CLKSTATUS_OSC22M_STB_Msk; -} - -/** - * @brief This function set selected module clock source and module clock divider - * @param[in] u32ModuleIdx is module index. - * @param[in] u32ClkSrc is module clock source. - * @param[in] u32ClkDiv is module clock divider. - * @return None - * @details Valid parameter combinations listed in following table: - * - * |Module index |Clock source |Divider | - * | :---------------- | :------------------------------------| :--------------------- | - * |\ref WDT_MODULE |\ref CLK_CLKSEL1_WDT_S_LIRC | x | - * |\ref WDT_MODULE |\ref CLK_CLKSEL1_WDT_S_HCLK_DIV2048 | x | - * |\ref ADC_MODULE |\ref CLK_CLKSEL1_ADC_S_HXT |\ref CLK_CLKDIV_ADC(x) | - * |\ref ADC_MODULE |\ref CLK_CLKSEL1_ADC_S_PLL |\ref CLK_CLKDIV_ADC(x) | - * |\ref ADC_MODULE |\ref CLK_CLKSEL1_ADC_S_HCLK |\ref CLK_CLKDIV_ADC(x) | - * |\ref ADC_MODULE |\ref CLK_CLKSEL1_ADC_S_HIRC |\ref CLK_CLKDIV_ADC(x) | - * |\ref SPI0_MODULE |\ref CLK_CLKSEL1_SPI0_S_HCLK | x | - * |\ref SPI0_MODULE |\ref CLK_CLKSEL1_SPI0_S_PLL | x | - * |\ref SPI1_MODULE |\ref CLK_CLKSEL1_SPI1_S_HCLK | x | - * |\ref SPI1_MODULE |\ref CLK_CLKSEL1_SPI1_S_PLL | x | - * |\ref SPI2_MODULE |\ref CLK_CLKSEL1_SPI2_S_HCLK | x | - * |\ref SPI2_MODULE |\ref CLK_CLKSEL1_SPI2_S_PLL | x | - * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0_S_HXT | x | - * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0_S_HCLK | x | - * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0_S_EXT_TRG | x | - * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0_S_LIRC | x | - * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0_S_HIRC | x | - * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1_S_HXT | x | - * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1_S_HCLK | x | - * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1_S_EXT_TRG | x | - * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1_S_LIRC | x | - * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1_S_HIRC | x | - * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2_S_HXT | x | - * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2_S_HCLK | x | - * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2_S_EXT_TRG | x | - * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2_S_LIRC | x | - * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2_S_HIRC | x | - * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3_S_HXT | x | - * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3_S_HCLK | x | - * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3_S_EXT_TRG | x | - * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3_S_LIRC | x | - * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3_S_HIRC | x | - * |\ref UART0_MODULE |\ref CLK_CLKSEL1_UART_S_HXT |\ref CLK_CLKDIV_UART(x) | - * |\ref UART0_MODULE |\ref CLK_CLKSEL1_UART_S_PLL |\ref CLK_CLKDIV_UART(x) | - * |\ref UART0_MODULE |\ref CLK_CLKSEL1_UART_S_HIRC |\ref CLK_CLKDIV_UART(x) | - * |\ref UART1_MODULE |\ref CLK_CLKSEL1_UART_S_HXT |\ref CLK_CLKDIV_UART(x) | - * |\ref UART1_MODULE |\ref CLK_CLKSEL1_UART_S_PLL |\ref CLK_CLKDIV_UART(x) | - * |\ref UART1_MODULE |\ref CLK_CLKSEL1_UART_S_HIRC |\ref CLK_CLKDIV_UART(x) | - * |\ref PWM01_MODULE |\ref CLK_CLKSEL12_PWM01_S_HXT | x | - * |\ref PWM01_MODULE |\ref CLK_CLKSEL12_PWM01_S_HCLK | x | - * |\ref PWM01_MODULE |\ref CLK_CLKSEL12_PWM01_S_HIRC | x | - * |\ref PWM01_MODULE |\ref CLK_CLKSEL12_PWM01_S_LIRC | x | - * |\ref PWM23_MODULE |\ref CLK_CLKSEL12_PWM23_S_HXT | x | - * |\ref PWM23_MODULE |\ref CLK_CLKSEL12_PWM23_S_HCLK | x | - * |\ref PWM23_MODULE |\ref CLK_CLKSEL12_PWM23_S_HIRC | x | - * |\ref PWM23_MODULE |\ref CLK_CLKSEL12_PWM23_S_LIRC | x | - * |\ref I2S_MODULE |\ref CLK_CLKSEL2_I2S_S_HXT | x | - * |\ref I2S_MODULE |\ref CLK_CLKSEL2_I2S_S_PLL | x | - * |\ref I2S_MODULE |\ref CLK_CLKSEL2_I2S_S_HCLK | x | - * |\ref I2S_MODULE |\ref CLK_CLKSEL2_I2S_S_HIRC | x | - * |\ref FDIV_MODULE |\ref CLK_CLKSEL2_FRQDIV_S_HXT | x | - * |\ref FDIV_MODULE |\ref CLK_CLKSEL2_FRQDIV_S_HCLK | x | - * |\ref FDIV_MODULE |\ref CLK_CLKSEL2_FRQDIV_S_HIRC | x | - * |\ref WWDT_MODULE |\ref CLK_CLKSEL2_WWDT_S_HCLK_DIV2048 | x | - * |\ref WWDT_MODULE |\ref CLK_CLKSEL2_WWDT_S_LIRC | x | - * |\ref USBD_MODULE | x |\ref CLK_CLKDIV_USB(x) | - */ - -void CLK_SetModuleClock(uint32_t u32ModuleIdx, uint32_t u32ClkSrc, uint32_t u32ClkDiv) -{ - uint32_t u32sel = 0, u32div = 0; - uint32_t u32SelTbl[3] = {0x0, 0x4, 0xC}; - - if(MODULE_CLKSEL_Msk(u32ModuleIdx) != MODULE_NoMsk) - { - /* Get clock select control register address */ - u32sel = (uint32_t)&CLK->CLKSEL0 + (u32SelTbl[MODULE_CLKSEL(u32ModuleIdx)]); - /* Set new clock selection setting */ - M32(u32sel) = (M32(u32sel) & (~(MODULE_CLKSEL_Msk(u32ModuleIdx) << MODULE_CLKSEL_Pos(u32ModuleIdx)))) | u32ClkSrc; - - /* We need to set CLKSEL2 ext control bit for PWM */ - if(u32ModuleIdx == PWM01_MODULE) - CLK->CLKSEL2 = (CLK->CLKSEL2 & (~CLK_CLKSEL2_PWM01_S_E_Msk)) | (u32ClkSrc & CLK_CLKSEL2_PWM01_S_E_Msk); - else if(u32ModuleIdx == PWM23_MODULE) - CLK->CLKSEL2 = (CLK->CLKSEL2 & (~CLK_CLKSEL2_PWM23_S_E_Msk)) | (u32ClkSrc & CLK_CLKSEL2_PWM23_S_E_Msk); - } - - if(MODULE_CLKDIV_Msk(u32ModuleIdx) != MODULE_NoMsk) - { - /* Get clock divider control register address */ - u32div = (uint32_t)&CLK->CLKDIV + ((MODULE_CLKDIV(u32ModuleIdx)) * 4); - /* Apply new divider */ - M32(u32div) = (M32(u32div) & (~(MODULE_CLKDIV_Msk(u32ModuleIdx) << MODULE_CLKDIV_Pos(u32ModuleIdx)))) | u32ClkDiv; - } -} - -/** - * @brief Set SysTick clock source - * @param[in] u32ClkSrc is module clock source. Including: - * - \ref CLK_CLKSEL0_STCLK_S_HXT - * - \ref CLK_CLKSEL0_STCLK_S_HXT_DIV2 - * - \ref CLK_CLKSEL0_STCLK_S_HCLK_DIV2 - * - \ref CLK_CLKSEL0_STCLK_S_HIRC_DIV2 - * @return None - * @details This function set SysTick clock source. - * The register write-protection function should be disabled before using this function. - */ -void CLK_SetSysTickClockSrc(uint32_t u32ClkSrc) -{ - CLK->CLKSEL0 = (CLK->CLKSEL0 & ~CLK_CLKSEL0_STCLK_S_Msk) | u32ClkSrc; -} - -/** - * @brief Enable clock source - * @param[in] u32ClkMask is clock source mask. Including : - * - \ref CLK_PWRCON_XTL12M_EN_Msk - * - \ref CLK_PWRCON_OSC22M_EN_Msk - * - \ref CLK_PWRCON_OSC10K_EN_Msk - * @return None - * @details This function enable clock source. - * The register write-protection function should be disabled before using this function. - */ -void CLK_EnableXtalRC(uint32_t u32ClkMask) -{ - CLK->PWRCON |= u32ClkMask; -} - -/** - * @brief Disable clock source - * @param[in] u32ClkMask is clock source mask. Including : - * - \ref CLK_PWRCON_XTL12M_EN_Msk - * - \ref CLK_PWRCON_OSC22M_EN_Msk - * - \ref CLK_PWRCON_OSC10K_EN_Msk - * @return None - * @details This function disable clock source. - * The register write-protection function should be disabled before using this function. - */ -void CLK_DisableXtalRC(uint32_t u32ClkMask) -{ - CLK->PWRCON &= ~u32ClkMask; -} - -/** - * @brief Enable module clock - * @param[in] u32ModuleIdx is module index. Including : - * - \ref PDMA_MODULE - * - \ref ISP_MODULE - * - \ref WDT_MODULE - * - \ref TMR0_MODULE - * - \ref TMR1_MODULE - * - \ref TMR2_MODULE - * - \ref TMR3_MODULE - * - \ref FDIV_MODULE - * - \ref I2C0_MODULE - * - \ref I2C1_MODULE - * - \ref SPI0_MODULE - * - \ref SPI1_MODULE - * - \ref SPI2_MODULE - * - \ref UART0_MODULE - * - \ref UART1_MODULE - * - \ref PWM01_MODULE - * - \ref PWM23_MODULE - * - \ref USBD_MODULE - * - \ref ADC_MODULE - * - \ref I2S_MODULE - * - \ref PS2_MODULE - * @return None - * @details This function enable module clock. - */ -void CLK_EnableModuleClock(uint32_t u32ModuleIdx) -{ - *(volatile uint32_t *)((uint32_t)&CLK->AHBCLK + ((MODULE_APBCLK(u32ModuleIdx)) * 4)) |= 1 << MODULE_IP_EN_Pos(u32ModuleIdx); -} - -/** - * @brief Disable module clock - * @param[in] u32ModuleIdx is module index. Including : - * - \ref PDMA_MODULE - * - \ref ISP_MODULE - * - \ref WDT_MODULE - * - \ref TMR0_MODULE - * - \ref TMR1_MODULE - * - \ref TMR2_MODULE - * - \ref TMR3_MODULE - * - \ref FDIV_MODULE - * - \ref I2C0_MODULE - * - \ref I2C1_MODULE - * - \ref SPI0_MODULE - * - \ref SPI1_MODULE - * - \ref SPI2_MODULE - * - \ref UART0_MODULE - * - \ref UART1_MODULE - * - \ref PWM01_MODULE - * - \ref PWM23_MODULE - * - \ref USBD_MODULE - * - \ref ADC_MODULE - * - \ref I2S_MODULE - * - \ref PS2_MODULE - * @return None - * @details This function disable module clock. - */ -void CLK_DisableModuleClock(uint32_t u32ModuleIdx) -{ - *(volatile uint32_t *)((uint32_t)&CLK->AHBCLK + ((MODULE_APBCLK(u32ModuleIdx)) * 4)) &= ~(1 << MODULE_IP_EN_Pos(u32ModuleIdx)); -} - - -/** - * @brief Set PLL frequency - * @param[in] u32PllClkSrc is PLL clock source. Including : - * - \ref CLK_PLLCON_PLL_SRC_HXT - * - \ref CLK_PLLCON_PLL_SRC_HIRC - * @param[in] u32PllFreq is PLL frequency - * @return PLL frequency - * @details This function is used to configure PLLCON register to set specified PLL frequency. - * The register write-protection function should be disabled before using this function. - */ -uint32_t CLK_EnablePLL(uint32_t u32PllClkSrc, uint32_t u32PllFreq) -{ - uint32_t u32PllSrcClk, u32NR, u32NF, u32NO, u32CLK_SRC; - uint32_t u32Tmp, u32Tmp2, u32Tmp3, u32Min, u32MinNF, u32MinNR; - - /* Disable PLL first to avoid unstable when setting PLL. */ - CLK->PLLCON = CLK_PLLCON_PD_Msk; - - /* PLL source clock is from HXT */ - if(u32PllClkSrc == CLK_PLLCON_PLL_SRC_HXT) - { - /* Enable HXT clock */ - CLK->PWRCON |= CLK_PWRCON_XTL12M_EN_Msk; - - /* Wait for HXT clock ready */ - CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk); - - /* Select PLL source clock from HXT */ - u32CLK_SRC = CLK_PLLCON_PLL_SRC_HXT; - u32PllSrcClk = __HXT; - - /* u32NR start from 2 */ - u32NR = 2; - } - - /* PLL source clock is from HIRC */ - else - { - /* Enable HIRC clock */ - CLK->PWRCON |= CLK_PWRCON_OSC22M_EN_Msk; - - /* Wait for HIRC clock ready */ - CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk); - - /* Select PLL source clock from HIRC */ - u32CLK_SRC = CLK_PLLCON_PLL_SRC_HIRC; - u32PllSrcClk = __HIRC; - - /* u32NR start from 4 when FIN = 22.1184MHz to avoid calculation overflow */ - u32NR = 4; - } - - /* Select "NO" according to request frequency */ - if((u32PllFreq <= FREQ_200MHZ) && (u32PllFreq > FREQ_100MHZ)) - { - u32NO = 0; - } - else if((u32PllFreq <= FREQ_100MHZ) && (u32PllFreq > FREQ_50MHZ)) - { - u32NO = 1; - u32PllFreq = u32PllFreq << 1; - } - else if((u32PllFreq <= FREQ_50MHZ) && (u32PllFreq >= FREQ_25MHZ)) - { - u32NO = 3; - u32PllFreq = u32PllFreq << 2; - } - else - { - /* Wrong frequency request. Just return default setting. */ - goto lexit; - } - - /* Find best solution */ - u32Min = (uint32_t) - 1; - u32MinNR = 0; - u32MinNF = 0; - for(; u32NR <= 33; u32NR++) - { - u32Tmp = u32PllSrcClk / u32NR; - if((u32Tmp > 1600000) && (u32Tmp < 16000000)) - { - for(u32NF = 2; u32NF <= 513; u32NF++) - { - u32Tmp2 = u32Tmp * u32NF; - if((u32Tmp2 >= 100000000) && (u32Tmp2 <= 200000000)) - { - u32Tmp3 = (u32Tmp2 > u32PllFreq) ? u32Tmp2 - u32PllFreq : u32PllFreq - u32Tmp2; - if(u32Tmp3 < u32Min) - { - u32Min = u32Tmp3; - u32MinNR = u32NR; - u32MinNF = u32NF; - - /* Break when get good results */ - if(u32Min == 0) - break; - } - } - } - } - } - - /* Enable and apply new PLL setting. */ - CLK->PLLCON = u32CLK_SRC | (u32NO << 14) | ((u32MinNR - 2) << 9) | (u32MinNF - 2); - - /* Waiting for PLL clock stable */ - CLK_WaitClockReady(CLK_CLKSTATUS_PLL_STB_Msk); - - /* Return actual PLL output clock frequency */ - return u32PllSrcClk / ((u32NO + 1) * u32MinNR) * u32MinNF; - -lexit: - - /* Apply default PLL setting and return */ - if(u32PllClkSrc == CLK_PLLCON_PLL_SRC_HXT) - CLK->PLLCON = 0xC22E; /* 48MHz */ - else - CLK->PLLCON = 0xD66F; /* 48.06498462MHz */ - - CLK_WaitClockReady(CLK_CLKSTATUS_PLL_STB_Msk); - return CLK_GetPLLClockFreq(); - - -} - - -/** - * @brief Disable PLL - * @param None - * @return None - * @details This function disable PLL. - */ -void CLK_DisablePLL(void) -{ - CLK->PLLCON |= CLK_PLLCON_PD_Msk; -} - -/** - * @brief This function check selected clock source status - * @param[in] u32ClkMask is selected clock source. Including : - * - \ref CLK_CLKSTATUS_XTL12M_STB_Msk - * - \ref CLK_CLKSTATUS_OSC22M_STB_Msk - * - \ref CLK_CLKSTATUS_OSC10K_STB_Msk - * - \ref CLK_CLKSTATUS_PLL_STB_Msk - * - * @retval 0 clock is not stable - * @retval 1 clock is stable - * - * @details To wait for clock ready by specified CLKSTATUS bit or timeout (~300ms) - */ -uint32_t CLK_WaitClockReady(uint32_t u32ClkMask) -{ - int32_t i32TimeOutCnt = 2160000; - - while((CLK->CLKSTATUS & u32ClkMask) != u32ClkMask) - { - if(i32TimeOutCnt-- <= 0) - return 0; - } - - return 1; -} - -/** - * @brief Enable System Tick counter - * @param[in] u32ClkSrc is System Tick clock source. Including: - * - \ref CLK_CLKSEL0_STCLK_S_HXT - * - \ref CLK_CLKSEL0_STCLK_S_HXT_DIV2 - * - \ref CLK_CLKSEL0_STCLK_S_HCLK_DIV2 - * - \ref CLK_CLKSEL0_STCLK_S_HIRC_DIV2 - * - \ref CLK_CLKSEL0_STCLK_S_HCLK - * @param[in] u32Count is System Tick reload value. It could be 0~0xFFFFFF. - * @return None - * @details This function set System Tick clock source, reload value, enable System Tick counter and interrupt. - * The register write-protection function should be disabled before using this function. - */ -void CLK_EnableSysTick(uint32_t u32ClkSrc, uint32_t u32Count) -{ - /* Set System Tick counter disabled */ - SysTick->CTRL = 0; - - /* Set System Tick clock source */ - if( u32ClkSrc == CLK_CLKSEL0_STCLK_S_HCLK ) - SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk; - else - CLK->CLKSEL0 = (CLK->CLKSEL0 & ~CLK_CLKSEL0_STCLK_S_Msk) | u32ClkSrc; - - /* Set System Tick reload value */ - SysTick->LOAD = u32Count; - - /* Clear System Tick current value and counter flag */ - SysTick->VAL = 0; - - /* Set System Tick interrupt enabled and counter enabled */ - SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; -} - -/** - * @brief Disable System Tick counter - * @param None - * @return None - * @details This function disable System Tick counter. - */ -void CLK_DisableSysTick(void) -{ - /* Set System Tick counter disabled */ - SysTick->CTRL = 0; -} - - - -/*@}*/ /* end of group CLK_EXPORTED_FUNCTIONS */ - -/*@}*/ /* end of group CLK_Driver */ - -/*@}*/ /* end of group Standard_Driver */ - -/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/hal/ports/NUMICRO/LLD/CLKv1/clk.h b/os/hal/ports/NUMICRO/LLD/CLKv1/clk.h deleted file mode 100644 index c66cdd26..00000000 --- a/os/hal/ports/NUMICRO/LLD/CLKv1/clk.h +++ /dev/null @@ -1,409 +0,0 @@ -/**************************************************************************//** - * @file clk.h - * @version V3.0 - * $Revision: 16 $ - * $Date: 15/07/02 11:21a $ - * @brief NUC123 Series Clock Control Driver Header File - * - * @note - * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. - * - ******************************************************************************/ -#ifndef __CLK_H__ -#define __CLK_H__ - -#ifdef __cplusplus -extern "C" -{ -#endif - -/** @addtogroup Standard_Driver Standard Driver - @{ -*/ - -/** @addtogroup CLK_Driver CLK Driver - @{ -*/ - -/** @addtogroup CLK_EXPORTED_CONSTANTS CLK Exported Constants - @{ -*/ - -#define FREQ_25MHZ 25000000 -#define FREQ_50MHZ 50000000 -#define FREQ_72MHZ 72000000 -#define FREQ_100MHZ 100000000 -#define FREQ_200MHZ 200000000 - - -/*---------------------------------------------------------------------------------------------------------*/ -/* CLKSEL0 constant definitions. */ -/*---------------------------------------------------------------------------------------------------------*/ -#define CLK_CLKSEL0_HCLK_S_HXT (0x0UL<>30) & 0x3) /*!< Calculate APBCLK offset on MODULE index, 0x0:AHBCLK, 0x1:APBCLK */ -#define MODULE_CLKSEL(x) (((x) >>28) & 0x3) /*!< Calculate CLKSEL offset on MODULE index, 0x0:CLKSEL0, 0x1:CLKSEL1, 0x2:CLKSEL2 */ -#define MODULE_CLKSEL_Msk(x) (((x) >>25) & 0x7) /*!< Calculate CLKSEL mask offset on MODULE index */ -#define MODULE_CLKSEL_Pos(x) (((x) >>20) & 0x1f) /*!< Calculate CLKSEL position offset on MODULE index */ -#define MODULE_CLKDIV(x) (((x) >>18) & 0x3) /*!< Calculate APBCLK CLKDIV on MODULE index, 0x0:CLKDIV */ -#define MODULE_CLKDIV_Msk(x) (((x) >>10) & 0xff) /*!< Calculate CLKDIV mask offset on MODULE index */ -#define MODULE_CLKDIV_Pos(x) (((x) >>5 ) & 0x1f) /*!< Calculate CLKDIV position offset on MODULE index */ -#define MODULE_IP_EN_Pos(x) (((x) >>0 ) & 0x1f) /*!< Calculate APBCLK offset on MODULE index */ -#define MODULE_NoMsk 0x0 /*!< Not mask on MODULE index */ -#define NA MODULE_NoMsk /*!< Not Available */ - -#define MODULE_APBCLK_ENC(x) (((x) & 0x03) << 30) /*!< MODULE index, 0x0:AHBCLK, 0x1:APBCLK */ -#define MODULE_CLKSEL_ENC(x) (((x) & 0x03) << 28) /*!< CLKSEL offset on MODULE index, 0x0:CLKSEL0, 0x1:CLKSEL1, 0x2:CLKSEL2 */ -#define MODULE_CLKSEL_Msk_ENC(x) (((x) & 0x07) << 25) /*!< CLKSEL mask offset on MODULE index */ -#define MODULE_CLKSEL_Pos_ENC(x) (((x) & 0x1f) << 20) /*!< CLKSEL position offset on MODULE index */ -#define MODULE_CLKDIV_ENC(x) (((x) & 0x03) << 18) /*!< APBCLK CLKDIV on MODULE index, 0x0:CLKDIV */ -#define MODULE_CLKDIV_Msk_ENC(x) (((x) & 0xff) << 10) /*!< CLKDIV mask offset on MODULE index */ -#define MODULE_CLKDIV_Pos_ENC(x) (((x) & 0x1f) << 5) /*!< CLKDIV position offset on MODULE index */ -#define MODULE_IP_EN_Pos_ENC(x) (((x) & 0x1f) << 0) /*!< APBCLK offset on MODULE index */ - - -#define PDMA_MODULE (MODULE_APBCLK_ENC( 0)|MODULE_IP_EN_Pos_ENC(CLK_AHBCLK_PDMA_EN_Pos) |\ - MODULE_CLKSEL_ENC(NA)|MODULE_CLKSEL_Msk_ENC(NA)|MODULE_CLKSEL_Pos_ENC(NA)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< PDMA Module */ -#define ISP_MODULE (MODULE_APBCLK_ENC( 0)|MODULE_IP_EN_Pos_ENC(CLK_AHBCLK_ISP_EN_Pos) |\ - MODULE_CLKSEL_ENC(NA)|MODULE_CLKSEL_Msk_ENC(NA)|MODULE_CLKSEL_Pos_ENC(NA)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< ISP Module */ - -#define WDT_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_WDT_EN_Pos) |\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC( 0)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< WDT Module */ -#define TMR0_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_TMR0_EN_Pos) |\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 7)|MODULE_CLKSEL_Pos_ENC( 8)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< TMR0 Module */ -#define TMR1_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_TMR1_EN_Pos) |\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 7)|MODULE_CLKSEL_Pos_ENC(12)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< TMR1 Module */ -#define TMR2_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_TMR2_EN_Pos) |\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 7)|MODULE_CLKSEL_Pos_ENC(16)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< TMR2 Module */ -#define TMR3_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_TMR3_EN_Pos) |\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 7)|MODULE_CLKSEL_Pos_ENC(20)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< TMR3 Module */ -#define FDIV_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_FDIV_EN_Pos) |\ - MODULE_CLKSEL_ENC( 2)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC( 2)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< FDIV Module */ - -#define I2C0_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_I2C0_EN_Pos) |\ - MODULE_CLKSEL_ENC(NA)|MODULE_CLKSEL_Msk_ENC(NA)|MODULE_CLKSEL_Pos_ENC(NA)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< I2C0 Module */ -#define I2C1_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_I2C1_EN_Pos) |\ - MODULE_CLKSEL_ENC(NA)|MODULE_CLKSEL_Msk_ENC(NA)|MODULE_CLKSEL_Pos_ENC(NA)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< I2C1 Module */ -#define SPI0_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_SPI0_EN_Pos) |\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 1)|MODULE_CLKSEL_Pos_ENC( 4)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< SPI0 Module */ -#define SPI1_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_SPI1_EN_Pos) |\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 1)|MODULE_CLKSEL_Pos_ENC( 5)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< SPI1 Module */ -#define SPI2_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_SPI2_EN_Pos) |\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 1)|MODULE_CLKSEL_Pos_ENC( 6)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< SPI2 Module */ - -#define UART0_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_UART0_EN_Pos)|\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC(24)|\ - MODULE_CLKDIV_ENC( 0)|MODULE_CLKDIV_Msk_ENC(0x0F)|MODULE_CLKDIV_Pos_ENC( 8)) /*!< UART0 Module */ -#define UART1_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_UART1_EN_Pos)|\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC(24)|\ - MODULE_CLKDIV_ENC( 0)|MODULE_CLKDIV_Msk_ENC(0x0F)|MODULE_CLKDIV_Pos_ENC( 8)) /*!< UART1 Module */ - -#define PWM01_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_PWM01_EN_Pos)|\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC(28)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< PWM01 Module */ -#define PWM23_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_PWM23_EN_Pos)|\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC(30)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< PWM23 Module */ -#define USBD_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_USBD_EN_Pos) |\ - MODULE_CLKSEL_ENC(NA)|MODULE_CLKSEL_Msk_ENC(NA)|MODULE_CLKSEL_Pos_ENC(NA)|\ - MODULE_CLKDIV_ENC( 0)|MODULE_CLKDIV_Msk_ENC(0x0F)|MODULE_CLKDIV_Pos_ENC(4)) /*!< USBD Module */ -#define ADC_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_ADC_EN_Pos) |\ - MODULE_CLKSEL_ENC( 1)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC( 2)|\ - MODULE_CLKDIV_ENC( 0)|MODULE_CLKDIV_Msk_ENC(0xFF)|MODULE_CLKDIV_Pos_ENC(16)) /*!< ADC Module */ -#define I2S_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_I2S_EN_Pos) |\ - MODULE_CLKSEL_ENC( 2)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC( 0)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< I2S Module */ -#define PS2_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_PS2_EN_Pos) |\ - MODULE_CLKSEL_ENC(NA)|MODULE_CLKSEL_Msk_ENC(NA)|MODULE_CLKSEL_Pos_ENC(NA)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< PS2 Module */ - -#define WWDT_MODULE (MODULE_APBCLK_ENC( 1)|MODULE_IP_EN_Pos_ENC(CLK_APBCLK_WDT_EN_Pos) |\ - MODULE_CLKSEL_ENC( 2)|MODULE_CLKSEL_Msk_ENC( 3)|MODULE_CLKSEL_Pos_ENC(16)|\ - MODULE_CLKDIV_ENC(NA)|MODULE_CLKDIV_Msk_ENC(NA)|MODULE_CLKDIV_Pos_ENC(NA)) /*!< WWDT Module */ - -/*@}*/ /* end of group CLK_EXPORTED_CONSTANTS */ - - -/** @addtogroup CLK_EXPORTED_FUNCTIONS CLK Exported Functions - @{ -*/ - - -/** - * @brief Get PLL clock frequency - * @param None - * @return PLL frequency - * @details This function get PLL frequency. The frequency unit is Hz. - */ -__STATIC_INLINE uint32_t CLK_GetPLLClockFreq(void) -{ - uint32_t u32PllFreq = 0, u32PllReg; - uint32_t u32FIN, u32NF, u32NR, u32NO; - uint8_t au8NoTbl[4] = {1, 2, 2, 4}; - - u32PllReg = CLK->PLLCON; - - if(u32PllReg & (CLK_PLLCON_PD_Msk | CLK_PLLCON_OE_Msk)) - return 0; /* PLL is in power down mode or fix low */ - - if(u32PllReg & CLK_PLLCON_PLL_SRC_HIRC) - u32FIN = __HIRC; /* PLL source clock from HIRC */ - else - u32FIN = __HXT; /* PLL source clock from HXT */ - - if(u32PllReg & CLK_PLLCON_BP_Msk) - return u32FIN; /* PLL is in bypass mode */ - - /* PLL is output enabled in normal work mode */ - u32NO = au8NoTbl[((u32PllReg & CLK_PLLCON_OUT_DV_Msk) >> CLK_PLLCON_OUT_DV_Pos)]; - u32NF = ((u32PllReg & CLK_PLLCON_FB_DV_Msk) >> CLK_PLLCON_FB_DV_Pos) + 2; - u32NR = ((u32PllReg & CLK_PLLCON_IN_DV_Msk) >> CLK_PLLCON_IN_DV_Pos) + 2; - - /* u32FIN is shifted 2 bits to avoid overflow */ - u32PllFreq = (((u32FIN >> 2) * u32NF) / (u32NR * u32NO) << 2); - - return u32PllFreq; -} - -/** - * @brief This function execute delay function. - * @param[in] us Delay time. The Max value is 2^24 / CPU Clock(MHz). Ex: - * 72MHz => 233016us, 50MHz => 335544us, - 48MHz => 349525us, 28MHz => 699050us ... - * @return None - * @details Use the SysTick to generate the delay time and the UNIT is in us. - * The SysTick clock source is from HCLK, i.e the same as system core clock. - * User can use SystemCoreClockUpdate() to calculate CyclesPerUs automatically before using this function. - */ -__STATIC_INLINE void CLK_SysTickDelay(uint32_t us) -{ - SysTick->LOAD = us * CyclesPerUs; - SysTick->VAL = (0x00); - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; - - /* Waiting for down-count to zero */ - while((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0); - - /* Disable SysTick counter */ - SysTick->CTRL = 0; -} - - -void CLK_DisableCKO(void); -void CLK_EnableCKO(uint32_t u32ClkSrc, uint32_t u32ClkDiv, uint32_t u32ClkDivBy1En); -void CLK_PowerDown(void); -void CLK_Idle(void); -uint32_t CLK_GetHXTFreq(void); -uint32_t CLK_GetHCLKFreq(void); -uint32_t CLK_GetPCLKFreq(void); -uint32_t CLK_GetCPUFreq(void); -uint32_t CLK_SetCoreClock(uint32_t u32Hclk); -void CLK_SetHCLK(uint32_t u32ClkSrc, uint32_t u32ClkDiv); -void CLK_SetModuleClock(uint32_t u32ModuleIdx, uint32_t u32ClkSrc, uint32_t u32ClkDiv); -void CLK_SetSysTickClockSrc(uint32_t u32ClkSrc); -void CLK_EnableXtalRC(uint32_t u32ClkMask); -void CLK_DisableXtalRC(uint32_t u32ClkMask); -void CLK_EnableModuleClock(uint32_t u32ModuleIdx); -void CLK_DisableModuleClock(uint32_t u32ModuleIdx); -uint32_t CLK_EnablePLL(uint32_t u32PllClkSrc, uint32_t u32PllFreq); -void CLK_DisablePLL(void); -uint32_t CLK_WaitClockReady(uint32_t u32ClkMask); -void CLK_EnableSysTick(uint32_t u32ClkSrc, uint32_t u32Count); -void CLK_DisableSysTick(void); - - -/*@}*/ /* end of group CLK_EXPORTED_FUNCTIONS */ - -/*@}*/ /* end of group CLK_Driver */ - -/*@}*/ /* end of group Standard_Driver */ - - - -#endif //__CLK_H__ - - - -/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/hal/ports/NUMICRO/LLD/CLKv1/driver.mk b/os/hal/ports/NUMICRO/LLD/CLKv1/driver.mk index 35a2681a..08740e9b 100644 --- a/os/hal/ports/NUMICRO/LLD/CLKv1/driver.mk +++ b/os/hal/ports/NUMICRO/LLD/CLKv1/driver.mk @@ -1,2 +1,2 @@ -PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/CLKv1/clk.c +PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/CLKv1/hal_clks_lld.c PLATFORMINC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/CLKv1 diff --git a/os/hal/ports/NUMICRO/LLD/CLKv1/hal_clks_lld.c b/os/hal/ports/NUMICRO/LLD/CLKv1/hal_clks_lld.c new file mode 100644 index 00000000..6f2c4acf --- /dev/null +++ b/os/hal/ports/NUMICRO/LLD/CLKv1/hal_clks_lld.c @@ -0,0 +1,511 @@ +/* + Copyright (C) 2019 /u/KeepItUnder + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file CLKv1/hal_clks_lld.c + * @brief CLK subsystem low level driver code. + * + * @addtogroup CLKS + * @{ + */ + +#include "hal.h" + +/*===========================================================================*/ +/* Driver local definitions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver exported variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local variables and types. */ +/*===========================================================================*/ + +/** + * WDT_ModuleNum + * ADC_ModuleNum + * SPI0_ModuleNum + * SPI1_ModuleNum + * SPI2_ModuleNum + * TMR0_ModuleNum + * TMR1_ModuleNum + * TMR2_ModuleNum + * TMR3_ModuleNum + * UART0_ModuleNum + * UART1_ModuleNum + * PWM01_ModuleNum + * PWM23_ModuleNum + * I2S_ModuleNum + * FDIV_ModuleNum + * WWDT_ModuleNum + * USBD_ModuleNum + * I2C0_ModuleNum + * I2C1_ModuleNum + * PS2_ModuleNum + * PDMA_ModuleNum + * ISP_ModuleNum + * + */ + +bool clks_module_hxt_source[22] = { 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; +bool clks_module_hirc_source[22] = { 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; +bool clks_module_lirc_source[22] = { 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 }; +bool clks_module_hclk_source[22] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 }; +bool clks_module_pll_source[22] = { 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; +bool clks_module_ext_source[22] = { 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +bool clks_module_divider[22] = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 }; +uint32_t clks_module_enable[22] = { CLK_APBCLK_WDT_EN_Msk, + CLK_APBCLK_ADC_EN_Msk, + CLK_APBCLK_SPI0_EN_Msk, + CLK_APBCLK_SPI1_EN_Msk, + CLK_APBCLK_SPI2_EN_Msk, + CLK_APBCLK_TMR0_EN_Msk, + CLK_APBCLK_TMR1_EN_Msk, + CLK_APBCLK_TMR2_EN_Msk, + CLK_APBCLK_TMR3_EN_Msk, + CLK_APBCLK_UART0_EN_Msk, + CLK_APBCLK_UART1_EN_Msk, + CLK_APBCLK_PWM01_EN_Msk, + CLK_APBCLK_PWM23_EN_Msk, + CLK_APBCLK_I2S_EN_Msk, + CLK_APBCLK_FDIV_EN_Msk, + 0, + CLK_APBCLK_USBD_EN_Msk, + CLK_APBCLK_I2C0_EN_Msk, + CLK_APBCLK_I2C1_EN_Msk, + CLK_APBCLK_PS2_EN_Msk, + CLK_AHBCLK_PDMA_EN_Msk, + CLK_AHBCLK_ISP_EN_Msk }; +uint32_t clks_module_sel1_mask[22] = { CLK_CLKSEL1_WDT_S_Msk, + CLK_CLKSEL1_ADC_S_Msk, + CLK_CLKSEL1_SPI0_S_Msk, + CLK_CLKSEL1_SPI1_S_Msk, + CLK_CLKSEL1_SPI2_S_Msk, + CLK_CLKSEL1_TMR0_S_Msk, + CLK_CLKSEL1_TMR1_S_Msk, + CLK_CLKSEL1_TMR2_S_Msk, + CLK_CLKSEL1_TMR3_S_Msk, + CLK_CLKSEL1_UART_S_Msk, + CLK_CLKSEL1_UART_S_Msk, + CLK_CLKSEL1_PWM01_S_Msk, + CLK_CLKSEL1_PWM23_S_Msk, + 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + +/*===========================================================================*/ +/* Driver local functions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver interrupt handlers. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver exported functions. */ +/*===========================================================================*/ + +/** + * @brief Low level CLK driver initialization. + * + * @notapi + */ + +/** @brief Set Core Clock + * + * @description Set the core system clock some reference speed (Hz). + * This should be between 25MHz and 72MHz for the NUC123SD4AN0. + * + * Use either the HXT (exact) or HIRC (nearest using 22.1184MHz) + * as the clock source. + * + */ +uint32_t clks_lld_set_core_clock(uint32_t clkCore) +{ + uint32_t stableHIRC; + + /* Read HIRC clock source stable flag */ + stableHIRC = CLK->CLKSTATUS & CLK_CLKSTATUS_OSC22M_STB_Msk; + + /* Setup __HIRC */ + CLK->PWRCON |= CLK_PWRCON_OSC22M_EN_Msk; + + clks_lld_wait_for_clock_ready(CLK_CLKSTATUS_OSC22M_STB_Msk); + + /* Use __HIRC as HCLK temporarily */ + CLK->CLKSEL0 |= CLK_CLKSEL0_HCLK_S_Msk; + CLK->CLKDIV &= (~CLK_CLKDIV_HCLK_N_Msk); + + /* Is HXT stable ? */ + if(CLK->CLKSTATUS & CLK_CLKSTATUS_XTL12M_STB_Msk) { + /* Use __HXT as PLL source */ + clkCore = clks_lld_enable_pll(CLK_PLLCON_PLL_SRC_HXT, (clkCore << 1)); + } else { + /* Use __HIRC as PLL source */ + clkCore = clks_lld_enable_pll(CLK_PLLCON_PLL_SRC_HIRC, (clkCore << 1)); + + /* Read HIRC clock source stable flag again (since we're using it now) */ + stableHIRC = CLK->CLKSTATUS & CLK_CLKSTATUS_OSC22M_STB_Msk; + } + + /* Set HCLK clock source to PLL */ + clks_lld_set_HCLK(CLK_CLKSEL0_HCLK_S_PLL, CLK_CLKDIV_HCLK(2)); + + /* Disable HIRC if HIRC was disabled before we started */ + if (stableHIRC == 0) { + CLK->PWRCON &= ~CLK_PWRCON_OSC22M_EN_Msk; + } + + /* Return actual HCLK frequency is PLL frequency divide 2 */ + return (clkCore >> 1); +} + + +/** @brief Set system HCLK + * + * @description Setup HCLK source and divider + * + * Always switch to a known stable clock source before changing a + * system clock, to avoid issues related to the original clock's + * speed/settings. + * + */ +void clks_lld_set_HCLK(uint32_t clkSource, uint32_t clkDivider) +{ + uint32_t stableHIRC; + + /* Read HIRC clock source stable flag */ + stableHIRC = CLK->CLKSTATUS & CLK_CLKSTATUS_OSC22M_STB_Msk; + + /* Setup __HIRC */ + CLK->PWRCON |= CLK_CLKSTATUS_OSC22M_STB_Msk; + + clks_lld_wait_for_clock_ready(CLK_CLKSTATUS_OSC22M_STB_Msk); + + /* Use __HIRC as HCLK, temporarily */ + CLK->CLKSEL0 = (CLK->CLKSEL0 & (~CLK_CLKSEL0_HCLK_S_Msk)) | CLK_CLKSEL0_HCLK_S_HIRC; + + /* Set new clock divider */ + CLK->CLKDIV = (CLK->CLKDIV & (~CLK_CLKDIV_HCLK_N_Msk)) | clkDivider; + + /* Switch HCLK to new HCLK source */ + CLK->CLKSEL0 = (CLK->CLKSEL0 & (~CLK_CLKSEL0_HCLK_S_Msk)) | clkSource; + + /* Update System Core Clock */ + SystemCoreClockUpdate(); + + /* Disable HIRC if HIRC was disabled before we started */ + if (stableHIRC == 0) { + CLK->PWRCON &= ~CLK_CLKSTATUS_OSC22M_STB_Msk; + } +} + + +void clks_lld_set_module_clock(uint32_t module, uint32_t clkSource, uint32_t clkDivider) +{ + /* Set clock source */ + CLK->CLKSEL1 = (CLK->CLKSEL1 & (~(clks_module_sel1_mask[module]))) | clkSource; + + /* Set secondary clock source bit for PWM01/PWM23 */ + if (module == PWM01_ModuleNum) { + CLK->CLKSEL2 = (CLK->CLKSEL2 & (~CLK_CLKSEL2_PWM01_S_Msk)) | (clkSource & CLK_CLKSEL2_PWM01_S_Msk); + } else if (module == PWM23_ModuleNum) { + CLK->CLKSEL2 = (CLK->CLKSEL2 & (~CLK_CLKSEL2_PWM23_S_Msk)) | (clkSource & CLK_CLKSEL2_PWM23_S_Msk); + } + + /* Set clock divider */ + if (clks_module_divider[module]) { + switch (module) { + case ADC_ModuleNum: + CLK->CLKDIV = (CLK->CLKDIV & ~CLK_CLKDIV_ADC_N_Msk) | clkDivider; + break; + case UART0_ModuleNum: + case UART1_ModuleNum: + CLK->CLKDIV = (CLK->CLKDIV & ~CLK_CLKDIV_UART_N_Msk) | clkDivider; + break; + case USBD_ModuleNum: + CLK->CLKDIV = (CLK->CLKDIV & ~CLK_CLKDIV_USB_N_Msk) | clkDivider; + break; + default: + break; + } + } +} + + +void clks_lld_enable_ck0(uint32_t clkSource, uint32_t clkDivider) +{ + CLK->FRQDIV = (CLK_FRQDIV_DIVIDER_EN_Msk | clkDivider) ; + + clks_lld_enable_module_clock(FDIV_ModuleNum); + + clks_lld_set_module_clock(FDIV_ModuleNum, clkSource, 0); +} + + +/** + * @brief Enable module clock + * + * @description Module clock enables are all in either AHBCLK or APBCLK + * Register masks are stored in a table to save knowing bit width + * + */ +void clks_lld_enable_module_clock(uint32_t clkModule) { + switch (clkModule) { + case PDMA_ModuleNum: + case ISP_ModuleNum: + /* AHB Clocks */ + CLK->AHBCLK |= clks_module_enable[clkModule]; + break; + case WWDT_ModuleNum: + /* No Module Clock */ + break; + default: + /* APB Clocks */ + CLK->APBCLK |= clks_module_enable[clkModule]; + break; + } +} + + +/** + * @brief Disable module clock + * + * @description Module clock enables are all in either AHBCLK or APBCLK + * Register masks are stored in a table to save knowing bit width + * + */ +void clks_lld_disable_module_clock(uint32_t clkModule) { + switch (clkModule) { + case PDMA_ModuleNum: + case ISP_ModuleNum: + /* AHB Clocks */ + CLK->AHBCLK &= ~clks_module_enable[clkModule]; + break; + case WWDT_ModuleNum: + /* No Module Clock */ + break; + default: + /* APB Clocks */ + CLK->APBCLK &= ~clks_module_enable[clkModule]; + break; + } +} + + +uint32_t clks_lld_enable_pll(uint32_t pllSrc, uint32_t pllFreq) +{ + /* Disable PLL first to avoid unstable when setting PLL. */ + CLK->PLLCON = CLK_PLLCON_PD_Msk; + + /* Check and setup correct clock source */ + switch (pllSrc) { + case CLK_PLLCON_PLL_SRC_HXT: + /* Use HXT clock */ + CLK->PWRCON |= CLK_PWRCON_XTL12M_EN_Msk; + + /* Wait for stable HXT */ + clks_lld_wait_for_clock_ready(CLK_CLKSTATUS_XTL12M_STB_Msk); + + + break; + case CLK_PLLCON_PLL_SRC_HIRC: + /* Use HIRC clock */ + CLK->PWRCON |= CLK_PWRCON_OSC22M_EN_Msk; + + /* Wait for stable HIRC */ + clks_lld_wait_for_clock_ready(CLK_CLKSTATUS_OSC22M_STB_Msk); + + break; + } + + /** + * Calculate best PLL variables from requested frequency + * + * See NUC123 Technical Reference Manual 5.4.8 PLL Control Register Description, page 124 + * + * NF 1 + * FOUT = FIN x -- x -- + * NR NO + * + */ + + uint32_t NO = 0; + uint32_t NR = 0; + uint32_t clkCalc = 0; + + /* Set "NO" for requested frequency */ + /* We're using "NO" first to set the PLLCON - so make it "NO" - 1; */ + if (pllFreq >= FREQ_25MHZ && pllFreq <= FREQ_50MHZ) { + /* Low frequency - use full variable headroom */ + pllFreq <<= 2; + NO = 3; + } else if (pllFreq > FREQ_50MHZ && pllFreq <= FREQ_100MHZ) { + /* Medium frequency - use full variable headroom */ + pllFreq <<= 1; + NO = 1; + } else if (pllFreq > FREQ_100MHZ && pllFreq <= FREQ_200MHZ) { + /* High frequency - full variable headroom already used */ + NO = 0; + } else { + /* Frequency out of range - use default PLL settings + * + * See NUC123 Technical Reference Manual PLL COntrol Register Description, page 124 + * The default value: 0xC22E + * FIN = 12 MHz + * NR = (1+2) = 3 + * NF = (46+2) = 48 + * NO = 4 + * FOUT = 12/4 x 48 x 1/3 = 48 MHz + */ + if (pllSrc == CLK_PLLCON_PLL_SRC_HXT) { + CLK->PLLCON = 0xC22E; + } else { + CLK->PLLCON = 0xD66F; + } + + /* Wait for stable PLL clock */ + clks_lld_wait_for_clock_ready(CLK_CLKSTATUS_PLL_STB_Msk); + + return clks_lld_get_pll_clock_freq(); + } + + /* Setup "NR" and clkCalc */ + switch (pllSrc) { + case CLK_PLLCON_PLL_SRC_HXT: + NR = 2; + clkCalc = __HXT; + break; + case CLK_PLLCON_PLL_SRC_HIRC: + NR = 4; + clkCalc = __HIRC; + break; + } + + /** + * Loop to calculate best/lowest NR (between 0 or 2 and 31) and best/lowest NF (between 0 and 511) + * + * Best results are off-by-2 until final equation calculation (to allow use in PLLCON) + * + */ + uint32_t bestNR = 0; + uint32_t bestNF = 0; + uint32_t minLimit = -1; + + while (NR <= 33) { + uint32_t tmpCalc1 = clkCalc / NR; + + if (tmpCalc1 > 1600000 && tmpCalc1 < 16000000) { + uint32_t NF = 2; + + while (NF <= 513) { + uint32_t tmpCalc2 = tmpCalc1 * NF; + + if (tmpCalc2 >= 100000000 && tmpCalc2 <= 200000000) { + uint32_t tmpCalc3; + + if (tmpCalc2 > pllFreq) { + tmpCalc3 = tmpCalc2 - pllFreq; + } else { + tmpCalc3 = pllFreq - tmpCalc2; + } + + if (tmpCalc3 < minLimit) { + minLimit = tmpCalc3; + bestNF = NF; + bestNR = NR; + + /* Stop NF calc loop when minLimit tends back to 0 */ + if(minLimit == 0) + break; + } + } + + NF++; + } + } + + NR++; + } + + /* Enable and apply new PLL setting. */ + CLK->PLLCON = pllSrc | (NO << 14) | ((bestNR - 2) << 9) | (bestNF - 2); + + /* Wait for stable PLL clock */ + clks_lld_wait_for_clock_ready(CLK_CLKSTATUS_PLL_STB_Msk); + + /* Return equation result */ + return (clkCalc / ((NO + 1) * bestNR) * bestNF); +} + + +/** + * @brief Wait for stable clock + * + * @description Always wait around 300ms for clock to be stable + * + */ +uint32_t clks_lld_wait_for_clock_ready(uint32_t clkMask) +{ + int32_t timeout = 2180000; + + while (timeout-- > 0) { + if ((CLK->CLKSTATUS & clkMask) == clkMask) { + return 1; + } + } + + return 0; +} + + +void clks_lld_enable_SysTick(uint32_t clkSrc, uint32_t count) { + + // Disable the counter + clks_lld_disable_SysTick(); + + // Clear current values/flags + SysTick->VAL = 0; + + // Set SysTick Clock Source + switch (clkSrc) { + case CLK_CLKSEL0_STCLK_S_HCLK: + SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk; + break; + default: + CLK->CLKSEL0 = (CLK->CLKSEL0 & ~CLK_CLKSEL0_STCLK_S_Msk) | clkSrc; + // CLK->CLKSEL0 |= SysTick_CTRL_CLKSOURCE_Msk; + break; + } + + // Set reload value + SysTick->LOAD = count; + + // Enable Interrupt and Counter + SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; +} + + +void clks_lld_disable_SysTick(void) { + /* Disable System Tick counter */ + SysTick->CTRL = 0; +} + +/** @} */ diff --git a/os/hal/ports/NUMICRO/LLD/CLKv1/hal_clks_lld.h b/os/hal/ports/NUMICRO/LLD/CLKv1/hal_clks_lld.h new file mode 100644 index 00000000..62859d6f --- /dev/null +++ b/os/hal/ports/NUMICRO/LLD/CLKv1/hal_clks_lld.h @@ -0,0 +1,222 @@ +/* + Copyright (C) 2019 /u/KeepItUnder + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file hal_clks_lld.h + * @brief Clock/Timer subsystem low level header. + * + * @addtogroup CLKS + * @{ + */ + +#ifndef HAL_CLKS_LLD_H +#define HAL_CLKS_LLD_H + +// #if HAL_USE_CLKS || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Driver constants. */ +/*===========================================================================*/ + +#define FREQ_25MHZ 25000000 +#define FREQ_50MHZ 50000000 +#define FREQ_72MHZ 72000000 +#define FREQ_100MHZ 100000000 +#define FREQ_200MHZ 200000000 + +/*---------------------------------------------------------------------------------------------------------*/ +/* CLKSEL0 */ +/*---------------------------------------------------------------------------------------------------------*/ +#define CLK_CLKSEL0_HCLK_S_HXT (0x0ul<PLLCON; + + if(PllReg & (CLK_PLLCON_PD_Msk | CLK_PLLCON_OE_Msk)) { + PllClock = 0; /* PLL is in power down mode or fix low */ + } else { + + if (PllReg & CLK_PLLCON_PLL_SRC_HIRC) { + pllFIN = __HIRC; /* Use HXT for PLL clock */ + } else { + pllFIN = __HXT; /* Use HXT for PLL clock */ + } + + if (PllReg & CLK_PLLCON_BP_Msk) { + PllClock = pllFIN; + } else { + switch (((PllReg & CLK_PLLCON_OUT_DV_Msk) >> CLK_PLLCON_OUT_DV_Pos)) { + case 0b00: // OUT_DIV == 00 : NO = 1 + pllNO = 1; + break; + case 0b11: // OUT_DIV == 11 : NO = 4 + pllNO = 4; + break; + default: // OUT_DIV == 01 or 10 : NO = 2 + pllNO = 2; + break; + } + + pllNF = ((PllReg & CLK_PLLCON_FB_DV_Msk) >> CLK_PLLCON_FB_DV_Pos) + 2; + pllNR = ((PllReg & CLK_PLLCON_IN_DV_Msk) >> CLK_PLLCON_IN_DV_Pos) + 2; + + /* shift to avoid overflow condition */ + PllClock = (((pllFIN >> 2) * pllNF) / (pllNR * pllNO) << 2); + } + } + + return PllClock; + } + + uint32_t clks_lld_set_core_clock(uint32_t clkCore); + void clks_lld_set_HCLK(uint32_t clkSource, uint32_t clkDivider); + void clks_lld_set_module_clock(uint32_t module, uint32_t clkSource, uint32_t clkDivider); + void clks_lld_enable_ck0(uint32_t clkSource, uint32_t clkDivider); + void clks_lld_enable_module_clock(uint32_t moduleIdx); + void clks_lld_disable_module_clock(uint32_t moduleIdx); + uint32_t clks_lld_enable_pll(uint32_t pllSrc, uint32_t pllFreq); + uint32_t clks_lld_wait_for_clock_ready(uint32_t clkMask); + void clks_lld_enable_SysTick(uint32_t clkSource, uint32_t count); + void clks_lld_disable_SysTick(void); + +#ifdef __cplusplus +} +#endif + +#endif /* HAL_CLK_LLD_H */ + +/** @} */ diff --git a/os/hal/ports/NUMICRO/LLD/GPIOv1/driver.mk b/os/hal/ports/NUMICRO/LLD/GPIOv1/driver.mk index 98ed4f2f..138ea830 100644 --- a/os/hal/ports/NUMICRO/LLD/GPIOv1/driver.mk +++ b/os/hal/ports/NUMICRO/LLD/GPIOv1/driver.mk @@ -1,4 +1,4 @@ -PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/GPIOv1/gpio.c +# PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/GPIOv1/gpio.c PLATFORMINC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/GPIOv1 ifeq ($(USE_SMART_BUILD),yes) diff --git a/os/hal/ports/NUMICRO/LLD/GPIOv1/gpio.c b/os/hal/ports/NUMICRO/LLD/GPIOv1/gpio.c deleted file mode 100644 index 07595518..00000000 --- a/os/hal/ports/NUMICRO/LLD/GPIOv1/gpio.c +++ /dev/null @@ -1,115 +0,0 @@ -/**************************************************************************//** - * @file gpio.c - * @version V3.00 - * $Revision: 8 $ - * $Date: 16/06/08 9:58a $ - * @brief NUC123 series GPIO driver source file - * - * @note - * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. -*****************************************************************************/ - -#include "NUC123.h" - -/** @addtogroup Standard_Driver Standard Driver - @{ -*/ - -/** @addtogroup GPIO_Driver GPIO Driver - @{ -*/ - -/** @addtogroup GPIO_EXPORTED_FUNCTIONS GPIO Exported Functions - @{ -*/ - -/** - * @brief Set GPIO operation mode - * - * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. - * @param[in] u32PinMask The single or multiple pins of specified GPIO port. \n - * It could be BIT10 ~ BIT15 for PA GPIO port. \n - * It could be BIT0 ~ BIT10 and BIT12 ~ BIT15 for PB GPIO port. \n - * It could be BIT0 ~ BIT5 and BIT8 ~ BIT13 for PC GPIO port. \n - * It could be BIT0 ~ BIT5 and BIT8 ~ BIT11 for PD GPIO port. \n - * It could be BIT0 ~ BIT3 for PF GPIO port. - * @param[in] u32Mode Operation mode. It could be : - * - \ref GPIO_PMD_INPUT, - * - \ref GPIO_PMD_OUTPUT, - * - \ref GPIO_PMD_OPEN_DRAIN, - * - \ref GPIO_PMD_QUASI - * - * @return None - * - * @details This function is used to set specified GPIO operation mode. - */ -void GPIO_SetMode(GPIO_T *port, uint32_t u32PinMask, uint32_t u32Mode) -{ - uint32_t i; - - for(i = 0; i < GPIO_PIN_MAX; i++) - { - if(u32PinMask & (1 << i)) - { - port->PMD = (port->PMD & ~(0x3 << (i << 1))) | (u32Mode << (i << 1)); - } - } -} - -/** - * @brief Enable GPIO interrupt - * - * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. - * @param[in] u32Pin The pin of specified GPIO port. \n - * It could be 10 ~ 15 for PA GPIO port. \n - * It could be 0 ~ 10 and 12 ~ 15 for PB GPIO port. \n - * It could be 0 ~ 5 and 8 ~ 13 for PC GPIO port. \n - * It could be 0 ~ 5 and 8 ~ 11 for PD GPIO port. \n - * It could be 0 ~ 3 for PF GPIO port. - * @param[in] u32IntAttribs The interrupt attribute of specified GPIO pin. It could be : - * - \ref GPIO_INT_RISING - * - \ref GPIO_INT_FALLING - * - \ref GPIO_INT_BOTH_EDGE - * - \ref GPIO_INT_HIGH - * - \ref GPIO_INT_LOW - * - * @return None - * - * @details This function is used to enable specified GPIO pin interrupt. - */ -void GPIO_EnableInt(GPIO_T *port, uint32_t u32Pin, uint32_t u32IntAttribs) -{ - port->IMD |= (((u32IntAttribs >> 24) & 0xFFUL) << u32Pin); - port->IEN |= ((u32IntAttribs & 0xFFFFFFUL) << u32Pin); -} - - -/** - * @brief Disable GPIO interrupt - * - * @param[in] port GPIO port. It could be PA, PB, PC, PD or PF. - * @param[in] u32Pin The pin of specified GPIO port. \n - * It could be 10 ~ 15 for PA GPIO port. \n - * It could be 0 ~ 10 and 12 ~ 15 for PB GPIO port. \n - * It could be 0 ~ 5 and 8 ~ 13 for PC GPIO port. \n - * It could be 0 ~ 5 and 8 ~ 11 for PD GPIO port. \n - * It could be 0 ~ 3 for PF GPIO port. - * - * @return None - * - * @details This function is used to enable specified GPIO pin interrupt. - */ -void GPIO_DisableInt(GPIO_T *port, uint32_t u32Pin) -{ - port->IMD &= ~(1UL << u32Pin); - port->IEN &= ~((0x00010001UL) << u32Pin); -} - - -/*@}*/ /* end of group GPIO_EXPORTED_FUNCTIONS */ - -/*@}*/ /* end of group GPIO_Driver */ - -/*@}*/ /* end of group Standard_Driver */ - -/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/hal/ports/NUMICRO/LLD/GPIOv1/hal_pal_lld.c b/os/hal/ports/NUMICRO/LLD/GPIOv1/hal_pal_lld.c index 161ef18f..f4e493ec 100644 --- a/os/hal/ports/NUMICRO/LLD/GPIOv1/hal_pal_lld.c +++ b/os/hal/ports/NUMICRO/LLD/GPIOv1/hal_pal_lld.c @@ -143,7 +143,7 @@ void _pal_lld_init(const PALConfig *config) { GPIOF->DOUT = config->PFData.DOUT; /* Set DeBounce conditions */ - GPIO->DBNCECON = 0x04u; + GPIO_DBNCE->DBNCECON = 0x04u; /* Enable External Crystal Oscillator pins */ SYS->GPF_MFP |= SYS_GPF_MFP_PF0_XT1_OUT | SYS_GPF_MFP_PF1_XT1_IN; @@ -170,9 +170,7 @@ void _pal_lld_setgroupmode(ioportid_t port, ioportmask_t mask, iomode_t mode) { - uint32_t nucMode; - - nucMode = 0; + uint32_t nucMode = 0; if (mode == PAL_MODE_INPUT || mode == PAL_MODE_INPUT_PULLUP) nucMode = GPIO_PMD_INPUT; @@ -183,7 +181,14 @@ void _pal_lld_setgroupmode(ioportid_t port, else nucMode = GPIO_PMD_QUASI; - GPIO_SetMode(port, mask, nucMode); + // GPIO_SetMode(port, mask, nucMode); + for (uint32_t i = 0; i < PAL_IOPORTS_WIDTH; i++) { + // for(uint32_t i = 0; i < GPIO_PINSPERPORT_MAX; i++) { + if(mask & (1 << i)) { + port->PMD = (port->PMD & ~(0x03ul << (i << 1))) | (nucMode << (i << 1)); + } + } + } #endif /* HAL_USE_PAL == TRUE */ diff --git a/os/hal/ports/NUMICRO/LLD/GPIOv1/hal_pal_lld.h b/os/hal/ports/NUMICRO/LLD/GPIOv1/hal_pal_lld.h index 11892f93..bdff726b 100644 --- a/os/hal/ports/NUMICRO/LLD/GPIOv1/hal_pal_lld.h +++ b/os/hal/ports/NUMICRO/LLD/GPIOv1/hal_pal_lld.h @@ -34,29 +34,983 @@ * @name NUC123 specific I/O mode flags * @{ */ + +/** + * @brief I/O port modes. + */ +#define GPIO_PMD_INPUT 0x00ul /*!< Input Mode */ +#define GPIO_PMD_OUTPUT 0x01ul /*!< Output Mode */ +#define GPIO_PMD_OPEN_DRAIN 0x02ul /*!< Open-Drain Mode */ +#define GPIO_PMD_QUASI 0x03ul /*!< Quasi-bidirectional Mode */ + /** * @brief NUC123 specific alternate input mode. */ -#define PAL_MODE_NUC123_ALTERNATE_INPUT 0x0UL +#define PAL_MODE_NUC123_ALTERNATE_INPUT GPIO_PMD_INPUT /** * @brief NUC123 specific alternate push-pull output mode. */ -#define PAL_MODE_NUC123_ALTERNATE_OUTPUT 0x1UL +#define PAL_MODE_NUC123_ALTERNATE_OUTPUT GPIO_PMD_OUTPUT /** @} */ /** * @brief NUC123 specific alternate output mode. */ -#define PAL_MODE_NUC123_ALTERNATE_OPEN_DRAIN 0x2UL +#define PAL_MODE_NUC123_ALTERNATE_OPEN_DRAIN GPIO_PMD_OPEN_DRAIN /** @} */ /** * @brief NUC123 specific alternate output mode. */ -#define PAL_MODE_NUC123_ALTERNATE_QUASI 0x3UL +#define PAL_MODE_NUC123_ALTERNATE_QUASI GPIO_PMD_QUASI /** @} */ + +/** + * @brief Alternate GPIO pin defines + * + * @description SYS defines for alternative GPIO pin usage (instead of general I/O) + * These are all for two sets of registers - GPx_MFP and ALT_MFP/ALT_MFP1 + * + */ + + +/** + * GPIO Port A Alternative Pin Modes + * + */ + +/* Pin 10 */ +/* GPIO */ +#define SYS_GPA_MFP_PA10_GPIO 0x0ul +#define SYS_ALT_MFP_PA10_GPIO 0x0ul +#define SYS_ALT_MFP1_PA10_GPIO NULL + +/* I2C1 SDA */ +#define SYS_GPA_MFP_PA10_I2C1_SDA (0x01ul<CLKSEL2 & (CLK_CLKSEL2_PWM01_S_EXT_Msk)) >> (CLK_CLKSEL2_PWM01_S_EXT_Pos - 2)) | (CLK->CLKSEL1 & (CLK_CLKSEL1_PWM01_S_Msk)) >> (CLK_CLKSEL1_PWM01_S_Pos); - else /* channel 2 and channel 3 */ - u32Src = ((CLK->CLKSEL2 & (CLK_CLKSEL2_PWM23_S_EXT_Msk)) >> (CLK_CLKSEL2_PWM23_S_EXT_Pos - 2)) | (CLK->CLKSEL1 & (CLK_CLKSEL1_PWM23_S_Msk)) >> (CLK_CLKSEL1_PWM23_S_Pos); - - if(u32Src == 2) - { - SystemCoreClockUpdate(); - u32PWMClockSrc = SystemCoreClock; - } - else - { - u32PWMClockSrc = u32PWMClkTbl[u32Src]; - } - - u32PWMClockSrc /= 1000; - for(; u16Prescale <= 0x100; u16Prescale++) - { - u32NearestUnitTimeNsec = (1000000 * u16Prescale * u8Divider) / u32PWMClockSrc; - if(u32NearestUnitTimeNsec < (u32UnitTimeNsec)) - { - if((u16Prescale == 0x100) && (u8Divider == 16)) //limit to the maximum unit time(nano second) - break; - if(u16Prescale == 0x100) - { - u16Prescale = 2; - u8Divider <<= 1; // clk divider could only be 1, 2, 4, 8, 16 - continue; - } - if(!((1000000 * ((u16Prescale * u8Divider) + 1)) > (u32NearestUnitTimeNsec * u32PWMClockSrc))) - break; - continue; - } - break; - } - - // Store return value here 'cos we're gonna change u8Divider & u16Prescale & u16CNR to the real value to fill into register - u16Prescale -= 1; - - // convert to real register value - u8Divider = u32PWMDividerToRegTbl[u8Divider]; - - // every two channels share a prescaler - (pwm)->PPR = ((pwm)->PPR & ~(PWM_PPR_CP01_Msk << ((u32ChannelNum >> 1) * 8))) | (u16Prescale << ((u32ChannelNum >> 1) * 8)); - (pwm)->CSR = ((pwm)->CSR & ~(PWM_CSR_CSR0_Msk << (4 * u32ChannelNum))) | (u8Divider << (4 * u32ChannelNum)); - // set PWM to edge aligned type - (pwm)->PCR &= ~(PWM_PCR_PWM01TYPE_Msk << (u32ChannelNum >> 1)); - (pwm)->PCR |= PWM_PCR_CH0MOD_Msk << (8 * u32ChannelNum); - *((__IO uint32_t *)((((uint32_t) & ((pwm)->CNR0)) + u32ChannelNum * 12))) = u16CNR; - - return (u32NearestUnitTimeNsec); -} - -/** - * @brief Configure PWM generator and get the nearest frequency in edge aligned auto-reload mode - * @param[in] pwm The pointer of the specified PWM module - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @param[in] u32Frequency Target generator frequency - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%... - * @return Nearest frequency clock in nano second - * @details This function is used to configure PWM generator and get the nearest frequency in edge aligned auto-reload mode. - * @note Since every two channels, (0 & 1), (2 & 3), shares a prescaler. Call this API to configure PWM frequency may affect - * existing frequency of other channel. - */ -uint32_t PWM_ConfigOutputChannel(PWM_T *pwm, - uint32_t u32ChannelNum, - uint32_t u32Frequency, - uint32_t u32DutyCycle) -{ - uint32_t u32Src; - uint32_t u32PWMClockSrc; - uint32_t u32PWMClkTbl[8] = {__HXT, NULL, NULL, __HIRC, NULL, NULL, NULL, __LIRC}; - uint32_t i; - uint8_t u8Divider = 1, u8Prescale = 0xFF; - /* this table is mapping divider value to register configuration */ - uint32_t u32PWMDividerToRegTbl[17] = {NULL, 4, 0, NULL, 1, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 3}; - uint16_t u16CNR = 0xFFFF; - - if(u32ChannelNum < 2)/* channel 0 and channel 1 */ - u32Src = ((CLK->CLKSEL2 & (CLK_CLKSEL2_PWM01_S_EXT_Msk)) >> (CLK_CLKSEL2_PWM01_S_EXT_Pos - 2)) | (CLK->CLKSEL1 & (CLK_CLKSEL1_PWM01_S_Msk)) >> (CLK_CLKSEL1_PWM01_S_Pos); - else /* channel 2 and channel 3 */ - u32Src = ((CLK->CLKSEL2 & (CLK_CLKSEL2_PWM23_S_EXT_Msk)) >> (CLK_CLKSEL2_PWM23_S_EXT_Pos - 2)) | (CLK->CLKSEL1 & (CLK_CLKSEL1_PWM23_S_Msk)) >> (CLK_CLKSEL1_PWM23_S_Pos); - - if(u32Src == 2) - { - SystemCoreClockUpdate(); - u32PWMClockSrc = SystemCoreClock; - } - else - { - u32PWMClockSrc = u32PWMClkTbl[u32Src]; - } - - for(; u8Divider < 17; u8Divider <<= 1) // clk divider could only be 1, 2, 4, 8, 16 - { - i = (u32PWMClockSrc / (u32Frequency)) / u8Divider; - // If target value is larger than CNR * prescale, need to use a larger divider - if(i > (0x10000 * 0x100)) - continue; - - // CNR = 0xFFFF + 1, get a prescaler that CNR value is below 0xFFFF - u8Prescale = (i + 0xFFFF) / 0x10000; - - // u8Prescale must at least be 2, otherwise the output stop - if(u8Prescale < 3) - u8Prescale = 2; - - i /= u8Prescale; - - if(i <= 0x10000) - { - if(i == 1) - u16CNR = 1; // Too fast, and PWM cannot generate expected frequency... - else - u16CNR = i; - break; - } - } - // Store return value here 'cos we're gonna change u8Divider & u8Prescale & u16CNR to the real value to fill into register - i = u32PWMClockSrc / (u8Prescale * u8Divider * u16CNR); - - u8Prescale -= 1; - u16CNR -= 1; - // convert to real register value - u8Divider = u32PWMDividerToRegTbl[u8Divider]; - - // every two channels share a prescaler - (pwm)->PPR = ((pwm)->PPR & ~(PWM_PPR_CP01_Msk << ((u32ChannelNum >> 1) * 8))) | (u8Prescale << ((u32ChannelNum >> 1) * 8)); - (pwm)->CSR = ((pwm)->CSR & ~(PWM_CSR_CSR0_Msk << (4 * u32ChannelNum))) | (u8Divider << (4 * u32ChannelNum)); - // set PWM to edge aligned type - (pwm)->PCR &= ~(PWM_PCR_PWM01TYPE_Msk << (u32ChannelNum >> 1)); - (pwm)->PCR |= PWM_PCR_CH0MOD_Msk << (8 * u32ChannelNum); - - if(u32DutyCycle) - { - *((__IO uint32_t *)((((uint32_t) & ((pwm)->CMR0)) + u32ChannelNum * 12))) = u32DutyCycle * (u16CNR + 1) / 100 - 1; - } - else - { - *((__IO uint32_t *)((((uint32_t) & ((pwm)->CMR0)) + u32ChannelNum * 12))) = 0; - } - *((__IO uint32_t *)((((uint32_t) & ((pwm)->CNR0)) + u32ChannelNum * 12))) = u16CNR; - - return(i); -} - - -/** - * @brief Start PWM module - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. - * Bit 0 is channel 0, bit 1 is channel 1... - * @return None - * @details This function is used to start PWM module. - */ -void PWM_Start(PWM_T *pwm, uint32_t u32ChannelMask) -{ - uint32_t u32Mask = 0, i; - for(i = 0; i < PWM_CHANNEL_NUM; i ++) - { - if(u32ChannelMask & (1 << i)) - { - u32Mask |= (PWM_PCR_CH0EN_Msk << (i * 8)); - } - } - (pwm)->PCR |= u32Mask; -} - -/** - * @brief Stop PWM module - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. - * Bit 0 is channel 0, bit 1 is channel 1... - * @return None - * @details This function is used to stop PWM module. - */ -void PWM_Stop(PWM_T *pwm, uint32_t u32ChannelMask) -{ - uint32_t i; - for(i = 0; i < PWM_CHANNEL_NUM; i ++) - { - if(u32ChannelMask & (1 << i)) - { - *((__IO uint32_t *)((((uint32_t) & ((pwm)->CNR0)) + i * 12))) = 0; - } - } -} - -/** - * @brief Stop PWM generation immediately by clear channel enable bit - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. - * Bit 0 is channel 0, bit 1 is channel 1... - * @return None - * @details This function is used to stop PWM generation immediately by clear channel enable bit. - */ -void PWM_ForceStop(PWM_T *pwm, uint32_t u32ChannelMask) -{ - uint32_t u32Mask = 0, i; - for(i = 0; i < PWM_CHANNEL_NUM; i ++) - { - if(u32ChannelMask & (1 << i)) - { - u32Mask |= (PWM_PCR_CH0EN_Msk << (i * 8)); - } - } - (pwm)->PCR &= ~u32Mask; -} - -/** - * @brief Enable selected channel to trigger ADC - * @param[in] pwm The pointer of the specified PWM module - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @param[in] u32Condition This parameter is not used - * @return None - * @details This function is used to enable selected channel to trigger ADC. - * @note This function is only supported when PWM operating at Center-aligned type. - */ -void PWM_EnableADCTrigger(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Condition) -{ - (pwm)->TCON |= (PWM_TCON_PWM0TEN_Msk << u32ChannelNum); -} - -/** - * @brief Disable selected channel to trigger ADC - * @param[in] pwm The pointer of the specified PWM module - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @return None - * @details This function is used to disable selected channel to trigger ADC. - */ -void PWM_DisableADCTrigger(PWM_T *pwm, uint32_t u32ChannelNum) -{ - (pwm)->TCON = ((pwm)->TCON & ~(PWM_TCON_PWM0TEN_Msk << u32ChannelNum)); -} - -/** - * @brief Clear selected channel trigger ADC flag - * @param[in] pwm The pointer of the specified PWM module - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @param[in] u32Condition This parameter is not used - * @return None - * @details This function is used to clear selected channel trigger ADC flag. - */ -void PWM_ClearADCTriggerFlag(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Condition) -{ - (pwm)->TSTATUS = (PWM_TSTATUS_PWM0TF_Msk << u32ChannelNum); -} - -/** - * @brief Get selected channel trigger ADC flag - * @param[in] pwm The pointer of the specified PWM module - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @retval 0 The specified channel trigger ADC to start of conversion flag is not set - * @retval 1 The specified channel trigger ADC to start of conversion flag is set - * @details This function is used to get PWM trigger ADC to start of conversion flag for specified channel. - */ -uint32_t PWM_GetADCTriggerFlag(PWM_T *pwm, uint32_t u32ChannelNum) -{ - return (((pwm)->TSTATUS & (PWM_TSTATUS_PWM0TF_Msk << (u32ChannelNum))) ? 1 : 0); -} - -/** - * @brief Enable capture of selected channel(s) - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. - * Bit 0 is channel 0, bit 1 is channel 1... - * @return None - * @details This function is used to enable capture of selected channel(s). - */ -void PWM_EnableCapture(PWM_T *pwm, uint32_t u32ChannelMask) -{ - uint32_t i; - for(i = 0; i < PWM_CHANNEL_NUM; i ++) - { - if(u32ChannelMask & (1 << i)) - { - if(i < 2) - { - (pwm)->CCR0 |= PWM_CCR0_CAPCH0EN_Msk << (i * 16); - } - else - { - (pwm)->CCR2 |= PWM_CCR2_CAPCH2EN_Msk << ((i - 2) * 16); - } - } - } - (pwm)->CAPENR |= u32ChannelMask; -} - -/** - * @brief Disable capture of selected channel(s) - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. - * Bit 0 is channel 0, bit 1 is channel 1... - * @return None - * @details This function is used to disable capture of selected channel(s). - */ -void PWM_DisableCapture(PWM_T *pwm, uint32_t u32ChannelMask) -{ - uint32_t i; - for(i = 0; i < PWM_CHANNEL_NUM; i ++) - { - if(u32ChannelMask & (1 << i)) - { - if(i < 2) - { - (pwm)->CCR0 &= ~(PWM_CCR0_CAPCH0EN_Msk << (i * 16)); - } - else - { - (pwm)->CCR2 &= ~(PWM_CCR2_CAPCH2EN_Msk << ((i - 2) * 16)); - } - } - } - (pwm)->CAPENR &= ~u32ChannelMask; -} - -/** - * @brief Enables PWM output generation of selected channel(s) - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. - * Set bit 0 to 1 enables channel 0 output, set bit 1 to 1 enables channel 1 output... - * @return None - * @details This function is used to enables PWM output generation of selected channel(s). - */ -void PWM_EnableOutput(PWM_T *pwm, uint32_t u32ChannelMask) -{ - (pwm)->POE |= u32ChannelMask; -} - -/** - * @brief Disables PWM output generation of selected channel(s) - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel - * Set bit 0 to 1 disables channel 0 output, set bit 1 to 1 disables channel 1 output... - * @return None - * @details This function is used to disables PWM output generation of selected channel(s). - */ -void PWM_DisableOutput(PWM_T *pwm, uint32_t u32ChannelMask) -{ - (pwm)->POE &= ~u32ChannelMask; -} - -/** - * @brief Enables PDMA transfer of selected channel(s) for PWM capture - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. - * Set bit 0 to 1 enables channel 0 output, set bit 1 to 1 enables channel 1 output... - * @param[in] u32RisingFirst The capture order is rising, falling first. Every two channels share the same setting. - * @return None - * @details This function is used to enables PDMA transfer of selected channel(s) for PWM capture - */ -void PWM_EnablePDMA(PWM_T *pwm, uint32_t u32ChannelMask, uint32_t u32RisingFirst) -{ - uint32_t i; - for(i = 0; i < PWM_CHANNEL_NUM; i ++) - { - if(u32ChannelMask & (1 << i)) - { - (pwm)->CAPPDMACTL = ((pwm)->CAPPDMACTL & ~(PWM_CAPPDMACTL_CAP0RFORDER_Msk << (i * 8))) | \ - (((u32RisingFirst << PWM_CAPPDMACTL_CAP0RFORDER_Pos) | \ - PWM_CAPPDMACTL_CAP0PDMAMOD_Msk | PWM_CAPPDMACTL_CAP0PDMAEN_Msk) << (i * 8)); - } - } -} - -/** - * @brief Disables PDMA transfer of selected channel(s) for PWM capture - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. - * Set bit 0 to 1 enables channel 0 output, set bit 1 to 1 enables channel 1 output... - * @return None - * @details This function is used to enables PDMA transfer of selected channel(s) for PWM capture - */ -void PWM_DisablePDMA(PWM_T *pwm, uint32_t u32ChannelMask) -{ - uint32_t i; - for(i = 0; i < PWM_CHANNEL_NUM; i ++) - { - if(u32ChannelMask & (1 << i)) - { - (pwm)->CAPPDMACTL &= ~(PWM_CAPPDMACTL_CAP0PDMAEN_Msk << (i * 8)); - } - } -} - -/** - * @brief Enable Dead zone of selected channel - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @param[in] u32Duration Dead Zone length in PWM clock count, valid values are between 0~0xFF, but 0 means there is no - * dead zone. - * @return None - * @details This function is used to enable Dead zone of selected channel. - */ -void PWM_EnableDeadZone(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Duration) -{ - // every two channels shares the same setting - u32ChannelNum >>= 1; - // set duration - (pwm)->PPR = ((pwm)->PPR & ~(PWM_PPR_DZI01_Msk << (8 * u32ChannelNum))) | (u32Duration << (PWM_PPR_DZI01_Pos + 8 * u32ChannelNum)); - // enable dead zone - (pwm)->PCR |= (PWM_PCR_DZEN01_Msk << u32ChannelNum); -} - -/** - * @brief Disable Dead zone of selected channel - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @return None - * @details This function is used to disable Dead zone of selected channel. - */ -void PWM_DisableDeadZone(PWM_T *pwm, uint32_t u32ChannelNum) -{ - // every two channels shares the same setting - u32ChannelNum >>= 1; - // enable dead zone - (pwm)->PCR &= ~(PWM_PCR_DZEN01_Msk << u32ChannelNum); -} - -/** - * @brief Enable capture interrupt of selected channel. - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @param[in] u32Edge Rising or falling edge to latch counter. - * - \ref PWM_CAPTURE_INT_RISING_LATCH - * - \ref PWM_CAPTURE_INT_FALLING_LATCH - * @return None - * @details This function is used to enable capture interrupt of selected channel. - */ -void PWM_EnableCaptureInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Edge) -{ - if(u32ChannelNum < 2) - (pwm)->CCR0 |= u32Edge << (u32ChannelNum * 16); - else - (pwm)->CCR2 |= u32Edge << ((u32ChannelNum - 2) * 16); - -} - -/** - * @brief Disable capture interrupt of selected channel. - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @param[in] u32Edge Rising or falling edge to latch counter. - * - \ref PWM_CAPTURE_INT_RISING_LATCH - * - \ref PWM_CAPTURE_INT_FALLING_LATCH - * @return None - * @details This function is used to disable capture interrupt of selected channel. - */ -void PWM_DisableCaptureInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Edge) -{ - if(u32ChannelNum < 2) - (pwm)->CCR0 &= ~(u32Edge << (u32ChannelNum * 16)); - else - (pwm)->CCR2 &= ~(u32Edge << ((u32ChannelNum - 2) * 16)); -} - -/** - * @brief Clear capture interrupt of selected channel. - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @param[in] u32Edge Rising or falling edge to latch counter. - * - \ref PWM_CAPTURE_INT_RISING_LATCH - * - \ref PWM_CAPTURE_INT_FALLING_LATCH - * @return None - * @details This function is used to clear capture interrupt of selected channel. - */ -void PWM_ClearCaptureIntFlag(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Edge) -{ - //clear capture interrupt flag, and clear CRLR or CFLR latched indicator - if(u32ChannelNum < 2) - (pwm)->CCR0 = ((pwm)->CCR0 & PWM_CCR_MASK) | (PWM_CCR0_CAPIF0_Msk << (u32ChannelNum * 16)) | (u32Edge << (u32ChannelNum * 16 + 5)); - else - (pwm)->CCR2 = ((pwm)->CCR2 & PWM_CCR_MASK) | (PWM_CCR2_CAPIF2_Msk << ((u32ChannelNum - 2) * 16)) | (u32Edge << ((u32ChannelNum - 2) * 16 + 5)); -} - -/** - * @brief Get capture interrupt of selected channel. - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @retval 0 No capture interrupt - * @retval 1 Rising edge latch interrupt - * @retval 2 Falling edge latch interrupt - * @retval 3 Rising and falling latch interrupt - * @details This function is used to get capture interrupt of selected channel. - */ -uint32_t PWM_GetCaptureIntFlag(PWM_T *pwm, uint32_t u32ChannelNum) -{ - if(u32ChannelNum < 2) - { - return (((pwm)->CCR0 & ((PWM_CCR0_CRLRI0_Msk | PWM_CCR0_CFLRI0_Msk) << (u32ChannelNum * 16))) >> (PWM_CCR0_CRLRI0_Pos + u32ChannelNum * 16)); - } - else - { - return (((pwm)->CCR2 & ((PWM_CCR2_CRLRI2_Msk | PWM_CCR2_CFLRI2_Msk) << ((u32ChannelNum - 2) * 16))) >> (PWM_CCR2_CRLRI2_Pos + (u32ChannelNum - 2) * 16)); - } - -} -/** - * @brief Enable duty interrupt of selected channel - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @param[in] u32IntDutyType This parameter is not used - * @return None - * @details This function is used to enable duty interrupt of selected channel. - */ -void PWM_EnableDutyInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32IntDutyType) -{ - (pwm)->PIER |= (PWM_PIER_PWMDIE0_Msk << u32ChannelNum); -} - -/** - * @brief Disable duty interrupt of selected channel - * @param[in] pwm The pointer of the specified PWM module - * - PWMA : PWM Group A - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @return None - * @details This function is used to disable duty interrupt of selected channel. - */ -void PWM_DisableDutyInt(PWM_T *pwm, uint32_t u32ChannelNum) -{ - (pwm)->PIER &= ~(PWM_PIER_PWMDIE0_Msk << u32ChannelNum); -} - -/** - * @brief Clear duty interrupt flag of selected channel - * @param[in] pwm The pointer of the specified PWM module - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @return None - * @details This function is used to clear duty interrupt flag of selected channel. - */ -void PWM_ClearDutyIntFlag(PWM_T *pwm, uint32_t u32ChannelNum) -{ - (pwm)->PIIR = PWM_PIIR_PWMDIF0_Msk << u32ChannelNum; -} - -/** - * @brief Get duty interrupt flag of selected channel - * @param[in] pwm The pointer of the specified PWM module - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @retval 0 Duty interrupt did not occur - * @retval 1 Duty interrupt occurred - * @details This function is used to get duty interrupt flag of selected channel. - */ -uint32_t PWM_GetDutyIntFlag(PWM_T *pwm, uint32_t u32ChannelNum) -{ - return (((pwm)->PIIR & (PWM_PIIR_PWMDIF0_Msk << u32ChannelNum)) ? 1 : 0); -} - -/** - * @brief Enable period interrupt of selected channel - * @param[in] pwm The pointer of the specified PWM module - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @param[in] u32IntPeriodType Period interrupt type, could be either - * - \ref PWM_PERIOD_INT_UNDERFLOW - * - \ref PWM_PERIOD_INT_MATCH_CNR - * @return None - * @details This function is used to enable period interrupt of selected channel. - * Every two channels, (0 & 1), (2 & 3), shares the period interrupt type setting. - */ -void PWM_EnablePeriodInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32IntPeriodType) -{ - (pwm)->PIER = ((pwm)->PIER & ~(PWM_PIER_INT01TYPE_Msk << (u32ChannelNum >> 1))) | \ - (PWM_PIER_PWMIE0_Msk << u32ChannelNum) | (u32IntPeriodType << (u32ChannelNum >> 1)); -} - -/** - * @brief Disable period interrupt of selected channel - * @param[in] pwm The pointer of the specified PWM module - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @return None - * @details This function is used to disable period interrupt of selected channel. - */ -void PWM_DisablePeriodInt(PWM_T *pwm, uint32_t u32ChannelNum) -{ - (pwm)->PIER &= ~(PWM_PIER_PWMIE0_Msk << u32ChannelNum); -} - -/** - * @brief Clear period interrupt of selected channel - * @param[in] pwm The pointer of the specified PWM module - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @return None - * @details This function is used to clear period interrupt of selected channel. - */ -void PWM_ClearPeriodIntFlag(PWM_T *pwm, uint32_t u32ChannelNum) -{ - (pwm)->PIIR = (PWM_PIIR_PWMIF0_Msk << u32ChannelNum); -} - -/** - * @brief Get period interrupt of selected channel - * @param[in] pwm The pointer of the specified PWM module - * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~3 - * @retval 0 Period interrupt did not occur - * @retval 1 Period interrupt occurred - * @details This function is used to get period interrupt of selected channel. - */ -uint32_t PWM_GetPeriodIntFlag(PWM_T *pwm, uint32_t u32ChannelNum) -{ - return (((pwm)->PIIR & (PWM_PIIR_PWMIF0_Msk << (u32ChannelNum))) ? 1 : 0); -} - - - -/*@}*/ /* end of group PWM_EXPORTED_FUNCTIONS */ - -/*@}*/ /* end of group PWM_Driver */ - -/*@}*/ /* end of group Standard_Driver */ - -/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/ diff --git a/os/hal/ports/NUMICRO/LLD/TIMv1/driver.mk b/os/hal/ports/NUMICRO/LLD/TIMv1/driver.mk index 07fb4225..ed3a2049 100644 --- a/os/hal/ports/NUMICRO/LLD/TIMv1/driver.mk +++ b/os/hal/ports/NUMICRO/LLD/TIMv1/driver.mk @@ -1,3 +1,4 @@ PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/TIMv1/hal_st_lld.c +PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/TIMv1/hal_pwm_lld.c #PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/TIMv1/timer.c PLATFORMINC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/TIMv1 diff --git a/os/hal/ports/NUMICRO/LLD/TIMv1/hal_pwm_lld.c b/os/hal/ports/NUMICRO/LLD/TIMv1/hal_pwm_lld.c new file mode 100644 index 00000000..634a79c9 --- /dev/null +++ b/os/hal/ports/NUMICRO/LLD/TIMv1/hal_pwm_lld.c @@ -0,0 +1,231 @@ +/* + Copyright (C) 2019 /u/KeepItUnder + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file TIMv1/hal_pwm_lld.c + * @brief PWM subsystem low level driver header. + * + * @addtogroup PWM + * @{ + */ + +#include "hal.h" + +// #if HAL_USE_PWM || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Driver local definitions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver exported variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local variables and types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local functions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver interrupt handlers. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver exported functions. */ +/*===========================================================================*/ + +/** + * @brief Low level PWM driver initialization. + * + * @notapi + */ +// void pwm_lld_init(void) { + +// } + +void pwm_lld_start(PWM_T *pwm, uint32_t mask) { + uint32_t pwmStart = 0; + + for(uint32_t i = 0; i < PWM_CHANNELS; i++) { + if (mask & (1 << i)) { + pwmStart |= (PWM_PCR_CH0EN_Msk << (i * 8)); + } + } + + (pwm)->PCR |= pwmStart; +} + + +void pwm_lld_enable_period_int(PWM_T *pwm, uint32_t pwmChannel, uint32_t periodType) { + (pwm)->PIER = ((pwm)->PIER & ~(0x01ul << (pwmChannel >> 1))) | (0x01ul << pwmChannel) | (periodType << (pwmChannel >> 1)); +} + + +void pwm_lld_disable_period_int(PWM_T *pwm, uint32_t pwmChannel) { + (pwm)->PIER &= ~(PWM_PIER_PWMIE0_Msk << pwmChannel); +} + + +uint32_t pwm_lld_get_period_int(PWM_T *pwm, uint32_t pwmChannel) { + if ((pwm)->PIIR & (0x01ul << (pwmChannel))) { + return 1; + } else { + return 0; + } +} + + +void pwm_lld_clear_period_int(PWM_T *pwm, uint32_t pwmChannel) { + (pwm)->PIIR = (0x01ul << pwmChannel); +} + + +uint32_t pwm_lld_config_output_channel(PWM_T *pwm, uint32_t channel, uint32_t freq, uint32_t duty) +{ + uint32_t regSource; + uint32_t clkSource; + uint32_t pwmClk; + uint8_t divider = 1; + uint8_t prescale = 0xFF; + uint16_t CNR = 0xFFFF; + + if (channel < 2) { + regSource = ((CLK->CLKSEL2 & (CLK_CLKSEL2_PWM01_S_Msk)) >> (CLK_CLKSEL2_PWM01_S_Pos - 2)) | (CLK->CLKSEL1 & (CLK_CLKSEL1_PWM01_S_Msk)) >> (CLK_CLKSEL1_PWM01_S_Pos); + } else { + regSource = ((CLK->CLKSEL2 & (CLK_CLKSEL2_PWM23_S_Msk)) >> (CLK_CLKSEL2_PWM23_S_Pos - 2)) | (CLK->CLKSEL1 & (CLK_CLKSEL1_PWM23_S_Msk)) >> (CLK_CLKSEL1_PWM23_S_Pos); + } + + if (regSource == 2) { + SystemCoreClockUpdate(); + clkSource = SystemCoreClock; + } else { + switch (regSource) { + case 0: + clkSource = __HXT; + break; + case 1: + case 4: + case 5: + case 6: + clkSource = 0; + break; + case 2: + SystemCoreClockUpdate(); + clkSource = SystemCoreClock; + break; + case 3: + clkSource = __HIRC; + break; + case 7: + clkSource = __LIRC; + break; + } + } + + /* Calculate best divider */ + while (divider < 17) { + pwmClk = (clkSource / (freq)) / divider; + // If pwmClk is larger than (CNR * prescale) then divider can still be bigger + if (pwmClk > (0x10000 * 0x100)) { + continue; + } + + // Set prescaler to CNR value lower than 0xFFFF + prescale = (pwmClk + 0xFFFF) / 0x10000; + + // Keep prescale bigger than 2 this loop + if (prescale < 3) { + prescale = 2; + } + + pwmClk /= prescale; + + if (pwmClk <= 0x10000) { + if (pwmClk == 1) { + CNR = 1; // Too fast, and PWM cannot generate expected frequency... + } else { + CNR = pwmClk; + } + break; + } + + divider = divider << 1; + } + + pwmClk = clkSource / (prescale * divider * CNR); + + /* Calculate PWM Registers */ + prescale -= 1; + CNR -= 1; + + /* Set final divider for output calculation */ + switch (divider) { + case 1: + divider = 4; + break; + case 4: + divider = 1; + break; + case 8: + divider = 2; + break; + case 16: + divider = 3; + break; + case 0: + case 2: + case 3: + case 5: + case 6: + case 7: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + default: + divider = 0; + break; + } + + // Prescaler is shared every two channels (01/23/etc.) + (pwm)->PPR = ((pwm)->PPR & ~(PWM_PPR_CP01_Msk << ((channel >> 1) * 8))) | (prescale << ((channel >> 1) * 8)); + (pwm)->CSR = ((pwm)->CSR & ~(PWM_CSR_CSR0_Msk << (4 * channel))) | (divider << (4 * channel)); + + // Set edge-aligned PWM + (pwm)->PCR &= ~(PWM_PCR_PWM01TYPE_Msk << (channel >> 1)); + (pwm)->PCR |= PWM_PCR_CH0MOD_Msk << (8 * channel); + + // Set PWM register values + if (duty) { + *((__IO uint32_t *)((((uint32_t) & ((pwm)->CMR0)) + channel * 12))) = duty * (CNR + 1) / 100 - 1; + } else { + *((__IO uint32_t *)((((uint32_t) & ((pwm)->CMR0)) + channel * 12))) = 0; + } + + *((__IO uint32_t *)((((uint32_t) & ((pwm)->CNR0)) + channel * 12))) = CNR; + + return(pwmClk); +} + +// #endif /* HAL_USE_PWM */ + +/** @} */ diff --git a/os/hal/ports/NUMICRO/LLD/TIMv1/hal_pwm_lld.h b/os/hal/ports/NUMICRO/LLD/TIMv1/hal_pwm_lld.h new file mode 100644 index 00000000..749b4113 --- /dev/null +++ b/os/hal/ports/NUMICRO/LLD/TIMv1/hal_pwm_lld.h @@ -0,0 +1,120 @@ +/* + Copyright (C) 2019 /u/KeepItUnder + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file TIMv1/hal_pwm_lld.h + * @brief PWM subsystem low level driver header. + * + * @addtogroup PWM + * @{ + */ + +#ifndef HAL_PWM_LLD_H +#define HAL_PWM_LLD_H + +// #if HAL_USE_PWM || defined(__DOXYGEN__) + +// #include "stm32_tim.h" + +/*===========================================================================*/ +/* Driver constants. */ +/*===========================================================================*/ + +/** + * @brief Number of PWM channels per PWM driver. + */ +#define PWM_CHANNELS (4) + +#define PWM_CH0 0x0ul +#define PWM_CH1 0x1ul +#define PWM_CH2 0x2ul +#define PWM_CH3 0x3ul + +#define PWM_EDGE_ALIGNED (0x0ul) /*!< Edge aligned */ +#define PWM_CENTER_ALIGNED (0x01ul) /*!< Center aligned */ + +#define PWM_CLK_DIV_1 (0x04ul) /*!< Divide by 1 */ +#define PWM_CLK_DIV_2 (0x0ul) /*!< Divide by 2 */ +#define PWM_CLK_DIV_4 (0x01ul) /*!< Divide by 4 */ +#define PWM_CLK_DIV_8 (0x02ul) /*!< Divide by 8 */ +#define PWM_CLK_DIV_16 (0x03ul) /*!< Divide by 16 */ + +#define PWM_PERIOD_INT_UNDERFLOW (0) /*!< Period interrupt - counter underflow */ +#define PWM_PERIOD_INT_MATCH_CNR (PWM_PIER_INT01TYPE_Msk) /*!< Period interrupt - counter matches CNR */ +#define PWM_CAPTURE_INT_RISING_LATCH (PWM_CCR0_CRL_IE0_Msk) /*!< Capture interrupt - rising latch */ +#define PWM_CAPTURE_INT_FALLING_LATCH (PWM_CCR0_CFL_IE0_Msk) /*!< Capture interrupt - falling latch */ + +/** @} */ + +/*===========================================================================*/ +/* Driver pre-compile time settings. */ +/*===========================================================================*/ + + +/*===========================================================================*/ +/* Configuration checks. */ +/*===========================================================================*/ + + +/*===========================================================================*/ +/* Driver data structures and types. */ +/*===========================================================================*/ + + +/*===========================================================================*/ +/* Driver macros. */ +/*===========================================================================*/ + + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + + +#ifdef __cplusplus +extern "C" { +#endif + // void pwm_lld_init(void); + // void pwm_lld_start(PWMDriver *pwmp); + // void pwm_lld_stop(PWMDriver *pwmp); + // void pwm_lld_enable_channel(PWMDriver *pwmp, + // pwmchannel_t channel, + // pwmcnt_t width); + // void pwm_lld_disable_channel(PWMDriver *pwmp, pwmchannel_t channel); + // void pwm_lld_enable_periodic_notification(PWMDriver *pwmp); + // void pwm_lld_disable_periodic_notification(PWMDriver *pwmp); + // void pwm_lld_enable_channel_notification(PWMDriver *pwmp, + // pwmchannel_t channel); + // void pwm_lld_disable_channel_notification(PWMDriver *pwmp, + // pwmchannel_t channel); + // void pwm_lld_serve_interrupt(PWMDriver *pwmp); + + void pwm_lld_enable_period_int(PWM_T *pwm, uint32_t pwmChannel, uint32_t periodType); + void pwm_lld_disable_period_int(PWM_T *pwm, uint32_t pwmChannel); + void pwm_lld_start(PWM_T *pwm, uint32_t mask); + void pwm_lld_clear_period_int(PWM_T *pwm, uint32_t pwmChannel); + uint32_t pwm_lld_get_period_int(PWM_T *pwm, uint32_t pwmChannel); + uint32_t pwm_lld_config_output_channel(PWM_T *pwm, uint32_t channel, uint32_t freq, uint32_t duty); + +#ifdef __cplusplus +} +#endif + +// #endif /* HAL_USE_PWM */ + +#endif /* HAL_PWM_LLD_H */ + +/** @} */ diff --git a/os/hal/ports/NUMICRO/LLD/TIMv1/hal_st_lld.c b/os/hal/ports/NUMICRO/LLD/TIMv1/hal_st_lld.c index 3c7aa331..6ffd45e3 100644 --- a/os/hal/ports/NUMICRO/LLD/TIMv1/hal_st_lld.c +++ b/os/hal/ports/NUMICRO/LLD/TIMv1/hal_st_lld.c @@ -124,19 +124,6 @@ OSAL_IRQ_HANDLER(SysTick_Handler) { osalOsTimerHandlerI(); osalSysUnlockFromISR(); - /* DEBUG Output to pin PB8 */ - //GPIO_TOGGLE(PB8); - //GPIO_TOGGLE(PD10); - //GPIO_TOGGLE(PB14); - //uint16_t quickChange = PB14; - - //pal_lld_writepad(GPIOB, 14, ~quickChange); - // if (PB14 == 0) - // palSetLine(B14); - // else - // palClearLine(B14); - //palToggleLine(B14); - OSAL_IRQ_EPILOGUE(); } #endif /* OSAL_ST_MODE == OSAL_ST_MODE_PERIODIC */ @@ -155,18 +142,16 @@ OSAL_IRQ_HANDLER(ST_HANDLER) { /* Note, under rare circumstances an interrupt can remain latched even if the timer SR register has been cleared, in those cases the interrupt is simply ignored.*/ - if (TIMER_GetIntFlag(NUC123_ST_TIM)) { - TIMER_ClearIntFlag(NUC123_ST_TIM); + if (NUC123_ST_TIM->TISR & TIMER_TISR_TIF_Msk) { + + // TIMER_ClearIntFlag(NUC123_ST_TIM); + NUC123_ST_TIM->TISR = TIMER_TISR_TIF_Msk; osalSysLockFromISR(); osalOsTimerHandlerI(); osalSysUnlockFromISR(); } - /* DEBUG Output to pin PC13 */ - //GPIO_TOGGLE(PB8); - //GPIO_TOGGLE(PD11); - OSAL_IRQ_EPILOGUE(); } #endif /* OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING */ @@ -267,18 +252,12 @@ OSAL_IRQ_HANDLER(NUC123_PDMA_HANDLER){ */ void st_lld_init(void) { - //GPIO_SetMode(PB, BIT6, GPIO_PMD_OUTPUT); - //PB6 = 1; - #if OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING /* Free running counter mode.*/ /* Enabling timer clock.*/ - //ST_ENABLE_CLOCK(); - //GPIO_SetMode(PB, BIT7, GPIO_PMD_OUTPUT); - //PB7 = 1; - TIMER_Open(ST_USE_TIMER, TIMER_CONTINUOUS_MODE, OSAL_ST_FREQUENCY); + st_lld_timer_open(ST_USE_TIMER, TIMER_MODE_CONTINUOUS, OSAL_ST_FREQUENCY); /* Initializing the counter in free running mode.*/ /* NUC123_ST_TIM->PSC = (ST_CLOCK_SRC / OSAL_ST_FREQUENCY) - 1; @@ -293,19 +272,19 @@ void st_lld_init(void) { /* IRQ enabled.*/ nvicEnableVector(ST_NUMBER, NUC123_ST_IRQ_PRIORITY); - TIMER_EnableInt(ST_USE_TIMER); + // TIMER_EnableInt(ST_USE_TIMER); + ST_USE_TIMER->TCSR |= TIMER_TCSR_IE_Msk; /* Start the Timer! */ - TIMER_Start(ST_USE_TIMER); + // TIMER_Start(ST_USE_TIMER); + ST_USE_TIMER->TCSR |= TIMER_TCSR_CEN_Msk; + #endif /* OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING */ #if OSAL_ST_MODE == OSAL_ST_MODE_PERIODIC /* Periodic systick mode, the Cortex-Mx internal systick timer is used in this mode.*/ -// GPIO_SetMode(PB, BIT8, GPIO_PMD_OUTPUT); -// PB8 = 1; - // CLK_EnableSysTick(CLK_CLKSEL0_STCLK_S_HCLK, (NUC123_HCLK / OSAL_ST_FREQUENCY) - 1); SysTick->LOAD = (NUC123_HCLK / OSAL_ST_FREQUENCY) - 1; SysTick->VAL = 0; @@ -317,30 +296,6 @@ void st_lld_init(void) { #endif /* OSAL_ST_MODE == OSAL_ST_MODE_PERIODIC */ -/* DEBUG */ - -// TIMER_Open(TIMER3, TIMER_CONTINUOUS_MODE, OSAL_ST_FREQUENCY); - -// nvicEnableVector(NUC123_TIM3_NUMBER, 0); - -// TIMER_EnableInt(TIMER3); -// TIMER_Start(TIMER3); - -// /* Enable peripheral clock */ -// CLK_EnableModuleClock(UART0_MODULE); -// CLK_EnableModuleClock(USBD_MODULE); -// CLK_EnableModuleClock(TMR0_MODULE); -// CLK_EnableModuleClock(TMR1_MODULE); -// CLK_EnableModuleClock(TMR2_MODULE); -// CLK_EnableModuleClock(TMR3_MODULE); -// // -// /* Peripheral clock source */ -// // CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_PLL, CLK_CLKDIV_UART(1)); -// CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0_S_HXT, 0); -// CLK_SetModuleClock(TMR1_MODULE, CLK_CLKSEL1_TMR1_S_HIRC, 0); -// CLK_SetModuleClock(TMR2_MODULE, CLK_CLKSEL1_TMR2_S_HCLK, 0); -// CLK_SetModuleClock(TMR3_MODULE, CLK_CLKSEL1_TMR3_S_LIRC, 0); - } #else /* OSAL_ST_MODE == OSAL_ST_MODE_NONE!!! */ @@ -348,4 +303,74 @@ void st_lld_init(void) { #endif /* OSAL_ST_MODE != OSAL_ST_MODE_NONE */ + + +uint32_t st_lld_timer_getmoduleclock(TIMER_T *timer) { + uint32_t clkSource; + + if (timer == TIMER0) { + clkSource = (CLK->CLKSEL1 & CLK_CLKSEL1_TMR0_S_Msk) >> CLK_CLKSEL1_TMR0_S_Pos; + } else if (timer == TIMER1) { + clkSource = (CLK->CLKSEL1 & CLK_CLKSEL1_TMR1_S_Msk) >> CLK_CLKSEL1_TMR1_S_Pos; + } else if (timer == TIMER2) { + clkSource = (CLK->CLKSEL1 & CLK_CLKSEL1_TMR2_S_Msk) >> CLK_CLKSEL1_TMR2_S_Pos; + } else { + clkSource = (CLK->CLKSEL1 & CLK_CLKSEL1_TMR3_S_Msk) >> CLK_CLKSEL1_TMR3_S_Pos; + } + + if (clkSource == 2) { + return(SystemCoreClock); + } + + switch (clkSource) { + case 0: // Clock source is HXT + return __HXT; + break; + case 5: // Clock source is LIRC + return __LIRC; + break; + case 7: // Clock source is HIRC + return __HIRC; + break; + default: // All other clock sources return 0 + return 0; + } +} + + +uint32_t st_lld_timer_open(TIMER_T *timer, uint32_t tmrMode, uint32_t tmrFreq) { + uint32_t tmrClk = st_lld_timer_getmoduleclock(timer); + uint32_t cmpr = 0; + uint32_t prescale = 0; + + // Fastest possible timer working freq is (tmrClk / 2). While cmpr = 2, pre-scale = 0. + if (tmrFreq > (tmrClk / 2)) { + cmpr = 2; + } else { + if (tmrClk >= 0x4000000) { + prescale = 7; // prescaler value - 1 + tmrClk >>= 3; + } else if (tmrClk >= 0x2000000) { + prescale = 3; // prescaler value - 1 + tmrClk >>= 2; // Divide Clock by 4 in preparation + } else if (tmrClk >= 0x1000000) { + prescale = 1; // prescaler value - 1 + tmrClk >>= 1; // Divide Clock by 2 in preparation + } + + cmpr = tmrClk / tmrFreq; + } + + timer->TCSR = tmrMode | prescale; + timer->TCMPR = cmpr; + + return (tmrClk / (cmpr * (prescale + 1))); +} + + +void st_lld_timer_close(TIMER_T *timer) { + timer->TCSR = 0; + timer->TEXCON = 0; +} + /** @} */ diff --git a/os/hal/ports/NUMICRO/LLD/TIMv1/hal_st_lld.h b/os/hal/ports/NUMICRO/LLD/TIMv1/hal_st_lld.h index d1d68ced..a29efd46 100644 --- a/os/hal/ports/NUMICRO/LLD/TIMv1/hal_st_lld.h +++ b/os/hal/ports/NUMICRO/LLD/TIMv1/hal_st_lld.h @@ -28,7 +28,6 @@ #define HAL_ST_LLD_H #include "mcuconf.h" -//#include "nuc123_tim.h" /* * Registry definitions. @@ -39,6 +38,16 @@ /* Driver constants. */ /*===========================================================================*/ +#define CLK_CLKSEL0_STCLK_S_HXT (0x0ul<TDR; + return (systime_t)NUC123_ST_TIM->TDR; +} + +/** + * @brief Sets the alarm time. + * + * @param[in] time the time to be set for the next alarm + * + * @notapi + */ +static inline void st_lld_set_alarm(systime_t time) { + + // TIMER_SET_CMP_VALUE(NUC123_ST_TIM, (uint32_t)time); + + NUC123_ST_TIM->TCMPR = (uint32_t)time; + +} + +/** + * @brief Returns the current alarm time. + * + * @return The currently set alarm time. + * + * @notapi + */ +static inline systime_t st_lld_get_alarm(void) { + + return (systime_t)NUC123_ST_TIM->TCMPR; } /** @@ -138,13 +177,22 @@ static inline systime_t st_lld_get_counter(void) { */ static inline void st_lld_start_alarm(systime_t time) { - //NUC123_ST_TIM->TCMP = (uint32_t)time; - //NUC123_ST_TIM->SR = 0; - //NUC123_ST_TIM->DIER = NUC123_TIM_DIER_CC1IE; - TIMER_Open(NUC123_ST_TIM, TIMER_CONTINUOUS_MODE | TIMER_TCSR_TDR_EN_Msk, TIMER_GetModuleClock(NUC123_ST_TIM)); - TIMER_SET_CMP_VALUE(NUC123_ST_TIM, (uint32_t)time); - TIMER_SET_PRESCALE_VALUE(NUC123_ST_TIM, 0); - TIMER_Start(NUC123_ST_TIM); + // NUC123_ST_TIM->TCMP = (uint32_t)time; + // NUC123_ST_TIM->SR = 0; + // NUC123_ST_TIM->DIER = NUC123_TIM_DIER_CC1IE; + + st_lld_timer_open(NUC123_ST_TIM, TIMER_MODE_CONTINUOUS | TIMER_TCSR_TDR_EN_Msk, st_lld_timer_getmoduleclock(NUC123_ST_TIM)); + + //TIMER_SET_CMP_VALUE(NUC123_ST_TIM, (uint32_t)time); + + // NUC123_ST_TIM->TCMPR = (uint32_t)time; + st_lld_set_alarm(time); + + // TIMER_SET_PRESCALE_VALUE(NUC123_ST_TIM, 0); + NUC123_ST_TIM->TCSR = (NUC123_ST_TIM->TCSR & ~TIMER_TCSR_PRESCALE_Msk) | 0; + + // TIMER_Start(NUC123_ST_TIM); + NUC123_ST_TIM->TCSR |= TIMER_TCSR_CEN_Msk; } /** @@ -154,31 +202,8 @@ static inline void st_lld_start_alarm(systime_t time) { */ static inline void st_lld_stop_alarm(void) { - TIMER_DisableInt(NUC123_ST_TIM); -} - -/** - * @brief Sets the alarm time. - * - * @param[in] time the time to be set for the next alarm - * - * @notapi - */ -static inline void st_lld_set_alarm(systime_t time) { - - TIMER_SET_CMP_VALUE(NUC123_ST_TIM, (uint32_t)time); -} - -/** - * @brief Returns the current alarm time. - * - * @return The currently set alarm time. - * - * @notapi - */ -static inline systime_t st_lld_get_alarm(void) { - - return (systime_t)NUC123_ST_TIM->TCMPR; + // TIMER_DisableInt(NUC123_ST_TIM); + NUC123_ST_TIM->TCSR &= ~TIMER_TCSR_IE_Msk; } /** @@ -192,7 +217,7 @@ static inline systime_t st_lld_get_alarm(void) { */ static inline bool st_lld_is_alarm_active(void) { - return (bool)((TIMER_GetIntFlag(NUC123_ST_TIM) & TIMER_IS_ACTIVE(NUC123_ST_TIM)) != 0); + return (bool)(((NUC123_ST_TIM->TISR & TIMER_TISR_TIF_Msk) & (NUC123_ST_TIM->TCSR & TIMER_TCSR_CACT_Msk)) != 0); } #endif /* HAL_ST_LLD_H */ diff --git a/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c b/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c index d0b1f35a..793cdb3c 100644 --- a/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c +++ b/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c @@ -1,6 +1,6 @@ /* ChibiOS - Copyright (C) 2017 Frank Zschockelt - ChibiOS - Copyright (C) 2019 /u/KeepItUnder + ChibiOS - Copyright (C) 2019 /u/KeepItUnder Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/os/hal/ports/NUMICRO/NUC123SD4AN0/hal_lld.c b/os/hal/ports/NUMICRO/NUC123SD4AN0/hal_lld.c index 9e2b5946..bad30541 100644 --- a/os/hal/ports/NUMICRO/NUC123SD4AN0/hal_lld.c +++ b/os/hal/ports/NUMICRO/NUC123SD4AN0/hal_lld.c @@ -203,7 +203,7 @@ void hal_lld_init(void) { * @special */ void NUC123_clock_init(void) { - SYS_UnlockReg(); + SystemUnlockReg(); /* Enable XT1_OUT (PF.0) and XT1_IN (PF.1) */ SYS->GPF_MFP |= SYS_GPF_MFP_PF0_XT1_OUT | SYS_GPF_MFP_PF1_XT1_IN; @@ -213,35 +213,32 @@ void NUC123_clock_init(void) { /*---------------------------------------------------------------------------------------------------------*/ /* Enable Internal RC 22.1184 MHz clock */ - CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk); - + CLK->PWRCON |= CLK_PWRCON_OSC22M_EN_Msk; + /* Waiting for Internal RC clock ready */ - CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk); + clks_lld_wait_for_clock_ready(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)); + clks_lld_set_HCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1)); /* Enable external XTAL 12 MHz clock */ - CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk); + CLK->PWRCON |= CLK_PWRCON_XTL12M_EN_Msk; /* Waiting for external XTAL clock ready */ - CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk); + clks_lld_wait_for_clock_ready(CLK_CLKSTATUS_XTL12M_STB_Msk); /* Set core clock */ - CLK_SetCoreClock(FREQ_72MHZ); + clks_lld_set_core_clock(FREQ_72MHZ); SystemCoreClock = NUC123_HCLK; - //CLK_SetSysTickClockSrc(CLK_CLKSEL0_STCLK_S_HCLK_DIV2); + clks_lld_enable_SysTick(CLK_CLKSEL0_STCLK_S_HCLK_DIV2, (NUC123_HCLK / OSAL_ST_FREQUENCY) - 1); - CLK_EnableSysTick(CLK_CLKSEL0_STCLK_S_HCLK_DIV2, (NUC123_HCLK / OSAL_ST_FREQUENCY) - 1); /* Enable module clock */ - //CLK_EnableModuleClock(UART0_MODULE); - CLK_EnableModuleClock(USBD_MODULE); + clks_lld_enable_module_clock(USBD_ModuleNum); /* Select module clock source */ - //CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1)); - CLK_SetModuleClock(USBD_MODULE, 0, CLK_CLKDIV_USB(3)); + clks_lld_set_module_clock(USBD_ModuleNum, 0, CLK_CLKDIV_USB(3)); /* TEMPORARY!!! */ /* Set GPB multi-function pins for UART0 RXD and TXD */ @@ -251,7 +248,9 @@ void NUC123_clock_init(void) { //SYS->ALT_MFP = SYS_ALT_MFP_PC13_CLKO; /* Enable CLKO (PC.13) for monitor HCLK. CLKO = HCLK/8 Hz*/ - //CLK_EnableCKO(CLK_CLKSEL2_FRQDIV_S_HCLK, 2, 0); + // clks_lld_enable_ck0(CLK_CLKSEL2_FRQDIV_S_HCLK, 2, 0); + + LOCKREG(); } /** @} */ diff --git a/os/hal/ports/NUMICRO/NUC123SD4AN0/hal_lld.h b/os/hal/ports/NUMICRO/NUC123SD4AN0/hal_lld.h index b930f6fd..c53b9f14 100644 --- a/os/hal/ports/NUMICRO/NUC123SD4AN0/hal_lld.h +++ b/os/hal/ports/NUMICRO/NUC123SD4AN0/hal_lld.h @@ -308,7 +308,7 @@ #define NUC123_PREDIV_VALUE 1 #endif -/** +/** * @brief PLL multiplier value. * @note The allowed range is 2...16. * @note The default value is calculated for a 72MHz system clock from @@ -635,64 +635,6 @@ #error "invalid NUC123_PLLNODIV value specified" #endif -/** - * @brief MCO clock before divider. - */ -// #if (NUC123_MCOSEL == NUC123_MCOSEL_NOCLOCK) || defined(__DOXYGEN__) -// #define NUC123_MCODIVCLK 0 -// #elif NUC123_MCOSEL == NUC123_MCOSEL_HSI14 -// #define NUC123_MCODIVCLK NUC123_HSI14CLK -// #elif NUC123_MCOSEL == NUC123_MCOSEL_LSI -// #define NUC123_MCODIVCLK NUC123_LSICLK -// #elif NUC123_MCOSEL == NUC123_MCOSEL_LSE -// #define NUC123_MCODIVCLK NUC123_LSECLK -// #elif NUC123_MCOSEL == NUC123_MCOSEL_SYSCLK -// #define NUC123_MCODIVCLK NUC123_SYSCLK -// #elif NUC123_MCOSEL == NUC123_MCOSEL_HSI -// #define NUC123_MCODIVCLK NUC123_HSICLK -// #elif NUC123_MCOSEL == NUC123_MCOSEL_HSE -// #define NUC123_MCODIVCLK NUC123_HSECLK -// #elif NUC123_MCOSEL == NUC123_MCOSEL_PLLDIV2 -// #if NUC123_PLLNODIV == NUC123_PLLNODIV_DIV2 -// #define NUC123_MCODIVCLK (NUC123_PLLCLKOUT / 2) -// #else -// #define NUC123_MCODIVCLK (NUC123_PLLCLKOUT / 1) -// #endif -// #elif NUC123_MCOSEL == NUC123_MCOSEL_HSI48 -// #define NUC123_MCODIVCLK NUC123_HSI48CLK -// #else -// #error "invalid NUC123_MCOSEL value specified" -// #endif - -/** - * @brief MCO output pin clock. - */ -// #if (NUC123_MCOPRE == NUC123_MCOPRE_DIV1) || defined(__DOXYGEN__) -// #define NUC123_MCOCLK NUC123_MCODIVCLK -// #elif (NUC123_MCOPRE == NUC123_MCOPRE_DIV2) && NUC123_HAS_MCO_PREDIV -// #define NUC123_MCOCLK (NUC123_MCODIVCLK / 2) -// #elif (NUC123_MCOPRE == NUC123_MCOPRE_DIV4) && NUC123_HAS_MCO_PREDIV -// #define NUC123_MCOCLK (NUC123_MCODIVCLK / 4) -// #elif (NUC123_MCOPRE == NUC123_MCOPRE_DIV8) && NUC123_HAS_MCO_PREDIV -// #define NUC123_MCOCLK (NUC123_MCODIVCLK / 8) -// #elif (NUC123_MCOPRE == NUC123_MCOPRE_DIV16) && NUC123_HAS_MCO_PREDIV -// #define NUC123_MCOCLK (NUC123_MCODIVCLK / 16) -// #elif !NUC123_HAS_MCO_PREDIV -// #error "MCO_PREDIV not available on this platform. Select NUC123_MCODIVCLK." -// #else -// #error "invalid NUC123_MCOPRE value specified" -// #endif - -/** - * @brief USB frequency. - */ -// #if (NUC123_USBSW == NUC123_USBSW_HSI48) || defined(__DOXYGEN__) -// #define NUC123_USBCLK NUC123_HSI48CLK -// #elif NUC123_USBSW == NUC123_USBSW_PCLK -// #define NUC123_USBCLK NUC123_PLLCLKOUT -// #else -// #error "invalid source selected for USB clock" -// #endif /** * @brief CEC frequency. @@ -733,30 +675,30 @@ #error "invalid source selected for USART1 clock" #endif -/** - * @brief USART2 frequency. - */ -#define NUC123_USART2CLK NUC123_PCLK +// /** +// * @brief USART2 frequency. +// */ +// #define NUC123_USART2CLK NUC123_PCLK -/** - * @brief USART3 frequency. - */ -#define NUC123_USART3CLK NUC123_PCLK +// /** +// * @brief USART3 frequency. +// */ +// #define NUC123_USART3CLK NUC123_PCLK -/** - * @brief USART4 frequency. - */ -#define NUC123_UART4CLK NUC123_PCLK +// /** +// * @brief USART4 frequency. +// */ +// #define NUC123_UART4CLK NUC123_PCLK -/** - * @brief USART5 frequency. - */ -#define NUC123_UART5CLK NUC123_PCLK +// /** +// * @brief USART5 frequency. +// */ +// #define NUC123_UART5CLK NUC123_PCLK -/** - * @brief USART6 frequency. - */ -#define NUC123_USART6CLK NUC123_PCLK +// /** +// * @brief USART6 frequency. +// */ +// #define NUC123_USART6CLK NUC123_PCLK /** * @brief Timers clock. @@ -800,6 +742,8 @@ #include "nvic.h" #include "nuc123_isr.h" //#include "nuc123_dma.h" +#include "hal_clks_lld.h" +#include "hal_pwm_lld.h" #ifdef __cplusplus extern "C" { diff --git a/os/hal/ports/NUMICRO/NUC123SD4AN0/system_NUC123.c b/os/hal/ports/NUMICRO/NUC123SD4AN0/system_NUC123.c deleted file mode 100644 index f1b8a868..00000000 --- a/os/hal/ports/NUMICRO/NUC123SD4AN0/system_NUC123.c +++ /dev/null @@ -1,79 +0,0 @@ -/**************************************************************************//** - * @file system_NUC123.c - * @version V3.0 - * $Revision: 5 $ - * $Date: 15/07/02 11:21a $ - * @brief NUC123 Series CMSIS System File - * - * @note - * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved. - * - ******************************************************************************/ -#include -#include "NUC123.h" - - -/*---------------------------------------------------------------------------- - Clock Variable definitions - *----------------------------------------------------------------------------*/ -uint32_t SystemCoreClock = __HSI; /*!< System Clock Frequency (Core Clock) */ -uint32_t CyclesPerUs = (__HSI / 1000000); /* Cycles per micro second */ -uint32_t PllClock = __HSI; /*!< PLL Output Clock Frequency */ -uint32_t gau32ClkSrcTbl[] = {__HXT, NULL, __HSI, __LIRC, NULL, NULL, NULL, __HIRC}; - - -/*---------------------------------------------------------------------------- - Clock functions - This function is used to update the variable SystemCoreClock - and must be called whenever the core clock is changed. - *----------------------------------------------------------------------------*/ -void SystemCoreClockUpdate(void) /* Get Core Clock Frequency */ -{ - uint32_t u32Freq, u32ClkSrc; - uint32_t u32HclkDiv; - - /* Update PLL Clock */ - PllClock = CLK_GetPLLClockFreq(); - - u32ClkSrc = CLK->CLKSEL0 & CLK_CLKSEL0_HCLK_S_Msk; - - if(u32ClkSrc == CLK_CLKSEL0_HCLK_S_PLL) - { - /* Use PLL clock */ - u32Freq = PllClock; - } - else if(u32ClkSrc == CLK_CLKSEL0_HCLK_S_PLL_DIV2) - { - /* Use PLL/2 clock */ - u32Freq = PllClock >> 1; - } - else - { - /* Use the clock sources directly */ - u32Freq = gau32ClkSrcTbl[u32ClkSrc]; - } - - u32HclkDiv = (CLK->CLKDIV & CLK_CLKDIV_HCLK_N_Msk) + 1; - - /* Update System Core Clock */ - SystemCoreClock = u32Freq / u32HclkDiv; - - CyclesPerUs = (SystemCoreClock + 500000) / 1000000; -} - -/*---------------------------------------------------------------------------------------------------------*/ -/* Function: SystemInit */ -/* */ -/* Parameters: */ -/* None */ -/* */ -/* Returns: */ -/* None */ -/* */ -/* Description: */ -/* The necessary initialization of system. */ -/* */ -/*---------------------------------------------------------------------------------------------------------*/ -void SystemInit(void) -{ -} diff --git a/os/hal/ports/NUMICRO/NUC123SD4AN0/system_NUC123SD4AN0.c b/os/hal/ports/NUMICRO/NUC123SD4AN0/system_NUC123SD4AN0.c new file mode 100644 index 00000000..9d84e662 --- /dev/null +++ b/os/hal/ports/NUMICRO/NUC123SD4AN0/system_NUC123SD4AN0.c @@ -0,0 +1,153 @@ +/**************************************************************************//** + * @file system_NUC123SD4AN0.c + * @brief CMSIS Cortex-M0 Device Peripheral Access Layer Source File for + * Device NUC123SD4AN0 + * @version V5.00 + * @date 13. May 2019 + ******************************************************************************/ +/* + * Copyright (c) 2019 /u/KeepItUnder. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "NUC123SD4AN0.h" + + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +/* ToDo: add here your necessary defines for device initialization + following is an example for different system frequencies */ +// #define XTAL (12000000U) /* Oscillator frequency */ + +// #define SYSTEM_CLOCK (5 * XTAL) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +/* ToDo: initialize SystemCoreClock with the system core clock frequency value + achieved after system intitialization. + This means system core clock frequency after call to SystemInit() */ +// uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Clock Frequency (Core Clock)*/ +// uint32_t CyclesPerUs = (SYSTEM_CLOCK / 1000000); /* Cycles per micro second */ +// uint32_t PllClock = SYSTEM_CLOCK; /*!< PLL Clock Frequency */ +uint32_t SystemCoreClock = __HSI; /* System Clock Frequency (Core Clock)*/ +uint32_t CyclesPerUs = (__HSI / 1000000); /* Cycles per micro second */ +uint32_t PllClock = __HSI; /*!< PLL Clock Frequency */ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ + +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ +/* ToDo: add code to calculate the system frequency based upon the current + register settings. + This function can be used to retrieve the system core clock frequeny + after user changed register sittings. */ + // SystemCoreClock = SYSTEM_CLOCK; + + uint32_t clkFreq; + uint32_t PllReg; + + uint32_t pllFIN, pllNF, pllNR, pllNO; + + /* Update PLL Clock */ + // PllClock = clks_lld_get_pll_clock_freq(); + PllReg = CLK->PLLCON; + + if(PllReg & (CLK_PLLCON_PD_Msk | CLK_PLLCON_OE_Msk)) { + PllClock = 0; /* PLL is off. */ + } else { + + if (PllReg & 0x00080000ul) { + pllFIN = __HIRC; /* Use HXT for PLL clock */ + } else { + pllFIN = __HXT; /* Use HXT for PLL clock */ + } + + if (PllReg & CLK_PLLCON_BP_Msk) { + PllClock = pllFIN; + } else { + switch (((PllReg & CLK_PLLCON_OUT_DV_Msk) >> CLK_PLLCON_OUT_DV_Pos)) { + case 0b00: /* OUT_DIV == 00 : NO = 1 */ + pllNO = 1; + break; + case 0b11: /* OUT_DIV == 11 : NO = 4 */ + pllNO = 4; + break; + default: /* OUT_DIV == 01 or 10 : NO = 2 */ + pllNO = 2; + break; + } + + pllNF = ((PllReg & CLK_PLLCON_FB_DV_Msk) >> CLK_PLLCON_FB_DV_Pos) + 2; + pllNR = ((PllReg & CLK_PLLCON_IN_DV_Msk) >> CLK_PLLCON_IN_DV_Pos) + 2; + + /* Shift right to avoid overflow condition */ + PllClock = (((pllFIN >> 2) * pllNF) / (pllNR * pllNO) << 2); + } + } + + /* Pick Clock Source */ + switch (CLK->CLKSEL0 & CLK_CLKSEL0_HCLK_S_Msk) { + case 0: // External HF Xtal + clkFreq = __HXT; + break; + case 1: // PLL clock / 2 + clkFreq = PllClock >> 1; + break; + case 3: // Internal 10kHz + clkFreq = __LIRC; + break; + case 2: // PLL clock + clkFreq = PllClock; + break; + case 7: // Internal 22.184MHz + clkFreq = __HIRC; + break; + default: + clkFreq = NULL; + break; + } + + SystemCoreClock = clkFreq / ((CLK->CLKDIV & CLK_CLKDIV_HCLK_N_Msk) + 1); + // CyclesPerUs = (SystemCoreClock + 500000) / 1000000; + CyclesPerUs = SystemCoreClock / 1000000; +} + + +void SystemInit (void) +{ +/* ToDo: add code to initialize the system + do not use global variables because this function is called before + reaching pre-main. RW section maybe overwritten afterwards. */ + // SystemCoreClock = SYSTEM_CLOCK; +} + + +void SystemUnlockReg(void) +{ + while(SYS->REGWRPROT != SYS_REGWRPROT_REGPROTDIS_Msk) + { + SYS->REGWRPROT = 0x59ul; + SYS->REGWRPROT = 0x16ul; + SYS->REGWRPROT = 0x88ul; + } +} From 469b5a35c27e007eff31161bc043c3ad419dbeea Mon Sep 17 00:00:00 2001 From: Reza Jelveh Date: Fri, 6 Nov 2020 17:43:06 +0800 Subject: [PATCH 3/3] Nuvoton NUC123SD4AN0 build fix --- .../compilers/GCC/mk/startup_NUC123SD4AN0.mk | 19 ++++++++ .../compilers/GCC/mk/startup_nuc123sd4an0.mk | 12 ------ os/hal/ports/NUMICRO/NUC123SD4AN0/platform.mk | 43 +++++++++---------- 3 files changed, 40 insertions(+), 34 deletions(-) create mode 100644 os/common/startup/ARMCMx/compilers/GCC/mk/startup_NUC123SD4AN0.mk delete mode 100644 os/common/startup/ARMCMx/compilers/GCC/mk/startup_nuc123sd4an0.mk diff --git a/os/common/startup/ARMCMx/compilers/GCC/mk/startup_NUC123SD4AN0.mk b/os/common/startup/ARMCMx/compilers/GCC/mk/startup_NUC123SD4AN0.mk new file mode 100644 index 00000000..f19c9270 --- /dev/null +++ b/os/common/startup/ARMCMx/compilers/GCC/mk/startup_NUC123SD4AN0.mk @@ -0,0 +1,19 @@ +# List of the ChibiOS generic NUC123SD4AN0 startup and CMSIS files. +STARTUPSRC = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/crt1.c + +STARTUPASM = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/crt0_v6m.S \ + $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/vectors.S + +STARTUPINC = $(CHIBIOS_CONTRIB)/os/common/startup/ARMCMx/devices/NUC123SD4AN0 \ + $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/ld \ + $(CHIBIOS)/os/common/ext/CMSIS/include \ + $(CHIBIOS)/os/common/ext/ARM/CMSIS/Core/Include \ + $(CHIBIOS_CONTRIB)/os/common/ext/CMSIS/Nuvoton/NUMICRO + +STARTUPLD = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/ld +STARTUPLD_CONTRIB = $(CHIBIOS_CONTRIB)/os/common/startup/ARMCMx/compilers/GCC/ld + +# Shared variables +ALLXASMSRC += $(STARTUPASM) +ALLCSRC += $(STARTUPSRC) +ALLINC += $(STARTUPINC) diff --git a/os/common/startup/ARMCMx/compilers/GCC/mk/startup_nuc123sd4an0.mk b/os/common/startup/ARMCMx/compilers/GCC/mk/startup_nuc123sd4an0.mk deleted file mode 100644 index 927befaf..00000000 --- a/os/common/startup/ARMCMx/compilers/GCC/mk/startup_nuc123sd4an0.mk +++ /dev/null @@ -1,12 +0,0 @@ -# List of the ChibiOS generic NUC123SD4AN0 startup and CMSIS files. -STARTUPSRC = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/crt1.c \ - $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/vectors.c - -STARTUPASM = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/crt0_v6m.S - -STARTUPINC = $(CHIBIOS_CONTRIB)/os/common/startup/ARMCMx/compilers/GCC \ - $(CHIBIOS_CONTRIB)/os/common/startup/ARMCMx/devices/NUC123SD4AN0 \ - $(CHIBIOS)/os/common/ext/CMSIS/include \ - $(CHIBIOS_CONTRIB)/os/common/ext/CMSIS/Nuvoton/NUMICRO - -STARTUPLD = $(CHIBIOS_CONTRIB)/os/common/startup/ARMCMx/compilers/GCC/ld diff --git a/os/hal/ports/NUMICRO/NUC123SD4AN0/platform.mk b/os/hal/ports/NUMICRO/NUC123SD4AN0/platform.mk index 513addd6..ee94b4e0 100644 --- a/os/hal/ports/NUMICRO/NUC123SD4AN0/platform.mk +++ b/os/hal/ports/NUMICRO/NUC123SD4AN0/platform.mk @@ -1,22 +1,21 @@ -# Required platform files. -PLATFORMSRC := $(CHIBIOS)/os/hal/ports/common/ARMCMx/nvic.c \ - $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/NUC123SD4AN0/hal_lld.c \ - $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/NUC123SD4AN0/system_NUC123.c - -# Required include directories. -PLATFORMINC := $(CHIBIOS)/os/hal/ports/common/ARMCMx \ - $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/NUC123SD4AN0 \ - $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD - -# Optional platform files. -ifeq ($(USE_SMART_BUILD),yes) -HALCONF := $(strip $(shell cat halconf.h | egrep -e "\#define")) - -endif - -# Drivers compatible with the platform. -include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/CLKv1/driver.mk -include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/GPIOv1/driver.mk -include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/TIMv1/driver.mk -include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/PWMv1/driver.mk -include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/USBv1/driver.mk +# Required platform files. +PLATFORMSRC := $(CHIBIOS)/os/hal/ports/common/ARMCMx/nvic.c \ + $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/NUC123SD4AN0/hal_lld.c \ + $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/NUC123SD4AN0/system_NUC123SD4AN0.c + +# Required include directories. +PLATFORMINC := $(CHIBIOS)/os/hal/ports/common/ARMCMx \ + $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/NUC123SD4AN0 \ + $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD + +# Optional platform files. +ifeq ($(USE_SMART_BUILD),yes) +HALCONF := $(strip $(shell cat halconf.h | egrep -e "\#define")) + +endif + +# Drivers compatible with the platform. +include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/CLKv1/driver.mk +include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/GPIOv1/driver.mk +include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/TIMv1/driver.mk +include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/USBv1/driver.mk