Zynq 的每個 Cortex-A9 處理器都有自己的專用 32 位定時器和 32 位看門狗定時器,兩個處理器共享一個全局 64 位定時器,這些計時器的時鐘頻率始終為 CPU 頻率的 1/2。本文主要介紹 Zynq 芯片 CPU 私有定時器的工作特性,以及私有定時器的基本使用方法。
私有定時器
????????Zynq 的每個 Cortex-A9 處理器都有自己的專用 32 位定時器和 32 位看門狗定時器,兩個處理器共享一個全局 64 位定時器,這些計時器的時鐘頻率始終為 CPU 頻率的 1/2。
CPU 私有定時器具有以下特性:
- 32 位計數器,當計數達到 0 時產生中斷
- 8 位預分頻器,可更好地控制中斷周期
- 可配置的單發(Single-shot)或自動重裝(Auto-reload)模式
- 可配置的計數器起始值
- 時鐘頻率為 CPU 時鐘的 1/2
????????使用 CPU 私有定時器時,可以直接讀寫相關寄存器,也可以采用高層次的方法。Xilinx 官方已經將函數封裝好,只需要聲明頭文件 "xscutimer.h" 即可。
#include "xparameters.h"
#include "xscugic.h"
#include "xscutimer.h"#define TIMER_DEVICE_ID XPAR_XSCUTIMER_0_DEVICE_ID
#define TIMER_LOAD_VALUE 0xFFFFXScuGic IntcInstance; // GIC
XScuTimer TimerInstance; // Timervoid Timer_Init(XScuGic *IntcInstancePtr, XScuTimer *TimerInstancePtr,u16 deviceId, u16 TimerIntrId)
{XScuTimer_Config *ConfigPtr;// 初始化CPU私有定時器ConfigPtr = XScuTimer_LookupConfig(deviceId);XScuTimer_CfgInitialize(TimerInstancePtr, ConfigPtr,ConfigPtr->BaseAddr);// 自測試,確保硬件工作XScuTimer_SelfTest(TimerInstancePtr);// 使能自動重載模式XScuTimer_EnableAutoReload(TimerInstancePtr);// 配置計數器值XScuTimer_LoadTimer(TimerInstancePtr, TIMER_LOAD_VALUE);// 啟動定時器XScuTimer_Start(TimerInstancePtr);// 連接中斷子系統TimerSetupIntrSystem(IntcInstancePtr,TimerInstancePtr, TimerIntrId);
}
在頭文件 "xscutimer.h" 中可以看到 XScuTimer_EnableAutoReload() 與 XScuTimer_LoadTimer() 函數的定義,本質上是在寫 Timer 相關寄存器。