① labview FPGA模块中控制DIO板卡输出IO量控制继电器吸合,怎么实现IO量自动输出功能
第一步:使用Quartus和Qsys工具完成硬件系统的配置。
该步骤实现SOC最小系统的硬件配置,包括硬核处理器配置、HPS和FPGA之间通信接口总线的选择、HPS外设裁剪、HPS时钟配置和SDRAM配置。该实验中主要用到HPS硬核,以及PIO外设IP核。Qsys工具为用户提供硬件系统的可视化设计,能够自动生成handoff文件,该文件配合bsp-editor工具可以生成preloader。Preloader是HPS的第二阶段引导源,主要作用为:初始化SDRAM接口,配置HPS IO口,加载下一引导源并跳转到它。
实验步骤
1 新建Quartus工程。
1.1 设置工程存放路径,工程名以及顶层文件名,如图1所示。
图1
1.2 选择FPGA器件型号,如图2所示,DE10-Standard板载FPGA型号为5CSXFC6D6F31C6。
图2
1.3 点击next直到finish,未提及的页面均按默认设置即可。
2 在Qsys中配置SOC。
2.1 运行Qsys工具。
在Quartus软件中,通过菜单栏Tools->Qsys打开Qsys工具。刚打开的Qsys工具页面如图3所示。
图3
2.2 添加HPS并完成配置。
在左侧的IP目录中输入hps,选中Arria V/Cyclone V Hard Processor System,双击添加HPS,在弹出的HPS配置页面中进行HPS配置。HPS配置页面如图4所示。
图4
1) 在FPGA Interfaces页面中,General一栏均不勾选,AXI Bridges一栏设为64-bit、64-bit、32-bit,FPGA-to-HPS SDRAM Interface一栏中移除原有接口,Resets一栏中均不勾选。
2)在Peripheral Pins页面中,设置HPS外设引脚复用及模式选择。设置如表1所示。设置完成后页面如图5所示。(本实验其实未用到这些外设)
表1 外设引脚复用及模式选择
外设名称
引脚复用选择
模式选择
EMAC1
HPS I/O Set 0
RGMII
QSPI
HPS I/0 Set 0
1SS
SDIO
HPS I/0 Set 0
4-bit Data
USB1
HPS I/0 Set 0
SDR
UART0
HPS I/0 Set 0
No Flow Control
(注:表中未提及的外设即Unused,无需设置)
图5 Peripheral Pins页面设置
在HPS Clocks页面中,确认下Input Clocks->External Clock Sources 中的时钟频率为25MHz,其它无需设置,默认即可。
在SDRAM页面中,参考图6-11更改该页面下所有子页面中的参数。(本实验未用到SDRAM,所以不设置也可)
图6
图7
图8
图9
图10
图11
5) 至此,HPS设置完毕,点击finish离开HPS设置页面。
2.3 添加并设置其它Qsys元件
本实验通过HPS控制FPGA部分的IO口,以此来控制连接在FPGA IO引脚LED灯的亮灭。所以整个SOC只需包含HPS和PIO,即Qsys中还需要添加PIO外设。
添加PIO外设。在IP目录中输入PIO,选中PIO双击添加外设,设置页面如图12所示,本实验通过PIO控制4个LED,故宽度为4。
图12
2.4 配置Qsys系统元件
修改元件名称。本实验把pio_0重命名为led_pio。
导出外设的顶层I/O接口。在Export一栏下相应位置双击,导出led_pio的顶层I/O接口,命名为fpga_led_pio,导出hps_0的h2f_reset接口,命名为hps_0_h2f_reset,如图13所示。
图13
连接Qsys外设接口。外设的接口信号之间没有连接,需要根据系统要求手动进行连接。各个外设之间的信号连接c如表2所示。连接好后如图14所示。
表2 元件信号连接关系
需要连接的
被连接的
元件
信号名
元件
信号名
led_pio
clk
clk_0
clk
reset
clk_0
clk_reset
s1
hps_0
h2f_lw_axi_master
hps_0
h2f_lw_axi_clock
clk_0
clk
h2f_lw_axi_master
led_pio
s1
图14
4)配置Qsys的地址映射。Qsys中添加的元件及外设都需要分配对应的基地址。这里我们采用自动分配的方式,在Qsys菜单中选择System->Assign Base Address,完成基地址自动分配。
5)生成Qsys系统。Save保存Qsys文件,命名为soc_led.qsys。然后点击菜单Generate->Generate HDL,弹出如图15设置框,按图设置好后点击Generate,Qsys将生成与硬件系统相关的一系列文件。
图15
3 完成Quartus工程编译
3.1 在Quartus工程中添加Qsys产生的系统模块。
1)Quartus中点击菜单Assignments->Settings,弹出设置框,选中左侧Files一栏,添加Qsys文件soc_led.v和soc_led.qip,添加完成后如图16所示。
图16
2)新建顶层文件。本实验采用的顶层文件类型为bdf(Block Diagram/Schematic File)。点击菜单File->New,选择Design Files中的Block Diagram/Schematic File后点击OK,点击菜单File->Save As将该文件保存到工程目录下,命名为top.bdf。在该原理图空白处右键Insert->Symbol,选择Qsys生成的soc_led.bsf,将该模块插入到顶层原理图文件中。选中插入的元件,右键点击Generate Pins for Symbol Ports,为元件添加输入输出端口,如图17所示。
图17
3.2 工程分析综合后分配引脚
完成以上步骤后,需要分配引脚,包括HPS外设默认引脚分配以及FPGA部分引脚分配,在分配引脚之前,工程必须通过分析综合,否则引脚分配会出错。
图18
然后按2)所示Tcl Scripts工具执行上面编写的脚本,完成FPGA部分LED引脚的分配。
3.3 工程编译。
完成以上所有操作后,可以点击菜单Processing->Start Compilation对工程进行完全编译。编译成功后会生成FPGA编程所需的.sof文件。
4 完成FPGA编程。
这里只介绍采用JTAG方式完成FPGA编程方式,注意这种方式下,FPGA编程电路断电后就丢失。
点击菜单Tools->programmer,打开编程工具,选择连接至计算机的DE10开发板,如图19所示。Close硬件设置框。编程页面中Mode选择JTAG,点击Auto Detect按钮,在弹出的器件选择框中选择相应的器件型号,DE10-Standard板载FPGA型号应选择5CSXFC6D6。选中FPGA设备,点击Change FIle,选中编译生成的top.sof文件,如图20所示。然后勾选Program/Configure,如图21所示。最后点击Start按钮开始编程。
图19
图20
图21
实验细节注意:
在分配引脚之前必须先对工程进行分析综合(Analysis and Synthesis)
第二步:使用SOCEDS完成HPS软件开发
说明:
该步骤完成HPS软件部分的开发,SOC EDS提供了全套的软件开发工具。本实验只是通过HPS控制FPGA部分的IO口,系统架构简单,采用裸机开发方法。DS-5为SoC FPGA裸机开发提供了两套编译工具:ARM Compiler 和 Altera Baremetal GCC。本实验采用ARM Compiler。
实验步骤
1 运行软件开发工具DS-5。
打开Embedded_Command_Shell.bat,输入eclipse &命令回车,打开DS-5开发软件。如图1所示。 DS-5界面如图2所示。
图1
图2
2 新建C Project
点击菜单File->New->C Project,弹出工程配置框如图3所示,按图完成设置,注意编译工具链选择ARM Compiler 5
图3
3 工程编译选项设置
3.1 添加HWLIB路径
因为本实验用到了SOC EDS提供的HWLIB中的API访问硬件,所以要在项目编译选项中添加HWLIB路径。HWLIB所在路径为:<SOC EDS安装路径>ipalterahpsaltera_hpshwlibinclude 和 <SOC EDS安装路径>ipalterahpsaltera_hpshwlibincludesoc_cv_av
操作:在DS-5左侧的Project Explorer中选中LedWater工程,右键点击Properties。弹出的对话框按图4设置,完成HWLIB路径的添加。
图4
3.2为工程编写分散文件scatter。
scatter文件为连接器指定映像的内存映射。本实验中,映像文件的加载区和执行区都在HPS的片内RAM上,而HPS片内RAM的地址映射为0xFFFF0000-0xFFFFFFFF,所以编写分散文件内容如下,分散文件编写完成后添加到编译选项中。
OCRAM 0xFFFF0000 0x1000
{
APP_CODE +0
{
*(+RO, +RW, +ZI)
}
ARM_LIB_STACKHEAP 0xFFFF8000 EMPTY 0x8000
{}
}
操作:点击菜单File->New->Other,弹出对话框,按图5操作。打开新建的scat文件,输入上面的分散文件内容。在DS-5左侧的Project Explorer中选中LedWater工程,右键点击Properties。弹出的对话框按图6设置,完成scat文件路径的添加。
图5
图6
4 生成硬件设备描述头文件。
利用SOC EDS提供的swinfo2header工具,将Qsys硬件系统信息转换为软件开发所需的设备描述头文件。
操作:在嵌入式命令行shell中cd到soc_led.sopcinfo所在目录,然后输入如下命令:sopc-create-header-files soc_led.sopcinfo --single hps_0.h --mole hps_0如图7所示,同目录下将会生成名为hps_0.h的头文件,将其拷贝至软件工程目录下。
图7
5 编写main.c
为工程新建main.c文件,输入main.c代码,代码如下:
#include "hwlib.h"
#include "socalsocal.h"
#include "socalhps.h"
#include "hps_0.h"
void delay(int delay_time)
{
int k;
for(k=0; k<delay_time; k++) ;
}
int main()
{
int i = 0x1;
while(1)
{
alt_write_word( ALT_LWFPGASLVS_OFST+LED_PIO_BASE, i );
if( (i&0xf) == 0x8 ) i=0x1;
else
i = i<<1;
delay(100000000);
}
return 1;
}
6 工程编译连接
在DS-5左侧的Project Explorer中选中LedWater工程,右键点击Build Project,生成可执行文件ledWater.axf。
7 生成preloader
裸机工程中,preloader即u-boot-spl。在shell中输入bsp-editor启动工具,如图8所示。在打开的bsp-editor工具中,点击菜单File->New HPS BSP,选择handoff文件目录,如图9所示。设置中取消勾选WATCHDOG_ENABLE选项,如图10所示,因为我们没有在裸机应用程序中用到看门狗。设置完成后点击generate,产生我们设置的preloader源代码,生成的源代码路径显示在Information栏中。Shell中cd到preloadre源代码目录下,输入make -j8 (多线程编译提高编译效率),如图11所示,回车生成preloader二进制文件,需要等待几分钟。在<Quartuas工程目录>softwarespl_bspuboot-socfpgaspl目录下,可以看到已经生成了u-boot-spl二进制文件。将其拷贝至LedWater工程目录下。
图8
图9
图10
图11
8 编写调试脚本
为LedWater工程新建调试脚本,步骤如图12所示。打开新建的文件输入以下内容。
reset system
stop
wait 30s
set semihosting enabled false
loadfile "$sdir/u-boot-spl" 0x0
set semihosting enabled true
delete
tbreak spl_boot_device
run
wait
loadfile "$sdir/Debug/ledWater.axf"
Start
图12
完成以上所有操作后,工程目录应该如图13所示。
图13
9 工程调试。
1) 在进行工程调试前,首先要确保板卡连接至计算机,并先下载硬件sof文件至fpga。然后新建调试配置项,选中LedWater工程,右键选择Debug As->Debug Configurationz,弹出会话框,按图14和图15设置。设置完成后点击Debug开始调试。
图14
图15
2)进入调试页面后,如图16所示,点击红圈中Continue图标,开始运行main程序,DE10开发板上的4个LED灯依次循环点亮。
编写fpga部分的外设引脚分配脚本。根据硬件板卡的实际连接关系,编写引脚分配脚本,本实验用到DE10-Standard板卡上的4个LED,参考原理图,编写脚本如下:
set_location_assignment PIN_AA24 -to fpga_led_pio_export[0]
set_location_assignment PIN_AB23 -to fpga_led_pio_export[1]
set_location_assignment PIN_AC23 -to fpga_led_pio_export[2]
set_location_assignment PIN_AD24 -to fpga_led_pio_export[3]
set_location_assignment PIN_AF14 -to clk_clk
菜单点击Processing->Start->Start Analysis & Synthesis开始分析综合。
分析综合完成后,点击菜单Tools->Tcl Scripts,弹出脚本运行框,如图18所示。分别运行hps_sdram_p0_parameters.tcl和hps_sdram_p0_pin_assignments.tcl。
② zynq 如何写driver
步骤:
1. 首先在vivado SDK中分别建立两个工程
注意:如上图所示,Core0 工程建立时选择ps7_cortexa9_0, Core1 工程建立时选择ps7_cortexa9_1
完成后如下图所示:
2.配置Core1即从核中的BSP文件
在下图中画圈处,配置:-DUSE_AMP=1
3 配置Core0和Core1的DDR空间分配
通过修改lscript.ld文件中的内容,可以改变在存储器中的执行位置,
因为ELF文件是加载到DDR中执行的,所以两个DDR地址不能重合
Core0的配置 :画圈处 栈空间也要分配,防止溢出
Core1配置
4 建立FSBL文件,并配置mian()文件
配置main() 跟第三步中的DDR空间配置有关
在FSBL的src中找到main.c文件打开,在里面添加下面一段代码,用于启动CPU1:
#define sev() __asm__("sev")
#define CPU1STARTADR 0xFFFFFFF0 //Core1 DDR配置中的SIZE大小
#define CPU1STARTMEM 0x10000000 //Core1 DDR配置中的起始地址
void StartCpu1(void)
{
#if 1
Xil_Out32(CPU1STARTADR, CPU1STARTMEM);
dmb(); //waits until write has finished
sev();
#endif
}
将上面的代码在main()中添加到:
Load boot image的位置,将CPU1的启动函数,放置于此位置,改动后的代码段如下:
5 生成mcs文件和烧写mcs文件到QSPI Flash
单击‘Core1’,选择Xilinx Tools –> Create zynq boot image,选择Add,选择文件…/ Core1/Debug/ Core1.elf,点击打开。然后选择Core1.elf, Core0.elf在Core1.elf上面。然后在Output pach后面把boot.bin修改为Boot.mcs。然后点击 Create Image
选择Core0
选择文件生成存储地址
选择MCS
画圈处是添加的文件
顺序为:FSBL.elf .bit文件 Core0.elf Core1.elf
点击Create Image 生成.mcs文件
6 完成操作 将 .MCS 文件烧写进板子里
bin文件用来烧写到SD卡,mcs文件用来烧写到QSPI flash中 ,
选择Xilinx Tools –> Program Flash,在Image File后面选择刚才生成的Boot.mcs文件,Offset为0x0,Flash Type为qsip_single。勾选Blank check after erase和Verify after flash。检查开发板上电和连线状况,然后点击Program
③ devicetree的qspi flash怎么写
JFFS2是Flash上应用最广的一个日志结构文件系统。它提供的垃圾回收机制,不需要马上对擦写越界的块进行擦写,而只需要将其设置一个标志,标明为脏块,当可用的块数不足时,垃圾回收机制才开始回收这些节点。同时,由于JFFS2基于日志结构,在意外掉电后仍然可以保持数据的完整性,而不会丢失数据。 本文阐述如何在nand flash上实现JFFS2根文件文件系统。实验环境是:FS2410开发平台及ubantu7.04主机环境。 由于使用的ubantu7.04的环境没有安装制作JFFS2文件系统镜像的工具mkfs.jffs2,所以首先在Linux系统中安装mkfs.jffs2工具,安装的过程如下: 1.下载MTD工具包 本处使用的是mtd-snapshot-20050519.tar.bz2: farsight#tar –jxvf mtd-snapshot-20050519.tar.bz2 farsight#cd mtd farsight#./configure farsight#make farsight#make install 如果系统中没有安装ZLIB库,那么首先安装ZLIB库。具体的安装过程如下: farsight#tar –zxvf zlib-1.2.3.tar.gz farsight#cd zlib-1.2.3 farsight#./configure farsight#make farsight#make install 完成此步骤后,系统中就有了mkfs.jffs2的工具。注意:这个工具不同于mkfs.ext2工具,它只能制作相应的JFFS2文件系统的镜像,而不具有进行格式化的功能,而mkfs.ext2具备这以上两种功能。然后用这个工具就可以制作JFFS2文件系统的镜像了。 2、制作JFFS2文件镜像 实验平台用到的nand flash 是K9F1208,在制作镜像过程添加的参数需要和它对应。 farsight#mkfs.jffs2 -r /source/rootfs -o rootfs.jffs2 -e 0x4000 --pad=0x800000 -n 这样就会生成一个8M大小的rootfs.jffs2的镜像,它也正是JFFS2文件系统的镜像,关于这个命令行里的选项的内容,可以用man a mkfs.jffs2命令来查看内容。 JFFS2 维护了几个链表来管理擦写块,根据擦写块上的内容,一个擦写块会在不同的链表上。具体来说,当一个擦写块上都是合法(valid)的节点时,它会在 clean_list 上;当一个擦写块包含至少一个过时(obsolete)的节点时,它会在 dirty_list 上;当一个擦写块被擦写完毕,并被写入 CLEANMARKER 节点后,它会在 free_list 上。而当你在挂载这个文件系统的时候,如果出现CLEANMARKER node found at 0x0042c000 has totlen 0xc != normal 0x0的警告的时候,可以加一个“-n”的选项,这个主要是由于针对Nand Flash不需要在每个擦除块的开始写入CLEANMARKER 节点。 3、设置内核启动参数 本处用的bootloader是U-BOOT.所以在U-BOOT的命令终端设置如下: FS2410#setenv bootargs root=/dev/mtdblock/2 rootfstype=jffs2 rw console=ttySAC0,115200 init=/linuxrc mem=64M 4、配置内核支持JFFS2文件系统 File Systems ---> Miscellaneous filesystems ---> JournallingFlash File System v2 (JFFS2) support [*]JFFS2write-bufferingsupport [*] [*]JFFS2ZLIBcompressionsupport [*]JFFS2RTIMEcompressionsupport [*] JFFS2 RUBIN compression support 5、下载rootfs.jffs2镜像 下载到Nand Flash第二个分区。 FS2410#nand erase 200000 800000 FS2410#nand write.jffs2 300008000 200000 800000 这里说明下关于nand flash操作的几个常用命令的含义 nand write:向Nand Flash写入数据,如果NandFlash相应的区域有坏块,则直接报错。 nand write.jffs2:向Nand Flash写入数据,如果NandFlash相应的区域有坏块,可以跳过坏块。 nand read:读取Nand Flash相应区域的数据,如果NandFlash相应的区域有坏块,则直接报错。 nand read.jffs2s:读取Nand Flash相应区域的数据,如果NandFlash相应的区域有坏块,将对应坏块区域的缓冲填充0xff,然后跳过此坏块继续读取。 nand read.jffs2:读取Nand Flash相应区域的数据,如果NandFlash相应的区域有坏块,直接跳过坏块。 具体的参考代码参看U-BOOT源码:common/cmd_nand.c文件。 下载完JFFS2文件系统镜像后,需要把Linux内核NandFlash的驱动关于第二个分区的大小改为8M(和镜像一样大),否则会出现类似如下错误: Freeing init memory: 124K Warning: unable to open an initial console. Argh. Special inode #171 with mode 0xa1ff had more than one node Kernel panic: No init found. Try passing init= option to kernel. Argh. Special inode #63 with mode 0xa1ff had more than one node Returned error for crccheck of ino #63. Expect badness... Argh. Special inode #67 with mode 0xa1ff had more than one node Returned error for crccheck of ino #67. Expect badness... Argh. Special inode #68 with mode 0xa1ff had more than one node 到此,一个JFFS2文件系统的镜像制作成功。可以启动系统并测试JFFS2的性能了 还有一种制作JFFS2文件系统镜像的方法,在制作镜像的参数中可以不加—pad选项,过程如下: farsight#mkfs.jffs2 -r /source/rootfs -o rootfs.jffs2 -e 0x4000 -n 启动开发板烧写rootfs.jffs2镜像 FS2410#nand erase 200000 800000//(注意把整个存放文件系统的分区全部给擦除)。 FS2410#nand write.jffs2 30008000 200000 31a28c//(必须是rootfs.jffs2的实际大小。如果是你写成了4M,那么分区的其余部分JFFS2文件系统将无法识别)。
④ zynqmp 怎么将linux系统下载到emmc
1,vivado硬件配置,要选择EMMC代表的SD1;
2,编译petalinux:执行petalinux-config。
(1)选择Subsystem AUTO Hardware Setting
-> Advanced bootable images storage settings
->boot image settings;
选择primary flash,这里是将BOOT.bin设置为从qspi flash启动
(2)选择Subsystem AUTO Hardware Setting
-> Advanced bootable images storage settings
->kernel image settings;
选择primary sd,进入后我们看到这里实际就是设置image.ub的存放区域。
(3)选择Image Packaging Configuration,设置启动启动文件系统所在位置;
在设置启动方式的时候,如下两张图这样设置读取根文件系统的位置/dev/mmcblk1p2。
(4)设置你的驱动然后编译,依次执行:petalinux-config -c kernel;petalinux-config -c rootfs;
petalinux-build;petalinux-package --boot --fsbl ./images/linux/zynq_fsbl.elf --fpga --u-boot --force;
3,做之前先分区(把EMMC分区),先做一个SD卡启动的petalinux文件,
petalinux系统在zynq上面启动起来以后就进行如下分区:即是mmcblk1分为mmcblk1p1和mmcblk1p2
具体步骤如下:
(1) 把EMMC进行分区,执行命令: fdisk /dev/mmcblk1
(2)使用n命令,添加一个新的分区
Command (m for help): n
Command action
e extended
p primary partition (1-4)
选择p,添加主分区
,(3)选择分区号,选择1,
Partition number (1-4): 1 // 选择分区号
First cylinder (1-238592, default 1): Using default value 1 // 选择分区的第一个柱面,选择1
Last cylinder or +size or +sizeM or +sizeK (1-238592, default 238592): Using default value 238592 // 选择最后一个柱面
注意:1-238592,first要选第一个数,last要选择的比238592小,其中1024就是表示1M
(4)使用t命令,设置分区格式
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): b
Changed system type of partition 1 to b (Win95 FAT32)
(5)使用w命令,保存配置,必须保存配置
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table
(6)使用对应文件系统工具对分析进行格式化(只能在debian里面才能识别命令)
mkfs.fat /dev/mmcblk1p1 设置为fat32格式
mkfs.ext4 /dev/mmcblk1p2设置为ext4格式
注意:执行完w命令然后才算分区成功,执行完mkfs命令才算格设置内存属性成功。
以上分区完成后,可以使用p命令,显示分区信息;也可以使用用d命令表示删除分区
Command (m for help): p
Disk /dev/mmcblk0: 7818 MB, 7818182656 bytes
4 heads, 16 sectors/track, 238592 cylinders
Units = cylinders of 64 * 512 = 32768 bytes
Device Boot Start End Blocks Id System
/dev/mmcblk0p1 1 238592 7634936 83 Linux
(7)执行这句:mkdosfs -F 32 /dev/mmcblk0p1
当然,可以重复上述步骤,多分几个区,用来存放不同的状态:
FLASH要要用来存放BOOT.bin
第一个分区用来存放image.ub或者设备树(比如uImage和devicetree.dtb)等文件;--可以设置为128MB
第二个分区用来存放用户数据(比如可执行程序);可以设置为2048MB
第三个分区用来存放程序执行需要的库文件(opencv的库,qtcreator库,相机库,视频编码解码库等);剩余的1个多GB
4,把系统同步到ext4里面
先把sd卡里面系统挂载进来 :mount /dev/mmcblk0p2 /mnt
再把刚刚弄好的系统挂进来: mount /dev/mmcblk1p2 /tmp , 然后cd /mnt
然后进入把SD卡里面的系统同步到emmc里面:rsync -av ./* /tmp ,时间有点久,直到结束为止。
(要是不用SD卡也可以挂载U盘,解压,然后进行系统同步到EMMC所挂载的地方/tmp)
5,然后将BOOT.BIN和image.ub烧录到QSPI-FLASH中
首先擦除QSPI-FLASH:flash_eraseall /dev/mtd0
存放BOOT.bin到flash : flashcp BOOT.bin /dev/mtd0
此处若是将image.ub写入emmc的FAT分区中(不存放到flash中),先使用mount挂载eMMC的FAT分区,
然后将image.ub使用cp指令拷贝进 /mnt/mmcFat即可,也就是把uImage 拷贝到 /dev/mmcblk1p1;
进入uImage所在目录,然后执行 cp uImage /tmp;也就是把uImage存放到了 /dev/mmcblk1p1里面。
6,最后断电拔出SD卡,将拨码开关设置为flash启动,就能看到petalinux启动起来;
7,报错及其解决办法
————————————————
版权声明:本文为CSDN博主“寒听雪落”的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wangjie36/article/details/104740448/
⑤ 大家觉得明远智睿ls1012A只能从qspi启动,这样处理,是安全的考虑吗
你好是的,这种情况是从安全方面考虑的,
这样是好一些。
⑥ imx6ul 官方开发板qspi nor 启动linux 怎么操作
已经手动将ucl2.xml 中Quad Nor Flash 内容改成如下
<LIST name="Quad Nor Flash" desc="Choose Quad Nor flash as media">
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6q%board%_%nor%.imx" ifdev="MX6Q">Loading U-boot</CMD>
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6dl%board%_%nor%.imx" ifdev="MX6D">Loading U-boot</CMD>
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6slevk_spi-nor.imx" ifdev="MX6SL">Loading U-boot</CMD>
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6sx%sxuboot%_sd.imx" ifdev="MX6SX">Loading U-boot</CMD>
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx7d%7boot%_sd.imx" ifdev="MX7D">Loading U-boot</CMD>
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6ulevk_qspi1.imx" ifdev="MX6UL">Loading U-boot</CMD>
<CMD state="BootStrap" type="load" file="firmware/zImage" address="0x12000000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6DL">Loading Kernel.</CMD>
<CMD state="BootStrap" type="load" file="firmware/zImage" address="0x80800000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL">Loading Kernel.</CMD>
<CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x12C00000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6DL">Loading Initramfs.</CMD>
<CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x83800000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL">Loading Initramfs.</CMD>
<CMD state="BootStrap" type="load" file="firmware/zImage-imx6q-%board%-%nordtb%.dtb" address="0x18000000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q">Loading device tree.</CMD>
<CMD state="BootStrap" type="load" file="firmware/zImage-imx6dl-%board%-%nordtb%.dtb" address="0x18000000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6D">Loading device tree.</CMD>
<CMD state="BootStrap" type="load" file="firmware/zImage-imx6sl-evk.dtb" address="0x83000000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL">Loading device tree.</CMD>
<CMD state="BootStrap" type="load" file="firmware/zImage-imx6sx-%sxdtb%.dtb" address="0x83000000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SX">Loading device tree.</CMD>
<CMD state="BootStrap" type="load" file="firmware/zImage-imx7d-%7ddtb%.dtb" address="0x83000000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX7D">Loading device tree.</CMD>
<CMD state="BootStrap" type="load" file="firmware/zImage-imx6ul-14x14-evk.dtb" address="0x83000000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6UL">Loading device tree.</CMD>
<CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD>
<CMD state="Updater" type="push" body="$ flash_erase /dev/mtd0 0 20">Erasing Boot partition</CMD>
<CMD state="Updater" type="push" body="send" file="files/u-boot-imx6q%board%_%nor%.imx" ifdev="MX6Q">Sending U-Boot</CMD>
<CMD state="Updater" type="push" body="send" file="files/u-boot-imx6dl%board%_%nor%.imx" ifdev="MX6D">Sending U-Boot</CMD>
<CMD state="Updater" type="push" body="send" file="files/u-boot-imx6slevk_spi-nor.imx" ifdev="MX6SL">Sending u-boot.bin</CMD>
<CMD state="Updater" type="push" body="send" file="files/u-boot-imx6sx%sxuboot%_%sxnor%.imx" ifdev="MX6SX">Sending u-boot.bin</CMD>
<CMD state="Updater" type="push" body="send" file="files/u-boot-imx7d%7boot%_%7dnor%.imx" ifdev="MX7D">Sending u-boot.bin</CMD>
<CMD state="Updater" type="push" body="send" file="files/u-boot-im
⑦ qspiflash怎么退出XIP模式
你选的是quad spi flash ,应该使用并行的nor flash吧,不然就可以直接用spi配置fpga了, 不需要cpld,需要并行flash的目的就是配置速度。
⑧ stm32h7 spi不启动,但仿真可以启动
可能是复位管脚被强制拉高或者拉低了。
STM32的QSPI外设同样支持单线模式(兼容普通spi),只是相比普通的spi少了一些特性。
扫描隧道显微镜(Scanning Tunneling Microscope, 缩写为STM)是一种扫描探针显微术工具,扫描隧道显微镜可以让科学家观察和定位单个原子,它具有比它的同类原子力显微镜更加高的分辨率。STM使人类第一次能够实时地观察单个原子在物质表面的排列状态和与表面电子行为有关的物化性质,在表面科学、材料科学、生命科学等领域的研究中有着重大的意义和广泛的应用前景,被国际科学界公认为20世纪99年代世界十大科技成就之一。隧道针尖的结构是扫描隧道显微技术要解决的主要问题之一。针尖的大小、形状和化学同一性不仅影响着扫描隧道显微镜图像的分辨率和图像的形状,而且也影响着测定的电子态。针尖的宏观结构应使得针尖具有高的弯曲共振频率,从而可以减少相位滞后,提高采集速度。如果针尖的尖端只有一个稳定的原子而不是有多重针尖,那么隧道电流就会很稳定,而且能够获得原子级分辨的图像。针尖的化学纯度高,就不会涉及系列势垒。例如,针尖表面若有氧化层,则其电阻可能会高于隧道间隙的阻值,从而导致针尖和样品间产生隧道电流之前,二者就发生碰撞。制备针尖的材料主要有金属钨丝、铂-铱合金丝等。钨针尖的制备常用电化学腐蚀法。而铂- 铱合金针尖则多用机械成型法,一般 直接用剪刀剪切 而成。不论哪一种针尖,其表面往往覆盖着一层氧化层,或吸附一定的杂质,这经常是造成隧道电流不稳、噪音大和扫描隧道显微镜图象的不可预期性的原因。因此,每次实验前,都要对针尖进行处理,一般用化学法清洗,去除表面的氧化层及杂质,保证针尖具有良好的导电性。