int GlobalTimer_init(u64 Load_Value)
{
//加载初始值,计数器是增加的,初始值设为0;
XTime_SetTime(0);
//加载计数周期,私有定时器的时钟为CPU的一半,为333MHZ,如果计数1S,加载值为1sx(333x1000x1000)(1/s)-1=0x13D92D3F
Xil_Out32((u32)GLOBAL_TMR_BASEADDR + (u32)GTIMER_CONTROL_OFFSET, (u32)0x01);
/* Updating Global Timer Comparator Value Register */
Xil_Out32((u32)GLOBAL_TMR_BASEADDR + (u32)0x10, (u32)Load_Value);
Xil_Out32((u32)GLOBAL_TMR_BASEADDR + (u32)0x14, (u32)((u32)(Load_Value>>32U)));
/* Enable Comparator */
Xil_Out32((u32)GLOBAL_TMR_BASEADDR + (u32)GTIMER_CONTROL_OFFSET, (u32)0x3);
//自动装载
Xil_Out32(XPAR_GLOBAL_TMR_BASEADDR + (0x08U), ((Xil_In32(XPAR_GLOBAL_TMR_BASEADDR + (0x08U)) | \
0x00000008U)));
return 1;
}
void GlobalTimer_Setup_Intr_System(XScuGic *GicInstancePtr, u16 TimerIntrId)
{
XScuGic_Connect(GicInstancePtr, TimerIntrId,
(Xil_ExceptionHandler)TIM_UP_IRQHandler,//set up the timer interrupt
(void *)1);//最后这个回调是给中断服务函数一个参数地址
XScuGic_Enable(GicInstancePtr, TimerIntrId);//enable the interrupt for the Timer at GIC
// XScuTimer_EnableInterrupt(TimerInstancePtr);//enable interrupt on the timer
Xil_Out32(XPAR_GLOBAL_TMR_BASEADDR + (0x08U), ((Xil_In32(XPAR_GLOBAL_TMR_BASEADDR + (0x08U)) | \
0x00000004U)));
}
中断服务函数进行下清零。(照着XTime_SetTime函数修改了一下控制字的置零)
//-----清零------------------
Xil_Out32((u32)GLOBAL_TMR_BASEADDR + (u32)GTIMER_CONTROL_OFFSET, ((Xil_In32(XPAR_GLOBAL_TMR_BASEADDR + (u32)GTIMER_CONTROL_OFFSET) & \
(~0x00000001U))));
/* Updating Global Timer Counter Register */
Xil_Out32((u32)GLOBAL_TMR_BASEADDR + (u32)GTIMER_COUNTER_LOWER_OFFSET, (u32)0);
Xil_Out32((u32)GLOBAL_TMR_BASEADDR + (u32)GTIMER_COUNTER_UPPER_OFFSET, (u32)((u32)(0>>32U)));
/* Enable Global Timer */
Xil_Out32((u32)GLOBAL_TMR_BASEADDR + (u32)GTIMER_CONTROL_OFFSET, ((Xil_In32(XPAR_GLOBAL_TMR_BASEADDR + (u32)GTIMER_CONTROL_OFFSET) | \
0x00000001U)));
//-----清零----------------
https://blog.csdn.net/w371500241/article/details/53689507
https://blog.csdn.net/leon_zeng0/article/details/79776175