前言
最近閑來無事,想在Mac上玩一玩單片機(jī)開發(fā),沒有Keil等工具使用,經(jīng)過各種Google,完成了基本環(huán)境的搭建。
搭建開發(fā)環(huán)境
背景介紹
編譯階段
安裝編譯器
編譯器我們使用 SDCC ,下面是官網(wǎng)上的介紹:
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 是一個(gè)優(yōu)化標(biāo)準(zhǔn) 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的安裝
可以選擇在官網(wǎng)下載安裝包,可以通過包管理工具安裝,甚至你可以自己編譯 SDCC 的源碼來安裝(Linux 可能需要)。
我們在Mac上通常使用 brew 這個(gè)包管理工具,通過 brew 來安裝 SDCC 的命令:
~ brew install sdcc
安裝結(jié)束后使用如下命令查看 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 就安裝成功了。
編譯代碼
我們首先寫一個(gè)簡單的跑馬燈 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 編譯器編譯完成之后,會(huì)生成很多文件,有的是中間件,有的是可以當(dāng)做庫提供給他人的,這里我們主要關(guān)心 led.ihx 文件,這個(gè)文件是可以燒錄到單片機(jī)的可執(zhí)行文件。
至此,編譯階段的任務(wù)就全部都完成了。那么代碼編譯好之后,如何裝入單片機(jī)并執(zhí)行呢?下面就說一些燒錄階段。
燒錄階段
連接、驅(qū)動(dòng)
我的學(xué)習(xí)板是板載USB轉(zhuǎn)串口模塊的,芯片是 PL2303,需要安裝 PL2303 Mac 版本的驅(qū)動(dòng)程序,這樣通過 USB 連接到學(xué)習(xí)板后,就可以發(fā)現(xiàn)設(shè)備。驅(qū)動(dòng)下載地址在上面的背景介紹中。CH340 芯片的同理,安裝好驅(qū)動(dòng)后,其他沒有差別。
驅(qū)動(dòng)安裝后必須要重啟電腦,電腦重啟后,將電腦和學(xué)習(xí)板通過 USB 連接起來,如下圖:

打開終端,執(zhí)行如下命令:
~/led ls /dev/tty.*
/dev/tty.Bluetooth-Incoming-Port /dev/tty.usbserial
其中 /dev/tty.usbserial 就是學(xué)習(xí)板 USB 轉(zhuǎn)串口設(shè)備,一會(huì)兒要用到這個(gè)設(shè)備進(jìn)行燒錄。
安裝燒錄工具
燒錄工具我知道的有:stcgal 和 stcflash
這里選擇 stcgal 就好,沒有任何理由選擇 stcflash,前者完爆后者,有意思的是本來我想在這里寫一點(diǎn)這兩個(gè)工具的對比,可是一想到根本沒有任何可比性,索性就算了吧,其實(shí)在上面是否要提到 stcflash 這件事我也是很糾結(jié)的。。。

上面這張圖片是 stcgal 經(jīng)過測試的 MCU 清單(stcgal should fully support STC 89/90/10/11/12/15/8 series MCUs.)
下面來安裝 stcgal,推薦使用 Python3 和 pip3 來安裝 stcgal,執(zhí)行如下命令:
~ pip3 install stcgal
可能需要讀寫系統(tǒng)目錄的權(quán)限。
燒錄工具就安裝完成了。
燒錄程序
回到終端,接下來我們將之前編譯好的程序燒錄到單片機(jī)中,使用如下命令:
~/led stcgal -P stc89 -p /dev/tty.usbserial led.ihx
介紹一下這個(gè)命令:-P stc89 表明單片機(jī)型號,-p /dev/tty.usbserial 是我們上面查到的 USB 轉(zhuǎn)串口設(shè)備,led.ihx 就是我們之前編譯好的程序。
執(zhí)行完上面的命令后,終端會(huì)提示你給單片機(jī)重新上電:
Waiting for MCU, please cycle power:
終端會(huì)在這里等待,知道你把單片機(jī)重新上電后,會(huì)繼續(xù)執(zhí)行燒錄工作。重新上電后效果如下:
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
至此,一個(gè)簡單的跑馬燈程序,經(jīng)過編碼 -> 編譯 -> 燒錄后,成功的運(yùn)行在單片機(jī)上了。
注:
需要注意的是,sdcc 編譯器與 keil 的編譯器有微小的區(qū)別,在寫代碼的時(shí)候有幾個(gè)地方需要不同的寫法,這個(gè)網(wǎng)上搜索一下就可以了解到。
---End