Clock.c 7.14 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

#include "r_typedefs.h"
#include "dr7f701441.dvf.h"
#include "r_dev_clk_types.h"
#include "r_dev_api.h"
#include "Clock.h"
#include "GPIO.h"
#include "Watchdog.h"
#include "TYW_FLASH.h"
#include "RTC.h"
#include "rh850_macros.h"

extern uint32_t TestBackupRam;

#define CLOCK_PROTECTED_WRITE(preg, pstatus, reg, value) \
	do                                                   \
	{                                                    \
		(preg) = 0xA5U;                                  \
		(reg) = (value);                                 \
		(reg) = ~(value);                                \
		(reg) = (value);                                 \
	} while ((pstatus) == 1U)

static const r_dev_ClkGenConfig_t g_stClockGenCfg =
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
{
    /*mainosc*/
    {
        /* FrequencyHz */ R_DEV_MOSC_FRQ_HZ,
        /* StabiTimeNs */ 400000UL,
        /* Gain        */ 3U,
        /* Running     */ 1U,
        /* StpReqMsk   */ 1U,
    },

    /*subosc*/
    {
        /* FrequencyHz */ 32768UL,
        /* Running     */ 0U,
        /* StpReqMsk   */ 0U,
    },

    /* PLL */
    {
        /*PLL0*/
        {
            /* Mode        */ R_DEV_PLL_SSCG,
            /* DithMode    */ R_DEV_PLL_DITH_DOWN,
            /* DithRange   */ 3U,
            /* ModFreq     */ 50UL,
            /* FrequencyHz */ 480UL * 1000UL * 1000UL,
            /* StabiTimeNs */ 40000UL,
            /* StpReqMsk   */ 0U,
        },

        /*PLL1*/
        {
            /* Mode        */ R_DEV_PLL_ON,
            /* DithMode    */ R_DEV_PLL_DITH_FIXED,
            /* DithRange   */ 0U,
            /* ModFreq     */ 0UL,
            /* FrequencyHz */ 480UL * 1000UL * 1000UL,
            /* StabiTimeNs */ 40000UL,
            /* StpReqMsk   */ 0U,
        },

        /*PLL2*/
        {
            /* Mode        */ R_DEV_PLL_OFF,
            /* DithMode    */ R_DEV_PLL_DITH_FIXED,
            /* DithRange   */ 0U,
            /* ModFreq     */ 0UL,
            /* FrequencyHz */ 0UL,
            /* StabiTimeNs */ 0UL,
            /* StpReqMsk   */ 0U,
        },
    },

    /* ROSC */
    /* RoscStpReqMsk */ 1U,

    /* BusEnable */
    {
        /* R_DEV_CLK_PLL0    */ 1U,
        /* R_DEV_CLK_PLL1    */ 1U,
        /* R_DEV_CLK_PLL2    */ 0U,
        /* R_DEV_CLK_PLL0PIX */ 1U,
        /* R_DEV_CLK_SDRB    */ 1U,
        /* R_DEV_CLK_ETNBP   */ 1U,
        /* R_DEV_CLK_MLBP    */ 1U,
        /* R_DEV_CLK_RSCANP  */ 1U,
        /* R_DEV_CLK_XCC     */ 1U,
        /* R_DEV_CLK_ETNBXCC */ 1U,
        /* R_DEV_CLK_MLBXCC  */ 1U,
    },
95 96 97
};

static const r_dev_ClkSelConfig_t g_stClkSelectionCfg[] =
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
    /*   Cks                   SrcId                Div  StpReqMsk      */
{
    /* {R_DEV_CKS_RSCAN, R_DEV_CKS_SRC_PLLFIX, } */
    {R_DEV_CKS_RSCANXIN, R_DEV_CKS_SRC_MOSC, 1, 0u},
    {R_DEV_CKS_WDT0, R_DEV_CKS_SRC_LRNG, 256, 0u},
    {R_DEV_CKS_RTC, R_DEV_CKS_SRC_MOSC, 2, 0u},
    {R_DEV_CKS_OSTM, R_DEV_CKS_SRC_MOSC, 2, 0u},
    {R_DEV_CKS_CLKJIT, R_DEV_CKS_SRC_DIV, 6, 0u},
    {R_DEV_CKS_PLLFIX, R_DEV_CKS_SRC_PLL1, 1, 0u},
    {R_DEV_CKS_CLKFIX, R_DEV_CKS_SRC_DIV, 6, 0u},
    {R_DEV_CKS_CPU, R_DEV_CKS_SRC_PLL0, 2, 0u},
    {R_DEV_CKS_SFMA, R_DEV_CKS_SRC_PLL0, 3, 0u},
    {R_DEV_CKS_SSIF, R_DEV_CKS_SRC_PLLFIX, 156, 0u},

    /* delimiter - do not remove */
    {R_DEV_CKS_LAST, R_DEV_CKS_SRC_MOSC, 2, 0u},
114 115 116 117
};

void Clock_Pre_Init(void)
{
118 119
    /* use the config, call Clock Gen Init */
    R_DEV_ClkGenInit((r_dev_ClkGenConfig_t *)(&g_stClockGenCfg), g_stClkSelectionCfg);
120

121 122
    /* use the config, store settings (needs to be repeated after low init */
    R_DEV_ClkGenInitStore((r_dev_ClkGenConfig_t *)(&g_stClockGenCfg));
123 124 125 126
}

void Clock_Init(void)
{
127 128
    /* use the config, store settings */
    R_DEV_ClkGenInitStore((r_dev_ClkGenConfig_t *)(&g_stClockGenCfg));
129 130 131 132 133
}

/*Clock monitor initialization*/
static void Clock_Monitor_A_Init(void)
{
134 135
    /*only open monitor2 ,Monitor main clock*/
    CLMA2CMPH = 652U; /*+-10%*/
136

137
    CLMA2CMPL = 435U; /*+-10%*/
138

139
    CLOCK_PROTECTED_WRITE(CLMA2PCMD, CLMA2PS, CLMA2CTL0, 0x01U);
140 141 142 143 144 145
}

/*Stop all of the modules before Call the following function,except RTC*/
/*falling edge detection*/
void Clock_Enter_Sleep_Mode(void)
{
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
    /*Stop  modules*/
    /*port buffer  into hold state*/
    /*Disable  interrupt*/
    /*Clear the interrupt flag*/
    /*config interrupt , mask or unmask*/
    /*Clear  wake-up  flag*/
    /*Config wake-up factors*/
    /*You can choose more than one PIN*/
    /*(Except in D1M1A and D1M1-V2) ,Change CPU clock to EMCLK*/
    CLOCK_PROTECTED_WRITE(SYSPROTCMD1, SYSPROTS1, SYSCKSC_ICPUCLKS_CTL, 0x01U); /*select EMCLK*/

    /*Config clock domains . It's already set up in the initialization function  */
    /*MainOsc continues operation in DEEPSTOP mode*/
    SYSMOSCSTPM = 0x03U;
    /*High Speed IntOsc stops operation in DEEPSTOP mode.*/
    // SYSROSCSTPM = 0x02U;
    R_DEV_SetGenStopMask(R_DEV_HS_RING, 0U);
    /*Clock domain C_AWO_AWOT is stopped in DEEPSTOP mode*/
    SYSCKSC_AAWOTD_STPM = 0x02U;
    /*Clock domain C_AWO_RTCA is not stopped in DEEPSTOP mode*/
    SYSCKSC_ARTCAD_STPM = 0X03U;
    /*Clock domain C_AWO_FOUT is stopped in DEEPSTOP mode*/
    SYSCKSC_AFOUTS_STPM = 0X02U;

    /*Stop all active PLLs*/
    // CLOCK_PROTECTED_WRITE(SYSPROTCMD1, SYSPROTS1, SYSPLL0E, 0x02U); /*Stop the PLL0*/
    // CLOCK_PROTECTED_WRITE(SYSPROTCMD1, SYSPROTS1, SYSPLL1E, 0x02U); /*Stop the PLL1*/
    R_DEV_ClkGenStop(R_DEV_PLL0);
    R_DEV_ClkGenStop(R_DEV_PLL1);
    /*Clear the RESF register*/
    /*start DEEPSTOP mode*/
    /*wait for the transition to the DEEPSTOP mode by the unconditional loop*/
178 179 180 181 182 183 184 185 186
}
#pragma ghs section bss = ".absinitarea"

uint32_t u32ResetFlag;
uint32_t u32ResetSource;
#pragma ghs section bss = default

Clock_Startup_Mode_en_t Clock_Get_Startup_Mode(void)
{
187
    Clock_Startup_Mode_en_t enClockMode;
188

189 190
    uint32_t u32ResetRESFValue = 0U;
    uint32_t u32ResetRESFRValue = 0U;
191

192 193 194
    /* Read reset factor */
    u32ResetRESFValue = SYSRESF;
    u32ResetRESFRValue = SYSRESFR;
195

196
    u32ResetSource = SYSRESF;
197

198 199 200
    /* Clear reset factor */
    SYSRESFC = 0xC70FU;
    SYSRESFCR = 0xC70FU;
201

202 203 204 205 206 207 208 209
    if (u32ResetRESFValue & 0x0000C30FU)
    {
        enClockMode = CLOCK_STARTUP_PWR_ON;
    }
    else
    {
        enClockMode = CLOCK_STARTUP_WAKE_UP;
    }
210

211
    return enClockMode;
212 213 214 215
}

void Sys_Enter_Sleep_Mode(void)
{
216 217
    WDT_Clear();
    CLOCK_PROTECTED_WRITE(SYSPROTCMD0, SYSPROTS0, SYSCKSC_AWDTA0D_CTL, 0x06U); /*  看门狗时钟2048分频*/
218

219
    GPIO_Init(GPIO_SLEEP_MODE);
220

221 222 223 224 225 226 227
    __DI();
    SYSWUFC0 = 0x7FFFFU;
    /*---------------------------------------------*/
    GPIO_Wakeup_PIN_Set(GPIO_WAKEUP_PIN_P0_5, GPIO_WAKEUP_FALLING_EDGE); /*CAN唤醒     ----20220106----*/
    GPIO_Wakeup_PIN_Set(GPIO_WAKEUP_PIN_P0_0, GPIO_WAKEUP_HIGH_LEVEL);   /*15电唤醒    ----20220106----*/
    /*----------------------------------------------*/
    SYSWUFMSK0 &= 0x7FFFEU;
228

229
    Clock_Enter_Sleep_Mode();
230

231
    SYSRESFC = 0xC70FU;
232

233
    CLOCK_PROTECTED_WRITE(SYSPROTCMD0, SYSPROTS0, SYSSTBC0PSC, 0x02U);
234

235 236 237
    RTC_Backup_Time();
    TestBackupRam = 0xaabbccddu;
    hardware_reset();
238
}