make the OC8051 run

好吧,我使用了一个洋气的标题,anyway,this's my begin of the oc8051。so,管它中文还是英文,我要开写了。

作为开头,很多细节我就先略过了,主要简单的介绍几个步骤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 <AT89X51.H>
 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<<i;    
36 }

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

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

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

运行的波形如下:

make the OC8051 run_第1张图片

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

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

#include <AT89X51.H>
int i=0;
void umain ()
{
    ...

出现warming:

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

    SEGMENT: ?C_INITSEG

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

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

就中枪了(ps:嵌入式编程其实很简单,但如何做到优雅而高效则不简单)。

你可能感兴趣的:(make the OC8051 run)