Lab3: 体验嵌入式
IMPORTANT
开始 Lab3 前请确保提交了 Lab2,请使用 git commit --all
进行提交
使用 git pull
更新任务仓库
你可能需要使用 git pull --rebase
来处理分支冲突
快速安装
part1 基础配置的相关配置我已经写好了插件,不过还是建议一步一步配置下去,这样才能快速了解环境,下次换台电脑也能很快的配置好环境
安装文件放在./install 文件夹中
./install/install.sh
一键安装,编译,和烧录 在烧录之前记得检查一下串口设备有没有接入
ls /dev/ttyUSB*
假如出现
$ls /dev/ttyUSB*
ls: 无法访问 '/dev/ttyUSB*': 没有那个文件或目录
2
那检查一下在哪一步出现了问题,可以仔细阅读基础配置
假如出现
$ls /dev/ttyUSB*
/dev/ttyUSB0
2
干的漂亮,没出现报错的话就能跳过基础配置,直接开始任务吧
虚拟 51 单片机工具安装
很遗憾,我们没有那么多资源购置人手一块的芯片,大家也暂时不会深入研究硬件相关的内容 假如大家不想要购置实体的板材的话,这里还有一款工具用来虚拟 51 单片机 具体的程序以及安装说明放在了./emu 目录下 请阅读 ./emu8051/README.md
并完成编译 之后的 task 需要使用这个虚拟工具
任务
任务 1
请移步到 ./tasks
文件夹 将三个.ihx 文件放置到 emu8051 文件夹中 即可执行文件 emu 的同目录下 这里会有三份程序源码以及三个十六进制文件,你需要做的就是通过烧录之后的现象,给他们进行配对. 请将答案填写到 ./AnswerSheet.md
中
任务 2
看出来了吧,task1.c 是一段呼吸灯的代码。不过他并不完善,他只能呼气不能吸气 请在终端中使用指令 copy 一份 task1.c
, 将其命名为 task3.c
, 完善呼吸灯之后对其进行编译,烧录到单片机中
TIP
编译代码 sdcc -mmcs51 taskx.c
烧录代码 stcgal -p /dev/ttyUSB0 -b 115200 taskx.ihx
任务文件放在./task 文件夹中
答题卡是./AnswerSheet.md
附加部分 基础配置
实体器件所需材料:一块 stc89c52rc 芯片,一个 USB-TO-TTL (CH340),4 根公对母杜邦线,2 根跳线,2 个 10uF 的电容,2 个 33pF 的电容,1 个 10kΩ 的电阻,1 个 4.7kΩ 的电阻,以及一个 1kΩ 的电阻,最后再来一个发光二极管.
使用 51 仿真器无需准备材料
试试看按照电路图进行连线吧,LED 正极接在 VCC, 负极接在 P2_0, 别忘了串联上电阻哦 (这里两个电阻并联意思是 100Ω 和 1kΩ 都可以)
配置 sdcc
在 ubuntu 上搭建 51 单片机的开发环境,会被 windows 稍微麻烦一些,但是只要坚持下去,把环境配好,你在 linux 能学到一些不一样的知识.
配置 sdcc 会遇到很多小小的问题,让我们来一一解决
进行解压
bashmkdir ~/tmp tar -xvjf sdcc-src-4.4.0.tar.bz2 -C ~/tmp cd ~/tmp/sdcc-4.4.0
1
2
3运行./configure
bash./configure
1期间也许你会遇到各种各样的问题,不过没关系,借助强大的搜索软件和 gpt, 聪明的你一定会想出合理的解决方法,配置环境本身也是锻炼自身能力的一部分.
这里就简单列出一些常见问题吧,有问题可以谷歌,实在不行还可以带上你的日志,问一下你的牛马学长哦.
bash#一般来说,问题都会出现在输出内容的最后 #就比如说 configure:error: Cannot find required program bison #这段报错指的是你可能没有安装bison这个库,简单装一下就行 sudo apt update sudo apt install bison #################################### #或者是这段报错 configure: error: boost library not found (boost/graph/adjacency_list.hpp). #你只需要输入 sudo apt install libboost-all-dev #################################### #或者说是这个 configure:error: Cannot find required program flex #你只需要输入 configure:error: Cannot find required program bison #Sorry,黏贴错了,应该是这个 sudo apt install flex #################################### #我碰到的唯一比较难办的就是这段报错 failedfor device/lib/pic14 #解决方法也很简单把输入的指令做一下更改就行 ./configure --disable-pic14-port--disable-pic16-port #反正只要报错,问gpt,问google都没问题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24当处理完 configure 的报错之后,就可以进行下一步的操作了
bashsudo make install
1最后,在验证一下安装是否成功
bashsdcc --version
1假如你输出的是这样的界面
bashsdcc --version SDCC : mcs51/z80/z180/r2k/r2ka/r3ka/sm83/tlcs90/ez80_z80/z80n/r800/ds390/TININative/ds400/hc08/s08/stm8/pdk13/pdk14/pdk15/mos6502/mos65c02 TD- 4.4.0 #14620 (Linux) published under GNU General Public License (GPL)
1
2
3那进行下一步吧
尝试编译 先尝试随便建一个工程,就比如说 main.c
```c #include <8052.h> void delay100ms() //@11.0592MHz { unsigned char i, j; i = 180; j = 73; do { while (--j); } while (--i); } void main() { while(1) { P2_0 = !P2_0; delay100ms(); } } ``` 编写完成后,`Ctrl+Alt+T`打开控制台,再cd到main.c的目录,输入 ```bash sdcc -mmcs51 main.c ``` 这个时候跳出了一大堆文件 ```bash mayge@mayge:~/Desktop/tmp $ls main.asm main.ihx main.lst main.mem main.rst main.c main.lk main.map main.rel main.sym ``` 接下了,我们需要使用的就是main.ihx文件
配置 stcgal (使用 51 仿真的话请跳过)
在上一节,我们获得了需要烧录的文件 main.ihx
, 那我们怎么将其转移到我们的单片机中呢,我们就需要配置烧录工具,最简单的就是 stcgal, 不过它只能烧录 stc 系列的一些单片机,对于 stm32 这类单片机,就需要另外的解决方法了.
打开终端输入
bashpip3 install stcgal
1验证安装
bashstcgal -h
1然而在我们检查串口设备的时候,却出现了一些意外
bashmayge@mayge:~/Desktop ls /dev/ttyUSB* ls: 无法访问 '/dev/ttyUSB*': 没有那个文件或目录
1
2
3这就奇怪了,明明我们已经接上了我们的串口驱动程序,可是为什么仍然检测不到呢?
bashmayge@mayge:~/Desktop/tmp $sudo dmesg | grep -i ch34 [ 3109.998639] usbcore: registered new interface driver ch341 [ 3109.998653] usbserial: USB Serial support registered for ch341-uart [ 3109.998663] ch341 1-2.1:1.0: ch341-uart converter detected [ 3110.010320] usb 1-2.1: ch341-uart converter now attached to ttyUSB0 [ 3110.591802] usb 1-2.1: usbfs: interface 0 claimed by ch341 while 'brltty' sets config #1 [ 3110.595796] ch341-uart ttyUSB0: ch341-uart converter now disconnected from ttyUSB0 [ 3110.595811] ch341 1-2.1:1.0: device disconnected [ 3658.565668] ch341 1-2.1:1.0: ch341-uart converter detected [ 3658.575821] usb 1-2.1: ch341-uart converter now attached to ttyUSB0 [ 3659.520808] usb 1-2.1: usbfs: interface 0 claimed by ch341 while 'brltty' sets config #1 [ 3659.523783] ch341-uart ttyUSB0: ch341-uart converter now disconnected from ttyUSB0 [ 3659.523826] ch341 1-2.1:1.0: device disconnected
1
2
3
4
5
6
7
8
9
10
11
12
13
14重新连接并查询 ttyUSB0 的历史连接状态,我们发现在接入的一瞬间 USB0 设备是成功连接上的,只是后来
brltty
这个服务打断了我们的连接.查询到
brltty
这个服务是用来控制盲文显示器的,我又不瞎,直接送它进小黑屋bash#停止 brltty 服务 sudo systemctl stop brltty #禁用 brltty 服务 sudo systemctl disable brltty #这里重新插入CH340设备 sudo dmesg | grep -i ch34
1
2
3
4
5
6bashmayge@mayge:~/Desktop/tmp $ls /dev/ttyUSB* /dev/ttyUSB0
1
2这就非常成功了
接下来我们进行烧写
bashmayge@mayge:~/Desktop/tmp $stcgal -p /dev/ttyUSB0 -b 115200 main.ihx
1不过很遗憾,又报错了
bashSerial port error: [Errno 13] could not open port /dev/ttyUSB0: [Errno 13] Permission denied: '/dev/ttyUSB0'
1但这次的报错处理起来还是很简单的,只需要给 ttyUSB0 赋一个较低的权限,我们的串口程序就能对其进行访问了
bashsudo chmod 666 /dev/ttyUSB0
1再次输入烧写指令,插拔 Vcc 引脚,就能开始烧录了
bashmayge@mayge:~/Desktop/tmp $stcgal -p /dev/ttyUSB0 -b 115200 main.ihx Waiting for MCU, please cycle power: done Protocol detected: stc89 Target model: Name: STC89C52RC/LE52RC Magic: F002 Code flash: 8.0 KB EEPROM flash: 6.0 KB Target frequency: 11.030 MHz Target BSL version: 6.6C 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: 118 bytes (Intel HEX) Switching to 115200 baud: checking setting testing done Erasing 2 blocks: done Writing flash: 640 Bytes [00:00, 7497.76 Bytes/s] Setting options: done Disconnected!
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这样我们就能看到单片机的现象啦