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.

HET指令执行序列的问题

TI工程师:

                您好!

                现在正使用HET模块,在执行顺序上有些迷惑。

                我的程序使用到了CNT指令及PWCNT指令,HR设置为3,即4分频,LR设置为5,即32分频,使用64M的VCLK2,那么一次完整的LOOP执行时间为2us,而

                CNT的data field值也是间隔2us加1,这个是没问题的吧?

                如果这样的话PWCNT这个指令也应该是整个LOOP执行一次吧(假如整个LOOP只有一个PWCNT指令)?但是根据我设置的data field值来看,PWCNT

                的分辨率就是HR设置的值62.5ns,难道是该指令62.5ns就执行了一次吗?也就是说下边代码(PWCNT指令执行代码)62.5ns就运行了一次?

If (Data field value == 0)
{
Selected register = 0;
Jump to Next Program Address;
}
If (Data field value > 1)
{
Selected register = Data field value - 1;
Data field value = Counter value - 1;
If (Enable Pin action == 1)
Selected Pin = Pin Action AT next loop resolution clock;
Jump to Next Program Address;
}
If (Data field value == 1)
{
Selected register = 00000h;
Data field value = 00000h;
If (Opposite action == 1)
{
If (hr_lr bit == 0)
{
If (Enable Pin action == 1)
Selected Pin = Opposite level of Pin Action AT next loop
resolution clock + HR delay;
}
else
{
If (Enable Pin action == 1)
Selected Pin = Opposite level of Pin Action AT next loop
resolution clock;
}
}
If (Interrupt Enable == 1)
SW interrupt flag = 1;
Jump to Conditional Address
}

                请帮我解答下,谢谢!

               

  • Hi Pengyuan,

        已经开始深入到HET的编程了啊,进展很快啊!:)

        你提的这个问题很有价值,就是典型的HET工作原理问题。

        搞清楚这个问题,基本上HET上的编程就变得很轻松了。

        而且这个问题的答案其实很简单。

        HET中的代码运行是基于VCLK2的,比如手册中提到PWCNT指令执行一次,需要1个Cycle,那么就是指一个VCLK2 Cycle。

        换句话说,这条指令花掉1/VCLK2的时间。

        一般情况下,HET的代码有一个循环,也就是所谓的Loop,做一次循环的时间是一个Loop clock的时间。

        比如你程序中设置了2us的loop clock,那么,编写HET代码的时候,也要让循环在2us之内完成。

        要注意的是:

        1. 循环一般是以CNT指令开始的。如果循环不足2us,那么CNT指令会自动等待,直到Loop clock来临才加1。

        2. HET不会自动跳回CNT这条指令,用户一定要有自己的跳转指令,确保在循环结束后返回到CNT。

        3. 循环如果超过Loop clock的时间,HET的逻辑就会崩溃,硬件会给出一个特别的中断。这样的设计是绝对不允许的。

         以上是一些需要具备的基础概念。

         说到这里,好像还没解释你的具体问题....

        

        大多数有动作的指令如PWCNT,它的动作都是基于Loop clock的。

        如前所述,每个循环中,(一般来说)每条指令都只会被执行一次,PWCNT也不例外,也就是说,PWCNT每2us被执行一次。

        但是它的动作实在条件满足后的下一个loop clock + HR data的时刻触发的。

        比如,我设置了PWCNT的data为50,hr data为50 (不考虑移位),那么前49个loop中,PWCNT指令都不会触发引脚动作。

        第50个loop中,PWCNT的data条件满足了,那么HET会在 (下一个Loop clock来临的时刻) + (50 * HR clock)的时间处,使对应的引脚电平变化。

        所以你会看到PWCNT的分辨率远高于Loop clock的分辨率。

        希望能够解答你的问题。

        祝你开发顺利~

  • Hi Renton,

              首先非常感谢您的详细讲解,说点题外的,我发现你们TI的工程师都很专业和耐心啊,上次会上的马工也是这个风格,您不会就是吧?呵呵。

               回到这个问题,首先,我所使用的PWCNT并没有用到delay,即hr_lr=1。我要产生27Hz固定频率可调脉宽的波形,我将DJZ的data设为

               0x90AD0在其为0时跳至MOV64,其改变PWCNT的data改变占空度,而这个占空度也是百分率乘以0x90AD0而得到的。而(1/27)/0x90AD0=62.5ns,正

              好就是 VCLK时钟4分频后得到的,即HR clock。但这样却无法解释PWCNT指令2us运行一次的说法啊?

               还是没有弄明白,等待您的回复。

  • Hi Pengyuan,

        那应该就是我吧...过奖了,呵呵。

        能不能把HET的完整代码发过来看看呢?

  • Hi Renton,

     下面是我的代码,你帮我看看。

    void LLD_HETInit(void)
    {
        hetREG->DIR = 0x0000AACAU;                    

    hetREG->DOUT = 0x00000000U;                

    hetREG->PDR = 0x00000000U;              

        hetREG->PULDIS = 0xFFFFFFFFU;              

        hetREG->PSL = 0x00000000U;           

        hetREG->HRSH = 0x00000000U;              

        memcpy((void *)hetRAM, (const void *)HETRAM_U32_Const, sizeof(HETRAM_U32_Const));

        hetREG->PFR = 0x00000503U;              

        hetREG->PRY = 0x00000000U;            

        hetREG->GCR = 0x00010003U;             

    }

    const hetINSTRUCTION_t HETRAM_U32_Const[] =
    {

           /*捕获的部分,无异议*/
            {0x00001640U,0x000FFFFFU,0x00000000U},
            {0x00002A20U,0x00002437U,0x00000000U},
        {0x00003A20U,0x00003537U,0x00000000U},
        {0x00004A20U,0x00004637U,0x00000000U},
           {0x00005A20U,0x00005737U,0x00000000U},

        /*这个不是用来控制电机的请忽略*/
        {0x00006AE0U,0x0000649EU,0x00000000U},
        {0x00007A40U,0x0000A006U,0x00000000U},
        /*我所询问的就是这个PWCNT*/
        {0x00008AE0U,0x0000859EU,0x00000000U},
        /*这个是要在PWM低电平的1/2处做AD采样用的*/
        {0x00009A40U,0x00009006U,0x00000000U},
        /*设定周期的DJZ*/
        {0x00000A40U,0x0000C006U,0x00000000U},
        {0x0000B105U,0x0010649EU,16000},
        {0x00007106U,0x0000A006U,64000},
        {0x0000D107U,0x0010859EU,0x00000000U},
        {0x0000E108U,0x00009006U,0x00000000U},
        {0x00000109U,0x0000C006U,0x00000000U},//0x90AD0
    };

    程序开始时我会hetRAM->Instruction[14].Data = 0x90AD0;将设定周期的DJZ的data值更改

    程序运行时我会 hetRAM->Instruction[12].Data = (U32)(0x90AD0 * LLD_MotorDutyCycle);
                                 hetRAM->Instruction[13].Data = (U32)((hetRAM->Instruction[12].Data >> 1) + 0x48568);

    更改占空度及相对应的PWM低电平1/2处

     

  • 哦,我的意思是HET的汇编程序,不是机器码,这样很难理解啊...

    如果不方便公开,请发到我公司邮箱lebo-ma@ti.com