第一次写博客,哈哈哈,刚入行汽车电子,是一个小白。希望跟各位大触互相交流学习.最近没事研究了一波G128 的低功耗模式。MC9S12G128芯片具有以下三种低功耗模式:
1,运行/等待模式 等待模式与运行模式类似,除了CPU执行被暂停并可以有选择地执行禁用一些模块,以便只有必要的模块时钟。
2,停止模式 停止模式禁用外部振荡器以降低功耗
3,伪停止模式 为了降低功耗,伪停止模式停止总线时钟,但是外部振荡器
继续运行
模式 | 内部时钟 | 外部时钟 |
运行模式 | YES | YES |
停止模式 | NO | NO |
等待模式 | YES | YES |
伪停止模式 | NO | YES |
#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++)
{
}
}
}
}