打印
[技术问答]

HC32F030进不了TIMER定时中断。

[复制链接]
2108|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我在HC32F030上运行TIMER3定时中断,也不行。进不了中断,为什么。
注:使用驱动库中的DEMO, keil 中有 --keep=*Handler。

使用特权

评论回复
沙发
nongfuxu|  楼主 | 2021-3-20 08:50 | 只看该作者
这是它的源代码,程序运行正常,就是无中断响应。
HC32F030J8TA.rar (3.59 MB)




使用特权

评论回复
板凳
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);
     }
}

使用特权

评论回复
5
nongfuxu|  楼主 | 2021-3-20 09:01 | 只看该作者

使用特权

评论回复
6
nongfuxu|  楼主 | 2021-3-20 09:02 | 只看该作者

使用特权

评论回复
7
nongfuxu|  楼主 | 2021-3-20 09:03 | 只看该作者

使用特权

评论回复
8
nongfuxu|  楼主 | 2021-3-20 09:04 | 只看该作者
驱动库是“ HC32F030_DDL_Rev1.3.1”

使用特权

评论回复
9
nongfuxu|  楼主 | 2021-3-20 10:48 | 只看该作者
什么啊,直接在驱动库的例子程序中,打开项目,正常运行,进入中断。

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

使用特权

评论回复
评论
YF22 2021-3-22 11:10 回复TA
检查一下工程配置 
10
凡人8000| | 2021-3-22 11:48 | 只看该作者
本帖最后由 凡人8000 于 2021-3-22 11:57 编辑


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


这就可以进入中断了:





使用特权

评论回复
11
martinhu| | 2021-3-22 13:45 | 只看该作者
凡人8000 发表于 2021-3-22 11:48
这是因为启动文件中定义的中断服务函数不一致导致的,,你必须把ddl.h中的这段定义屏蔽掉才行。

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

使用特权

评论回复
12
nongfuxu|  楼主 | 2021-4-1 08:04 | 只看该作者
谢谢楼上二位,结帖

使用特权

评论回复
13
lesheng002| | 2021-4-2 07:44 | 只看该作者
我用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);
     }
}

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

使用特权

评论回复
14
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换成三角波模式。

使用特权

评论回复
15
tfqi| | 2021-4-8 17:22 | 只看该作者
开启中断使能了吗

使用特权

评论回复
16
qcliu| | 2021-4-8 17:23 | 只看该作者
不要忘记总中断也要使能

使用特权

评论回复
17
wiba| | 2021-4-8 17:25 | 只看该作者
设置的模式问题

使用特权

评论回复
18
nawu| | 2021-4-8 17:25 | 只看该作者
--keep=*Handler 这个是什么意思啊

使用特权

评论回复
19
zljiu| | 2021-4-8 17:27 | 只看该作者
溢出还分方向啊?

使用特权

评论回复
20
chenjun89| | 2021-4-9 07:41 | 只看该作者
感谢楼主的分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

417

主题

4293

帖子

2

粉丝