本原創教程由芯驛電子科技(上海)有限公司(ALINX)創做,版權歸本公司全部,如需轉載,需受權並註明出處。安全
AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E/AXU4EV-P/AXU5EV-E/AXU5EV-P /AXU9EG/AXU15EG架構
vivado工程目錄爲「ps_hello/vivado」app
vitis工程目錄爲「ps_rtc/vitis」函數
實時時鐘(rtc)單元爲系統和應用軟件提供精確的時間基準。爲了知足高精度的須要,實時時鐘還包括校準電路,以補償溫度和電壓波動。RTC 由 VCC-PSAUX 或 VCC-PSBATT 電源供電。當輔助電源可用時,RTC 使用它保持計數器活動。當輔助電源不可用時,RTC 自動切換到 VCC PSBATT 電源。RTC 功能以下:學習
1)系統掉電時,該單元自動切換至電池供電,實現時鐘的不間斷運行ui
2)支持報警設置和週期中斷設置設計
3)校準電路以確保時間精準3d
4)三個計數器調試
時間秒計數器,32 位,能夠計數約 136 年orm
32 KHz 參考時鐘計數器,表示 1 秒的計數
用於校準的 4 位分數計數器
RTC控制器結構圖
RTC功能圖
1)ARM cortex-A系列處理器,提供了4個管腳給soc,實現外界中斷的傳遞。分別是:nIRQ、nFIQ、nVIRQ、nVFIQ。arm系統中,會有多個外設,均有可能產生中斷髮送給core,所以就須要有一箇中斷控制器來做爲中間的橋接,收集soc的全部中斷信號,而後仲裁選擇合適(高優先級)的中斷,再發送給CPU,等待CPU處理。
2)這裏中間的橋接,就是arm公司推出的大名鼎鼎的gic(general interrupt controller)。gic實際上是一個架構,版本歷經了gicv1,gicv2,gicv3,gicv4。
3)Ultrascale+中斷框圖以下
圖中包含兩個GIC:
RPU GIC:PL390(arm公司設計的對應GICv1 IP)
APU GIC:GIC-400(arm公司設計的對應GICv2 IP)
4)RPU GIC,其系統功能框圖以下:
從圖中能夠看到,中斷源主要有三種:
PPI:private peripheral interrupt,私有外設中斷,該中斷來源於外設,只對固定的core有效。
SPI:shared peripheral interrupt,共享外設中斷,該中斷來源於外設,能夠對全部的core有效。
SGI:software-generated interrupt,軟中斷,軟件產生的中斷,用於給指定的core發送中斷信號
控制器功能框圖以下:
上圖中, ICD的控制寄存器主要以下:
1)APU GIC,功能框圖以下
GICv2,將中斷分紅了group0和group1。使用寄存器GICD_IGROUPRn來對每一箇中斷,設置組。其中group0:安全中斷,由nFIQ驅動,group1:非安全中斷,由nIRQ驅動。支持最大1020箇中斷。其中斷號分配以下:
GICv2,主要由兩部分組成:distributor及cpu interface。
distributor,用來收集全部的中斷來源,而且爲每一箇中斷源設置中斷優先級,中斷分組,中斷目的core。當有中斷產生時,將當前最高優先級中斷,發送給對應的cpu interface。其功能有:全局中斷使能、每一箇中斷的使能、中斷的優先級、中斷的分組、中斷的目的core、中斷觸發方式、對於SGI中斷,傳輸中斷到指定的core、每一箇中斷的狀態管理、提供軟件,能夠修改中斷的pending狀態
cpu interface,將GICD發送的中斷信息,經過IRQ,FIQ管腳,發送給鏈接到該cpu接口的core。其功能有:將中斷請求發送給cpu、對中斷進行承認(acknowledging an interrupt)、中斷完成識別(indicating completion of an interrupt)、設置中斷優先級屏蔽、定義中斷搶佔策略、決定當前處於pending狀態最高優先級中斷
gicv2,定義了本身的一些寄存器,這些寄存器,都是使用memory-mapped的方式去訪問的,也就是在soc中,會留有一片空間,給gic。cpu經過訪問這部分空間,來對gic進行操做。主要寄存器以下:
這裏中斷只是做簡單介紹,須要詳細瞭解的,請參照xilinx提供的文檔:ug1085-zynq-ultrascale-trm.pdf。
軟件工程師工做內容
如下爲軟件工程師負責內容。
3.1 建立Platform工程
1)點擊Tools->Launch Vitis
2) 與前面的Hello World實驗不一樣,咱們只創建Platform工程
3) 填入工程名字,要與XSA文件的名字同樣,點擊Next
4) 點擊Next
5) 選擇XSA文件
保持默認,點擊Finish
6) 點開platform.spr,並點開BSP
7) 找到RTC驅動,並點擊Import Examples
8) 很是幸運,有中斷的例子,怎麼就知道這個例子就是中斷的例子呢?是經過「intr」猜想的,因此,基本功很重要,否則你連找例程都不會。
9) 在這裏就導入了example工程
下面就是閱讀代碼,而後修改代碼了,固然,可能一下不能徹底理解這些代碼,只能在之後的應用中去反覆練習
10)經過函數XRtcPsu_GetCurrentTime來獲取系統秒計數器值,用函數XRtcPsu_SecToDateTime將計數值轉換爲咱們能看明白的年月日時分秒。
11)設置中斷時間,中斷時間PERIODIC_ALARM_PERIOD宏定義爲2,也就是2秒中斷一次
12)Build Project編譯
13)瞭解一下中斷控制器的使用,主要分爲幾個步驟,初始化中斷控制器GIC初始化中斷異常中斷服務函數註冊在中斷控制器中使能中斷使能中斷異常。有兩步須要注意,在中斷控制器中使能中斷是要根據中斷號使能相應的中斷,好比本章介紹的RTC,是在中斷控制器GIC中的使能中斷,然後面的使能外設中斷是指在外設中打開它的中斷,正常狀況下是不打開的,打開以後就能夠產生中斷傳遞到中斷控制器GIC。在之後的實驗中能夠借鑑這種寫法。
1)打開串口終端;
2)下載調試程序的方法前面教程已經講解,再也不復述;
3)和咱們預期同樣,串口每兩秒會看斷一次;
實驗中經過簡單的修改Vitis的例程,就完成了RTC,中斷的應用,看似簡單的操做,但蘊含了豐富的知識,咱們須要很是瞭解RTC的原理、中斷的原理,這些基本知識是學習好ZYNQ的必要條件。