91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ZYNQ常用外設(shè)設(shè)計:malloc與memcpy的使用方法

電子設(shè)計 ? 來源:賽靈思中文社區(qū)論壇 ? 作者: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中正確配置了相應(yīng)的信號和參數(shù)后,DDR就可以成為ZYNQ的內(nèi)存,在SDK中可以直接使用memcpy、memset以及類似的函數(shù)對于Memory空間進行操作。

Step1:查看ZYBO的原理圖,找到相應(yīng)的配置。ZYBO原理圖中與DDR相關(guān)的部分如圖 49所示。

圖 49

于是得到兩個信息,第一個所使用的芯片是MT41J128M16JT-125,第二個是兩片DDR3顆粒是通過位拼接完成的,也就是數(shù)據(jù)位寬為32bit。

Step2:在Block Design中對DDR部分的參數(shù)進行配置。

圖 50

Step3:完成Block Design設(shè)計,產(chǎn)生Bitstream,導(dǎo)入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);

其中特別需要學(xué)習(xí)的就是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引腳輸出,但是通過設(shè)置可以選擇連接到EMIO引腳。同時EMIO引腳也可以作為PS端的擴展引腳,即經(jīng)過擴展PS一共可以控制118個引腳。

該例程演示將4個EMIO設(shè)置為PS的擴展引腳,這4個EMIO連接著LED。于是,與“將用戶邏輯設(shè)計封裝成IP”中的實驗相比,同樣是控制外部4個LED,就不需要另外設(shè)計一個邏輯模塊,并封裝成IP作為PS的外設(shè)了,可以直接通過SDK的程序進行控制。

注意:

1. 用于擴展GPIO的EMIO和用于擴展外設(shè)的EMIO是完全獨立的,GPIO的EMIO共有64個,由2個bank組成,如圖 52所示。

圖 52

2. EMIO的內(nèi)部排序按照EMIO54、EMIO55... ... EMIO117,以此類推。有了EMIO的編號之后就與內(nèi)部控制EMIO的寄存器一一對應(yīng);而EMIO在外部與外部引腳的對應(yīng)關(guān)系又是可以通過管腳約束進行更改的。于是可以得出:不能通過EMIO的外部引腳的關(guān)系確定其內(nèi)部寄存器的地址。工具對于EMIO GPIO的連接關(guān)系是按照從EMIO54開始依次向上排列。

Step1:在Block Design中加入ZYNQ7 Processing System,在ZYNQ7 Processing System配置中添加EMIO GPIO,如圖 53所示。通過設(shè)置EMIO GPIO Width來選擇擴展EMIO GPIO的個數(shù),此時就完成了與內(nèi)部寄存器之間的對應(yīng)關(guān)系,規(guī)則就是從EMIO54開始向上排列。

圖 53

Step2:將ZYNQ的EMIO連接到外部引腳。右擊生成的GPIO信號,點擊Make External。

圖 54

Step3:約束EMIO與外部引腳Pad的對應(yīng)關(guān)系以及EMIO的電平標準。

方法有兩種:

第一種是通過XDC約束文件進行約束,需要先將Block Design生成HDL Wrapper,這樣才能知道其引腳名稱。

圖 55

第二種方法就是Open Elaborated Design,在GUI中設(shè)置電平和引腳。

圖 56

Step4:完成Block Design的綜合、實現(xiàn)、生成Bitstream并導(dǎo)入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);
       //設(shè)置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寫入數(shù)據(jù),即驅(qū)動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的方向設(shè)置為input。對于IO,作為輸出的時候需要Enable,但是作為輸入是永遠使能的,不需要額外的Enable。具體代碼如圖 57所示。

圖 57

補充說明:

MIO和EMIO都屬于PS的GPIO,用于指示的變量類型為XGpioPs;而使用AXI_GPIO外設(shè)的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配置時同時完成屬性以及電平的設(shè)置,如圖 58所示。

圖 58

ZYNQ中Interrupt使用

參考工程見“ZYBO_Memory_GPIO_Interrupt_demo.xpr”。

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

任何的中斷功能都需要兩步,第一步是配置相應(yīng)的中斷,第二步是設(shè)置中斷觸發(fā)之后的服務(wù)函數(shù)。

配置相應(yīng)中斷分以下幾個步驟:

1. 使能相應(yīng)的功能,例如GPIO中斷需要首先使能和配置GPIO;Timer中斷需要首先使能和配置Timer;

圖 59

2. 初始化并配置使能GIC,還要使能異常處理。第1步中的操作對于每個中斷源來說都不相同,但是這一步的配置對于不同中斷源而言是類似的。不同之處在于有一個參數(shù):中斷ID,即例子中的52是變化的,52是GPIO的中斷號,其他中端需要使用不同的ID。該值可以在UG585中斷的相關(guān)章節(jié)查詢到,如圖 61所示。

另一個區(qū)別就是XScuGic_Connect時的服務(wù)子函數(shù)不同。

圖 60

圖 61

3. 編寫中斷服務(wù)函數(shù),需要注意的是進入服務(wù)函數(shù)后首先需要禁止中斷,保證在處理中斷時不會再次因觸發(fā)中斷而程序跳轉(zhuǎn);另外就是需要清除中斷標志位,否則會不斷觸發(fā)中斷。

圖 62

源代碼見附件。

ZYNQ CPU內(nèi)部任何有定時器,在Vivado的ZYNQ配置中無需任何操作就可以在SDK中直接使用。與GPIO中斷類似,Timer的中斷也包含相同的幾步操作,下面給出各個階段的代碼片段,完整代碼見附件。

1. 初始化Timer。

圖 63

2. 初始化GIC,設(shè)置中斷服務(wù)函數(shù)入口。

圖 64

3. 配置Timer工作模式,導(dǎo)入計數(shù)初值,使能中斷。

圖 65

4. 編寫中斷服務(wù)函數(shù),進入中斷后首先Disable中斷,清楚中斷標志位;然后進行中斷處理;退出中斷服務(wù)函數(shù)前重新使能中斷。

圖 66

Appendix 1: 配套工程

編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • DDR
    DDR
    +關(guān)注

    關(guān)注

    11

    文章

    754

    瀏覽量

    69133
  • Zynq
    +關(guān)注

    關(guān)注

    10

    文章

    630

    瀏覽量

    49456
  • memcpy
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    3025
  • malloc
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    385
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    對 M7 內(nèi)核上的 memcpy 速度的一個疑問求解

    我對 M7 內(nèi)核上的 memcpy 速度有一個疑問。 對于 M7 和 A53 內(nèi)核之間的數(shù)據(jù)共享,我基于 IPCF 演示實現(xiàn)了一個簡單的示例。代碼很簡單:每秒,M7 使用 memcpy 將大約 3
    發(fā)表于 03-02 06:14

    RTL9301管理型交換機DHCP Server使用方法

    RTL9301管理型交換機DHCP Server使用方法
    的頭像 發(fā)表于 02-01 10:52 ?1306次閱讀
    RTL9301管理型交換機DHCP Server<b class='flag-5'>使用方法</b>

    開發(fā)者必備:嵌入式常用外設(shè)接口電路參考指南

    在嵌入式開發(fā)中,硬件接口電路設(shè)計是每位工程師都繞不開的環(huán)節(jié)。不同的外設(shè)接口有各自的電氣特性和設(shè)計要求,理解常見接口的參考電路可以讓你的開發(fā)更穩(wěn)健,避免調(diào)試時反復(fù)踩坑。今天,我們整理了MCU常用外設(shè)
    的頭像 發(fā)表于 01-09 19:03 ?663次閱讀
    開發(fā)者必備:嵌入式<b class='flag-5'>常用</b><b class='flag-5'>外設(shè)</b>接口電路參考指南

    內(nèi)存拷貝函數(shù) memcpy原理及實現(xiàn)

    區(qū)域有重疊部分,則從末端開始對每個字節(jié)進行拷貝。但數(shù)據(jù)量大時速度慢,將兩種方法結(jié)合后能夠提高拷貝函數(shù)性能,代碼如下:void *Memcpy(void *dest, const void *src
    發(fā)表于 12-26 08:03

    芯源IR調(diào)制器都有哪些具體使用?使用方法是怎樣的?

    芯源IR調(diào)制器都有哪些具體使用?以及使用方法是怎樣的?
    發(fā)表于 12-02 06:33

    堆棧的定義,堆棧的使用方法

    和使用; 對于8086CPU,進出堆棧的只能是2字節(jié)的數(shù)據(jù)。 2 堆棧的使用方法 常用的堆棧相關(guān)指令包括PUSH POP PUSHF和POPF,語法如下: PUSH 源操作數(shù);將指定操作數(shù)入棧保護 POP
    發(fā)表于 11-21 06:49

    RTthread怎么加載zynq的支持包?

    RTthread有xilinx zynq的芯片支持包了么,SDK管理器里面怎么下載ZYNQ的支持包呢?求助
    發(fā)表于 09-23 06:05

    rt_malloc_align函數(shù)內(nèi)存越界問題怎么解決?

    void *rt_malloc_align(rt_size_t size, rt_size_t align) { void *align_ptr; void *ptr; rt_size_t
    發(fā)表于 09-22 08:30

    錫膏的儲存及使用方法詳解

    錫膏是一種常用的焊接輔助材料,廣泛應(yīng)用于電子、電器、通訊、儀表等行業(yè)的焊接工藝中。正確的儲存和使用方法對于保證錫膏的品質(zhì)和焊接效果至關(guān)重要。本文將就錫膏的儲存和使用方法進行詳細介紹,希望能對廣大焊接工作者有所幫助。
    的頭像 發(fā)表于 07-18 17:36 ?1401次閱讀
    錫膏的儲存及<b class='flag-5'>使用方法</b>詳解

    stm32cubeIDE使用malloc失敗是什么原因?

    我在stm32cubeIDE環(huán)境下,已經(jīng)分配了足夠的棧與堆空間,但是我在的使用malloc分配內(nèi)存時,一直分配不成功,這是什么原因?
    發(fā)表于 06-04 07:18

    正點原子Z15I ZYNQ 開發(fā)板資料發(fā)布!板載PCIe2.0、SPFx2、MIPI CSI等接口,資料豐富!

    正點原子Z15I ZYNQ 開發(fā)板資料發(fā)布!板載PCIe2.0、SPFx2、MIPI CSI等接口,資料豐富! 正點原子Z15I ZYNQ開發(fā)板,核心板全工業(yè)級設(shè)計,主控芯片
    發(fā)表于 05-30 16:59

    正點原子Z20 ZYNQ 開發(fā)板發(fā)布!板載FMC LPC、LVDS LCD和WIFI&amp;藍牙等接口,資料豐富!

    接口等外設(shè)。開發(fā)板提供了豐富的開發(fā)文檔和軟件資源,涉及FPGA開發(fā)、Vitis開發(fā)、Linux系統(tǒng)開發(fā)和Qt開發(fā)! 一、資料下載 正點原子Z20 ZYNQ開發(fā)板/核心板:http
    發(fā)表于 05-30 16:55

    LCR測試儀的使用方法與注意事項

    LCR測試儀的使用方法、操作注意事項及常見故障處理,幫助讀者高效、安全地掌握這一儀器的使用技巧。 ? 二、LCR測試儀的基本使用方法 1. 準備階段 (1)設(shè)備檢查:確保測試儀電源線、連接線完好,電源開關(guān)關(guān)閉。檢查測試夾具或探針
    的頭像 發(fā)表于 04-29 10:36 ?1.3w次閱讀
    LCR測試儀的<b class='flag-5'>使用方法</b>與注意事項

    西門子PLC-模擬量采集計算使用方法

    西門子PLC-模擬量采集計算使用方法,很實用
    發(fā)表于 04-09 15:29 ?1次下載

    PXI-8433/4的規(guī)范使用方法分享

    應(yīng)用中,因兩線制接線配置不當導(dǎo)致通訊障。本文將以此問題為入點,系統(tǒng)講解PXI-8433/4的規(guī)范使用方法。
    的頭像 發(fā)表于 03-14 10:38 ?1953次閱讀
    PXI-8433/4的規(guī)范<b class='flag-5'>使用方法</b>分享