TI中文支持网
TI专业的中文技术问题搜集分享网站

C28x汇编程序问题:

大家好!

我是DSP产品的新手。最近在看DSP程序例程上有一段语句是这样的:

_ISR_Run: ;(13 cycles to get to here from ISR trigger)
 ;CONTEXT_SAVE
 PUSH AR1H:AR0H ; 32-bit
 PUSH XAR2 ; 32-bit
 PUSH XAR3 ; 32-bit
 PUSH XAR4 ; 32-bit
;—————————————-
 PUSH XT   ; 32-bit
 NOP 
  
 ;———————————————————
 ;———————————————————

  MOVW  DP,#ADCST>>6  ;  我看SPRU里写应当是让DP指向含有ADCST的页,那么右移6位是什么意思呢?
  MOV  AL,@ADCST   ;   

  AND  AL,#0x0004   ; 
  B  ADC_Conv, NEQ  ;

能不能请哪位朋友帮我解释一下高亮部分是什么意思啊? 我查了SPRU513D,没有发现DP寻址方式里有这种 MOVW DP, #xx 再加右移的方式啊?

另外,能不能请帮我看一下下面的语句,我把我的理解加了高亮,能不能请各位帮我看看我是不是理解对了啊?谢谢各位

MOVL    XAR4,#(_dlog)  ;  把变量dlog的地址给XAR4,即把XAR4当指针用

MOV     ACC,*XAR5 ;把XAR5的内容赋给ACC(即把XAR5当指针用)

MOV     *+XAR5[2],#0  ; 把0给XAR5[2],????, XARn也可以当数组用吗?

MOVL    XAR7,*XAR4++  ; 先把XAR4的内容给XAR7,然后XAR4加1。即XAR4当指针用,XAR7不当指针用?

MOV  @ADCTRL2,#0x4100 ; 把0X4100写入ADCTRL2寄存器

 

谢谢

Forrest:

关于加亮这句,我认为是写错了,忽视MOVW会自动右移六位。

MOV     *+XAR5[2],#0   意思是把0给到XAR5+2的地址

详见下面的文档C28x Indirect Addressing Modes:

www.ti.com/…/spru430e

大家好!

我是DSP产品的新手。最近在看DSP程序例程上有一段语句是这样的:

_ISR_Run: ;(13 cycles to get to here from ISR trigger)
 ;CONTEXT_SAVE
 PUSH AR1H:AR0H ; 32-bit
 PUSH XAR2 ; 32-bit
 PUSH XAR3 ; 32-bit
 PUSH XAR4 ; 32-bit
;—————————————-
 PUSH XT   ; 32-bit
 NOP 
  
 ;———————————————————
 ;———————————————————

  MOVW  DP,#ADCST>>6  ;  我看SPRU里写应当是让DP指向含有ADCST的页,那么右移6位是什么意思呢?
  MOV  AL,@ADCST   ;   

  AND  AL,#0x0004   ; 
  B  ADC_Conv, NEQ  ;

能不能请哪位朋友帮我解释一下高亮部分是什么意思啊? 我查了SPRU513D,没有发现DP寻址方式里有这种 MOVW DP, #xx 再加右移的方式啊?

另外,能不能请帮我看一下下面的语句,我把我的理解加了高亮,能不能请各位帮我看看我是不是理解对了啊?谢谢各位

MOVL    XAR4,#(_dlog)  ;  把变量dlog的地址给XAR4,即把XAR4当指针用

MOV     ACC,*XAR5 ;把XAR5的内容赋给ACC(即把XAR5当指针用)

MOV     *+XAR5[2],#0  ; 把0给XAR5[2],????, XARn也可以当数组用吗?

MOVL    XAR7,*XAR4++  ; 先把XAR4的内容给XAR7,然后XAR4加1。即XAR4当指针用,XAR7不当指针用?

MOV  @ADCTRL2,#0x4100 ; 把0X4100写入ADCTRL2寄存器

 

谢谢

violet han:

回复 Forrest:

谢谢你。这是源于TI的例程。但似乎例程在运行上没有什么问题啊?是不是我挪去这个>>也是OK的呢?

源程序这里是用汇编处理ADC采样结果,全段如下。但似乎这种MOVW DP #xx >>6 使用了很多次。有没有可能是通用的呢?谢谢哦

 

_ISR_Run: ;(13 cycles to get to here from ISR trigger) ;CONTEXT_SAVE PUSH AR1H:AR0H ; 32-bit PUSH XAR2 ; 32-bit PUSH XAR3 ; 32-bit PUSH XAR4 ; 32-bit;—————————————- PUSH XT   ; 32-bit NOP     ;———————————————————  MOVW  DP,#ADCST>>6  ; Make sure ADC conversion has completedADC_Conv:          MOV  AL,@ADCST   ; check seq1 busy bit  AND  AL,#0x0004   ; This code may not be needed with proper timing  B  ADC_Conv, NEQ  ; and buffer code that doesn't use the ADC result and         ; runs from the start of the ISR till the completion of ADC conversion

  ADC_NchDRV    3 ; 3 Channel, (i.e. N=3)  

ADC_Reset:  MOVW  DP,#ADCTRL2>>6  ; Reset ADC SEQ  MOV  @ADCTRL2,#0x4100 ; RST_SEQ1=1, SOCA-SEQ1=1

    ; ADC Sample Point Calculation  MOVW  DP,#TBPHS3>>6      MOV  AL,@TBPHS3   ; TBPHS3  ADD  AL,@TBPRD3   ; TBPRD3  LSR  AL,#1    ; ACC = (TBPRD3 + TBPHS3)/2  MOV  @CMPB3, AL   ; CMPB3 = (TBPRD3 + TBPHS3)/2

 ;———————————————————  ; Datalog to store and plot upto four variables in the control flow  MOVW  DP,#dlog_cntr  INC  @dlog_cntr  CMP  @dlog_cntr,#4      B  EXIT_ISR, LT  ; Execute this module 4x slower        MOV  @dlog_cntr,#0  ; Reset loop counter                    DLOG_4CH_update 

EXIT_ISR:

;===================================  MOVW  DP,#PIEACK>>6   ; Acknowledge PIE interrupt Group 3  MOV  @PIEACK,#PIEACK_GROUP3 .endif ; EPWMn_ISR

 .if(ADC_ISR) ; Case where ISR is triggered by ADC   MOVW  DP,#ADCST>>6  MOV  @ADCST,#0x010   ; Clear INT SEQ1 Int flag

  MOVW  DP,#PIEACK>>6   ; Acknowledge PIE interrupt Group 1  MOV  @PIEACK,#PIEACK_GROUP1 .endif ; ADC_ISR

; Restore context & return POP XT;———————————– POP XAR4 POP XAR3 POP XAR2 POP AR1H:AR0H

 IRET         

 

 

 

大家好!

我是DSP产品的新手。最近在看DSP程序例程上有一段语句是这样的:

_ISR_Run: ;(13 cycles to get to here from ISR trigger)
 ;CONTEXT_SAVE
 PUSH AR1H:AR0H ; 32-bit
 PUSH XAR2 ; 32-bit
 PUSH XAR3 ; 32-bit
 PUSH XAR4 ; 32-bit
;—————————————-
 PUSH XT   ; 32-bit
 NOP 
  
 ;———————————————————
 ;———————————————————

  MOVW  DP,#ADCST>>6  ;  我看SPRU里写应当是让DP指向含有ADCST的页,那么右移6位是什么意思呢?
  MOV  AL,@ADCST   ;   

  AND  AL,#0x0004   ; 
  B  ADC_Conv, NEQ  ;

能不能请哪位朋友帮我解释一下高亮部分是什么意思啊? 我查了SPRU513D,没有发现DP寻址方式里有这种 MOVW DP, #xx 再加右移的方式啊?

另外,能不能请帮我看一下下面的语句,我把我的理解加了高亮,能不能请各位帮我看看我是不是理解对了啊?谢谢各位

MOVL    XAR4,#(_dlog)  ;  把变量dlog的地址给XAR4,即把XAR4当指针用

MOV     ACC,*XAR5 ;把XAR5的内容赋给ACC(即把XAR5当指针用)

MOV     *+XAR5[2],#0  ; 把0给XAR5[2],????, XARn也可以当数组用吗?

MOVL    XAR7,*XAR4++  ; 先把XAR4的内容给XAR7,然后XAR4加1。即XAR4当指针用,XAR7不当指针用?

MOV  @ADCTRL2,#0x4100 ; 把0X4100写入ADCTRL2寄存器

 

谢谢

Forrest:

回复 violet han:

这个问题,论坛里的try也问过我,请你把完整的例程发上来看看,另外也请对您的这部分反汇编进行截图。

我做了一个类似的实验:

 

 

大家好!

我是DSP产品的新手。最近在看DSP程序例程上有一段语句是这样的:

_ISR_Run: ;(13 cycles to get to here from ISR trigger)
 ;CONTEXT_SAVE
 PUSH AR1H:AR0H ; 32-bit
 PUSH XAR2 ; 32-bit
 PUSH XAR3 ; 32-bit
 PUSH XAR4 ; 32-bit
;—————————————-
 PUSH XT   ; 32-bit
 NOP 
  
 ;———————————————————
 ;———————————————————

  MOVW  DP,#ADCST>>6  ;  我看SPRU里写应当是让DP指向含有ADCST的页,那么右移6位是什么意思呢?
  MOV  AL,@ADCST   ;   

  AND  AL,#0x0004   ; 
  B  ADC_Conv, NEQ  ;

能不能请哪位朋友帮我解释一下高亮部分是什么意思啊? 我查了SPRU513D,没有发现DP寻址方式里有这种 MOVW DP, #xx 再加右移的方式啊?

另外,能不能请帮我看一下下面的语句,我把我的理解加了高亮,能不能请各位帮我看看我是不是理解对了啊?谢谢各位

MOVL    XAR4,#(_dlog)  ;  把变量dlog的地址给XAR4,即把XAR4当指针用

MOV     ACC,*XAR5 ;把XAR5的内容赋给ACC(即把XAR5当指针用)

MOV     *+XAR5[2],#0  ; 把0给XAR5[2],????, XARn也可以当数组用吗?

MOVL    XAR7,*XAR4++  ; 先把XAR4的内容给XAR7,然后XAR4加1。即XAR4当指针用,XAR7不当指针用?

MOV  @ADCTRL2,#0x4100 ; 把0X4100写入ADCTRL2寄存器

 

谢谢

Troublemaker:

回复 Forrest:

Forrest说得很好!

大家好!

我是DSP产品的新手。最近在看DSP程序例程上有一段语句是这样的:

_ISR_Run: ;(13 cycles to get to here from ISR trigger)
 ;CONTEXT_SAVE
 PUSH AR1H:AR0H ; 32-bit
 PUSH XAR2 ; 32-bit
 PUSH XAR3 ; 32-bit
 PUSH XAR4 ; 32-bit
;—————————————-
 PUSH XT   ; 32-bit
 NOP 
  
 ;———————————————————
 ;———————————————————

  MOVW  DP,#ADCST>>6  ;  我看SPRU里写应当是让DP指向含有ADCST的页,那么右移6位是什么意思呢?
  MOV  AL,@ADCST   ;   

  AND  AL,#0x0004   ; 
  B  ADC_Conv, NEQ  ;

能不能请哪位朋友帮我解释一下高亮部分是什么意思啊? 我查了SPRU513D,没有发现DP寻址方式里有这种 MOVW DP, #xx 再加右移的方式啊?

另外,能不能请帮我看一下下面的语句,我把我的理解加了高亮,能不能请各位帮我看看我是不是理解对了啊?谢谢各位

MOVL    XAR4,#(_dlog)  ;  把变量dlog的地址给XAR4,即把XAR4当指针用

MOV     ACC,*XAR5 ;把XAR5的内容赋给ACC(即把XAR5当指针用)

MOV     *+XAR5[2],#0  ; 把0给XAR5[2],????, XARn也可以当数组用吗?

MOVL    XAR7,*XAR4++  ; 先把XAR4的内容给XAR7,然后XAR4加1。即XAR4当指针用,XAR7不当指针用?

MOV  @ADCTRL2,#0x4100 ; 把0X4100写入ADCTRL2寄存器

 

谢谢

violet han:

回复 Troublemaker:

谢谢你们2位。中断源程序和反汇编截图请见附件.

好像论坛只允许上传一个附件,所以我把两个代码放在一个word文档里了。

另外,能不能请你们告诉我,如何从反汇编中看到相关的DP中这6位是否被移位的信息吗?

谢谢!

 

 

大家好!

我是DSP产品的新手。最近在看DSP程序例程上有一段语句是这样的:

_ISR_Run: ;(13 cycles to get to here from ISR trigger)
 ;CONTEXT_SAVE
 PUSH AR1H:AR0H ; 32-bit
 PUSH XAR2 ; 32-bit
 PUSH XAR3 ; 32-bit
 PUSH XAR4 ; 32-bit
;—————————————-
 PUSH XT   ; 32-bit
 NOP 
  
 ;———————————————————
 ;———————————————————

  MOVW  DP,#ADCST>>6  ;  我看SPRU里写应当是让DP指向含有ADCST的页,那么右移6位是什么意思呢?
  MOV  AL,@ADCST   ;   

  AND  AL,#0x0004   ; 
  B  ADC_Conv, NEQ  ;

能不能请哪位朋友帮我解释一下高亮部分是什么意思啊? 我查了SPRU513D,没有发现DP寻址方式里有这种 MOVW DP, #xx 再加右移的方式啊?

另外,能不能请帮我看一下下面的语句,我把我的理解加了高亮,能不能请各位帮我看看我是不是理解对了啊?谢谢各位

MOVL    XAR4,#(_dlog)  ;  把变量dlog的地址给XAR4,即把XAR4当指针用

MOV     ACC,*XAR5 ;把XAR5的内容赋给ACC(即把XAR5当指针用)

MOV     *+XAR5[2],#0  ; 把0给XAR5[2],????, XARn也可以当数组用吗?

MOVL    XAR7,*XAR4++  ; 先把XAR4的内容给XAR7,然后XAR4加1。即XAR4当指针用,XAR7不当指针用?

MOV  @ADCTRL2,#0x4100 ; 把0X4100写入ADCTRL2寄存器

 

谢谢

violet han:

回复 Forrest:

谢谢你。那么你说的另外一种方式是要如何定义呢?是不是DSP中的外设地址定义都是用.set先预定义的啊?

大家好!

我是DSP产品的新手。最近在看DSP程序例程上有一段语句是这样的:

_ISR_Run: ;(13 cycles to get to here from ISR trigger)
 ;CONTEXT_SAVE
 PUSH AR1H:AR0H ; 32-bit
 PUSH XAR2 ; 32-bit
 PUSH XAR3 ; 32-bit
 PUSH XAR4 ; 32-bit
;—————————————-
 PUSH XT   ; 32-bit
 NOP 
  
 ;———————————————————
 ;———————————————————

  MOVW  DP,#ADCST>>6  ;  我看SPRU里写应当是让DP指向含有ADCST的页,那么右移6位是什么意思呢?
  MOV  AL,@ADCST   ;   

  AND  AL,#0x0004   ; 
  B  ADC_Conv, NEQ  ;

能不能请哪位朋友帮我解释一下高亮部分是什么意思啊? 我查了SPRU513D,没有发现DP寻址方式里有这种 MOVW DP, #xx 再加右移的方式啊?

另外,能不能请帮我看一下下面的语句,我把我的理解加了高亮,能不能请各位帮我看看我是不是理解对了啊?谢谢各位

MOVL    XAR4,#(_dlog)  ;  把变量dlog的地址给XAR4,即把XAR4当指针用

MOV     ACC,*XAR5 ;把XAR5的内容赋给ACC(即把XAR5当指针用)

MOV     *+XAR5[2],#0  ; 把0给XAR5[2],????, XARn也可以当数组用吗?

MOVL    XAR7,*XAR4++  ; 先把XAR4的内容给XAR7,然后XAR4加1。即XAR4当指针用,XAR7不当指针用?

MOV  @ADCTRL2,#0x4100 ; 把0X4100写入ADCTRL2寄存器

 

谢谢

Forrest:

回复 violet han:

各种设置方法都可以用。

另一种就是上面一直谈到的_res_3的设置方法。请看上面的示例。

赞(0)
未经允许不得转载:TI中文支持网 » C28x汇编程序问题:
分享到: 更多 (0)