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.

DSP外围模块程序配置



在DSP 程序中外围模块,都会经历一个配置,也就是初始化。比如说PWMinit();ADCinit();等等。
我想知道这些初始化的函数在给这些模块初始新值后,会不会立即就动作起来呢?
比如说PWM里面设置了周期和计算方式,那在这个初始函数之后,是不是里面的计数器就已经在工作了,在计数了?
谢谢

  • 模块能否启动基本有三个因素:

    1. 是否提供了时钟,由PCLKCR或PCLKCRn决定;

    2. 初始化是否完成,如你提到的这些函数有没有执行;

    3. 模块本身的启动位,比如ADC模块有ADCCTL1寄存器的ADCENABLE位,PWM模块有TBCTL寄存器的CTRMODE位,通常这些位都是对应在模块的控制寄存器里。

    当以上条件都满足,模块就开始工作了,比如ADC开始采样,PWM的计数器开始计数等。

  • 请问,28335里好像没有这个ADCENABLE吧,设置了PWM的CTRMODE,也就是增减的方向了,下一个时钟开始,就开始计算,也就是PWM模块启动起来了,是吗?

  • 是的,PWM一个时钟后开始启动,你可以单步调试看执行完后PWM的counter是否在增加,同样地,对ADC,你也可以单步调试,看什么时候ADCRESULT寄存器的值开始发生改变。F28335的ADC没有这个位,这是以其它系列的芯片举的例,所以,以后的问题请尽量说清楚你的背景:使用哪颗芯片,什么程序,硬件如何等等,信息越详细对分析问题越有帮助。

  • 请问PWM和它的update 何时同步呢?

  • 不很明白你的意思。

    是说CMP的值更新后何时生效吗?这可以在寄存器里设置为计数过零或过周期时完成。

  • 就是说PWM每执行完一个周期后,及时产生另外一个一个周期的PWM,你的回答应该是对的,用CMP比较,当PWM里面的period执行完后,立即更新PWM寄存器,产生另外一个周期的PWM.

  • 一个变量如 a它的后面加了个:n:,即a:n:这个是什么意思?

    谢谢!

  • 不知道你是哪里看到的?有没有更详细的C或C++文件?

    另外,它是在变量定义时呢还是使用时?

    这更像是一个C/C++语言的一个基本问题,建议查看手册找找。

  • 10#,估计他说的是汇编中的Forced Substitution。

    楼主,您可以参考一下下面这份资料,里面有例子:

    www.ti.com/.../spru513d

  • CNTL_2P2Z_INIT .macro n

    ;=============================

    ; allocate memory space for data & terminal pointers

    _CNTL_2P2Z_Ref:n: .usect "CNTL_2P2Z_Section",2,1,1 ; reference input terminal

    _CNTL_2P2Z_Fdbk:n: .usect "CNTL_2P2Z_Section",2,1,1 ; feedback input terminal

    _CNTL_2P2Z_Out:n: .usect "CNTL_2P2Z_Section",2,1,1 ; output terminal

    _CNTL_2P2Z_Coef:n: .usect "CNTL_2P2Z_Section",2,1,1 ; coefficients & saturation limits (14 words)

    _CNTL_2P2Z_DBUFF:n: .usect  "CNTL_2P2Z_Section",10,1,1 ; internal Data BUFF

  • Forrest说得没错,具体可以参考该文档的相关内容。

    附件是CNTL_2P2Z的手册,也可以查看。

    CNTL_2P2Z.pdf
  • 谢谢啊!非常感谢!

  • 这两段程序的区别是什么?谢谢。我也查了手册,但是没有搞懂。

    MOVW DP, #_CNTL_2P2Z_Ref:n:

    MOVL XAR0, @_CNTL_2P2Z_Ref:n:

    我的理解:将CNTL_2P2Z_Ref:n:所在数据页面地址赋给DP,

             将CNTL_2P2Z_Ref:n:所占据存储单元的首地址赋给XAR0

    --------------------------------------------------------

    MOVL XAR0, #_CNTL_2P2Z_Ref:n:

    --------------------------------------------------------

    我的理解:将CNTL_2P2Z_Ref:n:所占据存储单元的首地址赋给XAR0

    不知道对不对,请指点!          

  • MOVL XAR0, @_CNTL_2P2Z_Ref:n:

    是将CNTL_2P2Z_Ref:n:中的的内容给到XAR0

    其他理解的没有错。

  • 你这样说的话,好像和下面的程序不一致啊,后面的程序用了  *XAR0

    MOVW DP, #_CNTL_2P2Z_Ref:n:

    MOVL XAR0, @_CNTL_2P2Z_Ref:n: ; net pointer to Ref (XAR0)

    MOVW DP,#_CNTL_2P2Z_Fdbk:n:

    MOVL    XAR1, @_CNTL_2P2Z_Fdbk:n: ; net pointer to Fdbk (XAR1)

    MOVW DP,#_CNTL_2P2Z_DBUFF:n:

    MOVL XAR4, #_CNTL_2P2Z_DBUFF:n: ; pointer to the DBUFF array (used internally by the module)

                                                                                       ; calculate error (Ref - Fdbk)

    MOVL ACC, *XAR0 ; ACC = Ref (Q24) = Q(24)

    SUBL ACC, *XAR1 ; ACC = Ref(Q24) - Fdbk(Q24)= error(Q24)

    LSL     ACC, #6

  • 你这样说好像不太对吧,因为在下面的程序里你可以看到 XAR0前面加了个 *   这个符号

    MOVW DP, #_CNTL_2P2Z_Ref:n:

    MOVL XAR0, @_CNTL_2P2Z_Ref:n:   ; net pointer to Ref (XAR0)

    MOVW DP,#_CNTL_2P2Z_Fdbk:n:

    MOVL    XAR1, @_CNTL_2P2Z_Fdbk:n:  ; net pointer to Fdbk (XAR1)

    MOVW DP,#_CNTL_2P2Z_DBUFF:n:

    MOVL XAR4, #_CNTL_2P2Z_DBUFF:n: ; pointer to the DBUFF array (used internally by the module)

                                      ; calculate error (Ref - Fdbk)

    MOVL ACC, *XAR0   ; ACC = Ref (Q24) = Q(24)

    SUBL ACC, *XAR1   ; ACC = Ref(Q24) - Fdbk(Q24)= error(Q24)

    LSL     ACC, #6   ; Logical left shift by 6,  Q{24}<<6 -> Q{30}

                                      ;store error in DBUFF

    MOVL *+XAR4[4], ACC   ; e(n) = ACC = error Q{30}

    MOVW DP,#_CNTL_2P2Z_Out:n:

    MOVL    XAR2, @_CNTL_2P2Z_Out:n:   ; net pointer to Out (XAR2)

  • 你这样说好像不太对吧,因为在下面的程序里你可以看到 XAR0前面加了个 *   这个符号

    MOVW DP, #_CNTL_2P2Z_Ref:n:

    MOVL XAR0, @_CNTL_2P2Z_Ref:n:   ; net pointer to Ref (XAR0)

    MOVW DP,#_CNTL_2P2Z_Fdbk:n:

    MOVL    XAR1, @_CNTL_2P2Z_Fdbk:n:  ; net pointer to Fdbk (XAR1)

    MOVW DP,#_CNTL_2P2Z_DBUFF:n:

    MOVL XAR4, #_CNTL_2P2Z_DBUFF:n: ; pointer to the DBUFF array (used internally by the module)

                                      ; calculate error (Ref - Fdbk)

    MOVL ACC, *XAR0   ; ACC = Ref (Q24) = Q(24)

    SUBL ACC, *XAR1   ; ACC = Ref(Q24) - Fdbk(Q24)= error(Q24)

    LSL     ACC, #6   ; Logical left shift by 6,  Q{24}<<6 -> Q{30}

                                      ;store error in DBUFF

    MOVL *+XAR4[4], ACC   ; e(n) = ACC = error Q{30}

    MOVW DP,#_CNTL_2P2Z_Out:n:

    MOVL    XAR2, @_CNTL_2P2Z_Out:n:          ; net pointer to Out (XAR2)

    MOVW DP,#_CNTL_2P2Z_Coef:n:

    MOVL    XAR3, @_CNTL_2P2Z_Coef:n: ;  net pointer to Coef (XAR3)

  • 你这样说好像不太对吧,因为在下面的程序里你可以看到 XAR0前面加了个 *   这个符号

    MOVW DP, #_CNTL_2P2Z_Ref:n:

    MOVL XAR0, @_CNTL_2P2Z_Ref:n:   ; net pointer to Ref (XAR0)

    MOVW DP,#_CNTL_2P2Z_Fdbk:n:

    MOVL          XAR1, @_CNTL_2P2Z_Fdbk:n:  

    MOVW DP,#_CNTL_2P2Z_DBUFF:n:

    MOVL XAR4, #_CNTL_2P2Z_DBUFF:n:

    MOVL ACC, *XAR0   

    SUBL ACC, *XAR1   

    LSL             ACC, #6  

                                      

    MOVL *+XAR4[4], ACC   

    MOVW DP,#_CNTL_2P2Z_Out:n:

    MOVL           XAR2, @_CNTL_2P2Z_Out:n:          

    MOVW DP,#_CNTL_2P2Z_Coef:n:

    MOVL    XAR3, @_CNTL_2P2Z_Coef:n: 

    ZAPA

  • 你这样说好像不太对吧,因为在下面的程序里你可以看到 XAR0前面加了个 *   这个符号

    MOVW DP, #_CNTL_2P2Z_Ref:n:

    MOVL XAR0, @_CNTL_2P2Z_Ref:n:   ; net pointer to Ref (XAR0)

    MOVW DP,#_CNTL_2P2Z_Fdbk:n:

    MOVL    XAR1, @_CNTL_2P2Z_Fdbk:n:  

    MOVW DP,#_CNTL_2P2Z_DBUFF:n:

    MOVL XAR4, #_CNTL_2P2Z_DBUFF:n:                                    

    MOVL ACC, *XAR0   

    SUBL ACC, *XAR1   

    LSL     ACC, #6                                      

    MOVL *+XAR4[4], ACC   

    MOVW DP,#_CNTL_2P2Z_Out:n:

    MOVL    XAR2, @_CNTL_2P2Z_Out:n:          

    MOVW DP,#_CNTL_2P2Z_Coef:n:

    MOVL    XAR3, @_CNTL_2P2Z_Coef:n: 

    ZAPA

  • 汗,才一会没登陆,这里就爆棚了...

    楼主你有做实验试一下吗?

  • 我去帮楼主做了一下测试,楼主看一下:

  • 谢谢,请教下,你用的CCS是4.0版本吗?

  • 一个月前我在用V4的最新版本。

    不过最近一个月我在用V5,V4没有V5稳定,V4是一个过渡性的产品。

    也建议你用V5。

  • MOVL *+XAR4[4], ACC ; e(n) = ACC = error Q{30}

    MOVW DP,#_CNTL_2P2Z_Out:n:
    MOVL XAR2, @_CNTL_2P2Z_Out:n: ; net pointer to Out (XAR2)
    MOVW DP,#_CNTL_2P2Z_Coef:n:
    MOVL XAR3, @_CNTL_2P2Z_Coef:n: ; net pointer to Coef (XAR3)
    ZAPA

    MOV AR0,#8
    MOVL XT, *+XAR4[AR0] ; XT = e(n-2)
    QMPYL P, XT, *XAR3++ ; P = e(n-2) Q30 *B2{Q26} = I8Q24
    MOVDL XT, *+XAR4[6] ; XT = e(n-1), e(n-2) = e(n-1)
    QMPYAL P, XT, *XAR3++ ; P = e(n-1)Q30*B1{Q26} = Q24, ACC=e(n-2)*B2
    MOVDL XT, *+XAR4[4] ; XT = e(n), e(n-1) = e(n)
    QMPYAL P, XT, *XAR3++ ; P = e(n)Q30*B0{Q26}= Q24, ACC = e(n-2)*B2 + e(n-1)*B1
    MOVL XT,*+XAR4[2] ; XT = u(n-2)
    QMPYAL P, XT, *XAR3++ ; P = u(n-2)*A2, ACC = e(n-2)*B2 + e(n-1)*B1 + e(n)*B0
    MOVDL XT,*+XAR4[0] ; XT = u(n-1), u(n-2) = u(n-1)
    QMPYAL P, XT, *XAR3++ ; P = u(n-1)*A1, ACC = e(n-2)*B2 + e(n-1)*B1 + e(n)*B0 + u(n-2)*A2
    ADDL ACC, @P ; ACC = e(n-2)*B2 + e(n-1)*B1 + e(n)*B0 + u(n-2)*A2 + u(n-1)*A1
    只是将ACC赋值到了XR4[4]中, XR4[0],XR4[2],XR4[6],XR4[8],的值是怎么来的,汇编基础较弱,这里看不懂,希望能解答,谢谢了
  • DSP的程序配置还有一个CMD文件。

    CMD是用来分配ROM和RAM空间用的,告诉链接程序怎样计算地址和分配空间。所以不同的芯片就有不同大小的ROM和RAM,
    存放用户程序的地方也不尽相同。所以要根据芯片进行修改,分为MEMORY和SECTIONS两个部分。