TI论坛
直播中

王永佳

7年用户 240经验值
私信 关注
[问答]

请问C28x汇编程序右移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寄存器

谢谢

回帖(8)

朱虹博

2018-8-19 07:54:45
关于加亮这句,我认为是写错了,忽视MOVW会自动右移六位。
MOV     *+XAR5[2],#0   意思是把0给到XAR5+2的地址
详见下面的文档C28x Indirect Addressing Modes:
www.ti.com/.../spru430e
举报

王永佳

2018-8-19 08:04:50
引用: Emily1225 发表于 2018-8-19 07:54
关于加亮这句,我认为是写错了,忽视MOVW会自动右移六位。
MOV     *+XAR5[2],#0   意思是把0给到XAR5+2的地址
详见下面的文档C28x Indirect Addressing Modes:

谢谢你。这是源于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 completed
ADC_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         
 
 
 
举报

朱虹博

2018-8-19 08:17:05
引用: 60user144 发表于 2018-8-19 08:04
谢谢你。这是源于TI的例程。但似乎例程在运行上没有什么问题啊?是不是我挪去这个>>也是OK的呢?
源程序这里是用汇编处理ADC采样结果,全段如下。但似乎这种MOVW DP #xx >>6 使用了很多次。有没有可能是通用的呢?谢谢哦
 

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

 
举报

李允麒

2018-8-19 08:32:29
引用: Emily1225 发表于 2018-8-19 08:17
这个问题,论坛里的try也问过我,请你把完整的例程发上来看看,另外也请对您的这部分反汇编进行截图。
我做了一个类似的实验:
 

Forrest说得很好!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分