赞
踩
写在前面:本文用于记录自己在zynq7020-串口开发上遇到的一些小问题,问题如何被解决的可以参考点这里,建议首先把本篇文章看完
使用串口IP的时候出现了,uboot可以启动,但是内核启动不了,启动就会被kill…如下图:
出现如图所示的问题,恭喜!你找到答案了,如果不是这个问题,下面的文章也就不用看了,(学习如何使用串口除外)。
解决办法:在vivado中将串口中断连线连接到PS中断连线上,不连接无法启动内核。。。。参考新建工程第二小节
如果在Q1没问题的基础上,出现这种问题,多半是设备树没有正确配置,加入串口IP后,系统默认串口是PL端的串口。
解决办法:参考生成系统第二小节。
工程中我使用的是:UART Lite,直接在vivado中搜索串口,会出现两个IP,如图所示。
选择本文所用的UART Lite,这两个IP的区别在于,UART 16550更加高级(具体自己查资料),因为我的项目使用UART Lite足够了。
新建工程说一句,尽量不要使用特殊的名字命名工程,最好不要用数字,因为后期做系统的时候稍微有些麻烦,尤其是产生fsbl文件的时候。可以采用如下:
>project_zynq
但尽量不要使用:
projject_zynq_V.1.20
1、PS配置自己需要的功能即可。(本文直接参考的正点原子7020教程,直接在他的工程上进行的修改,感谢!!!!)如图所示:需要网口的单独添加网口。这里删除了网口IP,如果需要直接参考最终连线图。
2、添加IP后,连线不需要我们手动,直接自动连接即可,IP如图所示。
注意此时发现IP核的中断端口并未连接,因此需要手动连接,如图:
注意:这里不连接,后期内核无法启动。。。。这就是问题核心所在。。。。,连接完成后如图所示。(这里我加入了网口,因为编程需要,所以添加单独的模块。。最好加上。。)
**IP核默认是9600波特率,**如果需要修改的,双击IP核打开直接修改。
全部连接完成后,点击运行分析,这里还需要分配管脚,先分析,完成再生产bitl流。
分配管脚:这里的管脚我是随便写的,根据需要自己修改…
点击生成hdf文件。。
最后导出hdf文件。输出在xxx.sdk文件夹下。
说明:在zynq上制作系统的方法有很多种,可以直接peatlinux,也可以单独来做。以下内容军参考正点原子ZYNQ7020linux开发教程-第20章,单独编译每个部分。教程文档最后有,需要的可以直接下载。
1、首先根据hdf文件,生成设备树等文件,具体按照教程走。在hsi中生成设备树的时候,会出现提示:如果前面没有连接串口IP 的中断引脚, 这里会提示一个警告:串口中断的引脚未连接。第一次遇到这个警告我没在意,结果这就是问题。必须连接这个中断到对应的控制器上
这一步会生成xxx.bit文件,将其重命名为system.bit
2、输入hsi命令后:
open_hw_design navigator_7020_wrapper.hdf
set_repo_path /home/liuyu/device-tree/device-tree-xlnx-xilinx-v2018.3
create_sw_design device-tree -os device_tree -proc ps7_cortexa9_0
generate_target -dir ./dts
close_sw_design device-tree
set hwdsgn navigator_7020_wrapper
set_repo_path /home/liuyu/embeddedsw/embeddedsw-xilinx-v2018.3
generate_app -hw $hwdsgn -os standalone -proc ps7_cortexa9_0 -app zynq_fsbl -compile -sw fsbl -dir ./fsbl
命令执行完成会生成设备树文件。如下图所示:将下图中的navigator_7020_wrapper.bit 修改成system.bit
进入到dts文件夹下。
首先修改system-top.dts。这里是另外的一个坑点,外加的串口IP,在zynq中默认是排在前面的,这就直接导致了,采用默认的设备树文件会导致系统默认串口的改变,下需要将system-top.dts的串口顺序换一下,修改后如下所示。
3、换好后将pl.stdi pcw.dtsi zynq_7000.dtsi system-top.dts文件复制到uboot:arch/arm/dts中,进行编译,首先生成u-boot可执行文件,将u-boot改成boot.elf,然后生成BOOT。
执行下面这条命令编译 u-boot:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16
编译完成之后得到 u-boot,将其重命名为 u-boot.elf,执行下面这条命令生成 BOOT.BIN 文件:
Navigator_7020.sdk这个位置需要更改
注意下面的工程路径也需要修改:
petalinux-package --boot -p /home/liuyu/petalinux/v2018.3/ALIENTEK-ZYNQ --fsbl /home/liuyu/hdf/TEST_TEST.sdk/fsbl/executable.elf --u-boot ./u-boot.elf -o ./BOOT.BIN --force
4、同样将上面几个文件复制到内核目录:arch/arm/boot/dts中,这里需要进一步修改设备树,加入ZYNQ的一些信息,
此时可以加入内核心跳led,指示系统是否正常运行,在调试过程中尤为重要,具体可以参考正点原子的linux开发教程第XXX页。
修改完设备树后,首先编译内核:这一步骤会生成zimage文件
这里需要注意,在内核中需要打开对应的饿串口端口支持。
执行下面这条命令编译内核出内核镜像文件 zImage:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage -j16
编译成功之后,zImage 内核镜像文件所在路径为 arch/arm/boot/zImage。
然后编译设备树: 这一步会生成system-top.dtb文件,并重命名为system.dtb
需要修改设备树。在 arch/arm/boot/dts文件夹下的system-top.dts,这就是最终的设备树,按照自己需要修改。
dts文件如下:
/* * CAUTION: This file is automatically generated by Xilinx. * Version: HSI 2018.3 * Today is: Tue Jun 1 10:09:12 2021 */ #define GPIO_ACTIVE_HIGH 0 #define GPIO_ACTIVE_LOW 1 /dts-v1/; #include "zynq-7000.dtsi" #include "pl.dtsi" #include "pcw.dtsi" #include <dt-bindings/interrupt-controller/irq.h> #include <dt-bindings/input/linux-event-codes.h> / { model = "Alientek ZYNQ Development Board"; chosen { bootargs = "console=ttyPS0,115200 earlyprintk root=/dev/mmcblk0p2 rw rootwait"; stdout-path = "serial0:115200n8"; }; aliases { ethernet0 = &gem0; ethernet1 = &gem1; i2c0 = &i2c0; i2c1 = &i2c1; serial0 = &uart0; serial1 = &uart1; serial2 = &axi_uartlite_0; spi0 = &qspi; }; memory { device_type = "memory"; reg = <0x0 0x40000000>; }; /* user-leds { compatible = "gpio-leds"; led@0 { label = "ps_led0"; gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>; linux,default-trigger = "heartbeat"; default-state = "on"; }; }; */ }; &gem0 { local-mac-address = [00 0a 35 00 1e 53]; }; &qspi { #address-cells = <1>; #size-cells = <0>; flash0: flash@0 { compatible = "n25q512a","micron,m25p80"; reg = <0x0>; #address-cells = <1>; #size-cells = <1>; spi-max-frequency = <50000000>; partition@0x00000000 { label = "boot"; reg = <0x00000000 0x00500000>; }; partition@0x00500000 { label = "bootenv"; reg = <0x00500000 0x00020000>; }; partition@0x00520000 { label = "kernel"; reg = <0x00520000 0x00a80000>; }; partition@0x00fa0000 { label = "spare"; reg = <0x00fa0000 0x00000000>; }; }; };
然后编译生成设备树文件。。。 这一步会生成system-top.dtb文件,并重命名为system.dtb
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- system-top.dtb
5、将上面的四个文件 system.bit BOOT zimage system.dtb 拷入SD卡,然后启动开发板。启动后可以选择是从SD加载根目录还是网络挂载,默认是SD卡。
步骤具体参考领航者 ZYNQ 之 Linux 开发指南20.7小节,
打开开发板,应该可以正常加载串口了;
如图就是PL端的串口,这个图片是我后期制作的,并不会当前工程的,但是名字大同小异的,都是ttyUL开头的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。