定时器中断——ZYNQ学习笔记16

发布于:2025-09-11 ⋅ 阅读:(20) ⋅ 点赞:(0)

ZYNQ 

MPSOC

main.c

#include <stdio.h>
#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"
#include "xscugic.h"
#include "xil_exception.h"
#include "xil_printf.h"
#include "xscutimer.h"
#include "main.h"
#include "gpio.h"
#include "timer.h"
#include "intr.h"

//定义变量
XGpioPs 	Gpio;			//GPIO	驱动实例
XScuGic 	Intc;			//GIC	驱动实例
XScuTimer 	Timer;			//定时器 驱动实例

u8 led_state;

int main(){

	xil_printf("MIO_TIMER_INT\r\n");

	mio_config(&Gpio);

	timer_config(&Timer);

	intr_config(&Intc,&Timer);

	XScuTimer_Start(&Timer);

	while(1){


	}

	return 0 ;
}

main.h

#include <stdio.h>
#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"
#include "xscugic.h"
#include "xil_exception.h"
#include "xil_printf.h"
#include "xscutimer.h"

#define GPIO_DEVICE_ID		XPAR_XGPIOPS_0_DEVICE_ID		//MIO器件ID
#define MIO_LED0			0
#define MIO_LED1			7
#define MIO_LED2			8
#define MIO_KEY0			12
#define MIO_KEY1			11
#define TIMER_DEVICE_ID		XPAR_XSCUTIMER_0_DEVICE_ID		//定时器器件ID
#define TIMER_IRPT_INTR		XPAR_SCUTIMER_INTR				//定时器中断ID
#define INTC_DEVICE_ID		XPAR_SCUGIC_SINGLE_DEVICE_ID	//中断控制器器件ID

#define TIMER_LOAD_VALUE	0x3F940AC						//定时器装载值     333.3333435Mhz->0.2ms = 0x3F940AC

gpio.c

#include <stdio.h>
#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"
#include "xscugic.h"
#include "xil_exception.h"
#include "xil_printf.h"
#include "xscutimer.h"
#include "gpio.h"
#include "main.h"

void mio_config(XGpioPs *gpio_ptr){
	////////////配置GPIO输入输出////////////
	XGpioPs_Config *ConfigPtr;
	//根据器件ID查找GPIO配置信息
	ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
	//对GPIO驱动初始化
	XGpioPs_CfgInitialize(gpio_ptr, ConfigPtr,ConfigPtr->BaseAddr);

	//设置引脚方向 	0:输入 	1输出
	XGpioPs_SetDirectionPin(gpio_ptr, MIO_LED0, 1);
	XGpioPs_SetDirectionPin(gpio_ptr, MIO_LED1, 1);
	//设置输出使能	0: 不使能	1: 使能
	XGpioPs_SetOutputEnablePin(gpio_ptr, MIO_LED0, 1);
	XGpioPs_SetOutputEnablePin(gpio_ptr, MIO_LED1, 1);
	//设置初始状态
	XGpioPs_WritePin(gpio_ptr, MIO_LED0, 0x0);
	XGpioPs_WritePin(gpio_ptr, MIO_LED1, 0x0);
}

gpio.h

#include <stdio.h>
#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"
#include "xscugic.h"
#include "xil_exception.h"
#include "xil_printf.h"
#include "xscutimer.h"
#include "main.h"

extern XGpioPs 	Gpio;			//GPIO	驱动实例

#define led0(a)	XGpioPs_WritePin(&Gpio,MIO_LED0,a);

void mio_config(XGpioPs *gpio_ptr);

intr.c

#include <stdio.h>
#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"
#include "xscugic.h"
#include "xil_exception.h"
#include "xil_printf.h"
#include "xscutimer.h"
#include "main.h"
#include "gpio.h"
#include "intr.h"

extern u8 led_state	;

void intr_config(XScuGic *intr_ptr,XScuTimer *timer_ptr){
	//GIC配置信息驱动实例
	XScuGic_Config *IntcConfig;

	//根据中断控制器的器件ID查找配置信息
	IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
	//根据查找到的配置信息初始化中断控制器
	XScuGic_CfgInitialize(intr_ptr, IntcConfig,IntcConfig->CpuBaseAddress);

	//关联GPIO中断处理程序
	XScuGic_Connect(intr_ptr, TIMER_IRPT_INTR,(Xil_ExceptionHandler)IntrHandler,(void *)timer_ptr);

	//使能GIC的GPIO中断
	XScuGic_Enable(intr_ptr, TIMER_IRPT_INTR);
	//使能定时器中断
	XScuTimer_EnableInterrupt(timer_ptr);

	//针对异常初始化
	Xil_ExceptionInit();
	//注册中断请求异常处理程序
	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,intr_ptr);
	//使能异常处理
	Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);
}

void IntrHandler(void *CallBackRef){
	XScuTimer *timer_ptr = (XScuTimer *) CallBackRef;

	led_state = !led_state;

	led0(led_state);
	xil_printf("led_state = %d\r\n",led_state);

	XScuTimer_ClearInterruptStatus(timer_ptr);
}

intr.h

#include <stdio.h>
#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"
#include "xscugic.h"
#include "xil_exception.h"
#include "xil_printf.h"
#include "xscutimer.h"
#include "main.h"

void intr_config(XScuGic *intr_ptr,XScuTimer *timer_ptr);
void IntrHandler(void *CallBackRef);

timer.c

#include <stdio.h>
#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"
#include "xscugic.h"
#include "xil_exception.h"
#include "xil_printf.h"
#include "xscutimer.h"
#include "main.h"
#include "timer.h"

void timer_config(XScuTimer *timer_ptr){
	XScuTimer_Config *ConfigPtr;
	//根据器件ID查找GPIO配置信息
	ConfigPtr = XScuTimer_LookupConfig(TIMER_DEVICE_ID);
	//对定时器驱动初始化
	XScuTimer_CfgInitialize(timer_ptr, ConfigPtr,ConfigPtr->BaseAddr);

	//配置定时器参数
	//使能自动装载模式
	XScuTimer_EnableAutoReload(timer_ptr);
	//配置装载值
	XScuTimer_LoadTimer(timer_ptr, TIMER_LOAD_VALUE);
	//开启定时器   ->配置完中断后
	//XScuTimer_Start(timer_ptr);
}

timer.h

#include <stdio.h>
#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"
#include "xscugic.h"
#include "xil_exception.h"
#include "xil_printf.h"
#include "xscutimer.h"
#include "main.h"

void timer_config(XScuTimer *timer_ptr);



网站公告

今日签到

点亮在社区的每一天
去签到