BD

目标
- 全局定时器产生时间戳
- 私有定时器产生200ms中断回调,打印时间戳
裸机测试
#include "xparameters.h"
#include "xscutimer.h"
#include "xscugic.h"
#include "xil_printf.h"
#include "xtime_l.h" #define TIMER_DEVICE_ID XPAR_XSCUTIMER_0_DEVICE_ID
#define INTC_DEVICE_ID XPAR_SCUGIC_SINGLE_DEVICE_ID
#define TIMER_IRPT_INTR XPAR_SCUTIMER_INTR
#define TIMER_LOAD_VALUE 0x03F83C3F XScuGic Intc;
XScuTimer Timer;
uint32_t BspGetMillis(void)
{XTime t;XTime_GetTime(&t);uint32_t ms = (uint32_t)(t / (COUNTS_PER_SECOND / 1000));return ms;
}
int timer_init(XScuTimer *timer_ptr)
{int status;XScuTimer_Config *timer_cfg_ptr = XScuTimer_LookupConfig(TIMER_DEVICE_ID);if (timer_cfg_ptr == NULL)return XST_FAILURE;status = XScuTimer_CfgInitialize(timer_ptr,timer_cfg_ptr,timer_cfg_ptr->BaseAddr);if (status != XST_SUCCESS)return XST_FAILURE;XScuTimer_LoadTimer(timer_ptr, TIMER_LOAD_VALUE);XScuTimer_EnableAutoReload(timer_ptr);return XST_SUCCESS;
}
void timer_intr_handler(void *CallBackRef)
{static int toggle = 0; XScuTimer *timer_ptr = (XScuTimer *)CallBackRef;xil_printf("%u ms state=%d\r\n", BspGetMillis(), (toggle ^= 1));XScuTimer_ClearInterruptStatus(timer_ptr);
}
void timer_intr_init(XScuGic *intc_ptr, XScuTimer *timer_ptr)
{XScuGic_Config *intc_cfg_ptr = XScuGic_LookupConfig(INTC_DEVICE_ID);XScuGic_CfgInitialize(intc_ptr,intc_cfg_ptr,intc_cfg_ptr->CpuBaseAddress);Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,intc_ptr);Xil_ExceptionEnable(); XScuGic_Connect(intc_ptr,TIMER_IRPT_INTR,(Xil_ExceptionHandler)timer_intr_handler,(void *)timer_ptr);XScuGic_Enable(intc_ptr, TIMER_IRPT_INTR);XScuTimer_EnableInterrupt(timer_ptr);
}
int main(void)
{int status;xil_printf("SCU Timer Interrupt Test Start\r\n");status = timer_init(&Timer);if (status != XST_SUCCESS) {xil_printf("Timer Initialization Failed\r\n");return XST_FAILURE;}timer_intr_init(&Intc, &Timer);XScuTimer_Start(&Timer);while (1);return 0;
}
测试结果
