<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 對ARM7 LPC2210的Bootloader源碼分析

          對ARM7 LPC2210的Bootloader源碼分析

          作者: 時(shí)間:2016-11-10 來源:網(wǎng)絡(luò) 收藏
          對周立功公司開發(fā)板EasyARM LPC2210開發(fā)板Chenmingji寫的Bootlaoder進(jìn)行分析和解讀。

          一、變(常)量聲明
          首先聲明堆棧大小
          ;define the stack size
          ;定義堆棧的大小
          SVC_STACK_LEGTH EQU 0
          FIQ_STACK_LEGTH EQU 0
          IRQ_STACK_LEGTH EQU 256 ;IRQ中斷堆棧
          ABT_STACK_LEGTH EQU 0
          UND_STACK_LEGTH EQU 0
          處理器模式聲明
          NoInt EQU 0x80

          本文引用地址:http://www.ex-cimer.com/article/201611/317253.htm

          USR32Mode EQU 0x10
          SVC32Mode EQU 0x13
          SYS32Mode EQU 0x1f
          IRQ32Mode EQU 0x12
          FIQ32Mode EQU 0x11
          外部存儲器配置聲明
          PINSEL2 EQU 0xE002C014

          BCFG0 EQU 0xFFE00000
          BCFG1 EQU 0xFFE00004
          BCFG2 EQU 0xFFE00008
          BCFG3 EQU 0xFFE0000C

          IMPORT __use_no_semihosting_swi
          IMPORT __use_two_region_memory

          ;The imported labels
          ;引入的外部標(biāo)號在這聲明
          IMPORT FIQ_Exception ;Fast interrupt exceptions handler 快速中斷異常處理程序
          IMPORT __main ;The entry point to the main function C語言主程序入口
          IMPORT TargetResetInit ;initialize the target board 目標(biāo)板基本初始化

          ;The emported labels
          ;給外部使用的標(biāo)號在這聲明
          EXPORT bottom_of_heap ;heap的底部
          EXPORT bottom_of_Stacks ;stack的底部
          EXPORT top_of_heap ;heap的頂部
          EXPORT StackUsr

          EXPORT Reset ;復(fù)位
          EXPORT __user_initial_stackheap ;用戶初始化堆棧和堆

          二、建立中斷向量表(向量表所有數(shù)據(jù)32位累加和為0)
          Reset
          LDR PC, ResetAddr ;復(fù)位后開始的執(zhí)行地址
          LDR PC, UndefinedAddr ;未定義指令異常
          LDR PC, SWI_Addr ;軟件中斷
          LDR PC, PrefetchAddr ;預(yù)取中止
          LDR PC, DataAbortAddr ;預(yù)取數(shù)據(jù)中止
          DCD 0xb9205f80 ;保留的異常
          LDR PC, [PC, #-0xff0] ;IRQ ( 該指令會讀取VICVectAddr寄存器的值,然后放入PC指針 )
          LDR PC, FIQ_Addr ;FIQ

          ;給每一個(gè)向量分配連續(xù)的字存儲單元
          ResetAddr DCD ResetInit
          UndefinedAddr DCD Undefined
          SWI_Addr DCD SoftwareInterrupt
          PrefetchAddr DCD PrefetchAbort
          DataAbortAddr DCD DataAbort
          Nouse DCD 0
          IRQ_Addr DCD 0
          FIQ_Addr DCD FIQ_Handler

          ;發(fā)生以下異常時(shí)程序暫停( 除了FIQ )
          ;未定義指令
          Undefined
          B Undefined

          ;軟中斷
          SoftwareInterrupt
          B SoftwareInterrupt

          ;取指令中止
          PrefetchAbort
          B PrefetchAbort

          ;取數(shù)據(jù)中止
          DataAbort
          B DataAbort

          ;快速中斷
          FIQ_Handler
          STMFD SP!, {R0-R3, LR} ;把R0-R3,LR的值存入堆棧
          BL FIQ_Exception ;跳轉(zhuǎn)到FIQ中斷程序
          LDMFD SP!, {R0-R3, LR} ;恢復(fù)R0-R3,LR的值
          SUBS PC, LR, #4 ;PC指針跳轉(zhuǎn)到LR-4

          三、復(fù)位程序
          根據(jù)外部存儲器控制器的引腳接法,對GPIO進(jìn)行設(shè)置(外部存儲器所接引腳與P1,P2,P3口的GPIO功能復(fù)用),之后對用到的四組存儲器組進(jìn)行設(shè)置.
          ResetInit
          ;Initial extenal bus controller.
          ;初始化外部總線控制器,根據(jù)目標(biāo)板決定配置

          LDR R0, =PINSEL2
          IF :DEF: EN_CRP
          LDR R1, =0x0f814910
          ELSE
          LDR R1, =0x0f814914
          ENDIF
          STR R1, [R0]
          ;設(shè)置四組存儲器配置
          LDR R0, =BCFG0
          LDR R1, =0x1000ffef
          STR R1, [R0]

          LDR R0, =BCFG1
          LDR R1, =0x1000ffef
          STR R1, [R0]

          ; LDR R0, =BCFG2 ;該開發(fā)板沒有用到后面兩組存儲器接口
          ; LDR R1, =0x2000ffef
          ; STR R1, [R0]

          ; LDR R0, =BCFG3
          ; LDR R1, =0x2000ffef
          ; STR R1, [R0]

          BL InitStack ;初始化堆棧 Initialize the stack
          BL TargetResetInit ;目標(biāo)板基本初始化 Initialize the target board
          ;跳轉(zhuǎn)到c語言入口 Jump to the entry point of C program
          B __main

          四、堆棧初始化
          初始化各模式堆棧
          InitStack
          MOV R0, LR
          ;Build the SVC stack
          ;設(shè)置管理模式堆棧
          MSR CPSR_c, #0xd3
          LDR SP, StackSvc
          ;Build the IRQ 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 ;修改為0x5d將打開IRQ中斷
          LDR SP, =StackUsr

          MOV PC, R0 ;子程序返回

          五、目標(biāo)板初始化
          void TargetResetInit(void)
          {
          // 設(shè)置存儲器映射方式,這必須根據(jù)硬件來設(shè)置. 這里是ADS1.2中的設(shè)置.
          #ifdef __DEBUG
          MEMMAP = 0x3; //remap
          #endif

          #ifdef __OUT_CHIP
          MEMMAP = 0x3; //remap
          #endif

          #ifdef __IN_CHIP
          MEMMAP = 0x1; //remap
          #endif

          /* 設(shè)置系統(tǒng)各部分時(shí)鐘 */
          PLLCON = 1;
          #if (Fpclk / (Fcclk / 4)) == 1
          VPBDIV = 0;
          #endif
          #if (Fpclk / (Fcclk / 4)) == 2
          VPBDIV = 2;
          #endif
          #if (Fpclk / (Fcclk / 4)) == 4
          VPBDIV = 1;
          #endif

          #if (Fcco / Fcclk) == 2
          PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);
          #endif
          #if (Fcco / Fcclk) == 4
          PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);
          #endif
          #if (Fcco / Fcclk) == 8
          PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);
          #endif
          #if (Fcco / Fcclk) == 16
          PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);
          #endif
          PLLFEED = 0xaa;
          PLLFEED = 0x55;
          while((PLLSTAT & (1 << 10)) == 0);
          PLLCON = 3; // 按照特定的設(shè)置方式對PLL控制寄存器進(jìn)行設(shè)置
          PLLFEED = 0xaa;
          PLLFEED = 0x55;

          /* 設(shè)置存儲器加速模塊 */
          MAMCR = 0;
          #if Fcclk < 20000000
          MAMTIM = 1;
          #else
          #if Fcclk < 40000000
          MAMTIM = 2;
          #else
          MAMTIM = 3;
          #endif
          #endif
          MAMCR = 2;

          /* 初始化VIC */
          /* initialize VIC*/
          VICIntEnClr = 0xffffffff;
          VICVectAddr = 0;
          VICIntSelect = 0;

          }

          六、其它

          ;/*********************************************************************************************************
          ;** unction name 函數(shù)名稱: __user_initial_stackheap
          ;** Descriptions 功能描述: Initial the function library stacks and heaps, can not deleted!
          ;** 庫函數(shù)初始化堆和棧,不能刪除
          ;** input parameters 輸 入: reference by function library 參考庫函數(shù)手冊
          ;** Returned value 輸 出 : reference by function library 參考庫函數(shù)手冊
          ;** Used global variables 全局變量: None 無
          ;** Calling modules 調(diào)用模塊: None 無
          ;********************************************************************************************************/
          __user_initial_stackheap
          LDR r0,=bottom_of_heap
          ; LDR r1,=StackUsr
          LDR r2,=top_of_heap
          LDR r3,=bottom_of_Stacks
          MOV pc,lr


          StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4
          StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4
          StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4
          StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4
          StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)* 4

          ;/*********************************************************************************************************
          ;** unction name 函數(shù)名稱: CrpData
          ;** Descriptions 功能描述: encrypt the chip
          ;** input parameters 輸 入: None 無
          ;** Returned value 輸 出 : None 無
          ;** Used global variables 全局變量: None 無
          ;** Calling modules 調(diào)用模塊: None 無
          ;********************************************************************************************************/
          IF :DEF: EN_CRP
          IF . >= 0x1fc
          INFO 1,"nThe data at 0x000001fc must be 0x87654321.nPlease delete some source before this line."
          ENDIF
          CrpData
          WHILE . < 0x1fc
          NOP
          WEND
          CrpData1
          DCD 0x87654321 ;/*When the Data is 為0x87654321,user code be protected. 當(dāng)此數(shù)為0x87654321時(shí),用戶程序被保護(hù) */
          ENDIF

          ;/* 分配堆??臻g */
          AREA MyStacks, DATA, NOINIT, ALIGN=2
          SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;Stack spaces for Administration Mode 管理模式堆棧空間
          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 快速中斷模式堆??臻g
          AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;Stack spaces for Suspend Mode 中止義模式堆??臻g
          UndtStackSpace SPACE UND_STACK_LEGTH * 4 ;Stack spaces for Undefined Mode 未定義模式堆棧


          AREA Heap, DATA, NOINIT
          bottom_of_heap SPACE 1

          AREA StackBottom, DATA, NOINIT
          bottom_of_Stacks SPACE 1

          AREA HeapTop, DATA, NOINIT
          top_of_heap

          AREA Stacks, DATA, NOINIT
          StackUsr



          關(guān)鍵詞: ARM7LPC2210Bootloade

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();