12个月嵌入式进阶计划ZYNQ 系列芯片嵌入式与硬件系统知识学习全计划(基于国内视频资源)

前言

ZYNQ 系列芯片作为 Xilinx(现 AMD)推出的异构可编程片上系统(SoC),将 ARM 架构的处理系统(PS)与 FPGA 的可编程逻辑(PL)无缝融合,在工业控制、图像处理、人工智能、航空航天等领域具有不可替代的优势。本学习计划结合 20 年嵌入式与导引头系统研发经验,以国内视频网站资源为核心,构建 "单片机基础→ZYNQ 核心知识→硬件系统设计→项目实战" 的阶梯式学习体系,涵盖从零基础到工程应用的全流程,配套详细的学习内容、资源链接与实操要求,总字数超 10 万字,助力学习者系统性掌握 ZYNQ 技术栈。

学习总纲

核心目标

  1. 掌握单片机(51/STM32)底层原理与编程方法,建立嵌入式开发思维
  2. 精通 ZYNQ-7000/UltraScale + 系列芯片架构,实现 PS 与 PL 协同开发
  3. 掌握嵌入式 Linux 系统(PetaLinux)定制、驱动开发与应用编程
  4. 具备 ZYNQ 硬件系统设计能力,包括原理图绘制、PCB 布局与信号完整性优化
  5. 能够独立完成工业级 ZYNQ 项目开发,涵盖图像处理、工业控制、AI 加速等场景

学习周期

总计 12 个月,分为 4 个阶段:

  • 入门阶段(第 1-2 月):单片机基础与数字电路复习
  • 基础阶段(第 3-5 月):ZYNQ 架构与裸机开发、硬件基础
  • 进阶阶段(第 6-9 月):嵌入式 Linux 开发、PL 高级编程与硬件设计
  • 实战阶段(第 10-12 月):综合项目开发与工程优化

必备工具与硬件

  1. 硬件平台
    • 入门:STC89C52 开发板(51 单片机)、STM32F103 开发板(如正点原子 Mini 板)
    • 进阶:ZYNQ-7020 开发板(如正点原子 ZYNQ 开发板、ALINX AX7020)
    • 实战:ZYNQ UltraScale + 开发板(如 KV260)、外设模块(OV5640 摄像头、HDMI 显示器、DDR3 模块)
  2. 软件工具
    • 单片机开发:Keil uVision5、STM32CubeMX
    • ZYNQ 开发:Vivado 2022.2/Vitis 2025、Petalinux 2022.2
    • 硬件设计:Altium Designer 22、Cadence Allegro、PSPICE
    • 辅助工具:MATLAB(算法仿真)、VS Code(代码编辑)、串口调试助手

核心学习资源平台

第一阶段:入门阶段(第 1-2 月)------ 单片机基础与数字电路复习

第 1 月:51 单片机基础(嵌入式入门基石)

第 1 周:51 单片机核心概念与开发环境搭建
周一:嵌入式系统与 51 单片机概述
  • 学习内容:
    1. 嵌入式系统定义、组成与应用场景(工业控制、消费电子、航空航天)
    2. 51 单片机发展历程与核心优势(结构简单、成本低、资料丰富)
    3. STC89C52RC 芯片引脚功能(VCC、GND、I/O 口、复位引脚、晶振引脚)
  • 视频资源:
  • 实操任务:
    1. 查阅 STC89C52RC 数据手册(中文),绘制引脚功能表
    2. 识别开发板上的核心元件(单片机、晶振、复位电路、LED)
周二:开发环境搭建与 Hello World 实现
  • 学习内容:
    1. Keil uVision5 安装与配置(器件选择、编译选项设置)
    2. 单片机程序下载流程(STC-ISP 烧录工具使用)
    3. 第一个 C 语言程序结构(main 函数、头文件包含、关键字说明)
  • 视频资源:
  • 实操任务:
    1. 安装 Keil uVision5 与 STC-ISP,配置 STC89C52RC 编译环境
    2. 编写程序实现串口打印 "Hello 51 MCU",通过串口助手查看结果
周三:51 单片机最小系统设计原理
  • 学习内容:
    1. 最小系统组成(电源电路、时钟电路、复位电路)
    2. 电源电路设计:3.3V/5V 供电方案与滤波电容选型
    3. 时钟电路:11.0592MHz 晶振与 22pF 匹配电容作用
    4. 复位电路:上电复位与手动复位原理
  • 视频资源:
  • 实操任务:
    1. 绘制 51 单片机最小系统原理图(使用 Altium Designer)
    2. 测量开发板复位引脚电压波形,验证复位功能
周四:GPIO 端口原理与 LED 控制
  • 学习内容:
    1. GPIO 端口内部结构(准双向口、推挽输出、开漏输出)
    2. 寄存器操作:P0-P3 端口寄存器(P0、P0_0、P1 等)
    3. 位操作与字节操作的区别(sbit 定义与直接赋值)
  • 视频资源:
  • 实操任务:
    1. 编写程序实现 LED 闪烁(周期 1 秒),使用循环延时函数
    2. 实现 LED 流水灯效果,从左到右依次点亮(8 个 LED)
周五:延时函数与按键输入
  • 学习内容:
    1. 循环延时原理(机器周期、指令周期计算)
    2. 按键输入电路设计(上拉电阻的作用)
    3. 按键消抖方法(软件消抖与硬件消抖)
  • 视频资源:
  • 实操任务:
    1. 编写精确延时函数(1ms、10ms、1s),通过示波器验证
    2. 实现按键控制 LED:按一次点亮,再按一次熄灭(消抖处理)
周六:数码管显示原理
  • 学习内容:
    1. 数码管结构(共阴极与共阳极区别)
    2. 静态显示与动态扫描显示原理
    3. 段码表与位码表设计(0-9 数字显示)
  • 视频资源:
  • 实操任务:
    1. 实现数码管静态显示 "5"
    2. 实现动态扫描显示 "1234"(4 位数码管)
周日:周总结与知识梳理
  • 复习内容:
    1. 51 单片机最小系统组成与原理
    2. GPIO 输入输出操作与寄存器配置
    3. 延时函数、按键控制与数码管显示
  • 测试任务:
    1. 设计综合程序:按键控制数码管计数(按一次加 1,满 10 归 0)
    2. 撰写学习笔记,整理核心知识点与问题
第 2 周:51 单片机中断系统与定时器
周一:中断系统基础概念
  • 学习内容:
    1. 中断定义与优势(提高 CPU 效率、实时响应事件)
    2. 51 单片机中断源(外部中断 0/1、定时器 0/1 中断、串口中断)
    3. 中断优先级与中断嵌套原理
  • 视频资源:
  • 实操任务:
    1. 绘制 51 单片机中断系统结构图
    2. 整理中断源对应的中断号与入口地址
周二:外部中断编程实战
  • 学习内容:
    1. 外部中断配置寄存器(TCON、IE、IP)
    2. 触发方式:电平触发与边沿触发区别
    3. 中断服务函数编写规范(无返回值、无参数)
  • 视频资源:
  • 实操任务:
    1. 实现外部中断 0 控制 LED 翻转(按键触发)
    2. 实现外部中断 0 与 1 优先级控制(中断 0 优先)
周三:定时器原理与配置
  • 学习内容:
    1. 定时器工作原理(计数功能、时钟源选择)
    2. 定时器模式寄存器(TMOD):模式 0-3 配置
    3. 初值计算方法(1ms 定时为例)
  • 视频资源:
  • 实操任务:
    1. 计算定时器 0 在 11.0592MHz 晶振下,1ms 定时的初值
    2. 配置定时器 0 为模式 1,实现 1ms 定时中断
周四:定时器中断应用(电子时钟)
  • 学习内容:
    1. 定时器中断服务函数设计(计数溢出处理)
    2. 多任务调度思路(基于定时器中断)
    3. 电子时钟逻辑设计(时、分、秒计数)
  • 视频资源:
  • 实操任务:
    1. 实现基于定时器 0 的电子时钟(秒计数)
    2. 数码管显示秒数(0-59 循环)
周五:串口通信原理
  • 学习内容:
    1. 串口通信基础:异步通信、波特率、数据位、停止位、校验位
    2. 51 单片机串口结构(SBUF 寄存器、SCON 寄存器)
    3. 波特率计算与定时器 1 配置
  • 视频资源:
  • 实操任务:
    1. 配置串口波特率为 9600,8 位数据位,1 位停止位,无校验
    2. 实现单片机向电脑发送字符串 "Serial Test OK"
周六:串口收发与指令控制
  • 学习内容:
    1. 串口接收中断配置(RI 标志位处理)
    2. 指令解析思路(接收特定字符执行对应操作)
    3. 字符串收发实现方法
  • 视频资源:
  • 实操任务:
    1. 实现电脑向单片机发送指令:发送 "ON" 点亮 LED,发送 "OFF" 熄灭 LED
    2. 实现单片机接收字符并回传(echo 功能)
周日:周总结与综合项目(智能小车基础)
  • 复习内容:
    1. 中断系统与定时器配置
    2. 串口通信协议与编程
  • 项目任务:
    1. 设计智能小车控制模块:通过串口发送指令控制电机正转 / 反转
    2. 撰写项目报告,包含原理图、程序代码与测试结果
第 3-4 周:51 单片机进阶与实战(I2C/SPI 通信与传感器应用)
  • 核心内容:
    1. I2C 通信协议与 AT24C02 存储芯片应用
    2. SPI 通信协议与 W25Q64Flash 应用
    3. 温度传感器 DS18B20 原理与数据采集
    4. 综合项目:温湿度监测系统(DS18B20 + 数码管显示 + 串口上传)
  • 视频资源:
  • 实操任务:
    1. 实现 AT24C02 数据读写(存储温度值)
    2. 设计温湿度监测系统,每 1 秒采集一次温度并显示

第 2 月:STM32 单片机进阶与数字电路复习

第 1-2 周:STM32 基础(从 51 到 ARM 的过渡)
周一:STM32 芯片架构与选型
  • 学习内容:
    1. ARM Cortex-M3 内核特性(流水线、寄存器组、中断控制器)
    2. STM32F103 系列芯片分类(容量、封装、外设差异)
    3. STM32 与 51 单片机的核心区别(32 位 vs8 位、外设丰富度、运行速度)
  • 视频资源:
  • 实操任务:
    1. 查阅 STM32F103C8T6 数据手册,整理核心参数(主频、Flash、SRAM)
    2. 对比 STM32 与 51 单片机的外设资源差异
周二:STM32CubeMX 工具使用
  • 学习内容:
    1. STM32CubeMX 安装与配置(固件包下载、工程创建)
    2. 引脚配置方法(GPIO、时钟、外设模式)
    3. 工程生成选项(IDE 选择、代码风格)
  • 视频资源:
  • 实操任务:
    1. 使用 CubeMX 创建 STM32F103C8T6 工程,配置 LED 引脚(PA0)
    2. 生成 Keil 工程并编译
周三:STM32 GPIO 原理与 HAL 库
  • 学习内容:
    1. GPIO 端口结构(输出模式、输入模式、复用功能)
    2. HAL 库函数使用(HAL_GPIO_Init、HAL_GPIO_WritePin、HAL_GPIO_TogglePin)
    3. 时钟树配置(HSE、HSI、PLL)
  • 视频资源:
  • 实操任务:
    1. 编写程序实现 LED 闪烁(使用 HAL 库,周期 500ms)
    2. 配置不同 GPIO 模式(推挽输出、上拉输入)并测试
周四:STM32 中断系统(NVIC)
  • 学习内容:
    1. NVIC 中断控制器特性(优先级分组、中断使能)
    2. 外部中断配置(EXTI 线、触发方式)
    3. HAL 库中断服务函数与回调函数
  • 视频资源:
  • 实操任务:
    1. 实现外部中断控制 LED 翻转(PA0 触发)
    2. 配置两个外部中断,实现优先级控制
周五:STM32 定时器与 PWM 输出
  • 学习内容:
    1. 通用定时器功能(定时、计数、PWM)
    2. PWM 原理与应用(电机控制、LED 调光)
    3. HAL 库定时器配置函数(HAL_TIM_Base_Init、HAL_TIM_PWM_Start)
  • 视频资源:
  • 实操任务:
    1. 实现定时器 3 生成 1kHz PWM 信号,占空比 50%
    2. 通过按键调节 PWM 占空比(0-100%),控制 LED 亮度
周六:STM32 串口通信(USART)
  • 学习内容:
    1. USART 外设特性(同步 / 异步模式、多机通信)
    2. HAL 库串口函数(HAL_UART_Transmit、HAL_UART_Receive_IT)
    3. 串口中断接收与数据处理
  • 视频资源:
  • 实操任务:
    1. 实现串口 1(PA9/PA10)发送字符串 "STM32 UART Test"
    2. 实现串口中断接收,接收数据后回传
周日:周总结与综合练习
  • 复习内容:
    1. STM32CubeMX 配置流程
    2. GPIO、中断、定时器、串口的 HAL 库编程
  • 实操任务:
    1. 设计 PWM 调光系统:通过串口指令设置 LED 亮度(0-100%)
    2. 撰写学习笔记,对比 STM32 与 51 单片机的编程差异
第 3-4 周:数字电路复习与 STM32 进阶(I2C/SPI/DMA)
周一:数字电路基础(逻辑门与组合逻辑)
  • 学习内容:
    1. 基本逻辑门(与、或、非、与非、或非)真值表
    2. 组合逻辑电路(编码器、译码器、多路选择器)
    3. 逻辑函数化简(卡诺图方法)
  • 视频资源:
  • 实操任务:
    1. 用卡诺图化简逻辑函数 Y=AB+AC+BC
    2. 绘制 3-8 译码器原理图并仿真(Multisim)
周二:时序逻辑电路(触发器与寄存器)
周三:STM32 I2C 通信与 OLED 显示
  • 学习内容:
    1. I2C 通信协议详解(起始位、停止位、应答位)
    2. STM32 I2C 外设配置(HAL_I2C_Init)
    3. OLED 显示屏驱动原理(SSD1306 芯片)
  • 视频资源:
  • 实操任务:
    1. 配置 I2C1(PB6/PB7),实现 OLED 显示 "STM32 I2C Test"
    2. 显示实时温度值(模拟数据)
周四:STM32 SPI 通信与 Flash 读写
  • 学习内容:
    1. SPI 通信协议(四线制、主从模式、时钟极性)
    2. STM32 SPI 外设配置(HAL_SPI_Init)
    3. W25Q64 Flash 芯片读写操作
  • 视频资源:
  • 实操任务:
    1. 配置 SPI1(PA5/PA6/PA7),实现 W25Q64 数据读写
    2. 存储温度数据到 Flash,断电后读取显示
周五:STM32 DMA 原理与应用
  • 学习内容:
    1. DMA 功能与优势(直接内存访问,减轻 CPU 负担)
    2. DMA 通道与请求映射
    3. HAL 库 DMA 配置函数(HAL_DMA_Init、HAL_UART_Transmit_DMA)
  • 视频资源:
  • 实操任务:
    1. 实现 DMA 方式串口发送(发送 1024 字节数据)
    2. 对比 DMA 与普通串口发送的效率差异
周六:STM32 ADC 采集与数据处理
  • 学习内容:
    1. ADC 原理(逐次逼近型、分辨率、采样率)
    2. STM32 ADC 配置(单通道、多通道、中断模式)
    3. 模拟信号采集与数字化处理
  • 视频资源:
  • 实操任务:
    1. 配置 ADC1 通道 1(PA1),采集电位器电压(0-3.3V)
    2. 将采集值转换为温度(模拟公式),OLED 显示
周日:阶段总结与综合项目(环境监测终端)
  • 项目任务:
    1. 设计环境监测终端:ADC 采集温度(模拟)、I2C OLED 显示、SPI Flash 存储、串口上传数据
    2. 编写完整代码,实现数据采集、存储、显示、传输全流程
  • 文档输出:
    1. 项目原理图(Altium Designer 绘制)
    2. 程序流程图与核心代码注释
    3. 测试报告(功能验证与性能分析)

第二阶段:基础阶段(第 3-5 月)------ ZYNQ 架构与裸机开发、硬件基础

第 3 月:ZYNQ 芯片架构与开发环境搭建

第 1 周:ZYNQ 系列芯片概述与硬件架构
周一:ZYNQ 芯片家族与应用场景
周二:ZYNQ 异构架构详解(PS 与 PL)
周三:ZYNQ 最小系统设计原理
周四:Vivado 开发环境搭建
  • 学习内容:
    1. Vivado 2022.2 安装步骤(Windows/Linux)
    2. 许可证配置与常见问题解决
    3. Vivado 界面介绍:Project Manager、Flow Navigator、Diagram
  • 视频资源:
  • 实操任务:
    1. 在 Windows 系统安装 Vivado 2022.2,配置许可证
    2. 熟悉 Vivado 各模块功能,创建空白工程
周五:Vitis 开发环境搭建与配置
周六:ZYNQ 开发流程概述
  • 学习内容:
    1. 全流程:需求分析→硬件设计→Vivado 工程创建→PL 逻辑设计→PS 配置→比特流生成→Vitis 软件开发→下载调试
    2. 关键步骤:Block Design 创建、IP 核配置、硬件导出
    3. 调试工具:ILA(集成逻辑分析仪)、VIO(虚拟 IO)
  • 视频资源:
  • 实操任务:
    1. 绘制 ZYNQ 开发流程图,标注关键步骤与工具
    2. 了解 ILA 与 VIO 的使用场景,整理调试方法
周日:周总结与环境验证
  • 复习内容:
    1. ZYNQ 架构核心组件与互连方式
    2. Vivado 与 Vitis 环境搭建步骤
  • 实操任务:
    1. 验证 Vivado 与 Vitis 联动:创建空白 Block Design,导出到 Vitis
    2. 撰写环境搭建笔记,记录遇到的问题与解决方法
第 2-4 周:ZYNQ PS 裸机开发(GPIO、UART、定时器)
周一:PS GPIO 原理与配置
  • 学习内容:
    1. PS GPIO 分类:MIO(多功能 IO)与 EMIO(扩展 IO)
    2. MIO 引脚分配:Bank0(3.3V)、Bank1(1.8V)
    3. GPIO 配置寄存器:DATA、DIR、OEN
  • 视频资源:
  • 实操任务:
    1. 在 Vivado 中配置 MIO0 为输出(LED 控制)
    2. 编写 Vitis 程序,实现 LED 闪烁(HAL 库)
周二:PS UART 通信实现
  • 学习内容:
    1. PS UART 外设特性:波特率、数据位、停止位、校验位
    2. UART 配置步骤:时钟使能→引脚配置→参数设置→中断配置
    3. HAL 库函数:XUartPs_Init、XUartPs_Send、XUartPs_Recv
  • 视频资源:
  • 实操任务:
    1. 配置 UART0(MIO14/MIO15),波特率 115200
    2. 实现串口发送字符串 "ZYNQ UART Test",接收数据并回传
周三:PS 定时器与中断
  • 学习内容:
    1. PS 定时器类型:私有定时器(Private Timer)、全局定时器(Global Timer)
    2. 定时器配置:加载值、预分频、中断使能
    3. 中断控制器:GIC(通用中断控制器)配置
  • 视频资源:
  • 实操任务:
    1. 配置私有定时器,实现 1ms 定时中断
    2. 基于定时器中断实现电子时钟(秒计数),串口打印时间
周四:PS I2C 通信与外设控制
  • 学习内容:
    1. PS I2C 外设特性:主从模式、速率控制(100kHz/400kHz)
    2. I2C 配置步骤:引脚配置→时钟配置→参数初始化
    3. 与 OLED 通信:SSD1306 驱动函数调用
  • 视频资源:
  • 实操任务:
    1. 配置 I2C0(MIO12/MIO13),实现 OLED 显示
    2. 显示定时器计数的秒数
周五:PS SPI 通信与 Flash 读写
  • 学习内容:
    1. PS SPI 外设特性:四线制、主模式、时钟极性 / 相位
    2. SPI 配置步骤:引脚分配→模式设置→速率配置
    3. QSPI Flash 读写:XQspiPs 库函数使用
  • 视频资源:
  • 实操任务:
    1. 配置 SPI0(MIO10/MIO11/MIO16/MIO17),实现 QSPI Flash 读写
    2. 存储当前时间到 Flash,断电后读取并显示
周六:PS DMA 原理与应用
  • 学习内容:
    1. PS DMA 控制器特性:8 个通道、AXI4 接口、 scatter-gather 模式
    2. DMA 配置步骤:通道初始化→传输参数设置→启动传输
    3. 与 UART 结合:DMA 方式串口数据传输
  • 视频资源:
  • 实操任务:
    1. 配置 DMA 通道,实现 UART DMA 发送(1024 字节数据)
    2. 对比 DMA 与普通发送的 CPU 占用率
周日:PS 裸机综合项目(环境监测节点)
  • 项目任务:
    1. 设计基于 PS 的环境监测节点:定时器中断计数、I2C OLED 显示、SPI Flash 存储、UART DMA 上传数据
    2. 实现功能:每 1 秒采集模拟温度,显示、存储、上传
  • 文档输出:
    1. Vivado Block Design 截图
    2. Vitis 程序流程图与核心代码
    3. 测试报告(功能验证与性能分析)

第 4 月:ZYNQ PL 开发基础(Verilog 与 IP 核)

第 1-2 周:Verilog HDL 基础与 PL 逻辑设计
周一:Verilog 语言基础(语法与数据类型)
  • 学习内容:
    1. Verilog 程序结构:模块定义(module/endmodule)、端口声明、内部信号
    2. 数据类型:wire、reg、integer、parameter
    3. 基本操作符:算术、逻辑、关系、位操作符
  • 视频资源:
  • 实操任务:
    1. 编写 Verilog 模块,定义一个 4 位加法器
    2. 仿真验证加法器功能(使用 Vivado Simulator)
周二:组合逻辑电路设计
  • 学习内容:
    1. 组合逻辑特点:无记忆、输出仅取决于当前输入
    2. 常用电路:多路选择器、译码器、加法器
    3. 赋值语句:assign 连续赋值(wire 型)
  • 视频资源:
  • 实操任务:
    1. 设计 8 选 1 多路选择器(Verilog 实现)
    2. 仿真验证多路选择器功能,绘制时序图
周三:时序逻辑电路设计
  • 学习内容:
    1. 时序逻辑特点:有记忆、输出取决于输入与状态
    2. 触发器:D 触发器、JK 触发器(Verilog 实现)
    3. 时序语句:always 块、posedge/negedge 时钟触发
  • 视频资源:
  • 实操任务:
    1. 设计 D 触发器(带异步复位)
    2. 基于 D 触发器设计 4 位计数器(0-15 循环)
周四:有限状态机(FSM)设计
周五:PL GPIO 与 LED 控制
周六:PL UART 收发器设计
周日:周总结与 PL 逻辑仿真
  • 复习内容:
    1. Verilog 核心语法与电路设计方法
    2. PL 逻辑实现与约束文件编写
  • 实操任务:
    1. 仿真验证 PL UART 发送器功能
    2. 撰写 Verilog 学习笔记,整理常见语法错误
第 3-4 周:Vivado IP 核使用与 PL-PS 互连
周一:Vivado IP 核概述与使用流程
  • 学习内容:
    1. IP 核分类:Xilinx 官方 IP、自定义 IP、第三方 IP
    2. IP 核使用步骤:搜索→配置→例化→连接
    3. 常用 IP 核:Clock Wizard、AXI GPIO、UART Lite
  • 视频资源:
  • 实操任务:
    1. 调用 Clock Wizard IP 核,生成 100MHz 时钟
    2. 仿真验证时钟输出功能
周二:AXI4-Lite 总线基础
周三:PS 与 PL 通过 AXI4-Lite 互连
  • 学习内容:
    1. Block Design 创建:添加 ZYNQ7 Processing System IP
    2. PS 配置:DDR3、UART、AXI GPIO
    3. AXI 互连:使用 AXI Interconnect IP 核
  • 视频资源:
  • 实操任务:
    1. 在 Block Design 中配置 PS 与 PL 的 AXI4-Lite 连接
    2. 生成比特流,导出硬件到 Vitis
周四:AXI GPIO IP 核使用(PL 外设控制)
周五:自定义 IP 核设计与集成
  • 学习内容:
    1. 自定义 IP 核流程:创建 IP→编写逻辑→封装→集成
    2. AXI4-Lite 从机接口设计:地址解码、寄存器访问
    3. IP Packager 工具使用
  • 视频资源:
  • 实操任务:
    1. 设计自定义 IP 核(含 2 个寄存器:控制寄存器、状态寄存器)
    2. 集成到 Block Design,PS 通过 AXI4-Lite 访问 IP 核
周六:PL 中断与 PS 中断处理
  • 学习内容:
    1. PL 到 PS 中断路径:AXI GPIO 中断→IRQ_F2P→GIC
    2. 中断配置:PL 端中断信号生成、PS 端中断使能
    3. 中断服务函数编写:XScuGic 库函数使用
  • 视频资源:
  • 实操任务:
    1. 配置 AXI GPIO 中断(PL 按键触发)
    2. 编写中断服务函数,实现按键控制 LED 翻转
周日:PL-PS 协同综合项目(数据采集模块)
  • 项目任务:
    1. 设计 PL-PS 协同数据采集模块:PL 实现计数器(0-255),通过 AXI4-Lite 上传到 PS,PS 通过 UART 打印数据
    2. 实现 PL 中断:计数到 255 时触发中断,PS 处理并清零计数器
  • 文档输出:
    1. Block Design 框图与 IP 配置截图
    2. 自定义 IP 核 Verilog 代码与封装步骤
    3. 测试报告(功能验证与中断响应时间测试)

第 5 月:ZYNQ 硬件系统设计基础(原理图与 PCB)

第 1-2 周:ZYNQ 硬件系统组成与原理图设计
周一:ZYNQ 硬件系统架构
周二:电源电路设计
  • 学习内容:
    1. ZYNQ 电源需求:VCC_INT(1.0V)、VCC_IO_BANK0(3.3V)、VCC_IO_BANK1(1.8V)、VCC_PLL(1.0V)
    2. 电源方案:DC-DC(高效)、LDO(低噪声)选型
    3. 滤波电路:去耦电容配置(0.1uF+10uF)、电源树设计
  • 视频资源:
  • 实操任务:
    1. 设计 ZYNQ 电源电路(使用 MP2307 DC-DC 和 AMS1117 LDO)
    2. 绘制电源树框图,标注各电源轨电流需求
周三:时钟电路设计
  • 学习内容:
    1. ZYNQ 时钟需求:PS 主时钟(50MHz/100MHz)、PL 时钟(可配置)
    2. 晶振选型:无源晶振(成本低)vs 有源晶振(稳定性高)
    3. 时钟电路设计:匹配电容(22pF)、布局注意事项(远离噪声源)
  • 视频资源:
  • 实操任务:
    1. 设计 ZYNQ 时钟电路(50MHz 无源晶振)
    2. 分析时钟抖动对系统的影响,整理布局要点
周四:存储电路设计(DDR3 与 Flash)
  • 学习内容:
    1. DDR3 SDRAM 设计:引脚连接(地址线、数据线、控制线)、阻抗匹配
    2. QSPI Flash 设计:存储配置文件、用户数据,引脚连接(CS、SCK、MOSI、MISO)
    3. 时序约束:DDR3 时序参数(tCK、tCAS、tRCD)
  • 视频资源:
  • 实操任务:
    1. 设计 DDR3 电路(MT41J128M16JT-125)
    2. 设计 QSPI Flash 电路(W25Q128JV)
周五:外设接口电路设计(UART、USB、HDMI)
  • 学习内容:
    1. UART 接口:电平转换(MAX3232)、ESD 保护(TPD4E05U03)
    2. USB 接口:USB 2.0 OTG(VL610 芯片)、供电设计
    3. HDMI 接口:TMDS 信号传输、ESD 保护、电源滤波
  • 视频资源:
  • 实操任务:
    1. 设计 UART 接口电路(含电平转换与 ESD 保护)
    2. 设计 HDMI 发送接口电路(SN75DP159 芯片)
周六:原理图设计工具使用(Altium Designer)
  • 学习内容:
    1. Altium Designer 22 安装与配置
    2. 原理图库创建:ZYNQ-7020、电源芯片、存储芯片符号
    3. 原理图绘制:导线连接、网络标签、注释
  • 视频资源:
  • 实操任务:
    1. 创建 ZYNQ-7020 原理图符号库
    2. 绘制 ZYNQ 核心电路原理图(电源、时钟、复位)
周日:周总结与原理图审核
  • 复习内容:
    1. ZYNQ 硬件各模块设计要点
    2. Altium Designer 原理图绘制步骤
  • 实操任务:
    1. 审核绘制的原理图,检查引脚连接错误
    2. 撰写硬件设计笔记,整理常见设计错误
第 3-4 周:PCB 设计基础与信号完整性
周一:PCB 设计流程与层叠规划
  • 学习内容:
    1. PCB 设计流程:原理图导入→封装库创建→布局→布线→敷铜→输出 Gerber
    2. 层叠规划:4 层板(顶层、GND、VCC、底层)设计
    3. 板框与定位孔设计:机械尺寸、安装孔位置
  • 视频资源:
  • 实操任务:
    1. 创建 ZYNQ 开发板 PCB 板框(100x80mm)
    2. 规划 4 层板层叠结构,设置层厚与介质参数
周二:封装库创建与元件布局
  • 学习内容:
    1. 封装类型:BGA(ZYNQ-7020)、QFP、SOP、0402/0603 贴片
    2. 封装库创建:焊盘尺寸、丝印、 courtyard 设置
    3. 元件布局原则:核心元件优先、功能分区、散热考虑
  • 视频资源:
  • 实操任务:
    1. 创建 ZYNQ-7020 BGA 封装(xc7z020clg400-2)
    2. 进行元件布局:核心芯片、电源芯片、存储芯片
周三:PCB 布线基础与规则设置
  • 学习内容:
    1. 布线规则:线宽(电源 30mil、信号 10mil)、线距(8mil)、过孔大小
    2. 布线策略:优先布高速信号、差分对布线、避免绕线
    3. Altium Designer 布线工具使用:自动布线、手动布线
  • 视频资源:
  • 实操任务:
    1. 设置 PCB 布线规则(线宽、线距、过孔)
    2. 完成核心电路布线(电源、时钟、复位)
周四:高速信号布线与阻抗控制
  • 学习内容:
    1. 高速信号定义:频率 > 100MHz 或上升沿 < 1ns
    2. 阻抗控制:微带线、带状线阻抗计算(50Ω/100Ω)
    3. 差分对布线:等长、等距、屏蔽
  • 视频资源:
  • 实操任务:
    1. 计算微带线阻抗(线宽 10mil,介质厚度 1.6mm,介电常数 4.4)
    2. 完成 DDR3 差分对布线(CLK、DQS)
周五:电源完整性设计
  • 学习内容:
    1. 电源完整性问题:纹波、噪声、压降
    2. 去耦电容布局:靠近芯片电源引脚、多容值组合
    3. 电源平面分割:不同电压域隔离、避免跨分割
  • 视频资源:
  • 实操任务:
    1. 布局去耦电容(ZYNQ 电源引脚附近)
    2. 进行电源平面分割(1.0V、1.8V、3.3V)
周六:EMC 设计与 PCB 优化
  • 学习内容:
    1. EMC 设计原则:接地策略、屏蔽、滤波
    2. 常见 EMC 问题:辐射干扰、传导干扰
    3. PCB 优化:减少过孔、优化绕线、增加接地过孔
  • 视频资源:
  • 实操任务:
    1. 优化 PCB 布线,减少跨分割与过长绕线
    2. 添加滤波电容与接地过孔,提升 EMC 性能
周日:PCB 设计综合项目与输出
  • 项目任务:
    1. 完成 ZYNQ 核心板 PCB 设计(4 层板):包含核心电路、电源电路、存储电路、UART 接口
    2. 输出 Gerber 文件与 BOM 清单
  • 文档输出:
    1. PCB 布局布线截图(顶层、底层、内层)
    2. 阻抗控制计算报告
    3. Gerber 文件输出步骤与检查清单

第三阶段:进阶阶段(第 6-9 月)------ 嵌入式 Linux 开发、PL 高级编程与硬件设计

第 6 月:ZYNQ 嵌入式 Linux 开发基础(Petalinux)

第 1-2 周:Linux 系统基础与 Petalinux 环境搭建
周一:嵌入式 Linux 系统概述
周二:Ubuntu 虚拟机安装与配置

12 篇资料

继续生成

已完成思考

ZYNQ 系列芯片嵌入式与硬件系统知识学习全计划(基于国内视频资源)(续)

第三阶段:进阶阶段(第 6-9 月)------ 嵌入式 Linux 开发、PL 高级编程与硬件设计

第 6 月:ZYNQ 嵌入式 Linux 开发基础(Petalinux)

第 1-2 周:Linux 系统基础与 Petalinux 环境搭建(续)
周三:Petalinux 工具安装与验证
  • 学习内容:
    1. Petalinux 2022.2 版本兼容性:需与 Vivado 2022.2 版本匹配,避免版本冲突。
    2. 安装步骤:解压安装包(./petalinux-v2022.2-final-installer.run)、接受许可协议、指定安装路径(建议无中文空格)。
    3. 环境变量配置:执行source <安装路径>/settings.sh,永久配置需添加到~/.bashrc文件。
    4. 安装验证:运行petalinux-version查看版本,petalinux-util --version检查工具完整性。
  • 视频资源:
  • 实操任务:
    1. 在 Ubuntu 20.04 中安装 Petalinux 2022.2,解决依赖包缺失问题(如libtinfo5zlib1g-dev)。
    2. 配置环境变量,验证安装结果,截图保存petalinux-version输出信息。
周四:Petalinux 工程创建与硬件关联
  • 学习内容:
    1. 硬件描述文件(XSA)准备:在 Vivado 中完成 Block Design(需包含 PS 核心、AXI 外设),生成并导出 XSA 文件(需勾选 "Include Bitstream")。
    2. 工程创建命令:petalinux-create -t project --template zynq --name <工程名>,指定 ZYNQ 模板。
    3. 关联硬件:cd <工程名>后执行petalinux-config --get-hw-description=<XSA文件路径>,加载硬件信息。
    4. 工程结构解析:components(内核、根文件系统组件)、project-spec(用户定制配置)、build(编译输出)。
  • 视频资源:
  • 实操任务:
    1. 使用前序阶段创建的 "PS-PL AXI GPIO 互连" 硬件工程,导出 XSA 文件。
    2. 创建 Petalinux 工程,关联该 XSA 文件,进入图形配置界面,查看 "Hardware Setup" 确认硬件信息无误。
周五:U-Boot 配置与编译
  • 学习内容:
    1. U-Boot 作用:初始化硬件(DDR、串口)、引导 Linux 内核、提供命令行交互(如printenvsetenv)。
    2. 配置命令:petalinux-config -c u-boot,核心配置项包括:
      • "Serial Port Configuration":指定调试串口(如ttyPS0,对应 PS UART0)。
      • "Boot Options":设置默认引导参数(如bootcmdbootargs)。
      • "Memory Configuration":确认 DDR 容量(如512MB,需与硬件匹配)。
    3. 编译命令:petalinux-build -c u-boot,生成images/linux/u-boot.elf
  • 视频资源:
  • 实操任务:
    1. 配置 U-Boot,将调试串口设为ttyPS0(波特率 115200),关闭无关功能(如 USB HID)。
    2. 编译 U-Boot,在build/tmp/work/zynq-generic-xilinx-linux-gnueabi/u-boot-xlnx/路径下查看编译日志,确认无错误。
周六:Linux 内核配置与编译
  • 学习内容:
    1. 内核配置命令:petalinux-config -c kernel,图形界面基于menuconfig,核心配置项包括:
      • "Device Drivers":启用 AXI GPIO 驱动(Xilinx AXI GPIO driver)、串口驱动(Serial drivers -> Xilinx UART Lite)。
      • "File systems":支持 EXT4(根文件系统)、FAT32(SD 卡 boot 分区)。
      • "Kernel Features":启用内核调试(如Kernel debugging)、抢占式调度(Preemptible Kernel)。
    2. 编译命令:petalinux-build -c kernel,生成images/linux/zImage(内核镜像)和images/linux/system.dtb(设备树)。
    3. 设备树作用:描述硬件资源(如 GPIO 地址、中断号),替代传统板级文件(board.c)。
  • 视频资源:
  • 实操任务:
    1. 配置 Linux 内核,启用 AXI GPIO 驱动和 EXT4 文件系统支持,保存配置(自动生成project-spec/meta-user/recipes-kernel/linux/linux-xlnx/%/defconfig)。
    2. 编译内核,查看images/linux目录下是否生成zImagesystem.dtb,记录文件大小。
周日:周总结与 U-Boot 内核验证
  • 复习内容:
    1. Petalinux 工程创建、硬件关联、U-Boot / 内核配置编译流程。
    2. U-Boot 与内核的核心作用及配置要点。
  • 实操任务:
    1. 通过 JTAG 将编译好的u-boot.elf下载到开发板,打开串口助手(波特率 115200),确认 U-Boot 启动正常(显示 "U-Boot>" 命令行)。
    2. 执行bdinfo命令查看硬件信息,printenv查看引导参数,截图保存关键输出;整理本周常见问题(如 XSA 文件缺失、依赖包错误)及解决方法。
第 3-4 周:根文件系统与 Linux 启动
周一:根文件系统组成与定制
  • 学习内容:
    1. 根文件系统(RootFS)作用:提供 Linux 运行所需的目录(/bin命令、/etc配置、/lib库、/home用户目录)和初始化程序(/sbin/init)。
    2. Petalinux 根文件系统类型:ramdisk(内存根文件系统,适合调试)、ext4(SD 卡 / EMMC,适合量产)。
    3. 定制命令:petalinux-config -c rootfs,核心配置项包括:
      • "User Packages":添加常用工具(bashvimtelnet-servergcc)。
      • "Filesystem Packages":启用ssh-server(远程登录)、ntp(时间同步)。
      • "Base Filesystem":选择根文件系统格式(如ext4)。
    4. 编译命令:petalinux-build -c rootfs,生成images/linux/rootfs.ext4
  • 视频资源:
  • 实操任务:
    1. 配置根文件系统,添加bashvimopenssh-server,禁用busybox的简化命令(如ash)。
    2. 编译根文件系统,生成rootfs.ext4,使用ls -lh查看文件大小(约 200MB 以上)。
周二:Linux 启动流程解析
  • 学习内容:
    1. ZYNQ Linux 完整启动流程:
      1. 上电后执行 BootROM(固化在芯片内),初始化 PS 最小系统,加载第一阶段引导程序(FSBL)。
      2. FSBL 初始化 PL(加载比特流)、DDR,加载 U-Boot 到 DDR。
      3. U-Boot 初始化外设,解析bootcmd(如fatload mmc 0 0x8000 zImage; fatload mmc 0 0x1000000 system.dtb; bootz 0x8000 - 0x1000000),引导内核。
      4. 内核初始化(设备树解析、驱动加载),挂载根文件系统(root=/dev/mmcblk0p2 rw)。
      5. 启动systemd(或sysvinit),运行/etc/rc.local中的初始化脚本,进入命令行。
    2. 关键参数:bootargs(内核启动参数,指定根文件系统位置、串口)、dtb(设备树路径)。
  • 视频资源:
  • 实操任务:
    1. 在 U-Boot 命令行执行printenv bootcmdprintenv bootargs,记录默认引导参数。
    2. 手动输入引导命令(fatload+bootz),观察串口输出,标记每个启动阶段的关键日志(如 "Uncompressing Linux..."、"Mounted root filesystem")。
周三:SD 卡启动镜像制作
  • 学习内容:
    1. SD 卡分区规划:
      • 第 1 分区(boot):FAT32 格式,容量 512MB,存放FSBL.elfu-boot.elfzImagesystem.dtbbitstream.bit(PL 比特流)。
      • 第 2 分区(root):EXT4 格式,容量剩余空间,存放根文件系统(rootfs.ext4)。
    2. 分区工具:Ubuntu 下使用gparted(图形化)或fdisk(命令行),Windows 下使用 DiskGenius。
    3. 镜像烧录步骤:
      1. 格式化第 1 分区为 FAT32,第 2 分区为 EXT4。
      2. 复制FSBL.elfu-boot.elfzImagesystem.dtb到 boot 分区;若需自动加载 PL 比特流,将bitstream.bit改名为system.bit放入 boot 分区。
      3. 烧录根文件系统:sudo dd if=rootfs.ext4 of=/dev/sdb2 bs=4M/dev/sdb2为 root 分区设备名,需确认无误)。
    4. 启动设置:开发板拨码开关设为 "SD 卡启动"(参考开发板手册,如正点原子 ZYNQ 开发板拨码为 "0011")。
  • 视频资源:
  • 实操任务:
    1. 使用 16GB SD 卡,通过gparted完成分区(boot:512MB FAT32,root:剩余 EXT4)。
    2. 烧录所有启动文件和根文件系统,将 SD 卡插入开发板,设置 SD 卡启动,上电后确认 Linux 正常启动(进入root@zynq:~#命令行)。
周四:Linux 命令行与网络配置
  • 学习内容:
    1. 常用 Linux 命令:
      • 文件操作:ls(列表)、cd(切换目录)、mkdir(创建目录)、cp(复制)、rm(删除)、vi(编辑)。
      • 系统信息:uname -r(内核版本)、df -h(磁盘占用)、free -h(内存占用)、ifconfig(网络信息)。
      • 用户管理:adduser <用户名>(创建用户)、passwd <用户名>(设置密码)、su <用户名>(切换用户)。
    2. 网络配置:
      • 动态 IP(DHCP):dhclient eth0eth0为网口名,ZYNQ 通常为eth0)。

      • 静态 IP:编辑/etc/network/interfaces,添加:

        plaintext

        复制代码
        auto eth0
        iface eth0 inet static
        address 192.168.1.100
        netmask 255.255.255.0
        gateway 192.168.1.1
      • 验证网络:ping 192.168.1.1(网关)、ping www.baidu.com(需配置 DNS,编辑/etc/resolv.conf添加nameserver 8.8.8.8)。

  • 视频资源:
  • 实操任务:
    1. 在开发板 Linux 命令行执行uname -rdf -hfree -h,截图保存输出。
    2. 配置静态 IP(如 192.168.1.100),设置 DNS,通过ping验证与 PC 的网络连通性;通过 SSH 工具(如 Putty、MobaXterm)远程登录开发板。
周五:Linux 应用程序交叉编译
  • 学习内容:
    1. 交叉编译概念:在 PC(x86 架构)编译能在开发板(ARM 架构)运行的程序,需使用 ARM 架构交叉编译器。
    2. Petalinux 交叉编译器路径:/<Petalinux安装路径>/tools/linux-i386/gcc-arm-linux-gnueabi/bin/arm-linux-gnueabihf-gcc
    3. 交叉编译流程:
      1. 编写 C 程序(如hello_zynq.c,实现打印 "Hello ZYNQ Linux!" 并控制 AXI GPIO 点亮 LED)。
      2. 编译命令:arm-linux-gnueabihf-gcc hello_zynq.c -o hello_zynq
      3. 文件传输:通过scpscp hello_zynq root@192.168.1.100:/home)或 U 盘复制到开发板。
      4. 运行程序:chmod +x hello_zynq(添加执行权限)、./hello_zynq
    4. 依赖库问题:若程序依赖第三方库(如libgpio.so),需将库文件一同复制到开发板/lib目录。
  • 视频资源:
  • 实操任务:
    1. 编写led_control.c程序:通过操作/sys/class/gpio目录下的文件(exportdirectionvalue)控制 AXI GPIO 连接的 LED(如 GPIO128)。
    2. 使用 Petalinux 交叉编译器编译程序,传输到开发板并运行,验证 LED 是否按程序逻辑闪烁(如每隔 1 秒翻转一次)。
周六:Linux 调试工具使用
  • 学习内容:
    1. 串口调试:通过minicomscreen工具连接开发板串口,捕获启动日志(screen /dev/ttyUSB0 115200)。
    2. 远程调试(GDB):
      1. 交叉编译时添加调试信息:arm-linux-gnueabihf-gcc -g hello_zynq.c -o hello_zynq
      2. 开发板运行 GDB 服务器:gdbserver 192.168.1.100:1234 ./hello_zynq(1234 为端口号)。
      3. PC 端启动交叉 GDB:arm-linux-gnueabihf-gdb hello_zynq,执行target remote 192.168.1.100:1234连接服务器,使用break(设断点)、run(运行)、step(单步)调试。
    3. 性能分析工具:top(进程 CPU 占用)、vmstat(内存 / IO 统计)、perf(内核性能分析,需内核启用PERF_EVENTS)。
  • 视频资源:
  • 实操任务:
    1. 使用 GDB 远程调试led_control.c程序,在 LED 翻转逻辑处设置断点,单步执行观察变量变化。
    2. 运行top命令,观察led_control进程的 CPU 占用率;运行free -h,记录内存使用情况,截图保存。
周日:综合项目(Linux 下 LED 控制与网络监控)
  • 项目任务:
    1. 功能需求:开发板 Linux 系统运行 LED 控制程序,支持通过网络(SSH)发送指令(如 "ON""OFF""TOGGLE")控制 LED 状态;程序将 LED 状态实时写入/tmp/led_status.txt文件,支持远程读取。
    2. 开发步骤:
      1. 编写net_led_control.c:使用socket实现 TCP 服务端,监听端口 8888;解析客户端指令,控制 GPIO;定时更新led_status.txt
      2. 交叉编译程序,传输到开发板/usr/bin目录,添加执行权限。
      3. 编写/etc/rc.local脚本,实现程序开机自启动(添加/usr/bin/net_led_control &)。
      4. PC 端通过telnet 192.168.1.100 8888连接开发板,发送指令测试 LED 控制;通过scp root@192.168.1.100:/tmp/led_status.txt .读取 LED 状态。
  • 文档输出:
    1. 程序代码(含注释),说明socket通信、GPIO 控制、文件写入逻辑。
    2. 测试报告:记录 TCP 连接成功率、LED 控制响应时间、开机自启动验证结果。
    3. 问题记录:如端口占用、GPIO 权限不足(需chmod 666 /sys/class/gpio/*)的解决方法。

第 7 月:ZYNQ Linux 驱动开发与设备树

第 1-2 周:Linux 驱动基础与字符设备驱动
周一:Linux 驱动概述与分类
  • 学习内容:
    1. 驱动作用:作为内核与硬件的中间层,屏蔽硬件差异,为应用程序提供统一接口(如open/read/write)。
    2. 驱动分类:
      • 字符设备驱动:按字节流访问(如 GPIO、UART、LED),最常用,需注册设备号、实现file_operations结构体。
      • 块设备驱动:按块访问(如 SD 卡、EMMC),支持随机读写,需实现block_device_operations
      • 网络设备驱动:处理网络数据包(如以太网、WiFi),需实现net_device_ops,无设备号。
    3. 驱动运行空间:内核空间(与用户空间隔离,需通过系统调用syscall通信),不能直接调用用户空间函数(如printf,需用printk)。
  • 视频资源:
  • 实操任务:
    1. 查看开发板 Linux 内核已加载的驱动:lsmod(显示内核模块)、cat /proc/devices(显示已注册的字符 / 块设备号)。
    2. 查找 AXI GPIO 驱动对应的设备号(字符设备,通常在240-255区间),记录设备名(如gpiochip0)。
周二:字符设备驱动核心结构
  • 学习内容:
    1. 核心数据结构:file_operations,定义驱动对外提供的接口函数,关键成员包括:
      • open:打开设备(如初始化 GPIO 方向)。
      • read:从设备读取数据(如读取 GPIO 电平)。
      • write:向设备写入数据(如设置 GPIO 电平)。
      • release:关闭设备(如释放资源)。
      • owner:通常设为THIS_MODULE,标记驱动所属模块。
    2. 设备号管理:
      • 静态申请:register_chrdev_region(dev_t from, unsigned count, const char *name),需提前确定设备号(如MKDEV(240, 0))。
      • 动态申请:alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name),内核自动分配,推荐使用。
      • 释放设备号:unregister_chrdev_region(dev_t from, unsigned count)
    3. 设备文件创建:驱动注册后,需在/dev目录创建设备文件(mknod /dev/led_drv c 240 0c表示字符设备),或通过udev自动创建。
  • 视频资源:
  • 实操任务:
    1. 编写最简字符设备驱动框架(led_drv.c):包含module_init(驱动初始化,申请设备号、注册file_operations)、module_exit(驱动卸载,释放设备号)、空实现的open/release函数。
    2. 编写Makefile(指定内核源码路径、交叉编译器),编译生成驱动模块(led_drv.ko)。
周三:驱动编译与加载
  • 学习内容:
    1. 驱动 Makefile 编写:需指定内核源码路径(Petalinux 工程的内核源码在build/tmp/work/zynq-generic-xilinx-linux-gnueabi/linux-xlnx/)、交叉编译器,核心内容:

      makefile

      复制代码
      KERNELDIR := /home/user/petalinux_project/build/tmp/work/zynq-generic-xilinx-linux-gnueabi/linux-xlnx/5.15.74-xilinx-v2022.2+gitAUTOINC+xxxxxx-r0/linux-xlnx-5.15.74-xilinx-v2022.2
      PWD := $(shell pwd)
      ARCH := arm
      CROSS_COMPILE := arm-linux-gnueabihf-
      
      obj-m += led_drv.o
      
      default:
          $(MAKE) -C $(KERNELDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules
      clean:
          $(MAKE) -C $(KERNELDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) clean
    2. 编译命令:make,生成led_drv.ko(内核模块文件)、led_drv.mod.c(模块依赖信息)。

    3. 模块加载 / 卸载:

      • 加载:insmod led_drv.ko(需 root 权限),通过dmesg查看驱动初始化日志。
      • 查看:lsmod | grep led_drv,确认模块已加载。
      • 卸载:rmmod led_drv,通过dmesg查看驱动卸载日志。
    4. 常见错误:内核版本不匹配(version magic错误,需确保驱动编译用内核源码与开发板运行内核版本一致)、依赖模块缺失。

  • 视频资源:
  • 实操任务:
    1. 完善led_drv.cmodule_initmodule_exit函数,添加printk日志(如 "led_drv init success!")。
    2. 编写 Makefile,编译驱动模块;将led_drv.ko传输到开发板,执行insmod加载,dmesg | tail查看日志;执行rmmod卸载,验证驱动加载 / 卸载正常。
周四:GPIO 驱动实战(基于寄存器操作)
  • 学习内容:
    1. ZYNQ AXI GPIO 寄存器映射:AXI GPIO 的基地址可从设备树获取(如0x41200000),核心寄存器包括:
      • DATA(偏移 0x00):GPIO 数据寄存器,读写 GPIO 电平。
      • DIR(偏移 0x04):GPIO 方向寄存器,1 为输出,0 为输入。
      • OEN(偏移 0x08):GPIO 输出使能寄存器,1 为使能输出。
    2. 内核空间地址映射:用户空间不能直接访问物理地址,需通过ioremap将物理地址映射为内核虚拟地址(void __iomem *gpio_base = ioremap(0x41200000, 0x10);),卸载时用iounmap释放。
    3. 寄存器操作函数:内核推荐使用readl/writel(而非直接指针操作),避免字节序问题,如:
      • u32 dir = readl(gpio_base + 0x04);(读取方向寄存器)。
      • writel(dir | (1 << 0), gpio_base + 0x04);(设置 GPIO0 为输出)。
  • 视频资源:
  • 实操任务:
    1. 完善led_drv.c:在open函数中映射 AXI GPIO 基地址,配置 GPIO0 为输出;在write函数中根据传入数据(如 1 为点亮,0 为熄灭)设置DATA寄存器;在release函数中iounmap释放地址。
    2. 编译驱动,加载到开发板;创建设备文件(mknod /dev/led_drv c 240 0);编写用户程序led_app.c(调用open/write控制 LED),交叉编译后运行,验证 LED 是否正常控制。
周五:中断驱动开发(PL 到 PS 中断)
  • 学习内容:
    1. ZYNQ 中断控制器(GIC):PS 的 GIC 支持 128 个中断,PL 中断通过IRQ_F2P(PL 到 PS 中断)引脚接入,中断号可从设备树获取(如61)。
    2. 中断驱动核心步骤:
      1. 申请中断:request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev_id)handler为中断服务函数(ISR),flagsIRQF_TRIGGER_RISING(上升沿触发)。
      2. 中断服务函数:irqreturn_t irq_handler(int irq, void *dev_id),需快速执行,避免阻塞;返回IRQ_HANDLED(中断已处理)或IRQ_NONE(未处理)。
      3. 释放中断:free_irq(unsigned int irq, void *dev_id),需在驱动卸载时调用。
    3. 中断下半部:若中断处理逻辑复杂,可通过taskletworkqueue将非紧急任务放到下半部执行,避免占用中断上下文(如tasklet_schedule(&my_tasklet);)。
  • 视频资源:
  • 实操任务:
    1. 硬件准备:在 PL 中设计按键电路,按键按下时产生上升沿信号,连接到 AXI GPIO 的中断引脚(如 GPIO1 的中断),设备树中配置中断号为 61。
    2. 编写key_irq_drv.c:申请中断 61(上升沿触发),中断服务函数中翻转 LED 状态;编译驱动,加载到开发板;按下按键,观察 LED 是否翻转,dmesg查看中断日志。
周六:DMA 驱动开发(PS DMA 数据传输)
  • 学习内容:
    1. ZYNQ PS DMA 控制器:PS 内置 8 通道 DMA,支持内存到内存、内存到外设、外设到内存的高速数据传输,不占用 CPU 资源;核心特性包括scatter-gather(分散 - 聚集)模式、中断通知。
    2. Linux DMA 框架:基于dmaengine子系统,核心 API 包括:
      • dma_request_chan:申请 DMA 通道。
      • dma_prep_slave_single:准备单块数据传输(指定源地址、目的地址、长度、方向)。
      • dma_submit/dma_async_issue_pending:提交并启动 DMA 传输。
      • dma_async_wait_for_completion:等待传输完成。
    3. DMA 传输流程:
      1. 申请 DMA 通道,配置传输参数(源 / 目的地址、长度)。
      2. 准备传输描述符,启动 DMA。
      3. 传输完成后,DMA 触发中断,通知 CPU 处理数据。
  • 视频资源:
  • 实操任务:
    1. 编写dma_mem2mem_drv.c:实现内存到内存的 DMA 传输(如从src_buf传输 1024 字节到dst_buf);在驱动中申请 DMA 通道,启动传输,等待完成后对比src_bufdst_buf数据是否一致。
    2. 编译驱动,加载到开发板;运行用户程序触发 DMA 传输,dmesg查看传输结果(如 "DMA transfer success, data match!");测试不同传输长度(1KB、1MB),记录传输时间,计算带宽。
周日:综合驱动项目(GPIO + 中断 + DMA 协同)
  • 项目任务:
    1. 功能需求:PL 中设计 ADC 采集模块(模拟电压采集),通过 AXI4-Stream 接口连接 PS DMA;按键按下时(中断触发),启动 DMA 传输,将 ADC 采集的 1024 字节数据从 PL 传输到 PS 内存;驱动将数据保存到/tmp/ad_data.bin,支持用户程序读取并打印。
    2. 开发步骤:
      1. 硬件设计:在 Vivado 中添加 AXI ADC IP 核、AXI Stream Data FIFO、PS DMA,配置中断(ADC 数据就绪中断),导出 XSA 文件。
      2. 驱动开发(adc_dma_irq_drv.c):申请 ADC 中断和 DMA 通道;中断触发时启动 DMA 传输;DMA 完成后读取数据,写入/tmp/ad_data.bin
      3. 测试验证:编译驱动和用户程序(read_adc.c,读取ad_data.bin并打印数据);加载驱动,按下按键,验证数据传输和保存功能。
  • 文档输出:
    1. 硬件 Block Design 截图,标注 ADC、FIFO、DMA 的连接关系。
    2. 驱动代码(含注释),说明中断处理、DMA 配置、数据保存逻辑。
    3. 测试报告:记录 ADC 采集精度(对比实际电压与采集值)、DMA 传输速率、中断响应时间。
第 3-4 周:设备树开发与驱动匹配
周一:设备树概述与结构
  • 学习内容:
    1. 设备树(Device Tree)作用:替代传统 Linux 的板级文件(board.c),用文本文件描述硬件资源(如 CPU、内存、外设地址、中断号),实现 "硬件描述与驱动代码分离"。
    2. 设备树文件格式:
      • 后缀:.dts(设备树源文件,针对特定板卡)、.dtsi(设备树头文件,通用硬件描述,可被多个.dts包含)。
      • 编译:通过dtc(Device Tree Compiler)编译为.dtb(设备树二进制文件),内核启动时加载。
    3. 核心结构:
      • 根节点:/,包含compatible属性(指定板卡型号,如xlnx,zynq-7000)。
      • 子节点:描述具体外设(如/soc/gpio@41200000@后为外设基地址)。
      • 属性:键值对,如compatible(驱动匹配标识)、reg(外设地址范围)、interrupts(中断号和触发方式)。
  • 视频资源:
  • 实操任务:
    1. 查看开发板 Linux 的设备树:cat /proc/device-tree/compatible(查看根节点compatible属性)、ls /proc/device-tree/soc/(查看 SOC 子节点)。
    2. 从 Petalinux 工程images/linux目录获取system.dts(可通过dtc -I dtb -O dts system.dtb > system.dts反编译.dtb),分析/soc/gpio@41200000节点的reginterrupts属性。
周二:设备树语法与常用属性
  • 学习内容:
    1. 基本语法:
      • 节点定义:node-name@address { ... };node-name为节点名,address为基地址(可选)。
      • 属性格式:
        • 字符串:compatible = "xlnx,axi-gpio-1.0";
        • 32 位整数:reg = <0x41200000 0x1000>;(基地址 + 地址长度)。
        • 中断属性:interrupts = <0 61 1>;0为中断控制器编号,61为中断号,1为上升沿触发)。
        • 引用其他节点:interrupt-parent = <&gic>;(引用 GIC 中断控制器节点)。
    2. 常用属性:
      • compatible:驱动与设备匹配的关键,驱动通过of_match_table匹配该属性。
      • reg:描述外设的物理地址范围,内核通过of_address_to_resource解析。
      • interrupts:描述中断信息,内核通过of_irq_get获取中断号。
      • status:设备状态,"okay"表示启用,"disabled"表示禁用。
  • 视频资源:
  • 实操任务:
    1. 编写自定义设备树片段(my_adc.dtsi):添加adc@43c00000节点,包含compatible = "my,adc-1.0"reg = <0x43c00000 0x1000>interrupts = <0 62 1>interrupt-parent = <&gic>属性。
    2. my_adc.dtsi包含到system.dts(添加#include "my_adc.dtsi"),重新编译设备树(petalinux-build -c device-tree),生成新的system.dtb;开发板加载新dtbcat /proc/device-tree/soc/adc@43c00000/compatible验证属性。
周三:ZYNQ 设备树定制(基于 Petalinux)
  • 学习内容:
    1. Petalinux 设备树目录结构:
      • 默认设备树:components/plnx_workspace/device-tree/device-tree/(包含zynq-7000.dtsizynq-zed.dts等)。
      • 用户定制:project-spec/meta-user/recipes-bsp/device-tree/files/,用户添加的.dtsi.bbappend文件会覆盖默认配置。
    2. 常用定制方法:
      • 方法 1:添加system-user.dtsi文件,在其中修改或添加节点(如启用 UART1、修改 GPIO 中断号)。
      • 方法 2:使用petalinux-config -c device-tree图形界面,配置硬件参数(如 DDR 容量、网口 PHY 地址)。
      • 方法 3:编写.bbappend文件,修改设备树编译选项(如添加宏定义)。
    3. 设备树编译:petalinux-build -c device-tree,编译结果输出到images/linux/system.dtb
  • 视频资源:
  • 实操任务:
    1. project-spec/meta-user/recipes-bsp/device-tree/files/目录创建system-user.dtsi,添加:

      dts

      复制代码
      /include/ "system.dts"
      &gpio@41200000 {
          status = "okay";
          interrupts = <0 61 1>;
      };
      &uart1 {
          status = "okay";
          reg = <0x40001000 0x1000>;
      };
    2. 编译设备树,生成新system.dtb;开发板加载后,ls /dev/ttyPS1确认 UART1 设备文件已创建;cat /proc/device-tree/soc/gpio@41200000/interrupts验证中断属性。

周四:设备树与驱动匹配(platform 驱动)
  • 学习内容:
    1. platform 驱动框架:Linux 为嵌入式设备设计的驱动框架,基于 "设备 - 驱动" 模型,通过设备树实现匹配,核心结构:
      • platform_driver:驱动结构体,包含probe(设备匹配成功时调用,初始化驱动)、remove(设备移除时调用,释放资源)、of_match_table(设备树匹配表)。
      • 匹配流程:内核遍历设备树节点,若节点compatible属性与驱动of_match_table中的compatible一致,则调用probe函数。
    2. 核心 API:
      • platform_driver_register:注册 platform 驱动。
      • platform_driver_unregister:注销 platform 驱动。
      • of_address_to_resource:从设备树节点解析reg属性,获取资源(地址、长度)。
      • of_irq_get:从设备树节点解析interrupts属性,获取中断号。
  • 视频资源:
  • 实操任务:
    1. 基于前序adc@43c00000设备树节点,编写adc_platform_drv.c
      • 定义of_match_table{.compatible = "my,adc-1.0", .data = NULL},
      • probe函数:解析reg属性获取 ADC 基地址,解析interrupts属性获取中断号,初始化 GPIO 和中断。
      • remove函数:释放中断和地址映射。
    2. 编译驱动,加载到开发板;dmesg查看是否打印 "adc platform driver probe success!",确认驱动与设备树匹配成功。
周五:设备树中断与 DMA 配置实战
  • 学习内容:
    1. 设备树中断配置细节:
      • 中断控制器节点:ZYNQ 的 GIC 节点通常为/soc/interrupt-controller@f8f01000compatiblearm,cortex-a9-gic
      • 中断属性格式:interrupts = <IRQ_TYPE_EDGE_RISING 61>(或显式指定控制器编号、中断号、触发方式:<0 61 1>)。
      • 中断亲和性:interrupts-affinity属性,指定中断绑定的 CPU 核心(如<&cpu0>)。
    2. 设备树 DMA 配置:
      • DMA 控制器节点:ZYNQ 的 PS DMA 节点为/soc/dma@f8003000compatiblexlnx,zynq-dma-1.0
      • DMA 属性:dma-coherent(表示 DMA 支持缓存一致性)、dma-ranges(描述 DMA 地址范围)。
      • 外设 DMA 配置:在外设节点中添加dmas = <&dma 0>(引用 DMA 控制器节点和通道)、dma-names = "tx"(DMA 通道名称)。
  • 视频资源:
  • 实操任务:
    1. 修改system-user.dtsi,在adc@43c00000节点中添加 DMA 配置:

      dts

      复制代码
      &adc@43c00000 {
          dmas = <&dma 0>;
          dma-names = "rx";
          dma-coherent;
      };
    2. 修改adc_platform_drv.cprobe函数:通过of_property_match_string获取 DMA 通道名称,通过dma_request_slave_channel申请 DMA 通道;编译驱动,加载后dmesg查看 DMA 通道申请结果。

周六:设备树工具与调试方法
  • 学习内容:
    1. 常用设备树工具:
      • dtc:设备树编译 / 反编译,如dtc -I dts -O dtb system.dts -o system.dtb(编译)、dtc -I dtb -O dts system.dtb -o system.dts(反编译)。
      • fdtdump:查看.dtb文件内容,如fdtdump system.dtb | grep adc(查找 adc 节点)。
      • ofdtget:读取设备树属性,如ofdtget system.dtb /soc/adc@43c00000 compatible(读取 compatible 属性)。
    2. 设备树调试方法:
      • 内核日志:dmesg | grep -i dt(查看设备树解析日志,如 "DT: parsing of /soc/gpio@41200000 node complete")。
      • /proc/device-tree:内核将加载的设备树以目录结构形式导出到该路径,可直接查看节点和属性。
      • of_node_dump:内核函数,在驱动中调用可打印节点信息(需开启内核调试)。
  • 视频资源:
  • 实操任务:
    1. 使用dtc反编译开发板当前加载的system.dtb(可通过cat /proc/device-tree/base/name确认路径),生成system_dump.dts,对比与原始system.dts的差异。
    2. 使用ofdtget读取/soc/uart1/compatible/soc/dma@f8003000/status属性,记录输出结果;使用dmesg | grep -i "adc"查看 ADC 节点解析日志。
周日:综合项目(设备树 + platform 驱动 + DMA 数据采集)
  • 项目任务:
    1. 功能需求:基于 platform 驱动框架,通过设备树配置 ADC、中断、DMA 资源;驱动实现 "按键中断触发→DMA 采集 ADC 数据→数据保存到文件" 的全流程;用户程序通过read系统调用读取 ADC 数据,在终端打印。
    2. 开发步骤:
      1. 设备树定制:完善adc@43c00000节点,添加compatiblereginterruptsdmasdma-names属性。
      2. 驱动开发:实现 platform 驱动的probe(解析设备树资源、初始化中断和 DMA)、remove(释放资源)、file_operationsread函数读取 ADC 数据)。
      3. 测试验证:编译驱动和设备树,加载到开发板;运行用户程序,按下按键,观察是否打印 ADC 采集数据;记录采集速率和数据精度。
  • 文档输出:
    1. 设备树节点代码(含注释),说明各属性的作用。
    2. 驱动代码(含probe、中断服务函数、DMA 处理函数),标注设备树资源解析过程。
    3. 测试报告:包含采集速率(如 100KB/s)、数据误差(如 ±5mV)、驱动加载 / 卸载稳定性测试结果。

第 8 月:PL 高级编程与 PS-PL 协同优化

第 1-2 周:PL 高级逻辑设计(流水线、BRAM、DSP)
周一:PL 流水线设计原理与实现
  • 学习内容:
    1. 流水线技术作用:将复杂逻辑拆解为多个 "阶段(Stage)",每个阶段在一个时钟周期内完成,提高电路的时钟频率(时序性能),常见于高速数据处理(如乘法、滤波、FFT)。
    2. 流水线关键参数:

继续生成

已完成思考

ZYNQ 系列芯片嵌入式与硬件系统知识学习全计划(基于国内视频资源)(续)

第三阶段:进阶阶段(第 6-9 月)------ 嵌入式 Linux 开发、PL 高级编程与硬件设计

第 8 月:PL 高级逻辑设计与 PS-PL 协同优化

第 1-2 周:PL 高级逻辑设计(流水线、BRAM、DSP)
周一:PL 流水线设计原理与实现(续)
  • 学习内容:
    1. 流水线关键参数:
      • 吞吐率:单位时间内处理的数据量,流水线满负荷时等于时钟频率(如 100MHz 时钟对应 100M 数据 / 秒)。
      • 延迟:数据从输入到输出的总时钟周期数(如 3 级流水线延迟为 3 个时钟周期)。
      • 资源消耗:每增加一个阶段需额外添加寄存器,会增加 Flip-Flop(触发器)资源占用。
    2. Verilog 实现方法:
      • 核心思路:用寄存器将长组合逻辑 "切割" 为多个短逻辑段,每个段在 1 个时钟周期内完成。

      • 示例:32 位加法器的 3 级流水线实现,将加法拆分为 "低 11 位加法→中 11 位加法→高 10 位加法",每级后添加寄存器锁存结果。

      • 代码结构: verilog

        复制代码
        module pipe_adder_32(
            input clk,
            input rst_n,
            input [31:0] a, b,
            output reg [31:0] sum
        );
        // 第一级流水线:低11位加法
        reg [10:0] sum1;
        reg [31:11] a1, b1;
        always @(posedge clk or negedge rst_n) begin
            if(!rst_n) begin sum1 <= 0; a1 <= 0; b1 <= 0; end
            else begin sum1 <= a[10:0] + b[10:0]; a1 <= a[31:11]; b1 <= b[31:11]; end
        end
        // 第二级流水线:中11位加法(含进位)
        reg [10:0] sum2;
        reg [31:22] a2, b2;
        reg c1; // 第一级进位
        always @(posedge clk or negedge rst_n) begin
            if(!rst_n) begin sum2 <= 0; a2 <= 0; b2 <= 0; c1 <= 0; end
            else begin {c1, sum2} <= a1[10:0] + b1[10:0] + (sum1 > 11'h7ff ? 1'b1 : 1'b0); a2
相关推荐
im_AMBER3 小时前
React 12
前端·javascript·笔记·学习·react.js·前端框架
清钟沁桐3 小时前
mlir 编译器学习笔记之四 -- 调度
笔记·学习·mlir
lijun_xiao20093 小时前
elasticsearch学习笔记-02
笔记·学习·elasticsearch
木木木丫3 小时前
嵌入式项目:韦东山驱动开发第六篇 项目总结——显示系统(framebuffer编程)
c语言·c++·驱动开发·dsp开发
NEU-UUN3 小时前
1.2.STM32简介——全程手敲板书
stm32·单片机·嵌入式硬件
柳鲲鹏3 小时前
RGB转换为NV12,查表式算法
linux·c语言·算法
三佛科技-134163842123 小时前
全自动削皮机方案,果蔬去皮机/削皮机MCU控制方案开发设计
单片机·嵌入式硬件
应用市场3 小时前
基于STM32的多模态智能门锁系统设计与实现
stm32·单片机·嵌入式硬件
xiaohai@Linux3 小时前
STM32在LVGL上实现移植FatFs文件系统(保姆级详细教程)
stm32·单片机·嵌入式硬件·lvgl·fatfs