国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

基于gnu-arm-linux的LPC2220的簡單工程模板

發(fā)布者:心懷夢想最新更新時間:2024-11-07 來源: cnblogs關鍵字:LPC2220  工程模板 手機看文章 掃描二維碼
隨時隨地手機看文章

1:源頭

我們學習arm嵌入式開發(fā),一般接觸到的是ADS1.2、kei的工程模板,這些模板對初學者入門來說是一種福音,但是想深入了解一下芯片啟動過程、

編譯和鏈接、映像文件結構、如何初始化、移植標準庫等這些內(nèi)容的話,這些商業(yè)IDE就顯得隱藏了很多細節(jié),不利于進一步學習?;谏鲜鼍売?,

我寫了一個基于gnu arm-linux開發(fā)環(huán)境的LPC2220的簡單工程,此工程實現(xiàn)了芯片開機初始化、加載映像到運行映像的轉(zhuǎn)換、ZI段的清零、堆棧

的設置、引導高層C語言函數(shù)、移植標準庫、在高層實現(xiàn)了printf用于調(diào)試。

2:例程實現(xiàn)的功能

初始化LPC2220芯片:

1,實現(xiàn)LPC2220中斷向量表。

        2,設置ARM芯片各個模式運行時所需的堆??臻g。本例程中將系統(tǒng)模式的堆棧設置在LPC2220內(nèi)部RAM的最頂端,即0x40004000。這里是因為芯片默認的運行模式就是系

統(tǒng)模式,也即我們的用戶程序都是在系統(tǒng)模式下運行的。又因為ARM芯片默認是從高地址向低地址使用堆棧,因此將LPC2220內(nèi)部RAM的最頂端設置為系統(tǒng)模式下的堆棧

指針。其他模式的堆棧設置在0x400000000開始的內(nèi)部RAM中。具體怎么實現(xiàn)的,我們下面例程代碼中會講解。

3,初始化目標板,主要設置各種總線時鐘、向量表映射、存儲BANK設置、存儲器加速模塊、實時時鐘等系統(tǒng)控制模塊。

4:將RW段從NorFlash COPY到SDram中,清零ZI段。

5:跳轉(zhuǎn)到main函數(shù)執(zhí)行。

6:使用標準庫并實現(xiàn)printf,用于調(diào)試。

7:利用printf打印全局變量,局部變量內(nèi)容,地址。用來說明全局變量,局部變量以及鏈接器鏈接等相關知識。


3:過程中遇到的困難

第一個是我想使用LPC2220的外部BANK1,我使用的硬件板,BANK1上接的是RAM,一開始程序怎么也調(diào)試不過,以為是鏈接腳本書寫錯誤。但后來發(fā)現(xiàn)是對LPC2220的引腳功能設置的問題。這不是什么知識點,但讓我在這上面浪費了不少時間,特此記錄一下,以安慰我那顆受傷的心。所以,記得一些硬件資源要先看datasheet初始化好后再使用。

第二個是編譯代碼的時候,出現(xiàn)一堆的undefinedreference to `__umoddi3'之類的錯誤,而且我還發(fā)現(xiàn)了只要我代碼里有取整取余等操作時就會報上述錯誤,真是百思不得其解,后來到網(wǎng)上去查資料,得出這個錯誤確實是因為使用了除法導致的。而且,ARM7不支持除法指令,需要軟件進行輔助除法運算,而一般是通過標準庫的形式提供。我們使用ADS1.2,keil等集成IDE開發(fā)程序時,它們自帶的庫里有對除法的支持。而我現(xiàn)在使用的編譯鏈是從網(wǎng)上下載的別人編譯好的arm-linux-gcc3.4.1,可能不支持除法、軟浮點支持。我不知道怎么解決這個問題,所以,干脆我使用了我自己使用源碼編譯的交叉編譯鏈(4.6.0版本的)。我編譯交叉連的時候選擇了除法、軟浮點支持。問題得以解決。具體交叉編譯鏈的制作,參考:制作S3C6410的交叉編譯鏈(arm-linux-gcc4.6.0)。

 

第三個問題是編譯的時候提示undefinedreference to `__exidx_start'        undefined reference to`__exidx_end'等錯誤,而且是當我使用sprintf等相關格式化字符串的時候就提示這些錯誤,我沒有找到合適的解決方案。所以,我參考網(wǎng)絡資源自己實現(xiàn)了簡單的格式化函數(shù)。這不是根本解決之道,我對使用gnu開發(fā)工具鏈進行嵌入式開發(fā)如何使用標準庫函數(shù)也存在很多疑點。


4:部分例程代碼

例程總覽:該工程編譯,鏈接出的映像下載到LPC2220的BANK0(Norflash)中,其地址為0X80000000。運行時,所有的RO段運行在BANK0,RW段和ZI段運行于LPC2220的BANK1(RAM),其地址為0X81000000。裝載地址和運行地址不一致,所以在啟動代碼啟動后,應將RW段COPY到運行時的地址處,將ZI段清零。這些工作都在startup.s中完成,最后startup.s將引導最終的main函數(shù)。

startup.s

@******************************************************************************

@ 文件名  :startup.s

@ 功    能:初始化LPC2220:初始化各種運行模式的堆??臻g,各種exception

@           入口。

@ 說明   :此工程為gcc for arm的工程,書寫此工程啟動代碼目的是學習嵌入式開發(fā)過程中

@          的一些要點知識。gcc for arm 是開源的編譯,鏈接器,可以學習程序開發(fā)的更多

@          細節(jié)。其他商業(yè)開發(fā)工具隱藏太多細節(jié),不利于其初學者學習。

@ 備注    :大家可以根據(jù)工程需要修改其內(nèi)容。   

@ 作者    :張連聘

@ 創(chuàng)建時間:2014-07-27

@******************************************************************************


@define the stack size for each mode

@定義各種運行模式堆棧大小

.equ  FIQ_STACK_LEGTH ,256 

.equ  IRQ_STACK_LEGTH ,9*8 

.equ  ABT_STACK_LEGTH ,256 

.equ  UND_STACK_LEGTH ,256


.equ  NoInt     ,0x80

.equ  NoFIQ     ,0x40

.equ  USR32Mode ,0x10

.equ  SVC32Mode ,0x13

.equ  SYS32Mode ,0x1f

.equ  IRQ32Mode ,0x12

.equ  FIQ32Mode ,0x11


.equ PINSEL2    ,0xE002C014

.equ BCFG0      ,0xFFE00000

.equ BCFG1      ,0xFFE00004

.equ BCFG2      ,0xFFE00008

.equ BCFG3      ,0xFFE0000C

@The imported labels        

@引入的外部標號在這聲明

    .extern  FIQ_Exception                    @Fast interrupt exceptions handler 快速中斷異常處理程序

    .extern  main                             @The entry point to the main function C語言主程序入口 

    .extern  TargetResetInit                  @initialize the target board 目標板基本初始化

    .extern  SoftwareInterrupt

.extern  Copydata

.extern  ClearBssData

.global Reset

.text

@interrupt vectors

@中斷向量表

Reset:

        LDR     PC, ResetAddr

        LDR     PC, UndefinedAddr

        LDR     PC, SWI_Addr

        LDR     PC, PrefetchAddr

        LDR     PC, DataAbortAddr

        .word   0xb9205f80

        LDR     PC, [PC, #-0xff0]

        LDR     PC, FIQ_Addr


ResetAddr:

.word     ResetInit

UndefinedAddr:      

.word     Undefined

SWI_Addr:

.word     SoftwareInterrupt

PrefetchAddr:

.word     PrefetchAbort

DataAbortAddr:  

.word     DataAbort

Nouse:          .word     0

IRQ_Addr:

.word     0

FIQ_Addr:        

.word     FIQ_Handler

@未定義指令

Undefined:

        B       Undefined

      

@取指令中止

PrefetchAbort:

        B       PrefetchAbort


@取數(shù)據(jù)中止

DataAbort:

        B       DataAbort


@快速中斷

FIQ_Handler:

        STMFD   SP!, {R0-R3, LR}

        LDR     PC, =FIQ_Exception

        LDMFD   SP!, {R0-R3, LR}

        SUBS    PC,  LR,  #4


/*********************************************************************************************************

**函數(shù)名稱: InitStack

**功能描述: Initialize the stacks  初始化堆棧

**輸 入:    None 

**輸 出 :  None 

**全局變量: None 

**調(diào)用模塊: None 

********************************************************************************************************/


InitStack:    

        MOV     R0, LR

@Build the SVC stack

@設置中斷模式堆棧

        MSR     CPSR_c, #0xd2

        LDR     SP, StackIrq

@Build the FIQ stack

@設置快速中斷模式堆棧

        MSR     CPSR_c, #0xd1

        LDR     SP, StackFiq

@Build the DATAABORT stack

@設置中止模式堆棧

        MSR     CPSR_c, #0xd7

        LDR     SP, StackAbt

@Build the UDF stack

@設置未定義模式堆棧

        MSR     CPSR_c, #0xdb

        LDR     SP, StackUnd

@Build the SYS stack

@設置系統(tǒng)模式堆棧

        MSR     CPSR_c, #0xdf

        LDR     SP, =StackUsr


        BX     R0

/*********************************************************************************************************

**函數(shù)名稱: ResetInit

**功能描述: RESET  復位入口

**輸 入:    None 

**輸 出 :  None 

**全局變量: None 

**調(diào)用模塊: None 

**-------------------------------------------------------------------------------------------------------

********************************************************************************************************/

ResetInit:

@Initial the extenal bus controller

@初始化外部總線控制器,根據(jù)目標板決定配置


LDR     R0, =PINSEL2

        LDR     R1, =0x0f814914

STR     R1, [R0]

        LDR     R1, =0x0f814914

        LDR     R0, =BCFG0

        LDR     R1, =0x1000ffef

        STR     R1, [R0]


        LDR     R0, =BCFG1

        LDR     R1, =0x1000ffef

        STR     R1, [R0]


        LDR     R0, =BCFG2

        LDR     R1, =0x0000fbef

        STR     R1, [R0]


        LDR     R0, =BCFG3

        LDR     R1, =0x10001460

        STR     R1, [R0]

        

        BL        InitStack               @ Initialize the stack 初始化堆棧

        BL        TargetResetInit         @ Initialize the target board 目標板基本初始化

BL        Copydata

BL        ClearBssData

        B          main                    @ Jump to the entry point of C program 跳轉(zhuǎn)到c語言入口

     

StackIrq:

           .word     IrqStackSpace  +(IRQ_STACK_LEGTH - 1)*4

StackFiq:

           .word     FiqStackSpace  +(FIQ_STACK_LEGTH - 1)*4

StackAbt:  .word     AbtStackSpace  +(ABT_STACK_LEGTH - 1)*4

StackUnd:  .word     UndtStackSpace +(UND_STACK_LEGTH - 1)*4

 

/* 分配堆??臻g */


.bss 

.align 4 

IrqStackSpace:      

  .space   IRQ_STACK_LEGTH * 4  @Stack spaces for Interrupt ReQuest Mode 中斷模式堆??臻g

FiqStackSpace:      

  .space   FIQ_STACK_LEGTH * 4  @Stack spaces for Fast Interrupt reQuest Mode 快速中斷模式堆棧空間

AbtStackSpace:      

  .space   ABT_STACK_LEGTH * 4  @Stack spaces for Suspend Mode 中止義模式堆??臻g

UndtStackSpace:

  .space   UND_STACK_LEGTH * 4  @Stack spaces for Undefined Mode 未定義模式堆棧






.end



main.c

/******************************************************************************

* 文件名  :main.c

* 功    能:初始化系統(tǒng)后,利用P2.28控制led燈閃爍

* 作者    :張連聘

* 創(chuàng)建時間:2014-07-27

*******************************************************************************/


#include    'LPC2220.h'

#include    'uart0.h'

#include    'print.h'

#define LEDCON   (1<<28)                                  

[1] [2]
關鍵字:LPC2220  工程模板 引用地址:基于gnu-arm-linux的LPC2220的簡單工程模板

上一篇:android休眠喚醒驅(qū)動流程分析
下一篇:Windows CE6.0中斷實驗過程

推薦閱讀最新更新時間:2025-06-18 14:11

STM32庫函數(shù)開發(fā)工程模板
看了好多資料,自己也親手寫了好多程序,發(fā)現(xiàn)雖然都是庫函數(shù)開發(fā),但是對于文件的組織是不一樣的,比如有的人喜歡有OBJ,而有的人用LISTING,那么到底怎么樣好,關于文件的組織形式也真是夠讓人頭疼的,總感覺是被別人牽著鼻子走,不像之前學習51單片機或者MSP430單片機,那時候是操作寄存器的,更加的直觀?,F(xiàn)在感覺開發(fā)好困難,單單一個工程模板都搞不定,只能照抄別人的。 我個人覺得使用一下的組織方式還是很不錯的的。 USER FWlib STARTUP MY OBJ 其中USER放主函數(shù),MY放子函數(shù)文件比如LED.C,而在MY文件夾下新建一個inc文件,專門用于存放頭文件,比如一個led.c文件就對應于一個
[單片機]
小廣播
設計資源 培訓 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved