LPC2000系列学习笔记10--Bootloader

最新更新时间:2021-08-31来源: eefocus关键字:LPC2000系列  Bootloader  堆栈 手机看文章 扫描二维码
随时随地手机看文章

1.1 变(常)量声明

首先声明堆栈大小


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


    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


  ;引入的外部标号在这声明

    IMPORT  FIQ_Exception                   ;快速中断异常处理程序

    IMPORT  __main                          ; C语言主程序入口 

    IMPORT  TargetResetInit                 ;目标板基本初始化


;给外部使用的标号在这声明

    EXPORT  bottom_of_heap                  ;heap的底部

    EXPORT  bottom_of_Stacks                ;stack的底部

    EXPORT  top_of_heap                     ;heap的顶部

    EXPORT  StackUsr                        

    

    EXPORT  Reset                           ;复位

    EXPORT __user_initial_stackheap         ;用户初始化堆栈和堆


1.2 建立中断向量表(向量表所有数据32位累加和为0)

 Reset

        LDR     PC, ResetAddr               ;复位后开始的执行地址

        LDR     PC, UndefinedAddr           ;未定义指令异常           

        LDR     PC, SWI_Addr                ;软件中断

        LDR     PC, PrefetchAddr            ;预取中止

        LDR     PC, DataAbortAddr           ;预取数据中止

        DCD     0xb9205f80                  ;保留的异常

        LDR     PC, [PC, #-0xff0]           ;IRQ ( 该指令会读取VICVectAddr寄存器的值,然后放入PC指针 )

        LDR     PC, FIQ_Addr                ;FIQ


    ;给每一个向量分配连续的字存储单元

    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


    ;发生以下异常时程序暂停( 除了FIQ )

    ;未定义指令

    Undefined

            B       Undefined


    ;软中断

    SoftwareInterrupt   

            B       SoftwareInterrupt 


    ;取指令中止

    PrefetchAbort

            B       PrefetchAbort


    ;取数据中止

    DataAbort

            B       DataAbort


    ;快速中断

    FIQ_Handler

            STMFD   SP!, {R0-R3, LR}            ;把R0-R3,LR的值存入堆栈

            BL      FIQ_Exception               ;跳转到FIQ中断程序

            LDMFD   SP!, {R0-R3, LR}            ;恢复R0-R3,LR的值

            SUBS    PC,  LR,  #4                ;PC指针跳转到LR-4


1.3 复位程序

    根据外部存储器控制器的引脚接法,对GPIO进行设置(外部存储器所接引脚与P1,P2,P3口的GPIO功能复用),之后对用到的四组存储器组进行设置.

    ResetInit

    ;Initial extenal bus controller.

    ;初始化外部总线控制器,根据目标板决定配置


            LDR     R0, =PINSEL2

        IF :DEF: EN_CRP

            LDR     R1, =0x0f814910   ;芯片加密,禁止JTAG调试

        ELSE

            LDR     R1, =0x0f814914   ;设置总线的I/O引脚

        ENDIF

            STR     R1, [R0]

    ;设置四组存储器配置

            LDR     R0, =BCFG0

            LDR     R1, =0x1000ffef

            STR     R1, [R0]                 ;设置外部第0个存储区


            LDR     R0, =BCFG1

            LDR     R1, =0x1000ffef

            STR     R1, [R0]                 ;设置外部第1个存储区


    ;        LDR     R0, =BCFG2              ;该开发板没有用到后面两组存储器接口  

    ;        LDR     R1, =0x2000ffef

    ;        STR     R1, [R0]                ;设置外部第2个存储区


    ;        LDR     R0, =BCFG3

    ;        LDR     R1, =0x2000ffef

    ;        STR     R1, [R0]                ;设置外部第3个存储区


            BL      InitStack               ;初始化堆栈 Initialize the stack

            BL      TargetResetInit         ;目标板基本初始化 Initialize the target board

                                            ;跳转到c语言入口 Jump to the entry point of C program

        B       __main


1.4 堆栈初始化

    初始化各模式堆栈

InitStack    

        MOV     R0, LR;因芯片模式切换,故将程序返回地址保存到R0,同时在初始化堆栈完成后使用R0返回

;Build the SVC stack

;设置管理模式堆栈

        MSR     CPSR_c, #0xd3  

        LDR     SP, StackSvc

;Build the IRQ 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

;设置系统模式堆栈

        MSR     CPSR_c, #0xdf             ;修改为0x5d将打开IRQ中断

        LDR     SP, =StackUsr


        MOV     PC, R0                    ;子程序返回


1.5 目标板初始化

        void TargetResetInit(void)

{

// 设置存储器映射方式,这必须根据硬件来设置. 这里是ADS1.2中的设置.

#ifdef __DEBUG    

    MEMMAP = 0x3;                   //remap

#endif


#ifdef __OUT_CHIP    

    MEMMAP = 0x3;                   //remap

#endif


#ifdef __IN_CHIP    

    MEMMAP = 0x1;                   //remap,根据预定义的宏,设置存储器映射方式

#endif


/* 设置系统各部分时钟 */

    PLLCON = 1;                    ;使能PLL(锁相环),但不连接PLL

#if (Fpclk / (Fcclk / 4)) == 1

    VPBDIV = 0;

#endif

#if (Fpclk / (Fcclk / 4)) == 2

[1] [2]
关键字:LPC2000系列  Bootloader  堆栈 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic546410.html

上一篇:LPC2000系列学习笔记5--中断
下一篇:LPC2000系列学习笔记3--引脚连接模块

推荐阅读

LPC2000系列学习笔记4--存储器映射控制
对于一般的处理器,系统启动后是从0x00000000地址开始读取中断向量表并引导程序的。但利用LPC2000的存储器重映射功能,我们可以将中断向量表转移至其它存储器,而不一定要从0x00000000这个地址读取。LPC2000的这个功能是通过存储器映射控制寄存器MEMMAP和BOOT管脚来实现的。4.1 寄存器MEMMAP的取值MEMMAP 功能                        描述               
发表于 2021-08-31
LPC2000系列学习笔记3--引脚连接模块
1.1 中断源       LPC2000系列的向量中断控制器(VIC)支持32个中断请求输入,也即是支持32个中断源,见表5.1。这32个中断按顺序称为VIC通道0,VIC通道1,…,VIC通道31。       每一个VIC通道都支持软件中断与硬件中断,即每个中断均可由软件或硬件中断产生,软件中断与对应通道上的硬件中断是逻辑“或”的关系。软件中断可通过置位VICSoftInt寄存器相应位来产生,也可通过置位VICSoftIntClear寄存器相应位来清除。1.2 三种中断类型       LPC2000具有
发表于 2021-08-31
LPC2000系列学习笔记5--中断
1.1 中断源       LPC2000系列的向量中断控制器(VIC)支持32个中断请求输入,也即是支持32个中断源,见表5.1。这32个中断按顺序称为VIC通道0,VIC通道1,…,VIC通道31。       每一个VIC通道都支持软件中断与硬件中断,即每个中断均可由软件或硬件中断产生,软件中断与对应通道上的硬件中断是逻辑“或”的关系。软件中断可通过置位VICSoftInt寄存器相应位来产生,也可通过置位VICSoftIntClear寄存器相应位来清除。1.2 三种中断类型       LPC2000具有
发表于 2021-08-31
LPC2000系列ARM芯片的电子琴的设计
1.用LPC2000系列ARM芯片设计电子琴,用proteus软件仿真。2.按下不同的按键,扬声器能够发出不同的音调。3.用PWM控制扬声器可以实现音调的条件。通过编程,利用按键去控制扬声器的发声。通过小组讨论分析,结合设计电路性能指标、器件的性价比,本设计电路选择方案二。硬件设计与介绍嵌入式的定义:从技术的角度定义:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。从系统的角度定义:嵌入式系统是设计完成复杂功能的硬件和软件,并使其紧密耦合在一起的计算机系统。术语嵌入式反映了这些系统通常是更大系统中的一个完整的部分,称为嵌入的系统。嵌入的系统中可以共存多个
发表于 2019-10-12
<font color='red'>LPC2000</font><font color='red'>系列</font>ARM芯片的电子琴的设计
LPC2000系列Proteus仿真+代码 菜鸟的ARM学习笔记
。2. 寄存器R0-R7、R15和CPSR是所有模式共享的。R8-R12出快中断模式有RX-fiq外所有模式共享。R13、R14和SPSR只有用户模式和系统模式共享,其它都有似有SPSR。R15(PC)程序计数器R16(CPSR)程序转台寄存器R13(SP)堆栈指针P14(LR)链接寄存器ARM指令集 汇编程序设计略了,我看了,但是做Proteus仿真实验没用上,两天就忘了。LPC2000我买的3本ARM入门书籍中有两本都是以LPC2000系列为例的,其实从网上可以下载到具体LPC2XXX处理器的datasheet,上面的资料是最权威和详尽的。引脚选择PINSEL0、PINSEL1设置各个引脚的功能。中断中断的寄存器太多了,没记
发表于 2019-10-12
<font color='red'>LPC2000</font><font color='red'>系列</font>Proteus仿真+代码 菜鸟的ARM学习笔记
STM8 Bootloader和APP设计(都可以使用中断)
1、本Bootloader适用范围:STM8S 和STM8A2、Bootloader和APP的标志位在EEPROM中的0x4000地址存放一个标志位Bootloader 的标志位: 0x11;APP的标志位: 0x39;3、Bootloader 和APP的地址分配Bootloader 的存储空间为:  0x8000~ 0x9FFF;APP 的存储空间为:        0xA000~0x27FFF;在0x8000开始的前128个字节,放置着bootloader重定位过的向量表(bootloader的真正的向量表放置在另外的地方)在0xA000开始的前128个字节,放置
发表于 2021-09-29
STM8 <font color='red'>Bootloader</font>和APP设计(都可以使用中断)

推荐帖子

了解电源,从电源内部实物图开始!
本帖最后由alan000345于2019-2-2010:32编辑 电源不像处理器,可以看规格知性能;电源也不像显卡,由一颗关键的GPU来决定档次。一款好的电源除了满足功率需求以外,还必须考量稳定、节能、静音、安全等多方面的因素。在没有专业设备进行检测的情况下,我们只有了解一些电源的基本原理和元器件知识,才能做到对电源“一目了然”。 抓住关键,不再眼晕从外面看起来,电源的个头也就比一块“板砖”大一点,但它“肚子”里装的东西可着实不少。拆开外壳,我们能看到数以百计的、各式各样
alan000345 TI技术论坛
这样写有什么不对吗?
用的是IAR编译器,这个指针数组里面包含的是各个数组的地址,修饰类型都是unsignedcha但错吴提示: Error[Pe144]:avalueoftype"unsignedchar(*)[3]"cannotbeusedtoinitializeanentityoftype"unsignedchar*"D:\程序\现用程序\KeyScan.c96 unsignedchar(*)[3]是从哪来的?
ena 微控制器 MCU
晒货 i.MX6开发板
这是两年前的一个i.MX6开发板。i.MX系列性能不错,升级也快。晒板同时,也希望能够交换其它开发板 晒货i.MX6开发板
dcexpert 开发板测评专版
两块板子之间的CAN通讯
两块5K31的板子,进行CAN通讯,请问时序上应该如何设置?如果一个只负责发送数据,另一个只负责接收数据,又怎么解决?(新板子的移植程序,两块板子分别跟老板子都能够进行CAN通讯,且协议一致了,再将两块一直程序后的新板子直接上电通讯,没有反应)。个人觉得应该是时序的问题,觉得作为发送一方,发送失败可以延迟一段时间,在复位重新发送;对于接收一方,也要不断判断是否有数据过
benbending 微控制器 MCU
乘法型的DA和普通的DA有什么区别呢?
希望大虾能够解析下乘法型的DA和普通的DA的区别乘法型的DA和普通的DA有什么区别呢?
wstt TI技术论坛
TM4C123GH6PM QEI如何配置?
TM4C123GH6PMQEI如何配置? TM4C123GH6PMQEI如何配置?
xinlin 微控制器 MCU
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved