51单片机-在Mac搭建环境sdcc+stcgal
- 主要内容
- 搭建开发环境
- 安装SDCC
- 安装stcgal
- 安装USB转串口驱CH341_MAC
- 实例代码Demo_Cycle.c
- 编译代码
- 烧录程序
- Makefile编写
搭建开发环境
Mac系统版本: MacOS Catalina
USB转串口: CH340/341
单片机型号: STC90C52RC
安装SDCC
简介
SDCC是什么?其实sdcc就是一个提供
优化标准 C (ANSI C89, ISO C99, ISO C11)
的编译器套件。知道这么多已经够了,内部兼容多种单片机的编译。
在Mac使用包管理工具安装sdcc
192:~ ichabodcrane$ brew install sdcc
安装完成后可以用以下命令查看:
192:~ ichabodcrane$ sdcc -v
SDCC : mcs51/z80/z180/r2k/r3ka/gbz80/tlcs90/ez80_z80/ds390/pic16/pic14/TININative/ds400/hc08/s08/stm8/pdk13/pdk14/pdk15 4.0.0 #11528 (Mac OS X x86_64)
published under GNU General Public License (GPL)
如果出现以下版本信息则安装成功。
安装stcgal
stcgal是一款烧录工具,还有一个叫stcflash,但是我们使用stcgal就行了,stcgal比stcflash更强大。
安装stcgal
需要依赖Python 3.2
以上版本,所以需要先安装Python 3.x
,安装完后,我们就可以使用以下命令安装stcgal
pip3 install stcgal
安装USB转串口驱动CH341_MAC
这个就非常简单了,下载地址点击进入即可CH341SER_MAC_ZIP,解压后,按照README.pdf操作即可。
安装完成后,用USB连接电脑,使用以下命令查看是否有串口出现
ls /dev/cu.wchusbserial*或 ls /dev/cu.*
192:~ ichabodcrane$ ls /dev/cu.*
/dev/cu.Bluetooth-Incoming-Port /dev/cu.wchusbserial1410
/dev/cu.usbserial-1410
注意:在10.15.x
以上版本可能会出现安装驱动后,连接USB使用以上方法查看不到串口的情况。如果出现这种情况请根据以下方法操作,如果正常可以忽略
- 按住电源键重启,立即按住
Command+R
进入Recovery
模式。- 在菜单上选择,打开
Terminal
控制台。- 运行命令:
csrutil enable --without kext
- 输入:
reboot
- 系统重启后,访问CH341SER_MAC_ZIP下载驱动、安装即可。
上面搭建环境都弄好后,我们就可以编码了,然后使用sdcc编译此代码看看效果。
实例代码Demo_Cycle.c
#include <8052.h>
#define uint_8 unsigned int
uint_8 len = 8;
void delay_ms(uint_8 ms);
void main()
{
uint_8 i;
while (1)
{
P0 = 0xff;
for (i = 0; i < len; i++)
{
P0 = P0 >> 1;
delay_ms(100);
}
P0 = 0xff;
for (i = 0; i < len; i++)
{
P0 = P0 << 1;
delay_ms(100);
}
}
}
void delay_ms(uint_8 ms)
{
uint_8 i, j;
for (i = ms; i > 0; i--)
for (j = 110; j > 0; j--)
;
}
编译代码
如果编译没有任何报错,就代表编译通过了。
sdcc Demo_Cycle.c
然后在文件相同路径下会多出几个以下文件,我们主要用到的是.ihx
和.hex
的文件
Demo_Cycle.asm Demo_Cycle.lst Demo_Cycle.map Demo_Cycle.mem Demo_Cycle.rel Demo_Cycle.rst Demo_Cycle.sym Demo_Cycle.lk Demo_Cycle.ihx
烧录程序
stcgal -P stc89 -p /dev/cu.wchusbserial1410 Demo_Cycle.ihx
终端会在这里等待,直到你把单片机重新上电后,会继续执行烧录工作。重新上电后效果:
~ ichabodcrane$ stcgal -P stc89 -p /dev/cu.wchusbserial1410 Demo_Cycle.ihx
Waiting for MCU, please cycle power: done
Target model:
Name: STC90C52RC
Magic: F022
Code flash: 8.0 KB
EEPROM flash: 6.0 KB
Target frequency: 11.950 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: 230 bytes (Intel HEX)
Switching to 19200 baud: checking setting testing done
Erasing 2 blocks: done
Writing flash: 640 Bytes [00:00, 1585.57 Bytes/s]
Setting options: done
Disconnected!
Makefile编写
因为命令行每次都要输入比较麻烦,我们可以编写Makefile
文件使用make命令做编译、烧录和清理。这里不对Makefile语法做相关介绍,有兴趣可以到网上查询相关信息,以下是一个简单的单文件Makefile
文件:
CC = sdcc # 编译工具
CLEAN_SUFFIXS = .asm .lst .map .mem .rel .rst .sym .lk .hex .ihx # 生成的后缀文件,烧录完后清除
stctool = stcgal # 烧录工具
protocol = stc89 # stc89型号
upload_port = /dev/cu.wchusbserial1410 #串口
badu = 9600 #波特率
# 编译
%.rel: %.c
$(CC) -c $<
# 编译输出.hex文件
%.hex: %.rel
@echo "编译中......"
$(CC) $< -o $@
@echo "开始烧录程序......"
$(stctool) -b $(badu) -P $(protocol) -p $(upload_port) $@
@echo "清除文件...."
make clean
#清理编译文件
clean:
RM $(foreach i, $(CLEAN_SUFFIXS), *$(i))
只需要使用以下命令就能开始编译、烧录和清理的工作
make Demo_Cycle.hex
效果
~ ichabodcrane$ make Demo_Cycle.hex
sdcc -c Demo_Cycle.c
编译中......
sdcc Demo_Cycle.rel -o Demo_Cycle.hex
开始烧录程序......
stcgal -b 9600 -P stc89 -p /dev/cu.wchusbserial1410 Demo_Cycle.hex
Waiting for MCU, please cycle power: done
Target model:
Name: STC90C52RC
Magic: F022
Code flash: 8.0 KB
EEPROM flash: 6.0 KB
Target frequency: 11.952 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: 230 bytes (Intel HEX)
Switching to 9600 baud: checking setting testing done
Erasing 2 blocks: done
Writing flash: 640 Bytes [00:00, 1001.76 Bytes/s]
Setting options: done
Disconnected!
清除文件....
make clean
RM *.asm *.lst *.map *.mem *.rel *.rst *.sym *.lk *.hex *.ihx
最终运行后,在单片机上看到的是一个循环亮灯的效果,从高位开始到低位,再从低位到高位循环点亮。最后给出我的个人公众号:Micro码上有
,不定时更新分享单片机的一些知识,时间过得特别快,又是时候讲拜拜咯`。