通过定时器产生中断,每200ms控制PS LED灯亮灭。
block design和之前的GPIO-MIO配置一致。
代码设计:
#include <stdio.h>
#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"
#include "xscugic.h"
#include "xil_exception.h"
#include <xil_printf.h>
#include "xplatform_info.h"
#include "xscutimer.h"
#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
#define INTC_DEVICE_ID XPAR_SCUGIC_SINGLE_DEVICE_ID
//GPIO的中断号:XPAR_XGPIOPS_0_INTR,即52
#define TIMER_DEVICE_ID XPAR_XSCUTIMER_0_DEVICE_ID
#define MIO_LED 0 //MIO 0
#define TIMER_IRPT_INTR XPAR_SCUTIMER_INTR
// UG585手册中设定的私有定时器的频率是1/2的CPU频率 = 333.3333435Mhz 计数0.2s,则计数器:0.2*333.3333435=3F940AC
#define TIMER_LOAD_VALUE 0x3F940AC //0.2s
//定义变量
XGpioPs Gpio; //GPIO器件的驱动实例
XScuGic Intc; //GIC器件的驱动实例
XScuTimer Timer; /* Cortex A9 Scu Private Timer Instance */
void mio_init(XGpioPs *gpio_ptr);
void timer_init(XScuTimer *timer_ptr);
void timer_intr_setup(XScuGic *intr_ptr,XScuTimer *timer_ptr);
void timer_intr_handler(void *CallBackRef);
int main(){
xil_printf("SCU Timer Interrupt Example Test \r\n");
//GPIO MIO初始化和配置
mio_init(&Gpio);
//定时器的初始化和配置
timer_init(&Timer);
//定时器中断的初始化和配置
timer_intr_setup(&Intc,&Timer);
//开启定时器
XScuTimer_Start(&Timer);
return 0;
}
void mio_init(XGpioPs *gpio_ptr)
{
XGpioPs_Config *ConfigPtr;
//对GPIO进行初始化(两步) /* Initialize the GPIO driver. */
//第一步:根据器件ID去查找器件的配置信息
ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
//第二步:对GPIO的驱动进行初始化
XGpioPs_CfgInitialize(gpio_ptr, ConfigPtr,ConfigPtr->BaseAddr);
//设置引脚的方向,0为输入,1为输出
XGpioPs_SetDirectionPin(gpio_ptr, MIO_LED, 1);
//设置输出使能,1:使能输出,0:不使能输出
XGpioPs_SetOutputEnablePin(gpio_ptr, MIO_LED, 1);
}
//定时器的初始化和配置
void timer_init(XScuTimer *timer_ptr)
{
XScuTimer_Config *ConfigPtr;
//根据定时器器件ID来查找器件的配置信息
ConfigPtr = XScuTimer_LookupConfig(TIMER_DEVICE_ID);
//对定时器的驱动进行初始化
XScuTimer_CfgInitialize(timer_ptr, ConfigPtr,
ConfigPtr->BaseAddr);
//对定时器进行配置
//1.使能自动重新装载模式
XScuTimer_EnableAutoReload(timer_ptr);
//2.配置定时器的装载值(初始值
XScuTimer_LoadTimer(timer_ptr, TIMER_LOAD_VALUE);
};
void timer_intr_setup(XScuGic *intr_ptr,XScuTimer *timer_ptr)
{
XScuGic_Config *IntcConfig;
//根据中断控制器(GIC)的器件ID来查找配置信息
IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
//根据查找到的配置信息初始化中断控制器(GIC)
XScuGic_CfgInitialize(intr_ptr, IntcConfig,
IntcConfig->CpuBaseAddress);
//异常初始化(初始化ARM处理器异常句柄)
Xil_ExceptionInit();
//注册中断请求异常的处理程序
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
(Xil_ExceptionHandler)XScuGic_InterruptHandler,
intr_ptr);
//使能处理器的中断
Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);
//关联定时器中断处理程序
XScuGic_Connect(intr_ptr, TIMER_IRPT_INTR,
(Xil_ExceptionHandler)timer_intr_handler,
(void *)timer_ptr);
//使能GIC的定时器中断
XScuGic_Enable(intr_ptr, TIMER_IRPT_INTR);
//使能定时器的中断
XScuTimer_EnableInterrupt(timer_ptr);
};
//定时器中断处理函数
void timer_intr_handler(void *CallBackRef)
{
static u8 led_state = 0;
XScuTimer *timer_ptr = (XScuTimer *) CallBackRef;
if(led_state == 0)
led_state = 1;
else
led_state = 0;
//向GPIO MIO写入led_state
XGpioPs_WritePin(&Gpio, MIO_LED, led_state);
//清除定时器的中断
XScuTimer_ClearInterruptStatus(timer_ptr);
}
上板验证:成功执行中断打印信息,用于显示定时器中断的LED灯以200ms的时间间隔进行闪烁
关于程序在线调试的运用: