树莓派4裸机基础教程:环境搭建
- 1.文章目的
- 2.树莓派4B的硬件配置
- 3.第一个基础工程构建
- 3.1 环境准备
- 3.2 源代码下载
- 3.3 代码编译与程序下载
- 3.4 树莓派硬件链接
- 4.优化调试手段
- 4.1 修改sd卡文件中的config.txt文件
- 4.2 修改网络环境
- 4.3 修改代码的链接地址
- 5.小结
1.文章目的
树莓派4作为一款学习嵌入式arm开发的开发板,是非常不错的选择。嵌入式开发往往需要的不仅仅是理论知识,还需要动手操作,然后实际体验效果。由于目前开发板要么资料太少,要么板子太贵,或者可玩性太低,所以嵌入式的入门和深入一直都是非常困难的问题。我写树莓派4裸机基础教程、树莓派4驱动进阶、树莓派4的RTOS这一些列的文章,也是希望借此机会,和大家分享一下嵌入式开发过程的方方面面,也希望对学习嵌入式感兴趣的人在阅读完成这些文章中会有所收获。由于树莓派4的外设,相对于前代的树莓派2、树莓派3等标准许多,完全可以作为学习嵌入式,学习arm编程的不错选择。所谓万变不离其宗,学会树莓派4的嵌入式开发,以后做其他的芯片的底层开发时,也是可以借鉴这种思想的。
写这些东西的目的全凭自己的兴趣爱好,在工作之余培养自己的文档写作能力与专业技能,如果有涉及到不正确的观点和知识点的地方还请多多指教。
2.树莓派4B的硬件配置
树莓派4b的性能非常强,运行Android和win10也毫无压力。性能强大,但是价格却非常的低,是一款学习嵌入式开发、学习arm开发的非常不错的开发板。
- 1.5GHz 4核心64位 ARM Cortex-A72 CPU (~3×倍性能)
- 1GB/2GB/4GB LPDDR4 SDRAM 内存
- 全吞吐量千兆以太网
- 双频 802.11ac 无线网络
- 蓝牙 5.0
- 两个 USB 3.0 和两个 USB 2.0 接口
- 双显示器支持,分辨率高达 4K
- VideoCore VI 显卡,支持 OpenGL ES 3.x
- HEVC 视频 4Kp60 硬解码
- 完全兼容早期的树莓派产品
3.第一个基础工程构建
嵌入式代码编译开发一般是两种,一种是通过IDE进行编译、下载、调试。这种开发的方式比较简单,对环境配置的要求很低,只需要安装IDE需要的环境即可。这种开发方式在开发单片机、中低端性能的芯片比较常见。另外一种就是在命令行中输入相关的命令,需要自己手动的去写编译脚本。这种常见的就是在Linux的开发过程中。
树莓派程序的开发过程一般都没有IDE,都是直接用GCC,所以我在进行工程构建的时候,也会采用GCC在控制台输入的方式进行。工程构建就需要自己解决了。目前常用的自动化编译工具就是Makefile。由于当前的第一个项目的工程比较容易,所以当前可用采用Makefile进行项目工程的构建。
3.1 环境准备
在不同的平台上进行工程构建的时候,首先需要准备下面的环境:
1.arm交叉编译工具链
2.可用执行makefile的工具
交叉编译工具链arm-none-eabi-gcc-5.4.1
可以在官网上进行下载,也可以到网盘中下载:
链接:https://pan.baidu.com/s/1ad3d-pl4YbpgYrxKg6mX9g
提取码:f3cm
上述网盘中的gcc只适用于windows,如果是其他的系统,请自行下载arm的交叉编译工具链。
如果要在windows上使用make命令,可以下载msys2,上面集成了make的环境。
然后将交叉编译工具链加入到系统的环境变量中,同时打开msys64文件夹,修改msys2_shell.cmd
双击msys2_shell.cmd,打开窗口,确保输入arm然后按下tab键可以看到如下的画面
这样系统环境就准备完成了。
3.2 源代码下载
源代码工程已经在GitHub存在了,相关源码可以在如下地址中找到:
代码语言:javascript复制https://github.com/bigmagic123/raspi4-bare-metal.git
在arm/1.compilation_environment中可以看到相关的文件列表。
文件名 | 说明 |
---|---|
link.ld | 链接文件 |
main.c | 函数入口 |
Makefile | 编译规则文件 |
start.S | 初始化汇编代码 |
uart.c | 串口相关的代码 |
uart.h | 串口相关的头文件 |
该代码的功能是启动跳转到c代码去执行,然后串口输出hello world
程序。
3.3 代码编译与程序下载
上面两个步骤完成之后,在MSYS可以进入到工程目录,输入make直接编译即可。
可以看到生成了kernel7.img固件。该固件可以放到板子上运行。
3.4 树莓派硬件链接
树莓派4需要准备一张空的SD卡、一个串口线输出信息、一条TYPEC线供电。
首先需要将工程目录的sd_boot下面的文件放到空的SD卡目录中。然后将编译好的kernel7.img放到SD卡中即可。
接着将串口线连接到树莓派上。
接着打开串口,给开发板上电,可以看到串口的输出信息:
代码语言:javascript复制Hello world!
此时一个简单的裸机程序就执行起来了。
4.优化调试手段
上述过程已经搭建完成环境,并且可以看到串口输出信息了。但是由于每次编译固件后,需要将固件放到sd卡中去执行,这样操作比较的繁琐,不适合学习嵌入式开发。所以可以通过树莓派的uboot自动去tftp服务器中获取代码。具体的步骤如下:
4.1 修改sd卡文件中的config.txt文件
将config.txt中的文件改为如下:
代码语言:javascript复制enable_uart=1
arm_64bit=0
kernel_addr=0x8000
kernel=u-boot32.bin
core_freq=250
其实就是将kernel=kernel7.img
改为kernel=u-boot32.bin
。直接启动uboot。
4.2 修改网络环境
如果要开发板从tftp服务器上获取代码,可以将开发板设置的与pc机服务器在同一网段内。将网线插上路由器,开发板可以通过dhcp获取ip地址。
代码语言:javascript复制U-Boot 2020.07-rc1-g627e7ce (May 11 2020 - 19:26:54 0800)
DRAM: 1.1 GiB
RPI 4 Model B (0xb03112)
MMC: emmc2@7e340000: 0, mmcnr@7e300000: 1
Loading Environment from FAT... OK
In: serial
Out: serial
Err: serial
Net:
Warning: genet@7d580000 MAC addresses don't match:
Address in DT is dc:a6:32:95:c1:79
Address in environment is dc:a6:32:28:22:50
eth0: genet@7d580000
Hit any key to stop autoboot: 0
U-Boot>
按照如下步骤进行:
1.插上网线到路由器
2.设置环境变量
代码语言:javascript复制setenv bootcmd "dhcp 0x00200000 192.168.12.137:kernel7.img;dcache flush;go 0x00200000"
saveenv
需要注意的是192.168.12.137
为自己的电脑的ip地址。
3.电脑开启TFTP服务器
注意:
如果是开发板直连电脑的网线,这样设置是无效的,因为pc机上一般不支持dhcp服务器。必须设置静态ip地址。
然后开发板也需要给定一个ip地址。可以设置一个环境如下:
代码语言:javascript复制setenv ipaddr 10.1.1.100
saveenv
reset
其中10.1.1.100是开发板的ip地址,与服务器是在同一网段。
代码语言:javascript复制setenv bootcmd "tftp 0x00200000 10.1.1.88:kernel7.img;dcache flush;go 0x00200000"
saveenv
4.3 修改代码的链接地址
由于uboot的启动地址与裸机代码的地址不应该在一个地方,uboot的启动地址为0x8000,而裸机代码的地址现改为0x200000。
将该地址进行设置即可。
重新编译代码,开发板上电即可。可以看到串口打印出如下的信息。
这样每次开发板上电后,都会从tftp服务器上去获取代码执行。如果此时给树莓派的供电线加上一个电源开关,这样这样就能够非常方便高效的调试代码了。
5.小结
本文主要介绍树莓派裸机开发的步骤。嵌入式开发过程中,环境搭建往往十分的重要,一个好的开发环境,一个高效的验证思路可以大大的节省开发时间。所以说,工欲善其事、必先利其器。想要学好嵌入式开发,学会利用各种工作,让自己的工作效率加倍十分的重要。通过上述的文章描述,嵌入式的前期的基本环境可以搭建好,同时也可以理解系统的启动过程。我觉得,万事开头难,只有迈出了第一步,其实写起代码也就没什么太大的难度了。
- END -