娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

基于gnu-arm-linux的LPC2220的簡(jiǎn)單工程模板

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

1:源頭

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

編譯和鏈接、映像文件結(jié)構(gòu)、如何初始化、移植標(biāo)準(zhǔn)庫(kù)等這些內(nèi)容的話,這些商業(yè)IDE就顯得隱藏了很多細(xì)節(jié),不利于進(jìn)一步學(xué)習(xí)。基于上述緣由,

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

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

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

初始化LPC2220芯片:

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

        2,設(shè)置ARM芯片各個(gè)模式運(yùn)行時(shí)所需的堆棧空間。本例程中將系統(tǒng)模式的堆棧設(shè)置在LPC2220內(nèi)部RAM的最頂端,即0x40004000。這里是因?yàn)樾酒J(rèn)的運(yùn)行模式就是系

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

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

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

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

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

6:使用標(biāo)準(zhǔn)庫(kù)并實(shí)現(xiàn)printf,用于調(diào)試。

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


3:過程中遇到的困難

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

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

 

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


4:部分例程代碼

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

startup.s

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

@ 文件名  :startup.s

@ 功    能:初始化LPC2220:初始化各種運(yùn)行模式的堆棧空間,各種exception

@           入口。

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

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

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

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

@ 作者    :張連聘

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

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


@define the stack size for each mode

@定義各種運(yùn)行模式堆棧大小

.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        

@引入的外部標(biāo)號(hào)在這聲明

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

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

    .extern  TargetResetInit                  @initialize the target board 目標(biāo)板基本初始化

    .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

@設(shè)置中斷模式堆棧

        MSR     CPSR_c, #0xd2

        LDR     SP, StackIrq

@Build the FIQ stack

@設(shè)置快速中斷模式堆棧

        MSR     CPSR_c, #0xd1

        LDR     SP, StackFiq

@Build the DATAABORT stack

@設(shè)置中止模式堆棧

        MSR     CPSR_c, #0xd7

        LDR     SP, StackAbt

@Build the UDF stack

@設(shè)置未定義模式堆棧

        MSR     CPSR_c, #0xdb

        LDR     SP, StackUnd

@Build the SYS stack

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

        MSR     CPSR_c, #0xdf

        LDR     SP, =StackUsr


        BX     R0

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

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

**功能描述: RESET  復(fù)位入口

**輸 入:    None 

**輸 出 :  None 

**全局變量: None 

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

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

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

ResetInit:

@Initial the extenal bus controller

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


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 目標(biāo)板基本初始化

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

 

/* 分配堆棧空間 */


.bss 

.align 4 

IrqStackSpace:      

  .space   IRQ_STACK_LEGTH * 4  @Stack spaces for Interrupt ReQuest Mode 中斷模式堆棧空間

FiqStackSpace:      

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

AbtStackSpace:      

  .space   ABT_STACK_LEGTH * 4  @Stack spaces for Suspend Mode 中止義模式堆棧空間

UndtStackSpace:

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






.end



main.c

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

* 文件名  :main.c

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

* 作者    :張連聘

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

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


#include    'LPC2220.h'

#include    'uart0.h'

#include    'print.h'

#define LEDCON   (1<<28)                                  

[1] [2]
關(guān)鍵字:LPC2220  工程模板 引用地址:基于gnu-arm-linux的LPC2220的簡(jiǎn)單工程模板

上一篇:android休眠喚醒驅(qū)動(dòng)流程分析
下一篇:Windows CE6.0中斷實(shí)驗(yàn)過程

推薦閱讀最新更新時(shí)間:2025-03-25 10:31

如何創(chuàng)建一個(gè)STM32工程模板
一。開發(fā)環(huán)境和固定庫(kù)版本 二。準(zhǔn)備工作 三。建立工程模板 1. 建立一個(gè)Template的文件夾 2.在Template文件夾下建立下面3個(gè)文件夾 CORE 用來存放核心文件和啟動(dòng)文件, OBJ 是用來存放編譯過程文件以及 hex 文件, STM32F10x_FWLib 文件夾顧名思義用來存放 ST 官方提供的庫(kù)函數(shù)源碼文件。USER 目錄除了用來放工程文件外,還用來存放主函數(shù)文件 main.c,以及其他包括 system_stm32f10x.c 等等。 3. 在STM32F10x_StdPeriph_Lib_V3.5.0LibrariesSTM32F10x_StdPeriph_Driver 下面,將目錄下面的 src
[單片機(jī)]
如何創(chuàng)建一個(gè)STM32<font color='red'>工程模板</font>
Stm32f103c8t6工程模板(內(nèi)部晶振)源碼
雖說內(nèi)部晶振相對(duì)外部晶振誤差較大,但是在大部分情況下不需要太高的精確度,使用內(nèi)部晶振就可以搞定。 單片機(jī)源程序如下: #include config.h Sys_timeTypeDef Systime={0,0,0,0}; u8 once=0; void Init_Systick(void) //滴答定時(shí)器 { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); SysTick_Config(SystemCoreClock / 1000); } void SYS_Init(void) { NVIC_PriorityGro
[單片機(jī)]
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 南江县| 东港市| 包头市| 泽库县| 乌恰县| 瓦房店市| 巴彦淖尔市| 准格尔旗| 遵义县| 乌兰察布市| 德令哈市| 花垣县| 襄汾县| 连州市| 克什克腾旗| 神木县| 河北省| 凤台县| 边坝县| 三河市| 永春县| 湄潭县| 芦山县| 广河县| 大厂| 彰武县| 霸州市| 定兴县| 翁牛特旗| 交城县| 叶城县| 晋宁县| 隆子县| 鄯善县| 屯门区| 阜康市| 重庆市| 乡城县| 阆中市| 金川县| 进贤县|