单片机---Mac下的开发环境【1】(STC单片机 + SDCC + Stcgal)

1字数 1643阅读 2409

前言

十年前接触单片机,由此进入编程世界,第一次领略了软硬件开发的魅力。直到现在我一直认为那段经历对于非科班程序员的我的帮助是极其深远的。

近两年我的工作分布在Linux、macOS、Windows三个操作系统上,随着项目增多和涉及的领域越来越多,越来越觉得经常要在不同的系统上换来换去的工作,很是不爽,虽然都是物理机(三个系统对应三台物理机,就是这么任性,没办法,哈哈),但依然觉得要记得哪个项目在哪个电脑上,或者最近一直在Mac上面工作,突然切换到Win会很不习惯是一件浪费我精力的事情。

所以,最近完成了一件不大不小的任务。那就是我把所有项目及相关代码全部迁移到Mac上,并对所有项目全部在Mac完成了编译、测试,并全部完美通过!决心今后只用Mac解决我所有的需求。

完成了专心使用Mac的准备工作后,在家没什么事情,就想起了静静躺在抽屉最里面的51单片机学习版,是它让我领略编程之美,让我爱上软件开发(当然我也喜欢硬件开发,但是很菜,后续也会有在Mac上硬件设计相关文章)。于是拿出来把玩一下。

但是在Mac上进行单片机开发不是很常见,没有Keil等工具使用,但经过各种Google,完成了基本环境的搭建。于是有了这篇文章来记录一下。

搭建开发环境

背景介绍

  • Mac系统版本: macOS Mojave
  • USB转串口: CH340PL2303
  • 单片机: STC90C516RD+ 、STC89C52RC

编译阶段

安装编译器

编译器我们使用 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 连接起来,如下图:


mac_stc_mcu.jpg

打开终端,执行如下命令:

~/led ls /dev/tty.*
/dev/tty.Bluetooth-Incoming-Port  /dev/tty.usbserial

其中 /dev/tty.usbserial 就是学习板 USB 转串口设备,一会儿要用到这个设备进行烧录。

安装烧录工具

烧录工具我知道的有:stcgal 和 stcflash
这里选择 stcgal 就好,没有任何理由选择 stcflash,前者完爆后者,有意思的是本来我想在这里写一点这两个工具的对比,可是一想到根本没有任何可比性,索性就算了吧,其实在上面是否要提到 stcflash 这件事我也是很纠结的。。。

stcgal_support_list.png

上面这张图片是 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

推荐阅读更多精彩内容