自己最近在玩Microblaze,下面简单的贴个定时器中断的例程出来,供大家参考,自己加了一点汉语注释,方便大家阅读,不过本人还是提倡大家提高原文阅读能力,本例程实现一秒定时,并在led灯上显示。(如需转载请注明出处)
废话太多,贴代码:
#include <xtmrctr.h>
#include <xintc_l.h>
#include <xgpio.h>
#include <xparameters.h>
#define LEDChan 1
unsigned int count = 0;
XGpio gpio;
void timer_int_handler(void * baseaddr_p) //中断句柄函数(中断服务程序)
{
unsigned int csr;
/* 读取定时器0的控制状态寄存器,判断中断是否产生 */
csr = XTmrCtr_mGetControlStatusReg(XPAR_DELAY_BASEADDR,0);
/* 如果中断产生,标志变量自加1 */
if(csr &XTC_CSR_INT_OCCURED_MASK)
{
count++;
}
/* 中断服务程序的最后,清除中断标志位 */
XTmrCtr_mSetControlStatusReg(XPAR_DELAY_BASEADDR,0, csr);
}
int main()
{
/* 注册定时器的中断服务程序 */
XIntc_RegisterHandler(XPAR_XPS_INTC_0_BASEADDR,
XPAR_XPS_INTC_0_DELAY_INTERRUPT_INTR,
(XInterruptHandler) timer_int_handler,
(void *)XPAR_DELAY_BASEADDR);
/* 使能中断控制器 */
XIntc_mMasterEnable(XPAR_XPS_INTC_0_BASEADDR);
XIntc_mEnableIntr(XPAR_XPS_INTC_0_BASEADDR, 0x1);
/* 给装载寄存器装载初值 */
XTmrCtr_mSetLoadReg(XPAR_DELAY_BASEADDR, 0, 50000000);
/* 使能中断控制器中的计数器中断*/
XIntc_mEnableIntr(XPAR_DELAY_BASEADDR, XPAR_DELAY_INTERRUPT_MASK);
/* 设置计数器计数模式并开始计数*/
XTmrCtr_mSetControlStatusReg(XPAR_DELAY_BASEADDR, 0, XTC_CSR_ENABLE_TMR_MASK | XTC_CSR_ENABLE_INT_MASK |
XTC_CSR_AUTO_RELOAD_MASK | XTC_CSR_DOWN_COUNT_MASK);
/* 使能Microblaze中断*/
microblaze_enable_interrupts();
/*初始化gpio口并设置其输入输出方向*/
XGpio_Initialize(&gpio, XPAR_LED_DEVICE_ID);
XGpio_SetDataDirection(&gpio,LEDChan, 0);
while(1)
{
/* 把count赋给gpio口,将其显示在led灯上*/
XGpio_DiscreteWrite(&gpio,1,count);
if(count==256)
count=0;
}
return 0;
}
注:程序中函数中的参变量多数是在xtmrctr_l.h文件里的,右以在其中查阅其值及含义,然后对照后面本文的Control/Status Register 0 (TCSR0)
的相关信息,每个函数的作用便很清楚了。
microblaze定时器中断在generate mode 下的主要特性如下:
microblaze定时器中断主要寄存器的设置如下: