一.硬件配置
(1)添加IP核
(2)分配地址
(3)连线
二.软件编写
(1)timer的处理:载入计数值->设置运行选项(向上向下计数,使能中断,自加载计数值等)->使能,开始运行
(2)interupt的处理:使能microblaze中断->在XPS_INTC注册中断服务函数->使能XPS_INTC中断->使能timer在XPS_INTC里的中断
(3)程序架构:
#include "xparameters.h"
#include "xintc.h" //中断子函数头文件
#include "xtmrctr.h" //定时器子函数头文件
void timer_int_handler(void);//中断函数声明
int main(void)
{
microblaze_enable_interrupts();
XIntc_RegisterHandler(XPAR_XPS_INTC_0_BASEADDR,
XPAR_XPS_INTC_0_XPS_TIMER_0_INTERRUPT_INTR,
(XInterruptHandler)timer_int_handler,
(void *)XPAR_XPS_TIMER_0_BASEADDR
);
XIntc_mMasterEnable(XPAR_XPS_INTC_0_BASEADDR);
XTmrCtr_mSetLoadReg(XPAR_XPS_TIMER_0_BASEADDR,0,0x20000000);
XTmrCtr_mSetControlStatusReg(XPAR_XPS_TIMER_0_BASEADDR,0,
XTC_CSR_ENABLE_TMR_MASK | XTC_CSR_ENABLE_INT_MASK |XTC_CSR_AUTO_RELOAD_MASK|XTC_CSR_DOWN_COUNT_MASK );
XIntc_mEnableIntr(XPAR_XPS_INTC_0_BASEADDR,XPAR_XPS_TIMER_0_INTERRUPT_MASK);
while(1);//等待中断
return 0;
}
//中断处理程序:
void timer_int_handler(void)
{
unsigned int timer_csr;
timer_csr = XTmrCtr_mGetControlStatusReg(XPAR_XPS_TIMER_0_BASEADDR, 0);
//...中断处理
XTmrCtr_mSetControlStatusReg(XPAR_XPS_TIMER_0_BASEADDR,0, timer_csr);
}
例子:
void InterruptHandler(void);
int main(void)
{
microblaze_register_handler((XInterruptHandler)InterruptHandler, (void*)0);
#ifdef DEBUG
print("* Registered Interrupt Handler *\n\r");
#endif
microblaze_enable_interrupts();
// Something useful here.
return 0;
}
void InterruptHandler(void)
{
#ifdef DEBUG
print("* Entering Interrupt *\r\n");
#endif
microblaze_disable_interrupts();
// Do something useful here .
microblaze_enable_interrupts();
#ifdef DEBUG
print("* Leaving Interrupt *\r\n");
#endif
}
转载自:阳明的博客 |