16位单片机及语音嵌系统

上传人:s9****2 文档编号:578835819 上传时间:2024-08-25 格式:PPT 页数:233 大小:6.16MB
返回 下载 相关 举报
16位单片机及语音嵌系统_第1页
第1页 / 共233页
16位单片机及语音嵌系统_第2页
第2页 / 共233页
16位单片机及语音嵌系统_第3页
第3页 / 共233页
16位单片机及语音嵌系统_第4页
第4页 / 共233页
16位单片机及语音嵌系统_第5页
第5页 / 共233页
点击查看更多>>
资源描述

《16位单片机及语音嵌系统》由会员分享,可在线阅读,更多相关《16位单片机及语音嵌系统(233页珍藏版)》请在金锄头文库上搜索。

1、16位单片机位单片机及语音嵌入式系统及语音嵌入式系统赵定远赵定远马洪江马洪江主主编编1第第1章章SPCE061A单片机简介单片机简介2一、一、 nSP家族的模块式结构家族的模块式结构 3v体积小、集成度高、可靠性好且易于扩展体积小、集成度高、可靠性好且易于扩展v具有较强的中断处理能力具有较强的中断处理能力v高性能价格比高性能价格比v功能强、效率高的指令系统功能强、效率高的指令系统二、二、 nSP家族的特点家族的特点4性能性能三、三、SPCE061A简介简介v16位位 nSP微处理器;微处理器;v工作电压:工作电压:VDD为为2.6-3.6V(cpu),VDDH为为VDD-5.5V(I/O)vC

2、PU时钟:时钟:0.32MHz-49.152MHz;v内置内置2K字字SRAM;v内置内置32K字字FLASH;v可编程音频处理;可编程音频处理;v晶体振荡器;晶体振荡器;v系统处于备用状态下系统处于备用状态下(时钟处于停止状态时钟处于停止状态),耗电小,耗电小于于2 A/3.6V;5v2个个16位位可可编编程程定定时时器器/计计数数器器(可可自自动动预预置置初初始始计计数值数值);v2个个10位位DAC(数数-模转换模转换)输出通道;输出通道;v32位通用可编程输入位通用可编程输入/输出端口;输出端口;v14个中断源可来自定时器个中断源可来自定时器A/B,时基,时基,2个外部个外部时钟源输入

3、,键唤醒;时钟源输入,键唤醒;v具备触键唤醒的功能;具备触键唤醒的功能;v使使用用凌凌阳阳音音频频编编码码SACM_S240方方式式(2.4K位位/秒秒),能容纳,能容纳210秒的语音数据;秒的语音数据;v锁相环锁相环PLL振荡器提供系统时钟信号;振荡器提供系统时钟信号;性能性能6v32768Hz实时时钟;实时时钟;v7通通道道10位位电电压压模模-数数转转换换器器(ADC)和和单单通通道道声声音音模模-数转换器;数转换器;v声声音音模模-数数转转换换器器输输入入通通道道内内置置麦麦克克风风放放大大器器和和自自动动增益控制增益控制(AGC)功能;功能;v具备串行设备接口;具备串行设备接口;v具

4、有低电压复位具有低电压复位(LVR)功能和低电压监测功能和低电压监测(LVD)功能;功能;v内内 置置 在在 线线 仿仿 真真 电电 路路 ICE( In-CircuitEmulator)接口;接口;v具有保密能力;具有保密能力;v具有具有WatchDog功能(由具体型号决定)。功能(由具体型号决定)。性能性能7四、四、SPCE061A简介的结构简介的结构8芯片引脚排列芯片引脚排列9SPCE061A实物图实物图1.2SPCE061A简介简介10SPCE061A最小系统的构成最小系统的构成11五、五、SPCE061A开发方法开发方法v通过在线调试器通过在线调试器PROBE实现。实现。v它既是一个

5、编程器(即程序烧写器),又是一个它既是一个编程器(即程序烧写器),又是一个 实时在线调试器。实时在线调试器。vPROBE工作于凌阳工作于凌阳IDE集成开发环境软件包下,集成开发环境软件包下,其其5芯的仿真头直接连接到目标电路板上芯的仿真头直接连接到目标电路板上SPCE061A相应管脚,直接在目标电路板上的相应管脚,直接在目标电路板上的CPU-SPCE061A调试、运行用户编制的程序。调试、运行用户编制的程序。vPROBE的另一头是标准的另一头是标准25针打印机接口,直接连针打印机接口,直接连接到计算机打印口与上位机通讯,在计算机接到计算机打印口与上位机通讯,在计算机IDE集集成开发环境软件包下

6、,完成在线调试功能。成开发环境软件包下,完成在线调试功能。12计算机、计算机、PROBE、用户目标板连接图用户目标板连接图 13计算机、计算机、PROBE、用户目标板连接实物图用户目标板连接实物图 14本章内容结束本章内容结束15第第2章章SPCE061A单片机单片机硬件结构硬件结构162.1 nSP的的核心结构核心结构172.1.1ALU算术逻辑运算单元算术逻辑运算单元v16位算术逻辑运算位算术逻辑运算nSP提提供供了了基基本本算算术术运运算算与与逻逻辑辑操操作作指指令令,加加法法、减减法法、比比较较、补补码码、异异或或、或或、与与、测测试试、写写入入、读读出出等等16位位算算术术逻逻辑辑运

7、运算算及及数数据传送操作。据传送操作。182.1.1ALU算术逻辑运算单元算术逻辑运算单元v结合算术逻辑的结合算术逻辑的16位移位运算位移位运算包包括括:算算术术右右移移ASR、逻逻辑辑左左移移LSL、逻逻辑辑右右移移LSR、旋转左移旋转左移ROL及旋转右移及旋转右移ROR。nSP的的移移位位指指令令是是复复合合式式指指令令,一一个个指指令令会会同同时时完完成成移移位位和和算算术术逻逻辑辑运运算算。程程序序设设计计者者可可利利用用这这些些复复合合式式的的指指令令,撰撰写写更更精精简简的的程程序序代代码码,进进而而增增加程序代码密集度加程序代码密集度(CodeDensity)。192.1.1AL

8、U算术逻辑运算单元算术逻辑运算单元v16位位1 16位的乘法运算和内积位的乘法运算和内积(乘加乘加)运算运算高速的高速的16位位16位乘法运算指令位乘法运算指令MUL和和16位内积运算指位内积运算指令令MULS。可可以以用用于于有有符符号号数数相相乘乘(signedsigned)或或无无符符号号数数与与有有符符号号数数相相乘乘(unsignedsigned)的的运运算算。MUL指指令令只只需花费需花费12个时钟周期,个时钟周期,MULS指令花费指令花费10n+6个时钟周个时钟周期,其中期,其中n为乘加的项数。例如:为乘加的项数。例如:“MR=R2*R1,4”表示求表示求4项乘积的和,项乘积的和

9、,MULS指令只需花费指令只需花费46(104+6=46)个时钟周期。这两条指令大大的提升了)个时钟周期。这两条指令大大的提升了nSP的数字信号处理能力。的数字信号处理能力。202.1.2寄存器组寄存器组v共有共有8个个16位寄存器位寄存器v分为通用寄存器和专用寄存器两大类分为通用寄存器和专用寄存器两大类v通通用用寄寄存存器器包包括括:R1R4,作作为为算算术术逻逻辑辑运算的来源及目标寄存器运算的来源及目标寄存器v专专用用寄寄存存器器包包括括:SP、BP、SR、PC,是是与与CPU特定用途相关的寄存器特定用途相关的寄存器212.1.2寄存器组寄存器组v通通 用用 寄寄 存存 器器 R1R4(G

10、eneral-purposeregisters)可可用用于于数数据据运运算算或或传传送送的的来来源源及及目目标标寄寄存存器器。寄寄存存器器R4、R3配配对对使使用用,还还可可组组成成一一个个32位位的的乘乘法法结结果果寄寄存存器器MR;R4为为MR的的高高字字符符组组,R3为为MR的的低低字字符符组组,用用于于存存放放乘乘法法运运算算或或内内积积运运算结果算结果222.1.2寄存器组寄存器组v堆栈指针寄存器堆栈指针寄存器SP(StackPointer)SP用来记录堆栈地址,指向堆栈顶端。用来记录堆栈地址,指向堆栈顶端。堆堆栈栈是是一一个个先先进进后后出出的的内内存存结结构构,nSP的的堆堆栈栈

11、结结构由高地址往低地址方向储存。构由高地址往低地址方向储存。CPU执执行行push、子子程程序序调调用用call及及进进入入中中断断服服务务子子程程序序(ISR,InterruptServiceRoutine)时时,会会在在堆堆栈栈里里储储存存寄寄存存器器内内容容,这这时时SP会会递递减减以以反反映映堆堆栈栈用用量量的的增增加加。当当CPU执执行行pop、子子程程序序返返回回ret及及从从ISR返返回回reti时,时,SP会递增以反映堆栈用量的减少。会递增以反映堆栈用量的减少。nSP堆堆栈栈的的大大小小限限制制在在2K字字的的SRAM内内,即即地地址为址为0x0000000x0007FF的内存

12、范围中。的内存范围中。232.1.2寄存器组寄存器组v基址指针寄存器基址指针寄存器BP(BasePointer)nSP提供了一种方便的寻址方式,即基址提供了一种方便的寻址方式,即基址寻址方式寻址方式BP+IM6;程序设计者可通过程序设计者可通过BP来存来存取取ROM与与RAM中的数据,包括:局部变量中的数据,包括:局部变量(LocalVariable)、)、函数参数(函数参数(FunctionParameter)、)、返回地址(返回地址(ReturnAddress)等。等。BP还可做为通用寄存器还可做为通用寄存器R5,用于数据运算传送用于数据运算传送的来源及目标寄存器。的来源及目标寄存器。24

13、2.1.2寄存器组寄存器组v程序计数器程序计数器PC(ProgramCounter)用来记录程序目前执行位置,以控制程序走向。用来记录程序目前执行位置,以控制程序走向。CPU每执行完一个指令,就会改变每执行完一个指令,就会改变PC的值,使的值,使其指向下一条指令的地址。在其指向下一条指令的地址。在nSP里,里,16位的位的PC寄存器与寄存器与SR寄存器的寄存器的CS字段,共同组字段,共同组成一个成一个22位的程序代码地址。位的程序代码地址。252.1.2寄存器组寄存器组v状态寄存器状态寄存器SR(StatusPointer)状状态态寄寄存存器器SR内内含含许许多多字字段段,每每个个字字段段都都

14、有有特特别别的的用用途途。其其中中包包含含两两个个6位位的的区区段段选选择择字字段段:CS(CodeSegment),DS(DataSegment),它它们们可可与与其其它它16位位的的寄寄存存器器结结合合在在一一起起形形成成一一个个22位位的的地地址址,用用来来寻寻址址4M字字容容量量的的内内存存。SPCE061A只只有有32K字字的的闪闪存存,只只占占用用一一页页的的存存储储空空间间,所所以以CS和和DS字字段段在在SPCE061A中都是设为中都是设为0。算算数数逻逻辑辑运运算算的的结结果果会会影影响响CPU内内的的标标志志(flag),标标志志的的内内容容可可以以作作为为条条件件判判断断

15、的的依依据据。nSP有有四四个个1位位的的标标志志:N、Z、S、C,即即SR寄寄存存器器中中间间的的4个位(个位(B6B9)。)。262.1.3数据总线和地址总线数据总线和地址总线nSP是是16位位单单片片机机,它它具具有有16位位的的数数据据线线和和22位位地地址址线线。所所以以其其基基本本数数据据类类型型是是16位位的的“字字”型型,内内存存都都是是按按“字字”操操作作,22位位地地址址线线最最多多可可寻寻址址到到4M字字的的内内存存空空间间。地地址址线线中中的的高高6位位A16A21来来自自SR寄寄存存器器中中6位位的的CS字字段段或或是是6位位的的DS字字段段,低低16位位A0A15则

16、则来来自自内内部部寄寄存存器器。通通常常,地地址址线线的的高高6位位称称为为内内存存地地址址的的PageSelector,简简称称为为页页码码(Page);而而低低16位位则则称称为为内内存存地址的偏移量(地址的偏移量(Offset)。)。 nSP通过对区段(通过对区段(Segment)的编码来实现内存的编码来实现内存分页检索,通过分页检索,通过Segment与与Offset的配合产生的配合产生22位地址,位地址,(注意:(注意:SPCE061A只有只有32K字闪存字闪存FLASH,仅占一页仅占一页存储空间,所以存储空间,所以CS字段和字段和DS字段在字段在SPCE061A用不到,用不到,都设

17、为都设为0)272.2SPCE061A片内存储器结构片内存储器结构SPCE061A片内有片内有2K字的字的SRAM和和32K闪存。闪存。282.2.1RAMSPCE061A有有2K字的字的SRAM(包括堆栈区包括堆栈区),地址范围从地址范围从0x0000到到0x07FF。前前64个字,个字,即即0x00000x003F地址范围内,可采用地址范围内,可采用6位位地址直接地址寻址方法,存取速度为地址直接地址寻址方法,存取速度为2个个CPU时时钟周期;其余范围内钟周期;其余范围内(0x00400x07FF)内存内存的存取速度则为的存取速度则为3个个CPU时钟周期。时钟周期。292.2.2堆栈堆栈SP

18、SP是是用用来来记记录录堆堆栈栈地地址址的的寄寄存存器器,SP会会指指向向堆堆栈栈的的顶端。顶端。堆堆栈栈是是一一个个先先进进后后出出的的内内存存结结构构,nSP的的堆堆栈栈结结构构是是由由高高地地址址往往低低地地址址的的方方向向来来储储存存的的。CPU执执行行push、子子程程序序呼呼叫叫call及及进进入入中中断断服服务务子子程程序序(ISR,InterruptServiceRoutine)时时,会会储储存存寄寄存存器器内内容容在在堆堆栈栈里里,这这时时SP会会递递减减以以反反映映堆堆栈栈用用量量的的增增加加。当当CPU执执行行pop、子子程程序序返返回回ret及及从从ISR返返回回ret

19、i时时,SP会会递递增以反映堆栈用量的减少。增以反映堆栈用量的减少。nSP堆栈大小限制在堆栈大小限制在2K字的字的SRAM内,即地址内,即地址为为0x0000000x0007FF的内存范围中。的内存范围中。SPCE061A系统系统复位后,复位后,SP初始化为初始化为0x07FF,每执行每执行push指令一次,指令一次,SP指针减一。指针减一。302.2.3闪存闪存FlashSPCE061A是是用用闪闪存存替替代代maskROM的的MTP(multi-time-programmable)芯芯片片,闪闪存存可可进进行行多多次次擦擦除除与与写写入入,可可用用来来存存储储程程序序与与数数据据。SPCE

20、061A具具有有32K字字(32K16位位)闪闪存存,32K字字的的内内嵌嵌闪闪存存被被划划分分为为128页页,每每页页存存储储容容量量为为256字字。它它们们在在CPU正正常常运运行行状状态态下下均均可可通通过过程程序序擦擦除除或或写写入入。全全部部32K字字闪闪存存均均可可在在ICE工工作作方方式式下下被被写写入入或或被被擦擦除除。不不对对用用户户开开放放整整体体擦除功能。擦除功能。312.2.3闪存闪存Flash用用户户通通过过向向P_Flash_Ctrl (写写) ($7555H)单单元元写写入入0xAAAA启启用用闪闪存存的的存存取取功功能能。然然后后,向向P_Flash_Ctrl(

21、写写)($7555H)单单元元写入写入0x5511,来擦除页的内容。来擦除页的内容。为保证数据的正确写入,用户必须在写入之为保证数据的正确写入,用户必须在写入之前擦除页的内容。页大小为前擦除页的内容。页大小为0x100。第一页第一页地址范围:地址范围:0x80000x80FF,最后一页最后一页的地址范围:的地址范围:0xFF000xFFFF。0xFC000xFFFF范围内的地址由系统保范围内的地址由系统保留,用户最好不要用本范围内的地址。留,用户最好不要用本范围内的地址。322.3SPCE061A的输入的输入/输出接口输出接口v输入输入/输出接口(简称输出接口(简称I/O端口)是单片机端口)是

22、单片机与外设交换信息的通道。与外设交换信息的通道。v输入端口负责从外界接收检测信号、键盘输入端口负责从外界接收检测信号、键盘信号等各种开关量信号。信号等各种开关量信号。v输出端口负责向外界传送由内部电路产生输出端口负责向外界传送由内部电路产生的处理结果、显示信息、控制命令、驱动的处理结果、显示信息、控制命令、驱动信号等。信号等。332.3SPCE061A的输入的输入/输出接口输出接口vnSP内有并行和串行两种方式的内有并行和串行两种方式的I/O口。口。v并行口线路成本较高,但是传输速率也较高;并行口线路成本较高,但是传输速率也较高;v串串行行口口的的传传输输速速率率较较低低但但可可以以节节省省

23、大大量量的的线线路成本。路成本。342.3SPCE061A的输入的输入/输出接口输出接口vSPCE061A有有两两个个16位位的的通通用用并并行行I/O口口:A口口和和B口口。这这两两个个端端口口的的每每一一位位都都可可通通过过编编程程单独定义成输入或输出口单独定义成输入或输出口。A口口的的IOA0-IOA7作作为为输输入入端端口口时时,具具有有唤唤醒醒功功能能,即即当当输输入入电电平平发发生生变变化化时时,会会触触发发CPU中中断断。在在电电池池供供电电、追追求求低低耗耗电电的的应应用用场场合合,可可以以让让CPU进进入入睡睡眠眠模模式式(利利用用软软件件控控制制)以以降降低低功功耗耗,需需

24、要要时时才才以以按按键键来来唤唤醒醒CPU,使使其其进进入入工工作作状状态态。例例如如:手手持持遥遥控器、电子字典、控器、电子字典、PDA、计算器、无线电话等。计算器、无线电话等。352.3.1I/O端口端口结构结构SPCE061A提提供供了了位位控控制制结结构构的的I/O端端口口,每每一一位位可可单单独独用用于于数数据据输输入入或或输输出出。每每个个独独立立的的位位可可通通过以下过以下3种控制向量来作设定:种控制向量来作设定:数据向量数据向量Data属性向量属性向量Attribution方向控制向量方向控制向量Direction362.3.1I/O端口端口结构结构每每3个个对对应应控控制制向

25、向量量组组合合在在一一起起,形形成成一一个个控控制制字字,用用来来定定义义相相对对应应I/O端端口口位位的的输输入入输输出出状状态态和和方方式式。例例如如,需需要要IOA0是是下下拉拉输输入入引引脚脚,则则对对应应的的Data、Attribution和和Direction的的值值均均被被设设为为“0”。如如需需要要IOA1是是带带唤唤醒醒功功能能的的悬悬浮浮式式输输入入引引脚脚,则则Data、Attribution和和Direction的的值值被被设设为为“010”。与与其其它它的的单单片片机机相相比比,SPCE061A除除了了每每个个I/O口口可可以以单单独独定定义义其其状状态态外外,每每个

26、个对对应应状状态态下下的的I/O端端口口性性质质电路都是内置的,在实际的电路中不需要再外接。电路都是内置的,在实际的电路中不需要再外接。A口和口和B口的口的Data、Attribution和和Direction的设定值均在不同的寄存器里,用户在进行的设定值均在不同的寄存器里,用户在进行I/O端口端口设置时要特别注意这一点设置时要特别注意这一点372.3.2并行并行I/O端口的端口的控制向量组合控制向量组合v方向向量方向向量_Dir、属性向量属性向量_Attrib和数据向量和数据向量_Data分别代表三个控制口。分别代表三个控制口。v三个端口中每个对应的字节合在一起,形成一个控三个端口中每个对应

27、的字节合在一起,形成一个控制字,来定义相对应制字,来定义相对应I/O端口位的输入端口位的输入/输出状态和输出状态和方式。方式。 382.3.2并行并行I/O端口的端口的控制向量组合控制向量组合v_Dir位位决决定定端端口口位位的的输输入入/输输出出方方向向:0为为输输入入,1为输出。为输出。v_Attrib位位决决定定在在端端口口位位的的输输入入状状态态下下是是为为悬悬浮浮式式输输入入还还是是非非悬悬浮浮式式输输入入:0为为带带上上拉拉或或下下拉拉电电阻阻式式输输入入,1为为悬悬浮浮式式输输入入。在在端端口口位位输输出出状状态态下下决决定定其其输输出出是是反相还是同相:反相还是同相:0为反相输

28、出,为反相输出,1则为同相输出。则为同相输出。v_Data位位在在端端口口位位的的输输入入状状态态下下被被写写入入时时,与与_Attrib字字节节合合在在一一起起形形成成输输入入方方式式的的控控制制字字00、01、10、11,以以决决定定输输入入端端口口是是带带唤唤醒醒功功能能的的上上拉拉电电阻阻式式、下下拉拉电电阻阻式式或或悬悬浮浮式式以以及及不不带带唤唤醒醒功功能能的的悬悬浮浮式式输输入入。_Data位位在在端端口口位位的的输输出出状状态态下下被被写写入入的的是是输输出出数数据据,不不过过,数数据据是是经经过过反反相相器器输输出出还还是是经经过过同相寄存器输出要由同相寄存器输出要由_Att

29、rib位来决定。位来决定。392.3.2并行并行I/O端口的端口的控制向量组合控制向量组合设置举例:设置举例:1、把把A口口的的B0定定义义成成下下拉拉电电阻阻式式的的输输入入口口,则则A口口_Dir、_Attrib和和_Data三三个个向向量量对对应应的的B0组组合合应应设设为为000。2、把把A口口的的B1定定义义成成具具有有唤唤醒醒功功能能的的悬悬浮浮式式输输入入口口,只只需需将将_Dir、_Attrib和和_Data向向量量对对应应的的B1组组合合设设置置为为010即可。即可。A口的口的IOA0IOA7作为唤醒来源,常用于键盘输入。作为唤醒来源,常用于键盘输入。要启用要启用IOA0IO

30、A7的唤醒功能,必先读取的唤醒功能,必先读取P_IOA_Latch单元,以此锁存单元,以此锁存IOA0IOA7引脚上的按键状态。随后系引脚上的按键状态。随后系统才可通过指令进入低功耗的睡眠状态。当有按键按下统才可通过指令进入低功耗的睡眠状态。当有按键按下时,时,IOA0IOA7的输入状态会与其在进入睡眠前被锁存的输入状态会与其在进入睡眠前被锁存时的状态不同,从而引起系统的唤醒。时的状态不同,从而引起系统的唤醒。402.3.3B端口的端口的特殊功能特殊功能412.4时钟电路时钟电路nSP的时钟电路采用晶体振荡器电路。外接的时钟电路采用晶体振荡器电路。外接晶振采用晶振采用32768Hz。推荐使用外

31、接推荐使用外接32768Hz晶振,晶振,RC阻容振荡的电路时钟不如外接晶振准确。阻容振荡的电路时钟不如外接晶振准确。422.4时钟电路时钟电路v实时时钟实时时钟RTC(RealTimeClock)32768Hz实实时时时时钟钟常常用用于于钟钟表表、实实时时时时钟钟延延时时及及其其它它与与时时间间相相关关类类产产品品。SPCE061A通通过过对对32768Hz实实时时时时钟钟来来源源分分频频,提提供供了了多多种种实实时时时时钟钟中中断断。如如,用用作作唤唤醒醒的的中中断断来来源源IRQ5_2Hz,表表示示系系统统每每隔隔0.5秒秒被被唤唤醒醒一一次次,可作为精确的计时基准。可作为精确的计时基准。

32、SPCE061A还支持还支持RTC振荡器强振模式振荡器强振模式/自自动模式的转换。动模式的转换。432.5PLL锁相环(锁相环(PhaseLockLoop)vPLL的的作作用用:将将系系统统提提供供的的实实时时时时钟钟基基频频(32768Hz)进进行行 倍倍 频频 , 调调 整整 至至 49.152MHz、 40.96MHz、32.768MHz、24.576MHz或或20.480MHz。系系统统预预设的设的PLL振荡频率为振荡频率为24.576MHz。442.6系统时钟系统时钟32768Hz的的实实时时时时钟钟经经PLL倍倍频频电电路路后后,产产生生系系统统时时钟钟频频率率Fosc,Fosc再

33、再经经分分频频得得到到CPU时时钟钟频频率率(CPUCLK),可可通通过过设设定定P_SystemClock(写写 )(7013H)单单 元元 来来 控控 制制 。预预 设设 的的 Fosc、 CPUCLK分分 别别 为为24.576MHz和和Fosc/8。用用户户可可以以通通过过对对P_SystemClock单单元元编编程程完完成成对对系系统统时时钟和钟和CPU时钟频率的定义。时钟频率的定义。452.6系统时钟系统时钟v32768HzRTC振荡器有两种工作方式:振荡器有两种工作方式:强振模式和自动弱振模式强振模式和自动弱振模式。v强振模式时,强振模式时,RTC振荡器始终运行在高耗能振荡器始终

34、运行在高耗能的状态下。的状态下。v自动弱振模式时,系统在上电复位自动弱振模式时,系统在上电复位(poweronreset)后的前后的前7.5秒内处于强振模式,秒内处于强振模式,然后自动切换到弱振模式以降低功耗。然后自动切换到弱振模式以降低功耗。CPU被唤醒后预设的时钟频率为被唤醒后预设的时钟频率为Fosc/8,用户用户可以根据需要调整该值。可以根据需要调整该值。462.6系统时钟系统时钟v在在SPCE061A内,内,P_SystemClock(写写)(7013H)单元控制系统时钟和单元控制系统时钟和CPU时钟。时钟。v第第02位用来改变位用来改变CPUCLK,若将第若将第02位设为位设为“11

35、1”可以使可以使CPU时钟停止工作,系时钟停止工作,系统切换至低功耗的睡眠状态;统切换至低功耗的睡眠状态;v第第57位可以改变系统时钟的频率。位可以改变系统时钟的频率。v此外,在睡眠状态下,通过设置该单元的第此外,在睡眠状态下,通过设置该单元的第4位可以开打或关闭位可以开打或关闭32768Hz实时时钟。实时时钟。472.7时间基准信号时间基准信号v简称时基信号,来自简称时基信号,来自32768Hz实时时钟,实时时钟,通过频率选择组合而成。通过频率选择组合而成。v时基信号产生器的频率选择时基信号产生器的频率选择TMB1,为,为TimerA的时钟来源的时钟来源B提供了各种频率选择信提供了各种频率选

36、择信号,并为中断系统提供中断源号,并为中断系统提供中断源(IRQ6)信号。信号。v时基信号产生器还可通过分频产生时基信号产生器还可通过分频产生2Hz、4Hz、1024Hz、2048Hz以及以及4096Hz的的时基信号,为中断系统提供各种实时中断源时基信号,为中断系统提供各种实时中断源(IRQ4和和IRQ5)信号。信号。482.7时间基准信号时间基准信号492.8Timer定时器定时器/计数器计数器vSPCE061A提供了两个提供了两个16位的计时位的计时/计数计数器:器:TimerA和和TimerB。vTimerA为通用计数器,为通用计数器,TimerA的时钟的时钟源由时钟源源由时钟源A和和B

37、进行进行“与与”操作而形成。操作而形成。vTimerB为多功能计数器,其时钟源仅为时为多功能计数器,其时钟源仅为时钟源钟源C。定时器发生溢出后,会产生一个溢出信号定时器发生溢出后,会产生一个溢出信号(TAOUT/TBOUT),它会传送到它会传送到CPU中断系统以中断系统以产生定时器中断信号;此外,还可用于触发产生定时器中断信号;此外,还可用于触发ADC输入的自动转换过程和输入的自动转换过程和DAC输出的数据输出的数据锁存。锁存。502.8Timer定时器定时器/计数器计数器512.8Timer定时器定时器/计数器计数器522.9睡眠与唤醒睡眠与唤醒2.9.1睡眠睡眠IC在上电复位后就开始工作,

38、直到接收到在上电复位后就开始工作,直到接收到睡眠信号,才关闭系统时钟睡眠信号,才关闭系统时钟(PLL振荡器振荡器),进,进入睡眠状态。入睡眠状态。用户可通过用户可通过P_SystemClock(读读)(7013H)单单元写入元写入CPUClkSTOP控制字控制字(CPU睡眠信号睡眠信号)使系统从运行状态转入备用状态。使系统从运行状态转入备用状态。系统进入睡眠状态后,程序计数器系统进入睡眠状态后,程序计数器(PC)会会停在程序的下一条指令计数上,当有任一唤醒停在程序的下一条指令计数上,当有任一唤醒事件发生后,由此继续执行程序。事件发生后,由此继续执行程序。532.9.2唤醒唤醒v系统收到唤醒信号

39、后接通系统收到唤醒信号后接通PLL振荡器,同时振荡器,同时CPU响应唤醒事件的处理并进行初始化。响应唤醒事件的处理并进行初始化。IRQ3_KEY为触键唤醒来源为触键唤醒来源(IOA70),其它中断信号其它中断信号(FIQ、IRQ1IRQ6及及UARTIRQ)都可作唤醒来源。都可作唤醒来源。v唤醒操作完成后,由进入睡眠状态时的断点唤醒操作完成后,由进入睡眠状态时的断点处,继续执行程序。处,继续执行程序。CPU需要需要200s的时的时间才能完成唤醒的动作,所以睡眠间才能完成唤醒的动作,所以睡眠/唤醒的唤醒的频率不能超过频率不能超过5KHz,否则否则CPU无法进入睡无法进入睡眠模式。眠模式。542.

40、10模拟数字转换器模拟数字转换器ADC2.10.1ADC的控制的控制vSPCE061A有有8个个10位位ADC通道通道,其中一个通道,其中一个通道(MIC_In)用于语音输入,模拟信号经自动增益控制器和用于语音输入,模拟信号经自动增益控制器和放大器放大后进行放大器放大后进行A/D转换。其余转换。其余7个通道个通道(Line_In)和和IOA06引脚共享,可将输入的模拟信号引脚共享,可将输入的模拟信号(如电压如电压信号信号)转换为数字信号。转换为数字信号。vA/D转换范围是整个输入范围,即转换范围是整个输入范围,即0VAVdd。无效无效的的A/D模拟信号模拟信号(超过超过VDD+0.3V或是低于

41、或是低于VSS0.3V)将影响转换电路的工作范围,从而降低将影响转换电路的工作范围,从而降低ADC的性的性能。由于能。由于Line_In通道和通道和IOA06共享引脚,建议共享引脚,建议用户选择其它的用户选择其它的IO引脚(非引脚(非IOA06),),以避免由以避免由于无效于无效IO信号造成电压不稳信号造成电压不稳(超过超过VDDIO+0.7V或低或低于于VSSIO0.7V)而降低而降低ADC的性能。的性能。552.10.1ADC的控制的控制vADC最最大大输输入入电电压压由由P_ADC_Ctrl(写写)($7015H)的的第第7和和第第8位位的的值值决决定定。第第7位位VEXTREF决决定定

42、了了ADC的的参参考考电电压压为为AVdd或或是是外外部部参参考考电电压压。第第8位位V2VREFB决决定了定了2V电压源是否起作用。电压源是否起作用。vA/D转转 换换 选选 择择 输输 入入 通通 道道 :通通 过过 设设 置置P_ADC_MUX_Ctrl(写写)($702BH)的的第第02位位,可可以以为为A/D转转换换选选择择输输入入通通道道。通通道道包包括括MIC_In和和Line_In两种。两种。v用用户户通通过过读读取取P_ADC(读读)($7014H)单单元元,取取得得从从MIC_In通通道道输输入入的的模模拟拟信信号号转转换换结结果果。用用户户可可通通过过读读取取P_ADC_

43、LINEIN_Data(读读)($702CH)单单元元,取取得得从指定的从指定的Line_In通道输入的模拟信号转换结果。通道输入的模拟信号转换结果。562.10.1ADC的控制的控制v选选 择择 MIC_In通通 道道 后后 , 可可 通通 过过 设设 置置P_DAC_Ctrl(写写)($702AH)的的第第3和和4位位,选选择择A/D转换的触发事件。转换的触发事件。睡眠状态,睡眠状态,ADC被关闭被关闭(包括包括AGC和和VMIC)。注注意意,供供电电复复位位后后不不论论ADC是是否否被被启启用用,VMIC信信号号都都预预设设为为ON。VMIC用用于于向向外外部部的的MIC提提供供电电源源

44、,VMIC=AVDD。即即,VMIC的的状状态态和和ADC的的状状态态无无关关。所所以以,不不使使用用VMIC时时,用用户户必必须须把把P_ADC_Ctrl(写写)($7015H)单单元元的的第第1位位MIC_ENB设为设为1,以关闭,以关闭VMIC。572.10.1ADC的控制的控制硬硬件件ADC的的最最高高速速率率限限定定为为(Fosc/32/16)Hz,如如果果速速 率率 超超 过过 此此 值值 , 当当 从从 P_ADC(读读 )($7014H)/P_ADC_LINEIN_Data(读读)($702CH)单单元元读读出出数数据时会发生错误。据时会发生错误。P_ADC_Ctrl(写写)(

45、$7015H)单元的第单元的第5位位DAC_OUT,可用来选择两通道音频可用来选择两通道音频DAC的最大输的最大输出。最大输出电流可为出。最大输出电流可为2mA或是默认值或是默认值3mA。DAC_OUT的设置可改变的设置可改变DAC输出的功率。输出的功率。582.10.1ADC的控制的控制vP_ADC(读读/写写)(7014H)P_ADC储储存存MIC输输入入的的A/D转转换换数数据据。逐逐次次逼逼近近式式的的ADC由由一一个个10位位DAC(DAC0)、一一个个10位位寄寄存存器器DAR0、一一个个逐逐次次逼逼近近寄寄存存器器SAR和和一一个个比比较较器器COMP组成。组成。P_ADC(读读

46、):读出本单元实际为:读出本单元实际为A/D转换输出的转换输出的10位数值。如果位数值。如果P_DAC_Ctrl(702AH)单元第单元第3、4位被设为位被设为00,那么在转换过程里读出本单元,那么在转换过程里读出本单元(7014H)亦会触发亦会触发A/D转换重新开始。转换重新开始。592.10.1ADC的控制的控制vP_ADC_Ctrl(读读/写写)(7015H)ADC的控制口。的控制口。vP_ADC_MUX_Ctrl(读读/写写)(702BH)ADC多多通通道道控控制制通通过过控控制制P_ADC_MUX_Ctrl(702BH)单元来实现。单元来实现。vP_MUX_Data(读读)(702C

47、H)用于读出用于读出LINE_IN7-10位位ADC转换的数据。转换的数据。602.10.2MIC_IN通道方式通道方式ADCvADC范围范围MIC_In通通道道方方式式的的ADC,最最大大参参考考电电压压可可达达AVdd,即即0V到到AVdd。信信号号从从MIC_In引引脚脚输输入入,经经寄寄存存器器后后被被放放大大。放放大大器器的的增增益益倍倍 数数 可可 通通 过过 外外 部部 电电 路路 调调 整整 , 然然 后后 AGC把把MIC_In信号控制在指定的范围内。信号控制在指定的范围内。612.10.2MIC_IN通道方式通道方式ADCv设置设置用户须先把用户须先把P_ADC_Ctrl(

48、写写)($7015H)单元单元的第的第0位位ADE设为设为1,第,第1位位MIC_ENB设设为为0,从而启用,从而启用A/D和和MIC_In通道通道(供供电复位之后,电复位之后,VMIC预设被打开预设被打开)。然后,把。然后,把第第2位位AGCE设为设为1,启用,启用AGC。第第3、4位用于设定位用于设定MIC_In通道的通道的ADC触发方式触发方式(Timer锁存或直接模式锁存或直接模式)。P_ADC_MUX_Ctrl(读读/写写)($702BH)的第的第02位为位为0时,模拟电压信号经时,模拟电压信号经MIC_In通通道输入。道输入。622.10.2MIC_IN通道方式通道方式ADCv操作

49、操作当触发当触发MIC_In通道输入后,产生一个开始信号通道输入后,产生一个开始信号(b15(RDY)=0)。逐次逼近式逐次逼近式ADC首先设置最高位,首先设置最高位,然后清除然后清除SAR的其它位的其它位(1000000000B)。这时,这时,DAC0输出电压输出电压(1/2AVdd)与输入电压与输入电压Vin进行比较。进行比较。如果如果VinVDAC,保持原先设置为保持原先设置为1的位的位(最高有效最高有效位位)仍为仍为1;否则,该位会被清为;否则,该位会被清为0。这个过程。这个过程重复重复10次,直到这些位都被比较过。转换结果将会保次,直到这些位都被比较过。转换结果将会保存在存在SAR内

50、。内。A/D转换完成之后,转换完成之后,P_ADC_Ctrl(读读)($7015H)的第的第15位位RDY被置为被置为”1”。632.10.2MIC_IN通道方式通道方式ADC1.定时器锁存模式定时器锁存模式当当A/D转换完成时,用户通过读取转换完成时,用户通过读取P_ADC($7014H)或或P_ADC_MUX_Data($702BH)单元,以获得单元,以获得10位的位的A/D转换数据。转换数据。定时器事件可定时器事件可由由TimerA或或TimerB触发。从触发。从P_ADC(R)($7014H)读取数据后,不论处于直接状态还是定时读取数据后,不论处于直接状态还是定时器状态,器状态,P_A

51、DC_Ctrl(读读)($7015H)的第的第15位位RDY将被清除为将被清除为”0”,并且重新进行,并且重新进行A/D转换。若转换。若A/D转换结果没被读取,第转换结果没被读取,第15位位RDY将继续保持为将继续保持为”1”,且不会继续执行,且不会继续执行A/D转换。转换。注意:注意:P_ADC_Ctrl(读读)($7015H)第第15位位RDY与与P_ADC_MUX_Ctrl(R)($702BH)第第15位位RDY的作用相同。的作用相同。642.10.2MIC_IN通道方式通道方式ADC2.直接模式直接模式设置设置P_DAC_Ctrl(W)($702AH)的第的第3和和4位,可以指定位,可

52、以指定MICADC的工作模式为直的工作模式为直接模式。进行接模式。进行A/D转换之前,用户必须先读取转换之前,用户必须先读取P_ADC(读读)($7014H)单元的内容,以启用单元的内容,以启用ADC,然后通过读取然后通过读取P_DAC_Ctrl($702AH)单元的第单元的第15位,循环查询位,循环查询ADC的的状态。完成状态。完成A/D转换之后,程序再一次读取转换之后,程序再一次读取P_ADC(读读)($7014H)单元的内容来得到转单元的内容来得到转换结果。换结果。652.10.3LINE_IN模式的模式的ADC操作操作SPCE061A提提供供7个个Line_In通通道道, 与与IOA6

53、-0共享共享7个引脚个引脚662.11DAC方式音频输出方式音频输出SPCE061A为为音音频频输输出出提提供供2个个DAC通通道道:DAC1和和DAC2,由由DAC1和和DAC2引脚输出。引脚输出。DAC输出范围:输出范围:0X0000到到0XFFFF。672.11DAC方式音频输出方式音频输出vP_DAC2(读读/写写)(7016H)DAC2为为10位位的的D/A转转换换单单元元。在在DAC方方式该单元带一个式该单元带一个10位的缓冲寄存器位的缓冲寄存器DAR2。vP_DAC2(写写):通通过过此此单单元元直直接接写写入入10位位数数据据到到10位位寄寄存存器器DAR2来来锁锁存存DAC2

54、的的输输入数值(无符号数)。入数值(无符号数)。vP_DAC2(读读):从从DAR2内读出内读出10位数据。位数据。682.11DAC方式音频输出方式音频输出vP_DAC1(读读/写写)(7017H)DAC1为为10位位的的D/A转转换换单单元元。在在DAC方方式该单元带一个式该单元带一个10位的缓冲寄存器位的缓冲寄存器DAR1。vP_DAC1(写写):通通过过此此单单元元直直接接写写入入10位位数数据据到到10位位寄寄存存器器DAR1来来锁锁存存DAC1的的输输入数值(无符号数)。入数值(无符号数)。vP_DAC1(读读):从从DAR1内读出内读出10位数据。位数据。692.11DAC方式音

55、频输出方式音频输出vP_DAC_Ctrl(写写)(702AH)第第1位位:0,用于双用于双DAC音频输出音频输出第第3、4位:控制位:控制A/D转换方式转换方式第第5-8位:选择位:选择DAC的数据锁存方式的数据锁存方式702.12低电压监测低电压监测/低电压复位(低电压复位(LVD/LVR)vv低低 电电 压压 监监 测测 LVD( LowVoltageDetect)提供系统内电源电压使用情况提供系统内电源电压使用情况系统电压低于用户设定的低限电压系统电压低于用户设定的低限电压VDD,P_LVD_Ctrl单元第单元第15位位(LVD监测标志位监测标志位)置置1,否则为否则为0SPCE061A

56、有有3级可编程低限电压级可编程低限电压:2.4V,2.8V,3.2V,通过对通过对P_LVD_Ctrl编程控制编程控制712.12低电压监测低电压监测/低电压复位(低电压复位(LVD/LVR)vv低电压复位低电压复位LVR(LowVoltageReset)通通过过某某种种方方式式使使单单片片机机内内各各寄寄存存器器的的值值为为初初始始的操作叫复位的操作叫复位SPCE061A是是在在RESB端端加加一一个个低低电电平平可可令令其复位其复位722.13串行设备输入输出端口串行设备输入输出端口(SIO)v功功能能:SIO提提供供一一个个1位位的的串串行行接接口口,用用于于与与其其它它设设备备进进行行

57、数数据据通通讯讯。在在SPCE061A内内通通过过IOB0和和IOB1这这2个个口口来来实实现现与与设设备备进进行行串串行行交交换换数数据据的的功功能能。其其中中,IOB0为为时时钟钟口口(SCK),IOB1为为数数据据端端口口(SDA),用用于于串串行行数据的接收或发送。数据的接收或发送。v串串行行输输入入输输出出口口的的启启用用:设设定定P_SIO_Ctrl(701EH)(读读/写写)单单元元,通通过过P_IOB_Dir(7007H), P_IOB_Attrib(7008H),P_IOB_Data(7005H)三三个个IOB向向量量,将将IOB0(SCK)设定为输出引脚。设定为输出引脚。7

58、32.13串行设备输入输出端口串行设备输入输出端口(SIO)vSIO传输速率传输速率最快可设为最快可设为CPUCLK/4,默默认值为认值为CPUCLK/16。SPCE061A的的SIO速率最快可达速率最快可达12288KHz。vSIO可根据外设的差别来选择不同的寻址模可根据外设的差别来选择不同的寻址模式,式,有有8/16/24位三种寻址模式可选择。用位三种寻址模式可选择。用户通过写入户通过写入P_SIO_Start(701FH)单元,单元,来启动数据交换的过程。串行传输的起始地址来启动数据交换的过程。串行传输的起始地址是由是由P_SIO_Addr_Low、P_SIO_Addr_Mid和和P_S

59、IO_Addr_High这这3个单元所指定。个单元所指定。742.13串行设备输入输出端口串行设备输入输出端口(SIO)v写入操作步骤写入操作步骤向向P_SIO_Start(写写)单单元元写写入入任任一一数数值值,以以启启动动数据传输;数据传输;将将要要传传送送的的八八位位数数据据写写入入P_SIO_Data (写写)(701AH),这这时时SIO开开始始向向串串行行外外设设传传送送起起始始地地址址,接着传送接着传送P_SIO_Data单元中的单元中的8位数据;位数据;连连续续检检查查P_SIO_Start(读读)的的内内容容,以以得得知知目目前前的传送状态;的传送状态;再再次次对对P_SIO

60、_Data(写写)写写入入下下一一个个八八位位数数据据;对对P_SIO_Stop(写写)(7020H)写写入入数数据据,结结束束本本次次传输。传输。752.13串行设备输入输出端口串行设备输入输出端口(SIO)v读取操作步骤读取操作步骤向向P_SIO_Start(写写)单元写入任一数值,启动数据单元写入任一数值,启动数据传输;传输;从从P_SIO_Data(读读)(701AH)单元读取传送过单元读取传送过来的数据,这时来的数据,这时SIO会开始向串行外设传送起始地会开始向串行外设传送起始地址,接着接收串行外设传回的址,接着接收串行外设传回的8位数据;位数据;连续检查连续检查P_SIO_Star

61、t(读读)的内容,以得知目前传的内容,以得知目前传送的状态;送的状态;当传送完成时,再次对当传送完成时,再次对P_SIO_Data(读读)读取下读取下一个八位数据;一个八位数据;对对P_SIO_Stop(写写)(7020H)写入数据,结束本写入数据,结束本次传输。次传输。762.13串行设备输入输出端口串行设备输入输出端口(SIO)vP_SIO_Ctrl(读读/写写)(701EH)用户必须设置用户必须设置P_SIO_Ctrl(701EH)(读读/写写)单元的第单元的第7位,将位,将IOB0、IOB1分别设置分别设置为为SCK引脚和引脚和SDA引脚。第引脚。第6位用来决定串行位用来决定串行接口是

62、处于读取或是写入模式。第接口是处于读取或是写入模式。第3、4位的位的作用是让用户自行指定数据传输速度;而通过作用是让用户自行指定数据传输速度;而通过设置第设置第0、1位,可以指定串行设备的寻址宽位,可以指定串行设备的寻址宽度。度。772.13串行设备输入输出端口串行设备输入输出端口(SIO)vP_SIO_Data(读读/写写)(701AH)功能功能:收发串行数据缓冲单元收发串行数据缓冲单元,向此单元写入向此单元写入或读出数据或读出数据,可使串行端口发送或接收数据字可使串行端口发送或接收数据字节节vP_SIO_Addr_Low(读读/写写)(701BH)功能功能:串行设备起始地址低字节,默认值为

63、串行设备起始地址低字节,默认值为00H782.13串行设备输入输出端口串行设备输入输出端口(SIO)vP_SIO_Addr_Mid(读读/写写)(701CH)vP_SIO_Addr_High(读读/写写)(701DH)功能功能:串行设备起始地址的中字节,默认值为串行设备起始地址的中字节,默认值为00H功能功能:串行设备起始地址的高字节,默认值为串行设备起始地址的高字节,默认值为00H792.13串行设备输入输出端口串行设备输入输出端口(SIO)vP_SIO_Start(读读/写写)(701FH)vP_SIO_Stop(写写)(7020H)功能功能:启动数据传输,向此单元写入任意数值启动数据传输

64、,向此单元写入任意数值均可启动。读此单元数据可得到均可启动。读此单元数据可得到SIO的数据传的数据传输状态,第输状态,第7位为位为busy标志位,如果为标志位,如果为1则表示正在传输数据,传输完成,该位被清则表示正在传输数据,传输完成,该位被清零,可传输新的字节。零,可传输新的字节。功能功能:停止数据传输,向此单元写入任意数值停止数据传输,向此单元写入任意数值停止数据传输。停止数据传输。802.14通用异步串行接口通用异步串行接口UARTv功能:提供一全双工标准接口,用于功能:提供一全双工标准接口,用于SPCE061与外设之间的串行通信。与外设之间的串行通信。借助于借助于IOB端口和端口和UA

65、RTIRQ中断,可同中断,可同时完成时完成UART接口的接收和发送。接口的接收和发送。UART还可还可通过缓冲来接收数据,即可在寄存器数据被读通过缓冲来接收数据,即可在寄存器数据被读出之前开始接收数据。出之前开始接收数据。812.15保密设定保密设定系统正常运行时,每隔一定周期该定时器清系统正常运行时,每隔一定周期该定时器清零,如果在规定时间没有清零,零,如果在规定时间没有清零,CPU认为系统认为系统故障,进行系统复位(故障,进行系统复位(reset)。)。SPCE061A的看门狗定时器周期为的看门狗定时器周期为0.75s。v功能:监视系统正常运行。功能:监视系统正常运行。822.16看门狗计

66、数器(看门狗计数器(WatchDog)将将PAUSE接接5V,PVIN接接GND并维持并维持1s以以上,可将内部保险丝熔化,此后不能进行上,可将内部保险丝熔化,此后不能进行read、download和和debug操作。操作。注意:使用时一定要慎重。注意:使用时一定要慎重。83第第3章章指令系统指令系统 843.1 指令系统的概述及符号约定指令系统的概述及符号约定nSP单片机指令按其功能可划分为: 1) 数据传送指令:包括立即数到寄存器、寄存器到寄存 器、寄存器到存储器存储器到寄存器的数据传送操作; 2) 算术运算:包括加、减、乘运算; 3) 逻辑运算:包括与、或、异或、测试、移位等操作; 4)

67、 转移指令:包括条件转移、无条件转移、中断返回、子程序调用等操作; 5) 控制指令:如开中断、关中断、FIR滤波器的数据的自由移动等操作。 85寻址方式:1、立即数寻址: 这种寻址方式是操作数以立即数的形式出现,例如:R1 = 0x1234,是把16进制数0x1234赋给寄存器R1。 2、存储器绝对寻址: 这种寻址方式是通过存储器地址来访问存储器中的数据,例如:R1 = 0x2222,访问0x2222单元的数据。 3、寄存器寻址: 这种寻址方式是操作数在寄存器中,例如:R1 = R2,是把寄存器R2 中的数据赋给寄存器R1。 4、寄存器间接寻址: 这种寻址方式是操作数的地址由寄存器给出,例如:

68、R1 = BP,是把由BP指向的内存单元的数据送寄存器R1。 5、变址寻址: 这种寻址方式下,操作数的地址由基址和偏移量共同给出,例如:R1 = BP+0x34。 86 表3-1 符号约定符号约定 873.2 数据传送指令数据传送指令一、立即数寻址: 【影响标志】 N,Z 【格式】 Rd = IM16 /16位的立即数送入目标寄存器Rd Rd = IM6 /6位的立即数扩展成16位后送入目标寄存器Rd 88二、寄存器寻址: 【影响标志】 N,Z 【格式】 Rd = Rs /将源寄存器Rs的数据送给目标寄存器Rd 三、直接地址寻址: 【影响标志】 N,Z 【格式】 A6 = Rs /将源寄存器R

69、s中的数据送给以A6为地址的存储单元 A16 = Rs /把Rs数据存储到A16指出的存储单元 Rd = A6 /把A6指定的存储单元数据读到Rd寄存器 Rd = A16 /把A16指定的存储单元数据读到Rd寄存器 四、变址寻址: 【影响标志】 N,Z 【格式】 BP + IM6 = Rs /把Rs的值存储到基址指针BP与6位的立即/数之和指出的存储单 元。 Rd = BP +IM6 /把基址指针BP与6位的立即数的和指定的存储单元数据读到Rd寄存器。 89五、寄存器间接寻址: 【影响标志】 N,Z 【格式】 Rd = Rs /把Rs的数据存储到Rd的值所指的存储单元Rd 中存放的是 操作数的

70、地址。 例3.1:将R3的值保存于0x25单元 R3 = 0x5678 /把16位立即数0x5678赋给R3 方法1: 0x25 = R3 /将R3的值存储于0x25存储单元,直接地址寻址 方法2: /0x25单元的内容为0x5678 R2 = 0x25 /立即数0x25送入R2中 R2 = R3 /将R3的值存储于0x25存储单元,寄存器间接寻址 方法3: /0x25单元的内容为0x5678 BP = 0x20 /立即数0x20送入BP中; BP + 5 = R3 /将R3的值存储于0x25存储单元,变址寻址0x25、 /单元的内容为0x5678 90表表3.2 数据传送指令一览表数据传送指

71、令一览表 91堆栈操作【格式】 PUSH Rx,Ry TO SP POP Rx,Ry FROM SP 【说明】Rx,Ry 可以是R1R4,BP,SP,PC中的任意两个或一个,执行后将RxRy的序列寄存器压栈,或将堆栈中的数据弹入RxRy序列寄存器中,压栈操作不影响标志位,出栈操作影响N,Z标志,当Rx,Ry中含有SR时,所有标志位都会改变。压栈、出栈操作的执行周期为2n + 4,若出栈操作的目的寄存器中含有PC时,执行周期为3n+6。其中n是压栈数据的个数。压栈和出栈的指令长度均为1字长 【举例】 PUSH R1,R5 to SP /将R5,R4,R3,R2,R1压 PUSH R2,R2 to

72、 SP /将R2压栈 PUSH R3 to SP /将R3压栈 POP R3 from SP /R3出栈 POP R2,R2 from SP /R2出栈 POP R1,R5 from SP /R1,R2,R3,R4,R5出栈 92 3.3 算术运算算术运算3.3.1 加法运算加法运算 加法运算影响标志位:N,Z,S,C。 立即数寻址(不带进位): 【格式1】 Rd += IM6 或 Rd = Rd + IM6 【操作】 Rd + IM6 Rd 【说明】 Rd的数据与6位(高位扩展成16位)立即数相加,结果送Rd; 【格式2】 Rd = Rs + IM16 【操作】 Rs + IM16 Rd 【

73、说明】 Rd的数据与16位的立即数相加,结果送Rd; 93直接地址寻址 :【格式1】 Rd += A6 或 Rd = Rd + A6 【操作】 Rd + A6 Rd 【说明】 Rd的数据与6位地址指定的存储单元中的数据相加,结果送Rd。 【格式2】 Rd = Rs + A16 【操作】 Rs + A16 Rd 【说明】 Rs的数据与16位地址指定的存储单元中数据相加,结果送Rd。 变址寻址: 【格式】 Rd += Bp + IM6 或 Rd = Rd + BP + IM6 【操作】 Rd + Bp + IM6 Rd 【说明】 取基址指针BP与6位的立即数的和指定的存储单元中的数据与Rd相加,结

74、果送Rd寄存器。 寄存器寻址: 【格式】 Rd += Rs 【操作】 Rd + Rs Rd 【说明】 Rd与Rs的数据相加,结果送Rd。 94寄存器间接寻址: 【格式1】 Rd += Rs; 【操作】 Rd + Rs Rd 【说明】 Rd的数据与Rs所指定的存储单元中的数据相加,结果送Rd 【格式2】 Rd += Rs+ 【操作】 Rd + Rs Rd, Rs + 1 Rs 【说明】 Rd的数据与Rs所指定的存储单元中的数据相加,结果送Rd,修改Rs,Rs=Rs+1 【格式3】 Rd += Rs-; 【操作】 Rd + Rs Rd, Rs - 1 Rs 【说明】 Rd的数据与Rs所指定的存储单

75、元中数据相加,结果送Rd, Rs=Rs- 1 【格式4】 Rd += +Rs; 【操作】 Rs + 1 Rs, Rd + Rs Rd 【说明】 首先修改Rs=Rs+1,Rd的数据与Rs所指定的存储单元中的数据相加,结果送Rd, 注意:有符号数的溢出只判断N和S两位:N!=S时溢出,N=S时无溢出。 953.3.2 减法运算减法运算减法运算影响标志位:N,Z,S,C。 立即数寻址: 【格式1】 Rd - = IM6 或 Rd = Rd IM6 【操作】 Rd IM6 Rd 【说明】 Rd的数据减去6位(bit)立即数,结果送Rd。 【格式2】 Rd = Rs IM16 【操作】 Rs IM16

76、Rd 【说明】 Rs的数据减去16位(bit)立即数,结果送Rd。直接地址寻址: 【格式1】 Rd - = A6 或 Rd = Rd A16 【操作】 Rd A6 Rd 【说明】 Rd的数据减去A6存储单元中的数据,结果送Rd。 【格式2】 Rd = Rs -A16 【操作】 Rs A16 Rd 【说明】 Rs的数据减去A16存储单元中的数据,结果送Rd。 变址寻址: 【格式】 Rd - = BP + IM6 或 Rd = Rd BP + IM6 【操作】 Rd BP + IM6 Rd 【说明】 Rd的值减去基址加变址指定的存储单元的值,结果送Rd 96寄存器寻址: 【格式】 Rd - = R

77、s 【操作】 Rd Rs Rd 【说明】 寄存器Rd的数据减去Rs的数据,结果送Rd寄存器 寄存器间接寻址: 【格式1】 Rd - = Rs 【操作】 Rd -Rs Rd 【说明】 Rd的数据与Rs所指定的存储单元中的数据相减,结果送Rd。 【格式2】 Rd - = Rs+ 【操作】 Rd - Rs Rd, Rs+1 Rs 【说明】 Rd的数据与Rs所指定的存储单元中的数据相减,结果送Rd, Rs的值加1 【格式3】 Rd - = Rs- 【操作】 Rd - Rs Rd, Rs 1 Rs 【说明】 Rd的数据与Rs所指定的存储单元中的数据相减,结果送Rd, Rs的值减1 【格式4】 Rd -

78、= +Rs 【操作】 Rs + 1 Rs,Rd - Rs Rd 【说明】 Rs 的值加1,Rd的数据与Rs所指定单元数据相减,结果送Rd 973.3.3 带进位的加减运算带进位的加减运算 带进位的加法格式 :Rd += IM6,Carry Rd = Rd + IM6,Carry Rd = Rs + IM16,Carry Rd += BP + IM6 ,Carry Rd = Rd + BP + IM6 ,Carry Rd += A6 ,Carry Rd = Rd + A6 ,Carry Rd = Rs + A16 ,Carry Rd += Rs,Carry Rd += Rs ,Carry Rd

79、+= +Rs ,Carry Rd += Rs-,Carry Rd += Rs+,Carry 98带进位的减法格式 :Rd - = IM6,Carry Rd = Rd - IM6,Carry Rd = Rs - IM16,Carry Rd - = BP + IM6 ,Carry Rd = Rd - BP + IM6 ,Carry Rd - = A6 ,Carry Rd = Rd - A6 ,Carry Rd = Rs - A16 ,Carry Rd - = Rs,Carry Rd - = Rs ,Carry Rd - = +Rs ,Carry Rd - = Rs-,Carry Rd - = Rs

80、+,Carry 993.3.4 取补运算取补运算 取一个数的补码,在计算机中表示为取其反码,再加1,SPCE061A也正是这样处理的。取补运算影响标志位N,Z。 【举例】计算数- 600与0x0040单元数据的差。 R1 = - 600 R2=0x0001 0x0040=R2 BP = 0x0040 /取该单元地址 R2 = -BP /取此数的补码,-1的补码为0xFFFF R1 += R2 /相加,结果送R1 3.3.5 SPCE061A的乘法指令的乘法指令 注:Rd,Rs可用R1R4,BP;MR由R4、R3构成,R4是高位,R3为低位 【影响标志】无 【格式1】 MR = Rd * Rs

81、或 MR = Rd * Rs,ss 【功能】 Rd * Rs MR 【说明】 表示两个有符号数相乘,结果送MR寄存器 【格式2】 MR = Rd * Rs,us 【功能】 Rd * Rs MR 【说明】 表示无符号数与有符号数相乘,结果送MR寄存器。 1003.3.6 SPCE061A的的n项内积运算指令项内积运算指令 【影响标志】无 【格式】 MR = Rd * Rs ,ss ,n 【功能】 指针Rd与Rs所指寄存器地址内有符号数据之间或无符号与有符号字数据之间进行n项内积运算,结果存入MR。符号的缺省选择为ss,即有符号数据之间的运算。n的取值为116,缺省值为1。 内积运算操作如图3-2

82、所示。 【执行周期】10n6 【说明】 当FIR_MOV ON时,允许FIR运算过程中数据自由移动。为新样本取代旧样本进行数据移动准备:Xn- 4=Xn- 3,Xn- 3=Xn- 2,Xn- 2=Xn- 1。如上图所示当完成一次内积运算后,X1、X2、X3自动右移,X4移出。这在数字信号处理中十分有用。比如你要计算连续4次采样值的平均值,你即可将采样值放到X1- - - -X4中,加权系数放到C中,然后完成Rd * Rs ,ss ,4运算,再求平均值。当FIR_MOV ON时,运算完后X1、X2、X3自动右移,X4移出,这样我们就可以把下一次的采样值X0放到原X1的位置,下一次直接完成Rd *

83、 Rs ,ss ,4运算,即X0-X3的运算,不必手动移动Xn。 101内积运算操作示意图示 注意: (1)Rs和 Rd其中任意一个都不能为R3或R4,否则会出错。 (2)Rs和Rd不能同为一个寄存器,否则会出错。 1023.3.7 比较运算比较运算(影响标志位影响标志位N,Z,S,C) 比较运算执行两数的减法操作,不存储运算结果,只影响标志位N、Z、S、C,下面按寻址方式分别介绍比较运算的各条指令。 立即数寻址: 【格式1】 CMP Rd,IM6 【说明】 将Rd与6位(bit)立即数相减。 【格式2】 CMP Rd,IM16 【说明】 将Rd与和16位立即数相减。 直接地址寻址: 【格式1

84、】 CMP Rd, A6 【说明】 此指令将Rd的值与A6指定地址单元的数据相减。 【格式2】 CMP Rd, A16 【说明】 此指令将Rd的值与A16指定地址单元的数据相减。 寄存器寻址: 【格式】 CMP Rd,Rs 【说明】 该指令将Rd与Rs的值相减。 变址寻址:【格式】 CMP Rd,BP + IM6 【说明】 该指令将Rd与BP + IM6 指定地址单元数据相比较。 103寄存器间接寻址: 【格式1】 CMP Rd,Rs 【说明】 将Rd的值与寄存器Rs指定存储单元的数据相比较 【格式2】 CMP Rd,Rs+ 【说明】 将Rd的值与寄存器Rs指定存储单元的数据相比较,并修改Rs

85、的值使Rs的值加1。 【格式3】 CMP Rd,Rs- 【说明】 将Rd的值与寄存器Rs指定存储单元的数据相比较,并修改Rs的值,使Rs值减1。 【格式4】 CMP Rd,+Rs 【说明】 修改Rs的值,使Rs加1,将Rd的值与寄存器Rs指定存储单元的数据相比较,结果影响标志位。 1043.4 SPCE061A的逻辑运算的逻辑运算3.4.1 逻辑与逻辑与 逻辑与运算影响标志位N,Z 立即数寻址: 【格式1】 Rd &= IM6 或 Rd = Rd & IM6 【功能】 Rd & IM6 Rd 【说明】 该指令将Rd的数据与6位立即数进行逻辑与操作,结果送Rd寄存器。 【格式2】 Rd = Rs

86、 & IM16 【功能】 Rs & IM16 Rd 【说明】 该指令将Rs的数据与16位立即数进行逻辑与操作,结果送Rd寄存器直接地址寻址: 【格式1】 Rd &=A6 或 Rd Rd & A6 【功能】 Rd & A6 Rd 【说明】 将Rd 和A6指定存储单元数据进行逻辑与操作,结果送Rd寄存器 【格式2】 Rd = Rs & A16 【功能】 Rs & A16 Rd 【说明】 Rs中的数据和A16指定存储单元中的数据进行逻辑与操作,结果送Rd寄存器。 。 105寄存器寻址: 【格式】 Rd &= Rs 【功能】 Rd & Rs Rd 【说明】 将Rd和Rs的数据进行逻辑与操作,结果送Rd

87、寄存器。 【举例】 假设开始时的标志位为:N=0,Z=1,S=0,C=1 R1=0x00FF /R1的初值为0x00FF,Z=0,N=0 R2=0xFFFF /R1的初值为0xFFFF,Z=0,N=1 R1&=R2 /结果为0x00FF,执行后标志位N变为0,Z=0 寄存器间接寻址: 【格式1】 Rd &= Rs 【功能】 Rd & Rs Rd 【说明】 将Rd数据与Rs指定的存储单元数据进行逻辑与操作结果送Rd寄存器。 【格式2】 Rd &= Rs+ 【功能】 Rd & Rs Rd,Rs + 1 Rs 【说明】 将Rd的数据与Rs指定的单元的数据进行逻辑与操作,结果送Rd寄存器,修改Rs的值

88、,使Rs加1。 【格式3】 Rd &= Rs- 【功能】 Rd & Rs Rd,Rs 1 Rs 【说明】 将Rd的数据与Rs指定的单元的数据进行逻辑与操作,结果送Rd寄存器,修改Rs的值,使Rs减1。 【格式4】 Rd &= +Rs 【功能】 Rs + 1 Rs,Rd & Rs Rd 【说明】 修改Rs的值,Rs加1,将Rd的数据与Rs指定的单元的数据进行逻辑与操作,结果送Rd寄存器 1063.4.2 逻辑或逻辑或 逻辑或影响标志位N,Z 立即数寻址: 【格式1】 Rd |= IM6 或 Rd = Rd | IM6 【功能】 Rd | IM6 Rd 【说明】 该指令将Rd的数据与6位立即数进行

89、逻辑或操作,结果送Rd寄存器。 【格式2】 Rd = Rs | IM16 【功能】 Rs | IM16 Rd 【说明】 该指令将Rs的数据与16位立即数进行逻辑或操作,结果送Rd寄存器。 直接地址寻址:【格式1】 Rd |=A6 或 Rd = Rd | A6 【功能】 Rd | A6 Rd 【说明】 将Rd 和A6指定单元数据进行逻辑或操作,结果送Rd寄存器 【格式2】 Rd = Rs | A16 【功能】 Rs | A16 Rd 【说明】 Rs的数据和A16指定单元数据进行逻辑或操作,结果送Rd寄存器。 107寄存器寻址: 【格式】 Rd |= Rs 【功能】 Rd | Rs Rd 【说明】

90、 将Rd和Rs的数据进行逻辑或操作,结果送Rd寄存器。 寄存器间接寻址: 【格式1】 Rd |= Rs 【功能】 Rd | Rs Rd 【说明】 将Rd的数据与Rs指定的单元的数据进行逻辑或操作,结果送Rd寄存器。 【格式2】 Rd |= Rs+ 【功能】 Rd | Rs Rd,Rs + 1 Rs 【说明】 将Rd的数据与Rs指定的单元的数据进行逻辑或操作,结果送Rd寄存器,修改Rs的值,使Rs加1。 【格式3】 Rd |= Rs- 【功能】 Rd | Rs Rd,Rs 1 Rs 【说明】 将Rd的数据与Rs指定的单元的数据进行逻辑或操作,结果送Rd寄存器,修改Rs的值,使Rs减1。 【格式4

91、】 Rd |= +Rs 【功能】 Rs + 1 Rs,Rd | Rs Rd 【说明】 首先,Rs的值将加1,Rd与Rs指定的单元的数据进行逻辑或操作,结果送Rd寄存器。 1083.4.3 逻辑异或逻辑异或 逻辑异或影响标志位:N, Z 立即数寻址: 【格式1】 Rd = IM6 或 Rd = Rd IM6 【功能】 Rd IM6 Rd 【说明】 指令将Rd的数据与6位立即数进行逻辑异或操作,结果送Rd寄存器。 【格式2】 Rd = Rs IM16 【功能】 Rs IM16 Rd 【说明】 该指令将Rs的数据与16位立即数进行逻辑异或操作,结果送Rd寄存器。 【举例】 假设开始时的标志位为:N=

92、0,Z=1,S=0,C=1 R1=0x0F00 /R1的初值为0x0F00,Z=0,N=0 R1=0x0FFF /R1的值变为0x00FF, Z=0,N=0 直接地址寻址: 【格式1】 Rd =A6 或 Rd Rd A6 【功能】 Rd A6 Rd 【说明】 将Rd 和A6指定存储单元中数据进行逻辑异或操作,结果送Rd寄存器 【格式2】 Rd = Rs A16 【功能】 Rs A16 Rd 【说明】 Rs的数据和A16指定存储单元中的数据进行逻辑异或操作,结果送Rd寄存器。 109寄存器寻址: 【格式】 Rd = Rs 【功能】 Rd Rs Rd 【说明】 将Rd和Rs的数据进行逻辑异或操作,

93、结果送Rd寄存器。 寄存器间接寻址: 【格式1】 Rd = Rs 【功能】 Rd Rs Rd 【说明】 将Rd的数据与Rs指定的存储单元中的数据进行逻辑异或操作,结果送Rd寄存器。 【格式2】 Rd = Rs+ 【功能】 Rd Rs Rd,Rs + 1 Rs 【说明】 将Rd的数据与Rs指定的存储单元中的数据进行逻辑异或操作,结果送Rd寄存器,修改Rs,使Rs加1。 【格式3】 Rd = Rs- 【功能】 Rd Rs Rd,Rs 1 Rs 【说明】 将Rd的数据与Rs指定的存储单元中的数据进行逻辑异或操作,结果送Rd寄存器,修改Rs,使Rs减1 【格式4】 Rd = +Rs 【功能】 Rs +

94、 1 Rs ,Rd Rs Rd 【说明】 修改Rs,使Rs加1,Rd的数据与Rs指定的存储单元中的数据进行逻辑异或操作,结果送Rd寄存器 1103.4.4 测试(测试(TEST) 测试指令执行指定两个数的逻辑与操作,但不写入寄存器,结果影响N,Z标志。 立即数寻址 :【格式】 TEST Rd,IM6 【说明】 该指令将Rd与IM6进行逻辑与操作,不存储结果 【格式】 TEST Rd,IM16 【说明】 将Rd与IM16进行逻辑与操作,不存储结果,只影响N,Z标志 直接地址寻址: 【格式1】 TEST Rd, A6 【说明】 该指令将Rd与A6指定存储单元中的数据进行逻辑与操作,不存储结果,只影

95、响标志 N,Z 【格式2】 TEST Rd, A16 【说明】 该指令将Rd与A16指定存储单元中的数据进行逻辑与操作,不存储结果,只影响N,Z标志 变址寻址: 【格式】 TEST Rd,BP+IM6 【说明】 该指令将Rd与BP+IM6指定存储单元中的数据进行逻辑与操作,不存储结果,只影响N,Z标志。 111寄存器寻址: 【格式】 TEST Rd,Rs 【说明】 该指令将Rd与Rs的数据进行逻辑与操作,不存储结果,只影响N,Z标志位。寄存器间接寻址: 【格式1】 TEST Rd,Rs 【说明】 该指令将Rd与Rs 指定存储单元中的数据进行逻辑与操作,不存储结果,只影响N,Z标志位 【格式2】

96、 TEST Rd,Rs+ 【说明】 该指令将Rd与Rs 指定存储单元中的数据进行逻辑与操作,不存储结果,只影响N,Z标志位,并且使Rs值加1。 【格式3】 TEST Rd,Rs- 【说明】 该指令将Rd与Rs指定存储单元中的数据进行逻辑与操作,不存储结果,只影响N,Z标志位,并且使Rs值减1。 【格式4】 TEST Rd,+Rs 【说明】 该指令首先使Rs值加1,而后Rd与Rs指定存储单元中的数据进行逻辑 与操作,不存储结果,只影响N,Z标志位。 1123.4.5 SPCE061A的移位操作的移位操作 SPCE061A的移位运算包括逻辑左移、逻辑右移、循环左移、循环右移、算术右移等操作,移位的

97、同时还可进行其他运算,如加、减、比较、取负、与、或、异或、测试等。指令长度1,指令周期3/8,影响N,Z标志。由于硬件原因对于移位操作,每条指令可以移14位。 逻辑左移(LSL): 【格式】 Rd Rs LSL n 【说明】 该指令对Rs进行n(可设为14)位逻辑左移,将Rs高n位移入SB寄存器,同时Rs的低n(14)位用0补足,结果送Rd寄存器。 【举例】 逻辑左移3位。 存器移位前的状态为: SB: S3 S2 S1 S0 RS:B15 B14 B13 B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 B2 B1 B0存器移位后的状态为:SB: S0 B15 B14 B13

98、 RD:B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 B2 B1 B0 0 0 0程序:R1=0xF00F /R1的初值为0xF00F R1=R1 LSL 3 /R1左移3位后的值变为0x8078 113 逻辑右移(LSR): 【格式】 Rd Rs LSR n 【说明】 该指令对Rs进行n(可设为14)位逻辑右移,将Rs低n位移入SB寄存器同时Rs的高n(14)位用0补足,结果送Rd寄存器。 【举例】 逻辑右移3位。 存器移位前的状态为: RS: B15 B14 B13 B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 B2 B1 B0 SB: S3 S2

99、S1 S0 存器移位后的状态为:RD: 0 0 0 B15 B14 B13 B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 SB: B2 B1 B0 S3 程序: R1=0xF00F /R1的初值为0xF00F R1=R1 LSR 3 /R1右移3位后的值变为0x1E01 114循环左移(ROL): 【格式】 Rd Rs ROL n 【说明】 该指令对Rs进行n(可设为14)位循环左移,将Rs的高n位移入S寄存器,同时移动SB寄存器的高n位移入Rs的低n位,结果送Rd寄存器。 【举例】 循环左移1位。 移位前的各位状态如下: SB: S3 S2 S1 S0 RS: B15 B

100、14 B13 B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 B2 B1 B0移位后的各位状态如下:SB: S2 S1 S0 B15 RS: B14 B13 B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 B2 B1 B0 S3循环右移(ROR): 【格式】 Rd Rs ROR n 【说明】 该指令对Rs进行n(可设为14)位循环右移,将Rs的低n位移入SB寄存器,同时移动SB寄存器的低n位移入Rs的高n位,结果送Rd寄存器。 【举例】 循环右移3位。 移位前的各位状态为: RS: B15 B14 B13 B12 B11 B10 B9 B8 B7 B6 B5

101、 B4 B3 B2 B1 B0 SB: S3 S2 S1 S0 移位后的各位状态为:RD: S2 S1 S0 B15 B14 B13 B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 SB: B2 B1 B0 S3 115算术右移(ASR): 【格式】 Rd Rs ASR n 【说明】该指令将Rs算术右移n(可设为14)位,将Rs的低n位移入SB寄存器,并对最高有效位进行符号扩展,结果送Rd寄存器。该指令适合有符号数的移位操作。 【举例】 算术右移3位。 移位前的各位状态为: RS: B15 B14 B13 B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 B2

102、 B1 B0 SB: S3 S2 S1 S0 移位后的各位状态为:RD: E2 E1 E0 B15 B14 B13 B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 SB: B2 B1 B0 S3 其中E2,E1,E0是Rs中最高有效位的符号扩展位。 SPCE061A在进行移位的同时,还可进行其它运算 1163.5 SPCE061A的控制转移类指令的控制转移类指令SPCE061A的控制转移类指令主要有中断,中断返回,子程序调用,子程序返回,跳转等指令117判C的转移指令有JB和JNB (a)JB的执行过程 (b)JNB的执行过程118判S跳转指令JGE和JNGEJGE表示大于等

103、于通过对标志位S的判断来决定程序走向。S为0则产生跳转,若S为1则继续执行下一语句。JNGE表示小于,当S为1时产生跳转,S为0时则继续执行下一语句 (a)JGE的执行过程 (b)JNGE的执行过程 119判C跳转指令JCC和JCS JCC是以C=0作为判断的标准决定程序的跳转。JCS是以 C=1作为判断的标准决定程序的跳转 (a)JCC的执行过程 (b)JCS的执行过程 1203.6 伪指令伪指令nSP汇编伪指令与汇编指令不同,它不会被编译,而仅被用来控制汇编器的操作。伪指令的作用有点像语言中的标点符号,它能使语言中的句子所表达意思的结构更加清晰而成为语言中不可缺少的一部分。在汇编语言中正确

104、使用伪指令,不仅能使程序的可读性增强,且使汇编器的编译效率倍增。伪指令的语法格式及特点伪指令的语法格式及特点 伪指令可以写在程序文件中的任意位置,但在其前面必须用一个小圆点引导,以便与汇编指令区分开。伪指令行中方括弧里的参量是任选项,即不是必须带有的参量。如果某一个参量使用双重方括弧括起来,则说明这个任选项参量本身就必须带着方括弧。例如count表示引用该任选参量时必须写出count才可。 nSP的汇编器规定的标准伪指令不必区分字母的大小写,亦即书写伪指令时既可全用大写,也可全用小写,甚至可以大小写混用。但所有定义的标号包括宏名、结构名、结构变量名、段名及程序名则一律区分其字母的大小写。 12

105、1伪指令符号约定伪指令符号约定 bank 存储器的页单元 ROM 程序存储器 RAM 随机数据存储器 label 程序标号 value 常量数值 IEEE 一种标准的指数格式的实数表达方式 variable 变量名 number 数据的数目 ASCII 数值或符号的ASCII代码 argument# 参量表中的参量序号 filename 文件名 任选项 伪指令一览表122定义类伪指令: DEFINE 【类 别】定义类 【功能描述】定义常量符号 【语法格式】.DEFINE variable value, 【应用解释】给常量符号所赋之值既可是一已定义过的常量符号,亦可是一表达式。切忌符号超前引用,

106、即如果赋值引用的符号不是在引用前定义的,则会出现非法超前引用的错误。 PUBLIC 【类 别】定义类 【功能描述】声明将被引用在其它文件中的全局标号 【语法格式】.PUBLIC label,label, 【应用解释】本伪指令用来在文件中声明将被引用在外部文件中的全局标号。故在外部文件中用伪指令EXTERNAL所声明的标号必须是用PUBLIC伪指令声明过的。类似地,当要声明多个全局标号时,要用逗号(,)将每一标号分开。EXTERNAL 【类 别】定义类 【功能描述】在某文件中声明已在其它文件里定义过的标号、变量或函数 【语法格式】.EXTERNAL label,label,. 【应用解释】这是在

107、已定义过某些标号、变量或函数的文件之外的文件里,要引用这些标号、变量或函数之前需对其进行声明时所要用到的伪指令。以此避免标号、变量或函数在不同的文件里被引用时容易发生的重复定义错误。如果同时要声明多个这样的外部标号,需用逗号(,)将每一个标号分开。本伪指令后禁止将两个或多个标号进行算术或逻辑操作。 123RAM 【类 别】定义类 【功能描述】切换定义预定义段RAM 【语法格式】.RAM 【应用解释】RAM段用来存放无初始值的变量。RAM段不能跨bank链接,且在链接时所有与其同名或同属性的各段都会被合并在一起而被定位在RAM中.。(参见后面段的定义与使用内容)。 SRAM 【类 别】定义类 【

108、功能描述】切换定义预定义段SRAM 【语法格式】.SRAM 【应用解释】SRAM段的性质基本与RAM段相同。区别在于链接时它只能在RAM中占有前面64(063)个字的数据单元(参见后面段的定义与使用内容)。 IRAM 【类 别】定义类 【功能描述】切换定义预定义段IRAM 【语法格式】.IRAM 【应用解释】IRAM段用来存放具有初始值的变量。此段亦不可跨bank链接,且在链接时所有与其同名或同属性的各段都会被合并在一起,将会同时被分配空间于ROM及RAM中(参见后面段的定义与使用内容)。 124ISRAM 【类 别】定义类 【功能描述】切换定义预定义段ISRAM 【语法格式】.ISRAM 【

109、应用解释】ISRAM段与IRAM段的性质基本相同。区别是ISRAM段在RAM中只能被分配在前面64(063)个字的数据单元 ORAM 【类 别】定义类 【功能描述】切换定义预定义段ORAM 【语法格式】.ORAM 【应用解释】ORAM段用来存放无初始值的变量。ORAM段也不能跨bank链接,且在链接时同一目标文件中所有与其同名或同属性的各段都会被合并在一起而被定位在RAM中。但在一个项目里的不同目标文件中所有与ORAM段同名或同属性的各段会被重叠在一起。当编程者需要在不同的文件里使用相同的变量空间时,适合用本伪指令 OSRAM 【类 别】定义类 【功能描述】切换定义预定义段OSRAM 【语法格

110、式】.OSRAM 【应用解释】OSRAM段与ORAM段的性质基本相同。区别在于链接时OSRAM段只能在RAM中被分配在前面64(063)个字的数据单元125VAR 【类 别】定义类 【功能描述】定义变量并为变量置初始值 【语法格式】.VAR variable=value 【应用解释】在程序的任何部位都可用本伪指令定义变量并为变量置初始值。若定义多个具有初始值的变量,需用逗号(,)将每一个变量赋值分开(若要为变量赋初始值,则必须声明在IRAM或ISRAM段中,若在其它段中申明将无效,它将被初始化为0;同样要申请具有初值的单元也必须在IRAM或在ISRAM中申请,若在其它段中申请也将无效,它将被初

111、始化为0)。 DATA 【类 别】定义类 【功能描述】切换定义预定义段DATA 【语法格式】.DATA 【应用解释】程序中所有数据都可以存放在DATA段的位置上。DATA段可以跨bank链接。链接时,不同文件中所有与其同名或同属性的各段会被分开置入ROM地址中,而同一文件中所有与DATA同名或同属性的各段会被合并在一起置入ROM地址中。 126CODE 【类 别】定义类 【功能描述】切换定义预定义段CODE 【语法格式】.CODE 【应用解释】所有程序指令和数据都可以存放在CODE段下。汇编器对程序指令进行汇编时,遇到各类预定义段会采取相应的方式进行处理。换言之,预定义段的段名是汇编器进行汇编

112、操作的一种地址分类标签。CODE段不能跨bank链接。不同文件中所有与其同名的预定义段或同属性的用户定义段会被分开地定位在ROM地址中,而同一文件中所有与CODE同名或同属性的各段则会被合并在一起置入在ROM地址中。 TEXT 【类 别】定义类 【功能描述】切换定义预定义段TEXT 【语法格式】.TEXT 【应用解释】TEXT段与CODE段的性质基本相同。唯一的区别是它只能被链接到第一个单元即零页ROM中,且所有与其同名或同属性的各段均会被合并在一起而被定位到此。该段主要用来写中断程序代码 PROC 【类 别】 定义类 【功能描述】 开始程序的定义 【语法格式】 label: .PROC 【应

113、用解释】 本伪指令用于起始程序的定义,应与结束程序定义的伪指令ENDP成对使用127ENDP 【类 别】定义类 【功能描述】结束程序的定义 【语法格式】ENDP 【应用解释】程序定义的起始要用伪指令PROC,终止则用本伪指令。两条伪指令应成对使用(参见后面过程的定义与调用内容)。STRUCT 【类 别】定义类 【功能描述】起始结构的定义 【语法格式】label: .STRUCT 【应用解释】本伪指令用于起始结构的定义,应与结束结构定义的伪指令ENDS成对使用 ENDS 【类 别】定义类 【功能描述】结束结构的定义 【语法格式】.ENDS 【应用解释】本伪指令用来终止结构的定义。起始结构的定义是

114、由伪指令STRUCT给出的。二者须成对使用 128MACRO 【类 别】定义类 【功能描述】起始宏的定义 【语法格式】label: .MACRO args 【应用解释】本伪指令用来起始宏定义。结束宏定义则用ENDM伪指令,二者应成对使用 ENDM 【类 别】定义类 【功能描述】结束宏的定义 【语法格式】.ENDM 【应用解释】本伪指令用来结束宏定义。它应与起始宏定义的伪指令MACRO成对使用 MACEXIT 【类 别】定义类 【功能描述】退出宏定义 【语法格式】.MACEXIT 【应用解释】从宏定义里退出是立即且无条件的。本伪指令并非用来终止宏定义。它常与条件汇编用在一起,意指条件满足时从宏定

115、义里退出,对ENDM伪指令后面的指令进行汇编;条件不满足时,继续汇编MACEXIT伪指令后的宏定义内的其它指令。不必担心从宏里退出时条件会失衡,因为MACEXIT伪指令会自动将条件恢复到原来的均衡状态。 129EQU 【类 别】定义类 【功能描述】为标号赋值 【语法格式】label: .EQU value 【应用解释】给标号所赋之值可为在此标号之前已定义过的某一符号常量或为一表达式。同样要注意符号不能超前引用。所有通过EQU定义的标号及值将会输出至 Linker 的符号文件。VDEF 【类 别】定义类 【功能描述】为标号赋值 【语法格式】lable: .VDEF value 【应用解释】可以在

116、程序的任何部位用本伪指令为标号重复赋值。 DW 【类 别】存储类 【功能描述】以16位整型数据的形式来存储常量或变量 【语法格式】label: .DW value,value,. 【应用解释】本伪指令是把一系列16位整型常量或变量值存入连续的整型数据单元中。整型常量或变量值可以是多种类型的操作数。需用逗号(,)将多个数值分开;特别地,若定义的数值较多,需多行书写时,在一行当中最后一个数值输毕,用回车键结束此行输入之前切莫丢掉逗号。若存储的常量中含有ASCII 字符串,则必须用引号( )将其括起来。如果.DW后面未输入任何数值,则会自动存入一个整型零常量。 130DD 【类 别】存储类 【功能描

117、述】以32位长整型数据的形式存储双字常量或变量 【语法格式】label:.DD value,value, 【应用解释】申请若干连续的32位长整型数据单元来存放双字常量或变量序列。常量(变量值)与常量(或变量值)之间应当用逗号(,)隔开。存放的常量可以任何一种数制格式输入,但最终由汇编器将其转换成十六进制格式存放。 DOUBLE 【类 别】存储类 【功能描述】以双精度浮点型实数数据的形式存储实数常量或变量 【语法格式】label:.DOUBLE value,value, 【应用解释】把实数常量或变量的值转换成以IEEE格式表示的双精度浮点型数据并存储。存储多个这类常量或变量的值时需用逗号(,)将

118、其分开。以本伪指令存储的常量必须是实数。 FLOAT 【类 别】存储类 【功能描述】以单精度浮点型实数数据单元来存储实数常量或变量 【语法格式】label: .FLOAT value,value,. 【应用解释】本伪指令用来把实数常量或变量值转换成以IEEE格式表示的单精度浮点型数据并存储。当要存储多个这类常量或变量值时需用逗号(,)将其分开。所谓单精度浮点型实数是指数的精度保证6位有效位。若超过6位,则对第七位进行入舍处理后,其后所有位均会被舍去。 131END 【类 别】存储类 【功能描述】用来结束程序文件或结束包含文件 【语法格式】.END 【应用解释】本伪指令用在程序文件中意味该文件结

119、束(不可再包含其它文件) DUP 【类 别】存储定义类 【功能描述】本伪指令与DW、FLOAT、DD、DOUBLE存储类伪指令组合在一起用于存放若干个具有相同数值的常量;或者申请若干个备用的整型、单精度浮点型、长整型以及双精度浮点型数据单元。 【语法格式1】label: .DW number DUP(value) 【说 明1】存储若干具有相同数值的16位的整型数据。 【语法格式2】label: .FLOAT number DUP(value) 【说 明2】存储若干具有相同数值的32位的单精度浮点型实数数据。 【语法格式3】label: .DD number DUP(value) 【说 明3】存

120、储若干具有相同数值的32位的长整型数据。 【语法格式4】label: .DOUBLE number DUP(value) 132IF 【类 别】条件类 【功能描述】引出在条件汇编结果为真时所要汇编的程序指令 【语法格式】.IF value 【应用解释】所谓条件汇编结果为真是指参量value的值不为零。value既可为在此之前已定义过的某一符号常量或一字符串常量,亦可为一算术表达式。 ELSE 【类 别】条件类 【功能描述】引出IF伪指令设置的条件汇编结果为假时所要汇编的程序指令。 【语法格式】.ELSE 【应用解释】 若本伪指令前面的IF伪指令设置的条件汇编结果为假时引出另一部分汇编程序指令。

121、本伪指令必须与IF伪指令结合使用。 ENDIF 【类 别】条件类 【功能描述】用来结束条件汇编组合的定义 【语法格式】.ENDIF 【应用解释】本伪指令用来结束条件汇编组合定义。它必须与IF伪指令成对使用,否则会产生条件不匹配的错误。 IFDEF 【类 别】条件类 【功能描述】引出若某变量已被赋过值时所要汇编的程序指令 【语法格式】.IFDEF variable 【应用解释】根据本伪指令后面的变量名,汇编器会搜索符号表。若搜索到说明该变量已被赋过值,则会对本伪指令下面的程序指令进行汇编;否则会跳过该段程序指令而直接对ELSE或ENDIF伪指令后面的程序指令进行汇编。 133IFNDEF 【类

122、别】条件类 【功能描述】引出某变量还未被赋值时所要汇编的程序指令 【语法格式】.IFNDEF variable 【应用解释】根据本伪指令后面的变量名,汇编器首先搜索符号表。若在符号表中未查到有该变量名存在,则会对本伪指令下面的汇编指令进行汇编;否则,便会对ELSE或ENDIF伪指令后面的汇编语句进行汇编。显然,本伪指令与IFDEF伪指令的作用相反。IFMA 【类 别】条件类 【功能描述】引出若指定的宏参量存在时所要汇编的程序指令 【语法格式】.IFMA argument# 【应用解释】本伪指令必须用在宏内。参量argument#是指宏定义参量表中的参量序号。汇编器据此序号查找宏调用行上的参量值

123、表,如果在该表内与序号对应的参量值存在,就对本伪指令下面的汇编指令进行汇编;否则便会对ELSE 或ENDIF伪指令后的汇编指令进行汇编。特例情况是当argument#为零,则汇编器只有在宏调用里不含有参量值时认为条件为真而进行相应的操作。 134INCLUDE 【类 别】汇编方式类 【功能描述】在汇编文件里包含某个文件 【语法格式】.INCLUDE filename 【应用解释】本伪指令用来通知汇编器把指定的文件包含在文件中一起进行汇编。其中参量filename包括文件的扩展名,且可指明搜索文件所需的路径。注意,每一条INCLUDE伪指令只能包含一个文件。已包含某些文件的文件可再被包含在其它文

124、件中。 SECTION 【类 别】汇编方式类 【功能描述】创建用户定义段 【语法格式】label: .SECTION .attribute 【应用解释】除了上面提到的一些预定义段用于存放指令代码或数据以外,编程者还可以根据需要用本伪指令定义某些段。其中属性参量attribute可以是以下预定义段名当中的任意一个:CODE,DATA,TEXT,RAM,SRAM,IRAM,ISRAM,ORAM,OSRAM 1353.6.4 宏定义与调用宏定义与调用 宏定义 :所谓宏(Macro)是指在源程序里将一序列的源指令行用一个简单的宏名(Macro Name)所取代。这样做的好处是使程序的可读性增强。 宏在

125、使用之前一定要先经过定义。可分别用伪指令.MACRO和.ENDM来起始和结束宏定义;定义的宏名将被存入标号域。在汇编器首次编译通过汇编指令时,先将宏定义存储起来,待指令中遇有被调用的宏名则会用同名宏定义里的序列源指令行取代此宏名。宏定义里可以包括宏参数,这些参数可被代入除注释域之外的任何域内。虚参数不能含有空格。 宏标号: 宏定义里可以用显式标号(由用户定义),亦可用隐含标号(由汇编器自动定义)。汇编器不会改变用户定义的显式标号。在宏标号后加上后缀符#则表明该标号为隐含标号,汇编器会自动生成一个后缀数字符号_X_XXXX(X表示一位数符,XXXX表示4位扩展数符)来取代这个隐含标号中的后缀符#

126、,可见下面程序汇编例子。隐含标号中的字母字符及其后缀数符总共不能超过32个字符。 136宏调用: 在调用宏时,可以使用任何类型的参数:直接型、间接型、字符串型或寄存器型。只有字符串型参数才能含有空格,但必须用引号将此空格括起,即 /“ ”。(而字符串参数中的单引号,必须用双引号将其括起,即“”)。只要在宏嵌套中的形参名相同,则这些参数就可以穿过嵌套的宏使用。宏嵌套使用唯一所受的限制是内存空间的容量。宏的多个参数应以逗号隔开,参数前的空格及Tab键都将被忽略。单有一个逗号,而后面未带有任何参数会被汇编器表示为参数丢失错误。 宏参数分隔符: 在一个宏体中,宏参数的有效分隔为标点符号中的逗号,即,。

127、 宏内字符串连接符 :符号(40H)是字符串连接符。注意,字符串连接只能在宏内进行助记符搜索顺序: 。 137例:将宏参数传入标号域。这样做可以使程序的结构改变。 employee_info2: .MACRO arg1,arg2,arg3 arg1: .DW 0x30 ; arg2: .DW 0x10 ; arg3: .DD 1999; .ENDM /调用前面定义的宏 employee_info2 name,department,date_hired /汇编器将宏展开成: name: .DW 0x30 ; department:.DW 0x10 ; date_hired:.DD 1999; 1

128、383.6.5 段的定义与调用段的定义与调用 段其实就是应用在汇编器Xasm16中的地址标签。Xasm16除了定义的预定义段以外,还可由用户自己定义段。 预定义段: 在Xasm16里共定义有9个预定义段:CODE、DATA、TEXT、ORAM、OSRAM、RAM、IRAM、SRAM及ISRAM段。这些预定义段都分别被规定了以下内容: 段内存储数据类型:指令/数据,无初始值的变量/有初始值的变量; 存储介质类型:ROM/RAM(SRAM); 存储范围:零页(或零页中前64个字)或当前页/整个64页; 定位排放方式:合并排放/重叠排放。 当用户以这些预定义段的伪指令来定义自己程序的数据块以后,Xa

129、sm16在汇编时会采取相应的措施进行处理,实际上为链接器的链接处理贴好了地址标签用户定义段 :为了使程序在链接时具有更大的灵活性,用户可以用伪指令.SECTION来定义段。定义的段名最多不可超过32个字符,且最多可定义4096个段,但不可嵌套使用。用户段定义的格式为: label: .SECTION .attribute 用户定义段 :为了使程序在链接时具有更大的灵活性,用户可以用伪指令.SECTION来定义段。定义的段名最多不可超过32个字符,且最多可定义4096个段,但不可嵌套使用。用户段定义的格式为: label: .SECTION .attribute 1393.6.6 结构的定义与调

130、用结构的定义与调用 结构的定义 :结构作为一种数据构造类型在nSP汇编语言程序中也要经历定义说明使用的过程。在程序中使用结构时,首先要对结构的组成进行描述,即结构的定义。定义的一般格式如下: 结构名:.STRUCT /定义结构开始 数据存储类型定义 .ENDS /定义结构结束 结构的定义以伪指令.STRUCT和ENDS作为标识符。结构名由用户命名,命名原则与标号等相同。在两个伪指令之间包围的是组成该结构的各成员项数据存储类型的定义。例如: test1:.STRUCT /定义了一个结构test1 ad:.DW 10 /它包括3个成员ad, bs, gh, bs:.DW abcd gh:.DD 0

131、x0FFFC /且分别被初始化为10,abcd,0x0FFFC .ENDS /结构定义结束 140在单向循环链表中插入节点的例子 1413.6.7 过程的定义与调用过程的定义与调用 过程实际可以是一个子程序块。它有点类似ANSI-C中的函数,可以把一个复杂、规模较大的程序由整化零成一个个简单的过程,以便程序的结构化。 过程的定义: 过程的定义就是编写完成某一功能的子程序块,用伪指令.PROC和.ENDP作为定义的标识符。定义的一般格式为: 过程名: .PROC 程序指令列表 RETF .ENDP 由此格式可以看出,过程的定义主要由过程名和两个伪指令之间的过程体组成。过程名由用户命名,其命名规则

132、同标号 过程的调用: 在程序中调用一个过程时,程序控制就从调用程序中转移到被调用的过程,且从其起始位置开始执行该过程的指令。在执行完过程体中各条指令并执行到RETF指令时,程序控制就返回调用过程时原来断点位置继续执行下面的指令 142 SPCE061A片内存储器映射 143例2:用户编写的程序代码必须写在DATA、CODE、或TEXT段,下面具体讲解DATA、CODE、TEXT三条伪指令的用法及区别。 题:利用IOA0-7的按键唤醒功能确定键码,并将相应键值通过七段数码管显示出来。IOA07设置为具有唤醒功能的输入口,IOB07设置为带缓冲器的输出口,七段数码管采用共阴极接法程序流程图: 14

133、4nSP汇编指令中的数据类型汇编指令中的数据类型 145本章结束作业与思考题146第四章第四章程序设计程序设计1474.1 nSP IDE的项目组织结构项目提供用户程序及资源文档的编辑和管理,并提供各项环境要素的设置途径。因此,用户从编程到调程之前实际上都是围绕着项目的操作。 新建项目包括三类文件:源文件(Source files)、头文件(Head files)和用来存放文档或项目说明的文件(External Dependencies)其组织结构如表4.1所示。这种项目管理的方式,会把与项目相关的代码模块组织为一个有机的整体,便于开发人员对其代码以及相关文件文档的管理nSP IDE新建项目的

134、结果 148IDE项目文件管理的组织结构 1494.2 汇编语言程序设计代码流动过程图 150编程示例/描述: 计算1 to 100累加值 .RAM / 定义预定义 RAM 段 .VAR I_Sum; / 定义变量 .CODE /定义代码段 /=/ 函数: main() / 描述:主函数 /= .PUBLIC _main; / 对main程序段声明 _main: /主程序开始 R1 = 0x0001; / r1=1.100 R2 = 0x0000; / 寄存器清零 L_SumLoop: R2 += R1; / 累计值存到寄存器r2 R1 += 1; / 下一个数值 CMP R1,100; /

135、判断是否加到100 JNA L_SumLoop; / 如果 r1 (IRQ0IRQ1IRQ2IRQ3IRQ4IRQ5IRQ6同级)UART IRQ 203中断响应过程 : 从中断请求发生到被响应,从中断响应到转向执行中断服务程序,完成中断所要求的操作任务,是一个复杂的过程。整个过程都是在CPU的控制下有序进行的1中断查询 SPCE061A的设计思想是把所有的中断请求都汇集到P_INT_Ctrl和P_UART_Command2(该寄存器用于检测串行传输中断标志位)寄存器中。其中外中断是使用采样的方法将中断请求锁定在P_INT_Ctrl寄存器的相应标志位中,而音频输出中断、触键唤醒、定时中断、时基

136、中断、串行异步中断的中断请求由于都发生在芯片的内部,可以直接去置位P_INT_Ctrl和P_UART_Command2中各自的中断请求标志,不存在采样的问题,所谓查询就是由CPU测试P_INT_Ctrl和P_UART_Command2中各标志位的状态,已确定有没有中断请求发生以及是哪一个中断请求,中断请求汇集使中断查询变得简单,因为只需对两寄存器查询即可。SPCE061A中断查询发生在每一个指令周期结束后,按中断优先级顺序对中断请求进行查询,即先查询高级中断后,再查询低级中断,即先查询FIQ再查询IRQ,同级中断按IRQ0IRQ1IRQ2IRQ3IRQ4IRQ5IRQ6UART的顺序查询。如果

137、查询到有标志位为“1”,则表明有中断请求发生。因为中断请求是随机的发生的,CPU无法预先得知,因此在程序执行过程中,中断查询要在每个指令结束后不停的进行。2042中断响应 中断响应就是CPU对中断源提出的中断请求的接受,是在中断查询后进行的,当查询到有效的中断请求时,紧接着就进行中断响应。中断响应的主要内容可以理解为是硬件自动生成一条调用指令,其格式为CALL addR16,这里的addR16就是存储器中断区中相应中断入口地址。在SPCE061A单片机中,这些入口地址已经由系统设定,例如,对于时基信号2Hz中断的响应,产生的调用指令为: CALL 0xFFFD 生成CALL指令后,紧接着就由C

138、PU执行,首先将程序计数器PC的内容压入堆栈,然后,再将SR压入堆栈,以保护断点,再将中断入口地址装入PC,使程序执行转向相应的中断区入口地址,调用中断服务程序。 中断响应是有条件的,并不是查询到所有中断请求都能被立即响应,当存在下列情况时,中断响应被封锁: CPU正处在为一个同级或高级的中断服务中。因为当一个中断被响应时,要求把对应的优先级触发器置位,封锁低级和同级中断。 中断响应时间 中断响应的时间应首先从中断信号出现到CPU响应的时间与CPU响应中断信号到进入中断服务程序的时间之和 在一般应用情况下,中断响应时间的长短通常无需考虑。只有在精确定时应用场合,才需要知道中断响应时间,以保证定

139、时的精确控制。205中断请求的撤销 : 中断响应后,P_INT_Ctrl和P_UART_Command2中的中断请求标志应及时清除。否则就意味着中断请求仍然存在,弄不好就会造成中断的重复查询和响应,因此就存在一个中断请求的撤销问题。在SPCE061A中断中,中断撤销只是标志位的置“0”问题。SPCE061A中断除UART中断外,所有的中断均需软件清除标志位,即将P_INT_Ctrl中相应的中断位清零。即可将中断请求撤销。而UART中断,则是硬件自动清零,不需要软件操作。如当接收到数据后,P_UART_Command2中的接收标志位自动置“1”,进入UART中断,在UART中断中读出数据,P_U

140、ART_Command2相应的中断标志位自动清零。 中断服务流程图所示 2061.中断入口 所谓中断的入口即中断的入口地址,每个中断源都有自己的入口地址2.关中断和开中断 在一个中断执行过程中又可能有新的中断请求,但对于重要的中断必须执行到底,不允许被其它的中断所嵌套。如FIQ中断,对此,可以采用关闭中断的方法来解决,如在IRQ中断中不允许FIQ中断嵌套,就可以在IRQ中断中关闭中断,当中断服务程序执行结束后,再打开中断,去响应FIQ中断。即在现场保护之前先关闭中断系统,彻底屏蔽其它中断请求,待中断处理完成后再打开中断系统。 还有一种情况是中断处理可以被打扰,但现场的保护和恢复不允许打扰,以免

141、现场被破坏,为此应在现场保护和现场恢复的前后进行开关中断。这样做的结果是除现场保护和现场恢复的片刻外,仍然保持着系统中断嵌套功能,对于SPCE061A单片机中断的开和关可通过中断控制指令来控制IRQ和FIQ中断,如果想实现单个中断源的控制,可以通过P_INT_Ctrl控制寄存器来置位和清位来打开或关闭某个中断。 3现场保护和现场恢复 所谓现场是指中断时刻单片机中存储单元中的数据状态。为了使中断服务的执行不破坏这些数据或状态,以免在中断返回后影响主程序的运行,因此要把它们送入堆栈中保存起来,这就是现场保护。现场保护一定要位于中断处理程序的前面。中断服务结束后,在返回主程序前,则需要把保存的现场内

142、容从堆栈中弹出,以恢复那些存储单元的原有内容,这就是现场恢复。现场恢复一定要位于中断处理程序的后面。 2074中断源判断 因为SPCE061A中断源多于中断入口地址,所以当CPU响应中断后,经中断入口地址进入中断服务程序,通过读P_INT_Ctrl可判断产生中断请求的中断源。 5.中断处理 中断处理是中断服务程序的核心内容,是中断的具体目的。 6.清中断标志位 因为CPU是根据中断标志位来判断并进行响应中断的,除串口中断外,所有的中断标志位不是靠硬件清除,而是软件清除的,所以在中断服务程序中,必须将中断标志清除,否则CPU总是会响应该中断的。清除标志位只要在中断服务程序中即可,位置不是固定,如

143、也可以在中断处理程序前清除中断标志。 7.中断返回 中断服务程序最后一条指令必须是中断返回指令RETI,当CPU执行这条指令时,从堆栈中弹出断点PC、及SR,恢复断点重新执行被中断的程序。 208 5.3 中断系统的应用 5.3.1 单中断源的应用 定时器中断 : 定时器中断包括定时器A中断和定时器B中断,而且定时器A,B中断源不仅在FIQ中断方式中有,在IRQ1(TimerA),IRQ2(TimerB)中也有,当然这可以根据具体程序需要,如果需要定时器的中断优先级高,即可以打开FIQ方式的定时器中断。如果在不要求较高的中断优先级,则可以将定时器中断放在IRQ中断方式中。 定时中断所使用的寄存

144、器: 209时基中断 : SPCE061A单片机具有时基中断,减少了软硬件关于实时时钟处理过程。时基信号频率丰富有2Hz、4Hz、8Hz、16Hz、32Hz、64Hz、128Hz、256Hz、512Hz、1024H、2048Hz、4096Hz等多种频率,为用户在实时处理上提供了各种时钟选择。 时基中断源7个,占有三个中断入口地址。 时基中断使用的控制寄存器 210触键唤醒中断 : 触键唤醒中断源主要是在系统进入睡眠状态后,通过A口低八位的按键来唤醒系统时钟。同时进入触键唤醒中断。恢复睡眠时的PC指针 触键唤醒中断使用的控制寄存器 211外部中断 : SPCE061A有两个外部中断,为负跳沿触发

145、。可以使用形成反馈电路定时来触发外部中断,也可以不使用反馈电路,通过给IOB2或IOB3外部中断触发信号,进入外部中断 反馈电路外部中断使用的控制寄存器 212串行异步中断:串行异步中断用于串行通讯过程中数据的收发,此外,UART还可以缓冲地接收数据。也就是说,它可以在读取缓存器内当前数据之前接收新的数据。但是,如果新的数据被接收到缓存器之前一直未从中读取先前的数据,会发生数据丢失。P_UART_Data (读/写) ($7023H)单元可以用于接收和发送数据的缓存。向该单元写入数据,可以将发送的数据送入缓存器;从该单元读数据,可以从缓存器读出单个的数据字节。UART模块的接收管脚Rx和发送管

146、脚Tx分别可与IOB7和IOB10共用。 串行异步中断使用的控制寄存器 213多中断源应用:在单片机软件开发中,使用多个中断源的机会有很多。在SPCE061A单片机中多中断源的使用有两种方式,一种是同个中断入口中断源的使用;另一种是不同中断入口的多个中断源的使用。1同中断向量的多个中断源使用2不同中断入口的中断源使用 示例分析214第六章第六章集成开发环境IDEIDE 215 6.1 6.1 综综 述述 nSP 集成开发环境集程序的编辑、编译、链接、调试以及仿真等功能为一体。具有友好的交互界面、下拉菜单、快捷键和快速访问命令列表等,使编程、调试工作方便且高效。此外,它的软件仿真功能可以在不连接

147、仿真板的情况下模拟硬件的各项功能来调试程序。 6.2 IDE6.2 IDE平台的构成平台的构成 IDE平台由三个窗口组成:工作区域窗口(workspace window)、编辑窗口 (edit window)、输出窗口(output window) 文件菜单、编辑菜单、视图菜单、项目菜单、编译菜单、工具菜单、帮助菜单、调试菜单(调试模式下) 6.3 6.3 工具栏工具栏工具栏:与windows下的工具栏格式一样 216 6.4 6.4 窗口窗口,nSP IDE 编程环境中还有其它一些窗口,如下: 1 Workspace 窗口 2 Edit窗口 3 Output 窗口 4 Debug 窗口 1)

148、 变量表 Watch 窗口 2) 寄存器 Register 窗口 3) 命令Command窗口 4) 内存 Memory 窗口 5) 断点Breakpoints窗口 6) 反汇编窗口 Disassembly 窗口 5 其它窗口 1) 历史缓冲区窗口 2) 转存窗口 Workspace Workspace 窗口 :在Workspace窗口中,含有建立一个应用程序所需要的文件清单。其中包括所有的与该项目相关资源文件(如语音数据等)和被编辑的程序文件。我们可用视窗标签来切换显示File, Resource两个视窗。 File 视窗主要用来显示源文件组和头文件组中所包含的所有文件。 Resource

149、视窗主要用来显示资源文件组中所包含的所有资源文件。217编辑窗口(编辑窗口(Edit Edit 窗口):窗口): 编辑窗口主要是用来键入程序文件和其它编辑文件的显示。 新建任何一文件,即可打开编辑窗口。例如:单击File/New/Creat C File 打开该C文件的编辑窗口。 编辑窗口包括文本编辑器和二进制编辑器。文本编辑器:文本编辑器: 文本编辑器用来编辑程序的。当在项目中打开一个文件时,文件所有的内容都将显示在文本编辑器中。 二进制编辑器: 二进制编辑器用来编辑项目中十六进制或ASCII格式的二进制代码的资源文件。 输出窗口(输出窗口(OutputOutput窗口):窗口): 输出窗口

150、主要用来显示编辑、调试、查找的输出结果。输出窗口还可以细分为编辑输出窗口、调试输出窗口、查找输出窗口三种。这三种输出窗口可以通过输出窗口底部的标签切换。 调试窗口(Debug Debug 窗口) 程序文件经过编译无错后,单击工具栏中的 Download 按钮,即可进入调试模式。所有的调试窗口均在调试模式下方可打开。 调试窗口主要用来显示有关的调试信息。218在调试模式下,调试菜单显示在主菜单下。调试窗口包括: 1) 变量表 Watch 窗口 2) 寄存器 Register 窗口 3) 内存 Memory 窗口 4) 命令Command窗口 5) 断点Breakpoints窗口 6) 反汇编窗口

151、 Disassembly 窗口 变量表变量表 Watch Watch 窗口:窗口: 变量表 Watch 窗口用于输入并编辑变量,显示变量内容。使用方法:双击变量名称处,可以出来一文本框,在文本框中写入变量名称,则相应的变量值和变量所在地址就可以显示出来寄存器寄存器 (Register) (Register) 窗口:窗口: 寄存器 (Register) 窗口显示当前常用寄存器和特殊寄存器的内容。 内存内存 (Memory) (Memory) 窗口:窗口:内存 (Memory) 窗口显示内存内容命令窗口:命令窗口: 单击View菜单下的 Command 命令,打开命令窗口,在该窗口列表框下面的文本

152、输入框中键入帮助字符“H H”并确认后,会在列表中列出IDE 的所有命令及相应功能描述219断点窗口 :(BreakPoints) 断点窗口显示断点的内容。 反汇编窗口 :(Disassemble) 反汇编窗口 (Disassemble)显示反汇编内容历史缓冲区窗口: 在仿真模式下,执行完程序后,被执行的指令、状态、内存内容将被存储到历史缓冲区中 转存窗口:在调试模式下,单击 Tools /Dump Memory 即进入转存窗口建立项目:在做一个应用程序前,首先要建项目在项目中使用资源在项目中使用资源 :当在项目里的资源元组中添加资源文件时,该资源文件的存储路径及名称会自动被记入项目中的.rc

153、文件中,并以RES_*的缺省文件名格式被赋予一个新的文件名(此处*是指资源文件在其存储路径上的文件名);同时,添入的资源文件还会被安排一个文件标识符ID。 项目的编译:当项目中的文件编写结束后,要对项目中的程序进行编译,并将编译出来的二进制代码与库中的各个模块连接成一个完整的、地址统一的可执行目标文件和符号表文件,供用户调试使用,在这里要使用编译器、汇编器、链接器等工具220 代码剖视器(代码剖视器(profilerprofiler)使用及功能:)使用及功能:nSPnSP. IDE. IDE的代码剖视器是一个强有力的分析工具。通过应用此工的代码剖视器是一个强有力的分析工具。通过应用此工具来剖析

154、、优化程序代码。具体地,此工具具有以下一些功能:具来剖析、优化程序代码。具体地,此工具具有以下一些功能:. . 提供代码优化的准确信息。对部分程序进行诸多重要因素的剖析,提供代码优化的准确信息。对部分程序进行诸多重要因素的剖析,包括某段程序花费了多少个指令周期的执行时间,程序中的标号流等包括某段程序花费了多少个指令周期的执行时间,程序中的标号流等一些有助于提高程序效率的信息;一些有助于提高程序效率的信息;. . 检测并分析程序运行当中使用算法的有效性之高低;检测并分析程序运行当中使用算法的有效性之高低;. . 检查用户程序的代码段是否面临处在系统测试程序区的危险。检查用户程序的代码段是否面临处

155、在系统测试程序区的危险。 221222第七章第七章音频压缩算法音频压缩算法 223 音频的概述(特点、分类) 数字音频的采样和量化音频格式的介绍 :声音文件 MIDI文件语音压缩编码基础 : 语音压缩编码中的数据量语音压缩编码中的数据量:数据量=(采样频率量化位数)/8(字节数) 声道数目。 压缩编码的目的:压缩编码的目的:通过对资料的压缩,达到高效率存储和转换资料的结果,即在保证一定声音质量的条件下,以最小的资料率来表达和传送声音信息。 压缩编码的必要性:压缩编码的必要性:实际应用中,未经压缩编码的音频资料量很大,进行传输或存储是不现实的。 所以要通过对信号趋势的预测和冗余信息处理,进行资料

156、的压缩,这样就可以使我们用较少的资源建立更多的信息见的几种音频压缩编码: 1) 波形编码 2) 参数编码 3) 混合编码从文本到语音转换过程示意 224语音辨识技术有三大研究范围:口音独立、连续语音及可辨认字词数量 口音独立:口音独立: 1)早期只能辨认特定的使用者即特定语者(Speaker Dependent,SD)模式2)非特定语者模式(Speaker Independent,SI) 连续语音:连续语音: 1)单字音辨认 2)整个句子辨识语音识别原理简图 225压缩分类 压缩分无损压缩和有损压缩。 无损压缩一般指:磁盘文件,压缩比低:2:14:1。 而有损压缩则是指:音视频文件,压缩比可高

157、达100:1。 凌阳音频压缩算法根据不同的压缩比分为以下几种 SACM-A2000:压缩比为8:,8:1.25,8:1.5 SACM-S480: 压缩比为80:3,80:4.5 SACM-S240: 压缩比为80:1.5 按音质排序:A2000S480S240 常用的音频形式和压缩算法 1) 波形编码:sub-band即SACM-A2000 特点:高质量、高码率,适于高保真语音音乐。 2) 参数编码:声码器(vocoder)模型表达,抽取参数与激励信号进行编码。如:SACM-S240。 特点:压缩比大,计算量大,音质不高,廉价! 3) 混合编码:CELP即SACM-S480 特点:综合参数和波

158、形编码之优点。 除此之外,还具有FM音乐合成方式即SACM-MS01226语音识别电路基本结构如图所示: 单片机对语音处理过程 227SACM_A2000 该压缩算法压缩比较小(8:1)所以具有高质量、高码率的特点适用于高保真音乐和语音。 其相关API函数如下所示: void SACM_A2000_Initial(int Init_Index) /初始化 void SACM_A2000_ServiceLoop(void) /获取语音资料,填入译码队列 void SACM_A2000_Play(int Speech_Index, int Channel, int Ramp_Set) /播放 vo

159、id SACM_A2000_Stop(void) /停止播放 void SACM_A2000_Pause (void) /暂停播放 void SACM_A2000_Resume(void) /暂停后恢复 void SACM_A2000_Volume(Volume_Index) /音量控制 unsigned int SACM_A2000_Status(void) /获取模块状态 void SACM_A2000_InitDecode(int Channel) /译码初始化 void SACM_A2000_Decode(void) /译码 void SACM_A2000_FillQueue(unsi

160、gned int encoded-data)/填充队列 unsigned int SACM_A2000_TestQueue(void) /测试队列 Call F_FIQ_Service_ SACM_A2000 /中断服务函数 228SACM_S480 该压缩算法压缩比较大80:3, 存储容量大,音质介于A2000和S240之间,适用于语音播放, 如“文曲星”词库其相关API函数如下所示: int SACM_S480_Initial(int Init_Index) /初始化 void SACM_ S480_ServiceLoop(void) /获取语音资料,填入译码队列 void SACM_ S

161、480_Play(int Speech_Index, int Channel, int Ramp_Set) void SACM_ S480_Stop(void) /停止播放 void SACM_S480_Pause (void) /暂停播放 void SACM_S480_Resume(void) /暂停后恢复 void SACM_S480_Volume(Volume_Index) /音量的控制 unsigned int SACM_S480_Status(void) /获取模块的状态 Call F_FIQ_Service_ SACM_S480 /中断服务函数 229SACM_S240 该压缩算法

162、的压缩比较大80:1.5,价格低,适用于对保真度要求不高的场合, 如玩具类产品的批量生产,编码率仅为2.4 Kbps。 其相关API函数如下所示: int SACM_S240_Initial(int Init_Index) /初始化 void SACM_ S240_ServiceLoop(void) /获取语音资料,填入译码队列 void SACM_ S240_Play(int Speech_Index, int Channel, int Ramp_Set) /播放 void SACM_ S240_Stop(void) /停止播放 void SACM_S240_Pause (void) /暂停

163、播放 void SACM_S240_Resume(void) /暂停后恢复 void SACM_S240_Volume(Volume_Index) /音量控制 unsigned int SACM_S240_Status(void) /获取模块状态 Call F_FIQ_Service_ SACM_S240 /中断服务函数 230SACM_MS01 该算法较繁琐,但只要具备音乐理论、配器法和声学知识了解SPCE编曲格式者均可尝试。遵照SPCE编曲格式 用DTMMIDI(音源MIDI键盘作曲软件)的方法演奏自动生成*.mid文件,再用凌阳MIDI2POP.EXE转成*.pop文件。但需要专业设备与

164、软件,具备键盘乐演艺技能,了解SPCE编曲格式。对于初学者或非专业用途一般了解放音或录放音即可。 其相关API函数如下所示: void SACM_MS01_Initial(int Init_Index) /初始化 void SACM_ MS01_ServiceLoop(void) /获取语音资料,填入译码队列 void SACM_ MS01_Play(int Speech_Index, int Channel, int Ramp_Set) /播放 void SACM_ MS01_Stop(void) /停止播放 void SACM_ MS01_Pause (void) /暂停播放 void S

165、ACM_ MS01_Resume(void) /暂停后恢复 void SACM_ MS01_Volume(Volume_Index) /音量控制 unsigned int SACM_ MS01_Status(void) /获取模块状态 void SACM_ MS01_ChannelOn(int Channel) /接通通道 void SACM_ MS01_ChannelOff(int Channel) /关闭通道 void SACM_ MS01_Setlnstrument(Channel,Instrument,Mode) /设置乐曲配器类型 中断服务函数: ASM: F_FIQ_Service

166、_ SACM_MS01 ASM: F_IRQ2_Service_ SACM_MS01 ASM: F_IRQ4_Service_ SACM_MS01 231SACM_DVR SACM-DVR具有录音和放音功能,并采用SACM_A2000的算法,录音时采用16K资料率及8K采样率获取语音资源,经过SACM_A2000压缩后存储在扩展的SRAM 628128A里,录满音后自动开始放音。 其相关API函数如下所示: int SACM_DVR_Initial(int Init_Index) /初始化 void SACM_DVR_ServiceLoop(void) /获取资料,填入译码队列 void SA

167、CM_DVR_Encode(void) /录音 SACM_DVR_StopEncoder(); /停止编码 SACM_DVR_InitEncoder(RceMonitorOn) /初始化编码器 void SACM_DVR_Stop(void) /停止录音 void SACM_DVR_Play(void) /开始播放 unsigned int SACM_DVR _Status(void) /获取SACM_DVR模块的状态 void SACM_DVR _InitDecoder(int Channel) /开始译码 void SACM_DVR _Decode(void) /获取语音资料并译码,中断播

168、放 SACM_DVR_StopDecoder(); /停止解码 unsigned int SACM_DVR _ TestQueue(void) /获取语音队列状态 int SACM_DVR _Fetchqueue(void) /获取录音编码数据 void SACM_DVR_FillQueue(unsigned int encoded-data) /填充资料到语音队列,等待播放 int GetResource(long Address) (Manual) / 从资源文件里获取一个字型语音资料 中断服务函数: Call F_FIQ_Service_ SACM_DVR /playing Call F_IRQ1_Service_ SACM_DVR /recode 232语音压缩方法语音压缩方法 :对于常用的SACM_A2000和SACM_S480两种放音算法要涉及到语音资源的添加问题,即将WAV文件按照我们需要的压缩比进行压缩,变成资源表形式在程序中调用音频压缩编码(SACM)方法的流程: 233

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号