sk2400

opb_timer 实现系统时钟

0
阅读(2176)
项目需要一个系统时间,uc本身没有系统时间。用硬件做太占资源,软件做误差太大,用ds的时间芯 片估计没时间调了。最后想了个折中的办法,用EDK中提供的opb_timer,大约1s触发一次中断,在中断处理函数中进行以s为单位的计时,误差是不 小,但我们的项目对这个时间误差还可以忍受。

MHS
BEGIN opb_timer
 PARAMETER INSTANCE = opb_timer_0
 PARAMETER HW_VER = 1.00.b
 PARAMETER C_BASEADDR = 0x20050000
 PARAMETER C_HIGHADDR = 0x200503FF
 BUS_INTERFACE SOPB = opb_v20_0
 PORT CaptureTrig0 = net_gnd
 PORT Interrupt = opb_timer_0_Interrupt
END
 
程序
#include "xtmrctr_l.h"

 XTmrCtr_mSetLoadReg(XPAR_OPB_TIMER_0_BASEADDR, 0, 100000000 - 2);//100M时钟,计数后位1s

 XIntc_RegisterHandler(XPAR_OPB_INTC_0_BASEADDR, XPAR_OPB_INTC_0_OPB_TIMER_0_INTERRUPT_INTR, (XInterruptHandler)timer_int_handler, (void *)XPAR_OPB_TIMER_0_BASEADDR);

 XTmrCtr_mSetControlStatusReg(XPAR_OPB_TIMER_0_BASEADDR, 0, XTC_CSR_INT_OCCURED_MASK | XTC_CSR_LOAD_MASK );

 XIntc_mEnableIntr(XPAR_OPB_INTC_0_BASEADDR, XPAR_OPB_TIMER_0_INTERRUPT_MASK);

 XTmrCtr_mSetControlStatusReg(XPAR_OPB_TIMER_0_BASEADDR, 0, XTC_CSR_ENABLE_TMR_MASK | XTC_CSR_ENABLE_INT_MASK | XTC_CSR_AUTO_RELOAD_MASK | XTC_CSR_DOWN_COUNT_MASK);