作为开头,很多细节我就先略过了,主要简单的介绍几个步骤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启动。)
运行的波形如下:
波形和程序相一致,由定时器中断驱动的一个流水灯。
注:在调试软件的时候发现一个小小的问题,由于使用了全局变量向中断函数传递信息,我第一次的写法是这样的:
#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:嵌入式编程其实很简单,但如何做到优雅而高效则不简单)。