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

📄 iar_pm674061_lib.s

📁 最新版IAR FOR ARM(EWARM)5.11中的代码例子
💻 S
📖 第 1 页 / 共 3 页
字号:
        LDR     pc,[r2,r1,LSL #2]
pm_diva_clkgear_Jump_Table
        DCD     pm_diva_clkgear_s_f ; slow -> fast
        DCD     pm_diva_clkgear_f_s ; fast -> slow

;*****************************************************************************
;***  slow -> fast routine ***
pm_diva_clkgear_s_f

#ifdef __ML67Q405x__
;*** reconfigure memory parameter ***
        BL      mempara_set_normal
#endif
  
;*** change DIVA_CLK ***
        LDR     r1,=CLKCNT
        LDR     r2,[r1]         ; get a value of CLKCNT
        AND     r2,r2,#0xffffffe3
        ORR     r2,r2,r0,LSL #2
        STR     r2,[r1]         ; change DIVA_CLK

        B       pm_diva_clkgear_200

;*****************************************************************************
;*** fast -> slow routine ***
pm_diva_clkgear_f_s

;*** change DIVA_CLK ***
        LDR     r1,=CLKCNT
        LDR     r2,[r1]         ; get a velue of CLKCNT
        AND     r2,r2,#0xffffffe3
        ORR     r2,r2,r0,LSL #2
        STR     r2,[r1]         ; change DIVA_CLK

#ifdef  __ML67Q405x__
;*** reconfigure memory parameter ***
        BL      mempara_set_normal
#endif

        B       pm_diva_clkgear_200

;*****************************************************************************
pm_diva_clkgear_200
;*** restore CPSR ***
        LDR     r1,=SAVE_CPSR   ; get SAVE_CPSR
        LDR     r0,[r1]         ; r0 <- SAVE_CPSR
        SWI     SWI_PM_IF_RECOV ; restore CPSR  input parameter:r0 -> CPSR

;*** restore registers ***
        LDMFD   SP!,{r1-r3,lr}  ; restore r1-r3,lr register

;*** set normal end return value(0) ***
        MOV     r0,#0           ; set normal end return value

pm_diva_clkgear_end
        BX      lr             ; return

pm_diva_clkgear_error_end
        ORR     r0,r0,r1        ; set error end return value
        BX      lr             ; return



;************************************************************************
;*                                                                      *
;* change APB_CLK                                                       *
;*   APB_CLK speed : 1/1, 1/2, 1/4                                      *
;*                                                                      *
;* pm_apb_clkgear                                                       *
;*                                                                      *
;* input                                                                *
;*      r0:dividing ratio       0=1/1, 1=1/2, 2=1/4                     *
;*                                                                      *
;*      r1:mode                 0 = slow -> fast                        *
;*                              1 = fast -> slow                        *
;*                                                                      *
;*----------------------------------------------------------------------*
;*                                                                      *
;* C API name   unsigned long pm_apb_clkgear                            *
;*                              (unsigned long Change_apb_clk)          *
;*                                                                      *
;* input        unsigned long Change_apb_clk                            *
;*                              0 = 1/1                                 *
;*                              1 = 1/2                                 *
;*                              2 = 1/4                                 *
;*                                                                      *
;* output       0       : normal end                                    *
;*              non 0   : input parameter error                         *
;*                                                                      *
;*----------------------------------------------------------------------*
;*                                                                      *
;* using registers      r0,r1,r2,r3                                     *
;*                                                                      *
;************************************************************************

        EXPORT  pm_apb_clkgear
pm_apb_clkgear       ; unsigned long pm_apb_clkgear(unsigned long Change_apb_clk)

;*** check input parameter ***
        CMP     r0,#0x2
        BHI     pm_apb_clkgear_error_end   ; error end

;*** save registers ***
        STMFD   SP!,{r1-r3,lr}  ; save r1,r2,lr register

;*** mask IRQ and FIQ. and get pre-masked CPSR ***
        MOV     r2,r0           ; save r0->r2
        SWI     SWI_PM_IF_DIS   ; mask IRQ and FIQ, return value:r0 = pre-masked CPSR

;*** save pre-masked CPSR ***
        LDR     r3,=SAVE_CPSR   ; save CPSR ->SAVE_CPSR
        STR     r0,[r3]
        MOV     r0,r2           ; restore r2->r0

;*** wait ***
        nop                     ; NOP * 2
        nop

;*** change APB_CLK ***
        LDR     r1,=CLKCNT
        LDR     r2,[r1]         ; get a velue of CLKCNT
        AND     r2,r2,#0xfffff3ff
        ORR     r2,r2,r0,LSL #10
        STR     r2,[r1]         ; change APB_CLK

;*** restore CPSR ***
        LDR     r1,=SAVE_CPSR   ; get SAVE_CPSR
        LDR     r0,[r1]         ; r0 <- SAVE_CPSR
        SWI     SWI_PM_IF_RECOV ; restore CPSR  input parameter:r0 -> CPSR

;*** restore registers ***
        LDMFD   SP!,{r1-r3,lr}  ; restore r1,r2,lr register

;*** set normal end return value(0) ***
        MOV     r0,#0           ; set normal end return value

pm_apb_clkgear_end
        BX      lr             ; return

pm_apb_clkgear_error_end
        ORR     r0,r0,r1        ; set error end return value
        BX      lr             ; return


;************************************************************************
;*      Set MASK                                                        *
;*      Function : iptmask_set                                          *
;*                                                                      *
;*      Parameters                                                      *
;*            input     :  r1 = allowed IRQ No.                         *
;*            output    :  nothing                                      *
;*                                                                      *
;*      using registers : r1,r2,r3,r4                                   *
;*                                                                      *
;************************************************************************

iptmask_set1

        STMFD   SP!,{r1-r5}             ; save r1-r5 register
        ADR     r3,ipmask_set_jt1        ; get an address of jump table
        BIC     r4,r2,#0x00000007
        LDR     pc,[r3,r4,LSR #1]       ; branch each process
ipmask_set_jt1                   ; jump table
        DCD     ipmask_set_0_7
        DCD     ipmask_set_8_15
        DCD     ipmask_set_16_23
        DCD     ipmask_set_24_31
ipmask_set_0_7                  ; IRQ0-IRQ7
        LDR     r5,=ILC0        ; get an address of ILC0
        B       iptmask_set_common1
ipmask_set_8_15                 ; IRQ8-IRQ15
        LDR     r5,=ILC1        ; get an address of ILC1
        B       iptmask_set_common1
ipmask_set_16_23                ; IRQ16-IRQ23
ipmask_set_24_31                ; IRQ24-IRQ31
        LDR     r5,=EXILCA      ; get an address of EXILCA
        B       iptmask_set_common1
iptmask_set_common1
        LDR     r4,[r5]         ; get IRQ information

        LDR     r3,=INTMASK_VAL         ; get an IRQ priority data from table
        LDR     r3,[r3,r2,LSL#2]
        ORR     r1,r4,r3
        STR     r1,[r5]                 ; set IRQ priority
        LDMFD   SP!,{r1-r5}             ; restore r1-r4 register
        MOV     pc,lr                  ; return

iptmask_set2

        STMFD   SP!,{r1-r5}             ; save r1-r5 register
        ADR     r3,ipmask_set_jt2        ; get an address of jump table
        BIC     r4,r2,#0x00000007
        LDR     pc,[r3,r4,LSR #1]       ; branch each process
ipmask_set_jt2                   ; jump table
        DCD     ipmask_set_32_39
        DCD     ipmask_set_40_47
        DCD     ipmask_set_48_55
        DCD     ipmask_set_56_63
ipmask_set_32_39                ; IRQ32-IRQ29
ipmask_set_40_47                ; IRQ40-IRQ47
        LDR     r5,=EXILCB      ; get an address of EXILCB
        B       iptmask_set_common2
ipmask_set_48_55                ; IRQ48-IRQ55
ipmask_set_56_63                ; IR56-IRQ63
        LDR     r5,=EXILCC      ; get an address of EXILCC
        B       iptmask_set_common2
iptmask_set_common2
        LDR     r4,[r5]         ; get IRQ information

        LDR     r3,=INTMASK_VAL2         ; get an IRQ priority data from table
        LDR     r3,[r3,r2,LSL#2]
        ORR     r1,r4,r3
        STR     r1,[r5]                 ; set IRQ priority
        LDMFD   SP!,{r1-r5}             ; restore r1-r4 register
        MOV     pc,lr                  ; return


;************************************************************************
;*  Set Memory Parameter (normal speed)                                 *
;*  Function : mempara_set_normal                                       *
;*                                                                      *
;*      Parameters                                                      *
;*            Input  :  r0:Clock Gear No.                               *
;*            Output :  Nothing                                         *
;*                                                                      *
;*      using registers : r0,r1,r2                                      *
;*                                                                      *
;************************************************************************

mempara_set_normal

        STMFD   SP!,{r0-r2}             ; save r0-r2 register

        LDR     r1,=ROMAC_VAL           ; get a setting value of ROMAC from table
        LDR     r1,[r1,r0,LSL#2]
        LDR     r2,=ROMAC               ; set ROMAC
        STR     r1,[r2]

        LDR     r1,=RAMAC_VAL           ; get a setting value of RAMAC from table
        LDR     r1,[r1,r0,LSL#2]
        LDR     r2,=RAMAC               ; set RAMAC
        STR     r1,[r2]

        LDR     r1,=IO0AC_VAL           ; get a setting value of IO0AC from table
        LDR     r1,[r1,r0,LSL#2]
        LDR     r2,=IO0AC               ; set IO0AC
        STR     r1,[r2]

        LDR     r1,=IO1AC_VAL           ; get a setting value of IO1AC from table
        LDR     r1,[r1,r0,LSL#2]
        LDR     r2,=IO1AC               ; set IO1AC
        STR     r1,[r2]

        LDMFD   SP!,{r0-r2}             ; restore r0-r2 register

        MOV     pc,lr                  ; return



;*******************************************************************************
;*******************************************************************************
;*******************************************************************************


        END

⌨️ 快捷键说明

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