摘要:以S3C825A为例介绍三星公司SAM8系列单片机的内部结构及其软件开发环境,详细描述选用混合修正法来对SAM8系列单片机进行软件规划的一般计划,最终给出用混合编程法对S3C825A进行软件规划的详细运用实例。 关键词:SAM8系列单片机;OPENice i500;IAR C编译器;混合编程 导言 三星SAM8系列单片机是8位CMOS型微操控器,该系列单片机具有功耗超低、多样类型、资源丰富、CPU时钟可调及软件对硬件操控灵敏等长处,其间,S3C825A型是现在运用较为广泛的单片机。S3C825A与三星SAM8系列其他单片机相同,其常用的开发环境是IAR公司的IAR Embedded Workbench集成开发资源,该环境支撑混合编程,能够修正、汇编和编译汇编言语和C言语的源文件,并且汇编程序与C程序能够一起相同格局的头文件,使得开发进程灵敏便利,是一种高效的软件规划办法,具有广泛的运用远景。 1 S3C825A型单片机的内部结构 S3C825A的内部结构框图如图1所示。从图1能够该单片机具有以下特色: ●运用SAM88RC作为中央处理单元; ●具有48KB片内ROM和2096byte的寄存器空间; ●带有多达67个可编程I/O接口; ●具有2个8位的守时/计数器和2个16位守时/计数器; ●带有LCD驱动操控器; ●带有一个4输入的10bit A/D转化器; ●带有主从两个晶振接口。 1.1 存储空间分配 S3C825A型微操控器有2类存储空间,48KB内部掩膜可编程存储空间(ROM)和2096byte的内部寄存器空间。其间可编程存储空间首要用来存储程序代码和列表数据,它的开端256Byte(00H0FFH)用来存储中止矢量列表,未运用的空间也可用作代码存储空间,但中止矢量有必要放在这段空间中。对S3C825A而言,当程序履行RESET后,ROM的开端地址是0100H。
S3C825A共有2137个8位可编址寄存器,其间13byte用作CPU和体系操控寄存器,60byte用作接口操控和数据寄存器,16byte用作同享的作业寄存器,其他的2048byte用作通用寄存器(其间包含32byte的LCD显现寄存器),S3C825A的内部寄存器图2所示,它的内部寄存器空间实施页式办理,每一个页的上端64byte作为Set2空间,下端192byte作为主数据寄存器空间,共7页(第7页的00H-1FH为LCD 显现数据寄存器空间)。别的扩展出的96byte可作为Set1的Bank0(64byte)和Bank1(32byte)空间,该空间可作为体系操控寄存器空间和作业寄存器空间。 1.2 A/D转化器 S3C825A内部集成了有一个4路输入10bit模/数转化器(A/D)。该A/D转化器可将每一路的模仿电平用接连的近似逻辑值表明,然后得到与之持平的10bit数字电平,其转化进程需求50个时钟周期。模仿信号输入端口是I/O Port3的P3.0P3.2复用的,Port3的操控寄存器(P3CONH,P3CONL)可确认Port3是否用于A/D转化器的模仿信号输入,A /D转化器的操控寄存器(ADCON)操控P3.0P3.2中哪一路作为A/D输入端口。输入信号模仿电平值要求在AVREF和AVSS之间。转化后的值放在ADDATAH/ADDATAL寄存器中,每次转化前有必要将这2个寄存器清空。 1.3 LCD操控器 S3C825A内部集成了一个LCD操控器,能够直接驱动224点(28segX8com)的LCD面板。实践运用中只需求即将显现的数据存储在LCD显现寄存器(700H-71FH)中,然后经过装备LCD操控寄存器(LCON)和LCD形式操控寄存器(LMOD)来挑选适宜的帧改写频率,LCD操控器就会主动地即将显现的内容从显现寄存器送到seg脚以进行显现输出,而不需求再进行其他的编程操控。 2 S3C825A的软件开发环境 2.1 在线仿真器OPENic i500 AIJIsysterm公司为三星SAM8系列单片机供给了一套有用的在线仿真器——OPENice i500,该仿真器能够运转在windows 95/98/2000/NT等操作体系下,具有可选的CPU时钟资源(最高可达80MHz)和高达64kbyte的仿真代码存储器,一起内嵌功用强大的代码修正器,可支撑依据RS232的高速代码下载(最高下载速度可达115200b/s),一起支撑C言语编译/调试(IAREW,CSPY),因而,运用此仿真器能够大大进步程序调试开发的功率。 2.2 SAM8的开发环境 SAM8系列单片机常用的开发软件是IAR公司供给的依据IAR Embedded Wordbench的集成开发环境,该开发体系集IAR C编译器、汇编器、衔接器、代码修正器、工程办理器及C-SPY调试器于一体,能够修正、汇编和编译汇编言语和C言语的源文件,并且汇编程序和C程序可共用相同格局的头文件,是一个功用强大的开发环境。该集成开发渠道(IDE)可在Windows 98/ME/NT4/2000/XP下进行工程办理、运转特点设置、代码修正和调试等。其间内部IAR C言语编码器的功用强大,能支撑ISO/ANSI规范C言语编译,且具有多样的代码巨细和编译速度形式以及可选的仓库形式。此外,还支撑SAM8扩展关键字,一起支撑C言语和汇编言语的混合程序编译。
该开端环境集成有依据通用指令集的重定位宏汇编器,且内嵌C言语预处理程序,可接受一切的C言语宏界说。而集成的IAR XLINK衔接器支撑灵敏的代码段和数据段重定位,并可依据重定位模块供给的信息将若干个运用程序所需求的可重定位代码模块文件组装成一个程序,然后发生可履行的方针代码。此外,环境中的C-SPY调试器具有多种测验剖析功用,支撑单步调试,操控程序运转到指定方位(Go to Cursor/Go to Label/Go to Address),调试回来(Go to Return)、实时盯梢变量、寄存器(Register Groups)、存储器(Memory)等,这些都在很大程序上进步了开发功率。 3 混合编程的软件规划 在对SAM8系列单片机进行软件开发进程中,用C言语编程具有开发周期短、可读性强、可移植性好和修正便利等长处,可是C程序反汇编生成的汇编代码往往较长。若直接用汇编言语编程,尽管编制的程序较短,但开发周期长,修正也不方便利,所以,较好的解决办法是把程序的结构或主体部分用C言语编写,而将履行功率要求较高的部分用汇编言语来编写。下面首要介绍针对SAM8系列单片机进行混合编程的软件规划办法。 3.1 IAR C言语编译器的函数参数传送规矩 IAR C言语编译器规矩函数参数传递有2种办法,即寄存器传递和仓库传递。传递次序是从左至右,详细选用哪种办法传递取决于函数参数的类型。 IAR C言语编译器把单片机的寄存器分红2组,其间高速暂存器组(R10-R15)中的函数参数由左至右顺次传入R15至R10,直至这些寄存器点满,而其他函数参加由仓库来传递。由迂些寄存器是暂存器,用完就开释掉,所以运用进程中不必维护。第二组为一般寄存器(R1、R4-R9),这组寄存器首要用作寄存器变量和保存中心变量,运用进程不有必要对其进行维护,但在C言语函数编写中能够不表现,而由编译器主动完结。 当函数参数为以下2种类型时,应当选用仓库办法传递:榜首种是传递参数为struct或union大于4字节的参数类型。第二种是长度可变函数的未命名参数类型。 函数参数一般放在由仓库指针指定的方位为开端的主存储器中,被调用函数的参数则由左至右顺次寄存在被指定的仓库中,当被调用函数回来调用函数时,仓库主动清零,主存储器空间被开释,以供下次供传递函数运用。 函数回来值可依据其类型放在R15或R15:R14寄存器对中。若回来值是struct或union类型,则回来R15中的值是寄存回来成果的仓库指针开端方位。 C言语编译器也是编译中止函数时会主动维护所用到的寄存器(包含R10-R15),状况寄存器FLAGS的维护也是在中止处理进程中主动完结的。中止进程顶用到的寄存器都运用PUSH Rn的指令进行维护,而选用POP Rn指令康复。当用IRET指令主动康复状况寄存器FLAGS时,能够从中止中回来。 3.2 对汇编言语函数的约好 关于一个能够被C言语函数调用的汇编程序来说,运用时有必要满意以下3点: (1)契合C言语参数传递规矩; (2)有PUBLIC函数进口标志; (3)在C言语函数顶用extern声响为外部函数。 参加传递规矩和C言语函数相同,所不同的是,要在汇编言语函数编写进程中详细表现出来。 4 运用实例 清晰了以上调用规矩,混合编程就比较简单了,归纳起来有以下几点: (1)在C言语源文件顶用“extern”关键字导入被汇编言语源文件导出的标号; (2)在汇编言语源文件用“PUBLIC”关键字把标号导出到C言语源文件; (3)在汇编言语顶用“EXTERN”关键字导入被C言语函数源文件导出的关键字; (4)用C言语把标号导出给汇编言语,这一步不需求关键字; (5)把修正好的C言语和汇编言语源文件导入规划体系,并用各自调用函数的指令调用。 下面以笔者在校音器规划顶用到的2个例子来详细阐明。 4.1 C言语和汇编言语彼此调用 在该例中,用C言语函数main()调用汇编言语函数get_rand()以得到一个随机数,接着,用汇编言语函数get_rand()调用C言语库函数 rand()再得到一个整型机随机数,然后用调用C言语函数mult()的办法把这个随机值的高位乘以main()函数传递给自己的实参,一起把乘积值回来给main()参数。 /****C言语源程序****/ #include/*头文件*/ extern unsigned char get_rand (unsigned char seed);/* 汇编言语原型声明*/ void main(void)/*主函数*/ { unsigned char seed; unsigned char value;/*界说变量*/ WTCON=0xa0; /*封闭watch dog*/ Seed=0x05; Value=get_rand(seed); /*调用汇编言语函数,得到一个随机数*/ While(1); /*程序完毕*/ } /**加法子程序,供汇编言语调用**/ unsigned char add(unsigned char x,unsigned chary) { return (x+y); } /****C言语源程序完毕 ****/ /****汇编言语源程序 ****/ #include ;头文件 EXTERN rand ;C言语库函数 EXTERN add ;用户自界说C函数 PUBL%&&&&&% get_rand ;导出函数名给C函数调用 Get_rand: PUSH R9 ;一般C函数入栈维护 LD R9,R15;C函数传递参数给R15,暂时存储在R9 CALL rand ;调用C库函数得到一个随机数,作为add的榜首实参,存储在R15 LD R14,R9;C函数传递的参数,作为add的第二实参,存储在R14 CALL add ;add回来的值存储在R15中 POP R9 ;add出栈康复寄存器内定 RET END /**** 汇编言语源程序完毕 ****/ 4.2 汇编言语写中止服务程序 为了进步体系响应速度,规划时往往要求中止服务程序的履行时间较短,履行速度较快。因而,最好的办法便是用汇编言语编写中止服务程序。但要留意以下2点: (1)中止函数不传递参数和回来成果; (2)中止进程顶用到的寄存器都要进行维护。 本例顶用汇编言语编写看门狗守时器的中止服务程序,而用C言语编写主程序。 /****C言语主程序****/ #include /*头文件*/ extern void in0(void); /*中止函数声明*/ void main(void) { CLKCON=0X98; /*开中止*/ IMR=0X10; /*IRQ4使能*/ WTCON=0X84;/*看门狗守时器设为0.25秒*/ P2CONL=0X03; /*P2.0为输出*/ IPH=0X00; IPL=0XD6; /*中止函数所对矢量方位*/ CLKCON=0X18; /*关中止*/ while(1); } /****C言语主程序完毕****/ /****汇编言语编写的中止程序****/ #include ;头文件 public int0 ;中止函数声响 RSEG WATCHT:CODE:RROT (1),0X00D6 ;中止矢量在代码段中的肯定方位 Int0: PUSH R1 ;寄存器维护 LD R1,#01H ;给PORT2寄存器赋值,使衔接P2.1的LED守时发头 POP R1;寄存器康复 IRET;中止回来 END /****汇编言语编写的中止程序逻辑****/ 5 完毕语 以上办法现已运用于笔者参加规划的校音器规划中并获得杰出的作用。但也要留意调试进程中编译器选项的设置对程序运转成果有必定的影响,因而,对SAM8体系中不同的核,必定要选用不同的内核版本号,不然,寄存器传递的参数可能会错位,然后导致参数传递过错,给调试带来不方便。