nongfuxu 发表于 2021-3-20 08:48

HC32F030进不了TIMER定时中断。

我在HC32F030上运行TIMER3定时中断,也不行。进不了中断,为什么。
注:使用驱动库中的DEMO, keil 中有 --keep=*Handler。

nongfuxu 发表于 2021-3-20 08:50

这是它的源代码,程序运行正常,就是无中断响应。





nongfuxu 发表于 2021-3-20 08:57

int32_t main(void)
{
    uint16_t                  u16ArrValue;
    uint16_t                  u16CntValue;
    stc_tim3_mode0_config_t   stcTim3BaseCfg;
    stc_gpio_config_t         stcTIM3A0Port;
    stc_gpio_config_t         stcTIM3B0Port;
   
    DDL_ZERO_STRUCT(stcTim3BaseCfg);
    DDL_ZERO_STRUCT(stcTIM3A0Port);
    DDL_ZERO_STRUCT(stcTIM3B0Port);
   
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); //GPIO 外设时钟使能
    Sysctrl_SetPeripheralGate(SysctrlPeripheralTim3, TRUE); //Timer3外设时钟使能
   
    //PA08设置为TIM3_CH0A
    //Gpio_ClrAnalogMode(GpioPortA, GpioPin8);
    stcTIM3A0Port.enDir= GpioDirOut;
    Gpio_Init(GpioPortA, GpioPin8, &stcTIM3A0Port);
    Gpio_SetAfMode(GpioPortA,GpioPin8,GpioAf2);
   
    //PA07设置为TIM3_CH0B
    //Gpio_ClrAnalogMode(GpioPortA, GpioPin7);
    stcTIM3B0Port.enDir= GpioDirOut;
    Gpio_Init(GpioPortA, GpioPin7, &stcTIM3B0Port);
    Gpio_SetAfMode(GpioPortA,GpioPin7,GpioAf4);
   
    stcTim3BaseCfg.enWorkMode = Tim3WorkMode0;               //定时器模式
    stcTim3BaseCfg.enCT       = Tim3Timer;                   //定时器功能,计数时钟为内部PCLK
    stcTim3BaseCfg.enPRS      = Tim3PCLKDiv16;               //PCLK/16
    stcTim3BaseCfg.enCntMode= Tim316bitArrMode;            //自动重载16位计数器/定时器
    stcTim3BaseCfg.bEnTog   = TRUE;
    stcTim3BaseCfg.bEnGate    = FALSE;
    stcTim3BaseCfg.enGateP    = Tim3GatePositive;
   
    stcTim3BaseCfg.pfnTim3Cb= Tim3Int;                   //中断函数入口
   
    Tim3_Mode0_Init(&stcTim3BaseCfg);                        //TIM3 的模式0功能初始化
      
    u16ArrValue = 0x9000;
   
    Tim3_M0_ARRSet(u16ArrValue);                           //设置重载值
   
    u16CntValue = 0x9000;
   
    Tim3_M0_Cnt16Set(u16CntValue);                           //设置计数初值
   
    Tim3_ClearIntFlag(Tim3UevIrq);                         //清中断标志
   
    EnableNvic(TIM3_IRQn, 3, TRUE);                        //TIM3 开中断
   
    Tim3_Mode0_EnableIrq();                              //使能TIM3中断(模式0时只有一个中断)   
   
    Tim3_M0_EnTOG_Output(TRUE);                              //TIM3 端口输出使能
   
    Tim3_M0_Run();                                           //TIM3 运行。
   
    while (1);
}

nongfuxu 发表于 2021-3-20 08:58

/*******************************************************************************
*中断服务函数
******************************************************************************/
void Tim3Int(void)
{
   if(TRUE == Tim3_GetIntFlag(Tim3UevIrq))
   {
      Tim3_ClearIntFlag(Tim3UevIrq);
   }
}

nongfuxu 发表于 2021-3-20 09:01


nongfuxu 发表于 2021-3-20 09:02


nongfuxu 发表于 2021-3-20 09:03


nongfuxu 发表于 2021-3-20 09:04

驱动库是“ HC32F030_DDL_Rev1.3.1”

nongfuxu 发表于 2021-3-20 10:48

什么啊,直接在驱动库的例子程序中,打开项目,正常运行,进入中断。

复制出来,拷贝到工程模板中运行,则中断不行,其余正常。keil时也没有报错。

凡人8000 发表于 2021-3-22 11:48

本帖最后由 凡人8000 于 2021-3-22 11:57 编辑


这是因为启动文件中定义的中断服务函数不一致导致的,,你必须把ddl.h中的这段定义屏蔽掉才行。


这就可以进入中断了:





martinhu 发表于 2021-3-22 13:45

凡人8000 发表于 2021-3-22 11:48
这是因为启动文件中定义的中断服务函数不一致导致的,,你必须把ddl.h中的这段定义屏蔽掉才行。




楼上正解,驱动库的启动文件和模板启动文件的中断名定义不一样,所以造成楼主的异常现象

nongfuxu 发表于 2021-4-1 08:04

谢谢楼上二位,结帖

lesheng002 发表于 2021-4-2 07:44

我用HC32F030的定时器的编码器功能,设置计数上溢出和下溢出中断,寄存器设置是正常的,中断也会出现,但调试过程中发现,上溢出或下溢出时都能进中断,下溢出时,中断标志是正常的,
调用库函数获得其中断标志位true,Adt_GetIrqFlag(pCounter, AdtUDFIrq, &flag), flag = true、正常的执行下溢出部分程序,
而上溢出的时候,同样调用函数Adt_GetIrqFlag(pCounter, 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_tu16Period = 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, IrqLevel1, TRUE);   //AdvTimer中断使能
       
        Adt_StartCount(pEncoder);


中断代码如下
                       
if(Ok == Adt_GetIrqFlag(pCounter, AdtOVFIrq, &flag))
{   // 上溢出中断
       if(flag == TRUE)
       {
            axisOverCount++;
            Adt_ClearIrqFlag(pCounter, AdtOVFIrq);
       }
}
if(Ok == Adt_GetIrqFlag(pCounter, AdtUDFIrq, &flag))
{    //下溢出中断
   if(flag == TRUE)
   {
            axisOverCount--;
            Adt_ClearIrqFlag(pCounter, AdtUDFIrq);
   }
}

请大咖们帮忙分析一下是什么原因造成的,谢谢先

martinhu 发表于 2021-4-2 09:21

lesheng002 发表于 2021-4-2 07:44
我用HC32F030的定时器的编码器功能,设置计数上溢出和下溢出中断,寄存器设置是正常的,中断也会出现,但调 ...

    stcAdtBaseCntCfg.enCntMode = AdtSawtoothMode;            //Sawtooth Mode
    stcAdtBaseCntCfg.enCntDir = AdtCntUp;                      // Cnt up

你这个设置的是锯齿波的向上计数模式,所以只有上溢中断有效吧,下溢中断理论上是无效的。
如果同时使能上下溢,因为间隔只有1个cnt值,没有这样试过。

楼主如果需要上下溢中断,建议CntMode换成三角波模式。

tfqi 发表于 2021-4-8 17:22

开启中断使能了吗

qcliu 发表于 2021-4-8 17:23

不要忘记总中断也要使能

wiba 发表于 2021-4-8 17:25

设置的模式问题

nawu 发表于 2021-4-8 17:25

--keep=*Handler 这个是什么意思啊

zljiu 发表于 2021-4-8 17:27

溢出还分方向啊?

chenjun89 发表于 2021-4-9 07:41

感谢楼主的分享
页: [1] 2
查看完整版本: HC32F030进不了TIMER定时中断。