Ubuntu 16.04下8051单片机开发环境搭建
工作需求,准备学习单片机,加上以后准备学习嵌入式Linux,而且最近烦透了Win10的自动更新,遂放弃Windows环境,准备在Linux环境下从51单片机开始折腾起,学单片机和Linux两不误。本人是单片机和Linux系统双料新手,学习过程中碰壁不断,遂将过程做一下笔记,也分享到网上,高手见笑,新手且看,希望能帮到一些朋友。
系统: Ubuntu 16.04 LTS amd64
单片机: 某宝¥149开发板,芯片STC90C51,板子自带USB转串口芯片CH340G。Ubuntu好像自带了这个的驱动,不用另装驱动了。
本来想折腾mcu8051ide的,但是apt-get安装和手动一个个安装依赖库再编译主程序安装两种方式的都运行闪退,只能用原始的方法了。
需要的软件:
1. 编辑器: 随便 vim emacs gedit nano都行
2. 编译器:sdcc,一个小型的C编译器
sudo apt-get install sdcc sdcc-doc
3. ISP下载器:
a. stcflash.py,一个单独的python文件,命令行直接使用。【推荐】
https://github.com/laborer/stcflash
b. gSTCISP,一个带GUI的下载器,SourceForge提供源码下载,需要编译安装。也可以在Ubuntu论坛找到一个编译好的版本。我自己测试时,烧写成功率不高,不知道怎么回事,所有不太推荐。
https://sourceforge.net/projects/gstcisp/
开发单片机程序简单步骤:
1.随便写个单片机程序,比如main.c。需要注意的是sdcc下的程序与Windows 的Keil下有点区别,目前仅发现两点:头文件不一样和IO口sbit定义不一样,具体区别自行百度。
#include <8051.h> void Delayms(unsigned int ms); void main() { while(1) { P0=0xfe; Delayms(500); P0=0x01; Delayms(500); } } void Delayms(unsigned int ms) { unsigned int i, j; for(i = ms; i > 0; i--) for(j = 110; j > 0; j--); return; }
2. 编译:调用sdcc编译并生成bin或hex文件。需要说一下的是,gSTCISP只支持下载bin文件,而stcflash.py能下载bin和hex文件。
生成hex文件:
sdcc main.c && packihx main.ihx > main.hex
生成bin文件:
sdcc main.c && makebin -p main.ihx main.bin
3. 烧写程序:
推荐使用stcflash.py,因为我用gSTCIPS十次有九次都下不进去,不知道什么原因。
stcflash.py是Python语言写的,需要用到Python的串口模块,用如下命令安装。
sudo apt-get install python-serial
为了方便使用,我把stcflash.py复制到了/usr/bin/下,并添加执行权限,这样不用每次调用都要输入文件的保存路径了。当然应该也可以把stcflash.py的保存路径加入$PATH变量,我是懒人。
sudo cp stcflash.py /usr/bin/
sudo chmod +x /usr/bin/stcflash.py
然后检查USB连接:
a. $ lsmod | grep usbserial
如果输出有 usbserial,说明系统支持USB转串口。
b. 用USB数据线将开发板与电脑连接起来,运行
$ ls /dev/ttyUSB*
如果输出有/dev/ttyUSB0或1等等,说明系统已正确识别该USB转串口设备。
也可以用“#lsusb”命令查看是否有“USB-Serial adapter”类似的设备。
c. 设置串口为ttyUSB0(可以不做,在下载时手动指定--port):
$ dmesg | grep ttyUSB0
d. 关闭开发板电源,运行stcflash.py烧写程序,当出现如下字样时,打开开发板电源,即开始下载:
$ sudo stcflash.py main.bin --port /dev/ttyUSB0 --lowbaud 1200 Connect to /dev/ttyUSB1 at baudrate 1200 Detecting target...
下载完成为这样:
$ sudo stcflash.py main.bin --port /dev/ttyUSB0 --lowbaud 1200 Connect to /dev/ttyUSB1 at baudrate 1200 Detecting target... done
FOSC: 12.013MHz Model: STC90C516RD+ (ver4.3C) ROM: 64KB [X] Reset stops watchdog [X] Internal XRAM [X] Normal ALE pin [X] Full gain oscillator [X] Not erase data EEPROM [X] Download regardless of P1 [X] 12T mode Baudrate: 38400 Erasing target... done Size of the binary: 158 Programming: #################### done Setting options... done
stcflash.py默认port为/dev/ttyUSB0,波特率为2400,所以当使用ttyUSB0时,也可以直接运行"$sudo stcflash.py main.bin",不用手动指定端口和波特率。
完。