[技术问答] HC32F030进不了TIMER定时中断。

[复制链接]
3288|21
 楼主| nongfuxu 发表于 2021-3-20 08:48 | 显示全部楼层 |阅读模式
我在HC32F030上运行TIMER3定时中断,也不行。进不了中断,为什么。
注:使用驱动库中的DEMO, keil 中有 --keep=*Handler。
 楼主| nongfuxu 发表于 2021-3-20 08:50 | 显示全部楼层
这是它的源代码,程序运行正常,就是无中断响应。
HC32F030J8TA.rar (3.59 MB, 下载次数: 14)




 楼主| nongfuxu 发表于 2021-3-20 08:57 | 显示全部楼层
  1. int32_t main(void)
  2. {
  3.     uint16_t                  u16ArrValue;
  4.     uint16_t                  u16CntValue;
  5.     stc_tim3_mode0_config_t   stcTim3BaseCfg;
  6.     stc_gpio_config_t         stcTIM3A0Port;
  7.     stc_gpio_config_t         stcTIM3B0Port;
  8.    
  9.     DDL_ZERO_STRUCT(stcTim3BaseCfg);
  10.     DDL_ZERO_STRUCT(stcTIM3A0Port);
  11.     DDL_ZERO_STRUCT(stcTIM3B0Port);
  12.    
  13.     Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); //GPIO 外设时钟使能
  14.     Sysctrl_SetPeripheralGate(SysctrlPeripheralTim3, TRUE); //Timer3外设时钟使能
  15.    
  16.     //PA08设置为TIM3_CH0A
  17.     //Gpio_ClrAnalogMode(GpioPortA, GpioPin8);
  18.     stcTIM3A0Port.enDir  = GpioDirOut;
  19.     Gpio_Init(GpioPortA, GpioPin8, &stcTIM3A0Port);
  20.     Gpio_SetAfMode(GpioPortA,GpioPin8,GpioAf2);
  21.    
  22.     //PA07设置为TIM3_CH0B
  23.     //Gpio_ClrAnalogMode(GpioPortA, GpioPin7);
  24.     stcTIM3B0Port.enDir  = GpioDirOut;
  25.     Gpio_Init(GpioPortA, GpioPin7, &stcTIM3B0Port);
  26.     Gpio_SetAfMode(GpioPortA,GpioPin7,GpioAf4);
  27.    
  28.     stcTim3BaseCfg.enWorkMode = Tim3WorkMode0;               //定时器模式
  29.     stcTim3BaseCfg.enCT       = Tim3Timer;                   //定时器功能,计数时钟为内部PCLK
  30.     stcTim3BaseCfg.enPRS      = Tim3PCLKDiv16;               //PCLK/16
  31.     stcTim3BaseCfg.enCntMode  = Tim316bitArrMode;            //自动重载16位计数器/定时器
  32.     stcTim3BaseCfg.bEnTog     = TRUE;
  33.     stcTim3BaseCfg.bEnGate    = FALSE;
  34.     stcTim3BaseCfg.enGateP    = Tim3GatePositive;
  35.    
  36.     stcTim3BaseCfg.pfnTim3Cb  = Tim3Int;                   //中断函数入口
  37.    
  38.     Tim3_Mode0_Init(&stcTim3BaseCfg);                        //TIM3 的模式0功能初始化
  39.         
  40.     u16ArrValue = 0x9000;
  41.    
  42.     Tim3_M0_ARRSet(u16ArrValue);                             //设置重载值
  43.    
  44.     u16CntValue = 0x9000;
  45.    
  46.     Tim3_M0_Cnt16Set(u16CntValue);                           //设置计数初值
  47.    
  48.     Tim3_ClearIntFlag(Tim3UevIrq);                         //清中断标志
  49.    
  50.     EnableNvic(TIM3_IRQn, 3, TRUE);                        //TIM3 开中断
  51.    
  52.     Tim3_Mode0_EnableIrq();                                //使能TIM3中断(模式0时只有一个中断)   
  53.    
  54.     Tim3_M0_EnTOG_Output(TRUE);                              //TIM3 端口输出使能
  55.    
  56.     Tim3_M0_Run();                                           //TIM3 运行。
  57.    
  58.     while (1);
  59. }
 楼主| nongfuxu 发表于 2021-3-20 08:58 | 显示全部楼层
  1. /*******************************************************************************
  2. *中断服务函数
  3. ******************************************************************************/
  4. void Tim3Int(void)
  5. {
  6.      if(TRUE == Tim3_GetIntFlag(Tim3UevIrq))
  7.      {
  8.         Tim3_ClearIntFlag(Tim3UevIrq);
  9.      }
  10. }
 楼主| 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时也没有报错。

评论

检查一下工程配置  发表于 2021-3-22 11:10
凡人8000 发表于 2021-3-22 11:48 | 显示全部楼层
本帖最后由 凡人8000 于 2021-3-22 11:57 编辑

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

68085605813835e359.png
这就可以进入中断了:

1824460581478b1283.png



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[axis], AdtUDFIrq, &flag), flag = true、正常的执行下溢出部分程序,
而上溢出的时候,同样调用函数Adt_GetIrqFlag(pCounter[axis], AdtUDFIrq, &flag),得到的flag不为true,上溢出中断标志没有置位,因而无法正常执行上溢出部分程序,
查看代码也没看出什么问题
先看初始化代码
  1.     DDL_ZERO_STRUCT(stcAdtBaseCntCfg);
  2.         Adt_DeInit(pEncoder);
  3.     Sysctrl_SetPeripheralGate(SysctrlPeripheralAdvTim, TRUE); //ADT外设时钟使能

  4.     stcAdtBaseCntCfg.enCntMode = AdtSawtoothMode;              //Sawtooth Mode
  5.     stcAdtBaseCntCfg.enCntDir = AdtCntUp;                      // Cnt up
  6.     stcAdtBaseCntCfg.enCntClkDiv = AdtClkPClk0;            // PCLK0/4
  7.    
  8.     Adt_Init(pEncoder, &stcAdtBaseCntCfg);                   //ADT载波、计数模式、时钟配置

  9.     uint16_t  u16Period = 0xFFFF;
  10.     Adt_SetPeriod(pEncoder, u16Period);                      //周期设置

  11.         //        端口配置捕获输入
  12.     stcAdtACfg.enCap = AdtCHxCompareInput;                 //Channel A 作为捕获输入(used as capture input)
  13.     stcAdtACfg.bFltEn = TRUE;   //FALSE;
  14.     stcAdtACfg.enFltClk = AdtFltClkPclk0Div4;                // AdtFltClkPclk0Div16
  15.     Adt_CHxXPortConfig(pEncoder, AdtCHxA, &stcAdtACfg);     //Channel A配置 & GPIO CHA 输入滤波使能
  16.    
  17.     stcAdtBCfg.enCap = AdtCHxCompareInput;                 //Channel B 作为捕获输入(used as capture input)
  18.     stcAdtBCfg.bFltEn = TRUE;
  19.     stcAdtBCfg.enFltClk = AdtFltClkPclk0Div4;
  20.     Adt_CHxXPortConfig(pEncoder, AdtCHxB, &stcAdtBCfg);
  21.        
  22.        
  23.     Adt_ClearIrqFlag(pEncoder,AdtOVFIrq );
  24.     Adt_ClearIrqFlag(pEncoder,AdtUDFIrq );
  25.     Adt_ConfigIrq(pEncoder, AdtOVFIrq, TRUE, NULL);    //捕获上溢中断
  26.     Adt_ConfigIrq(pEncoder, AdtUDFIrq, TRUE, NULL);    //捕获下溢出中断
  27.         EnableNvic(encCountIrqN[axis], IrqLevel1, TRUE);   //AdvTimer中断使能
  28.        
  29.         Adt_StartCount(pEncoder);


中断代码如下
  1.                        
  2. if(Ok == Adt_GetIrqFlag(pCounter[axis], AdtOVFIrq, &flag))
  3. {   // 上溢出中断
  4.        if(flag == TRUE)
  5.        {
  6.               axisOverCount++;
  7.               Adt_ClearIrqFlag(pCounter[axis], AdtOVFIrq);
  8.        }
  9. }
  10. if(Ok == Adt_GetIrqFlag(pCounter[axis], AdtUDFIrq, &flag))
  11. {    //  下溢出中断
  12.      if(flag == TRUE)
  13.      {
  14.             axisOverCount--;
  15.             Adt_ClearIrqFlag(pCounter[axis], AdtUDFIrq);
  16.      }
  17. }

请大咖们帮忙分析一下是什么原因造成的,谢谢先
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 来自手机 | 显示全部楼层
感谢楼主的分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

417

主题

4297

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部