树莓派4裸机基础教程:环境搭建

2020-09-18 17:26:34 浏览数 (1)

树莓派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 -

0 人点赞