方法概述:
使用文本编辑器编写代码(比如VIM)——使用SDCC编译源代码——使用SDCC自带套件packihx将.ihx文件转换成.hex文件——使用hextobin将.hex转换成.bin文件——使用gSTC-ISP将文件烧录到单片机。
转换过程中也可以使用makebin命令直接将.ihx转换为.bin
开发环境构建:
安装SDCC
1 |
sudo apt-get install sdcc |
安装hextobin
下载hextobin
安装hextobin的依赖包
1 2 3 4 5 |
sudo apt-get install autotools-dev mono-devel \ libglade2.0-cil-dev libmono-addins-cil-dev \ libmono-addins-gui-cil-dev libglib2.0-cil-dev \ libgtk2.0-cil-dev gconf2 libglib2.0-dev libgtk2.0-dev \ mono-gmcs |
1 2 3 4 5 6 |
cd ~/Downloads tar zxvf hextobin-0.1.0.tar.gz cd hextobin-0.1.0 ./configure make sudo make install |
安装gSTC-ISP
下载gSTC-ISP
安装依赖包
1 |
sudo apt-get install libvte-dev |
1 2 3 4 5 |
cd ~/Downloads tar zxvf gSTC-ISP_v1.0.tar.gz cd gSTC-ISP ./configure make |
这个时候系统应该会报错
1 |
main.c:25:21: fatal error: vte/vte.h: No such file or directory |
然后再进入解压出来的gSTC-ISP文件夹里面的src文件,用文本编辑器修改里面的Makefile文件,将Makefile文件里面的第72行(开头是CFLAGS)替换为:
1 |
CFLAGS = -g -02 -I/usr/include/vte-0.0/ |
在这里我发现如果
1 |
./configure |
过后直接更改src里面的Makefile然后再
1 |
make |
话会出现Makefile被还原并且只可读,但是如果
1 |
make |
失败一遍过后再去更改文件再去
1 |
make |
就可以成功,具体原因还不知道。
最后安装
1 |
sudo make install |
编写源代码:
SDCC的源代码和Keil C有所不同,需要做一点调整才能编译通过.SDCC比较多的使用像8051.h这样的头文件(include/mcs51目录下也有reg51.h这样的头文件).
对于一些非ANSI C的关键字,SDCC均采用双下滑线开头的方式定义,如__code,__idata,__sbit……对于单片机引脚的定义SDCC采用了__at关键字和十六进制地址如下:
1 2 3 4 5 6 7 |
//SDCC Keil C __sbit __at 0x94 blackLineLeft; sbit blackLineLeft=P1^4; __sbit __at 0x95 blackLineRight; sbit blackLineRight=P1^5; __sbit __at 0x80 in1; sbit in1=P1^0; __sbit __at 0x81 in2; sbit in2=P1^1; __sbit __at 0x82 in3; sbit in3=P1^2; __sbit __at 0x83 in4; sbit in4=P1^3; |
更多的地址信息可以查看附录
编译——转换——烧录:
编译源代码:
1 |
sdcc file.c |
转换文件格式:
将产生的.ihx文件转换成.hex文件
1 |
packihx file.ihx > file.hex |
将.hex文件转换成.bin文件
1 |
hextobin file.hex file.bin |
或者:
1 |
makebin -p <file.ihx> file.bin |
烧录:
用root身份运行gSTC-ISP
1 |
gSTCISP |
选择 /dev/ttyUSB0(或者1)以及4800 bauds
选择好转换好的.bin文件,点击Download
如果看见程序提示:We are trying to connect your MCU
这个时候请给单片机断电,再上电即可完成程序烧录。
附录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
/* BYTE Register */ __sfr __at (0x80) P0 ; __sfr __at (0x81) SP ; __sfr __at (0x82) DPL ; __sfr __at (0x83) DPH ; __sfr __at (0x87) PCON ; __sfr __at (0x88) TCON ; __sfr __at (0x89) TMOD ; __sfr __at (0x8A) TL0 ; __sfr __at (0x8B) TL1 ; __sfr __at (0x8C) TH0 ; __sfr __at (0x8D) TH1 ; __sfr __at (0x90) P1 ; __sfr __at (0x98) SCON ; __sfr __at (0x99) SBUF ; __sfr __at (0xA0) P2 ; __sfr __at (0xA8) IE ; __sfr __at (0xB0) P3 ; __sfr __at (0xB8) IP ; __sfr __at (0xD0) PSW ; __sfr __at (0xE0) ACC ; __sfr __at (0xF0) B ; /* BIT Register */ /* P0 */ __sbit __at (0x80) P0_0 ; __sbit __at (0x81) P0_1 ; __sbit __at (0x82) P0_2 ; __sbit __at (0x83) P0_3 ; __sbit __at (0x84) P0_4 ; __sbit __at (0x85) P0_5 ; __sbit __at (0x86) P0_6 ; __sbit __at (0x87) P0_7 ; /* TCON */ __sbit __at (0x88) IT0 ; __sbit __at (0x89) IE0 ; __sbit __at (0x8A) IT1 ; __sbit __at (0x8B) IE1 ; __sbit __at (0x8C) TR0 ; __sbit __at (0x8D) TF0 ; __sbit __at (0x8E) TR1 ; __sbit __at (0x8F) TF1 ; /* P1 */ __sbit __at (0x90) P1_0 ; __sbit __at (0x91) P1_1 ; __sbit __at (0x92) P1_2 ; __sbit __at (0x93) P1_3 ; __sbit __at (0x94) P1_4 ; __sbit __at (0x95) P1_5 ; __sbit __at (0x96) P1_6 ; __sbit __at (0x97) P1_7 ; /* SCON */ __sbit __at (0x98) RI ; __sbit __at (0x99) TI ; __sbit __at (0x9A) RB8 ; __sbit __at (0x9B) TB8 ; __sbit __at (0x9C) REN ; __sbit __at (0x9D) SM2 ; __sbit __at (0x9E) SM1 ; __sbit __at (0x9F) SM0 ; /* P2 */ __sbit __at (0xA0) P2_0 ; __sbit __at (0xA1) P2_1 ; __sbit __at (0xA2) P2_2 ; __sbit __at (0xA3) P2_3 ; __sbit __at (0xA4) P2_4 ; __sbit __at (0xA5) P2_5 ; __sbit __at (0xA6) P2_6 ; __sbit __at (0xA7) P2_7 ; /* IE */ __sbit __at (0xA8) EX0 ; __sbit __at (0xA9) ET0 ; __sbit __at (0xAA) EX1 ; __sbit __at (0xAB) ET1 ; __sbit __at (0xAC) ES ; __sbit __at (0xAF) EA ; /* P3 */ __sbit __at (0xB0) P3_0 ; __sbit __at (0xB1) P3_1 ; __sbit __at (0xB2) P3_2 ; __sbit __at (0xB3) P3_3 ; __sbit __at (0xB4) P3_4 ; __sbit __at (0xB5) P3_5 ; __sbit __at (0xB6) P3_6 ; __sbit __at (0xB7) P3_7 ; __sbit __at (0xB0) RXD ; __sbit __at (0xB1) TXD ; __sbit __at (0xB2) INT0 ; __sbit __at (0xB3) INT1 ; __sbit __at (0xB4) T0 ; __sbit __at (0xB5) T1 ; __sbit __at (0xB6) WR ; __sbit __at (0xB7) RD ; /* IP */ __sbit __at (0xB8) PX0 ; __sbit __at (0xB9) PT0 ; __sbit __at (0xBA) PX1 ; __sbit __at (0xBB) PT1 ; __sbit __at (0xBC) PS ; /* PSW */ __sbit __at (0xD0) P ; __sbit __at (0xD1) F1 ; __sbit __at (0xD2) OV ; __sbit __at (0xD3) RS0 ; __sbit __at (0xD4) RS1 ; __sbit __at (0xD5) F0 ; __sbit __at (0xD6) AC ; __sbit __at (0xD7) CY ; /* BIT definitions for bits that are not directly accessible */ /* PCON bits */ #define IDL 0x01 #define PD 0x02 #define GF0 0x04 #define GF1 0x08 #define SMOD 0x80 /* TMOD bits */ #define T0_M0 0x01 #define T0_M1 0x02 #define T0_CT 0x04 #define T0_GATE 0x08 #define T1_M0 0x10 #define T1_M1 0x20 #define T1_CT 0x40 #define T1_GATE 0x80 #define T0_MASK 0x0F #define T1_MASK 0xF0 /* Interrupt numbers: address = (number * 8) + 3 */ #define IE0_VECTOR 0 /* 0x03 external interrupt 0 */ #define TF0_VECTOR 1 /* 0x0b timer 0 */ #define IE1_VECTOR 2 /* 0x13 external interrupt 1 */ #define TF1_VECTOR 3 /* 0x1b timer 1 */ #define SI0_VECTOR 4 /* 0x23 serial port 0 */ |