0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ZYNQ常用外设设计:malloc与memcpy的使用方法

电子设计 来源:赛灵思中文社区论坛 作者:Wilson Qiu 2020-11-27 12:18 次阅读

作者:Wilson Qiu,Xilinx工程师

ZYNQ对Memory的操作

参考工程见“ZYBO_Memory_GPIO_Interrupt_demo.xpr”。

ZYNQ有专用的DDR Controller接口,如果外部硬件连接了DDR器件,于是在ZYNQ Processing System中正确配置了相应的信号参数后,DDR就可以成为ZYNQ的内存,在SDK中可以直接使用memcpy、memset以及类似的函数对于Memory空间进行操作。

Step1:查看ZYBO的原理图,找到相应的配置。ZYBO原理图中与DDR相关的部分如图 49所示。

图 49

于是得到两个信息,第一个所使用的芯片是MT41J128M16JT-125,第二个是两片DDR3颗粒是通过位拼接完成的,也就是数据位宽为32bit。

Step2:在Block Design中对DDR部分的参数进行配置。

图 50

Step3:完成Block Design设计,产生Bitstream,导入SDK。

图 51

Step4:在SDK中编写Memory测试代码。

#include 
#include 
#include "platform.h"
#include "xil_printf.h"
#include "xil_types.h"
#include "xil_io.h"
int main()
{
    u32 test_src[100];
    int i;
    int readback;
 
    init_platform();
    u32 *result = (u32*) malloc(sizeof(u32) * 100);
 
    if (result) {
       memset(result, 0, sizeof(u32) * 100);
    } else {
       return 0;
    }
 
    for(i=0;i<99;i++)
    {
       test_src[i]=i;
    }
 
   memcpy(result,test_src,100 * sizeof(u32));
 
    for(i=0;i<100;i++)
    {
       readback = Xil_In32(result+i);

其中特别需要学习的就是malloc与memcpy的使用方法。

ZYNQ中MIO/EMIO GPIO的使用

参考工程见“ZYBO_Memory_GPIO_Interrupt_demo.xpr”。

MIO是PS端的外部引脚,共有54个;EMIO是PL端的外部引脚,共有64个。ZYNQ支持通过配置将PS的控制器信号通过EMIO输出,例如PS自带的UART Controller,如果正常选择引脚只能选择MIO引脚输出,但是通过设置可以选择连接到EMIO引脚。同时EMIO引脚也可以作为PS端的扩展引脚,即经过扩展PS一共可以控制118个引脚。

该例程演示将4个EMIO设置为PS的扩展引脚,这4个EMIO连接着LED。于是,与“将用户逻辑设计封装成IP”中的实验相比,同样是控制外部4个LED,就不需要另外设计一个逻辑模块,并封装成IP作为PS的外设了,可以直接通过SDK的程序进行控制。

注意:

1. 用于扩展GPIO的EMIO和用于扩展外设的EMIO是完全独立的,GPIO的EMIO共有64个,由2个bank组成,如图 52所示。

图 52

2. EMIO的内部排序按照EMIO54、EMIO55... ... EMIO117,以此类推。有了EMIO的编号之后就与内部控制EMIO的寄存器一一对应;而EMIO在外部与外部引脚的对应关系又是可以通过管脚约束进行更改的。于是可以得出:不能通过EMIO的外部引脚的关系确定其内部寄存器的地址。工具对于EMIO GPIO的连接关系是按照从EMIO54开始依次向上排列。

Step1:在Block Design中加入ZYNQ7 Processing System,在ZYNQ7 Processing System配置中添加EMIO GPIO,如图 53所示。通过设置EMIO GPIO Width来选择扩展EMIO GPIO的个数,此时就完成了与内部寄存器之间的对应关系,规则就是从EMIO54开始向上排列。

图 53

Step2:将ZYNQ的EMIO连接到外部引脚。右击生成的GPIO信号,点击Make External。

图 54

Step3:约束EMIO与外部引脚Pad的对应关系以及EMIO的电平标准。

方法有两种:

第一种是通过XDC约束文件进行约束,需要先将Block Design生成HDL Wrapper,这样才能知道其引脚名称。

图 55

第二种方法就是Open Elaborated Design,在GUI中设置电平和引脚。

图 56

Step4:完成Block Design的综合、实现、生成Bitstream并导入SDK。

Step5:SDK中完成代码的编写,EMIO的代码编写需要包含的库文件是"xgpiops.h"。

#include "xgpiops.h"
static XGpioPs emio;
#define EMIO_54   54
#define EMIO_55   55
#define EMIO_56   56
#define EMIO_57   57

int main()
{
    //定义GPIOPS型指针,用于初始化时绑定硬件
    XGpioPs_Config *ConfigPtrPS;
    init_platform();
    //初始化GPIOPS,将ConfigPtrPS与硬件绑定
    ConfigPtrPS = XGpioPs_LookupConfig(0);
       XGpioPs_CfgInitialize(&emio, ConfigPtrPS,
                     ConfigPtrPS- > BaseAddr);
       //设置EMIO的方向,并使能EMIO
        XGpioPs_SetDirectionPin(&emio, EMIO_54, 1);
        XGpioPs_SetOutputEnablePin(&emio, EMIO_54, 1);
        XGpioPs_SetDirectionPin(&emio, EMIO_55, 1);
        XGpioPs_SetOutputEnablePin(&emio, EMIO_55, 1);
        XGpioPs_SetDirectionPin(&emio, EMIO_56, 1);
        XGpioPs_SetOutputEnablePin(&emio, EMIO_56, 1);
        XGpioPs_SetDirectionPin(&emio, EMIO_57, 1);
        XGpioPs_SetOutputEnablePin(&emio, EMIO_57, 1);
 
      while(1)
      {
       // 向EMIO写入数据,即驱动EMIO引脚
      XGpioPs_WritePin(&emio, EMIO_54, 0x0);
      XGpioPs_WritePin(&emio, EMIO_55, 0x0);
      XGpioPs_WritePin(&emio, EMIO_56, 0x0);
      XGpioPs_WritePin(&emio, EMIO_57, 0x0);
       usleep(200000);
      XGpioPs_WritePin(&emio, EMIO_54, 0x1);
      XGpioPs_WritePin(&emio, EMIO_55, 0x1);
      XGpioPs_WritePin(&emio, EMIO_56, 0x1);
      XGpioPs_WritePin(&emio, EMIO_57, 0x1);
       usleep(200000);
      }

    cleanup_platform();
    return 0;
}

Step6:如果需要将EMIO作为输入端口,只需要将IO的方向设置为input。对于IO,作为输出的时候需要Enable,但是作为输入是永远使能的,不需要额外的Enable。具体代码如图 57所示。

图 57

补充说明:

MIO和EMIO都属于PS的GPIO,用于指示的变量类型为XGpioPs;而使用AXI_GPIO外设的GPIO,由于是属于PL的,所以指示这些IO的变量类型为XGpio。

MIO和EMIO的控制对于SDK是完全相同的,其地址偏移量也是排在一起的,MIO从0排到53,EMIO接着从54开始。示例代码中显示的是EMIO作为输出和MIO作为输入,只需要将引脚编号的宏定义改为需要的MIO或者EMIO编号即可使用。

在硬件配置时MIO的配置方法与EMIO有所不同,EMIO的配置如图 53所示。而MIO由于不像EMIO,外部管脚是确定的,所以可以在ZYNQ7 Processing System配置时同时完成属性以及电平的设置,如图 58所示。

图 58

ZYNQ中Interrupt使用

参考工程见“ZYBO_Memory_GPIO_Interrupt_demo.xpr”。

ZYNQ中的中断管理是通过Generic Interrupt Controller(GIC)完成的。

任何的中断功能都需要两步,第一步是配置相应的中断,第二步是设置中断触发之后的服务函数。

配置相应中断分以下几个步骤:

1. 使能相应的功能,例如GPIO中断需要首先使能和配置GPIO;Timer中断需要首先使能和配置Timer;

图 59

2. 初始化并配置使能GIC,还要使能异常处理。第1步中的操作对于每个中断源来说都不相同,但是这一步的配置对于不同中断源而言是类似的。不同之处在于有一个参数:中断ID,即例子中的52是变化的,52是GPIO的中断号,其他中端需要使用不同的ID。该值可以在UG585中断的相关章节查询到,如图 61所示。

另一个区别就是XScuGic_Connect时的服务子函数不同。

图 60

图 61

3. 编写中断服务函数,需要注意的是进入服务函数后首先需要禁止中断,保证在处理中断时不会再次因触发中断而程序跳转;另外就是需要清除中断标志位,否则会不断触发中断。

图 62

源代码见附件。

ZYNQ CPU内部任何有定时器,在Vivado的ZYNQ配置中无需任何操作就可以在SDK中直接使用。与GPIO中断类似,Timer的中断也包含相同的几步操作,下面给出各个阶段的代码片段,完整代码见附件。

1. 初始化Timer。

图 63

2. 初始化GIC,设置中断服务函数入口。

图 64

3. 配置Timer工作模式,导入计数初值,使能中断。

图 65

4. 编写中断服务函数,进入中断后首先Disable中断,清楚中断标志位;然后进行中断处理;退出中断服务函数前重新使能中断。

图 66

Appendix 1: 配套工程

编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • DDR
    DDR
    +关注

    关注

    11

    文章

    712

    浏览量

    65337
  • Zynq
    +关注

    关注

    10

    文章

    609

    浏览量

    47181
  • memcpy
    +关注

    关注

    0

    文章

    9

    浏览量

    2831
  • malloc
    +关注

    关注

    0

    文章

    52

    浏览量

    73
收藏 人收藏

    评论

    相关推荐

    AB伺服软件使用方法

    AB伺服软件使用方法
    发表于 12-24 14:45 0次下载

    示波器高压探头使用方法

    示波器高压探头是一种用于测量高电压信号的仪器,通常用于高压电源、电机、变压器等电气设备的测试。以下是示波器高压探头的详细使用方法
    的头像 发表于 10-03 16:43 443次阅读

    TI mmWave Radar sensor硬件外设设计参考

    电子发烧友网站提供《TI mmWave Radar sensor硬件外设设计参考.pdf》资料免费下载
    发表于 09-27 11:06 0次下载
    TI mmWave Radar sensor硬件<b class='flag-5'>外设设</b>计参考

    DC/DC模拟的基本使用方法和特性确认方法

    本篇介绍了DC/DC模拟的基本使用方法及确认基本特性的方法
    的头像 发表于 08-20 17:08 690次阅读
    DC/DC模拟的基本<b class='flag-5'>使用方法</b>和特性确认<b class='flag-5'>方法</b>

    浅谈锡膏的储存及使用方法

    锡膏(焊锡膏)是电子组装过程中常用的材料,它的储存和使用方法对保证焊接质量和性能至关重要。以下是详细的储存及使用方法
    的头像 发表于 06-27 10:02 885次阅读

    电流探头的使用方法及测量技巧

    电流探头是电子测量领域中常用的工具,用于测量电路中的电流。它们通常用于连接示波器或多用途数字测量仪器,以便观测和分析电流波形。本文将介绍电流探头的使用方法以及一些测量技巧,帮助您更好地进行电流测量
    的头像 发表于 06-17 13:42 639次阅读
    电流探头的<b class='flag-5'>使用方法</b>及测量技巧

    可编程电源使用方法

    可编程电源使用方法 可编程电源使用方法 摘要:本文详细介绍了可编程电源的使用方法,包括其基本概念、主要功能、选择原则、操作步骤、注意事项以及实际应用案例,旨在帮助读者全面了解可编程电源
    的头像 发表于 06-10 15:29 1005次阅读

    如何在不同频率下设置不同的外设

    我的预期。 请告诉我,我的理解是否正确? 或建议我一种配置每个外设方法,如 SPI 为 4Mhz,定时器为 16Mhz,I2C 为 2Mhz 另外,当我这样做时,工作正常,但用这种方法,我无法为不同的
    发表于 05-29 06:37

    malloc和calloc功能来实现DAQ,在调试模式下调用calloc和malloc函数时似乎卡住了,为什么?

    我正在使用 malloc 和 calloc 功能来实现 DAQ。 我使用的是 TLE9893 系列芯片。 代码编译良好,但在调试模式下调用 calloc 和 malloc 函数时似乎卡住了。 我尝试
    发表于 05-27 08:29

    手柄控制代码及使用方法

    手柄控制代码及使用方法
    的头像 发表于 05-15 10:19 1820次阅读

    555集成芯片的使用方法

    555集成芯片的使用方法主要依赖于其特定的引脚功能和电路设计。
    的头像 发表于 03-25 14:39 1487次阅读

    RT-Thread驱动开发指南进阶篇-动手驱动先楫未适配的外设LCD

    经过上一篇的《《RT-Thread设备驱动开发指南》基础篇--以先楫bsp的hwtimer设备为例》阐述,可以大致了解到RT-thread设备驱动开发的方法步骤,开发指南中的进阶篇外设主要是比基础篇
    的头像 发表于 02-25 11:04 2548次阅读
    RT-Thread驱动开发指南进阶篇-动手驱动先楫未适配的<b class='flag-5'>外设</b>LCD

    示波器的使用方法步骤 示波器的直流耦合和交流耦合的区别

    示波器是一种广泛应用于电子测量的仪器,它用于显示电压波形、频率、相位等电信号的特性。下面将详细介绍示波器的使用方法步骤以及直流耦合和交流耦合的区别。 一、示波器的使用方法步骤 连接电源和信号源:首先
    的头像 发表于 02-04 13:36 3030次阅读

    射频电缆组件的使用方法和注意事项

    详细介绍射频电缆组件的使用方法和注意事项,以帮助读者正确地使用和维护它们。 一、射频电缆组件的基本知识 1. 射频电缆组件的类型:常用的射频电缆组件有同轴电缆、微型同轴电缆、平衡和不平衡电缆、半刚性电缆等。 2. 射频
    的头像 发表于 01-05 15:08 659次阅读

    磁场探头和电场探头的使用方法与技巧

    磁场探头和电场探头的使用方法与技巧  磁场探头和电场探头是用于测量磁场和电场的仪器。它们在科学实验、工程设计和实际应用中都起着重要的作用。本文将详细介绍磁场探头和电场探头的使用方法和技巧。 一、磁场
    的头像 发表于 01-05 14:31 921次阅读