打印
[DemoCode下载]

IDLE操作

[复制链接]
392|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhuomuniao110|  楼主 | 2019-5-26 22:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
IDL, ck, TE, se
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/
#include <stdio.h>
#include "M051Series.h"
#include "LCD_Driver.h"


#define PLLCON_SETTING      CLK_PLLCON_50MHz_HIRC
#define PLL_CLOCK           50191800



void WDT_IRQHandler(void)
{
    /* Clear WDT time-out interrupt flag */
    WDT_CLEAR_TIMEOUT_INT_FLAG();
}


void SYS_Init(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/

    /* Enable Internal RC 22.1184MHz clock */
    CLK->PWRCON |= 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));

    /* Set PLL to power down mode and PLL_STB bit in CLKSTATUS register will be cleared by hardware.*/
    CLK->PLLCON |= CLK_PLLCON_PD_Msk;

    /* Enable external 12MHz XTAL, 10kHz */
    CLK->PWRCON |= (CLK_PWRCON_XTL12M_EN_Msk | CLK_PWRCON_OSC10K_EN_Msk);

    /* Enable PLL and Set PLL frequency */
    CLK->PLLCON = PLLCON_SETTING;

    /* Waiting for clock ready */
    CLK_WaitClockReady(CLK_CLKSTATUS_PLL_STB_Msk | CLK_CLKSTATUS_XTL12M_STB_Msk | CLK_CLKSTATUS_OSC10K_STB_Msk);

    /* Use PLL as system clock source */
    CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_PLL, CLK_CLKDIV_HCLK(1));

    /* Enable clock of WDT, PWM01 and SPI0 */
    CLK_EnableModuleClock(WDT_MODULE);
    CLK_EnableModuleClock(PWM01_MODULE);
    CLK_EnableModuleClock(SPI0_MODULE);

    /* Select peripheral clock of WDT and PWM01 and SPI0 */
    CLK_SetModuleClock(WDT_MODULE,   CLK_CLKSEL1_WDT_S_LIRC,   MODULE_NoMsk);
    CLK_SetModuleClock(PWM01_MODULE, CLK_CLKSEL1_PWM01_S_HCLK, MODULE_NoMsk);
    CLK_SetModuleClock(SPI0_MODULE,  CLK_CLKSEL1_SPI0_S_HCLK,  MODULE_NoMsk);

    /* Update System Core Clock */
    /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
    //SystemCoreClockUpdate();
    PllClock        = PLL_CLOCK;            // PLL
    SystemCoreClock = PLL_CLOCK / 1;        // HCLK
    CyclesPerUs     = PLL_CLOCK / 1000000;  // For SYS_SysTickDelay()

    /*---------------------------------------------------------------------------------------------------------*/
    /* Init I/O Multi-function                                                                                 */
    /*---------------------------------------------------------------------------------------------------------*/

    /* Set P1.4, P1.5, P1.6, P1.7 for SPI0 to driver LCD */
    SYS->P1_MFP &= ~(SYS_MFP_P14_Msk | SYS_MFP_P15_Msk | SYS_MFP_P16_Msk | SYS_MFP_P17_Msk);
    SYS->P1_MFP |= (SYS_MFP_P14_SPISS0 | SYS_MFP_P15_MOSI_0 | SYS_MFP_P16_MISO_0 | SYS_MFP_P17_SPICLK0);

    /* Set P4.0 for PWM0 */
    SYS->P4_MFP = SYS->P4_MFP & (~SYS_MFP_P40_Msk) | SYS_MFP_P40_PWM0;
}

void WDT_Init(void)
{
    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Start WDT. Timeout = (2^14 + 1024) * (1 / 10kHz)*/
    WDT_Open(WDT_TIMEOUT_2POW14, FALSE, FALSE, FALSE);

    /* Enable WDT interrupt function */
    WDT_EnableInt();

    /* Lock protected registers */
    SYS_LockReg();

    /* Enable WDT IRQ */
    NVIC_EnableIRQ(WDT_IRQn);
}

void PWMA_Init(void)
{
    /* Enable PWM Timer 0 and set to auto-reload mode */
    PWMA->PCR = PWM_PCR_CH0EN_Msk | PWM_PCR_CH0MOD_Msk;

    /* Set pre-scale for PWM01 */
    PWM_SET_PRESCALER(PWMA, 0, 1);

    /* Select the divider of PWM01 clock */
    PWM_SET_DIVIDER(PWMA, 0, PWM_CLK_DIV_1);

    /* PWM0 output is HCLK / 2 / 2 */
    PWM_SET_CMR(PWMA, 0, 0);
    PWM_SET_CNR(PWMA, 0, 1);

    /* PWM output enable */
    PWM_EnableOutput(PWMA, 0x1);
}

/*---------------------------------------------------------------------------------------------------------*/
/*  Main Function                                                                                          */
/*---------------------------------------------------------------------------------------------------------*/
int32_t main(void)
{
    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Init system, peripherial clock and multi-function I/O */
    SYS_Init();

    /* Lock protected registers */
    SYS_LockReg();

    /* Init SPI0 and LCD */
    LCD_Init();
    LCD_EnableBackLight();
    LCD_ClearScreen();
    LCD_Print(0, "Idle Sample Code");

    /*----------------------- Enable WDT to wakeup CPU from idle ------------------*/
    WDT_Init();

    /*----------------------- Enable PWM to toggle output -------------------------*/
    PWMA_Init();

    /*
        The Idle sample uses __WFI() instruction to disable CPU clock to enter idle mode.
        In the sample code, CPU will enter idle mode to wait WDT timeout. User may check
        LCD display to know if it is wakeup.
    */

    /* Unlock protected registers */
    SYS_UnlockReg();

    while(1)
    {
        /* Select system clock source as OSC10K(LIRC),
           set HCLK divider as 1 and update current system core clock
        */
        CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_LIRC, CLK_CLKDIV_HCLK(1));

        /* Disable 22.1184MHz IRC */
        CLK_DisableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

        LCD_Print(1, "Idle  ");
        /* Idle to WDT timeout. HCLK should be 10KHz here. PWM0 = 2.5KHz*/
        CLK_Idle();
        LCD_Print(1, "Wakeup");

        /* Enable 22.1184MHz IRC */
        CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

        /* Waiting for clock ready */
        CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

        /* Select system clock source as OSC22M(HIRC),
           set HCLK divider as 1 and update current system core clock
        */
        CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

        LCD_Print(1, "Idle  ");
        /* Idle to WDT timeout. HCLK should be 22.1184MHz here. PWM0 = 5.5MHz*/
        CLK_Idle();
        LCD_Print(1, "Wakeup");
    }
}






使用特权

评论回复
沙发
dongnanxibei| | 2019-5-27 00:04 | 只看该作者
Idle 空闲

使用特权

评论回复
板凳
捉虫天师| | 2019-5-27 16:00 | 只看该作者
这个大概什么时候用的?

使用特权

评论回复
地板
equivalent| | 2019-5-29 20:40 | 只看该作者
感谢楼主分享!

使用特权

评论回复
5
稳稳の幸福| | 2019-5-29 22:48 | 只看该作者
这个概念看到过很多次,没学会。

使用特权

评论回复
6
玛尼玛尼哄| | 2019-5-30 18:35 | 只看该作者
空闲模式一般都用在哪儿?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

188

主题

3247

帖子

10

粉丝