【笔记】MacOS上部署嵌入式开发环境

前言

在MacOS上编译针对于51单片机的C语言源代码,并将编译后的代码下载到单片机,本篇文章针对于Intel和Apple Silicon版本的Mac均有效

准备工作

安装编译器

1
brew install sdcc

安装驱动

  • CH34xVCPDriver.pkg

  • 安装成功后,可以通过ls /dev/tty.*ls /dev/cu.*命令验证

每个人的后缀通常不相同,例如我的第1个Mac雷雳接口后缀为10,第2个Mac雷雳接口后缀为110

1
2
3
4
5
6
7
8
9
# ls /dev/tty.*

/dev/tty.wchusbserial10
/dev/tty.usbserial-10

# ls /dev/cu.*

/dev/cu.wchusbserial10
/dev/cu.usbserial-10

安装下载器

  • 下载器grigorig/stcgal项目是用Python写的模块,所以需要有Python环境,使用Pip安装
1
pip3 install stcgal

代码编写

  • 单片机的源代码为C语言,C语言代码编辑器此处省略
  • Windows中编写的C51代码使用Keil编译器,Mac中编写的C51代码使用sdcc编译器编译
  • Keil中定义IO接口的值不允许使用二进制数(0b00000000),只能使用十六进制数(0x00),而sdcc编译器可以使用二进制数(0b00000000
备注 Windows Keil 语句或关键字 Mac sdcc 语句或关键字
定义头文件 reg51.hreg52.h 8051.h8052.h
定义IO端口 sbit P0^0; __sbit P0_0;
定义IO端口的默认变量 P2^0 P2_0
中断函数 void xxx() interrupt 1 {...}; void xxx() __interrupt 1 {...};
small存储模式下默认使用的存储类型,对应直接寻址方式 data __data
medium存储模式下默认使用的存储类型,对应8位的寄存器间接寻址 pdata __pdata
large存储模式下默认使用的储存类型,对应16位的寄存器间接寻址 xdata __xdata
用间接寻址的方式,可以访问ROM的高128位 idata __idata
将数据存储在ROM中,只能存储常量 unsigned char code xxx[] = {...}; __code unsigned char xxx[] = {...};
定义bit变量。51的位寻址区在内置RAM的0x20~0x2f区域,共128个位 bit __bit
定义特殊功能寄存器 sfr P0; __sfr P0;

关于at关键字的使用

  • 指定变量的存储地址,减少指针的使用
备注 Windows Keil 语句或关键字 Mac sdcc 语句或关键字
定义IO端口时使用地址 sbit P0^0 = 0x81; __sbit __at (0x81) P0_0;
定义特殊功能寄存器时使用地址 sfr P0 = 0x80; __sfr __at (0x80) P0;

编译

  • 通过编译得到.ihx文件,.ihx可以进一步转换为.hex文件和.bin文件

直接完成编译

1
sdcc <library>.c

先编译成链接库,再完成编译

  • 通常用于多模块的大项目,先将所有模块编译成链接库文件,再将所有链接库编译完成
  • 当部分模块被修改时,只需要先将修改的模块编译成新的链接库,再将其他模块的链接库与修改后模块的新链接库组合完成编译

<source>:C语言源代码文件

<source_1>:没有变动的源代码,通常编译成链接库链接库
<source_2>:有变动的源代码,通常与没有变动的源代码编译的链接库文件一起编译
<library>:链接库文件

1
2
sdcc -c <source_1>.c
sdcc <source_2>.c <library_1>.rel

ihx文件转换为hex文件(可选)

<file>:文件名

1
packihx <file>.ihx > <file>.hex

ihx文件转换为bin文件(可选)

1
sdobjcopy -I ihex -O binary <file>.ihx <file>.bin

编译后生成的文件

<file>:编译后的文件名

1
2
3
4
5
6
7
8
9
- <file>.asm
- <file>.ihx
- <file>.lk
- <file>.lst
- <file>.map
- <file>.mem
- <file>.rel
- <file>.rst
- <file>.sym

下载

  • 确保已经安装完驱动,电脑与单片机已经连接好并测试没有问题的情况下

-P auto:指定单片机类型

auto:自动判定

-p 端口:指定连接的端口

/dev/cu.wchusbserial10:如果单片机连接的是Mac的第一个接口,那么通常后缀为10
/dev/cu.wchusbserial110:如果单片机连接的是Mac的第二个接口,那么通常后缀为110

<file>.ihx:编译后的文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
stcgal -P auto -p /dev/cu.wchusbserial10 <file>.ihx

# 以下是输出内容
Waiting for MCU, please cycle power: # 当出现这句话时将单片机复位

# 以下是完成复位后的输出内容
Waiting for MCU, please cycle power: done
Protocol detected: stc12
Target model:
Name: STC12C5A60S2
Magic: D17E
Code flash: 60.0 KB
EEPROM flash: 2.0 KB
Target frequency: 11.952 MHz
Target BSL version: 7.1I
Target options:
reset_pin_enabled=True
low_voltage_reset=False
oscillator_stable_delay=32768
por_reset_delay=long
clock_gain=high
clock_source=external
watchdog_por_enabled=False
watchdog_stop_idle=True
watchdog_prescale=256
eeprom_erase_enabled=False
bsl_pindetect_enabled=False
Loading flash: 106 bytes (Intel HEX)
Switching to 19200 baud: testing setting done
Erasing 2 blocks: done
Writing flash: 640 Bytes [00:00, 1904.60 Bytes/s]
Finishing write: done
Setting options: done
Target UID: D17EC5F0102FD9
Disconnected!

完成

参考文献

博客园——俺踏月色而来
SDCC官网
简书——SyunSiu
CSDN——下一站2381
百度知道——一天入门51单片机
知乎——charlee
CSDN——_Sirius