223使用备用模式.docx
《223使用备用模式.docx》由会员分享,可在线阅读,更多相关《223使用备用模式.docx(79页珍藏版)》请在冰豆网上搜索。
223使用备用模式
2。
23使用备用模式
功能:
备用模式(低功耗模式)
2。
23。
1特性
在这个示例程序中,将进入备用模式。
在这个示例程序中,通过闭合连接到IRQ1管脚的开关产生一个IRQ1中断,使系统从正常模式进入备用模式。
当IRQ1中断处理程序执行完后,执行一条SLEEP指令。
在正常模式下,发光二极管LED不断闪烁,当进入备用模式后,点亮发光二极管LED。
(在备用模式下,P74输出管脚进入高阻抗状态。
在这个示例程序中,通过闭合连接到IRQ0管脚的开关产生一个IRQ0中断,从而清除备用模式进入正常模式。
进入正常模式后,发光二极管LED再次不断闪烁。
发光二极管LED连接到端口7的P74输出管脚。
图2.105是将开关连接到IRQ1和IRQ0输入管脚的示意图。
图2.105进入备用模式程序中开关连接的示意图
2。
23。
2所用功能说明
在这个示例程序中,系统进入备用模式,一种低功耗模式。
图2.106是备用模式的方块图。
下面详细说明备用模式的功能。
●当SYSCR1中的SSBY位的值为1,DTON位的值为0,SYSCR2中的SMSEL和LSON位的值为X(0或1均可)时,当执行完一条SLEEP指令后,系统将从正常模式进入备用模式。
●在备用模式中,时钟脉冲发生器停止工作,所以CPU和其他片上模块停止工作。
但是,只要提供一定的电压,CPU内部寄存器的值,片上的RAM区,及其他片上功能模块的寄存器的值仍能保留。
只要能够提供RAM数据保持电压,RAM区中的内容就能被保留下来。
输入/输出端口进入高阻抗状态。
●通过一个IRQ3到IRQ0的中断,WKP5到WKP0的中断,或一个RES管脚的输入就能清除备用模式。
●在使用中断清除备用模式的情况下,当产生一个中断申请时,系统时钟脉冲产生起开始工作。
经过系统控制寄存器SYSCR1中STS2到STS0位的值设定的时间后,将给整个系统提供一个稳定的系统时钟信号,备用模式被清除,开始执行中断处理程序。
但是,如果状态码寄存器CCR中I位的值为1或相应的中断使能寄存器被禁止,则这些中断不能清除备用模式。
●在使用RES管脚清除备用模式的情况下,如果RES管脚变成低电平,则系统时钟脉冲发生器将开始工作。
当脉冲发生器输出稳定后,如果RES管脚变为高电平驱动,CPU将进行异常复位处理。
由于系统时钟脉冲发生器一开始工作,系统时钟就给整个系统提供时钟,因此在脉冲发生器稳定前,RES管脚必须保持为低电平。
●清除备用模式后脉冲发生器达到稳定输出所需要的时间由系统控制寄存器SYSCR1中的STS2,STS1和STS0位的值确定。
●在这个示例程序中,通过IRQ0中断清除备用模式。
●在这个示例程序中,运行频率为16MHz,等待时间为131.072states。
(脉冲发生器达到稳定输出所需要的时间为8.2毫秒。
图中英文翻译:
SELLPinstruction:
SLEEP指令。
Activemode:
正常模式
Standbymode:
备用模式programexecutionstate:
程序执行状态
programhaltstate:
程序停止状态
图2.106转换到备用模式
表2.104中列出了这个示例程序的功能配置。
通过配置表2.104中的功能就能实现到备用模式的转换。
功能
描述
SYSCR1
控制低功耗模式
SYSCR2
控制低功耗模式
PCR7
设置P74管脚作为输出管脚使用
PDR7
存储P74管脚的输出数据
P74
发光二极管LED输出管脚
IRQ1
开关1的输入管脚
IRQ0
开关2的输入管脚
2。
23。
3运行说明
图2.107表示出了这个示例程序的运行原理。
图2.107中的软件和硬件处理表示出了到备用模式的转换操作。
图2。
107运行原理:
转换到备用模式
1)2)3)4)
图中英文翻译:
1)硬件处理无软件处理初始化设置1。
设置IRQ1中断2。
设置IRQ0中断3。
设置定时器A4。
设置端口745。
允许中断
2)硬件处理IRR11置1软件处理1。
开始IRQ1中断处理2。
IRQ11清零3。
禁止IRQ1中断申请4。
禁止定时器A中断申请
3)硬件处理:
无软件处理执行一条SLEEP指令
4)硬件处理:
IRR10置1软件处理:
1。
开始IRQ)中断处理2。
Irq10清零3。
禁止irq0中断申请4。
允许定时器A中断申请
Immediatelyafterreset:
复位后状态Switch1on:
开关1闭合
ExecutioofSLEEPinstruction执行SLEEP指令switch2on:
开关2闭合
Activemode正常模式standbymode备用模式
Stabilizationtimeforpulsegeneratoroutput脉冲发生器达到稳定输出所需时间
2。
23。
4编程说明
程序模块说明:
表2.105列出了这个示例程序中使用的程序模块。
表2.105程序模块说明
程序模块名称
标号名称
功能
主程序模块
main
设置IRQ0中断和端口7功能,允许中断,控制发光二极管LED,设置定时器A中断,转换到备用模式。
开关1接通模块
IRQ1
在IRQ1中断处理过程中,将SWONF置1,禁止IRQ1和定时器A中断。
清除备用模式模块
IRQ0
在IRQ0中断处理过程中,禁止IRQ0中断,允许定时器A中断。
发光二极管LED控制模块
taint
在定时器A中断处理过程中,控制发光二极管LED。
参数说明:
在这个示例程序中,没有使用输入/输出参数。
内部寄存器说明:
表2.106中列出了这个示例程序中使用的内部寄存器。
表2.106内部寄存器说明
寄存器名称
功能
地址
设置值
TMA
定时器模式寄存器A:
当TAM=H’12时,定时器A使用内部时钟功能,并且设置Φ/2048(Φ为系统时钟)作为TCA的计数时钟。
H’FFA6
PDR7
P74
端口数据寄存器7:
端口数据寄存器7第4位:
当P74=0时,P74管脚的输出电平为低电平。
当P74=1时,P74管脚的输出电平为高电平。
H’FFDA
Bit4
0
PCR7
PCR74
端口控制寄存器7:
端口控制寄存器7第4位:
当PCR74=1时,P74管脚作为输出管脚使用。
H’FFEA
Bit4
1
SYSCR1
SSBY
STS2
STS1
STS0
系统控制寄存器1:
备用模式:
当SSBY=1时,在正常模式下,当执行完SLEEP指令后,将转换到备用模式。
备用时钟选择2to0:
当STS2=1,STS1=0,STS0=0时,等待时间为131.072states。
H’FFF0
Bit7
Bit6
Bit5
Bit4
0
1
0
0
SYSCR2
SMSEL
LSON
DTON
MA2
MA1
MA0
SA1
SA0
系统控制寄存器2:
睡眠模式选择:
当SMSEL=X(X为0或1)时,当执行完SLEEP指令后,将转换到备用模式,亚睡眠模式或亚正常模式。
低速模式标志:
当LSON=X(0或1)时,当执行完SLEEP指令后,系统将转换到备用模式,亚睡眠模式或亚正常模式。
直接转换标志:
当DTON=0时,当执行完SLEEP指令后,系统将转换到睡眠模式,亚睡眠模式或备用模式。
正常模式时钟选择2到0:
当MA2=0,MA1=1,MA0=1时,选择Φ(振荡器频率)作为正常模式的时钟。
亚正常模式时钟选择1和0:
当SA1和SA0都被清零时,选择Φ/8作为在亚正常模式下CPU的运行时钟。
H’FFF1
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
0
1
0
0
1
1
0
0
PMR1
IRQ1
IRQ0
端口模式寄存器1:
P15/IRQ1功能选择:
当IRQ1被清零时,P15/IRQ1管脚作为P15输入/输出管脚使用。
当IRQ1被置1时,P15/IRQ1管脚作为IRQ1输入管脚使用。
P14/IRQ0功能选择:
当IRQ0被清零时,P14/IRQ0管脚作为P14输入/输出管脚使用。
当IRQ0被置1时,P14/IRQ0管脚作为IRQ0输入管脚使用。
H’FFE0
Bit1
Bit0
1
1
IEGR1
IEG1
IEG0
中断沿选择寄存器1:
IRQ1沿选择:
当IEG1=0时,选择下降沿作为IRQ1的中断源。
当IEG1=1时,选择上升沿作为IRQ1的中断源。
IRQ0沿选择:
当IEG0=0时,选择下降沿作为IRQ0的中断源。
当IEG0=1时,选择上升沿作为IRQ0的中断源。
H’FFF2
Bit1
Bit0
1
1
IENR1
IENTA
IEN1
IEN0
中断使能寄存器1:
定时器A中断使能:
当IENTA=0时,禁止定时器A中断申请。
当IENTA=1时,允许定时器A中断申请。
IRQ1中断使能:
当IEN1=0时,禁止IRQ1中断申请。
当IEN1=1时,允许IRQ1中断申请。
IRQ0中断使能:
当IEN0=0时,禁止IRQ0中断申请。
当IEN0=1时,允许IRQ0中断申请。
H’FFF4
Bit6
Bit1
Bit0
1
1
1
IRR1
IRRTA
IRR11
IRR10
中断请求寄存器1:
定时器A中断申请标志:
当IRRTA=0时,没有产生定时器A中断申请。
当IRRTA=1时,产生了一个定时器A中断申请。
IRQ1中断申请标志:
当IRR11=0时,没有产生IRQ1中断申请。
当IRR11=1时,产生一个IRQ1中断申请。
IRQ0中断申请标志:
当IRR10=0时,没有产生IRQ0中断申请。
当IRR10=1时,产生一个IRQ0中断申请。
H’FFF6
Bit6
Bit1
Bit0
0
0
0
RAM说明:
表2.107中列出了这个程序中使用的RAM。
表2.107RAM说明
标号名称
功能
地址
所在模块名称
USRF
SWONF
LDONF
表明开关1闭合或断开的标志。
表明发光二极管LED发光或熄灭的标志
H’FB80
Bit0
Bit1
主程序模块
开关1接通模块
发光二极管LED控制模块
2。
23。
5流程图
图2.108主程序的流程图
英文译文:
主程序——I位置1以禁止中断——PMR1中的IRQ1位置1,设置IRQ1管脚作为IRQ1输入管脚使用——PMR1中的IRQ0位置1,设置IRQ0管脚作为IRQ0输入管脚使用——IEG1至1,设置上升沿作为IRQ1输入管脚的探测沿——IRR11清零——IEN1置1,允许IRQ1中断——IEG0置1,设置上升沿作为IRQ0输入管脚的探测沿——IRR10清零——IEN0清零,禁止IRQ0中断——设置TMA=H’12,选择定时器A的输入时钟,设置Φ/2048(Φ为系统时钟)作为TCA的计数时钟——IRRTA清零——IENTA置1,允许定时器A中断——1。
1——PCR7中的PCR74位置1,设置P74管脚作为输出管脚使用——P74置1,点亮发光二极管LED——LDONF清零——SWONF清零——I位清零,允许中断——SWONF=1?
——SWONF清零——SYSCR1中的SSBY和STS2位置1,STS1和STS0清零——SYSCR2中的SMSEL,LSON,DTON,MA2,SA1和SA0位清零,MA1和MA0置1——P74清零,熄灭发光二极管LED——IRR10清零——IEN0置1,允许IRQ0中断——执行SLEEP指令以转换到备用模式
图2.109IRQ0中断处理程序流程图
英文译文:
清除备用模式——IRR10清零——IEN0清零,禁止IRQ0中断——IENTA置1,允许定时器A中断——中断处理结束
图2.110IRQ1中断处理程序流程图
英文译文:
开关1闭合——IRR11=1?
——IRR11清零——SWONF置1——IEN1清零,禁止IRQ1中断——IENTA清零,禁止定时器A中断——中断处理结束
图2.111定时器A中断处理程序流程图
英文译文:
发光二极管控制LED控制——IRRTA清零——I位清零,允许中断——LDONF=1?
——PDR7中的P74置1(PDR7中的P74清零)——USRF中的LDONF位置1(USRF中的LDONF位置1)——中断处理结束
2。
23。
6源程序清单
INIT.SRC(程序清单)
.EXPORT_INIT
.IMPORT_MAIN
;
.SECTIONP,CODE
_INIT:
MOV.W#H'FF80,R7
LDC.B#B'10000000,CCR
JMP@_main
;
.END
/*H8/300HTiny系列和H8/3664系列使用说明书*/
/*转换到备用模式*/
/*功能*/
/*;低功耗模式;备用模式*/
/*外部时钟:
16MHZ,内部时钟:
16MHZ*/
/*子系统时钟:
32.768KHZ*/
#include
/*符号定义*/
structBIT{
unsignedcharb7:
1;/*第7位*/
unsignedcharb6:
1;/*第6位*/
unsignedcharb5:
1;/*第5位*/
unsignedcharb4:
1;/*第4位*/
unsignedcharb3:
1;/*第3位*/
unsignedcharb2:
1;/*第2位*/
unsignedcharb1:
1;/*第1位*/
unsignedcharb0:
1;/*第0位*/
};
#defineTMA*(volatileunsignedchar*)0xFFA6/*定时器模式寄存器A*/
#defineTMA_BIT(*(structBIT*)0xFFA6)/*定时器模式寄存器A*/
#defineTMA3TMA_BIT.b3/*时间间隔*/
#defineTCA*(volatileunsignedchar*)0xFFA7/*定时器计数器A*/
#definePDR7_BIT(*(structBIT*)0xFFDA)/*端口数据寄存器7*/
#defineP74PDR7_BIT.b4/*端口数据寄存器7第4位*/
#definePMR1_BIT(*(structBIT*)0xFFE0)/*端口模式寄存器1*/
#defineIRQ1_SETPMR1_BIT.b5/*端口模式寄存器1第5位*/
#defineIRQ0_SETPMR1_BIT.b4/*端口模式寄存器1第4位*/
#definePCR7_BIT(*(structBIT*)0xFFEA)/*端口控制寄存器7*/
#definePCR74PCR7_BIT.b4/*端口控制寄存器7第4位*/
#defineSYSCR1*(volatileunsignedchar*)0xFFF0/*系统控制寄存器1*/
#defineSYSCR1_BIT(*(structBIT*)0xFFF0)/*系统控制寄存器1*/
#defineSSBYSYSCR1_BIT.b7/*软件备用模式*/
#defineSTS2SYSCR1_BIT.b6/*备用模式时钟选择2*/
#defineSTS1SYSCR1_BIT.b5/*备用模式时钟选择1*/
#defineSTS0SYSCR1_BIT.b4/*备用模式时钟选择0*/
#defineNESELSYSCR1_BIT.b3/*噪音消除取样频率选择*/
#defineSYSCR2*(volatileunsignedchar*)0xFFF1/*系统控制寄存器2*/
#defineSYSCR2_BIT(*(structBIT*)0xFFF1)/*系统控制寄存器2*/
#defineLSONSYSCR2_BIT.b6/*低速模式标志*/
#defineDTONSYSCR2_BIT.b5/*直接转换标志*/
#defineMA1SYSCR2_BIT.b3/*正常模式时钟选择1*/
#defineMA0SYSCR2_BIT.b2/*正常模式时钟选择0*/
#defineSA1SYSCR2_BIT.b1/*亚正常模式时钟选择1*/
#defineSA0SYSCR2_BIT.b0/*亚正常模式时钟选择0*/
#defineIEGR1_BIT(*(structBIT*)0xFFF2)/*中断沿选择寄存器1*/
#defineIEG1IEGR1_BIT.b1/*IRQ1中断沿选择*/
#defineIEG0IEGR1_BIT.b0/*IRQ0中断沿选择*/
#defineIENR1_BIT(*(structBIT*)0xFFF4)/*中断使能寄存器1*/
#defineIENDTIENR1_BIT.b7/*直接转换中断使能*/
#defineIENTAIENR1_BIT.b6/*定时器A中断使能*/
#defineIEN1IENR1_BIT.b1/*IRQ1中断使能*/
#defineIEN0IENR1_BIT.b0/*IRQ0中断使能*/
#defineIRR1_BIT(*(structBIT*)0xFFF6)/*中断请求寄存器1*/
#defineIRRDTIRR1_BIT.b7/*直接转换中断申请标志*/
#defineIRRTAIRR1_BIT.b6/*定时器A中断申请标志*/
#defineIRRI1IRR1_BIT.b1/*IRQ1中断申请标志*/
#defineIRRI0IRR1_BIT.b0/*IRQ0中断申请标志*/
#pragmainterrupt(IRQ0)
#pragmainterrupt(IRQ1)
#pragmainterrupt(taint)
/********************************************************/
/*函数定义*/
/********************************************************/
externvoidINIT(void);/*设置堆栈指针*/
voidmain(void);
voidIRQ0(void);
voidIRQ1(void);
voidtaint(void);
voidsleep(void);
/********************************************************/
/*RAM定义*/
/********************************************************/
unsignedcharUSRF;/*用户标志*/
#defineUSRF_BIT(*(structBIT*)&USRF)
#defineLDONFUSRF_BIT.b1/*发光二极管LED点亮/熄灭标志*/
#defineSWONFUSRF_BIT.b0/*开关接通标志*/
/********************************************************/
/*向量地址*/
/********************************************************/
#pragmasectionV1/*段向量设置*/
void(*constVEC_TBL1[])(void)={
INIT/*00复位*/
};
#pragmasectionV2/*段向量设置*/
void(*constVEC_TBL2[])(void)={
IRQ0/*IRQ0中断处理函数*/
};
#pragmasectionV3/*段向量设置*/
void(*constVEC_TBL3[])(void)={
IRQ1/*IRQ1中断处理函数*/
};
#pragmasectionV4/*段向量设置*/
void(*constVEC_TBL4[])(void)={
taint/*定时器A中断处理函数*/
};
#pragmasection/*P*/
/********************************************************/
/*主程序*/
/********************************************************/
voidmain(void)
{
set_imask_ccr
(1);/*禁止中断*/
IRQ1_SET=1;/*初始化IRQ1终端输入*/
IRQ0_SET=1;/*初始化IRQ0终端输入*/
IEG0=1;/*设置IRQ0的终端输入为上升沿*/
IEG1=1;/*设置IRQ1的终端输入为上升沿*/
IRRI1=0;/*IRRI1清零*/
IEN1=1;/*允许IRQ1中断*/
IRRI0=0;/*IRRI0清零*/
IEN0=0;/*禁止IRQ0中断*/
TMA=0x12;/*初始化定时器A的功能*/
IRRTA=0;/*IRRTA清零*/
IENTA=1;/*允许定时器A中断*/
P74=0;/*初始化P74*/
PCR74=1;/*初始化P74输出端口*/
LDONF=0;/*初始化LDONF*/
SWONF=0;/*初始化SWONF*/
set_imask_ccr(0);/*允许中断*/
while(SWONF!
=1){/*SWONF的值是否为"1"?
*/
;
}
SWONF=0;/*初始化SWONF*/
SYSCR1=0xC0;/*初始化系统控制寄存器1*/
SYSCR2=0x0C;/*初始化系统控制寄存器2*/
P74=0;