搜索

[技术问答] 【ML51超低功耗应用问题五】WKT预分频问题

[复制链接]
628|17
 楼主 | 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 正常闪烁
这是为什么?

使用特权

评论回复
| 2020-5-25 08:37 | 显示全部楼层
预分频的范围是多少啊,你要看看手册给的范围。

使用特权

评论回复
| 2020-5-25 12:39 | 显示全部楼层
这要配合掉电模式用的
WKT填初值;
WKT使能;                  
P31=1;
P31=0;
MCU写掉电模式;     
WTK溢出产生中断;   
P31=1;
MCU被唤醒;   

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

使用特权

评论回复
| 2020-5-25 12:43 | 显示全部楼层
有进入掉电模式吗

使用特权

评论回复
| 2020-5-25 12:46 | 显示全部楼层
参考这个例子怎么做

使用特权

评论回复
| 2020-5-25 12:48 | 显示全部楼层
  1. void WakeUp_Timer_ISR (void)   interrupt 17     //ISR for self wake-up timer
  2. {
  3.     clr_WKCON_WKTF;                                   //clear interrupt flag   
  4.     P31 ^= 1;
  5. }

  6. void main (void)
  7. {
  8.     MFP_P31_GPIO;
  9.     P31_PUSHPULL_MODE;
  10.   
  11. /**
  12.   WKT initial part
  13.   *include wkt.c
  14. */
  15.   WKT_Open(LXT,64,0x10);
  16.   WKT_Interrupt(Enable);                           // Enable WKT interrupt
  17.   ENABLE_GLOBAL_INTERRUPT;                        // Enable Globe interrupt
  18.   while (1)
  19.   {
  20.       set_PCON_PD;                        // into power down mode to check WKT wake up function.
  21.   }
  22. }
复制代码

使用特权

评论回复
| 2020-5-25 12:50 | 显示全部楼层
781345ecb4ea6db2bf.png

使用特权

评论回复
| 2020-5-25 12:53 | 显示全部楼层
817815ecb4f1aef272.png
按理说0到255都是可以的。理论上1到254都没问题。

使用特权

评论回复
| 2020-5-25 12:53 | 显示全部楼层
那就不知道了,楼主可以把文件分享出来看看具体如何。

使用特权

评论回复
| 2020-5-25 18:04 | 显示全部楼层
因為每次從PD 喚醒時候,WKT 會清counter,所以每次睡的時間不一樣,喚醒的時間不一樣,造成WKT 不是按照固定時間來。

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

使用特权

评论回复
| 2020-5-25 22:18 | 显示全部楼层
楼上建议不错。

使用特权

评论回复
| 2020-5-25 23:58 | 显示全部楼层
没头没尾的,没明白咋回事

使用特权

评论回复
 楼主 | 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.
  }
}
非常感谢看,用的就是官方例程,现在的测试结果是这样,

使用特权

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

好的,谢谢,我试试!

使用特权

评论回复
 楼主 | 2020-5-26 07:17 | 显示全部楼层
hwpga 发表于 2020-5-25 12:39
这要配合掉电模式用的
WKT填初值;
WKT使能;                  

谢谢!!!

使用特权

评论回复
| 2020-5-26 14:23 | 显示全部楼层
先mark一下,等回家以后慢慢看大神们讨论问题,虚心学习还是要的

使用特权

评论回复
| 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 做个评断,哈哈哈

使用特权

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

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表