51单片机-在Mac搭建环境sdcc+stcgal

2020-05-06  本文已影响0人  Dreams小程序插件
  • 主要内容
    • 搭建开发环境
    • 安装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使用以上方法查看不到串口的情况。如果出现这种情况请根据以下方法操作,如果正常可以忽略

  1. 按住电源键重启,立即按住Command+R进入Recovery模式。
  2. 在菜单上选择,打开Terminal控制台。
  3. 运行命令: csrutil enable --without kext
  4. 输入:reboot
  5. 系统重启后,访问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码上有,不定时更新分享单片机的一些知识,时间过得特别快,又是时候讲拜拜咯`。

上一篇下一篇

猜你喜欢

热点阅读