You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

252 lines
9.4 KiB

/*********************************************************
*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