关于MC9S12G128的低功耗模式

 第一次写博客,哈哈哈,刚入行汽车电子,是一个小白。希望跟各位大触互相交流学习.最近没事研究了一波G128 的低功耗模式。MC9S12G128芯片具有以下三种低功耗模式:

1,运行/等待模式 等待模式与运行模式类似,除了CPU执行被暂停并可以有选择地执行禁用一些模块,以便只有必要的模块时钟。

2,停止模式 停止模式禁用外部振荡器以降低功耗

 

3,伪停止模式 为了降低功耗,伪停止模式停止总线时钟,但是外部振荡器
继续运行

 

 

模式内部时钟外部时钟
运行模式YESYES
停止模式NONO
等待模式YESYES
伪停止模式NOYES


#include <hidef.h>          
#include "derivative.h"    
#pragma CONST_SEG DEFAULT
#pragma DATA_SEG DEFAULT
unsigned char interrupt_Flag;
#pragma CODE_SEG DEFAULT
#pragma CODE_SEG NON_BANKED
#pragma TRAP_PROC
void interrupt VectorNumber_Vportad PORTPAD_ISR(void)
{
  /* Clear interrupt flag */
  PIF1AD = 0x80;
  interrupt_Flag = 1;





#pragma CODE_SEG DEFAULT


void main(void)
{
    unsigned int x;
    char y,z;
    
CPMUSYNR = 0x47;               




    CPMUREFDIV = 0x80;                  




    CPMUPOSTDIV = 0x01;             




    CPMUCLKS_PLLSEL = 1;            




    while (!CPMUCLKS_PLLSEL);       




    CPMUOSC_OSCE = 1;              




    while(!CPMUFLG_UPOSC);          


    while(!CPMUFLG_LOCK);          
     
    ECLKCTL_NECLK = 0;                    




    /* Enable LEDs */
    DDRA = 0xff;                      
    PORTA = 0x01;                        




    /* Enable Push Buttons */
PER1AD = 0xF0;
PPS1AD = 0x00;
ATDDIEN = 0x00F0;




    /* Enable Interrupt on Port AD, PAD7 */
    PIE1AD_PIE1AD7 = 1;




    EnableInterrupts;


    
    while (1)
    {
        
        switch (PT1AD)
        {




            case (0xBF): /* Stop Mode */




                while(1) /* Loop forever */
                {
                    if (interrupt_Flag)
                    {
                        interrupt_Flag = 0;
                        break;
                    }




                    PTT = 0xF0;                    
                    
                    for (z=0; z<40; z++)          
                    {
                        PTT ^= 0x40;
                        
                        /* Delay to see LEDs Toggle */
                        for (x=0; x<5000; x++)
                        {
                            for (y=0; y<100; y++)
                            {} 
                        }
                    }




                    CPMUCLKS_PSTP = 0;                 




                    asm ANDCC #0x7F;            
                    asm STOP;                           
                }
                   
                break;




            case (0xDF): /* Pseudo Stop Mode */




                while(1) /* Loop forever */
                {




                    if (interrupt_Flag)
                    {
                        interrupt_Flag = 0;
                        break;
                    }
                    
                    PORTA = 0xF0;                         
                
                    for (z=0; z<40; z++)         
                    {
                        PTT ^= 0x20;




                        /* Delay to see LEDs toggle */
                        for (x=0; x<5000; x++)
                        {
                            for (y=0; y<100; y++)
                            {} 
                        }
                    }




                    CPMUCLKS_PSTP = 1;               




                    asm ANDCC #0x7F;               
                    asm STOP;                         
                }




                break;




            case (0xEF): /* Wait Mode */




                while(1) /* Loop forever */
                {
                    if (interrupt_Flag)
                    {
                        interrupt_Flag = 0;
                        break;
                    }
                    
                    PTT = 0xF0;              
                    
                    for (z=0; z<40; z++)          
                    {
                        PTT ^= 0x10;
                        
                        /* Delay to see LEDs toggle */
                        for (x=0; x<5000; x++)
                        {
                            for (y=0; y<100; y++)
                            {} 
                        }
                    }
        
                    asm WAI;  /* Enter Wait mode */ 
                }




                break;




            default:
                interrupt_Flag = 0;              




                PTT ^= 0x80;
                break;
        }
        
        /* Delay to see LEDs toggle */
        for (x=0; x<5000; x++)
        {
            for (y=0; y<100; y++)
            {
            } 
        }
    }
}







  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值