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);