查看: 3449|回复: 5

MC9S08MM128如何设置停止模式的中断退出源?

[复制链接]

该用户从未签到

8

主题

49

帖子

0

新手上路

Rank: 1

积分
187
最后登录
1970-1-1
发表于 2011-10-9 10:11:20 | 显示全部楼层 |阅读模式
谢谢关注!
在停止模式Stop2与Stop3下如何设置选择中断退出源?我找了很久也没有找到设置方法。我现在用的芯片是MC9S08MM128,数据手册上
有这样说明:
Stop2 Mode:
Exit from stop2 is performed by asserting either wake-up pin: RESET or IRQ.
In addition, the TOD interrupt can wake the MCU from stop2, if enabled.
Stop3 Mode:
Stop3 can be exited by asserting RESET, or by an interrupt from one of the following sources: TOD
interrupt, the USB resume interrupt, LVD, ADC, IRQ, KBI, SCI, or the ACMP.
例如我只想在IRQ中断和RESET时才退出Stop2,TOD中断时并不退出,但还是要有TOD中断,因为TOD设置时间用(相当于RTC)我
在AN3387.pdf中看到好像可以选择设置中断退出源,但我找了很久也没找到,也看过其它芯片的数据手册,但还是没找到,只好发贴
求助了,谢谢大伙帮忙!

MC9S08MM128RM.rar

7.82 MB, 下载次数: 9, 下载积分: 威望 1

AN3387.pdf

184.43 KB, 下载次数: 8, 下载积分: 威望 1

回复

使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2011-10-9 15:08:16 | 显示全部楼层

    RE:MC9S08MM128如何设置停止模式的中断退出源?

    每个模块都有一个SOTP模式中是否继续工作,初始化的时候把不需要的设置为关闭就可以了。
    该会员没有填写今日想说内容.

    该用户从未签到

    8

    主题

    49

    帖子

    0

    新手上路

    Rank: 1

    积分
    187
    最后登录
    1970-1-1
     楼主| 发表于 2011-10-9 15:48:18 | 显示全部楼层

    回复:MC9S08MM128如何设置停止模式的中断退出源?

    回复第 2 楼 于2011-10-09 07:08:16发表:
    每个模块都有一个SOTP模式中是否继续工作,初始化的时候把不需要的设置为关闭就可以了。 

    终于等到安版主的回复,谢谢!您说的我理解,但问题也出在这里,在MC9S08MM128中,TOD模块(Time Of Day Module)我是用来设置系统时间的,看介绍相当于RTC模块,在SOTP模式中也要工作啊,但又不能让它退出SOTP模式(只想用外部中断退出),看其它资料好像说是可以选择这个中断退出源的,但就是找不到在哪设置,看其它有RTC模块(很少有TOD模块)的芯片手册也只有提到说是时钟源不同可以不退出SOTP模式,但我不能随便更改时钟源啊。我看到AN3387.pdf有这样的一段:(请看图片)
    未命名.JPG
  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2011-10-10 08:43:06 | 显示全部楼层

    RE:MC9S08MM128如何设置停止模式的中断退出源?

    1、RTC可以用来做中断,可以控制产生时、分、秒等中断来唤醒。如果不开启RTC中断,就不能唤醒
    2、TOD这个也需要开启中断,当产生中断的时候他才能够唤醒的。
    该会员没有填写今日想说内容.

    该用户从未签到

    8

    主题

    49

    帖子

    0

    新手上路

    Rank: 1

    积分
    187
    最后登录
    1970-1-1
     楼主| 发表于 2011-10-10 09:46:32 | 显示全部楼层

    回复:MC9S08MM128如何设置停止模式的中断退出源?

    不知是不是我说得不够清楚,TOD我是用来设置系统时间的,是必须要使用中断的,它可以设置每0.25秒或每1秒中断一次,我现在设置的是每0.25秒中断一次,但我不想中断一次就唤醒,虽然可以设置再次进入停止模式,但感觉这样肯定会增加系统功耗,不可以能中断而不唤醒吗?我看AN3387.pdf手册说明(上面附件图片部分)好像可以设置啊。

    该用户从未签到

    8

    主题

    49

    帖子

    0

    新手上路

    Rank: 1

    积分
    187
    最后登录
    1970-1-1
     楼主| 发表于 2011-10-10 09:50:26 | 显示全部楼层

    回复:MC9S08MM128如何设置停止模式的中断退出源?

    附上这部分的程序设置:
    //============================================================================= 
    //函 数 名:  TOD_Init() 
    //功 能:    TOD初始化设置
    //说 明:    TOD为日期更新服务,可用作ADC硬件触发源测试用
    //=============================================================================
    void TOD_Init(void)
    {
      CCSCTRL |= 0x20;     //要使用外部32.768K晶振,这条指令是必须有的(CCSCTRL寄存器在第十五章中)
      TODC |= 0x10;        //TOD Reset 软件复位计数器
      TODC = 0x01;         //外部OSCOUT clock,Use for 32.768 kHz
      //TODC = 0x20;         //内部1 kHz
      //TODM = 0x04;         //匹配值设为1秒,这个要在下一条指令前
                           //Always configure the TODM value before setting the MTCHEN bit
                           //匹配1秒要设为4,不能设为1,必须要按8位写入,开发手册有误人之嫌
      TODSC = 0xF0;        //11110000           
      //TODSC = 0xF2;        //11110010 Clear Quarter-Second,Second and Match Interrupt Flag,Enable quarter-second interrupts
                           //Match functionality is enabled   
      TODC |= 0x80;        //TODEN=1,启动TOD
      //while(TODSC_MTCHWC); //这句如果要的话只能放在启动TOD后,否则程序一直跳不过去
    }
     
    interrupt 29 void TOD_ISR (void)  //TOD中断函数,TOD中断向量号是29 (从mc9s08mm64.h可以查看到)
    {
       unsigned char temp;
     
       TODSC |= 0xE0;         //清Quarter-Second,Second and Match Interrupt Flag
         
       led_auto++;            //按键背光延时计数标志
       time_flag++;           //日期时间计数标志
       sys_down_count++;       //系统自动关机延时计数
       if (time_flag >= 4)    //计数一秒
       {
          time_flag = 0;
         
          if (++sec >= 60) //秒数加1后大于等于60则进位,否则退出
          {
              sec=0;
              if (++minute >= 60) //分数加1后等于60则进位,否则退出
              {
                  minute=0;
                  if (++hour >= 24) //时数加1后等于24则进位,否则退出
                  {
                      hour=0;
                      if (++day >= month[mon]+1) //如果日期数加1后大于本月日期数
                      {
                          if (year%4==0 && mon==2) //如果是闰年且是2月份则日期数暂时保持为29号不变(这里判断闰年的方法是有限制的)
                          {
                              if(day==month[mon]+1)  return;              //是2月29就跳出该程序
                          }
                          day=1;                  //其它月份日期数则变为1
                          if (++mon >= 13)     //月数加1后大于12就进一位
                          {
                              mon=1;
                              if (++year >= 2100) //年数加1后大于2099就循环从2000开始
                              {
                                 year=2000;
                              }
                          }
                      }//if(++day>month[mon])
                  }//if(++hour>=24)
              }//if(++min>=60)
          }//if (++sec>=60)
       }
       
       if(led_auto >= 20)      //背光延时20*0.25=5秒
       {
          led_auto = 0;
          PTGD |= BIT0;       //输出高电平背光灯灭
       }
       if(sys_down_count >= 480) //自动关机延时480*0.25=120秒(两分钟)
       {
          sys_down_count = 0;         //自动关机延时计数复位
          sysdown_flag = 1;           //低功耗模式标志置位
       }
    }
    修改说明: 增加了红色显示那个条件,否则判断是错误的。
    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-5 19:01 , Processed in 0.145329 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表