当前位置: 首页 > news >正文

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. 初始化中断控制器GIC
	IntcConfigPtr= 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;
}

相关文章:

  • SpringBoot原理-02.自动配置-概述
  • 微服务即时通信系统---(七)文件管理子服务
  • 飞书考勤Excel导入到自己系统
  • 网络原理--TCP/IP(2)
  • 神经网络|(十一)|神经元和神经网络。
  • 深入了解 K-Means 聚类算法:原理与应用
  • C++22——哈希(上)
  • GD32F303 系统时钟
  • 例子 DQN + CartPole: 深入思考一下,强化学习确实是一场智能冒险之旅!
  • 《今日AI-人工智能-编程日报》
  • 深入解析 Svelte:下一代前端框架的革命
  • mosfet的驱动设计-开关损耗
  • 算法(三)——最大公约数、最小公倍数、同余原理
  • LeetCode 873. Length of Longest Fibonacci Subsequence(2025/2/27每日一题)
  • 西门子S7-1200比较指令
  • @[TOC](Java实现 图书管理系统) # 一、菜单 该图书管理系统的菜单界面主要有以下两种: **管理员菜单:** **用户菜单:**
  • 线程池--深入一些
  • 从0-1学习Mysql第十二章: 常见问题与故障排查
  • 刷屏(0和1)
  • 模块七_面向对象
  • 推荐昆明做网站建设/百度权重10的网站
  • 做铝板的网站/建站平台哪个好
  • 广告设计公司文案/seo的外链平台有哪些
  • 大连做网站绍兴厂商/seo优化工具哪个好
  • 网站建设的费用结构包括/做网站的公司
  • 基于web的毕业论文题目/seo技术培训江门