高级会员
- 积分
- 539
- 金钱
- 539
- 注册时间
- 2019-5-1
- 在线时间
- 79 小时
|
楼主 |
发表于 2022-5-21 14:36:34
|
显示全部楼层
#define GLOBAL_TIMER_LOAD_VALUE 0x3D08F
#define INTC_DEVICE_ID XPAR_PS7_SCUGIC_0_DEVICE_ID
#define INTC_HANDLER XScuGic_InterruptHandler
#define Global_Timer_INTR XPAR_GLOBAL_TMR_INTR
#define Global_Timer_Counter_Register0 XPAR_GLOBAL_TMR_BASEADDR+0x0U
#define Global_Timer_Counter_Register1 XPAR_GLOBAL_TMR_BASEADDR+0x4U
#define Global_Timer_Control_Register XPAR_GLOBAL_TMR_BASEADDR+0x8U
#define Global_Timer_Interrupt_Status_Register XPAR_GLOBAL_TMR_BASEADDR+0xCU
#define Comparator_Value_Register0 XPAR_GLOBAL_TMR_BASEADDR+0x10U
#define Comparator_Value_Register1 XPAR_GLOBAL_TMR_BASEADDR+0x14U
#define Auto_increment_Register XPAR_GLOBAL_TMR_BASEADDR+0x18U
#define Auto_Increment_Bit 0x08U
#define IRQ_Enable_Bit 0x04U
#define Comp_Enable_Bit 0x02U
#define Timer_Enable_Bit 0x01U
XScuGic IntcInstancePtr; /* The Instance of the Interrupt Controller Driver */
static void GlobalTimerIntrHandler();
/***************************************************************
* @brief: 全局定时器的中断服务函数,完成IMU SPEED的采集
* @param: NULL
* @return: 无
* @author:
* @data: 2022.5.21
**************************************************************/
static void GlobalTimerIntrHandler()
{
/*采集IMU及轮速计数据,对应函数为_ImuDataAcqireHandler及_SpeedSensorAcqireHandler*/
// GN_TrigerEvent(GN_MODULE_CLOCK,GN_EVENT_IMUDATA_HANDLER,0,0);
/*10ms读取一次IMU和轮速计数据*/
if(g_running_ms%g_CountMs == 0)
{
s_SnapshotFlag = 1;
GN_TrigerEvent(GN_MODULE_CLOCK,GN_EVENT_IMUDATA_HANDLER,0,0);
/*采集IMU及轮速计数据,对应函数为_ImuDataAcqireHandler及_SpeedSensorAcqireHandler*/
GN_TrigerEvent(GN_MODULE_CLOCK,GN_EVENT_SPEED_SENSOR_HANDLER,0,0);
}
return;
}
/***************************************************************
* @brief: 对相应寄存器地址写操作
* @param: Reg_Addr:地址
* Reg_Val:赋值
* @return: 无
* @author: 贾粟
* @data: 2022.5.21
**************************************************************/
void GN_Set_GlobalTimer_Reg(u32 Reg_Addr,u32 Reg_Val)
{
Xil_Out32(Reg_Addr, Reg_Val);
}
/***************************************************************
* @brief: 对相应寄存器地址写操作
* @param: Reg_Addr:地址
* @return: u32类型:该地址上的值
* @author:
* @data: 2022.5.21
**************************************************************/
u32 GN_Get_GlobalTimer_Reg(u32 Reg_Addr)
{
return Xil_In32(Reg_Addr);
}
/***************************************************************
* @brief: 共享全局定时器的初始化
* @param: INTC *IntcInstancePtr
* @return: 成功:0x00 失败:0x01
* @author:
* @data: 2022.5.21
**************************************************************/
int SetupIntrSystem(XScuGic *IntcInstancePtr)
{
int Status;
XScuGic_Config *IntcConfig;
/*
* Initialize the interrupt controller driver so that it is ready to
* use.
*/
IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
if (NULL == IntcConfig) {
return XST_FAILURE;
}
Status = XScuGic_CfgInitialize(IntcInstancePtr, IntcConfig,
IntcConfig->CpuBaseAddress);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
/*
* Initialize the exception table
*/
Xil_ExceptionInit();
/*
* Register the interrupt controller handler with the exception table
*/
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
(Xil_ExceptionHandler)INTC_HANDLER,
IntcInstancePtr);
GN_Set_GlobalTimer_Reg(Global_Timer_Control_Register,0);//停止全局定时器
GN_Set_GlobalTimer_Reg(Global_Timer_Counter_Register0,0);//清空计数器低32位
GN_Set_GlobalTimer_Reg(Global_Timer_Counter_Register1,0);//清空计数器高32位
GN_Set_GlobalTimer_Reg(Global_Timer_Interrupt_Status_Register,1);//清除中断标志位
GN_Set_GlobalTimer_Reg(Comparator_Value_Register0,GLOBAL_TIMER_LOAD_VALUE);//加载比较器低32位
GN_Set_GlobalTimer_Reg(Comparator_Value_Register1,0);//加载比较器高32位
GN_Set_GlobalTimer_Reg(Auto_increment_Register,GLOBAL_TIMER_LOAD_VALUE);//加载递增寄存器数值
Status = XScuGic_Connect(IntcInstancePtr, Global_Timer_INTR,
(Xil_ExceptionHandler)GlobalTimerIntrHandler,
0);//绑定全局定时器中断服务函数
if (Status != XST_SUCCESS)
{
return Status;
}
XScuGic_InterruptMaptoCpu(IntcInstancePtr,0,Global_Timer_INTR);//将27号全局定时器中断映射到CPU0
XScuGic_Enable(IntcInstancePtr, Global_Timer_INTR);//打开全局定时器中断(27号)
Xil_ExceptionEnable();
return XST_SUCCESS;
}
/***************************************************************
* @brief: 启动全局定时器
* @param: 无
* @return: 成功:0x00 失败:0x01
* @author:
* @data: 2022.5.21
**************************************************************/
int StartUpGlobalTimer()
{
if ( (SetupIntrSystem(&IntcInstancePtr)) )
{
return XST_FAILURE;
}
GN_Set_GlobalTimer_Reg(Global_Timer_Control_Register,//启动全局定时器
Auto_Increment_Bit|IRQ_Enable_Bit|Comp_Enable_Bit|Timer_Enable_Bit);
return XST_SUCCESS;
}
|
|