欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > 7.1 - 定时器之中断控制LED实验

7.1 - 定时器之中断控制LED实验

2025/6/28 9:48:38 来源:https://blog.csdn.net/XDUryan/article/details/145954612  浏览:    关键词:7.1 - 定时器之中断控制LED实验

文章目录

  • 1 实验任务
  • 2 系统框图
  • 3 软件设计

1 实验任务

本实验任务是通过CPU私有定时器的中断,每 200ms 控制一次PS LED灯的亮灭。

2 系统框图

在这里插入图片描述

3 软件设计

注意事项:

  1. 定时器中断在收到中断后,只需清除中断状态,无需禁用中断、启动中断操作。
/***************************** Include Files ********************************/
#include <stdio.h>
#include "xparameters.h"
#include "xgpiops.h"
#include "xscutimer.h"
#include "xscugic.h"
#include "xil_exception.h"
#include "xstatus.h"
/************************** Constant Definitions ****************************/
#define GPIO_DEVICE_ID  	XPAR_XGPIOPS_0_DEVICE_ID
#define TIMER_DEVICE_ID		XPAR_XSCUTIMER_0_DEVICE_ID
#define INTC_DEVICE_ID		XPAR_SCUGIC_SINGLE_DEVICE_ID#define TIMER_INTR_ID	    XPAR_SCUTIMER_INTR#define PS_LED0_GPIO_PIN	0#define TIMER_LOAD_VALUE	XPAR_CPU_CORTEXA9_0_CPU_CLK_FREQ_HZ / 2
/**************************** Type Definitions ******************************//***************** Macros (Inline Functions) Definitions ********************//************************** Function Prototypes *****************************/
int  GpioInit(XGpioPs* GpioInstPtr);
int  TimerInit(XScuTimer* TimerInstPtr);
int  SetupIntrSystem(XScuGic* IntcInstPtr, XScuTimer* TimerInstPtr, u16 TimerIntrId);
void TimerIntrHandler(void *CallBackRef);
/************************** Variable Definitions ****************************/
XGpioPs   GpioInst;
XScuTimer TimerInst;
XScuGic   IntcInst;u32 TimeOut = 0;
/****************************************************************************/int GpioInit(XGpioPs* GpioInstPtr)
{//int Status;XGpioPs_Config* GpioPsConfigPtr;//GpioPsConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);Status = XGpioPs_CfgInitialize(GpioInstPtr, GpioPsConfigPtr, GpioPsConfigPtr->BaseAddr);if (Status != XST_SUCCESS) {return XST_FAILURE;}// 设置输出XGpioPs_SetDirectionPin(GpioInstPtr, PS_LED0_GPIO_PIN, 1);// 使能输出XGpioPs_SetOutputEnablePin(GpioInstPtr, PS_LED0_GPIO_PIN, 1);//return XST_SUCCESS;
}int  TimerInit(XScuTimer* TimerInstPtr)
{//int Status;XScuTimer_Config* TimerConfigPtr;//TimerConfigPtr = XScuTimer_LookupConfig(TIMER_DEVICE_ID);Status = XScuTimer_CfgInitialize(TimerInstPtr, TimerConfigPtr, TimerConfigPtr->BaseAddr);if (Status != XST_SUCCESS) {return XST_FAILURE;}// 自动加载XScuTimer_EnableAutoReload(TimerInstPtr);// 加载初值XScuTimer_LoadTimer(TimerInstPtr, TIMER_LOAD_VALUE);// 使能中断XScuTimer_EnableInterrupt(TimerInstPtr);//return XST_SUCCESS;
}int  SetupIntrSystem(XScuGic* IntcInstPtr, XScuTimer* TimerInstPtr, u16 TimerIntrId)
{//int Status;XScuGic_Config* IntcConfigPtr;// step1. 初始化中断控制器GICIntcConfigPtr= XScuGic_LookupConfig(INTC_DEVICE_ID);if (NULL == IntcConfigPtr) {return XST_FAILURE;}Status = XScuGic_CfgInitialize(IntcInstPtr, IntcConfigPtr, IntcConfigPtr->CpuBaseAddress);if (Status != XST_SUCCESS) {return XST_FAILURE;}// step2. 在处理器中初始化异常处理功能Xil_ExceptionInit();// step3. 在处理器中为IRQ中断异常注册处理程序Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XScuGic_InterruptHandler, IntcInstPtr);// step4. 在处理器中使能IRQ中断异常Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);// step5. 在GIC中为外设注册中断处理程序Status = XScuGic_Connect(IntcInstPtr, TimerIntrId, (Xil_ExceptionHandler)TimerIntrHandler, (void *)TimerInstPtr);if (Status != XST_SUCCESS) {return XST_FAILURE;}// step6. 在GIC中设置外设中断的优先级和触发类型
//	XScuGic_SetPriorityTriggerType();// step7. 在GIC中使能外设中断XScuGic_Enable(IntcInstPtr, TimerIntrId);//return XST_SUCCESS;
}void TimerIntrHandler(void *CallBackRef)
{//XScuTimer* TimerInstPtr = (XScuTimer*)CallBackRef;//if (XScuTimer_IsExpired(TimerInstPtr)){XScuTimer_ClearInterruptStatus(TimerInstPtr);printf("Timer is timeout.\n");TimeOut = 1;}//return;
}int main()
{//int Status;u32 LedValue;//printf("Timter Interrupt Control LED Test\n");//Status = GpioInit(&GpioInst);if (Status == XST_FAILURE) {printf("GPIO Init Failed.\n");}//Status = TimerInit(&TimerInst);if (Status == XST_FAILURE) {printf("Timer Init Failed.\n");}//Status = SetupIntrSystem(&IntcInst, &TimerInst, TIMER_INTR_ID);if (Status == XST_FAILURE) {printf("Setup Interrupt System Failed.\n");}// 启动定时器XScuTimer_Start(&TimerInst);//while(1){if(TimeOut==1){LedValue = ~XGpioPs_ReadPin(&GpioInst, PS_LED0_GPIO_PIN);XGpioPs_WritePin(&GpioInst, PS_LED0_GPIO_PIN, LedValue);TimeOut = 0;}}//return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词