?? sysinit.s
字號:
///////////////////////////////////////////////////////////////////////////////
// /
// IAR ANSI C/C++ Compiler V6.40.1.53790/W32 for ARM 09/Aug/2012 10:07:33 /
// Copyright 1999-2012 IAR Systems AB. /
// /
// Cpu mode = thumb /
// Endian = little /
// Source file = C:\Users\305030973\Desktop\M4 /
// example\01_light\src\Sources\C\Frame_C\sysinit.c /
// Command line = "C:\Users\305030973\Desktop\M4 /
// example\01_light\src\Sources\C\Frame_C\sysinit.c" -D /
// IAR -D TWR_K60N512 -lCN "C:\Users\305030973\Desktop\M4 /
// example\01_light\bin\Flash\List\" -lB /
// "C:\Users\305030973\Desktop\M4 /
// example\01_light\bin\Flash\List\" -o /
// "C:\Users\305030973\Desktop\M4 /
// example\01_light\bin\Flash\Obj\" --no_cse --no_unroll /
// --no_inline --no_code_motion --no_tbaa --no_clustering /
// --no_scheduling --debug --endian=little /
// --cpu=Cortex-M4 -e --fpu=None --dlib_config /
// "C:\Program Files\IAR Systems\Embedded Workbench /
// 6.4_2\arm\INC\c\DLib_Config_Normal.h" -I /
// "C:\Users\305030973\Desktop\M4 /
// example\01_light\src\Sources\H\" -I /
// "C:\Users\305030973\Desktop\M4 /
// example\01_light\src\Sources\H\Component_H\" -I /
// "C:\Users\305030973\Desktop\M4 /
// example\01_light\src\Sources\H\Frame_H\" -I /
// "C:\Program Files\IAR Systems\Embedded Workbench /
// 6.4_2\arm\INC\" -I "C:\Program Files\IAR /
// Systems\Embedded Workbench 6.4_2\arm\INC\CLIB\" -Ol /
// --use_c++_inline /
// List file = C:\Users\305030973\Desktop\M4 /
// example\01_light\bin\Flash\List\sysinit.s /
// /
// /
///////////////////////////////////////////////////////////////////////////////
NAME sysinit
#define SHT_PROGBITS 0x1
#define SHF_WRITE 0x1
#define SHF_EXECINSTR 0x4
PUBLIC core_clk_khz
PUBLIC core_clk_mhz
PUBLIC fb_clk_init
PUBLIC periph_clk_khz
PUBLIC pll_init
PUBLIC set_sys_dividers
PUBLIC sysinit
PUBLIC trace_clk_init
// C:\Users\305030973\Desktop\M4 example\01_light\src\Sources\C\Frame_C\sysinit.c
// 1 //-------------------------------------------------------------------------*
// 2 // 文件名:sysinit.c *
// 3 // 說 明: 系統配置文件 *
// 4 //-------------------------------------------------------------------------*
// 5
// 6 #include "sysinit.h" //頭文件
// 7
// 8 //全局變量聲明
SECTION `.bss`:DATA:REORDER:NOROOT(2)
// 9 int core_clk_khz;
core_clk_khz:
DS8 4
SECTION `.bss`:DATA:REORDER:NOROOT(2)
// 10 int core_clk_mhz;
core_clk_mhz:
DS8 4
SECTION `.bss`:DATA:REORDER:NOROOT(2)
// 11 int periph_clk_khz;
periph_clk_khz:
DS8 4
// 12
// 13 //-------------------------------------------------------------------------*
// 14 //函數名: sysinit *
// 15 //功 能: 系統設置 *
// 16 //參 數: 無 *
// 17 //返 回: 無 *
// 18 //說 明: 無 *
// 19 //-------------------------------------------------------------------------*
SECTION `.text`:CODE:NOROOT(1)
THUMB
// 20 void sysinit (void)
// 21 {
sysinit:
PUSH {R7,LR}
// 22 //使能IO端口時鐘
// 23 SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK
// 24 | SIM_SCGC5_PORTB_MASK
// 25 | SIM_SCGC5_PORTC_MASK
// 26 | SIM_SCGC5_PORTD_MASK
// 27 | SIM_SCGC5_PORTE_MASK );
LDR.N R0,??DataTable3 ;; 0x40048038
LDR R0,[R0, #+0]
ORRS R0,R0,#0x3E00
LDR.N R1,??DataTable3 ;; 0x40048038
STR R0,[R1, #+0]
// 28
// 29 //開啟系統時鐘
// 30 core_clk_mhz = pll_init(CORE_CLK_MHZ, REF_CLK);
MOVS R1,#+3
MOVS R0,#+2
BL pll_init
LDR.N R1,??DataTable3_1
STR R0,[R1, #+0]
// 31 //通過pll_init函數的返回值來計算內核時鐘和外設時鐘
// 32 core_clk_khz = core_clk_mhz * 1000;
LDR.N R0,??DataTable3_1
LDR R0,[R0, #+0]
MOV R1,#+1000
MULS R0,R1,R0
LDR.N R1,??DataTable3_2
STR R0,[R1, #+0]
// 33 periph_clk_khz = core_clk_khz / (((SIM_CLKDIV1 & SIM_CLKDIV1_OUTDIV2_MASK) >> 24)+ 1);
LDR.N R0,??DataTable3_2
LDR R0,[R0, #+0]
LDR.N R1,??DataTable3_3 ;; 0x40048044
LDR R1,[R1, #+0]
UBFX R1,R1,#+24,#+4
ADDS R1,R1,#+1
UDIV R0,R0,R1
LDR.N R1,??DataTable3_4
STR R0,[R1, #+0]
// 34 //使能跟蹤時鐘,用于調試
// 35 trace_clk_init();
BL trace_clk_init
// 36 //FlexBus時鐘初始化
// 37 fb_clk_init();
BL fb_clk_init
// 38
// 39 }
POP {R0,PC} ;; return
// 40
// 41 //-------------------------------------------------------------------------*
// 42 //函數名: trace_clk_init *
// 43 //功 能: 跟蹤時鐘初始化 *
// 44 //參 數: 無 *
// 45 //返 回: 無 *
// 46 //說 明: 用于調試 *
// 47 //-------------------------------------------------------------------------*
SECTION `.text`:CODE:NOROOT(1)
THUMB
// 48 void trace_clk_init(void)
// 49 {
// 50 //設置跟蹤時鐘為內核時鐘
// 51 SIM_SOPT2 |= SIM_SOPT2_TRACECLKSEL_MASK;
trace_clk_init:
LDR.N R0,??DataTable3_5 ;; 0x40048004
LDR R0,[R0, #+0]
ORRS R0,R0,#0x1000
LDR.N R1,??DataTable3_5 ;; 0x40048004
STR R0,[R1, #+0]
// 52 //在PTA6引腳上使能TRACE_CLKOU功能
// 53 PORTA_PCR6 = ( PORT_PCR_MUX(0x7));
LDR.N R0,??DataTable3_6 ;; 0x40049018
MOV R1,#+1792
STR R1,[R0, #+0]
// 54 }
BX LR ;; return
// 55
// 56 //-------------------------------------------------------------------------*
// 57 //函數名: fb_clk_init *
// 58 //功 能: FlexBus時鐘初始化 *
// 59 //參 數: 無 *
// 60 //返 回: 無 *
// 61 //說 明: *
// 62 //-------------------------------------------------------------------------*
SECTION `.text`:CODE:NOROOT(1)
THUMB
// 63 void fb_clk_init(void)
// 64 {
// 65 //使能FlexBus模塊時鐘
// 66 SIM_SCGC7 |= SIM_SCGC7_FLEXBUS_MASK;
fb_clk_init:
LDR.N R0,??DataTable3_7 ;; 0x40048040
LDR R0,[R0, #+0]
ORRS R0,R0,#0x1
LDR.N R1,??DataTable3_7 ;; 0x40048040
STR R0,[R1, #+0]
// 67 //在PTA6引腳上使能FB_CLKOUT功能
// 68 PORTC_PCR3 = ( PORT_PCR_MUX(0x5));
LDR.N R0,??DataTable3_8 ;; 0x4004b00c
MOV R1,#+1280
STR R1,[R0, #+0]
// 69 }
BX LR ;; return
// 70
// 71 //-------------------------------------------------------------------------*
// 72 //函數名: pll_init *
// 73 //功 能: pll初始化 *
// 74 //參 數: clk_option:時鐘選項 *
// 75 // crystal_val:時鐘值 *
// 76 //返 回: 時鐘頻率值 *
// 77 //說 明: *
// 78 //-------------------------------------------------------------------------*
SECTION `.text`:CODE:NOROOT(1)
THUMB
// 79 unsigned char pll_init(unsigned char clk_option, unsigned char crystal_val)
// 80 {
pll_init:
PUSH {R7,LR}
MOVS R2,R1
// 81 unsigned char pll_freq;
// 82
// 83 if (clk_option > 3) {return 0;} //如果沒有選擇可用的選項則返回0
UXTB R0,R0 ;; ZeroExt R0,R0,#+24,#+24
CMP R0,#+4
BCC.N ??pll_init_0
MOVS R0,#+0
B.N ??pll_init_1
// 84 if (crystal_val > 15) {return 1;} // 如果如果可用的晶體選項不可用則返回1
??pll_init_0:
UXTB R2,R2 ;; ZeroExt R2,R2,#+24,#+24
CMP R2,#+16
BCC.N ??pll_init_2
MOVS R0,#+1
B.N ??pll_init_1
// 85
// 86 //這里處在默認的FEI模式
// 87 //首先移動到FBE模式
// 88 #if (defined(K60_CLK) || defined(ASB817))
// 89 MCG_C2 = 0;
??pll_init_2:
LDR.N R2,??DataTable3_9 ;; 0x40064001
MOVS R3,#+0
STRB R3,[R2, #+0]
// 90 #else
// 91 //使能外部晶振
// 92 MCG_C2 = MCG_C2_RANGE(2) | MCG_C2_HGO_MASK | MCG_C2_EREFS_MASK;
// 93 #endif
// 94
// 95 //初始化晶振后釋放鎖定狀態的振蕩器和GPIO
// 96 SIM_SCGC4 |= SIM_SCGC4_LLWU_MASK;
LDR.N R2,??DataTable3_10 ;; 0x40048034
LDR R2,[R2, #+0]
ORRS R2,R2,#0x10000000
LDR.N R3,??DataTable3_10 ;; 0x40048034
STR R2,[R3, #+0]
// 97 LLWU_CS |= LLWU_CS_ACKISO_MASK;
LDR.N R2,??DataTable3_11 ;; 0x4007c008
LDRB R2,[R2, #+0]
ORRS R2,R2,#0x80
LDR.N R3,??DataTable3_11 ;; 0x4007c008
STRB R2,[R3, #+0]
// 98
// 99 //選擇外部晶振,參考分頻器,清IREFS來啟動外部晶振
// 100 MCG_C1 = MCG_C1_CLKS(2) | MCG_C1_FRDIV(3);
LDR.N R2,??DataTable3_12 ;; 0x40064000
MOVS R3,#+152
STRB R3,[R2, #+0]
// 101
// 102 //等待晶振穩定
// 103 #if (!defined(K60_CLK) && !defined(ASB817))
// 104 while (!(MCG_S & MCG_S_OSCINIT_MASK)){};
// 105 #endif
// 106
// 107 //等待參考時鐘狀態位清零
// 108 while (MCG_S & MCG_S_IREFST_MASK){};
??pll_init_3:
LDR.N R2,??DataTable3_13 ;; 0x40064006
LDRB R2,[R2, #+0]
LSLS R2,R2,#+27
BMI.N ??pll_init_3
// 109 //等待時鐘狀態位顯示時鐘源來自外部參考時鐘
// 110 while (((MCG_S & MCG_S_CLKST_MASK) >> MCG_S_CLKST_SHIFT) != 0x2){};
??pll_init_4:
LDR.N R2,??DataTable3_13 ;; 0x40064006
LDRB R2,[R2, #+0]
UBFX R2,R2,#+2,#+2
UXTB R2,R2 ;; ZeroExt R2,R2,#+24,#+24
CMP R2,#+2
BNE.N ??pll_init_4
// 111
// 112 //進入FBE模式
// 113 #if (defined(K60_CLK))
// 114 MCG_C5 = MCG_C5_PRDIV(0x18);
LDR.N R2,??DataTable3_14 ;; 0x40064004
MOVS R3,#+24
STRB R3,[R2, #+0]
// 115 #else
// 116
// 117 //配置PLL分頻器來匹配所用的晶振
// 118 MCG_C5 = MCG_C5_PRDIV(crystal_val);
// 119 #endif
// 120
// 121 //確保MCG_C6處于復位狀態,禁止LOLIE、PLL、和時鐘控制器,清PLL VCO分頻器
// 122 MCG_C6 = 0x0;
LDR.N R2,??DataTable3_15 ;; 0x40064005
MOVS R3,#+0
STRB R3,[R2, #+0]
// 123 //選擇PLL VCO分頻器,系統時鐘分頻器取決于時鐘選項
// 124 switch (clk_option) {
UXTB R0,R0 ;; ZeroExt R0,R0,#+24,#+24
CMP R0,#+0
BEQ.N ??pll_init_5
CMP R0,#+2
BEQ.N ??pll_init_6
BCC.N ??pll_init_7
CMP R0,#+3
BEQ.N ??pll_init_8
B.N ??pll_init_9
// 125 case 0:
// 126 //設置系統分頻器
// 127 //MCG=PLL, core = MCG, bus = MCG, FlexBus = MCG, Flash clock= MCG/2
// 128 set_sys_dividers(0,0,0,1);
??pll_init_5:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -