版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、一起學(xué)mini2440裸機(jī)開發(fā)(二)-MDK自帶的S3C2440.s分析上一節(jié),咱們?cè)诮⒐こ痰臅r(shí)候,默認(rèn)的是使用MDK自帶的啟動(dòng)代碼,這些啟動(dòng)代碼到底做了什么工作呢?在這里我想探究一下,探究不全沒什么事,能看懂個(gè)大概就行了。 我先申明一下,其實(shí)我并不是頭一次學(xué)ARM裸機(jī),我先前已經(jīng)按照韋東山的使用arm-linux-gcc在linux下編譯裸機(jī)程序的方法走了一遍了,用那個(gè)方法的話對(duì)以后的uboot移植非常有幫助,但是有一個(gè)不方便的就是,使用Linux系統(tǒng)下編譯裸機(jī)程序,很多自帶的庫(kù)函數(shù)不能用,比如print()函數(shù)我都不能用,主要是我的水平不行,不會(huì)用,其實(shí)可以用的。
2、所以現(xiàn)在想認(rèn)真的再用編譯器學(xué)一下ARM裸機(jī),裸機(jī)學(xué)好了,對(duì)驅(qū)動(dòng)開發(fā)很有幫助的。 所以,很可能我講的可能細(xì)節(jié)上照顧不到?jīng)]接觸過ARM裸機(jī)的,在此深感抱歉。我也只是想把自己的學(xué)習(xí)弄成筆記而已。 言歸正傳,下面進(jìn)行S3C2440.s的分析,初學(xué)者這一節(jié)可以略過。1、首先,了解一下這個(gè)文件都要完成那些功能。 看門狗初始化(可以選擇是否初始化) 時(shí)鐘初始化(可以選擇是否初始化) 存儲(chǔ)控制器初始化(可以選擇是否初始化)
3、; GPIO口初始化(可以選擇是否初始化) 堆棧初始化(沒有選擇性,必須初始化) 跳轉(zhuǎn)到C文件的main函數(shù)執(zhí)行2、其實(shí)知道上面文件做了哪些工作就行了,下面具體分析一下 /*/;/* S3C2440.S: Startup file for Samsung S3C2440
4、0; */;/*/;/*;*啟動(dòng)代碼S3C2440.S是在CPU復(fù)位后執(zhí)行的。這個(gè)文件會(huì)根據(jù)以下的;*SET標(biāo)志來進(jìn)行翻譯執(zhí)行。;*NO_CLOCK_SETUP:啟動(dòng)代碼不初始化時(shí)鐘(這種情況大多出現(xiàn)在時(shí)鐘已經(jīng)在script.ini文件中初始化時(shí));*NO_MC_SETUP:啟動(dòng)代碼不初始化寄存器控制器。;*NO_GP_SETUP:啟動(dòng)代碼不初始化GPIO口;* RAM_INTVEC:啟動(dòng)代碼
5、將異常向量表從執(zhí)行地址處復(fù)制到RAM中去 CPSR中的低8位。I:IRQ中斷禁止位,置位禁止。F:FIQ中斷禁止位,置位禁止。 T:CPU狀態(tài)位(ARM或者THUMB)。M4-M0:工作模式選擇位76543210IFTM4M3M2M1M0 程序狀態(tài)寄存器的格式M4:0工作模式10000用戶模式10001快中斷模式10010中斷模式10011管理模式10111數(shù)據(jù)訪問中止模式11011未定義指令中止模式11111系統(tǒng)模式;狀態(tài)寄存器CPSR中的標(biāo)準(zhǔn)的模式位和中斷位的宏定義Mode_USR EQ
6、U 0x10 用戶模式Mode_FIQ EQU 0x11 快中斷模式Mode_IRQ EQU 0x12 中斷模式Mode_SVC
7、; EQU 0x13 管理模式Mode_ABT EQU 0x17 數(shù)據(jù)訪問中止模式Mode_UND EQU 0x1B 未定義指令中止模式M
8、ode_SYS EQU 0x1F 系統(tǒng)模式I_Bit EQU 0x80 when I bit is set, IRQ is
9、 disabledF_Bit EQU 0x40 when F bit is set, FIQ is disabled;棧(Stack)設(shè)置。不同工作模式的堆棧寄存器sp不一樣。;設(shè)置棧空間UND_Stack_Size EQU 0
10、x00000000 未定義模式SVC_Stack_Size EQU 0x00000008 管理模式棧長(zhǎng)度ABT_Stack_Size EQU 0x00000000 數(shù)據(jù)訪問中止模式棧長(zhǎng)度FIQ_Stack_Size EQU 0x00000000 快中斷模式棧長(zhǎng)度IRQ_Stack_Size EQU
11、; 0x00000080 ;中斷模式棧長(zhǎng)度USR_Stack_Size EQU 0x00000400 用戶模式棧長(zhǎng)度ISR_Stack_Size EQU (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size +
12、0; FIQ_Stack_Size + IRQ_Stack_Size) 所有的堆棧大小進(jìn)行相加,得到總堆棧大小;/*;arm的匯編程序由段組成,段是相對(duì)獨(dú)立的指令或數(shù)據(jù)單位,每個(gè)段由AREA偽指令定義,并定義段的屬性;READWRITE(讀寫)READONLY(只讀)NOINIT(不初始化內(nèi)存單元或?qū)?nèi)存寫0) */
13、; AREA STACK, NOINIT, READWRITE, ALIGN=3 定義棧段,段名為STACK,字節(jié)對(duì)齊方式Stack_Mem SPACE USR_Stack_Size SPACE指令用于分配一塊內(nèi)存單元。這里分別為這兩個(gè)棧分配對(duì)應(yīng)_initial_sp SPACE
14、 ISR_Stack_Size ;長(zhǎng)度的內(nèi)存空間Stack_Top EQU Stack_Mem + ISR_Stack_Size /定義棧開始地址(最大地址,堆棧向下訪問) 堆(heap)配置;堆大小(單位:字節(jié))Heap_Size EQU 0x00000000 系統(tǒng)的堆空間設(shè)定/
15、定義堆空間大小(配合最后的動(dòng)態(tài)內(nèi)存申請(qǐng)使用) AREA HEAP, NOINIT, READWRITE, ALIGN=3 定義堆段,段名:HEAP,不初始化內(nèi)存,可讀寫,字節(jié)對(duì)齊_heap_baseHeap_Mem SPACE Heap_Size
16、0; ;申請(qǐng)堆的內(nèi)存空間_heap_limit;-存儲(chǔ)器設(shè)定 -IRAM_BASE EQU 0x40000000 內(nèi)存基地址;-看門狗定義 -WT_BASE EQU 0x53000000 看門狗
17、寄存器基地址WTCON_OFS EQU 0x00 看門狗控制寄存器 對(duì)應(yīng)基地址的偏移值WTDAT_OFS EQU 0x04
18、; 看門狗數(shù)據(jù)寄存器 對(duì)應(yīng)基地址的偏移值WTCNT_OFS EQU 0x08 看門狗計(jì)數(shù)寄存器 對(duì)應(yīng)基地址的偏移值;看門狗時(shí)鐘設(shè)置WT_SETUP EQU &
19、#160; 1 看門狗設(shè)置WTCON_Val EQU 0x00000000 看門狗控制寄存器相關(guān)WTDAT_Val EQU 0x00008000 看門
20、狗數(shù)據(jù)寄存器相關(guān);- 時(shí)鐘管理定義 -CLOCK_BASE EQU 0x4C000000 時(shí)鐘寄存器基地址LOCKTIME_OFS EQU 0x00 PLL鎖定時(shí)間計(jì)數(shù)器對(duì)應(yīng)基地址的偏
21、移值MPLLCON_OFS EQU 0x04 ; MPLL配置寄存器對(duì)應(yīng)基地址的偏移值UPLLCON_OFS EQU 0x08 ; UPLL配置
22、寄存器對(duì)應(yīng)基地址的偏移值CLKCON_OFS EQU 0x0C 時(shí)鐘控制器對(duì)應(yīng)基地址的偏移值CLKSLOW_OFS EQU 0x10
23、 慢時(shí)鐘控制寄存器對(duì)應(yīng)基地址的偏移值CLKDIVN_OFS EQU 0x14 時(shí)鐘分頻控制器對(duì)應(yīng)基地址的偏移值CAMDIVN_OFS EQU 0x18
24、60; ; 攝像時(shí)鐘分頻控制器對(duì)應(yīng)基地址的偏移值;時(shí)鐘相關(guān)寄存器設(shè)置值的宏定義CLOCK_SETUP EQU 0 ;時(shí)鐘設(shè)置 ;在以后的實(shí)驗(yàn)里,我會(huì)將它設(shè)置為1,這樣做是為了讓系統(tǒng)在運(yùn)行時(shí)就對(duì)時(shí)鐘進(jìn)行初始化LOCKTIME_Va
25、l EQU 0x0FFF0FFF PLL鎖定時(shí)間計(jì)數(shù)器 值MPLLCON_Val EQU 0x00043011 MPLL控制寄存器 值 設(shè)置FCLK=300MHzUPLLCON_Val EQU 0x000380
26、21 ;UPLL控制寄存器 值CLKCON_Val EQU 0x001FFFF0 時(shí)鐘控制器 值CLKSLOW_Val EQU 0x00000004 慢時(shí)鐘控制器 值CLKDIVN_V
27、al EQU 0x0000000F 時(shí)鐘分頻控制器 值 ;設(shè)置分頻比為1:3:6,UCLK=48MHzCAMDIVN_Val EQU 0x00000000 ;攝像時(shí)鐘分頻器 值;- 存儲(chǔ)器控制設(shè)定 -MC_BASE
28、160; EQU 0x48000000 存儲(chǔ)器控制器基地址BWSCON_OFS EQU 0x00 ; 位寬和等待控制寄存器
29、; 偏移值BANKCON0_OFS EQU 0x04 ;BANK0控制寄存器 偏移值BANKCON1_OFS EQU 0x08 ; BANK1控
30、制寄存器 偏移值BANKCON2_OFS EQU 0x0C ; BANK2控制寄存器 偏移值BANKCON3_OFS EQU 0x10
31、; BANK3控制寄存器 偏移值BANKCON4_OFS EQU 0x14 ; BANK4控制寄存器 偏移值BANKCON5_OFS EQU 0x18
32、60; BANK5控制寄存器 偏移值BANKCON6_OFS EQU 0x1C ; BANK6控制寄存器 偏移值BANKCON7_OFS EQU 0x20 &
33、#160; ;BANK7控制寄存器 偏移值REFRESH_OFS EQU 0x24 SDRAM刷新控制寄存器 偏移值BANKSIZE_OFS EQU
34、0; 0x28 ; BANKSIZE寄存器 偏移值MRSRB6_OFS EQU 0x2C ; SDRAM控制寄存器 偏移值MRSRB7_OFS
35、160; EQU 0x30 SDRAM控制寄存器 偏移值;存儲(chǔ)控制器的相應(yīng)的設(shè)置值MC_SETUP EQU 0 ;存儲(chǔ)控
36、制器設(shè)定BWSCON_Val EQU 0x22000000 總線寬度和等待控制器 值BANKCON0_Val EQU 0x00000700 Boor ROM控制器 值BANKCON1_Val EQU 0x00000700
37、 BANK1控制 值BANKCON2_Val EQU 0x00000700 BANK2控制 值BANKCON3_Val EQU 0x00000700 BANK3控制 值BANKCON4_Val EQU 0x00000700
38、BANK4控制 值BANKCON5_Val EQU 0x00000700 BANK5控制 值BANKCON6_Val EQU 0x00018005 BANK6控制 值BANKCON7_Val EQU 0x00018005 BANK7控制
39、; 值REFRESH_Val EQU 0x008404F3 DRAM/SDRAM刷新控制BANKSIZE_Val EQU 0x00000032 存儲(chǔ)器大小控制MRSRB6_Val EQU 0x00000020
40、 ;SDRAM的模式設(shè)置寄存器 控制MRSRB7_Val EQU 0x00000020 SDRAM的模式設(shè)置寄存器 控制;- I/O 口設(shè)定-GPA_BASE EQU 0x56000000
41、60; GPA Base AddressGPB_BASE EQU 0x56000010 GPB Base AddressGPC_BASE EQU 0x56000020 GPC Base Add
42、ressGPD_BASE EQU 0x56000030 ; GPD Base AddressGPE_BASE EQU 0x56000040 GPE Base AddressGPF_BASE
43、160; EQU 0x56000050 ; GPF Base AddressGPG_BASE EQU 0x56000060 GPG Base AddressGPH_BASE
44、0; EQU 0x56000070 ; GPH Base AddressGPJ_BASE EQU 0x560000D0 GPJ Base AddressGPCON_OFS EQU &
45、#160; 0x00 控制寄存器相對(duì)應(yīng)于上面(A-J)基地址的偏移值GPDAT_OFS EQU 0x04 數(shù)據(jù)寄存器相對(duì)應(yīng)于上面(A-J)基地址的偏移值GPUP_OFS
46、 EQU 0x08 上拉控制寄存器相對(duì)應(yīng)于上面(B-J)基地址的偏移值; I/O端口 設(shè)定GP_SETUP EQU 0;端口AGPA_SETUP
47、 EQU 0GPACON_Val EQU 0x000003FF;端口BGPB_SETUP EQU 0GPBCON_Val EQU 0x00000000GPBUP_Val
48、 EQU 0x00000000 端口B上拉開啟;端口CGPC_SETUP EQU 0GPCCON_Val EQU 0x00000000GPCUP_Val EQU
49、; 0x00000000 端口C上拉開啟;端口DGPD_SETUP EQU 0GPDCON_Val EQU 0x00000000GPDUP_Val EQU 0
50、x00000000 端口D上拉開啟;端口EGPE_SETUP EQU 0GPECON_Val EQU 0x00000000GPEUP_Val EQU 0x00000000
51、 端口E上拉開啟;端口FGPF_SETUP EQU 0GPFCON_Val EQU 0x00000000GPFUP_Val EQU 0x00000000 端口F上拉開啟;端
52、口GGPG_SETUP EQU 0GPGCON_Val EQU 0x00000000GPGUP_Val EQU 0x00000000 端口G上拉開啟;端口HGPH_SETUP
53、0; EQU 0GPHCON_Val EQU 0x00000000GPHUP_Val EQU 0x00000000 ;端口H上拉開啟;端口JGPJ_SETUP
54、; EQU 0GPJCON_Val EQU 0x00000000GPJUP_Val EQU 0x00000000 端口J上拉開啟;- 這才是真正的程序開始的地方,前邊都是一些宏定義和準(zhǔn)備工作- &
55、#160; ;匯編程序數(shù)據(jù)8字節(jié)對(duì)齊 PRESERVE8 C和匯編有8位對(duì)齊的要求,這個(gè)偽指令可以滿足此要求 &
56、#160; 段定義和程序入口點(diǎn); 啟動(dòng)代碼必須連接到第一個(gè)地址才能運(yùn)行。在MDK配置選項(xiàng)里邊默認(rèn)的連接就是從這段代碼開始的,別輕易改啊 AREA RESET, CODE, READONLY 定義程序段,段名為RESET,只讀
57、60; ARM ARM模式運(yùn)行程序 IF :LNOT:DEF:_EVAL ;這是要引用咱們的編譯器MDK自動(dòng)生成的兩個(gè)符號(hào)
58、 IMPORT |Image$ER_ROM1$RO$Length| RO段地址,長(zhǎng)度,可以再M(fèi)DK配置選項(xiàng)Linker看到這兩個(gè)的定義 IMPORT |Image$RW_RAM1$R
59、W$Length| RW段地址,長(zhǎng)度 ENDIF; 異常向量表Vectors LDR PC, Reset_Addr 復(fù)位異常, 地址0x0000 0
60、000 LDR PC, Undef_Addr 未定義異常, 地址0x0000 0004/關(guān)于地址,我不確定,因?yàn)榍懊嬲f的是8字節(jié)對(duì)齊,是不是0x0000 0008呢
61、60; LDR PC, SWI_Addr 軟件中斷, 地址0x0000 0008 LD
62、R PC, PAbt_Addr 指令預(yù)取中斷,地址0x0000 000C LDR PC, DAbt_Addr &
63、#160; ;數(shù)據(jù)異常中斷,地址0x0000 0010 IF :DEF:_EVAL 如果定義了_EVAL變量 &
64、#160; DCD 0x4000 DCD常用于分配一塊連續(xù)的內(nèi)存單元,分配2K空間
65、160; ELSE DCD |Image$ER_ROM1$RO$Length|+ 否則分配空間大小為RO輸出區(qū)的字節(jié)長(zhǎng)度與RW輸出區(qū)的字節(jié)長(zhǎng)度之和
66、 |Image$RW_RAM1$RW$Length| ENDIF
67、0; LDR PC, IRQ_Addr 普通中斷 LDR PC, FIQ_Addr
68、160; 快中斷 IF :DEF:_RTX IMPORT SWI_Handler
69、60; IMPORT IRQ_Handler_RTX ENDIFReset_Addr DCD Reset_Handler
70、 Label DCD expr是分配一塊連續(xù)的內(nèi)存單元,并用expr初始化,Label是一個(gè)標(biāo)號(hào),代表的是Undef_Addr DCD Undef_Handler 所分配的內(nèi)存單元的首地址。這里實(shí)際上是將相應(yīng)的異常中斷的處理程序的入口地址賦值給前邊的標(biāo)號(hào)SWI_Addr DCD&
71、#160; SWI_Handler PAbt_Addr DCD PAbt_Handler DAbt_Addr DCD
72、0; DAbt_Handler DCD 0
73、60; Reserved Address IF :DEF:_RTXIRQ_Addr DCD IRQ_Handler_RTX
74、; ELSEIRQ_Addr DCD IRQ_Handler ENDIFFIQ_Addr DCD
75、 FIQ_Handler 將快中斷處理函數(shù)FIQ_Handler的地址賦值給FIQ_AddrUndef_Handler B Undef_Handler IF &
76、#160; :DEF:_RTX ELSESWI_Handler B SWI_Handler EN
77、DIFPAbt_Handler B PAbt_HandlerDAbt_Handler B DAbt_HandlerIRQ_Handler PROC EXPO
78、RT IRQ_Handler WEAK B . &
79、#160; ENDPFIQ_Handler B FIQ_Handler; 復(fù)位異常處理程序,每次復(fù)位后程序都要從此處開始執(zhí)行 EXPORT Reset_Handler 定義一個(gè)全局函數(shù)變量Res
80、et_Handler -;看門狗配置;若WT_SETUP不等于0,執(zhí)行此語(yǔ)句,否則執(zhí)行下一個(gè)語(yǔ)句;前面已經(jīng)定義WT_SETUP=1,所以會(huì)執(zhí)行這一段; - IF WT_SETUP != 0
81、0; LDR R0, =WT_BASE 加載看門狗地址 LDR R1, =WTCON_Val 加載看門狗控制寄存器數(shù)據(jù)
82、60; LDR R2, =WTDAT_Val 加載看門狗數(shù)據(jù)寄存器數(shù)據(jù) STR R2, R0, #WTCNT_
83、OFS 將WTDAT_Val配置給看門狗計(jì)數(shù)寄存器 STR R2, R0, #WTDAT_OFS 將WTDAT_Val配置給看門狗數(shù)據(jù)寄存器 STR
84、 R1, R0, #WTCON_OFS 將WTCON_Val配置給看門狗控制寄存器 ENDIF;-;時(shí)鐘設(shè)置;如果邏輯上沒有定義NO_CLOCK_SETUP并且CLOCK_SETUP!=0,則執(zhí)行下面程序;前面定義CLOCK_SETUP=0,則會(huì)跳過這段程序。;所以咱們以后可以自己設(shè)置時(shí)鐘頻率,我是傾向于自己設(shè)置的,因?yàn)檫@也是一個(gè)知識(shí)點(diǎn),;并且S3
85、C2440的時(shí)鐘配置是一個(gè)很重要的知識(shí)。在這里我猜測(cè),既然沒有時(shí)鐘初始化,那么咱們下載到;SDRAM后,應(yīng)該是以晶振12MHz來工作的,當(dāng)然只是猜測(cè),錯(cuò)了的時(shí)候再改;后面幾個(gè)實(shí)驗(yàn)后,我返回來再說一句,我的猜測(cè)是對(duì)的,系統(tǒng)默認(rèn)的是不對(duì)系統(tǒng)時(shí)鐘進(jìn)行初始化,為了方便,;在以后的實(shí)驗(yàn)中,我都將CLOCK_SETUP修改為1,這樣子我就不用重寫代碼了。;系統(tǒng)初始化之后的結(jié)果就是FCLK=300MHz,HCLK=100MHz,PCLK=50MHz;- &
86、#160; IF (:LNOT:(:DEF:NO_CLOCK_SETUP):LAND:(CLOCK_SETUP != 0)
87、; LDR R0, =CLOCK_BASE 加載時(shí)鐘基地址
88、160; LDR R1, =LOCKTIME_Val 加載PLL鎖定時(shí)間計(jì)數(shù)值
89、0; STR R1, R0, #LOCKTIME_OFS 將PLL鎖定時(shí)間值配置到PLL鎖定時(shí)間計(jì)數(shù)器 MOV R1,
90、160; #CLKDIVN_Val STR R1, R0, #CLKDIVN_OFS
91、 配置時(shí)鐘分頻器 LDR R1, =CAMDIVN_Val
92、160; STR R1, R0, #CAMDIVN_OFS 配置攝像頭分頻控制寄存器 LDR
93、60; R1, =MPLLCON_Val STR R1, R0, #MPLLCON_OFS 配置MPLL配置寄存器
94、0; LDR R1, =UPLLCON_Val STR R1, R0, #UPLLCON_OFS
95、 ;配置UPLL配置寄存器 MOV R1, #CLKSLOW_Val
96、160; STR R1, R0, #CLKSLOW_OFS ;配置慢時(shí)鐘配置寄存器 LDR
97、60; R1, =CLKCON_Val STR R1, R0, #CLKCON_OFS
98、; 配置時(shí)鐘控制寄存器 ENDIF;-;存儲(chǔ)控制器設(shè)置;如果沒有定義NO_MC_SETUP且CLOCK_SETUP!=0,則執(zhí)行下面的程序。;此處前面定義CLOCK_SETUP=0,也就是說這一段又不執(zhí)行,真假的,這是要鬧哪樣?;-
99、; IF (:LNOT:(:DEF:NO_MC_SETUP):LAND:(CLOCK_SETUP != 0) LDR R0, =MC_BASE &
100、#160; ;加載存儲(chǔ)控制器基地址 LDR R1,
101、; =BWSCON_Val STR R1, R0, #BWSCON_OFS
102、;配置總線寬度和等待控制寄存器 LDR R1, =BANKCON0_Val STR
103、R1, R0, #BANKCON0_OFS 配置BANK0控制寄存器 LDR R1, &
104、#160; =BANKCON1_Val STR R1, R0, #BANKCON1_OFS 配置BANK1控制寄存器
105、60; LDR R1, =BANKCON2_Val STR R1, R0, #BANKCON2_OFS
106、60; ;配置BANK2控制寄存器 LDR R1, =BANKCON3_Val
107、60; STR R1, R0, #BANKCON3_OFS 配置BANK3控制寄存器 &
108、#160; LDR R1, =BANKCON4_Val STR R1, R0, #BANKCON4_OFS &
109、#160; 配置BANK4控制寄存器 LDR R1, =BANKCON5_Val
110、60; STR R1, R0, #BANKCON5_OFS 配置BANK5控制寄存器 &
111、#160; LDR R1, =BANKCON6_Val STR R1, R0, #BANKCON6_OFS &
112、#160; 配置BANK6控制寄存器 LDR R1, =BANKCON7_Val
113、60; STR R1, R0, #BANKCON7_OFS 配置BANK7控制寄存器
114、 LDR R1, =REFRESH_Val STR R1, R0, #REFRESH_OFS
115、160; 配置DRAM/SDRAM刷新控制寄存器 MOV R1, #BAN
116、KSIZE_Val STR R1, R0, #BANKSIZE_OFS 配置可調(diào)的Bank大小控制寄存器
117、60; MOV R1, #MRSRB6_Val STR R1, R0, #MRSRB6_OFS&
118、#160; 配置SDRAM模式控制寄存器 MOV R1,
119、60; #MRSRB7_Val STR R1, R0, #MRSRB7_OFS
120、60; 配置SDRAM模式控制寄存器 ENDIF -;I/O端口配置;如果沒有定義NO
121、_GP_SETUP且GP_SETUP!=0,則執(zhí)行下面的程序;好吧,前邊定義了GP_SETUP=0,我現(xiàn)在想知道,他到底執(zhí)行什么?代碼是我直接復(fù)制過來的,;為什么我看到有的人的代碼都定義為1呢?淡定,接著分析;-
122、160; IF (:LNOT:(:DEF:NO_GP_SETUP):LAND:(GP_SETUP != 0)
123、 IF GPA_SETUP != 0 LDR R0, =GPA_BASE
124、 配置端口A LDR R1, =GPACON_Val A口有25個(gè)口,做I/O時(shí)只能做輸出口,不能做輸入口
125、60; STR R1, R0, #GPCON_OFS ENDIF
126、0; IF GPB_SETUP != 0 LDR R0, =GPB_BASE
127、0; ;配置端口B LDR R1, =GPBCON_Val STR R1, R0, #GPCON_OFS
128、160; LDR R1, =GPBUP_Val STR R1, R0, #GPUP_OFS
129、60; ENDIF IF GPC_SETUP != 0 LDR
130、; R0, =GPC_BASE 配置端口C LDR R1, =GPCCON_Val
131、160; STR R1, R0, #GPCON_OFS LDR R1, =GPCUP_Val
132、160; STR R1, R0, #GPUP_OFS ENDIF IF &
133、#160; GPD_SETUP != 0 LDR R0, =GPD_BASE
134、0; 配置端口D功能 LDR R1, =GPDCON_Val STR R1, R0, #GPCON_OFS
135、160; LDR R1, =GPDUP_Val STR R1, R0, #GPUP_OFS
136、60; ENDIF IF GPE_SETUP != 0 LDR
137、; R0, =GPE_BASE 配置端口E LDR R1, =GPECON_Val
138、160; STR R1, R0, #GPCON_OFS LDR R1, =GPEUP_Val
139、160; STR R1, R0, #GPUP_OFS ENDIF IF &
140、#160; GPF_SETUP != 0 LDR R0, =GPF_BASE ;配置端口F
141、60; LDR R1, =GPFCON_Val STR R1, R0, #GPCON_OFS
142、160; LDR R1, =GPFUP_Val STR R1, R0, #GPUP_OFS ENDIF IF GPG_SETUP != 0
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024補(bǔ)償貿(mào)易的購(gòu)銷合同范文
- 企業(yè)與個(gè)人租車合同格式
- 家庭日常清潔委托合同大全
- 國(guó)際工程分包勞務(wù)合同
- 2024北京市房屋租賃合同自行成交
- 2024工廠車間承包合同范文
- 保管協(xié)議范文
- 平面廣告設(shè)計(jì)委托協(xié)議書
- 2024室內(nèi)裝修合同新
- 股份買賣合同樣本
- YY∕T 1782-2021 骨科外固定支架力學(xué)性能測(cè)試方法(高清最新版)
- 西亞教學(xué)設(shè)計(jì)與反思
- 乙酸乙酯的反應(yīng)器設(shè)計(jì)流程圖
- EM277的DP通訊使用詳解
- 耐壓絕緣測(cè)試報(bào)告
- 野獸派 beast 花店 調(diào)研 設(shè)計(jì)-文檔資料
- 水泵房每日巡視檢查表
- 杭州市區(qū)汽車客運(yùn)站臨時(shí)加班管理規(guī)定
- 墊片沖壓模具設(shè)計(jì)畢業(yè)設(shè)計(jì)論文
- 冷庫(kù)工程特點(diǎn)施工難點(diǎn)分析及對(duì)策
- Python-Django開發(fā)實(shí)戰(zhàn)
評(píng)論
0/150
提交評(píng)論