Zynq定时器系统(上)—全局和私有定时器
前言
定時/計數器是硬件系統運行狀態的忠實記錄者,它不受CPU直接干預,自己獨立運行,可以完成計時、定時、中斷、實時時鐘等功能。常用功能:
(1)定時產生中斷信號
(2)用作產生延時函數delay()
(3)作計數器,用于檢測程序執行時間(這個很好用)。
1.平臺說明
硬件平臺:ZYNQ7z202clg400-2的創龍核心板
官方參考文檔:《UG585 - Zynq-7000 SoC Technical Reference Manual (ver1.12.2)-技術參考手冊.pdf》,見附錄。
2.定時器系統介紹
首先,zynq 7000 soc芯片具有2個ARM核。每個Cortex-a9處理器都有自己的專用32位定時器和32位看門狗定時器.兩個處
理器共享一個全局64位定時器。
時鐘:這些定時器的時鐘頻率固定為CPU時鐘頻率(Cpu_6x2x)的1/2,即CPU_3x2x時鐘。
同時,在系統級別上,有一個24位的看門狗定時器和兩個16位的三重定時器/計數器(TTC)。
時鐘:系統看門狗計時器的時鐘頻率為CPU頻率的1/4或1/6(即Cpu_1x時鐘),或是來自MIO引腳或PL的外部時鐘。兩個三重定時
器/計數器(TTC)的時鐘為CPU頻率的1/4或1/6(即Cpu_1x時鐘),或是來自MIO引腳或PL的外部時鐘。如下圖:
3.全局定時器(GT)
全局定時器在Cortex-A9 MPCore技術要求文檔中有完整的文檔,第4.3和4.4節(參見附錄A,附加資源)。全局計時器是一個64位
遞增的定時器。全局計時器與私有定時器映射在同一個地址空間中的內存,僅在安全狀態下在重置時被訪問。所有Cortex-A9處
理器都可以訪問全局定時器。每個Cortex-a9核都有一個64位的本地比較器,用于在全局計時器達到比較器值時產生私有中斷。
(1)時鐘要求:
GTC總是以CPU頻率的1/2為時鐘,即為(Cpu_3x2x)。
根究前一章節,可以知道CPU頻率(Cpu_6x2x)設置為666.666M,則Cpu_3x2x為333.333MHz。
(2)寄存器描述:
關于每個寄存器的詳細功能介紹,請閱讀UG585
相依介紹如下:
——>Global_Timer_Counter_Register0(全局定時器計數器低32位),地址0xF8F00200,復位值0,可讀寫。
——>Global_Timer_Counter_Register1(全局定時器計數器高32位),地址0xF8F00204,復位值0,可讀寫。
——>Global_Timer_Control_Register(全局定時器控制寄存器),地址0xF8F00208,復位值0,可讀寫;
其中[15:8]位即從低位數起的第二個字節為Prescaler(步距),該字節可用來延遲定時間隔,其計算公式為:(步距值+1)*(加載值+1)*(計數時鐘周期);
第3位為觸發模式位為0則為單次觸發,為1則為自動遞增模式,該模式下每次計數器達到比較器的數值則比較器會自動加上遞增寄存器的數值,這樣就可以周期性的產生下一次中斷。
第2位為中斷允許位,默認為0即不觸發中斷,為1時在中斷狀態寄存器置位時會觸發中斷;
第1位為比較允許位,默認為0即不比較,為1時每當計數器數值達到比較器數值則會置位事件標志位;
第0位為定時器使能位,默認為0,即不計數,定時器停止,這時可以讀寫計數值;為1時計數器在計數時鐘下開始自動計數,定時器運行,不能寫入計數值(只能讀出)。
——>Global_Timer_Interrupt_Status_Register(中斷狀態寄存器),地址0xF8F0020C,復位值0,可讀寫;
其中第0位為事件標志位,當計數器達到比較器數值時該位置1,需要手動清零,向該位寫一個1就能清零(看清楚是寫1不是寫0)。
——>Comparator_Value_Register0(比較器低32位),地址0xF8F00210,復位值0,可讀寫;
——>Comparator_Value_Register1(比較器高32位),地址0xF8F00214,復位值0,可讀寫;
——>Auto_increment_Register(自動遞增寄存器),地址0xF8F00218,復位值0,可讀寫;
在自動遞增模式下,每當計數器數值達到比較器數值,則比較器會自動加上自動遞增寄存器的值以便產生下一次中斷。
一共7個寄存器.
(3)使用注意事項:
以下列舉的注意事項均是參考寄存器說明而來。
(3.1)使能定時器,步驟如下:
I:清除使能bit,即Global_Timer_Control_Register的bit[0]=0
II:寫低32bit,即Global_Timer_Counter_Register0
III:寫高32bit,即Global_Timer_Counter_Register1
IV:設置timer模式,即設置Global_Timer_Control_Register,是否使能
IV:使能timer,即Global_Timer_Control_Register的bit[0]=1
(3.2)讀計數器的當前值,步驟如下:
I:讀高32bit,即Global_Timer_Counter_Register1
II:讀低32bit,即Global_Timer_Counter_Register0
III:再讀一次高32bit,如果此次讀取的值與 I 中的不同,則跳轉到 II;
IV:數據讀取成功
(3.3)如果想使用定時器的定時中斷功能,則注意:使用自動增量模式而不是單次觸發模式
官方說明:https://china.xilinx.com/support/answers/47545.html
(4)很好的例程
在這里推薦2個很好的連接,他們使用GT做了很好的案例說明:
第一個:https://blog.csdn.net/kkk584520/article/details/10034679
第二個:https://zhuanlan.zhihu.com/p/31061401
4.私有定時器
cpu專用計時器和看門狗計時器的完整文檔需要參看:?Cortex-A9 MPCore?Technical Requirements Document, sections 4.1 and 4.2,鏈接:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0360e/BABIFIHD.html
(1)特性說明:
定時器和看門狗塊都有以下特性:
- 32位計數器,當它達到零時可產生中斷,即定時器是遞減的方式。
- 8位預分頻器,以便更好地控制中斷周期。
- 可配置的單次模式或自動重裝模式。
- 計數器可配置起始值。
(2)時鐘要求:
所有的私有定時器和看門狗總是以CPU頻率的1/2為時鐘,即為(Cpu_3x2x)。
根究前一章節,可以知道CPU頻率(Cpu_6x2x)設置為666.666M,則Cpu_3x2x為333.333MHz。
(3)寄存器說明:
私有定時器的寄存器和全局定時器的寄存器功能類似,這里略過介紹。
5.附錄
附錄
《UG585 - Zynq-7000 SoC Technical Reference Manual (ver1.12.2)-技術參考手冊.pdf》下載鏈接:
https://download.csdn.net/download/ye1223/10811782
?
’
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Zynq定时器系统(上)—全局和私有定时器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Zynq器件的时钟系统
- 下一篇: XML文件格式解析