打印
[技术问答]

关于M052ZBN片子,看门狗唤醒!!!!

[复制链接]
1193|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tzg74500|  楼主 | 2014-7-28 10:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
M0驱动历程里面的wdt_wakeup,调试时发现,WDT_SetInterval(4)函数,设置为4、5、6、7时,看门狗唤醒正常,设置为1、2、3时,系统上电,可以进入睡眠和唤醒2次,然后就没有反应了。。。

下面是程序:

/*---------------------------------------------------------------------------------------------------------*/
/* Copyright(c) 2011 Nuvoton Technology Corp. All rights reserved.                                         */
/*---------------------------------------------------------------------------------------------------------*/

/***************************************************************************************
WDT唤醒MCU。烧录完代码后,给芯片掉电,再上电,开始执行代码,执行情况可在超级终端上显示
****************************************************************************************/
#include "Common.h"
#include "led.h"

void WDT_Init(void);
void WDT_SetInterval(uint32_t interval);

void delay(void);

unsigned int sys_index=0;
unsigned int led_标志寄存器=0;

int main(void)
{
    Un_Lock_Reg();                                     //解锁被保护的寄存器位,以便用户访问
           PWRCON |= XTL12M_EN;                               //使能外晶振
           while((CLKSTATUS & XTL12M_STB) == 0);              //等12M时钟稳定
           PWRCON |= OSC10K_EN;                               //使能10K时钟
    while((CLKSTATUS & OSC10K_STB) == 0);              //等10K时钟稳定
           CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M;          //选12M为系统时钟
    Lock_Reg();                                        //重新锁被保护的寄存器位

    //UART_Init();                                     //初始化串口
    //printf("Press Enter key to start...\n");

    //getchar();
    WDT_Init();                                        //初始化WDT

    Un_Lock_Reg();
    WDT_SetInterval(4);                //设定WDT超时间
    WTCR |= CLRWTR;             //清零WDT
    Lock_Reg();
       
                LED_Init();

    while(1)
    {
        //printf("Enter power down mode...\n");
                                if(!led_标志寄存器)
                                {
                                        LED_BLUE_ON();//开发光管
                                        led_标志寄存器=1;
                                }
                                else
                                {
                                        LED_BLUE_OFF();//关发光管
                                        led_标志寄存器=0;
                                }
                               
        //delay();
        Un_Lock_Reg();                                        
                                CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_10K;             //选12M为系统时钟
                               
        SCR |= SLEEPDEEP;                              //通知M0内核MCU要进入深度休眠模式
        PWRCON &= ~PD_WU_IE;                           //休眠醒来时不产生中断
        PWRCON &= ~PD_WAIT_CPU;                        //不需等待WFI指令即可进入掉电模式
        PWRCON |= PWR_DOWN_EN;                               //允许MCU进入掉电模式
        Lock_Reg();
        delay();  
                                Un_Lock_Reg();
        CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M;
                                Lock_Reg();
    }
}

/***************************************************************************************
描述 :  WDT中断代码
****************************************************************************************/
void WDT_IRQHandler(void)
{
    Un_Lock_Reg();
    WTCR |= WTWKF;                                     //清除WDT复位标志
    WTCR |= WTIF;                                      //清除WDT超时中断标志
    Lock_Reg();
    //printf("WDT interrupt!\n");
}

/***************************************************************************************
描述 :  WDT初始化,时钟源选10KHz
****************************************************************************************/
void WDT_Init(void)
{
    Un_Lock_Reg();       
    APBCLK   |= WDT_CLKEN;                             //使能WDT时钟
    CLKSEL1   = (CLKSEL1 & (~WDT_CLK)) | WDT_10K;      //WDT时钟源选10KHz
    WTCR     &= ~WTRE;                                       //禁止WDT复位芯片
    WDT_SetInterval(0);                                //设定WDT超时间隔
    WTCR     |= WTIE;                                  //使能WDT超时中断
    NVIC_ISER = WDT_INT;
    WTCR     |= WTWKE;                                       //使能WDT唤醒功能
    WTCR     |= WTE;                                         //使能WDT
    Lock_Reg();         
}

/***************************************************************************************
  描述 :  选WDT周期
****************************************************************************************/
void WDT_SetInterval(uint32_t interval)
{
  WTCR = (WTCR&(~WTIS)) | (interval<<8);             //设置WDT超时间隔
        //WTCR=WTCR|(interval<<8);
}

void delay(void)
{
    volatile uint32_t i;

    for (i=0; i<100; i++);
}
沙发
zxf0168| | 2014-7-28 21:49 | 只看该作者
楼主怎么了

使用特权

评论回复
板凳
598330983| | 2014-8-18 19:39 | 只看该作者
zxf0168 发表于 2014-7-28 21:49
楼主怎么了

你这不是扯犊子吗?

使用特权

评论回复
地板
mintspring| | 2014-8-18 19:56 | 只看该作者
或许那几个不行吧。

使用特权

评论回复
5
zxf0168| | 2014-8-23 15:01 | 只看该作者
598330983 发表于 2014-8-18 19:39
你这不是扯犊子吗?

我不是扯犊子,刚开始没看明白

使用特权

评论回复
6
zxf0168| | 2014-8-23 15:02 | 只看该作者
mintspring 发表于 2014-8-18 19:56
或许那几个不行吧。

不可能啊,这不是扯犊子么:Q

使用特权

评论回复
7
598330983| | 2014-8-27 21:49 | 只看该作者
zxf0168 发表于 2014-8-23 15:01
我不是扯犊子,刚开始没看明白

嗯,代码不是自己写的,确实看着费劲,就看怎么注释了,优秀的注释可以让代码任何人都看懂。

使用特权

评论回复
8
598330983| | 2014-8-27 21:49 | 只看该作者
zxf0168 发表于 2014-8-23 15:01
我不是扯犊子,刚开始没看明白

嗯,优秀的注释可以让所有人看懂他的代码,楼主的注释不是很好。

使用特权

评论回复
9
zxf0168| | 2014-8-28 20:52 | 只看该作者
598330983 发表于 2014-8-27 21:49
嗯,代码不是自己写的,确实看着费劲,就看怎么注释了,优秀的注释可以让代码任何人都看懂。 ...

代码一般都这样,不是给别人看得

使用特权

评论回复
10
zxf0168| | 2014-8-28 20:52 | 只看该作者
598330983 发表于 2014-8-27 21:49
嗯,优秀的注释可以让所有人看懂他的代码,楼主的注释不是很好。

别人看也看不懂,省得加密了

使用特权

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

本版积分规则

12

主题

25

帖子

1

粉丝