|
|
/*********************************************************
*Copyright (C), 2015, Shanghai Eastsoft Microelectronics Co., Ltd. *文件名: lib_scu.h *作 者: AE Team *版 本: V1.01 *日 期: 2021/06/09 *描 述: SCU模块库函数头文件 *备 注: 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。 **********************************************************/ #ifndef __LIBSCU_H__
#define __LIBSCU_H__
#include "ES8P5066.h"
#include "lib_gpio.h"
#include "type.h"
/* NMI不可屏蔽中断选择 */ typedef enum { SCU_NMIIRQ_PINT0 = 0, SCU_NMIIRQ_PINT1 = 1, SCU_NMIIRQ_PINT2 = 2, SCU_NMIIRQ_PINT3 = 3, SCU_NMIIRQ_PINT4 = 4, SCU_NMIIRQ_PINT5 = 5, SCU_NMIIRQ_PINT6 = 6, SCU_NMIIRQ_PINT7 = 7, SCU_NMIIRQ_T16N0 = 8, SCU_NMIIRQ_T16N1 = 9, SCU_NMIIRQ_T16N2 = 10, SCU_NMIIRQ_T16N3 = 11, SCU_NMIIRQ_T32N0 = 12, SCU_NMIIRQ_WWDTINT = 15, SCU_NMIIRQ_IWDTINT = 16, SCU_NMIIRQ_KINT = 18, SCU_NMIIRQ_ADCINT = 19, SCU_NMIIRQ_LVDINT = 21, SCU_NMIIRQ_UART0 = 23, SCU_NMIIRQ_UART1 = 24, SCU_NMIIRQ_UART2 = 25, SCU_NMIIRQ_SPI1INT = 28, SCU_NMIIRQ_IIC0INT = 29, SCU_NMIIRQ_CCMINT = 31, } SCU_TYPE_NMICS;
/* PWRC复位状态寄存器标志位 */ typedef enum { SCU_PWRC_PORF = (1 << 0), /* POR总复位标志 */ SCU_PWRC_PORRCF = (1 << 1), /* PORRC复位标志 */ SCU_PWRC_PORRSTF = (1 << 2), /* PORRST复位标志 */ SCU_PWRC_BORF = (1 << 3), /* BOR复位标志 */ SCU_PWRC_WDTRSTF = (1 << 4), /* WDT复位标志 */ SCU_PWRC_MRSTF = (1 << 5), /* MRSTn丢失标志位 */ SCU_PWRC_SOFTRSTF = (1 << 6), /* 软件丢失标志位 */ SCU_PWRC_POR_LOST = (1 << 7), /* POR丢失标志位 */ SCU_PWRC_CFGRST = (1 << 8), /* 配置字读取 */ SCU_PWRC_LKRSTF = (1 << 9), /* LOCKUP复位 */ } SCU_TYPE_PWRC;
/* LVD寄存器标志位 */ typedef enum { SCU_LVDFlag_IF = (1 << 8), /* LVD中断标志 */ SCU_LVDFlag_IE = (1 << 9), /* LVD中断使能标志 */ SCU_LVDFlag_Out = (1 << 15), /* 输出状态位 */ } SCU_TYPE_LVDCON;
/* 时钟选择 */ typedef enum { SCU_CLK_HRC = 0x0, /* HRC时钟 */ SCU_CLK_LRC = 0x1, /* LRC时钟:32KHZ */ SCU_CLK_XTAL = 0x2, /* XTAL时钟 */ } SCU_TYPE_SYSCLK;
/* 外设时钟 */ typedef enum { SCU_SUCCLK = 0x00000001, SCU_GPIOCLK = 0x00000002, SCU_IAPCLK = 0x00000004, SCU_RESERVED0 = 0x00000008, SCU_ADCCLK = 0x00000010, SCU_RESERVED1 = 0x00000020, SCU_WWDTCLK = 0x00000040, SCU_IWDTCLK = 0x00000080, SCU_T16N0CLK = 0x00000100, SCU_T16N1CLK = 0x00000200, SCU_T16N2CLK = 0x00000400, SCU_T16N3CLK = 0x00000800, SCU_T32N0CLK = 0x00001000, SCU_RESERVED2 = 0x00002000, SCU_RESERVED3 = 0x00004000, SCU_RESERVED4 = 0x00008000, SCU_UART0CLK = 0x00010000, SCU_UART1CLK = 0x00020000, SCU_UART2CLK = 0x00040000, SCU_RESERVED5 = 0x00080000, SCU_RESERVED6 = 0x00100000, SCU_RESERVED7 = 0x00200000, SCU_RESERVED8 = 0x00400000, SCU_RESERVED9 = 0x00800000, SCU_RESERVED10 = 0x01000000, SCU_SPI1CLK = 0x02000000, SCU_RESERVED11 = 0x04000000, SCU_RESERVED12 = 0x08000000, SCU_I2C0CLK = 0x10000000, } SUC_TYPE_Periph;
/* HRC时钟输出频率旋择 */ typedef enum { SCU_HRC_2M = 0x0, /* HRC时钟输出为2MHz */ SCU_HRC_16M = 0x1, /* HRC时钟输出为16Mhz */ SCU_HRC_32M = 0x2, /* HRC时钟输出为32Mhz */ SCU_HRC_48M = 0x3, /* HRC时钟输出为48Mhz */ } SCU_HRC_FRE;
/************SCU模块宏定义***********/
/* SCU写保护控制 */ #define SCU_RegUnLock() (SCU->PROT.Word = 0x55AA6996)
#define SCU_RegLock() (SCU->PROT.Word = 0x00000000)
/* NMI使能控制 */ #define SCU_NMI_Enable() (SCU->NMICON.NMIEN = 0x1)
#define SCU_NMI_Disable() (SCU->NMICON.NMIEN = 0x0)
/*-------LVD模块-------*/
/* LVD使能控制 */ #define SCU_LVD_Enable() (SCU->LVDCON.EN = 0x1)
#define SCU_LVD_Disable() (SCU->LVDCON.EN = 0x0)
/* LVD滤波使能控制 */ #define SCU_LVDFLT_Enable() (SCU->LVDCON.FLTEN = 0x1)
#define SCU_LVDFLT_Disable() (SCU->LVDCON.FLTEN = 0x0)
/* LVD触发电压选择 */ #define SCU_LVDVS_2V2() (SCU->LVDCON.VS = 0x0)
#define SCU_LVDVS_2V4() (SCU->LVDCON.VS = 0x1)
#define SCU_LVDVS_2V6() (SCU->LVDCON.VS = 0x2)
#define SCU_LVDVS_2V8() (SCU->LVDCON.VS = 0x3)
#define SCU_LVDVS_3V() (SCU->LVDCON.VS = 0x4)
#define SCU_LVDVS_3V6() (SCU->LVDCON.VS = 0x5)
#define SCU_LVDVS_4V1() (SCU->LVDCON.VS = 0x6)
#define SCU_LVDVS_4V7() (SCU->LVDCON.VS = 0x7)
/* LVD中断使能控制 */ #define SCU_LVDIT_Enable() (SCU->LVDCON.IE = 0x1)
#define SCU_LVDIT_Disable() (SCU->LVDCON.IE = 0x0)
/* LVD中断标志位清除 */ #define SCU_LVDClearIFBit() (SCU->LVDCON.Word |= 0x01 << 8)
/* LVD中断产生模式选择 */ #define SCU_LVDIFS_Rise() (SCU->LVDCON.IFS = 0x0) /* LVDO上升沿产生中断 */
#define SCU_LVDIFS_Fall() (SCU->LVDCON.IFS = 0x1) /* LVDO下降沿产生中断 */
#define SCU_LVDIFS_High() (SCU->LVDCON.IFS = 0x2) /* LVDO高电平产生中断 */
#define SCU_LVDIFS_Low() (SCU->LVDCON.IFS = 0x3) /* LVDO低电平产生中断 */
#define SCU_LVDIFS_Change() (SCU->LVDCON.IFS = 0x4) /* LVDO电平变化产生中断 */
#define SCU_LVDIFS_Get() (SCU->LVDCON.IFS) /* 获取LVDO的值 */
/* LVD输出状态获取 */ #define SCU_LVDO_Get() (SCU->LVDCON.LVDO) /* 被监测电压高于电压阈值返回0 */
/* 系统唤醒时间控制 */ #define SCU_WAKEUPTIME(X) (SCU->WAKEUPTIME.WAKEUPTIME = ((X) & 0xFFF))
/* 深度睡眠下系统时钟控制 */ #define SCU_MOSC_EN(X) (SCU->WAKEUPTIME.MOSC_EN = ((X) & 0x1))
/* 系统时钟滤波器使能 */ #define SCU_CLKFLT_EN(X) (SCU->WAKEUPTIME.CLKFLT_EN = ((X) & 0x1))
/* VR工作时钟控制 */ #define SCU_VROSCEN(X) (SCU->WAKEUPTIME.VROSCEN = ((X) & 0x1))
/* 深度睡眠下SRAM低功耗使能 */ #define SCU_STPRTNEN(X) (SCU->WAKEUPTIME.STPRTNEN = ((X) & 0x1))
/* 深度睡眠下LDO电压输出 */ #define SCU_LDOLP_VOSEL(X) (SCU->WAKEUPTIME.LDOLP_VOSEL = ((X) & 0x11))
/* 深度睡眠下LDO低功耗使能 */ #define SCU_LP_STOP(X) (SCU->WAKEUPTIME.LP_STOP = ((X) & 0x1))
/* 深度睡眠下BG低功耗使能 */ #define SCU_BG_STOP(X) (SCU->WAKEUPTIME.BG_STOP = ((X) & 0x1))
/* 深度睡眠下FLASH STOP使能 */ #define SCU_FLS_STOP(X) (SCU->WAKEUPTIME.FLS_STOP = ((X) & 0x1))
/* FLASH访问等待时间选择 */ #define SCU_FlashWait_1Tclk() (SCU->FLASHWAIT.ACCT = 0x0)
#define SCU_FlashWait_2Tclk() (SCU->FLASHWAIT.ACCT = 0x1)
#define SCU_FlashWait_3Tclk() (SCU->FLASHWAIT.ACCT = 0x2)
#define SCU_FlashWait_4Tclk() (SCU->FLASHWAIT.ACCT = 0x3)
#define SCU_FlashWait_5Tclk() (SCU->FLASHWAIT.ACCT = 0x4)
#define SCU_FlashWait_6Tclk() (SCU->FLASHWAIT.ACCT = 0x5)
#define SCU_FlashWait_7Tclk() (SCU->FLASHWAIT.ACCT = 0x6)
#define SCU_FlashWait_8Tclk() (SCU->FLASHWAIT.ACCT = 0x7)
#define SCU_FlashWait_9Tclk() (SCU->FLASHWAIT.ACCT = 0x8)
#define SCU_FlashWait_10Tclk() (SCU->FLASHWAIT.ACCT = 0x9)
#define SCU_FlashWait_11Tclk() (SCU->FLASHWAIT.ACCT = 0xA)
#define SCU_FlashWait_12Tclk() (SCU->FLASHWAIT.ACCT = 0xB)
#define SCU_FlashWait_13Tclk() (SCU->FLASHWAIT.ACCT = 0xC)
#define SCU_FlashWait_14Tclk() (SCU->FLASHWAIT.ACCT = 0xD)
#define SCU_FlashWait_15Tclk() (SCU->FLASHWAIT.ACCT = 0xE)
#define SCU_FlashWait_16Tclk() (SCU->FLASHWAIT.ACCT = 0xF)
/* 系统时钟后分频选择 */ #define SCU_SysClk_Div1() (SCU->SCLKEN0.SYSCLK_DIV = 0)
#define SCU_SysClk_Div2() (SCU->SCLKEN0.SYSCLK_DIV = 1)
#define SCU_SysClk_Div4() (SCU->SCLKEN0.SYSCLK_DIV = 2)
#define SCU_SysClk_Div8() (SCU->SCLKEN0.SYSCLK_DIV = 3)
#define SCU_SysClk_Div16() (SCU->SCLKEN0.SYSCLK_DIV = 4)
#define SCU_SysClk_Div32() (SCU->SCLKEN0.SYSCLK_DIV = 5)
#define SCU_SysClk_Div64() (SCU->SCLKEN0.SYSCLK_DIV = 6)
#define SCU_SysClk_Div128() (SCU->SCLKEN0.SYSCLK_DIV = 7)
/* 外部时钟低功耗模式 */ #define SCU_XTAL_LP_Enable() (SCU->SCLKEN0.XTAL_LP = 0)
#define SCU_XTAL_LP_Disable() (SCU->SCLKEN0.XTAL_LP = 1)
/* 中断向量表重映射使能控制 */ #define SCU_TBLRemap_Enable() (SCU->TBLREMAPEN.EN= 1)
#define SCU_TBLRemap_Disable() (SCU->TBLREMAPEN.EN= 0)
/* 中断向量表偏移寄存器 x最大为2^24=16777216 */ #define SCU_TBL_Offset(x) (SCU->TBLOFF.TBLOFF = (uint32_t)x)
/************SCU模块函数声明***********/ void SCU_NMISelect(SCU_TYPE_NMICS NMI_Type); FlagStatus SCU_GetPWRCFlagStatus(SCU_TYPE_PWRC PWRC_Flag); void SCU_ClearPWRCFlagBit(SCU_TYPE_PWRC PWRC_Flag); void SCU_OpenXTAL(void); FlagStatus SCU_GetLVDFlagStatus(SCU_TYPE_LVDCON LVD_Flag); void SCU_SysClkSelect(SCU_TYPE_SYSCLK Sysclk); SCU_TYPE_SYSCLK SCU_GetSysClk(void); void DeviceClockAllEnable(void); void DeviceClockAllDisable(void); void DeviceClockAllEnableButIAP(void); void DeviceClock_Config(SUC_TYPE_Periph tppe_periph, TYPE_FUNCEN NewState); void HRC_Config(TYPE_FUNCEN hrc_en, SCU_HRC_FRE hrc_fre, TYPE_FUNCEN sys_hrc); void SCU_MultTimerEnable(SCU_TIMEREN_Typedef SCU_TimerMask); void SCU_MultTimerDisable(SCU_TIMERDIS_Typedef SCU_TimerMask);
#endif
|