前言
最近闲来无事,想在Mac上玩一玩单片机开发,没有Keil等工具使用,经过各种Google,完成了基本环境的搭建。
搭建开发环境
背景介绍
编译阶段
安装编译器
编译器我们使用 SDCC ,下面是官网上的介绍:
What is SDCC?
SDCC is a retargettable, optimizing Standard C (ANSI C89, ISO C99, ISO C11) compiler suite that targets the Intel MCS51 based microprocessors (8031, 8032, 8051, 8052, etc.), Maxim (formerly Dallas) DS80C390 variants, Freescale (formerly Motorola) HC08 based (hc08, s08), Zilog Z80 based MCUs (z80, z180, gbz80, Rabbit 2000/3000, Rabbit 3000A, TLCS-90) and STMicroelectronics STM8. Work is in progress on supporting the Microchip PIC16 and PIC18 targets. It can be retargeted for other microprocessors.
简单翻译一下,就是说:
SDCC 是一个优化标准 C (ANSI C89, ISO C99, ISO C11) 的编译器套件,Targets:
- 基于 Intel MCS51 的微处理器 (8031, 8032, 8051, 8052, 等),
- Maxim DS80C390 变体,
- 基于 Freescale HC08 的 (hc08,s08),
- 基于 Zilog Z80 的MCU (z80, z180, gbz80, Rabbit 2000/3000, Rabbit 3000A, TLCS-90),
- STMicroelectronics STM8
和 。正在开展支持 Microchip PIC16 和 PIC18 的工作。
它可以重新 target 其他微处理器。
SDCC的安装
可以选择在官网下载安装包,可以通过包管理工具安装,甚至你可以自己编译 SDCC 的源码来安装(Linux 可能需要)。
我们在Mac上通常使用 brew 这个包管理工具,通过 brew 来安装 SDCC 的命令:
~ brew install sdcc
安装结束后使用如下命令查看 SDCC 版本信息:
~ sdcc -v
SDCC : mcs51/z80/z180/r2k/r3ka/gbz80/tlcs90/ds390/pic16/pic14/TININative/ds400/hc08/s08/stm8 3.8.0 #10562 (Mac OS X x86_64)
published under GNU General Public License (GPL)
到此,编译器 SDCC 就安装成功了。
编译代码
我们首先写一个简单的跑马灯 led.c,用 SDCC 编译,代码如下:
#include <8052.h>
void delay_ms(unsigned int ms)
{
unsigned char i;
while (ms--)
{
for (i = 0; i < 120; i++)
;
}
}
void main()
{
unsigned char i;
while (1)
{
P1 = 0xff;
i = 8;
while (i--)
{
P1 = P1 << 1;
delay_ms(300);
}
P1 = 0xff;
i = 8;
while (i--)
{
P1 = P1 >> 1;
delay_ms(300);
}
}
}
代码写好了,使用如下命令编译:
~/led sdcc led.c
~/led ls
led.asm led.c led.ihx led.lk led.lst led.map led.mem led.rel led.rst led.sym
SDCC 编译器编译完成之后,会生成很多文件,有的是中间件,有的是可以当做库提供给他人的,这里我们主要关心 led.ihx 文件,这个文件是可以烧录到单片机的可执行文件。
至此,编译阶段的任务就全部都完成了。那么代码编译好之后,如何装入单片机并执行呢?下面就说一些烧录阶段。
烧录阶段
连接、驱动
我的学习板是板载USB转串口模块的,芯片是 PL2303,需要安装 PL2303 Mac 版本的驱动程序,这样通过 USB 连接到学习板后,就可以发现设备。驱动下载地址在上面的背景介绍中。CH340 芯片的同理,安装好驱动后,其他没有差别。
驱动安装后必须要重启电脑,电脑重启后,将电脑和学习板通过 USB 连接起来,如下图:
打开终端,执行如下命令:
~/led ls /dev/tty.*
/dev/tty.Bluetooth-Incoming-Port /dev/tty.usbserial
其中 /dev/tty.usbserial 就是学习板 USB 转串口设备,一会儿要用到这个设备进行烧录。
安装烧录工具
烧录工具我知道的有:stcgal 和 stcflash
这里选择 stcgal 就好,没有任何理由选择 stcflash,前者完爆后者,有意思的是本来我想在这里写一点这两个工具的对比,可是一想到根本没有任何可比性,索性就算了吧,其实在上面是否要提到 stcflash 这件事我也是很纠结的。。。
上面这张图片是 stcgal 经过测试的 MCU 清单(stcgal should fully support STC 89/90/10/11/12/15/8 series MCUs.)
下面来安装 stcgal,推荐使用 Python3 和 pip3 来安装 stcgal,执行如下命令:
~ pip3 install stcgal
可能需要读写系统目录的权限。
烧录工具就安装完成了。
烧录程序
回到终端,接下来我们将之前编译好的程序烧录到单片机中,使用如下命令:
~/led stcgal -P stc89 -p /dev/tty.usbserial led.ihx
介绍一下这个命令:-P stc89 表明单片机型号,-p /dev/tty.usbserial 是我们上面查到的 USB 转串口设备,led.ihx 就是我们之前编译好的程序。
执行完上面的命令后,终端会提示你给单片机重新上电:
Waiting for MCU, please cycle power:
终端会在这里等待,知道你把单片机重新上电后,会继续执行烧录工作。重新上电后效果如下:
Waiting for MCU, please cycle power: done
Target model:
Name: STC90C516RD+
Magic: F130
Code flash: 62.0 KB
EEPROM flash: 0.0 KB
Target frequency: 23.846 MHz
Target BSL version: 4.3C
Target options:
cpu_6t_enabled=False
bsl_pindetect_enabled=False
eeprom_erase_enabled=False
clock_gain=high
ale_enabled=True
xram_enabled=True
watchdog_por_enabled=False
Loading flash: 188 bytes (Intel HEX)
Switching to 19200 baud: checking setting testing done
Erasing 2 blocks: done
Writing flash: 640 Bytes [00:00, 2015.33 Bytes/s]
Setting options: done
Disconnected!
~/led
至此,一个简单的跑马灯程序,经过编码 -> 编译 -> 烧录后,成功的运行在单片机上了。
注:
需要注意的是,sdcc 编译器与 keil 的编译器有微小的区别,在写代码的时候有几个地方需要不同的写法,这个网上搜索一下就可以了解到。
---End