一般开发板设计时,我们都是通过JTAG接口进行下载验证,每当系统断电后,程序需要进行重新下载,所以程序固化很重要。
固化
程序固化通俗理解就是把程序烧录在芯片上去,SD 卡 ,Quad SPI Flash,NAND Flash。
ZYNQ有五种可能的启动方式: NAND ,NOR,Quad_SPI,SD卡,JTAG。前四个是主启动方式,在主启动方式中,CPU将外部启动映像从非易失性内存加载到PS中。 JTAG是从引导模式,外部主机作为主机,通过JTAG连接将引导映像加载到OCM中。
ZYNQ可以从FLASH启动,也可以从SD卡启动,芯片上电后,最先运行的是ARM端系统PS,然后再通过 ARM系统软件部分 加载FPGA比特流文件.bit至FPGA PL,配置FPGA PL端的逻辑功能。
启动流程
0 BOOT ROM ,ZYNQ厂家固化代码
1 FSBL ,通过SDK工具来生成。
2 完成 Linux 系统启动过程 u-boot
阶段0: BOOTROM 选择启动方式,将用户代码加载到ocm
上电后,ZYNQ SOC会首先执行片内bootROM 代码,BootROM中的代码会对除SD卡以外的所有引导设备进行头文件搜索,该头文件里定义了一些启动信息,用于配置BOOtROM 的运行。在NAND NOR quad SPI 进行地址空间搜索。 SD卡不进行头文件搜索。
BOOTrom代码读取boot mode寄存器来判断哪种方式启动。 BOOTRom从相应的启动设备(SD 卡/QSPI FLASH/JTAG)加载到first stage bootloader(FSBL)或用户代码到 On chip memory(OCM)的ram上。 并将执行权交付给FSBL,这个被拷贝到片上RAm用于执行的程序来自于我们要制作的文件BOOT.bin。
阶段1:FSBL first stage boot loader 配置PS PS初始化 配置PL。
第一阶段由用户控制,根据用户的BOOT.bin文件完成对PS和PL的初始化。
第一阶段引导程序启动,BOOT.bin开始执行,首先继续配置PS,PS初始化完成后,配置PL。 最后还可以加载阶段2的代码。
BOOT.bin 其实就是FSBL.elf 原工程.bit 原工程.elf构成。 这一阶段所需的FSBL代码和可执行文件需要用户 使用SDK工具一步步生成。
初始化CPU 初始化串口
PS一些控制器的初始化 DDR clk等
使用比特流文件对PL进行配置
将应用程序加载到DDR或加载到 second stage boot loader SSBL
阶段2: SSBL 这一阶段是可选的,通常SSBL是裸机程序,对于linux启动来说就是u-boot
可选阶段,完成linux等程序启动,不需要linux的跳过此步骤
裸机开发:
这里主要指的是ZYNQ中的PS端开发,对于ARM的应用开发主要有两种方式:一种是直接在ARM芯片上进行应用开发,不采用操作系统,也称为裸机编程,这种开发方式主要应用于一些低端的ARM芯片上,其开发过程非常类似单片机。
还有一种是在ARM芯片上运行操作系统,对于硬件的操作需要编写相应的驱动程序,应用开发则是基于操作系统的。
操作系统:
操作系统作为用户和计算机硬件系统之间的接口
用户在OS的帮助下能够方便、快捷、可靠地操作计算机硬件和运行自己的程序。
FLASH启动方式:
1 初始化对应FLASH控制器
2 从FLASH拷贝bit比特流文件到FPGA
3 从FLASH 拷贝应用程序的代码到DDR3
4 跳转到应用程序执行。
定时器中断
定时器是一个非常重要的外围设备,它可以作为系统的周期性时钟源,也可以作为一个计时器,测定事件发生的时间。 还可以对外输出周期性脉冲或者作为监管系统运行。
定时器和中断控制器相连,当计数值达到零时,产生的中断信号会交由中断控制器处理。
中断原理:
中断通常被定义成一个事件,该事件能够改变处理器执行指令的顺序。
当中断发生时,系统执行完当前指令后,将跳转到相应的中断处理处执行,程序当中断程序执行完成,程序返回到发生中断指令的下一条指令处继续执行。在进入中断处理程序时,要保存中断程序的执行线程,从中断处理程序退出时要恢复被中断程序的执行现场。
中断类型:
ZYNQ 有三种中断,私有外设中断PPI,共享外设中断SPI,软件生成中断SGI
中断优先级
所有中断请求都被分配唯一的标识号,控制器使用标识号进行仲裁。同等优先级的中断通过选择最低标号来解决。