在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    瀏覽量

    65401
  • Zynq
    +關注

    關注

    10

    文章

    610

    瀏覽量

    47208
  • memcpy
    +關注

    關注

    0

    文章

    9

    瀏覽量

    2834
  • malloc
    +關注

    關注

    0

    文章

    52

    瀏覽量

    73
收藏 人收藏

    評論

    相關推薦

    AB伺服軟件使用方法

    AB伺服軟件使用方法
    發表于 12-24 14:45 ?0次下載

    示波器高壓探頭使用方法

    示波器高壓探頭是一種用于測量高電壓信號的儀器,通常用于高壓電源、電機、變壓器等電氣設備的測試。以下是示波器高壓探頭的詳細使用方法
    的頭像 發表于 10-03 16:43 ?461次閱讀

    TI mmWave Radar sensor硬件外設設計參考

    電子發燒友網站提供《TI mmWave Radar sensor硬件外設設計參考.pdf》資料免費下載
    發表于 09-27 11:06 ?0次下載
    TI mmWave Radar sensor硬件<b class='flag-5'>外設設</b>計參考

    探針頭型使用方法有哪些

    探針頭型的使用方法多種多樣,具體取決于探針頭型的類型、被測對象的特性以及測試需求。以下是一些常見探針頭型的使用方法概述: 1. 凹頭探針 用途 :主要用于測試長導腳、端子及繞線柱等較長或較粗的被測點
    的頭像 發表于 09-07 10:57 ?729次閱讀

    DC/DC模擬的基本使用方法和特性確認方法

    本篇介紹了DC/DC模擬的基本使用方法及確認基本特性的方法
    的頭像 發表于 08-20 17:08 ?725次閱讀
    DC/DC模擬的基本<b class='flag-5'>使用方法</b>和特性確認<b class='flag-5'>方法</b>

    淺談錫膏的儲存及使用方法

    錫膏(焊錫膏)是電子組裝過程中常用的材料,它的儲存和使用方法對保證焊接質量和性能至關重要。以下是詳細的儲存及使用方法
    的頭像 發表于 06-27 10:02 ?941次閱讀

    電流探頭的使用方法及測量技巧

    電流探頭是電子測量領域中常用的工具,用于測量電路中的電流。它們通常用于連接示波器或多用途數字測量儀器,以便觀測和分析電流波形。本文將介紹電流探頭的使用方法以及一些測量技巧,幫助您更好地進行電流測量
    的頭像 發表于 06-17 13:42 ?673次閱讀
    電流探頭的<b class='flag-5'>使用方法</b>及測量技巧

    可編程電源使用方法

    可編程電源使用方法 可編程電源使用方法 摘要:本文詳細介紹了可編程電源的使用方法,包括其基本概念、主要功能、選擇原則、操作步驟、注意事項以及實際應用案例,旨在幫助讀者全面了解可編程電源
    的頭像 發表于 06-10 15:29 ?1059次閱讀

    如何在不同頻率下設置不同的外設

    我的預期。 請告訴我,我的理解是否正確? 或建議我一種配置每個外設方法,如 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 ?1892次閱讀

    555集成芯片的使用方法

    555集成芯片的使用方法主要依賴于其特定的引腳功能和電路設計。
    的頭像 發表于 03-25 14:39 ?1546次閱讀

    RT-Thread驅動開發指南進階篇-動手驅動先楫未適配的外設LCD

    經過上一篇的《《RT-Thread設備驅動開發指南》基礎篇--以先楫bsp的hwtimer設備為例》闡述,可以大致了解到RT-thread設備驅動開發的方法步驟,開發指南中的進階篇外設主要是比基礎篇
    的頭像 發表于 02-25 11:04 ?2636次閱讀
    RT-Thread驅動開發指南進階篇-動手驅動先楫未適配的<b class='flag-5'>外設</b>LCD

    示波器的使用方法步驟 示波器的直流耦合和交流耦合的區別

    示波器是一種廣泛應用于電子測量的儀器,它用于顯示電壓波形、頻率、相位等電信號的特性。下面將詳細介紹示波器的使用方法步驟以及直流耦合和交流耦合的區別。 一、示波器的使用方法步驟 連接電源和信號源:首先
    的頭像 發表于 02-04 13:36 ?3140次閱讀

    游標卡尺的使用方法及注意事項

    游標卡尺是一種常用的測量工具,可以對物體的長度、寬度和深度進行精確測量。它的主要部件包括刻度板、定位爪和可動爪。游標卡尺的使用方法相對簡單,但是在具體操作過程中需要注意一些事項,以確保測量的準確性
    的頭像 發表于 01-19 10:01 ?6892次閱讀
    主站蜘蛛池模板: 丁香月婷婷| bt天堂在线www种子搜索| 四虎影院.com| 四虎国产精品成人永久免费影视| 婷婷综合激情| 日本在线观看www| 欧美zooz人与禽交| 国产爱搞| 国产精品美女久久久久网| 在线免费看黄的网站| 97人人看| 色综合免费视频| 成片免费的禁v影片| h在线观看网站| 饥渴少妇videos| 五月婷婷深爱五月| 欧美一区二区三区不卡片| 激情网页| 午夜小视频男女在线观看| 黄 色 成 年人网站| avtt天堂网 手机资源| 狠狠色噜噜综合社区| 天天更新影院| 久青草国产观看在线视频| 不卡无毒免费毛片视频观看| 天天艹综合| 欧美最猛黑人xxxx黑人猛交69| 国产精品9999| 亚洲一区免费观看| 性欧美xxxx视频| 免费观看三级毛片| 一本到在线观看视频不卡| 国产在线观看www鲁啊鲁免费| 中文字幕二区| 亚洲精品视频区| 久久综合色婷婷| 五月天在线婷婷| 日韩欧美高清色码| 一区二区影院| 免费观看欧美一级片| 亚洲第一在线|