作为开头,很多细节我就先略过了,主要简单的介绍几个步骤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代码,可恶的是,写个全局变量还刚好
相关文章