打印
[技术问答]

【ML51超低功耗应用问题五】WKT预分频问题

[复制链接]
1467|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dqqqqqq|  楼主 | 2020-5-25 07:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
代码如下:
void WakeUp_Timer_ISR (void)   interrupt 17     //ISR for self wake-up timer
{
    clr_WKCON_WKTF;                                   //clear interrupt flag
    P31 =~ P31;
}

    WKCON =0x04; //预分频配置256
    RWK =255-78;//定时2s
               
    ENABLE_WKT_INTERRUPT;    //使能定时唤醒中断                  // enable WKT interrupt
    set_WKCON_WKTR;          //运行定时唤醒功能                  // Wake-up timer run
    ENABLE_GLOBAL_INTERRUPT; //开启总中断

定时时间/((Pre-scalar预分频+1)/10)=255-重载值(RWK)
定时2000ms,256分频,算重载值 2000/((256+1)/10)=77.8  

RWK =255-78;//定时2s    此时P31 接LED 看不到闪烁
RWK =255-64;//定时2s    此时P31 接LED 正常闪烁
这是为什么?

使用特权

评论回复
沙发
643757107| | 2020-5-25 08:37 | 只看该作者
预分频的范围是多少啊,你要看看手册给的范围。

使用特权

评论回复
板凳
hwpga| | 2020-5-25 12:39 | 只看该作者
这要配合掉电模式用的
WKT填初值;
WKT使能;                  
P31=1;
P31=0;
MCU写掉电模式;     
WTK溢出产生中断;   
P31=1;
MCU被唤醒;   

P31产生从下降沿到上升沿的时间,
就是唤醒定时器的休眠时间,
逻辑仪或示波器大概抓下就知道了

使用特权

评论回复
地板
捉虫天师| | 2020-5-25 12:43 | 只看该作者
有进入掉电模式吗

使用特权

评论回复
5
捉虫天师| | 2020-5-25 12:46 | 只看该作者
参考这个例子怎么做

使用特权

评论回复
6
捉虫天师| | 2020-5-25 12:48 | 只看该作者
void WakeUp_Timer_ISR (void)   interrupt 17     //ISR for self wake-up timer
{
    clr_WKCON_WKTF;                                   //clear interrupt flag   
    P31 ^= 1;
}

void main (void)
{
    MFP_P31_GPIO;
    P31_PUSHPULL_MODE;
  
/**
  WKT initial part
  *include wkt.c
*/
  WKT_Open(LXT,64,0x10);
  WKT_Interrupt(Enable);                           // Enable WKT interrupt
  ENABLE_GLOBAL_INTERRUPT;                        // Enable Globe interrupt
  while (1)
  {
      set_PCON_PD;                        // into power down mode to check WKT wake up function.
  }
}

使用特权

评论回复
7
捉虫天师| | 2020-5-25 12:50 | 只看该作者

使用特权

评论回复
8
捉虫天师| | 2020-5-25 12:53 | 只看该作者

按理说0到255都是可以的。理论上1到254都没问题。

使用特权

评论回复
9
捉虫天师| | 2020-5-25 12:53 | 只看该作者
那就不知道了,楼主可以把文件分享出来看看具体如何。

使用特权

评论回复
10
jasontu| | 2020-5-25 18:04 | 只看该作者
因為每次從PD 喚醒時候,WKT 會清counter,所以每次睡的時間不一樣,喚醒的時間不一樣,造成WKT 不是按照固定時間來。

建議醒來後,先停WKT,進省電前再開啟,這樣起來的時間就會相同。

使用特权

评论回复
11
huangcunxiake| | 2020-5-25 22:18 | 只看该作者
楼上建议不错。

使用特权

评论回复
12
xuanhuanzi| | 2020-5-25 23:58 | 只看该作者
没头没尾的,没明白咋回事

使用特权

评论回复
13
dqqqqqq|  楼主 | 2020-5-26 07:15 | 只看该作者
捉虫天师 发表于 2020-5-25 12:53
那就不知道了,楼主可以把文件分享出来看看具体如何。

void WakeUp_Timer_ISR (void)   interrupt 17     //ISR for self wake-up timer
{
    clr_WKCON_WKTF;                                   //clear interrupt flag   
    P31 ^= 1;
}

void main (void)
{
    MFP_P31_GPIO;
    P31_PUSHPULL_MODE;


/**
  WKT initial part
  *include wkt.c
*/
//  WKT_Open(LIRC,64,0x10);
        //WKT_Open(LIRC,256,200); //小于200 无法使用
  //WKT_Open(LIRC,512,10); //小于230 无法使用       
        //WKT_Open(LIRC,512,200); //值越大,间隔越小,1~30是3秒多,40 ~50两秒多,110 两秒
        //WKT_Open(LIRC,1024,30); //值越大,间隔越小,1~30是6秒多,40 ~50五秒,100 四秒,两秒多,200 不到两秒       
        WKT_Open(LIRC,2048,30);         //值越大,间隔越小,1~30是12秒多,40 ~50五秒,100 四秒,两秒多,200 不到两秒       
  WKT_Interrupt(Enable);                           // Enable WKT interrupt
  ENABLE_GLOBAL_INTERRUPT;                        // Enable Globe interrupt
  while (1)
  {
      set_PCON_PD;                        // into power down mode to check WKT wake up function.
  }
}
非常感谢看,用的就是官方例程,现在的测试结果是这样,

使用特权

评论回复
14
dqqqqqq|  楼主 | 2020-5-26 07:16 | 只看该作者
jasontu 发表于 2020-5-25 18:04
因為每次從PD 喚醒時候,WKT 會清counter,所以每次睡的時間不一樣,喚醒的時間不一樣,造成WKT 不是按照固 ...

好的,谢谢,我试试!

使用特权

评论回复
15
dqqqqqq|  楼主 | 2020-5-26 07:17 | 只看该作者
hwpga 发表于 2020-5-25 12:39
这要配合掉电模式用的
WKT填初值;
WKT使能;                  

谢谢!!!

使用特权

评论回复
16
cooldog123pp| | 2020-5-26 14:23 | 只看该作者
先mark一下,等回家以后慢慢看大神们讨论问题,虚心学习还是要的

使用特权

评论回复
17
viva911| | 2020-5-27 11:00 | 只看该作者
jasontu 发表于 2020-5-25 18:04
因為每次從PD 喚醒時候,WKT 會清counter,所以每次睡的時間不一樣,喚醒的時間不一樣,造成WKT 不是按照固 ...

一楼的帖子,就是楼主之前的主要代码?如果是的话,我想我可以做个解释……

首先,ML51自唤醒时钟源支持内置 38.4kHz LIRC 或 32.768kHz LXT
因此无论如何使用都不会出现楼主公式中的(/10)……
同样以/256分频计算,每个单位时间约为 256/38.4=6.67ms,以下直接取手册标称值 6.64 代入计算

所以 RWK = 255-78; 实际延时 6.64*78=517.92 约为 500ms;
而当 RWK = 255-64; 则是延时 6.64*64=424.96 大约 400ms;

那么 问题来了,怎么可能延时时间更长(500ms)却看不到指示灯状态?

答案只有一种可能……
RWK递增还来不及进入中断,寄存器就被其它代码指令覆盖了!(RWK =255-78;//定时2s)

以上愚见,还请大神哥 @jasontu 做个评断,哈哈哈

使用特权

评论回复
18
xqp1984| | 2020-5-28 21:20 | 只看该作者
淘宝官方旗舰店15元开发板,用逻辑分析仪测试闪灯频率,未发现异常:
    WKT_Open(LIRC,256,106);        //中断周期1.001秒        
  //WKT_Open(LIRC,2048,106);        //中断周期8秒

使用特权

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

本版积分规则

24

主题

91

帖子

0

粉丝