位单片机应用基础v1.0第2章硬件结构_第1页
位单片机应用基础v1.0第2章硬件结构_第2页
位单片机应用基础v1.0第2章硬件结构_第3页
位单片机应用基础v1.0第2章硬件结构_第4页
位单片机应用基础v1.0第2章硬件结构_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章SPCE061A单片机硬件结 ’NSP™的结 ALU算术逻辑运算单 寄存器 数据总线和地址总 SPCE061内器结 堆 闪存 SPCE061A的输入/输出接 I/O端口结 并行I/O端口的控制向量组 B端口的特殊功 时钟电 PLL锁相环(PHASELOCK 系统时 时间基准信 TIMER定时器/计数 睡眠与唤 睡 唤 模拟数字转换器 ADC的控 MIC_IN通道方式 LINE_IN模式的ADC操 DAC方式音频输 低电压监测/低电压复位 低电压监测LVD(LowVoltage 低电压复位LVR(LowVoltage 串行设备输入输出口 通用异步串行接口 设 看门狗计数器 第2章SPCE061ASPCE061A内部集成了ICE(实时仿真/除错器)、FLASH(闪存)、SRAM(静态内存)I/O端口、定时器/计数器、中断控制、CPU时钟锁相环(PLL)、ADC(模拟行输入输出接口)、低电压监测/低电压复位等模块。在本章中详细介绍各个模块的 9 666SHIFTEADDRGE图 ’nSP™的结’nSP™的由总线、ALU算术逻辑运算单元、寄存器组、中断系统及堆栈等部分2.1所示。ALU’nSP™ALU16位算术逻辑运算,还提供了结合算16’nSP™与大多数CPU一样,提供了基本的算术运算与逻辑操作指令,加法、减法、比较、补码、异或、或、与、测试、写入、读出等16位算术逻辑运算及数据传送操作。16ROL及旋转右移ROR。’nSP™shifterALU的前面,也就是说,操作数在经过移位处理简的程序代码,进而增加程序代码密集度(CodeDensity)。在微控制器应用中,如何增加减少ROM或FLASH的需求,以降低系统成本与增加执行效能。16位16位的乘法运算和内积(乘加)除了普通的16位算数逻辑运算指令外,’nSP™还提供了高速的16位16位乘法运算指令MUL,和16位内积运算指令MULS。二者都可以用于有符号数相乘(signedsigned)或无符号数与有符号数相乘(unsignedsigned)的运算。在’nSP™ISA1.1指令集下,MUL指令只需花费12个时钟周期,MULS指令花费10n+6个时钟n为乘加的项数。例如:“MR=[R2]*[R1],44项乘积的和,MULS指令只需花费46(10×4+6=46)个时钟周期。这两条指令大大的提升了’nSP™的数字’nSP™CPU的寄存器组一共有8个16位寄存器,可分为通用寄存器和寄存器两大类别。通用寄存器包括:R1~R4,作为算术逻辑运算的来源及目标寄存器。寄存器包括SP、BP、SR、PC,是与CPU特定用途相关的寄存器。通用寄存器 (General-purpose32MRR4MR的高字符组,R3MR的低字符组,用堆栈指针寄存器 (StackSP是用来堆栈地址的寄存器,SP会指向堆栈的顶端。堆栈是一个先进后出的内存结构,’nSP™的堆栈结构是由高地址往低地址的方向来的。CPU执行push、子程call、以及进入中断服务子程序(ISR,InterruptServiceRoutine)时,会在堆栈里储SPCPU执行pop时、子程序返回retISRreti时,SP会递增以反映堆栈用量的减少。’nSP™堆栈的大小限制2K字的SRAM内,即地址为0x000000~0x0007FF的内存范围中。基址指针寄存器 (Base’nSP™提供了便的寻址方式,即基址寻址方式[BP+IM6];程序设计者可通过Parameter)、返回地址(ReturnAddress)等等。BP除了上述用途外,也可做为通用寄存R5,用于数据运算传送的来源及目标寄存器。因此,在本书或程序中,BPR5是共程序计数器 (Program它的作用与一般微控制器中的PC相同,是用来程序目前执行位置的寄存器,以在’nSP™里,16PCSRCS22位的程序代状态寄存器 (StatusSR2.16位的区段选择字段:CS(CodeSegment),DS(DataSegment)16位的寄存器结合在只占用一页的空间,所以CS和DS字段在SPCE061A中都是设为0。算数逻辑运算的结果会影响CPU内的标志(flag),标志的内容可以作为条件判断的依’nSP™1位的标志N、Z、S、CSR4个位(B6~B9)。C=0时表示运算过程中无进位或是有借位情况产生;而C=1表示运算过程中有进位0~6553565535(0xFFFF)C1。请注意:进位标C一般用于无符号数运算的进、借位判断。负标志N是用来判断运算结果的最(B15)是否为1。B15=0则N=0;S=00,S=1时则表示运算结果(在二进制补码的规则下)16位所能表示的数值范围是0x8000~0x7FFF,即-32768~32767S1。有符号数运算的运算结果可NS不同,则说明了有溢出(overflow)发生,即:S=0,N=1S=1,N=0。符号SJVC(N==S),JVS(N!=S)则可用来判断溢出。请注意:N,S的组合用于有符号数溢出的判断。PC,则所有标志位均不会受到[1].由于补码可以把有符号数与无符号数的运算统一起来,所以对于同一条加法或减法指令,既可以认为是有符号数运算又可以认为是无符号数运算,只是观察的角度、判断的标准不同而已。[2].进位标志C[3].N,S[4].有符号数的范围为-32768~32767,无符号数的范围为0~65535。若为有符号数,运算前数值的正负应利用负标志N来判断;运算后结果的正负应利用符号标志S[例2.1]:R1=32767,R2=32767,求二者之和。运算后R1中的内容为0xFFFE。 //设值后的标志位为N=0,Z=0,S=0,C=1;R1=0x7FFF //设值后的标志位为N=0,Z=0,S=0,C=1;R2=0x7FFF //运算后的标志位为作为无符号数看待,此时:‘C’为0说明无进位产生;若作为有符号数看待,此时:N!=S说明计算结果超出有符号数的范围,即产生溢出,另外‘S’为0说明运算结[2.2]:R1=-12345,R2=-1R10xCFC6 作为无符号数看待,此时:‘C1说明有进位产生;若作为有符号数看待,此时:‘N=S’说明无溢出产生,‘S1说明运算结果为负。[例2.3]:R1=32767,R2=-12345,求二者之差。运算后R1中的内容为0xB038。 //设值后的标志位为N=0,Z=0,S=0,C=1,R1=0x7FFF //设值后的标志位为N=1,Z=0,S=0,C=1,R2=0xC7C7 //运算后的标志位为N=1,Z=0,S=0,C=0,作为无符号数看待,此时:‘C’为0,说明有借位产生;若作为有符号数看待此时‘N!=S’说明有溢出产生;‘S’为0说明运算结果为正。168位的“字节”型;因此内存都是按“字”操作的,22的含义与‘Page’的含义是相等的。因而,通过Segment与Offset22位地2.1中ADDRGEN所示。(SPCE061A32K字闪存FLASH,仅占一页空间,所以CS字段和DS字段在SPCE061A用不到,都设为0)SPCE061A片内器结SPCE061A的内存地址映像如图2.2所示。内的内存有2K字的SRAM(包括堆栈区)和32K字闪存(FLASH)。SPCE061A有2K字的SRAM(包括堆栈区),其地址范围从0x0000到0x07FF。前64个字,即0x0000~0x003F地址范围内,可采用6位地址直接地址寻址方法,存取速2个CPU时钟周期;其余范围内(0x0040~0x07FF)3个CPU时2K2K32KFLASH2.2SPCE061ASP是用来记录堆栈地址的寄存器,SP会指向堆栈的顶端。堆栈是一个先进后出的内存结构,’nSP™的堆栈结构是由高地址往低地址的方向来的。CPU执行push、子程序呼叫call、以及进入中断服务子程序(ISR,InterruptServiceRoutine)时,会寄存器以及从ISR返回reti时,SP会递增以反映堆栈用量的减少。范围中。SPCE061A系统复位后,SP0x07FFpush指令一次,SP指针

图 堆

SPCE061A是一个用闪存替代maskROM的MTP(multi-time-progrble),闪存可以进行多次的擦除与写入,可用来程序与数据。SPCE061A具有32K字(32K×16位)闪存容量,这32K字的内嵌闪存被划分为128个页,每个页容量为256个字。它们在CPU正常运行状态下均可通过程序擦除或写入。全部32K字闪存均可在ICE工作方式下被写入或被擦除。为了安全起见,不对用户开放整体擦除功能。用户必须通过向P_Flash_Ctrl(写)($7555H)单元写入0xAAAA,来启用闪存的存取功能。然后,向P_Flash_Crl(写)($7555H)单元写入0x551,来擦除页的内容。写入0x5533,对闪存写入。这些指令不能被任何其它的操作打断,包括中断、ICE的单步动作。这是因为闪存控制器必须保证闪存处于写入状态。如果其它的操作打乱了这个顺序,闪存的状态将发生改变,擦除页和写入的操作不能再继续进行。在对闪存写入数据前,必须对闪存进行擦除操作。由于闪存采用分页的数组结构,使得各个页可被独立擦除。用户闪存制接口发页擦除令以后只向闪存的写入操作是自动字节写入,既可以循序写入,也可指定地址写入。闪存的地址空间为0x8000—0xFFFF,闪存控制接口的地址为0x7555。第一页范围是擦除一页的流程是:先对命令用户接口地址0x7555送出0xAAAA,然后再对命0x5511约20ms即可完成擦除操作,之后就可以再进行其它操作。例如擦除第6页[0x8500—0x85FF]流程如下:(1)0x7555←0xAAAA (2)0x7555←0x5511(3) 写入一个字的流程是:先对命令用户接口地址0x75550xAAAA,然后再对命令用户接口地址0x7555送出0x5533,再来对要写入字的地址写入数据,约40us即可完成写入操作,之后就可以再进行其它操作。例如向0x8000地址写入0xffff流程如下:(1)0x75550xAAAA(2)0x75550x5533(3)连续写入多个字的流程是:先对命令用户接口地址0x7555送出0xAAAA,然后再对命令用户接口地址0x7555送出0x5544,再给要连续写入字的起始地址写入字数据,约40us即可完成1个字的写入操作。再对命令用户接口地址0x7555送出0x5544,再对后续要写入的字地址写入字数据,等待40us,循环 延时写入一个字延时擦除1图 以上所介绍的闪存擦除及写入操作,一般用于执行中数据的。例如,当我们把一(例如5字K,我们就可以在程序代码后面的空间(5K~32K)一些数据,这样就需要对这一段闪存空(5K~32K进行上述的写入或擦除操作。前提条件是,必须计算出程序代码所占用的空间。[//描述:擦除、写入1.INCLUDE.DEFINE //flash32K.DEFINE //256.DEFINE .DEFINE .DEFINE .DEFINE 名称 //FLASH//传入参数:1、Flash写入地址2.public.DEFINE PUSHBPTO //BPBP=SP+ //BPR1= [P_Flash_Ctrl]=R1= [P_Flash_Ctrl]=R1=[ //FlashR2=[ //[R1]= POPBPFROM[ //传入参数:1、Flash写入起始地址2、欲写入数据的起始地址3.public PUSHBPTO //将BP压入堆栈BP=SP+ //BPR1=[ //FlashR2=[ R3=[ //写NR4= //AAAA[P_Flash_Ctrl]=R4R4= //5544[P_Flash_Ctrl]=R4=[R1++]=R3-=JNZ//0[P_Flash_Ctrl]= POPBPFROM[ //256.public //擦除一页的子程序PUSHBPTO[SP] //将BP压入堆栈内BP=SP+1R1= //AAAA[P_Flash_Ctrl]=R1= //5511[P_Flash_Ctrl]=R1=[ [R1]= POPBPFROM[ SPCE061A的输入/输入/输出接口(也可简称为I/O端口)是单片机与外设交换信息的通道。输入端口I/O口。并行口线路成本较高,但是传输速率也较高;与并行口相比,串行端口的传输速率较低但可以节省大量的线路成本。SPCE061A16I/O口:A口和B口。这两个端口的每一位都可通过编程单独定义成输入或输出口。AIOA0~IOA7作为输入端口时,具有唤醒功能,即当输入电平发生变化时,会触发CPU中断。在电池供电、追求低耗电的应用场合,可以让CPU进入睡眠模式(利用控器、电子字典、PDA、计算器、无线等。IOSPCE061AI/O端口,每一位都可以单独用于数据输入或输出。每个独立的位可通过以下3种控制向量来作设定:3个对应的控制向量组合在一起,形成一个控制字,用来定义相对应I/O端口位的Attribution和Direction的值被设为“010”。与其它的单片机相比,SPCE061A除了每个I/O口可以单独定义其状态外,每个对应状态下的I/O端口性质电路都是内置的,在实际A口为带下拉电阻的输入端口,在连接硬件时不用再外接ABData、AttributionDirection的设定值均在不同的寄存器里,用户在进行I/O端口设置时要特别注意这一点。I/O端口的组合控制设置如表2.1所示:表2.1I/O000001010011否100否(当向数据位写入“0”101否110否111否**IOA[7~0]000,001010***:ADCIOA[6~0]P_IOA/B_Data读和P_IOA/B_AttribP_IOA/B_Buffer写P_IOA/B_Data写图 I/O结AAA口处于输出状态时,写入输出数据到A端口的数据寄存器。AA口对输出而言,P_IOA_DataP_IOA_Buffer是一样的.但对输入而言,P_IOA_Data读而言,LEDIOA[0]P_IOA_Data0,P_IOA_Buffer则为1。读回的意义是是方便做其它的IO运算。可以写入或从该寄存器内读出方向控制向量。Dir位决定了端口位的输入/输出方向:并行I/O方向向量_Dir、属性向量_Attrib和数据向量_Data分别代表三个控制口。这三个端口_aa_Arb字节合在一起形成输入方式的控制字‘00’、‘011011’,以决定输入端口是带唤醒功能的上拉电阻式、下拉电阻式或悬浮式以及不带唤醒功能的悬浮式输入。Daa写入的是输出数据,不过,数据是经过反相器输出还是经过同相寄存器输出要由ArbB0组合应设为‘000A口的B1定义成具有唤醒功能的悬浮式输,只需将_Dir、_Attrib和_Data向量对应的B1组合设置为‘010’即可。AIOA0~IOA7IOA0~IOA7的唤醒功系统才可通过指令进入低功耗的睡眠状态。当有按键按下时,IOA0~IOA7的输入状态会[2.5]:IO为带数据寄存器的高电平输出口,IOA[15~12]为带数据寄存器的低电平输出口。R1=0x0FF0; //A端口的数据向量,IOA0~IOA3IOA12~IOA15置[P_IOA_Data]= //IOA4~IOA7IOA8~IOA11R1=0xFF00; //设置A端口的属性向量,IOA0~IOA8置低,IOA12~IOA15[P_IOA_Attrib]=R1; R1=0xFF00; //设置A端口的属性向量,IOA0~IOA8置低,IOA12~IOA15[P_IOA_Dir]=R1; 各端口位对应的向量设置如下表表 I/O端口位对应的向量设111111110000000011111111000000000OOO111111110000从上面的分析我们可以看出,当作为输时所读到的数值来自不同的地方,由些I/O口的应用,这种读写方式可以省下许多存放端口数据的RAM空间。[例2.6]:程序说明:在单步程序期间将A端口的任意引脚接VDD,通过观察寄存器表中的R2,R3的值可观察到二者的不同。 .PUBLIC //A //设置A端口的数据向量 //设置A端口的属性向量 //设置A口的方向向量//*****************此时将A口的任意一口接高电平*********************// //把P_IOA_Data中的值送到寄存器R3 //把P_IOA_Buffer中的值送到寄存器JMP [ .PUBLIC //B //3[P_IOB_ //***********************此时检测B口的电平为高***********************// //回读Buffer的值为0x0000 P_IOA_DataP_IOA_BufferIO口从端口数据的两种方式:从P_IOA_Data数据相当于端口引脚的信号。然而,从P_IOA_Buffer数据相当于从数据寄存器中数据。R1= R1=[P_IOA_Data] //从A端口引脚数据写入IO口R1=[P_IOA_Data]=R1; //写数据到P_IOA_Data[P_IOA_Buffer]=R1; //写数据到P_IOA_Buffer2.6PortA,PorP_IO_Data(读

悬浮输入Pure

ReadP_IOA_Latch读

Wake-up(IOA0-7OnReadP_IO_Data(读)

00WriteP_IO_Data00ReadP_IO_Buffer(读WriteP_IO_Data(写

SPCE061Typical233KOhms@DC2.180KOhms@DC3.

ReadP_IO_Buffer(读)ReadP_IO_Data(读ReadP_IOA_Latch读

Wake-up(IOA0-7

SPCE061Typical325KOhms@DC2242KOhms@DC3PortA,PortB

VSVS输出缓冲读P_IO_Data读

输出

读P_IO_Data读输出

低电 高电读P_IO_Data读

输出反向低电平

读P_IO_Data读图2.6

输出反向高电平

BB口写入或从BB口处于输入状态时,读出是读B口引脚电平状态;写入是将数据写入B端口的数据寄存器。当B口处于输出状态时,写入输出数据到B端口的数据寄存器。B端口的数据向量单元,用于向数据寄存器写入或从该寄存器内读出数据。当B口BB端口数据寄存器里读其数值。当B口处于输出状态时,写入数据到B端口的数据寄存器。[2.8]A8位为带下拉电阻的输入端口,作为按键输入;B8位Key1B0口灯 R1= //R1[P_IOA_Dir //A[P_IOA_Attrib] //AR1=[P_IOA_Data]= //AR2= //R2[P_IOB_Dir]= //B[P_IOB_Attrib]= //B[P_IOB_Data]= //B 假设已经取到键值,判断键值并输出显示R1=[ //R1CMP //0JECMPR1 //CMPR1 //CMPR1 // //IOB7JMP //IOB0JMP_MAIN //是第二键按下,IOB1 //IOB1JMP_MAIN //IOB6JMP_MAIN表2.3A000000000000000011111111表2.4B1111111111111111111111112.72.7B正如前面提到的,B口除了具有常规的输入/输出端口功能外,还有一些特殊的功能,如下表2.5所示:表2.5BSIO参见串行接口SIO串行接口SIO参见串行接口SIOIOB4组成一个RC反馈电路,以获得振荡信号,作为外部中断源EXT1设置IOB2为反相输出方式,见图2.8所示的框图及P_FeedBack写)(7009H单元的IOB5组成一个RC反馈电路,以获设置IOB3为反相输出方式,见图2.8所示的框图及PFeedBack写)(7009H单元的2.82.8参见UARTAO参见定时器/PFeedback(写)(7009H)BO参见定时器/UART参见UART:脉宽调制(PulseWidthB端口工作方式的控制单元,用于决定BIOB2(IOB3)IOB4(IOB5)是用来作IOB3口可设置为外部中断的输。(2).设置P_FeedBack单元,再将IOB2(IOB3)和IOB4(IOB5)之间连接一个电阻和电容(电路连接如图2.8)形成反馈电路以产生振荡信EXT1EXT2RC振此特殊功能仅运用于:当外部电路需要用到一定频率的振荡信号时,可以在IOB2(IOB3)端获得。P_FeedBack的设置的如表2.6所示。表2.6P_FeedBackB15–1IOB3IOB5之间0:IOB3、IOB5I/O口(预设1IOB2IOB4之0:IOB2、IOB4I/O口(预设((IOB5)之间增加一个RCRC图 [2.9]IOB2IOB4RC电路形成反馈//将IOB4设置成悬浮式输,IOB2设置成反相输出//P_FeedBackIOB2,IOB4IOB8IOB10IOB8IOB10TAONTXPinEn00I/OI/O01I/OTx10 OI/O11 OTx O的启用信号(详细内容请参见定时器/计数器部分 O:TimerA脉宽调制的输出信号(详细内容请参见定时器/计数器部分[例2.10]:图2.9为AO信号输出波TaTaA图 O信号时序 //IOB8[P_IOB_Attrib]=R1;//设置TimerA的 O信号的周期 o=(12.288MHz/512)/16=1.5KHz,//置信号的占空比 //Tduty=(3/16)*Ta o。详细内容请参见定时器/计数器部分 //TimerA32768Hz32768Hz晶振,因RC阻容振荡的电路时钟不如外 图 SPCE061A与振荡器的连32768Hz实时时钟通常用于钟表、实时时钟延时以及其它与时间相关类产品。IRQ5_2Hz0.5秒被唤醒一次,由此可作为精确的计时基除此之外,SPCE061A还支持RTC振荡器强振模式/自动模式的转换(参考系统时钟PLL锁相环(PhaseLockPLL锁相环的作用是将系统提供的实时时钟基频(32768Hz49.152MHz、40.96MHz、32.768MHz、24.576MHz20.480MHzPLL锁相环b7b6

b2b1图 PLL锁相环电路32768HzPLLFosc,Fosc再经Fosc、CPUCLK24.576MHzFosc/8P_SystemClock单元编程完成对系统时钟和CPU时钟频率的定义。此外,32768HzRTC振荡器有两种工作方式:强振模式和自动弱振模式。处于强振)唤醒后预设的时钟频率为Fosc/8,用户可以根据需要调整该值。SPCE061A内,P_SystemClock(写)(7013H)单元(2.7所示)控制着系统时钟的频率(2.9所示)。此外,在睡眠状态下,通过设置该单元的第4位可以开打或关闭32768Hz实时时钟。表2.7P_SystemClockb15-PLL32768Hz32768HzCPU11:32768Hz时钟仍处于工作状态(预设式00:32768Hz表2.8CPU时钟频率(CPUCLK)000001010011100101110111表 PLL频率(Fosc)选0000010100111--[1]只有当b0~b2同时被设为“1”时(即睡眠状态)b4[2上电复位或系统从备用状态(睡眠状态)被唤醒后,预设的CPU时钟频率为Fosc/8[2.11]1ms32768HzPLL倍频电路之后,会产生多个Fosc供选择,在同一个Fosc下又可选择不同的CPUCLK。这就给我们设计延时程序时提供了更大的选择空间,同时也要求我们在编写延时子程序之前必须先选定相对应的Fosc与CPUCLK。 //Fosc20MHzCPUCLKFosc/8 //R3的初值为0 //CMPR2,21 CMP //101 TMB1TimerAB提供了各种频率选择信号,并为中断系统提供中断源(IRQ6)信号。此外,时基信号产生器还可以通过分频产生2Hz、4Hz、1024Hz、2048Hz以及4096Hz的时基信号,为中断系统提供各种实时中断源(IRQ4和IRQ5)信号。时基信号产生器的结构如图2.12所示。 6432Hz16Hz84096Hz2048Hz1024 4 2Fosc/P_Timebase_Setup(写)(700EH)单元(2.10所示)的编程表2.10P_Timebase_Setupb15-TMB2TMB1表2.11Timebase0000010110101111*TMB2**TMB1[2.12]8HzIOB口输出高电平。通过示波器可观察.INCLUDE .PUBLIC INT //B //设置方向向量 // //选择中断频率为8Hz INT JMP .PUBLIC

//IRQ_TMB2TESTR1,JNZ //是,进入该中断;否,进入PUSHR1,R4TO[SP] //BPOPR1,R4FROM[ //中断子程序IRQ_TMB2PUSHR1,R4TO[SP] POPR1,R4FROM[ //*******上述的例子和中断有关的部分参照第5章中断内容Timer定时器/SPCE061A16位的计时/计数器:TimerATimerB。TimerA为通用计数器;TimerB为多功能计数器。TimerA的时由时A和时B进行“与”操作而形成;TimerB的时仅为时C。定时器发生溢出后,会产生一个溢出信号信号还可以用于触发ADC输入的自动转换过程,和DAC输出的数据锁存。0110111b2b1b2b1P_TimerA_Ctrl(写)($700BH

P_TimerA_Data(读)($700AHA A16位定时器/

1

011

P_TimerA_Data(写)($700AH b5b4b5b4

FTAOUTP_TimerA_Ctrl(写)($700BHP_TimerA_Ctrl(写)($700BH

b9b9b8b7图 TimerA结理。同时,计数值N值将被重新加载计时/计数器并重新开始计数。从图2.13的结构我们可以看出,时A是一个高频时钟来源,时B是一个低频时钟来源。时A和时 TimerA的时钟来源A为“1”,则TimerA时钟频率将取决于时钟来源B;如果TimerA的时钟来源A为“0”,则停止TimerA的计数。EXT1和EXT2为外部时钟来源。另外, 脉宽调制的计数器,用来输出4位的脉宽调制信号:AO或B O(分别从IOB8和IOB9输出),可用来控制马达或其它图2.9是一个占空比为3/16的脉宽调制输出信号的时序。通过写入理,写入P_TimerB_Ctrl(700DH)单元的第6~9位,便可选择设置BO输出波形的脉时A与时C是高频时钟来源,来自PLL锁相环的晶体振荡器输出Fosc;时B的频率来自32768Hz实时时钟系统,也就是说,时B可以作为精确的定时器。例如,2Hz可以作为实时计数器。TimerA16位预设寄存器写入数据(预设计数初值)或从其中生溢出。.溢出后P_TimerA_Data中的值将会被复位,再以设置的值继续加一计数。读到 溢出,则需要计数1024次,1024转换为16进制数为400,再将计数次数转换为10进位数代入下面的:24.576106/2/10进位数值计数溢出频率计数溢出频率为8KHz的计数次数Y如下:24.576106/2/Y=8000TimerA的控制单元如表2.12所示。用户可以通过设置该单元的第0~5位来选择TimerA的时(时A、B)。设置该单元的第6~9位(如表2.13所示),TimerA将输出不同频率的脉宽调制信号,即对脉宽占空比输出AO进行控制。表2.12P_TimerA_Ctrlb15–占空比的设置(表时B选择位(表时A选择位(表表2.13时A选择位时A的频0000010100111001011110111表2.14时B选择位时B的频000001010011100101110111*代表默认值为1。若以ClkA作为门控信号,‘1’表示允许时B信号通过,而‘0’则表示禁止时B信号通过,而停止TimerA的计数。如果时钟来源A为‘1’,TimerA时钟频率将取决于时钟来源B;如果时钟来源A为‘0’,将停止TimerA的计数。表2.15B6- 00000000110010100111010010101101101011111000110011101011011111001110111110111111:TAON是TimerA(AO)的脉宽调制信号输出启用位,默认值为“0”,当TimerA的第位不全为零时:T是mrA的溢出信号,当ierA的计数从N达到0xF后(用户通过设置_mr_ta写700单元指定值),发生计数溢出。产生的溢出信号可以作为imr的中断信号被送至中断控制系统;同时值将被重新加载预设寄存器,使定时器重新开始计数。触发信号(2)的占空比为5%,频率为AU/2,其它输入信号的频率为AU/16。请参考eierB的数据单元,用于向16位预设寄存器写入数据(预设计数初值)或从其中数据。写入数据后,计数器就会以设定的数值往上累加直至溢出。计数初值的计算方法和ierA相同。TimerB的控制单元(如表2.16所示0~2位来选择TimerB的时。设置第6~9位,TimerB将输出不同频率的脉宽调制信号,即对脉宽占空比输出BO进行控制。1

(011100A011100A时b2b1

TimerB_TimeoutINT

b9b8b9b8b7

2.14TimerB表2.16P_TimerB_Ctrlb15-时C选择位(表0000000011001010011101001010110110101111100011001110101101111100111011111011111TBOUT[2]1:TBON是TimerB(BO):T是mrB的溢出信号,当mrB的计数从N达到0xF后(用户通过设置_mr_ta(写)(00)单元指定N值),发生计数溢出。产生的溢出信号可以作为mer的中断信号被送至中断控制系统;同时值将被重新加载预设寄存器,使定时器重新开始计数。触发信号(2)的占空比为5,频率为BO/2,其它输入信号。表2.17时C选择位时C的频0000010100111001011110111[2.15]TimerA2IOB口输出相对应的高或低电平,.PUBLIC//B//3INTOFF //TimerA //TimerA //2 //R2的初值为0 TEST R2^=0xFFFF JMP IC在上电复位后就开始工作,直到接收到睡眠信号,才关闭系统时钟(PLL振荡器),(CPU睡眠信号)使系统从运行状态转入备用状态。系统进入睡眠状态后,程序计数器(PC)超过这个频率的话,CPU将无法进入睡眠模式。[2.16]:说明如何编程实现系统从工作状态进入睡眠状态,然后由触键引起唤醒。在进IOA[7~0]IRQ3_KEY中断来实现触键 //A //3//中断设置(启用IRQ3_KEY触键中断,关于其它的中断设置,请参考第五章中断部分)INTOFF; INT //读P_IOA_Latch单元,以锁存IOA[0~7]的数据,用于触键唤醒 //锁存A端口低8位的数据// //IRQ3子程序(AIRQ3中断服务子程序.PUBLICR1= //L_IRQ3_Ext1TESTJNZL_IRQ3_Ext1; R1=0x0200;TEST //L_IRQ3_Ext2JNZL_IRQ3_Ext2; R1= //IRQ3[P_INT_Clear]=:[P_INT_Clear]= //IRQ3_EXT2[P_INT_Clear]= //IRQ3_EXT1ADCSPCE061A810位ADC通道,其中一个通道(MIC_In)用于语音输入,模拟信号经过自动增益控制器和放大器放大后进行A/D7个通道(Line_In)和IOA[0~6]引脚共享,可以将输入的模拟信号(如电压信号)转换为数字信号。SPCE061A的A/D转换范围是整个输入范围,即0V~AVdd。无效的A/D模拟信号(超过VDD+0.3V或是低于ADC的最大输入电压由P_ADC_Ctrl(写)($7015H)787位VEXTREF决定了ADC的参考电压为AVdd8位V2VREFB2V的最高参考电压设置为2V。如果用户指定的参考电压源的值不超过AVdd,它还可以被当在ADC内,由DAC0和逐次近寄存器SAR(SuccessiveApproximationRegister)组成逐次近式模拟数字转换器(SARADC)。向P_ADC_Ctrl(写)($7015H)单元第0位(ADE)写入“1”,可以启用ADC。系统的默认值为ADE=0(关闭ADC)。当ADE=1时,应对P_ADC_Ctrl(写)($7015H)P_ADC_MUX_Ctrl(写)($702BH)的其它控制位进行合理的设置。P_ADC_MUX_Ctrl(写)($702BH)0~2A/D转换选择输入通道。通道包括MIC_InLine_InMIC_InLine_In通道都处于ADMIC_In通道处于定时器锁存状态时,它可以优先ADCP_ADC_MUX_Ctrl读$702BH)FailB位得知,Line_InADC是否被MIC_InADC打断。用户可通过P_ADC(读)($7014H)MIC_In通道输入的模拟信号转换结果。用户可通过P_ADC_LINEIN_Data(读)($702CH)Line_In通选择MIC_InP_DAC_Ctrl(写)($702AH)34A/D转换的触发。当P_ADC(读)($7014H)单元的数据被/TimerA/TimerB发生后,可执行A/D转换。然而,在选择Line_In通道后,只有在读取P_ADC_LINEIN_Data(读)($702CH)单元的内容后,才执行A/D转换,且不能使用定时器进入睡眠状态后,DC被关闭(包括AC和VMIC)。注意,供电复位后不论D是否VMIC信号都预设为ONVMIC用于向外部的VMIC=AVDDVMIC的状态和ADVMIC时,用户必须把_D_r(写$701H)单元的第1位M_N1VMIC。硬件ADC的最高速率限定为(Fosc/32/16)Hz,如果速率超过此值,当从P_ADC_Ctrl(写)($7015H)5DAC_OUTDAC的2mA3mA。DAC_OUTDAC输表2.18ADC 器)($7014H)( -图 ADC输入接口的结在ADC自动方式被启用后,会产生出一个启动信号,即RDY=0。此时,DAC0的输出电压与外部输入电压进行比较,以尽快找出外部电压的数字值。逐次近式控制首先将控制又将下一位试设为‘1’,其余低位依旧设为‘0’,即1100000000B,VDAC0与Vin次近的过程一直会延续到10位中的所有位都被测试之后,A/D转换的结果便会保存在当10位A/D转换完成时,RDY会被设‘1’。此时,用户通过P_ADC(7014H)后,又会使RDY自动清为‘0’来重新开始进行A/D转换。若未P_ADC(7014H)或P_ADC_MUX_Data(702CH)单元中的数据,RDY仍会保持为‘1’,并且不会启动下一次A/D转换。外部信号由LIN_IN[1~7]IOA[0~6]或通道MIC_IN输入。从LIN_IN[1~7]AGC可以控制MIC_In输入信号的值在一定的范围内。由一个10位DAC(DAC0)、一个10位寄存器DAR0、一个逐次近寄存器SAR和一个比较器COMP组成。表2.19P_ADCb15–b5–P_ADC(读):读出本单元实际为A/D转换输出的10位数值。如果P_DAC_Ctrl(702AH)单元第3、4位被设为‘00’,那么在转换过程里读出本单元(7014H)亦会触发A/D转换重新开始。P_ADC_Ctrl单元(如2.20所示)ADC表 P_ADC_Ctrl单010110位模拟数字转换完成,输出-0打开2V电压输出,其可作外部AD-1关闭2V电压输出(预设--0AD--1VEXTREF-0--DAC电流=3mA@VDD=3V(预设-1--DAC电流=2mA0-取消AGC自动增益控制(预设1-0MIC模式被使能,Vmic=1MIC01b15MIC_IN当模拟信号经由麦克风的MIC_IN通道输入时,可选择AGCE为‘1’,即放大器的增益可在其线性区域内自动调整。AGCE默认值为‘0’,即取消自动增益控制功能。b5=1,b4=1,b3=1表 P_ADC_MUX_Ctrl单b13--010110-010位模拟数字转换失败(预设-110--000模拟电压信号经由MIC_IN--001模拟电压信号经由LINE_IN1--010LINEIN2--011模拟电压信号经由LINE_IN3--100模拟电压信号经由LINE_IN4--101模拟电压信号经由LINE_IN5--110LINEIN6--111模拟电压信号经由LINE_IN7 RDYADCLINE_INIOA[0~6]LININLININLININLININLININLININLININP_ADC_MUX_DataLINE_IN[7:1]10ADC[例2.17]:经由模拟量输入端口LINE_IN输入电压值,通过单元以获得10位的A/D转换数据。而从该单元数据后,又会使RDY自动清为来重新进行A/D转换。若未P_ADC_MUX_Data单元中的数据,RDY仍会保持'1'A/D P_ADC_MUX_DATA .PUBLIC //r1 //IOB端口设设为带数据寄存器的低电平输出口

//LINE_INR1= //P_ADC_CtrlA/D[P_ADC_Ctrl]= R2=[P_ADC_MUX_Ctrl]//读寄存器[P_ADC_MUX_Ctrl]B15TEST R1=[P_ADC_MUX_DATA]是,则读出[P_ADC_MUX_DATA]//同时触发A/D重新转换 //IOB口输出转换结果 //跳跃到_AD处[2.18]TimerAADCA/D输入的语音信号转换为数字信号,再经由D/A的两个通道AUD1和AUD2.DEFINETIMER_DATA_FOR_8KHZ(0xffff-//Fosc/2 //ADINTR1=0x0030; //CLKAFosc/2[P_TimerA_Ctrl]=R1;R1=TIMER_DATA_FOR_8KHZ;//数据采样率为8kHz[P_TimerA_Data]= //设置TimerA初R1= //AGC[P_ADC_Ctrl]= //MIC_INR1=//TimerA//ADCTimerAADC[P_DAC_Ctrl]=R1;R1=0x1000;[P_INT_Ctrl]= //IRQ1_TMINT .PUBLIC CALL //AD JMP.PUBLIC PUSHR1TO R1= //A/D转换的数[P_DAC1]= //DAC[P_DAC2]=R1R1=0x1000[P_INT_Clear]= POPR1FROM MIC_INADCMIC_In通道方式的ADC,其最大参考电压可达AVdd,即来自MIC_In通道的模拟信0V到AVdd。信号从MIC_In引脚输入,经过寄存器后被放大。放大器的增2AGCE设为‘1AGC3、4位用于设定MIC_InADC触发方式(Timer锁存或直接模式)。P_ADC_MUX_Ctrl(读/写)($702BH)0~2位为‘0’时,模拟电压信号经由MIC_In通道输入。次则,该位会被清为‘010次,直到这些位都被比较过。转换结果将会保存在SAR内。A/D转换完成之后,P_ADC_Ctrl(读)($7015H)的第15位RDY被置为”1”。次定时器可由TimerA或TimerB触发。从P_ADC(R)($7014H)数据后,不论处于直接状态还是定时器状态,P_ADC_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)15RDY的作用相同。然后通过P_DAC_Ctrl($702AH)单元的第15位,循环查询ADC的状态。完成A/D转换之后,程序再一次P_ADC(读)($7014H)单元的内容来得到转换结果。MIC_InMIC_InOP放大器(2.15)AGC后,第一级放大器的增益为15V/V。第二级放大器(OPAMP2)的增益为60K/(1K+Rext),可以通过外接电阻Rext来调整增益的大小,RextOPAMP2Rext=5.1K(ohm),OPAMP2的增益=60K/(1K+5.1K)=9.8(19.8dB),MIC放大器的总增益=OPAMP1×OPAMP2=159.8=147(43.3dB)。AGC被启用之后(P_ADC_Ctrl(W)($7015H)的b2=1),能自动调整增益的值,以防止信号饱和。当OPAMP2的输出>0.9AVdd时,AGC自动降低OPAMP1的增益,以防止被放LINE_INADC所以,IOA[6:0]最好被设置成悬浮的输入端口,用于Line_In通道输入。ADC通过设置P_ADC_Ctrl(写)($7015H)7位VEXTREF,可以决定Line_In通道输入的最大电压值。VEXTREF=0时,最大电压可达AVDD,即来自Line_In通道的模拟信号电压范围从0V到AVdd。VEXTREF=1时,VEXTREF引脚被启用,这时,必须输入外部电压到该引脚,作为Line_In通道的最大电压。VEXTREF0V到AVdd。所以,Line_In通道的输入电压范围从0V到VEXTREF,VEXTREF的值越低,Line_In通2V(通过设置P_ADC_Ctrl(写)($7015H)8位V2VREFB=0来启用),它可P_ADC_MUX_Ctrl读$702BH)P_ADC_Ctrl(读)($7015H)单元的/写)($702BH)0~2RDY1ADC)(MIC_InA/DP_DAC_Ctrl(写)($702AH)单元的第3和4位来切换。而Line_In通道的A/D转换只能通过读取P_ADC_LINEIN_Data(读)($702CH)MIC_In通道处于定时器锁存状态时,MIC_In通道的优先级高于Line_InMIC_InLine_In通道的A/D转换时,Line_In通道的A/D转换会被MIC_In通道的A/D需求打断。为保证从P_ADC_LINEIN_Data(读)($702CH)单元到正确的数据,用户必须通过P_ADC_MUX_Ctrl(读/写$702BH)14FailBA/D是否成功或是被查看P_ADC_MUX_Ctrl(读/写)($702BH)单元的值是非常必要的。10- $702BH$702BH图 ADC简被清除为”0”。当RDY变为1时,表示ADC完成工作,如果P_ADC_MUX_Ctrl(读/)($702BH单元的第14位FailB的值为1,表示转换成功,用户可以从P_ADC_LINEIN_Data(读)($702CH)得到转换结果。注意,读取P_ADC_LINEIN_Data(读)($702CH)10- $702BH$702BH图 ADC简0A/D效果,可以参考图2.16图,调整麦克风带通滤波器的带宽。DACSPCE061A为音频输出提供两个DAC通道:DAC1和DAC2,分别由经由DAC1DAC2引脚输出。DAC的输出范围从0x00000xFFFFDAC的输出数据被处理成PCM数据,必须让DAC输出数据的直流电位保持为0x8000,且仅有高10位的数据有作用。DAC1和DAC2的输出数据应写入P_DAC1(写)($7017)和P_DAC2(写)以如不需要用它们,尽量将P_DAC_Ctrl(写)($702AH)单元的第1位设为‘1’,关闭DAC输出。采用rampup/down技术,可以减缓电压变化的幅度,从而输出高品质的音频数据。它的应用场合包括:被唤醒/DAC时,上电复位功能被关闭/进入睡眠状态B15–b5–DA2Data(读/写b15–b5–DA1Data(读/写DAC音频输出方式的控制单元(如2.22所示)5~8DAC的3、4A/D1位为‘0DAC音频输出。b9~b15为保留位。2.22P_DAC_Ctrlb3~b8的控制功能。表 P_DAC_Ctrl单00:直接将DAR1DAC1内(默认值01TimerA溢出将DAR1内的数据锁存到DAC1内10TimerB溢出将DAR1内的数据锁存到DAC1内11TimerATimerBDAR1内的数据锁存到内00:直接将DAR2DAC2内(默认值01TimerADAR2内的数据锁存到DAC2内10TimerB溢出将DAR2内的数据锁存到DAC2内11TimerATimerBDAR2内的数据锁存到内00ADC读)(7014H)触发01TimerA溢出触发A/D换10TimerBA/D转11TimerATimerB的溢出触发A/D转换P_DAC_Ctrl(写($702AH)7、8直接将DAR1内的 P_DAC_Ctrl(写)($702AH

b5b6:P_DAC1(P_DAC1(P_DAC2(读/写)($7016H)1010据锁存到DAC2INT(Fosc/24)

2.172.11.1.2DAC时,DAC的最大输出电流范围是2.7mA~3.3mA。Ohm=2.6V867Ohm,输出电压值的变化不一定根据电阻的值成正比。表 AVddvs.DAC输出电流Min.DACTypicalMax.DAC[2.19]DAC输出端接AUD1AUD2。//Date:.PUBLICINT //DAC输出的数据锁存方式,A/D //D/A10B15~B6 CALL //1JMP JNZ //R20 低电压监测/低电压复位SPCE061A可通过编程来启用低电压监测和低电压复位功能,可对系统的电源电压进行,使系统能运行在一个正常、可靠的工作环境,一旦出现电源异常的情况,能立即LVD(LowVoltage低电压监测功能可以提供系统内电源电压的使用情况。如果系统电压Vcc低于用户设定VLVD,P_LVD_Ctrl15位(LVD监测标志位)将被置为“1”;反之,当Vcc>VLVD时,该位被置为“0”。SPCE061A3级可编程低限电压:2.4V、2.8V3.2V,通过对P_LVD_Ctrl单元编程来进行控制,参见图2.18。假定VLVD=3.2V,当系统电压Vcc低于3.2V时,P_LVD_Ctrl单元的第15位会被置为“1”。系统预设的低限电压为2.4V。

2.18低电压监测(LVD)/低电压复位b14---0:VDD>1:VDD<低限电压002.4V*预设0110LVR(LowVoltage通过某种方式,使单片机内存各寄存器的值变为初始的操作称为复位(reset)。SPCE061A2.19RESB端加上一个低电平就可令其复位。该电路图 复位电2.2V时,系统会变得不稳定且容易出错。导致电源电压过低的原因时钟周期之后产生一个复位信号,使系统复位。LVR时序如图2.20所示。TTTTw=Fosc4TVDD>TTRESETFosc 图 复位示意串行输出入端口SIO1位的串行接口,用于与其它设备进行数据通讯。在SPCE061A内通过IOB0和IOB12个口来实现与设备进行串行交换数据的功能。其中,要启用串行输出入,除了要设定好P_SIO_Ctrl(701EH)(读/写)单元,还得通过P_IOB_Dir(7007H),P_IOB_Attrib(7008H),P_IOB_Data(7005H)这三个IOB向量,将SIOCPUCLK/4CPUCLK/16。SPCE061ASIO速率最快可达12288KHz。SIO可根据外设的差别来选择不同的寻址模式,有8/16/24位三种寻P_SIO_Start(701FH)单元,来启动数据交换的过程。串行传输的起始地址是由P_SIO_Addr_Low、P_SIO_Addr_Mid和P_SIO_Addr_High这3个进行写入操作时,必须先向P_SIO_Start(写)单元写入任一数值,以启动数据传输,再来将要传送的八位数据写入P_SIO_Data(写)(701AH)。这时SIO会开始向串行外设传送起始地址,接着传送P_SIO_Data单元中的8位数据。再来须连续检查P_SIO_Start(读)的内容,以得知目前传送的状态,当传送完成时,就可以再次对P_SIO_Data(写)写入下一个八位数据。最后对_SIO_Stop(写)(7020H)写入数据,结束这一次传输。进行操作时,必须先向P_SIO_Start(写)单元写入任一数值,以启动数据传输,再来就可以从P_SIO_Data(读)(701AH)单元传送过来的数据。这时SIO会开始向串行外设传送起始地址,接着接收串行外设传回的8位数据。再来须连续检查(0、1位,可以指定串行设备的寻址表 P_SIO_Ctrl单—XXXXX—00XXXXX—01XXXXX—108位寻址模式XXXXX—1124位寻址模式XXX00—XX数据传输速率设为CPUClk/16(默认值XXX01—XX数据传输速率设为XXX10—XX数据传输速率设为XXX11—XX数据传输速率设为1XXXX—XX设置IOB0=SCK(串行接口时钟端口),IOB1=SDA串行接口数据端口)。用户不IOB0IOB10XXXX—XXI/O口(预设X1XXX—XXSIOX0XXX—XX设置SIO为模式(预设XX1XX—XX不加入控制位controlXX0XX—XX加入控制位(预设关于CPU时钟CPU_CLK该单元为收发串行数据的缓冲单元。向该单元写入或读出数据,就可使串行端口表 串行设备起始地址的低字节(默认值为00H)表 P_SIO_串行设备起始地址的中字节(默认值为00H)表 P_SIO_Addr_串行设备起始地址的高字节(默认值为00H)表 P_SIO_Start(写)(701FH)单元写入任一数值,就可以启动数据传输。接着对P_SIO_Data(701AH)单元进行的读写操作,会使得SIO根据P_SIO_Addr_Low、SIO将不再传送此起始地址。如果需要传输数据到另一个地址,就必须重新指定起始地址。用户必须先向P_SIO_Stop(7020H)单元写入任一数值,以停止SIO操作,然后向P_SIO_Addr_Low、P_SIO_Addr_MidP_SIO_Addr_HighP_SIO_Start(写)(701FH)单元写入任一数值以重新启动SIO操作。P_SIO_Start(701FH)SIO7Busy占表 P_SIO_Stop(写)(7020H)单元写入任一数值,可以停止数据传输。通常停止数据传图 [例2.20]SPRS512C是512KbitSRAM内存,带有SIO接口。通过SIO接口将图 SPCE061A与SPRS512C的连接SIOSPRS512C1个字节的数据。SPRS512C16位的地址线,工作频率为CPUCLK/4。注意要先把SIO设置为输出口。 //设置串行SIO控制口(输出状态) //B0,B1口为SCK,SDA引脚,16位寻址模式 //写入串行SIO启动口 //Addr15~Addr8=00000000 //Addr7~Addr0=0000 //向缓冲单元写入传送数据,d7~d0=00010001 //检查占用标志BusyTESTR1,[P_SIO_Start]; JNZ //向P_SIO_Stop(写)(701FH)//SIOUART模块提供了一个全双工标准接口,用于SPCE061A与外设之间的串行通讯。IOBUARTIRQUART接口的接收与发送过程。此外,UART还可以通过缓冲来接收数据。也就是说,它可以在寄存器数据被据还未被读走,就会发生数据遗失。P_UART_Data7023H读/写)单元可以用于接收和发使用UART模块进行通讯时必须事先将Rx(IOB7)引脚设置为输入状

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论