zynq 7010/020 AMP双核通信-Vitis2023/2024

AMP双核通信网上一堆重复性的,就不搬运了。
vivado创建工程忽略。本工程只需要保留串口功能和mio即可,不涉及PL端。
仅记录自己的使用过程:(借鉴了原子哥和野火哥)

Vitis创建工程

创建2个platform和2个APP

在这里插入图片描述

ddr设置
app0

在这里插入图片描述

app1

在这里插入图片描述

添加宏定义

在platform cpu1设置中添加-DUSE_AMP=1

  • name:proc_extra_compiler_flags
  • value: -g -Wall -Wextra -fno-tree-loop-distribute-patterns -DUSE_AMP=1
	注意value中使用空格分开

在这里插入图片描述
程序思路:比较简单
在这里插入图片描述

添加程序

CPU0程序
· 配置共享内存地址
· 软中断初始化
· 等待接收串口数据
#include "stdio.h"
#include "xparameters_ps.h"
#include "xil_printf.h"
#include "xscugic.h"
#include "xil_exception.h"
#include "xil_mmu.h"

#define INTC_DEVICE_ID              XPAR_SCUGIC_SINGLE_DEVICE_ID
#define SHARE_BASE_ADDR             0xffff0000  // Shared memory base address
#define CPU1_COPY_ADDR              0xfffffff0 //存放 CPU1 应用起始地址的地址
#define CPU1_START_ADDR             0x10000000//CPU1应用的起始地址

#define CPU1_ID                     XSCUGIC_SPI_CPU1_MASK
#define SOFT_INTR_ID_TO_CPU0        0//CPU0的软中断ID
#define SOFT_INTR_ID_TO_CPU1        1//CPU1的软中断ID

#define sev()                       __asm__("sev")

XScuGic intc;            //定义中断控制器实例
int rec_freq_flag = 0;
int freq_grea = 0;

//启动CPU1,用于固化程序
static void start_cpu1()
{
    //向CPU1_COPY_ADDR写入CPU1应用的起始地址
    Xil_Out32(CPU1_COPY_ADDR, CPU1_START_ADDR);
    dmb();
    sev();
}

static void soft_intr_handler(void *CallbackRef)
{
    xil_printf("cpu0 recive cpu1 intr\r\n");
    rec_freq_flag = 0;
}

static void cpu0_intr_init(XScuGic *intc_ptr)
{

    XScuGic_Config *intc_cfg_ptr;
    intc_cfg_ptr = XScuGic_LookupConfig(INTC_DEVICE_ID);
    if (intc_cfg_ptr == NULL) {
        xil_printf("XScuGic_LookupConfig error\r\n");
        return;
    }
    XScuGic_CfgInitialize(intc_ptr, intc_cfg_ptr, intc_cfg_ptr->CpuBaseAddress);
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XScuGic_InterruptHandler, intc_ptr);
    Xil_ExceptionEnable();
    XScuGic_Connect(intc_ptr, SOFT_INTR_ID_TO_CPU0, (Xil_ExceptionHandler)soft_intr_handler, (void *)intc_ptr);
    XScuGic_Enable(intc_ptr, SOFT_INTR_ID_TO_CPU0);
}



int main()
{
    xil_printf("Hello World\r\n");
    Xil_SetTlbAttributes(SHARE_BASE_ADDR, 0x14de2);//禁用OCM的cache

    Xil_SetTlbAttributes(CPU1_COPY_ADDR, 0x14de2);//禁用OCM的cache

    // start_cpu1();//使用JTAG启动CPU1时,可以注释掉
    cpu0_intr_init(&intc);//初始化CPU0的中断,来响应CPU1的中断
    while (1) {
        if (rec_freq_flag == 0) {
            xil_printf("this is cpu0,please input a num:\r\n");
            scanf("%d", &freq_grea);
            xil_printf("cpu0 input num is %d\r\n", freq_grea);
            Xil_Out8(SHARE_BASE_ADDR, freq_grea);

            XScuGic_SoftwareIntr(&intc, SOFT_INTR_ID_TO_CPU1, CPU1_ID);
            rec_freq_flag = 1;
        }
    }

    return 0;
}


CPU1程序
#include "stdio.h"
#include "xparameters_ps.h"
#include "xil_printf.h"
#include "xgpiops.h"
#include "xil_mmu.h"
#include "xil_exception.h"
#include "xscugic.h"
#include "sleep.h"

#define INTC_DEVICE_ID              XPAR_SCUGIC_SINGLE_DEVICE_ID
#define SHARE_BASE_ADDR             0xffff0000  // Shared memory base address

#define CPU0_ID                     XSCUGIC_SPI_CPU0_MASK
#define SOFT_INTR_ID_TO_CPU0        0//CPU0的软中断ID
#define SOFT_INTR_ID_TO_CPU1        1//CPU1的软中断ID

#define PS_LED1                     0
#define PL_LED1                     55

#define input                       0
#define output                      1

XGpioPs gpiops_inst;
XScuGic Intc;            //定义中断控制器实例
int soft_intr_flag = 0;
int freq_gear = 1000;

static void led_init()
{
    xil_printf("led init\r\n");
    XGpioPs_Config *gpiops_cfg_ptr;
    gpiops_cfg_ptr = XGpioPs_LookupConfig(0);
    XGpioPs_CfgInitialize(&gpiops_inst, gpiops_cfg_ptr, gpiops_cfg_ptr->BaseAddr);
    XGpioPs_SetDirectionPin(&gpiops_inst, PS_LED1, output);
    XGpioPs_SetOutputEnablePin(&gpiops_inst, PS_LED1, 1);
    XGpioPs_WritePin(&gpiops_inst, PS_LED1, 0);
}

static void soft_intr_handler(void *CallbackRef)
{
    xil_printf("cpu1 recive cpu0 intr\r\n");
    soft_intr_flag = 1;
}
static void cpu1_intr_init(XScuGic *intc_ptr)
{
    XScuGic_Config *intc_cfg_ptr;
    intc_cfg_ptr = XScuGic_LookupConfig(INTC_DEVICE_ID);
    XScuGic_CfgInitialize(intc_ptr, intc_cfg_ptr, intc_cfg_ptr->CpuBaseAddress);
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XScuGic_InterruptHandler, intc_ptr);
    Xil_ExceptionEnable();

    XScuGic_Connect(intc_ptr, SOFT_INTR_ID_TO_CPU1, (Xil_ExceptionHandler)soft_intr_handler, (void *)intc_ptr);
    XScuGic_Enable(intc_ptr, SOFT_INTR_ID_TO_CPU1);
}


int main()
{

    Xil_SetTlbAttributes(SHARE_BASE_ADDR, 0x14de2);//禁用OCM的cache
    led_init();
    cpu1_intr_init(&Intc);

    while (1) {
        if (soft_intr_flag) {
            freq_gear = Xil_In8(SHARE_BASE_ADDR);
            xil_printf("cpu1 recive freq gear: %d\r\n", freq_gear);

            XScuGic_SoftwareIntr(&Intc, SOFT_INTR_ID_TO_CPU0, CPU0_ID);
            soft_intr_flag = 0;
        }
        XGpioPs_WritePin(&gpiops_inst, PS_LED1, 1);
        usleep(freq_gear * 1000);
        XGpioPs_WritePin(&gpiops_inst, PS_LED1, 0);
        usleep(freq_gear * 1000);

    }

    return 0;
}


下载程序

这里选择的是使用app1下载
在这里插入图片描述
在这里插入图片描述

点击加号,选择处理器核elf文件
在这里插入图片描述

运行程序

在这里插入图片描述

需要注意的是,如果使用普通串口助手,使用scanf函数无法输入的,需要使用串口终端,如putty,mobaxterm

在这里插入图片描述

文档共60页。主要向初学者提供了Zynq开发的技术方向,针对不同应用给出了基本的参考文档;同时对Zynq双核AMP加载方式做了详细描述,对Zynq的fsbl启动流程做了简单介绍。章节如下: Zynq User Guide 1 介绍 4 2 快速上手指南 4 3 多核开发教程 4 3.1 AMP开发说明 6 3.1.1 快速生成amp工程 6 3.1.2 Generating Boot File 8 3.1.3 烧写程序 9 3.1.4 启动 10 3.1.5 调试 10 3.1.6 总结 11 3.2 SMP开发说明 11 4 ZC706启动代码分析 11 4.1 启动代码 12 4.2 FSBL流程(FOR AMP) 13 4.3 CPU0启动CPU1流程 14 5 程序在线烧写方案及流程 14 5.1 程序烧写需求 14 5.2 提出该需求的原因 14 5.3 程序烧写方案 14 5.3.1 BOOT.BIN组成 14 5.3.2 BOOT.BIN生成方法 15 5.4 FSBL.BIN和APP.BIN等的生成 15 5.5 制作*BIN及烧写的具体步骤 15 5.5.1 制作*bin流程 15 5.5.2 BOOT.bin制作过程 15 5.5.3 FSBL.bin和APP.bin等的生成过程 22 5.6 烧写BOOT.BIN步骤 26 5.6.1 通过SDK工具烧写步骤 26 5.6.2 通过上位机烧写软件的烧写步骤 29 5.6.3 通过串口调试助手烧写步骤 29 6 Zynq Qspi控制器 30 6.1 基本特性 30 6.2 I/O接口 31 6.3 QSPI控制器模式 33 6.3.1 I/O模式 33 6.3.2 线性地址(linear address)模式 33 6.3.3 传统(legacy)SPI模式 34 6.4 QSPI 例程 34 6.5 QSPI控制器支持访问32MB方法 35 6.5.1 Bank地址寄存器(Bank address register) 35 6.5.2 扩展地址模式(Extended address mode) 35 6.5.3 使用新写命令(New commands) 35 6.6 QSPI FLASH选择 35 6.7 作为BOOT器件考虑 35 7 µC/OS系统启动指南 36 7.1 INTRODUCTION 36 7.1.1 Software Requirements 36 7.1.2 Hardware Requirements 36 7.2 HARDWARE DESIGN 37 7.2.1 Step 1. Invoke the Vivado IDE and Create a project 37 7.2.2 Step 2. Create an IP Integrator Design 39 7.2.3 Step 3. Add and setup the Zynq processor system IP block 39 7.2.4 Step 4. Customize the Zynq block for our design 41 7.2.5 Step 5. Add the soft peripherals 45 7.2.6 Step 6. Generate HDL Design Files 47 7.2.7 Step 7. Synthesis, Implement and Generate Bitstream 48 7.3 SOFTWARE DESIGN 49 7.3.1 Step 1. Installation of the µC/OS Repository 49 7.3.2 Step 2. Generate the µC/OS BSP 50 7.3.3 Step 3. Build and Debug the Demonstration Project 54 7.3.4 Step 4. Program the AXI Timer 0 with the ucos_axitimer Driver 55 7.3.5 Step 5. Program the AXI Timer 1 with the Xilinx tmrctr Driver 58 7.4 CONCLUSION 59 8 Linux系统启动指南 59
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值