make the OC8051 run

发布时间: 2024-07-31
来源: 电子工程世界

作为开头,很多细节我就先略过了,主要简单的介绍几个步骤to make the OC8051 run。


1、获取OC8051源代码。(opencore或某电子类论坛下载)。


2、修改oc8051_defines.v。此文件可让用户对硬件进行裁剪和配置。


修改如下(部分):


 1 //

 2 // oc8051 pherypherals

 3 //

 4 `define OC8051_UART

 5 `define OC8051_TC01

 6 `define OC8051_TC2

 7 `define OC8051_PORTS  //ports global enable

 8 `define OC8051_PORT0

 9 `define OC8051_PORT1

10 `define OC8051_PORT2

11 `define OC8051_PORT3

12 

13 

14 //

15 // oc8051 ITERNAL ROM

16 //

17 //`define OC8051_ROM

18 `ifdef OC8051_ROM

19     //`define OC8051_XILINX_ROM   //rom implement as xilinx ,or comment to as generic rom. 

20 `endif

21 

22 

23 //

24 // oc8051 memory

25 //

26 //`define OC8051_CACHE

27 //`define OC8051_WB

28 

29 //-----------

30 //----ram----

31 //-----------

32 //`define OC8051_RAM_XILINX

33 //`define OC8051_RAM_VIRTUALSILICON

34 //`define OC8051_RAM_GENERIC

35 

36 

37 

38 

39 //

40 // oc8051 simulation defines

41 //

42 `define OC8051_SIMULATION

43 //`define OC8051_SERIAL

44 

45 //

46 // oc8051 bist

47 //

48 //`define OC8051_BIST


上述设置配置了默认的所有外设,并开启了仿真,而存储的设置则为,rom:无片内rom,使用片外的rom。ram:使用默认的ram模型,由寄存器组(DFF)构成,与具体实现无关,方便仿真。


3、编写C code。


主要的C代码如下:


 1 #include

 2 int i;

 3 void umain ()

 4 {

 5 

 6      i=0;    

 7      P0=0x01;

 8      IE=0x82;

 9      IP=0x02;

10      TMOD=0X01;

11      TH0=0XFF;

12      TL0=0XF0;

13      TCON=TCON | 0x10;

14      

15      while(1)

16      {

17      }

18 }

19 

20 void Ex0_ISR() interrupt 0 using 1

21 {

22 }

23 void Timer0_ISR() interrupt 1 using 2

24 {

25     TH0=0XFF;

26     if(i<8)

27     {

28     i=i+1;

29     }

30     else

31     {

32     i=0;

33     }

34 

35     P0=0x01<36 }


上述代码我使用了AT89X51.H头文件,基本上,51是一个很标准的单片机,各种51的变种都有一个相同的子集,因此使用此头文件是没有问题的,你会有疑问,主函数怎么写成


了umain,是不是笔误,不是的,它就是这样,当然这需要一些其他的操作;在此先略过。


4、3中生成的hex使用一个小工具,可以生成可作为仿真的.in;.in会被加载到外部rom(我们配置了无内部rom,直接从外部rom启动。)


运行的波形如下:

波形和程序相一致,由定时器中断驱动的一个流水灯。


注:在调试软件的时候发现一个小小的问题,由于使用了全局变量向中断函数传递信息,我第一次的写法是这样的:


#include

int i=0;

void umain ()

{

    ...

出现warming:


  *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS


    SEGMENT: ?C_INITSEG


即声明和赋值语句不能同时进行,同时我通过查看map文件和反汇编,发现汇编多出了一条奇怪的跳转指令,不过那个地方的那个奇怪指令正常情况下永远执行不到。


好吧,我承认,我是一个业余的coder,而且对于51的编程,也是2-3年前的一个课程设计了,边查边写还写出这么烂风格的C代码,可恶的是,写个全局变量还刚好


文章来源于: 电子工程世界 原文链接

本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。