我用HC32F030的定时器的编码器功能,设置计数上溢出和下溢出中断,寄存器设置是正常的,中断也会出现,但调试过程中发现,上溢出或下溢出时都能进中断,下溢出时,中断标志是正常的,
调用库函数获得其中断标志位true,Adt_GetIrqFlag(pCounter[axis], AdtUDFIrq, &flag), flag = true、正常的执行下溢出部分程序,
而上溢出的时候,同样调用函数Adt_GetIrqFlag(pCounter[axis], AdtUDFIrq, &flag),得到的flag不为true,上溢出中断标志没有置位,因而无法正常执行上溢出部分程序,
查看代码也没看出什么问题
先看初始化代码
DDL_ZERO_STRUCT(stcAdtBaseCntCfg);
Adt_DeInit(pEncoder);
Sysctrl_SetPeripheralGate(SysctrlPeripheralAdvTim, TRUE); //ADT外设时钟使能
stcAdtBaseCntCfg.enCntMode = AdtSawtoothMode; //Sawtooth Mode
stcAdtBaseCntCfg.enCntDir = AdtCntUp; // Cnt up
stcAdtBaseCntCfg.enCntClkDiv = AdtClkPClk0; // PCLK0/4
Adt_Init(pEncoder, &stcAdtBaseCntCfg); //ADT载波、计数模式、时钟配置
uint16_t u16Period = 0xFFFF;
Adt_SetPeriod(pEncoder, u16Period); //周期设置
// 端口配置捕获输入
stcAdtACfg.enCap = AdtCHxCompareInput; //Channel A 作为捕获输入(used as capture input)
stcAdtACfg.bFltEn = TRUE; //FALSE;
stcAdtACfg.enFltClk = AdtFltClkPclk0Div4; // AdtFltClkPclk0Div16
Adt_CHxXPortConfig(pEncoder, AdtCHxA, &stcAdtACfg); //Channel A配置 & GPIO CHA 输入滤波使能
stcAdtBCfg.enCap = AdtCHxCompareInput; //Channel B 作为捕获输入(used as capture input)
stcAdtBCfg.bFltEn = TRUE;
stcAdtBCfg.enFltClk = AdtFltClkPclk0Div4;
Adt_CHxXPortConfig(pEncoder, AdtCHxB, &stcAdtBCfg);
Adt_ClearIrqFlag(pEncoder,AdtOVFIrq );
Adt_ClearIrqFlag(pEncoder,AdtUDFIrq );
Adt_ConfigIrq(pEncoder, AdtOVFIrq, TRUE, NULL); //捕获上溢中断
Adt_ConfigIrq(pEncoder, AdtUDFIrq, TRUE, NULL); //捕获下溢出中断
EnableNvic(encCountIrqN[axis], IrqLevel1, TRUE); //AdvTimer中断使能
Adt_StartCount(pEncoder);
中断代码如下
if(Ok == Adt_GetIrqFlag(pCounter[axis], AdtOVFIrq, &flag))
{ // 上溢出中断
if(flag == TRUE)
{
axisOverCount++;
Adt_ClearIrqFlag(pCounter[axis], AdtOVFIrq);
}
}
if(Ok == Adt_GetIrqFlag(pCounter[axis], AdtUDFIrq, &flag))
{ // 下溢出中断
if(flag == TRUE)
{
axisOverCount--;
Adt_ClearIrqFlag(pCounter[axis], AdtUDFIrq);
}
}
请大咖们帮忙分析一下是什么原因造成的,谢谢先 |