目錄
- 一、SDCC(Small Device C Compiler)編譯環境搭建
- 1.1、下載下傳
- 1.2、編譯
- 1.3、測試
- 二、Hex2Bin+指令行燒寫工具配置使用
- 2.1、下載下傳工具安裝配置
- 2.2、編譯+燒寫
- 連結
SDCC是一個小型裝置的C語言編譯器,該編譯器是标準C語言,可以編譯Intel MCS51架構的微處理器,也可以編譯STM8等常見MCU。我們要在linux上搭建STM8開發環境,首先要搭建SDCC編譯環境。
其首頁是:http://sdcc.sourceforge.net/ ,下面是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.
有兩個可供下載下傳的:
- 1) https://sourceforge.net/projects/sdcc/files/ <-- 需要自己編譯,有一定難度
- 2) http://sdcc.sourceforge.net/snap.php <-- 編譯好的,拿來即用
注: 對于選擇拿來即用的兄弟,可以直接跳過1.2節
如何編譯:
./config
可能會出現下面幾種錯誤(我也給出了解決辦法):
- 錯誤 1 、缺少bison :
解決方法:configure: error: Cannot find required program bison.
sudo apt-get install flex bison
- 錯誤 2 、找不到adjacency_list.hpp
configure: error: boost library not found (boost/graph/adjacency_list.hpp).
sudo apt-get install libboost-date-time-dev libboost-program-options-dev libboost-system-dev libboost-filesystem-dev libboost-iostreams-dev
- 錯誤 3 、 沒有PIC14、PIC16裝置
failed for device/lib/pic14
./configure --disable-pic14-port --disable-pic16-port
直接下載下傳編譯好的需要将其按照說明放入系統bin等檔案中,采用編譯的會自動将其放入系統bin中。而我比較喜歡不讓其和系統的各種東西糾纏在一起,單獨放在工程下的一個叫tool的檔案裡,大不了用的時候輸全路徑!
如下,我在example目錄下建一個makefile和a.c檔案,将直接編譯好的sdcc檔案放在tool下面:
➜ SDCC_WS tree -L 2
.
├── example
│ ├── a.c
│ └── makefile
├── readme.md
└── tool
└── sdcc
其中a.c為 stm8 閃燈程式:
#include "stm8l.h"
int main() {
int d;
// Configure pins
PB_DDR = 0x20;
PB_CR1 = 0x20;
// Loop
do {
PB_ODR ^= 0x20;
for(d = 0; d < 29000; d++) { }
} while(1);
}
makefile為:
SDCC_PATH=../tool/sdcc
z_sdcc=${SDCC_PATH}/bin/sdcc
z_packihx=${SDCC_PATH}/bin/packihx
a.hex:a.c
${z_sdcc} -lstm8 -mstm8 --out-fmt-ihx a.c
${z_packihx} a.ihx > a.hex
clean:
rm -rf *.asm *.lst *.mem *.rst *.lnk *.rel *.sym *.ihx *.hex *.map *.lk *.bin
理論上hex也能燒寫,但是hex比bin要大一些,是以我們用這裡用bin燒寫。hex轉bin要用到一個Hex2Bin工具,将其下載下傳下來解壓到tool目錄下;stm8單片機燒寫工具需要用一個github開源軟體stm8flash,也将其下載下傳到tool目錄下:
➜ stm8_linux_tool git:(master) tree -L 2
.
├── app
│ ├── app_stm8_peri_blinky
│ └── app_stm8_peri_uart
├── bin
├── build
│ ├── makefile
│ └── tools.mk
├── readme.md
└── tool
├── Hex2bin-2.5
├── Hex2bin-2.5.zip
├── sdcc
├── sdcc.zip
└── stm8flash
9 directories, 5 files
将makefile改為:
-include tools.mk
z_sdcc=${SDCC_PATH}/bin/sdcc
z_sdld=${SDCC_PATH}/bin/sdld
z_packihx=${SDCC_PATH}/bin/packihx
z_hex2bin=${HEX2BIN_PATH}/hex2bin
z_stm8flash=${STM8FLASH_PATH}/stm8flash
files_temp=*.asm *.lst *.rst *.rel *.sym *.ihx *.hex *.map *.lk *.bin *.cdb
build:
$(z_sdcc) -lstm8 -mstm8 --out-fmt-ihx $(CFLAGS) $(LDFLAGS) $(APP_PATH)/$(PROJECT)/*.c
${z_packihx} *.ihx > $(PROJECT).hex
${z_hex2bin} $(PROJECT).hex
mv -f $(files_temp) $(BIN_PATH)
clean:
rm -f $(BIN_PATH)/*
flash:
echo "00 00 ff 00 ff 00 ff 00 ff 00 ff" | xxd -r -p > factory_defaults.bin
$(z_stm8flash) -c stlinkv2 -p stm8s103?3 -s opt -w factory_defaults.bin
$(z_stm8flash) -c stlinkv2 -p stm8s103?3 -w $(BIN_PATH)/*.ihx
rm factory_defaults.bin
進入
build
目錄運作
make build PROJECT=app_stm8_peri_blinky
,自動編譯:
輸入make flash 進行燒寫:
注:有些晶片被鎖起來了,是以要在 flash 前多加一個解鎖的指令:
echo "00 00 ff 00 ff 00 ff 00 ff 00 ff" | xxd -r -p > factory_defaults.bin
$(z_stm8flash) -c stlinkv2 -p stm8s103?3 -s opt -w factory_defaults.bin
最終效果是下面一個 stm8 最小開發闆上的紅色燈珠快速閃爍:
- 本文 GITHUB 位址:https://github.com/nbtool/stm8_linux_tool
- stm8 PROGRAMMING USING SMALL DEVICE C COMPILER (SDCC):GO
- SDCC WiKi:https://sourceforge.net/p/sdcc/wiki/Home/
- 在Linux下搭建51單片機的開發燒寫環境:GO
- Getting started with STM8 Development Tools on GNU/LINUX GO
- How to Program STMicro STM8S $1 Board in Linux GO
- Разработка для STM8 под Linux GO
- Fun and games with the STM8 on Linux GO
- stm8af5288: Can't flash GO
: ** 我做了一系列全自動建構編譯環境的工程,目前可以覆寫:51單片機、stm8、esp8266、esp32、nrf51822、nrf52832、android,歡迎到我的 nbtool github 下交流:https://github.com/nbtool **