author: hjjdebug
date: 2024年 11月 07日 星期四 15:23:40 CST
description: keil-C51 linux下开发小记
想了解一下学习型红外遥控器.
淘宝上买了一块开发版,资料还是挺全的. 有demo 代码,原理图. 视频教程。
cpu 是51单片机,型号为 STC8H3K64S2. 8bit,3K ram, 64K flash
其编译环境安装的是 c51v960a.exe, windows 下的集成环境keil uVision5
用它了解了一下红外遥控, 主要是51单片机便宜.
记录一下, 看看有没有机会再用51.
按照视频教程及所给环境,在windows下用keil-uVision5集成环境是完全没有问题的.
但这里我记录的是要独辟新径, 在linux 下开发C51
将环境改变为linux.
好处, 可以使用强大的linux 下工具, vim,emacs,来编辑代码.
用Makefile 来维护代码.
下面先安装编译器, 是开源编译器 GPL 发布. 没有所谓licence 问题.
1. 安装C51 编译器.
sudo apt install sdcc
sdcc 是small device c compiler, 有一套c51工具链
实例可参考 https://github.com/JackeyLea/C51.git
2. 编译
Makefile
$cat Makefile
file = main #文件名,需要在make时指定
all:
sdcc $(file).c #编译
packihx $(file).ihx > $(file).hex #格式转换
makebin -p $(file).hex > $(file).bin #格式转换
clean:
rm -rf *.asm *.lst *.mem *.rst *.lnk *.rel *.sym *.ihx *.hex *.map *.lk #清理文件
其中 sdcc, packihx, makebin 工具都是sdcc开发包中的工具.
2.1. copy 开发头文件
由于该开发版下文件都有
#include “STC8H.h” //主控芯片的头文件
所以需要从windows 环境下copy “stc8h.h” 头文件才能编译.
否则会有如下编译错误:
$make
sdcc main.c #编译
main.c:16:39: fatal error: STC8H.h: No such file or directory
compilation terminated.
main.c:1: warning 190: ISO C forbids an empty source file
make: *** [Makefile:4:all] 错误 1
stc8h.h 是下载工具,官方stc-isp-v6.91I.exe 通过添加单片机型号而生成的头文件.
stc 是深圳宏晶公司
isp 是in-system-program, 在线烧录. 通过一个usb-uart线烧录
2.2 copy 了 stc8h.h 头文件后还有问题. 那就是sfr 和 sbit 问题.
核心的差别可以这样描述
#ifdef __SDCC
#define SFR(reg, addr) __sfr __at(addr) reg
#define SBIT(reg, addr) __sbit __at(addr) reg
#else//Keil
#define SFR(reg, addr) sfr reg = addr
#define SBIT(reg, addr) sbit reg = addr
#endif //End of __SDCC
所以 将
sfr P0 = 0x80;
替换为
__sfr __at(0x80) P0;
将 sbit 用 __sbit 代替,
__sbit P00 = P0^0;
Initializer element is not a constant expression
sdcc 中要修改sbit 定义 为 __sbit, 同时不能用P0 而应该用 __at(0x80) ,如下示例. 编译通过
需要修改成:
__sbit __at(0x80)^0 P00 ;
需要把文件中的所有sfr, sbit 都修改为__sfr, __sbit 的定义形式.
3. 下载,
需要用厂家的ISP, 又与集成环境绑定了. linux如何下载估计需要厂家支持或者破解写工具.
4. 调试:
调试还是需要上板, uVision IDE 固然很好,
直接烧录程序,用串行口调试也可以,相当于printf 调试。
5、ucsim simulator
这是软件仿真器
6、sdcdb debugger
这个是代码调试器
软件仿真与调试没有使用. 毕竟当时有板子了. 以后再搞51再说吧.
主要是在windows 下搞过学习型红外遥控,让学习芯片记录下按键编码, 通过串口发送给上位机(pc机)保存结果.
启动时, pc机把结果通过串口发送给开发机. 使开发机具有了外发编码的能力,实现了学习红外遥控的功能.
目的: 以后再搞51就用linux 来搞了. 因为linux 下编写,编译真的是太爽了!
参考:
sdcc 的官方网站
https://adamsq.github.io/blog/tags/%E5%B5%8C%E5%85%A5%E5%BC%8F/