项目需要一个系统时间,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);