我用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);
- }
- }
请大咖们帮忙分析一下是什么原因造成的,谢谢先
|