突破渴望

飞思卡尔dsc mc56f8366 温度传感器例程

0
阅读(2946)

飞思卡尔dsc mc56f8366 温度传感器例程

发表一个初始化的ASM程序,希望对大家有用


; -------------------------------------------------------
;
;       56F83x_init.asm
;
; Metrowerks, a Freescale Company
; sample code
;
; description:  main entry point to C code.
;                     setup runtime for C and call main
;
; -------------------------------------------------------

;===============================
; OMR mode bits
;===============================
NL_MODE                                                          EQU  $8000
CM_MODE                                                          EQU  $0100
XP_MODE                                                          EQU  $0080
R_MODE                                                           EQU  $0020
SA_MODE                                                          EQU  $0010
;===============================
; init
;===============================
        section startup
        XREF  F_stack_addr
        XREF  F_xROM_to_xRAM
        XREF  F_pROM_to_xRAM
        XREF  F_Ldata_size
        XREF  F_Ldata_ROM_addr
        XREF  F_Ldata_RAM_addr
        org   p:

        GLOBAL Finit_56800_
        SUBROUTINE "Finit_56800_",Finit_56800_,Finit_56800_END-Finit_56800_
Finit_56800_:
;
; setup the OMr with the values required by C
;
        bfset #NL_MODE,omr    ; ensure NL=1  (enables nsted DO loops)
        nop
        nop
        bfclr #(CM_MODE|XP_MODE|R_MODE|SA_MODE),omr               ; ensure CM=0  (optional for C)
                                                                  ; ensure XP=0 to enable harvard architecture
                                                                  ; ensure R=0  (required for C)
                                                                  ; ensure SA=0 (required for C)

; setup the m01 register for linear addressing
        move.w  #-1,x0
        moveu.w x0,m01                  ; set the m register to linear addressing
        moveu.w hws,la                  ; clear the hardware stack
        moveu.w hws,la
        nop
        nop

CALLMAIN:                               ; initialize compiler environment
                                        ; initialize the Stack
        move.l  #>>F_Lstack_addr,r0
        bftsth  #$0001,r0
        bcc     noinc
        adda    #1,r0
noinc:
        tfra    r0,sp                   ; set stack pointer too
        move.w  #0,r1
        nop
        move.w  r1,x:(sp)               ; put zero at top of stack
        adda    #1,sp                   ; increment stack
        move.w  r1,x:(sp)               ; put another zero

; Stationery default routine
; 56800E LC register doesn't have 8191 element limitation of 56800
; so we can use hardware loop here
; zeroBSS hardware loop utility
        move.l  #>>F_Xbss_length,r2     ; move count
        move.l  #>>F_Xbss_start_addr,r1 ; start address is BSS start
        move.w  #0,x0                   ; zero value
        nop
        do      r2,>>end_zeroBSS        ; copy for r2 times
        nop
        move.w  x0,x:(r1)+              ; stash value at x address r1
end_zeroBSS:

; xROM-to-xRAM utility
        nop
        move.w  #F_xROM_to_xRAM,r0      ; check for the option
        tst.w   r0
        beq     end_xrom2xram           ; if no xROM-to-xRAM, then exit
        nop
        move.l  #>>F_Ldata_size,r2      ; set data size
        move.l  #>>F_Ldata_ROM_addr,r3  ; src address -- xROM data start
        move.l  #>>F_Ldata_RAM_addr,r1  ; dest address -- xRAM data start
        do      r2,>>end_xrom2xram      ; copy for r2 times
        move.w  x:(r3)+,x0              ; fetch value at address r3
        nop
        nop
        nop
        move.w  x0,x:(r1)+              ; stash value at address r1
end_xrom2xram:

; pROM-to-xRAM utility
        nop
        move.w  #F_pROM_to_xRAM,r0      ; check for the option
        tst.w   r0
        beq     end_prom2xram           ; if no pROM-to-xRAM, then exit
        nop
        move.l  #>>F_Ldata_size,r2      ; set data size
        move.l  #>>F_Ldata_ROM_addr,r3  ; src address -- pROM data start
        move.l  #>>F_Ldata_RAM_addr,r1  ; dest address -- xRAM data start
        do      r2,>>end_prom2xram      ; copy for r2 times
        move.w  p:(r3)+,x0              ; fetch value at address r3
        nop
        nop
        nop
        move.w  x0,x:(r1)+              ; stash value at address r1
end_prom2xram:

; call main()
        move.w  #0,y0                   ; pass parameters to main()
        move.w  #0,R2
        move.w  #0,R3
        jsr     Fmain                   ; call the user program
loop_at_end_of_app:
        debughlt
        bra    loop_at_end_of_app
Finit_56800_END:
        endsec