This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

tms470芯片HET模块中断问题

Other Parts Discussed in Thread: HALCOGEN

用HCG生成的代码,配置如下图所示

我DEBUG时,PIN3的PWM波形正常,

但在void hetLowLevelInterrupt(void)以及void hetHighLevelInterrupt(void)函数中均设置断点时,结果断点均没有触发。

同样的情况发生在设置Edge及Cap时,均无法进入HET高低中断。。。我设置的时钟中断均能正常进入。

请问还需设置哪里才能正常的进入HET的中断?

  • 另我也在初始化后调用了     pwmEnableNotification(pwm0, pwmEND_OF_PERIOD);

    还是不能进入中断,请帮忙看看,谢谢!

  • Hi Forever,

        有没有打开CPU的全局中断呢?

        如果使用的是CCS的话,直接调用编译器的内嵌函数_enable_interrupts();就可以了。

  • RTI中断能正常进入,分别设置了RTI的compare0,1,2三个中断,我用的是CCS4.1.3,找不到_enable_interrupts();

    开始时已执行了void nestEnable(void) { vimREG->NESTCTL = 0x0AU;}函数,

    且vimREG->REQMASKSET0也配置正常,就是无法进入HET的中断,还请支招,谢谢!

  • Hi Forever,

        噢,这样啊...

        还是建议你升级到CCS V5.3,比CCS V4强大不少。

        如果不习惯新的界面,那么可以考虑单独升级TI ARM Compiler, 目前最新应该是V5.0.3.

        刚才确认了一下,抱歉,应该是HALCoGen生成的代码不完整所致。

        请参考附件的例程。

        原因是pwmEnableNotification();函数中只做了清Int Flag的动作,而没有真正去打开中断。

        打开方法如下(仅针对HALCoGen生成的代码):

            在pwmEnableNotification()函数中加入以下代码:

    if(pwmEND_OF_PERIOD == notification)
        {
            hetRAM->Instruction[(pwm << 1U) + 42U].Control  |= 0x00000001U;     /* enable interrupt in the control field of the instruction */
        }
        else if(pwmEND_OF_DUTY == notification)
        {
            hetRAM->Instruction[(pwm << 1U) + 41U].Control  |= 0x00000001U;     /* enable interrupt in the control field of the instruction */
        }
        else
        {
            hetRAM->Instruction[(pwm << 1U) + 42U].Control  |= 0x00000001U;     /* enable interrupt in the control field of the instruction */
            hetRAM->Instruction[(pwm << 1U) + 41U].Control  |= 0x00000001U;     /* enable interrupt in the control field of the instruction */
        }
    }

         这段代码打开了Het指令中对应Duty和Period的中断使能位。

         我加入了一个关掉中断的函数,在sys_main.c中,pwmDisableNotification();

        附件例程是CCS V5.3基于TI ARM Compiler V5.0.3的,如果你无法直接打开,那么就把源文件导入你的工程中即可。

    470_HET_INT.zip
  • 确实如你所描述的,我将HETRAM调整后就可以中断了。

    另还想请教一个问题,如第一张图所示我产生的PWM波形周期是1000us,但实际产生的波形周期却是4倍4000us。

    用RTI模块时,时钟定时是准确的,就是HET的时钟不准,不知为何。这个是HET的配置图,帮忙分析下吧,谢谢了!

  • Hi Forever,

        这个可能是晶振的设置不对造成的吧。

        在Oscillator选项卡里面,默认是16MHz的晶振,是不是你的板子上使用了4MHz振荡器?

  • 我使用的是16M的晶振,RTI的时钟是准的

  • Hi Forever,

        抱歉刚没注意你的描述。

        这样的话,可能要仔细看一下设置了。

        如果能够确认其他HALCoGen内部的设置(clock tree, oscillator, het clock等)都没有问题的话, 我们仔细看一下HET的代码吧。

        PWM0的周期对应的更新指令是第42条指令,你可以打开het.c源文件来查看:

            const hetINSTRUCTION_t hetPROGRAM[] 这个数组的内容。

        找到第42条指令,如图:

        

        这里的Data段,319872U就相当于比较寄存器的值。

        我们需要把它右移7bit,得到真正的(周期值 - 1)。

        319872U >>7U = 2499

        周期是2499+1= 2500个LR clock.

        根据你前面的描述,你的LR Clock设置为400ns。

        即周期为1000us。

        所以,请你看一下,是不是这个数字有问题?如果不是319872U或者比较接近的值,那么说明这个值错了。

  • 或者,进入调试状态,在Memory窗口中观察这个指令的值,第42条指令在0xff4602a0地址上。

    找到后看看Data中的值是否是0x0004E180U。

    运行一段时间后再观测这里的值,看看是否被改动过。

  • 我尝试用的是3000us做的周期

    HCG生成的代码如下:

        /* MOV64: PWM 0 -> Period Update
        *         - Instruction                  = 42
        *         - Next instruction             = 3
        *         - Conditional next instruction = 41
        *         - Interrupt                    = 2
        *         - Pin                          = na
        */
        {
            /* Program */
            0x00003102U,
            /* Control */
            (0x00029006U | 0x00000000U),
            /* Data */
            959872U,
      /* Reserved */
      0x00000000U
        },

    按你所说,959872U右移7位为7499,乘以400ns,也为3000us,与HCG设置一致。

    DEBUG时,看MEMORY如图,也与设置一致。

    但示波器观察针脚波形时,周期就是为12ms,4倍的关系。。。

  • Hi Forever,

        看来还是系统时钟的配置问题了。

        先到HALCoGen的[Clock Tree]选项卡来确认VCLK2的输出,这个时钟是HET的基本时钟源。

        

        默认情况下是80MHz,请查看是否正确。

        再到[Global Clock Module]选项卡里面查看VCLK2的预分频设置。

        如果不正确,请按照图中修改过来。

        但是一般情况下,HALCoGen是支持内部参考的,也就是说,如果这里改动了,那么HET选项卡中也会相应的改变。

        如果您的HALCoGen不能做到这一点,可能是版本过低,请更新。

        如果这两处都没有错,那么我觉得就是生成的代码与配置不一致。

        可以深入代码中去查看寄存器的设置是否正确,当然这样比较浪费时间。

        比较方便的办法就是用HALCoGen重新配置一个全新的工程,看看问题是否还在。

  • 你好,我有个问题,就是tms470 EDGE不能产生中断,而570可以,不太清楚问题出现在哪里,有例程吗?谢谢