ARM系统讲解与开发流程.ppt

上传人:wj 文档编号:12873375 上传时间:2023-06-08 格式:PPT 页数:89 大小:1.36MB
下载 相关 举报
ARM系统讲解与开发流程.ppt_第1页
第1页 / 共89页
ARM系统讲解与开发流程.ppt_第2页
第2页 / 共89页
ARM系统讲解与开发流程.ppt_第3页
第3页 / 共89页
ARM系统讲解与开发流程.ppt_第4页
第4页 / 共89页
ARM系统讲解与开发流程.ppt_第5页
第5页 / 共89页
ARM系统讲解与开发流程.ppt_第6页
第6页 / 共89页
ARM系统讲解与开发流程.ppt_第7页
第7页 / 共89页
ARM系统讲解与开发流程.ppt_第8页
第8页 / 共89页
ARM系统讲解与开发流程.ppt_第9页
第9页 / 共89页
ARM系统讲解与开发流程.ppt_第10页
第10页 / 共89页
ARM系统讲解与开发流程.ppt_第11页
第11页 / 共89页
ARM系统讲解与开发流程.ppt_第12页
第12页 / 共89页
ARM系统讲解与开发流程.ppt_第13页
第13页 / 共89页
ARM系统讲解与开发流程.ppt_第14页
第14页 / 共89页
ARM系统讲解与开发流程.ppt_第15页
第15页 / 共89页
ARM系统讲解与开发流程.ppt_第16页
第16页 / 共89页
ARM系统讲解与开发流程.ppt_第17页
第17页 / 共89页
ARM系统讲解与开发流程.ppt_第18页
第18页 / 共89页
ARM系统讲解与开发流程.ppt_第19页
第19页 / 共89页
ARM系统讲解与开发流程.ppt_第20页
第20页 / 共89页
亲,该文档总共89页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

ARM系统讲解与开发流程.ppt

《ARM系统讲解与开发流程.ppt》由会员分享,可在线阅读,更多相关《ARM系统讲解与开发流程.ppt(89页珍藏版)》请在冰点文库上搜索。

ARM系统讲解与开发流程.ppt

主题:

ARM开发流程,6.2最小系统设计,6.2.1最小系统概述6.2.2电源设计6.2.3时钟电路设计6.2.4复位电路设计6.2.5调试接口设计6.2.6存储系统设计6.2.7最小系统示例,6.2.1最小系统概述,设计一个最小系统是学习ARM的好方法一个嵌入式处理器自己是不能独立工作的,必须给它供电、加上时钟信号、提供复位信号,如果芯片没有片内程序存储器,则还要加上存储器系统,然后嵌入式处理器芯片才可能工作。

这些提供嵌入式处理器运行所必须的条件的电路与嵌入式处理器共同构成了这个嵌入式处理器的最小系统。

而大多数基于ARM7处理器核的微控制器都有调试接口,这部分在芯片实际工作时不是必需的,但因为这部分在开发时很重要,所以也把这部分也归入最小系统中。

6.2.1最小系统概述,最小系统框图,可选,因为许多面向嵌入式领域的微控制器内部集成了程序和数据存储器,可选,但是在样品阶段通常都会设计这部分电路,供电系统(电源),电源系统为整个系统提供能量,是整个系统工作的基础,具有极其重要的地位,但却往往被忽略。

如果电源系统处理得好,整个系统的故障往往减少了一大半。

6.2.2电源设计,设计电源时要考虑的因素:

1.输出的电压、电流、功率;2.输入的电压、电流;3.安全因素;4.输出纹波;5.电磁兼容和电磁干扰;6.体积限制;7.功耗限制;8.成本限制。

6.2.2电源设计,1.分析需求,6.2.2电源设计,

(1)LPC2000系列微控制所需要的电源类型,1.分析需求,6.2.2电源设计,

(2)系统需求,主要考虑是否需要将数字电源和模拟电源分开。

(1)如果不使用芯片的A/D或者D/A功能,可以不区分数字电源和模拟电源。

(2)如果使用了A/D或者D/A,还需考虑参考电源设计。

1.分析需求,6.2.2电源设计,(3)电源电路的前级和末级,电源前级,电源末级,2.设计末级电源电路,6.2.2电源设计,LPC2000系列微控制1.8V消耗电流的极限值为70mA。

为了保证可靠性并为以后升级留下余量,则电源系统1.8V能够提供的电流应当大于300mA。

整个系统在3.3V上消耗的电流与外部条件有很大的关系,这里假设电流不超过200mA,这样,电源系统3.3V能够提供600mA电流即可。

分析得到以下参数:

3.3V电源设计最大电流:

600mA;1.8V电源设计最大电流:

300mA。

因为系统对这两组电压的要求比较高,且其功耗不是很大,所以不适合用开关电源,应当用低压差模拟电源(LDO)。

合乎技术参数的LDO芯片很多,Sipex半导体SPX1117是一个较好的选择,它的性价比高,且有一些产品可以与它直接替换,减少采购风险。

2.设计末级电源电路,6.2.2电源设计,SPX1117主要特点:

0.8A稳定输出电流;1A稳定峰值电流;3V可调节;低静态电流;0.8A时低压差为1.1V;0.1%线形调整率;0.2%负载调整率;过流及温度保护;多种封装供选择。

6.2.2电源设计,6.2.2电源设计,末级电源电路实例,6.2.2电源设计,模数隔离实例,尽管SPX1117允许的输入电压可达20V(参考芯片数据手册),但太高的电压使芯片的发热量上升,散热系统不好设计,同时影响芯片的性能。

这样,就需要前级电路调整一下。

如果系统可能使用多种电源(如交流电和电池),各种电源的电压输出不一样,就更需要前级调整以适应末级的输入。

通过之前的分析,前级的输出选择为5V。

选择5V作为前级的输出有两个原因:

这个电压满足SPX1117的要求;目前很多器件还是需要5V供电的,这个5V可以兼做前级和末级了。

6.2.2电源设计,3.设计前级电源电路,根据系统在5V上消耗的电流和体积、成本等方面的考虑,前级电路可以使用开关电源,也可以使用模拟电源。

它们的特别如下:

开关电源:

效率较高,可以减少发热量,因而在功率较大时可以减小电源模块的体积;模拟电源:

电路简单,输出电压纹波较小,并且干扰较开关电源小得多。

6.2.2电源设计,3.设计前级电源电路,6.2.2电源设计,模拟电源,开关电源,前级电源电路实例,目前所有的微控制器均为时序电路,需要一个时钟信号才能工作,大多数微控制器具有晶体振荡器。

简单的方法是利用微控制器内部的晶体振荡器,但有些场合(如减少功耗、需要严格同步等情况)需要使用外部振荡源提供时钟信号。

时钟系统,6.2.3时钟电路设计,6.2.3时钟电路设计,目前所有的微控制器均为时序电路,需要一个时钟信号才能工作,大多数微控制器具有晶体振荡器。

简单的方法是利用微控制器内部的晶体振荡器,但有些场合(如减少功耗、需要严格同步等情况)需要使用外部振荡源提供时钟信号。

使用内部振荡器,使用外部时钟源,可以使用稳定的时钟信号源,如有源晶振等。

微控制器在上电时状态并不确定,这造成微控制器不能正确工作。

为解决这个问题,所有微控制器均有一个复位逻辑,它负责将微控制器初始化为某个确定的状态。

这个复位逻辑需要一个复位信号才能工作。

一些微控制器自己在上电时会产生复位信号,但大多数微控制器需要外部输入这个信号。

这个信号的稳定性和可靠性对微控制器的正常工作有重大影响。

复位及其配置系统,6.2.4复位电路设计,复位电路可以使用简单的阻容复位,这个电路成本低廉,但不能保证任何情况产生稳定可靠的复位信号,所以一般场合需要使用专门的复位芯片。

阻容复位,6.2.4复位电路设计,最好避免使用!

常用的复位专用芯片有CATALYST公司的CAT800系列,Sipex公司的SP700系列和SP800系列。

为了适应嵌入式系统的应用,这些公司还推出带有EEPROM存储器和看门狗的复位芯片,这可以降低系统成本和缩小产品体积,减少元件数量也有利于系统的稳定性。

如果系统不需要手动复位功能,可以选择CAT809。

如果需要手动复位功能,可以选择SP705/706、SP708SCN。

种类繁多的复位芯片可以满足不同工作电压和不同复位方式的系统,这里仅介绍其中部分。

注意:

复位芯片的复位门槛的选择至关重要,一般应当选择微控制器的IO口供电电压范围为标准。

LPC2000这个范围为:

3.0V3.6V,所以选择复位门槛电压为2.93V,即电源电压低于2.93V时产生复位信号。

6.2.4复位电路设计,6.2.4复位电路设计,复位电路实例CAT809低有效复位;在工业级温度范围的应用中可直接代替MAX809;Vcc低至1.0V时,复位信号仍然有效;6uA的电源电流;抗电源的瞬态干扰;紧凑的3脚SOT23和SC70封装;工业级温度范围:

40+85。

6.2.4复位电路设计,复位电路实例SP708/R/S/T2.63V:

SP708R;2.93V:

SP708S;3.08V:

SP708T;复位脉冲宽度-200ms;最大电源电流40uA;支持开关式TTL/CMOS手动复位输入;Vcc下降至1V时,nRESET信号仍然有效;SP708/R/S/T支持高/低电平两种方式。

6.2.4复位电路设计,复位电路实例SP6200/6201适用于要求高精度、快速操作和方便使用的应用;极低的关断电流:

最大为1uA;低压差:

160mV100mA。

输出电压高精度:

2%;逻辑控制的电子使能;复位输出(VOUT良好);1uF的陶瓷电容就可保持器件无条件稳定工作。

电压输出使能,复位输出,6.2.4复位电路设计,复位电路实例CAT1024/1025具有2K字节EEPROM存储器,数据保存时间长达100年;存储器采用400KHz的I2C总线接口,16字节的页写缓冲区;CAT1025具有高、低电平复位信号,CAT1024具有低电平复位信号。

Vcc低至1V时复位仍有效;工作电压范围:

2.7V5.5V;手动复位输入。

6.2.4复位电路设计,微控制器在复位后可能有多种初始状态,具体复位到哪种初始状态是在复位的过程中决定的。

复位逻辑可能通过片内只读存储器中的数据决定具体的初始状态,但更多的是通过复位期间的引脚状态决定,也可能通过两者共同决定。

用引脚状态配置复位后的初始状态没有统一的方法,需要根据相关芯片的手册决定。

P2.26和P2.27决定复位后存储器的来源以及存储器的宽度,P1.26决定复位后是否使用P1.31P1.26作为调试端口,P1.20决定复位后是否使用P1.25P1.16作为跟踪端口,P0.14决定复位后是否进入ISP状态,调试与测试接口不是系统运行必须的,但现代系统越来越强调可测性,调试、测试接口的设计也要重视了。

LPC2000有一个内置JTAG调试接口,通过这个接口可以控制芯片的运行并获取内部信息。

调试测试接口,6.2.5调试接口设计,调试接口电路一,ETM功能仅在高级仿真器中具有,用户如果没有使用,可以将其省略,同时把TRACESYNC信号上的电阻也去掉。

6.2.5调试接口设计,RTCK必须接4.7K下拉电阻。

标准20针JTAG,调试接口电路一,在该电路中,复位电路与前面介绍电路有所不同。

它在复位信号和CPU之间插入了三态门74HC125。

使用三态门主要是为了复位芯片和JTAG(ETM)仿真器都可以复位芯片。

如果没有74HC125,当复位芯片输出高电平时,JTAG(ETM)仿真器就不可能把它拉低,这不但不能实现需要的功能,还可能损坏复位芯片或JTAG(ETM)仿真器。

6.2.5调试接口设计,因为这种电路JTAG(ETM)仿真器对LPC2000有完全的控制,其仿真性能最好。

不过,由于74HC125工作的电压范围低于复位芯片的工作电压范围,所以此电路一般用于样机。

正式产品中可以不需要这部分电路。

6.2.5调试接口设计,调试接口电路二,6.2.5调试接口设计,RTCK必须接4.7K下拉电阻。

ETM跟踪接口,标准20针JTAG,大部分LPC2000芯片都有片内Flash,可以不用再设计额外的存储器系统。

如果微控制器没有片内存储器,就必须设计存储器系统,这一般通过微控制器的外部总线接口实现。

存储器系统,6.2.6存储系统,如果需要外扩存储系统,需要考虑:

(1)总线宽度

(2)总线速度尽量避免使用8位总线,推荐使用16和32位总线,器件选型尽量选择高速存储器。

如果使用16位总线,使用Thumb指令集可获得更高的性能。

6.2.6存储系统,示例:

LPC2210存储器系统,6.2.6存储系统,复位后使用外部16位宽度存储器,16位SRAM,16位FLASH,LPC2100系列没有外部总线接口的最小系统;LPC2130系列没有外部总线接口的最小系统;LPC2200系列使用内部存储器的最小系统;LPC2200系列使用外部存储器的最小系统。

6.2.7最小系统实例,完整的最小系统LPC2100系列,决定是否进入ISP状态,如果该引脚悬空将影响程序脱机运行,6.2.7最小系统实例,3.3V电源,1.8V电源,复位电路,时钟电路,完整的最小系统LPC2130系列,6.2.7最小系统实例,3.3V电源,复位电路,时钟电路,决定是否进入ISP状态,如果该引脚悬空将影响程序脱机运行,6.2.7最小系统实例,完整的最小系统LPC2200不使用外部存储器,复位后使用内部存储器,3.3V电源,1.8V电源,复位电路,时钟电路,决定是否进入ISP状态,如果该引脚悬空将影响程序脱机运行,6.2.7最小系统实例,完整的最小系统LPC2200使用外部存储器,复位后使用外部16位宽度存储器,3.3V电源,1.8V电源,复位电路,时钟电路,决定是否进入ISP状态,如果该引脚悬空将影响程序脱机运行,SRAM,FLASH,6.3软件开发平台,6.3.1ISP下载软件6.3.2ADS集成开发环境6.3.3EasyJTAG使用6.3.4LPC2000工程模板,6.3.1ISP下载软件,简介,ISP下载软件是Philips为LPC2000系列芯片编写的一款程序下载软件,全称是LPC2000FlashUtility,最新版本为V2.2.2,支持LPC2000所有芯片。

常用于批量生产时下载程序,亦可用于检测最小系统。

6.3.1ISP下载软件,界面,6.3.1ISP下载软件,设置,设定晶振,设定串口波特率,6.3.1ISP下载软件,操作,下载校验,查空擦除,读取ID,芯片型号,6.3.1ISP下载软件,重点提示,设计好最小系统后,最好先用ISP软件对最小系统进行测试,如果能进行ISP连接操作(如读取ID),则才能进行下一步的工作,如JTAG调试。

如果ISP测试不能工作,则需要先检查最小系统硬件电路。

系统可以没有JTAG调试电路,但不能没有UART0电路/接口。

UART0电路(ISP电路),6.3.1ISP下载软件,6.3.1ISP下载软件,ISP不成功常见原因和解决办法,

(1)确保各路电源正常

(2)确保UART0电路正常,可用PC检测(3)确保晶振正常(4)确保复位电路正常(5)检测PCB是否存在短路/断路,6.3.2ADS集成开发环境,简介,ADS是目前国内使用最广泛的ARM开发环境。

ADS为ARM公司所有,全称为ARMDeveloperSuite,成熟版本为ADS1.2,支持ARM10之前的所有ARM控制器,支持软件调试和JTAG硬件仿真调试,支持汇编、C、C+源程序;编译效率高、系统功能强,可以在Win98/2000/XP和RedHat上运行。

6.3.2ADS集成开发环境,简介,ADS1.2集成开发环境组成部分,6.3.2ADS集成开发环境,CodeWorriarIDE界面,源程序编辑窗口,工程管理窗口,6.3.2ADS集成开发环境,AXD调试器界面,源代码查看区,调试控制快捷图标,6.3.2ADS集成开发环境,ADS使用注意:

最好不要将ADS工程放在有中文的路径下。

6.4启动代码,6.4.1启动代码内容6.4.2启动代码工作流程,6.4.1启动代码内容,

(1)启动代码简介,广州致远电子有限公司为LPC2000系列芯片编写的启动代码由3个文件组成。

(1)startup.s异常向量表定义、各模式堆栈初始化、跳转到C程序main入口等。

(2)target.c目标板初始化,如时钟分频、PLL设置、VIC设置等。

(3)irq.s用于管理中断嵌套。

6.4.1启动代码内容,

(1)startup.s,CODE32AREAvectors,CODE,READONLYENTRY;中断向量表ResetLDRPC,ResetAddrLDRPC,UndefinedAddrLDRPC,SWI_AddrLDRPC,PrefetchAddrLDRPC,DataAbortAddrDCD0xb9205f80LDRPC,PC,#-0xff0LDRPC,FIQ_AddrResetAddrDCDResetInitUndefinedAddrDCDUndefinedSWI_AddrDCDSoftwareInterruptPrefetchAddrDCDPrefetchAbortDataAbortAddrDCDDataAbortNouseDCD0IRQ_AddrDCD0FIQ_AddrDCDFIQ_Handler,汇编入口,异常向量表,地址跳转表,6.4.1启动代码内容,

(1)startup.s,;未定义指令UndefinedBUndefined;软中断SoftwareInterruptBSoftwareInterrupt;取指令中止PrefetchAbortBPrefetchAbort;取数据中止DataAbortBDataAbort;快速中断FIQ_HandlerSTMFDSP!

R0-R3,LRBLFIQ_ExceptionLDMFDSP!

R0-R3,LRSUBSPC,LR,#4,异常处理程序,FIQ处理程序,在target.c中实现,6.4.1启动代码内容,

(1)startup.s,InitStackMOVR0,LRMSRCPSR_c,#0xd3;设置管理模式堆栈LDRSP,StackSvcMSRCPSR_c,#0xd2;设置中断模式堆栈LDRSP,StackIrqMSRCPSR_c,#0xd1;设置快速中断模式堆栈LDRSP,StackFiqMSRCPSR_c,#0xd7;设置中止模式堆栈LDRSP,StackAbtMSRCPSR_c,#0xdb;设置未定义模式堆栈LDRSP,StackUndMSRCPSR_c,#0xdf;设置系统模式堆栈LDRSP,=StackUsrMOVPC,R0ResetInitBLInitStack;初始化堆栈BLTargetResetInit;目标板基本初始化B_main;跳转到c语言入口,设置各模式堆栈,6.4.1启动代码内容,

(1)startup.s,SVC_STACK_LEGTHEQU0FIQ_STACK_LEGTHEQU0IRQ_STACK_LEGTHEQU256ABT_STACK_LEGTHEQU0UND_STACK_LEGTHEQU0AREAMyStacks,DATA,NOINIT,ALIGN=2SvcStackSpaceSPACESVC_STACK_LEGTH*4;管理模式栈空间IrqStackSpaceSPACEIRQ_STACK_LEGTH*4;中断模式栈空间FiqStackSpaceSPACEFIQ_STACK_LEGTH*4;快速中断模式栈空间AbtStackSpaceSPACEABT_STACK_LEGTH*4;中止义模式栈空间UndtStackSpaceSPACEUND_STACK_LEGTH*4;未定义模式栈StackSvcDCDSvcStackSpace+(SVC_STACK_LEGTH-1)*4StackIrqDCDIrqStackSpace+(IRQ_STACK_LEGTH-1)*4StackFiqDCDFiqStackSpace+(FIQ_STACK_LEGTH-1)*4StackAbtDCDAbtStackSpace+(ABT_STACK_LEGTH-1)*4StackUndDCDUndtStackSpace+(UND_STACK_LEGTH-1)*4AREAHeap,DATA,NOINITbottom_of_heapSPACE1AREAStacks,DATA,NOINITStackUsr,定义各模式堆大小,计算并分配各模式栈空间分散加载,文字池:

各模式栈起点,堆空间,分散加载,用户堆栈空间,分散加载,6.3.4LPC2000工程模板,

(1)mem_a.scfmem_c.scf,ROM_LOAD0x00000000ROM_EXEC0x00000000Startup.o(vectors,+First)*(+RO)IRAM0x40000000Startup.o(MyStacks)*(+RW,+ZI)HEAP+0UNINITStartup.o(Heap)STACKS0x40002000UNINITStartup.o(Stacks),6.4.1启动代码内容,

(2)target.c,voidFIQ_Exception(void)while

(1);/这一句替换为自己的代码voidTargetResetInit(void)#ifdef_DEBUG_RAMMEMMAP=0x2;/remap#endif#ifdef_DEBUG_FLASHMEMMAP=0x1;/remap#endif#ifdef_IN_CHIPMEMMAP=0x1;/remap#endif/*设置系统各部分时钟*/PLLCON=1;#if(Fpclk/(Fcclk/4)=1VPBDIV=0;#endif,FIQ处理程序,调试时,根据用户选择的目标设置Remap,根据config.h用户定义的时钟自动设定VPB分频值,6.4.1启动代码内容,

(2)target.c,/*设置系统各部分时钟*/PLLCON=1;#if(Fpclk/(Fcclk/4)=1VPBDIV=0;#endif#if(Fpclk/(Fcclk/4)=2VPBDIV=2;#endif#if(Fpclk/(Fcclk/4)=4VPBDIV=1;#endif#if(Fcco/Fcclk)=2PLLCFG=(Fcclk/Fosc)-1)|(05);#endif#if(Fcco/Fcclk)=4PLLCFG=(Fcclk/Fosc)-1)|(15);#endif#if(Fcco/Fcclk)=8PLLCFG=(Fcclk/Fosc)-1)|(25);#endif#if(Fcco/Fcclk)=16PLLCFG=(Fcclk/Fosc)-1)|(35);#endif,根据config.h用户定义的时钟自动设定PLL的P和M,根据config.h用户定义的时钟自动设定VPB分频值,6.4.1启动代码内容,

(2)target.c,/*设置存储器加速模块*/MAMCR=0;#ifFcclk20000000MAMTIM=1;#else#ifFcclk40000000MAMTIM=2;#elseMAMTIM=3;#endif#endifMAMCR=2;/*初始化VIC*/VICIntEnClr=0xffffffff;VICVectAddr=0;VICIntSelect=0;/*添加自己的代码*/*/,设定MAM,设定VIC,留给用户使用,6.4.2启动代码工作流程,复位后,启动代码工作及内容:

(1)复位后,PC0,根据异常向量表,跳转到复位处理程序。

(2)执行复位程序。

堆栈初始化目标板初始化跳到C程序main入。

(3)执行用户程序。

复位,

(1)ResetInit的地址转入PC,

(2)程序跳转到ResetInit,(3)各模式堆栈初始化,6.4.2启动代码工作流程,

(1)ResetInit的地址转入PC,

(2)程序跳转到ResetInit,(3)各模式堆栈初始化,(4)进行目标板初始化,6.4.2启动代码工作流程,

(1)ResetInit的地址转入PC,

(2)程序跳转到ResetInit,(3)各模式堆栈初始化,(4)进行目标板初始化,(5)跳转到main入口,6.4.2启动代码工作流程,参考资料,启动代码和分散加载在深入浅出ARM7LPC213x/LPC214x(上册)中有详细描述。

详见3.9启动代码综述一节。

ARM之旅,当前位置,6.5GPIO模块,

(一)特性,LPC2000的GPIO具有如下的特性:

可以独立控制每个GPIO口的方向(输入/输出模式)可以独立设置每个GPIO的输出状态(高/低电平)所有GPIO口在复位后默认为输入状态部分GPIO有快速GPIO特性,6.5GPIO模块,

(二)应用,检测数字输入,如键盘或开关信号,驱动LED或其它指示器,控制片外器件,6.5GPIO模块,(三)引脚描述,LPC2114/2124微控制器具有两个端口P0和P1,可以作为GPIO使用的引脚数为46个。

LPC2210/2212/2214微控制器还包含另外两个端口P2和P3,这个两个端口与外部存储器总线复用,当它们全部作为GPIO使用时,GPIO引脚数多达112个。

6.5GPIO模块,(四)内部结构,GPIO内部结构示意,引脚,6.5GPIO模块,(五)GPIO操作,除了设定管脚连接之外,GPIO还有如下操作:

(1)设定GPIO方向

(2)控制GPIO(3)读取管脚电平(4)读取GPIO设置,6.5GPIO模块,

(1)设定GPIO方向,通过GPIO方向寄存器IODIR进行控制。

方向控制:

1输出0输入,每个P口都有自己的IODIR寄存器。

IOxDIR和相应的Px口对应。

6.5GPIO模块,

(2)控制GPIO,拉高某位口线通过置位相应

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2