⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lib_at91.s79

📁 ARM入门的好帮手.包含了从简单到相对较复杂的程序.
💻 S79
📖 第 1 页 / 共 4 页
字号:
        CFI R6 Frame(CFA, -16)
        CFI R5 Frame(CFA, -20)
        CFI R4 Frame(CFA, -24)
        CFI CFA SP+24
   MOV      R4,R0
   MOV      R5,R1
   MOV      R8,R2
   MOV      R7,R3
;   616     u_int pio = 0 ;
;   617     //* Start the Clock of the Timer
;   618     at91_clock_open ( tc_pt->periph_id ) ;
   MOV      R6,R4
   LDRB     R0,[R6, #+8]
   BL       at91_clock_open
;   619 
;   620     pio = 1<<tc_pt->pin_tclk ;
   MOV      R0,#+0x1
   LDRB     R2,[R6, #+11]
   MOV      R1,R0, LSL R2
;   621     //* Enable TIOA pin if requested
;   622     if ( tioa == TRUE )
   CMP      R8,#+0x1
;   623     {
;   624         pio |= 1<<tc_pt->pin_tioa ;
   LDREQB   R2,[R6, #+9]
   ORREQ    R1,R1,R0, LSL R2
;   625     }
;   626     //* Enable TIOB pin if requested
;   627     if ( tiob == TRUE )
   CMP      R7,#+0x1
;   628     {
;   629         pio |= 1<<tc_pt->pin_tiob ;
   LDREQB   R2,[R6, #+10]
   ORREQ    R1,R1,R0, LSL R2
;   630     }
;   631     at91_pio_close ( tc_pt->pio_ctrl, pio ) ;
   LDR      R0,[R6, #+4]
   BL       at91_pio_close
;   632 
;   633     //* Disable the clock and the interrupts
;   634     tc_pt->tc_base->TC_CCR = TC_CLKDIS ;
   MOV      R0,#+0x2
   LDR      R1,[R6, #+0]
   STR      R0,[R1, #+0]
;   635     tc_pt->tc_base->TC_IDR = 0xFFFFFFFF ;
   MVN      R0,#+0x0
   LDR      R1,[R6, #+0]
   STR      R0,[R1, #+40]
;   636     pio = tc_pt->tc_base->TC_SR ;
   LDR      R0,[R6, #+0]
   LDR      R1,[R0, #+32]
;   637 
;   638     //* Set the Mode of the Timer Counter
;   639     tc_pt->tc_base->TC_CMR = mode ;
   STR      R5,[R0, #+4]
;   640 
;   641     //* Enable the clock
;   642     tc_pt->tc_base->TC_CCR = TC_CLKEN ;
   MOV      R0,#+0x1
   LDR      R1,[R6, #+0]
   STR      R0,[R1, #+0]
;   643 //* End
;   644 }
   LDMIA    SP!,{R4-R8,PC}     ;; return
        CFI EndBlock cfiBlock18
;   645 
;   646 //*----------------------------------------------------------------------------
;   647 //* Function Name       : at91_tc_close
;   648 //* Object              : Stop a Timer Counter Channel and disable is clock
;   649 //* Input Parameters    : <tc_pt> = the channel number
;   650 //* Output Parameters   : None
;   651 //* Functions called    : at91_clock_close
;   652 //*----------------------------------------------------------------------------

        RSEG NEARFUNC_A:CODE:NOROOT(2)
        CFI Block cfiBlock19 Using cfiCommon0
        CFI Function at91_tc_close
   CODE32   
;   653 void at91_tc_close ( const TCDesc *tc_pt )
;   654 //* Begin
;   655 {
at91_tc_close:
   STMDB    SP!,{LR}           ;; Push
        CFI RET Frame(CFA, -4)
        CFI CFA SP+4
;   656     //* Disable the clock and interrupts
;   657     tc_pt->tc_base->TC_CCR = TC_CLKDIS ;
   MOV      R1,R0
   MOV      R0,#+0x2
   LDR      R2,[R1, #+0]
   STR      R0,[R2, #+0]
;   658     tc_pt->tc_base->TC_IDR = 0xFFFFFFFF ;
   MVN      R0,#+0x0
   LDR      R2,[R1, #+0]
   STR      R0,[R2, #+40]
;   659 
;   660     //* Stop the Clock of the Timer
;   661     at91_clock_close ( tc_pt->periph_id ) ;
   LDRB     R0,[R1, #+8]
   BL       at91_clock_close
;   662 //* End
;   663 }
   LDMIA    SP!,{PC}           ;; return
        CFI EndBlock cfiBlock19
;   664 
;   665 //*----------------------------------------------------------------------------
;   666 //* Function Name       : at91_tc_get_status
;   667 //* Object              : Read the Status of a Timer Counter Channel
;   668 //* Input Parameters    : <tc_pt> = the channel number
;   669 //* Output Parameters   : the status value
;   670 //* Functions called    : None
;   671 //*----------------------------------------------------------------------------

        RSEG NEARFUNC_A:CODE:NOROOT(2)
        CFI Block cfiBlock20 Using cfiCommon0
        CFI Function at91_tc_get_status
   CODE32   
;   672 u_int at91_tc_get_status ( const TCDesc *tc_pt )
;   673 //* Begin
;   674 {
;   675     //* Return the value of the Status Register
;   676     return ( tc_pt->tc_base->TC_SR ) ;
at91_tc_get_status:
   LDR      R1,[R0, #+0]
   LDR      R0,[R1, #+32]
   MOV      PC,LR              ;; return
        CFI EndBlock cfiBlock20
;   677 
;   678 //* End
;   679 }
;   680 
;   681 //*----------------------------------------------------------------------------
;   682 //* Function Name       : at91_tc_trig_cmd
;   683 //* Object              : Generate a software trigger on a TC channel
;   684 //* Input Parameters    : <tc_pt> = the channel number to trig
;   685 //* Output Parameters   : None
;   686 //* Functions called    : at91_error
;   687 //*----------------------------------------------------------------------------

        RSEG NEARFUNC_A:CODE:NOROOT(2)
        CFI Block cfiBlock21 Using cfiCommon0
        CFI Function at91_tc_trig_cmd
   CODE32   
;   688 void at91_tc_trig_cmd ( const TCDesc *tc_pt, u_int cmd )
;   689 //* Begin
;   690 {
at91_tc_trig_cmd:
   STMDB    SP!,{LR}           ;; Push
        CFI RET Frame(CFA, -4)
        CFI CFA SP+4
;   691     //* Depending on the command
;   692     switch (cmd)
   CMP      R1,#+0x1
   BEQ      ??at91_tc_trig_cmd_0
   CMP      R1,#+0x2
   BEQ      ??at91_tc_trig_cmd_1
;   693     {
;   694         //* Case Channel Trigger
;   695         case TC_TRIG_CHANNEL:
;   696             //* Perform a Software trigger on the corresponding channel
;   697             tc_pt->tc_base->TC_CCR = TC_SWTRG ;
;   698             break ;
;   699 
;   700         //* Case Synchronization Trigger
;   701         case TC_TRIG_BLOCK:
;   702             //* Perform a synchronization trigger
;   703             ((StructTCBlock *) ((u_int)tc_pt->tc_base & 0xF0))->TC_BCR = TC_SYNC ;
;   704             break ;
;   705 
;   706         //* Unkonwn
;   707       //  default :
;   708             //* Run the AT91 Library Error Macro
;   709        //$$$$     at91_error ("__FILE__","__LINE__") ;
;   710     //* End Switch
;   711     }
;   712 //* End
;   713 }
   LDMIA    SP!,{PC}           ;; return
??at91_tc_trig_cmd_0:
   MOV      R1,#+0x4
   LDR      R2,[R0, #+0]
   STR      R1,[R2, #+0]
   LDMIA    SP!,{PC}           ;; return
??at91_tc_trig_cmd_1:
   MOV      R1,#+0x1
   LDR      R2,[R0, #+0]
   AND      R0,R2,#+0xF0
   STR      R1,[R0, #+192]
   LDMIA    SP!,{PC}           ;; return
        CFI EndBlock cfiBlock21
;   714 
;   715 //*----------------------------------------------------------------------------
;   716 //* Function Name       : at91_tc_set_mode
;   717 //* Object              : Update Timer Counter Mode Register with mask
;   718 //* Input Parameters    : <tc_pt> = the channel number
;   719 //*                     : <mask> = bit to modify in the mode register
;   720 //*                     : <data> = set/clear bits in the mode register
;   721 //* Output Parameters   : none
;   722 //* Functions called    : none
;   723 //*----------------------------------------------------------------------------

        RSEG NEARFUNC_A:CODE:NOROOT(2)
        CFI Block cfiBlock22 Using cfiCommon0
        CFI Function at91_tc_set_mode
   CODE32   
;   724 void at91_tc_set_mode ( const TCDesc *tc_pt, u_int mask, u_int data )
;   725 //* Begin
;   726 {
;   727     //* If data is not null
;   728     if (data != 0)
at91_tc_set_mode:
   CMP      R2,#+0x0
   BEQ      ??at91_tc_set_mode_0
;   729         //* Set bits in the Mode Register corresponding to the mask
;   730         tc_pt->tc_base->TC_CMR |= mask ;
   LDR      R2,[R0, #+0]
   LDR      R0,[R2, #+4]
   ORR      R0,R0,R1
   B        ??at91_tc_set_mode_1
;   731     //* Else
;   732     else
;   733         //* Clear bits in the Mode Register corresponding to the mask
;   734         tc_pt->tc_base->TC_CMR &= ~mask ;
??at91_tc_set_mode_0:
   MVN      R1,R1
   LDR      R2,[R0, #+0]
   LDR      R0,[R2, #+4]
   AND      R0,R0,R1
??at91_tc_set_mode_1:
   STR      R0,[R2, #+4]
;   735     //* EndIf
;   736 }
   MOV      PC,LR              ;; return
        CFI EndBlock cfiBlock22
;   737 //* End
;   738 
;   739 //*----------------------------------------------------------------------------
;   740 //* Function Name       : at91_tc_read
;   741 //* Object              : Read all Timer Counter Register
;   742 //* Input Parameters    : <tc_pt> = Channel Descriptor Pointer
;   743 //*                     : <reg> = Destination Register Value Table Pointer
;   744 //* Output Parameters   : None
;   745 //* Functions called    : None
;   746 //*----------------------------------------------------------------------------

        RSEG NEARFUNC_A:CODE:NOROOT(2)
        CFI Block cfiBlock23 Using cfiCommon0
        CFI Function at91_tc_read
   CODE32   
;   747 void at91_tc_read ( const TCDesc *tc_pt, u_int reg[] )
;   748 //* Begin
;   749 {
;   750     reg[RA] = tc_pt->tc_base->TC_RA ;
at91_tc_read:
   MOV      R2,R1
   LDR      R1,[R0, #+0]
   LDR      R3,[R1, #+20]
   STR      R3,[R2, #+0]
;   751     reg[RB] = tc_pt->tc_base->TC_RB ;
   LDR      R1,[R0, #+0]
   LDR      R3,[R1, #+24]
   STR      R3,[R2, #+4]
;   752     reg[RC] = tc_pt->tc_base->TC_RC ;
   LDR      R1,[R0, #+0]
   LDR      R3,[R1, #+28]
   STR      R3,[R2, #+8]
;   753     reg[CV] = tc_pt->tc_base->TC_CV ;
   LDR      R1,[R0, #+0]
   LDR      R0,[R1, #+16]
   STR      R0,[R2, #+12]
;   754 }
   MOV      PC,LR              ;; return
        CFI EndBlock cfiBlock23
;   755 //* End
;   756 
;   757 //*----------------------------------------------------------------------------
;   758 //* Function Name       : at91_tc_write
;   759 //* Object              : Write Timer Counter Register
;   760 //* Input Parameters    : <tc_pt> = Timer Counter Channel Descriptor Pointer
;   761 //*                     : <reg> = Source Register Value Table Pointer
;   762 //* Output Parameters   : None
;   763 //* Functions called    : None
;   764 //*----------------------------------------------------------------------------

        RSEG NEARFUNC_A:CODE:NOROOT(2)
        CFI Block cfiBlock24 Using cfiCommon0
        CFI Function at91_tc_write
   CODE32   
;   765 void at91_tc_write ( const TCDesc *tc_pt, u_int reg[] )
at91_tc_write:
	REQUIRE ??Subroutine2_0
;   766 //* Begin
;   767 {
;   768     //* First Value -> Register A
;   769     tc_pt->tc_base->TC_RA = reg[RA] ;
   MOV      R2,R1
   LDR      R1,[R2, #+0]
   LDR      R3,[R0, #+0]
   STR      R1,[R3, #+20]
;   770     //* Second Value -> Register B
;   771     tc_pt->tc_base->TC_RB = reg[RB] ;
   LDR      R1,[R2, #+4]
   LDR      R3,[R0, #+0]
   STR      R1,[R3, #+24]
;   772     //* Third Value -> Register C
;   773     tc_pt->tc_base->TC_RC = reg[RC] ;
   LDR      R1,[R2, #+8]
        CFI EndBlock cfiBlock24
;   774 }

        RSEG NEARFUNC_A:CODE:NOROOT(2)
        CFI Block cfiBlock25 Using cfiCommon0
        CFI NoFunction
??Subroutine2_0:
   LDR      R2,[R0, #+0]
   STR      R1,[R2, #+28]
   MOV      PC,LR              ;; return
        CFI EndBlock cfiBlock25
;   775 //* End
;   776 //*----------------------------------------------------------------------------
;   777 //* Function Name       : Interrupt Handlig
;   778 //* Output Parameters   : None
;   779 //* Functions called    : None
;   780 //*----------------------------------------------------------------------------
;   781 

        RSEG NEARFUNC_A:CODE:NOROOT(2)
        CFI Block cfiBlock26 Using cfiCommon0
        CFI Function at91_default_fiq_handler
   CODE32   
;   782 void at91_default_fiq_handler  (void)
at91_default_fiq_handler:
??at91_default_fiq_handler_0:
   B        ??at91_default_fiq_handler_0
        CFI EndBlock cfiBlock26
;   783 {
;   784 	for(;;);
;   785 }

        RSEG NEARFUNC_A:CODE:NOROOT(2)
        CFI Block cfiBlock27 Using cfiCommon0
        CFI Function at91_default_irq_handler
   CODE32   
;   786 void  at91_default_irq_handler (void)
at91_default_irq_handler:
??at91_default_irq_handler_0:
   B        ??at91_default_irq_handler_0
        CFI EndBlock cfiBlock27
;   787 {
;   788 	for(;;);
;   789 }
;   790 

        RSEG NEARFUNC_A:CODE:NOROOT(2)
        CFI Block cfiBlock28 Using cfiCommon0
        CFI Function at91_spurious_handler
   CODE32   
;   791 void  at91_spurious_handler (void)
at91_spurious_handler:
??at91_spurious_handler_0:
   B        ??at91_spurious_handler_0
        CFI EndBlock cfiBlock28

        RSEG HUGE_ID:HUGECONST:SORT:NOROOT(2)
`?<Initializer for Pio>`:
	DC32 0FFFF0000H

        RSEG HUGE_ID:HUGECONST:SORT:NOROOT(2)
`?*?HUGE_ID`:

        RSEG INITTAB:CODE:ROOT(2)
?init?tab?HUGE_I:
   DCD      sfe(HUGE_I) - sfb(HUGE_I), sfb(HUGE_I), sfb(HUGE_ID)

        END
;   792 {
;   793 	for(;;);
;   794 }
;   795 
;   796 
; 
;    80 bytes in segment HUGE_C    
;     4 bytes in segment HUGE_I    
;     4 bytes in segment HUGE_ID   
;    12 bytes in segment INITTAB   
; 1 240 bytes in segment NEARFUNC_A
; 
; 1 240 bytes of CODE      memory (+ 12 bytes shared)
;    84 bytes of HUGECONST memory
;     4 bytes of HUGEDATA  memory
;
;Errors: none
;Warnings: 1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -