本帖最后由 xzhihui 于 2013-8-23 14:40 编辑
需要实现一个定时器中断来采集信号。但是弄了两天了也没调试好。向各位坛友求助。
代码使用的是官方提供的函数库。
测试函数:
Int16 CSL_gptIntrTest(void)
{
CSL_Handle hGpt; // 通用定时器的句柄
CSL_Status status;//寄存器操作后的状态
CSL_Config hwConfig;//定时器配置参数
CSL_GptObj gptObj;//结构体对象
hitIsr = FALSE;//中断标志
status = 0;//状态初始化
hGpt = GPT_open (GPT_0, &gptObj, &status);//打开通用定时器并获取结构体
if((NULL == hGpt) || (CSL_SOK != status))//检验打开后返回的状态
{
printf("GPT Open Failed\n");
return (CSL_TEST_FAILED);
}
else
{
printf("GPT Open Successful\n");
}
IRQ_clearAll();//清除中断标志
IRQ_disableAll();//关闭所有中断
status = GPT_reset(hGpt);定时器复位
if(CSL_SOK != status)//检测复位后状态
{
printf("GPT Reset Failed\n");
return (CSL_TEST_FAILED);
}
else
{
printf("GPT Reset Successful\n");
}
IRQ_setVecs((Uint32)(&VECSTART));//配置中断向量表
IRQ_plug(TINT_EVENT, &gpt0Isr);//设置中断事件地址
IRQ_enable(TINT_EVENT);//定时器中断使能
hwConfig.autoLoad = GPT_AUTO_ENABLE;//使能自动计时器装载
hwConfig.ctrlTim = GPT_TIMER_ENABLE;//定时器使能
hwConfig.preScaleDiv = GPT_PRE_SC_DIV_7;//预分频寄存器0111,对应256的分频值
hwConfig.prdLow = (100000)/4;//计时器加载值的周期(低位),时钟频率为100M
hwConfig.prdHigh = 0x0000;//计时器加载值的周期(高位),
status = GPT_config(hGpt, &hwConfig);//配置定时器对应的寄存器
if(CSL_SOK != status)//检验
{
printf("GPT Config Failed\n");
return (CSL_TEST_FAILED);
}
else
{
printf("GPT Config Successful\n");
}
IRQ_globalEnable();//开启全局中断
GPT_start(hGpt);//开启定时器
while(hitIsr != TRUE)//等待中断,程序就停在这里,中断始终没有触发
{
cpuCycleCount++;
}
IRQ_globalDisable();//关闭CPU中断
IRQ_clearAll();//清除所有中断标志
IRQ_disableAll();//禁止所有中断
status = GPT_stop(hGpt);//停止计时器计数
if(CSL_SOK != status)
{
printf("GPT Stop Failed \n");
return (CSL_TEST_FAILED);
}
else
{
printf("GPT Stop Successful\n");
}
status = GPT_reset(hGpt);//复位
status = GPT_close(hGpt);//关闭
if(CSL_SOK != status)
{
printf("GPT Close Failed\n");
return (CSL_TEST_FAILED);
}
return (CSL_TEST_PASSED);
}
中断函数:
interrupt void gpt0Isr(void)
{
hitIsr = TRUE;//中断变量置位
IRQ_clear(TINT_EVENT);//清除TINT中断标志
/* Clear Timer Interrupt Aggregation Flag Register (TIAFR) */
CSL_SYSCTRL_REGS->TIAFR = 0x01;//清除TIAFR中断的标志
}
程序中所用的函数,均是CSL函数库中的函数,我没有改动。
|