搜索
bottom↓
回复: 51

基于ARM7-LPC2368 的一种简单IAP方法

[复制链接]

出0入0汤圆

发表于 2012-8-22 23:01:32 | 显示全部楼层 |阅读模式
本帖最后由 tangcdong 于 2012-8-22 23:29 编辑

    经过一个星期的夜战(下班回家整的)终于把LPC2368单片机在系统升级的程序调试完成,自己做了50次的烧写试验,成功率100%,由于时间的关系就没有再进行测试。
    现在把我思路以及实现方法罗列出来给大家,希望对大家有所帮助,同时也希望大家提出宝贵的建议。
    在写在系统升级思路前还是先说明一下存储器重映射的功能,以免有些人看的云里雾里。
    1、存储器重映射:
    由于ARM处理器的存储器结构比较复杂,可能同时存在片内存储器和片外存储器等,他们在存储器映射上的起始地址都不一样,因此ARM内核要访问的中断向量表可能不在0x0000 0000~0x0000 003F地址上,因此采用了存储器重映射来实现将存在与不同地方的中断向量表都映射到0x0000 0000~0x0000 003F地址上。
    单片机在每次复位后都会执行从起始地址0x0000 0000开始的跳转指令,至于这条跳转指令以及后面的一些中断跳转指令(共64字节)的来源是可以通过存储器重映射功能改变的。当MAP 1:0设置为二进制10(当然这个值只能在程序运行中更改,可以参考LPC2300技术手册)则中断向量被映射到LPC2368静态RAM即0x4000 0000到0x4000 003F,例如当产生软件中断时内核从0x0000 0008处取出32位的指令,但这32位指令是从静态RAM0x4000 0008提供的。

    2、存储器分配:
    LPC2214 有512k Flash ROM, 起始地址为0x0000 0000 ,终止地址为0x0007 FFFF。
    32k 静态RAM ,   起始地址为0x4000 0000 ,终止地址为0x4000 7FFF

      (1)、整个ROM 空间分为四个部分:
    三个程序区: Boot程序、用户程序、IAP升级程序备份
    一个标志区: 用户程序标志
    a、 Boot程序地址:            0x0000 0000  -- 0x0000 7FFF     0-7扇区       共32k       用于程序升级并判断是否有有效程序并跳转到0x00008000处运行程序
    b、 用户程序地址:            0x0000 8000  -- 0x00017FFF       8—9扇区      共64k      用户程序
    c、 IAP升级程序备份地址:  0x0002 8000  -- 0x0003 7FFF     12—13扇区    共64k      用于IAP对用户程序进行升级
    d、 程序标志地址:       0x0004 8000  -- 0x0004 FFFF     16扇区        共32k      保存用户程序是否已经写入标志只有最低四个字节有用。
    (2)、RAM分为三个部分:
    a、0x4000 0000-0x4000 003F    共64字节    用于中断向量重映射
    b、0x4000 0040-0x4000 2FFF    共12K-64    用于Boot程序变量使用
    c、0x4000 3000-0x4000 8000        共20K                用于应用程序变量使用

    3. 程序更新过程
    (1)、加电后先进入0x0000 0000 Boot程序区(此时的相应中断向量取值为0X0000 0000-0X0000 0040中的值)。
    (2)、判断是否有升级程序命令,如果有则进行程序升级,如果3S之内没有升级程序命令,判断16扇区(0x0004 8000 -- 0x0004 8003)的值进行相应的跳转或不跳转。
    a、(0x0004 8000 -- 0x0004 8003)的值为0x0000 0001,则跳转到地址0x0000 8000处开始执行程序,此地址开始的应用程序(起始代码)中必须把地址0x0000 8000-0x0000 803F中的   内容复制到0x4000 0000-0x4000 003F中,并把MAP 1:0设置为二进制10,当产生中断后程序跳转到地址为0x0000 0000-0x0000 003F中取指令,注意此时相应指令的数据是由RAM区0x4000 0000-0x4000 0040相应地址提供的。
    b、(0x0004 8000 -- 0x0004 8003)的值不为0x0000 0001,则等待升级命令。
    (3)、用户程序必须包含识别升级命令的代码,当收到升级命令后关中断并把MAP 1:0设置为二进制01,使中断向量不重映射,然后使单片机软件复位跳转到0x0000 0000  Boot程序区执行代码(此时的相应中断向量跳转指令的取值又转为0X0000 0000-0X0000 003F中的值)。
    下面贴出程序的升级代码(其中包括Boot程序、应用程序以及使用VC6.0编写的下载程序):

      注:如有问题可以加入QQ群:235387696进行进一步探讨。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2012-9-7 10:32:12 | 显示全部楼层
补充:如果要运用到实际项目中需改进两点:1、BOOT的程序可以不用UCOSII实时操作系统,可以简化代码。2、当代码全部下载到备份区时赋给标志另一个值如0X0000FFFF,表明代码从上位机下载完毕,下一步就是把备份代码拷贝到应用程序中,如果这时掉电的话,在下次启动的时候判断该标志位为0X0000FFFF,则把备份区代码拷贝到应用程序区去,接着运行应用程序,这样一来在升级中不管何时掉电都能够保证程序运行正常。

出0入0汤圆

发表于 2012-9-7 13:00:01 | 显示全部楼层
谢谢!正研究STM32L-IAP.

出0入0汤圆

 楼主| 发表于 2012-9-14 12:26:25 | 显示全部楼层
32MCU 发表于 2012-9-7 13:00
谢谢!正研究STM32L-IAP.

呵呵,我也正在研究STM32基于Crotex-M3内核。

出0入0汤圆

发表于 2012-9-14 12:33:48 | 显示全部楼层
我在武汉。要是同城的就好了。

出0入0汤圆

发表于 2012-12-27 10:42:25 | 显示全部楼层
MARK........

出0入0汤圆

发表于 2012-12-29 16:44:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2013-1-7 18:34:59 | 显示全部楼层
mark
too

出30入0汤圆

发表于 2013-3-1 11:58:06 | 显示全部楼层
非常好的帖子,好好研究一下,争取能够用上!

出0入0汤圆

发表于 2013-3-1 12:29:57 | 显示全部楼层
mark  学习

出0入0汤圆

发表于 2013-4-9 00:01:30 | 显示全部楼层
虽没细看   但是写的非常好

出0入0汤圆

 楼主| 发表于 2013-4-16 11:48:46 | 显示全部楼层
number007cool 发表于 2013-4-9 00:01
虽没细看   但是写的非常好

呵呵,我短信息发送不了,有问题多多交流啊!

出0入0汤圆

发表于 2013-4-16 12:46:03 | 显示全部楼层
你有ads下面的应用程序么   
你的boot和app的mdk版本下载试过  可以用  

但是我把之前ads下的程序按照你的思路修改地址   然后被boot下载进去  跑不起来   

另:上位机有没有后续版本  可以选择指定路劲的bin文件   可以记住bin路径等等 ~~~  

出0入0汤圆

 楼主| 发表于 2013-4-16 13:19:57 | 显示全部楼层
number007cool 发表于 2013-4-16 12:46
你有ads下面的应用程序么   
你的boot和app的mdk版本下载试过  可以用  

呵呵,用ADS也一样的,只要设置好地址就可以了,ADS我没怎么用,不知道要不要写分散加载文件。上位机软件的话暂时也没有时间去弄,具体要用的时候可以去优化一下。

出0入0汤圆

发表于 2013-4-17 09:25:18 | 显示全部楼层
好像应用程序中不用把“地址0x0000 8000-0x0000 803F中的   内容复制到0x4000 0000-0x4000 003F中,并把MAP 1:0设置为二进制10”
应为boot程序中也有中断向量表,放在0到3f地址中,应用程序中断的时候,跳到boot程序的向量表貌似也可以~~~~

出0入0汤圆

 楼主| 发表于 2013-4-17 10:10:27 | 显示全部楼层
number007cool 发表于 2013-4-17 09:25
好像应用程序中不用把“地址0x0000 8000-0x0000 803F中的   内容复制到0x4000 0000-0x4000 003F中,并把MAP ...

那样子不行吧,boot与应用程序的中断向量表是独立的,你应用程序使用boot中断向量不是乱透了。

出0入0汤圆

发表于 2013-4-17 11:00:38 | 显示全部楼层
tangcdong 发表于 2013-4-17 10:10
那样子不行吧,boot与应用程序的中断向量表是独立的,你应用程序使用boot中断向量不是乱透了。  ...

;/*****************************************************************************
;*   startup.s: startup file for NXP LPC230x Family Microprocessors
;*
;*   Copyright(C) 2006, NXP Semiconductor
;*   All rights reserved.
;*
;*   History
;*   2006.09.01  ver 1.00    Prelimnary version, first Release
;*
;*****************************************************************************/
        PRESERVE8

;/*
; *  The STARTUP.S code is executed after CPU Reset. This file may be
; *  translated with the following SET symbols. In uVision these SET
; *  symbols are entered under Options - ASM - Define.
; *
; *  REMAP: when set the startup code initializes the register MEMMAP
; *  which overwrites the settings of the CPU configuration pins. The
; *  startup and interrupt vectors are remapped from:
; *     0x00000000  default setting (not remapped)
; *     0x40000000  when RAM_MODE is used
; *
; *  RAM_MODE: when set the device is configured for code execution
; *  from on-chip RAM starting at address 0x40000000.
; */


; Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs

Mode_USR        EQU     0x10
Mode_FIQ        EQU     0x11
Mode_IRQ        EQU     0x12
Mode_SVC        EQU     0x13
Mode_ABT        EQU     0x17
Mode_UND        EQU     0x1B
Mode_SYS        EQU     0x1F

I_Bit           EQU     0x80            ; when I bit is set, IRQ is disabled
F_Bit           EQU     0x40            ; when F bit is set, FIQ is disabled


;// <h> Stack Configuration (Stack Sizes in Bytes)
;//   <o0> Undefined Mode      <0x0-0xFFFFFFFF:8>
;//   <o1> Supervisor Mode     <0x0-0xFFFFFFFF:8>
;//   <o2> Abort Mode          <0x0-0xFFFFFFFF:8>
;//   <o3> Fast Interrupt Mode <0x0-0xFFFFFFFF:8>
;//   <o4> Interrupt Mode      <0x0-0xFFFFFFFF:8>
;//   <o5> User/System Mode    <0x0-0xFFFFFFFF:8>
;// </h>

UND_Stack_Size  EQU     0x00000000
SVC_Stack_Size  EQU     0x00000100
ABT_Stack_Size  EQU     0x00000000
FIQ_Stack_Size  EQU     0x00000000
IRQ_Stack_Size  EQU     0x00000120               ;每层嵌套需要9个字堆栈,允许8层嵌套
USR_Stack_Size  EQU     0x00000200

Stack_Size      EQU     (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + \
                         FIQ_Stack_Size + IRQ_Stack_Size + USR_Stack_Size)

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size

StackUsr        EQU     Stack_Mem+USR_Stack_Size

Stack_Top       EQU     Stack_Mem + Stack_Size

                                                                EXPORT  StackUsr        ;声明为外部标号,供IRQ.S调用。
;// <h> Heap Configuration
;//   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF>
;// </h>

Heap_Size       EQU     0x00000001
                                                  
                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
Heap_Mem        SPACE   Heap_Size

; Area Definition and Entry Point
;  Startup Code must be linked first at Address at which it expects to run.

;引入的外部标号在这声明
                                                    IMPORT  FIQ_Exception                   ;快速中断异常处理程序
                                                    IMPORT  __main                          ;C语言主程序入口
                                                    IMPORT  TargetResetInit                 ;目标板基本初始化
                                                    IMPORT  SoftwareInterrupt               ;软件中断的处理函数
                                                    EXPORT  Vectors

                AREA    RESET, CODE, READONLY
                ARM

; Exception Vectors
;  Mapped to Address 0.
;  Absolute addressing mode must be used.
;  Dummy Handlers are implemented as infinite loops which can be modified.

;;中断向量表
;;对于1.未定义指令 2.预取指中止 3.数据中止三种异常不做处理
;;
ENTRY
Vectors         LDR     PC, Reset_Addr      
                LDR     PC, Undef_Addr
                LDR     PC, SWI_Addr
                LDR     PC, PAbt_Addr
                LDR     PC, DAbt_Addr
                NOP                            ; Reserved Vector
;               LDR     PC, IRQ_Addr
                LDR     PC, [PC, #-0x0120]     ; Vector from VicVectAddr
                LDR     PC, FIQ_Addr

Reset_Addr      DCD     Reset_Handler
Undef_Addr      DCD     Undef_Handler
SWI_Addr        DCD     SoftwareInterrupt
PAbt_Addr       DCD     PAbt_Handler
DAbt_Addr       DCD     DAbt_Handler
                DCD                0xB9206E28             ; Reserved Address
;IRQ_Addr       DCD     IRQ_Handler
FIQ_Addr        DCD     FIQ_Handler

Undef_Handler   B       Undef_Handler
;SWI_Handler    B       SWI_Handler
PAbt_Handler    B       PAbt_Handler
DAbt_Handler    B       DAbt_Handler
;IRQ_Handler    B       IRQ_Handler
FIQ_Handler
                                                                STMFD   SP!, {R0-R3, LR}
                                        BL      FIQ_Exception
                                        LDMFD   SP!, {R0-R3, LR}
                                        SUBS    PC,  LR,  #4


; Reset Handler                  
                EXPORT  Reset_Handler
Reset_Handler   

; Setup Stack for each mode
;                LDR     R0, =Stack_Top

;  Enter Undefined Instruction Mode and set its Stack Pointer
;                MSR     CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit
;                MOV     SP, R0
;                SUB     R0, R0, #UND_Stack_Size

;  Enter Abort Mode and set its Stack Pointer
;                MSR     CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit
;                MOV     SP, R0
;                SUB     R0, R0, #ABT_Stack_Size

;  Enter FIQ Mode and set its Stack Pointer
;                MSR     CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
;               MOV     SP, R0
;               SUB     R0, R0, #FIQ_Stack_Size

;  Enter IRQ Mode and set its Stack Pointer
;                MSR     CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
;                MOV     SP, R0
;                SUB     R0, R0, #IRQ_Stack_Size

;  Enter Supervisor Mode and set its Stack Pointer
;                MSR     CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
;                MOV     SP, R0
;                SUB     R0, R0, #SVC_Stack_Size

;  Enter User Mode and set its Stack Pointer
;                MSR     CPSR_c, #Mode_USR
;                MOV     SP, R0
;                SUB     SL, SP, #USR_Stack_Size
                                MOV R8,#0x40000000
                                LDR R9,=Vectors

                                LDMIA R9!,{R0-R7}
                                STMIA R8!,{R0-R7}
                                LDMIA R9!,{R0-R7}
                                STMIA R8!,{R0-R7}
                               
                                ;//使用remap ram
                                ;LDR R8,=MEMMAP
                                LDR R8,=0xE01FC040
                                MOV R9,#0x02
                                STR R9, [R8]                               
;                                IMPORT        TargetResetInit
                                                                BL                TargetResetInit        ;在target.c文件中

; Enter the C code

;                IMPORT  __main
                LDR     R0, =__main
                BX      R0



; User Initial Stack & Heap

;;函数说明参考RV_CC.PDF文件P291
;;function:  __user_initial_stackheap
;;description:初始化堆栈(stack)和堆(heap),函数采用双存储器区域。
;;parameter:r0,sp,r2
;;return value:r0--堆的基址(heap base in r0)
;;r1--堆栈基址,堆栈区域的最高地址
;;r2--堆的限制地址(heap limit in r2)
;;r3--堆栈限制地址,堆栈区域的最低地址
;;

                AREA    |.text|, CODE, READONLY

                IMPORT  __use_two_region_memory           ;select memory model of two memory region
                EXPORT  __user_initial_stackheap
__user_initial_stackheap

                LDR     R0, =  Heap_Mem
                LDR     R1, =(Stack_Mem + USR_Stack_Size)
                LDR     R2, = (Heap_Mem +      Heap_Size)
                LDR     R3, = Stack_Mem
                BX      LR

                END




比较了你的keil下的应用程序与正常情况下的程序,有几点比较奇怪:
1、你的应用程序的启动代码的堆栈初始化部分被注释掉了
2、Heap_Size       EQU     0x00000001  这个地方为什么是1   我看其他的网上下载的例程是0
而且__user_initial_stackheap貌似也没有被执行


设置中不同的是:
rom其实地址为0x8000
ram起始地址为0x40003000
这个还是可以理解的

出0入0汤圆

 楼主| 发表于 2013-4-17 14:43:50 | 显示全部楼层
number007cool 发表于 2013-4-17 11:00
;/*****************************************************************************
;*   startup.s: st ...

heap堆基本上不用所以你设置成0或1不影响,那个初始化没用。

出0入0汤圆

 楼主| 发表于 2013-4-17 15:10:10 | 显示全部楼层
number007cool 发表于 2013-4-17 11:00
;/*****************************************************************************
;*   startup.s: st ...

__user_initial_stackheap是编译器调用的,当运行到__main时并不是C代码中的main,而是编译器提供的专门用于启动用户程序的库函数,负责完成库函数的初始化和初始化应用程序执行环境,其中会调用__user_initial_stackheap以初始化C代码运行需要的堆栈,初始化运行完最后自动跳转到main()执行。

出0入0汤圆

发表于 2013-4-17 15:13:38 | 显示全部楼层
我把我的一个mdk下的应用程序的工程传上来给你看下




感觉REMAP那个寄存器不管怎么设置,程序中断(定时器、ad转换)都可以用。

MEMMAP          EQU     0xE01FC040          ; Memory Mapping Control
                IF      :DEF:REMAP00000
                LDR     R0, =MEMMAP
                IF      :DEF:EXTMEM_MODE
                MOV     R1, #3
                ELIF    :DEF:RAM_MODE
                MOV     R1, #2
                ELSE
                MOV     R1, #1
                ENDIF
                STR     R1, [R0]
                ENDIF

而且在跳到main之前加上你的那个拷贝向量表到0x40000000反而会使程序的中断无法使用

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-4-17 15:14:22 | 显示全部楼层
把几个立即数全部改成3或2或1似乎都可以使用

出0入0汤圆

 楼主| 发表于 2013-4-17 16:02:37 | 显示全部楼层
number007cool 发表于 2013-4-17 15:14
把几个立即数全部改成3或2或1似乎都可以使用

我的keil是V3版本你的项目我打不开,你在配置ASM->DEFINE里声明RAM_INTVEC、REMAP00000与RAM_MODE没有啊 ?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-4-17 16:12:23 | 显示全部楼层
tangcdong 发表于 2013-4-17 16:02
我的keil是V3版本你的项目我打不开,你在配置ASM->DEFINE里声明RAM_INTVEC、REMAP00000与RAM_MODE没有啊  ...

没有定义   

出0入0汤圆

发表于 2013-4-17 16:13:29 | 显示全部楼层
本帖最后由 number007cool 于 2013-4-17 16:16 编辑

MOV     R1, #3
                ELIF    :DEF:RAM_MODE
                MOV     R1, #2
                ELSE
                MOV     R1, #1
我吧这里的三个赋给R1的数全部改成1,或者全部改成2   ,3  貌似都可以使用
中断也可以进去  
这是最奇怪的地方



这个工程总共两个文件  
要不你建个工程试下     

出0入0汤圆

 楼主| 发表于 2013-4-17 16:30:16 | 显示全部楼层
number007cool 发表于 2013-4-17 16:13
MOV     R1, #3
                ELIF    :DEF:RAM_MODE
                MOV     R1, #2

你都没有声明你改那几个数据有什么用啊?IF      :DEF:REMAP00000与c语言里#if define REMAP00000类似 你REMAP00000都没有定义这段代码就没什么意义了。

出0入0汤圆

发表于 2013-4-17 17:19:40 | 显示全部楼层
没有声明 就满足最后一个else啊
就是  ELSE
                MOV     R1, #1

就是写入MEMMAP
的值是1!
而且这里改成2和3似乎也可以正常使用

你联系方式多少    电话也行

出0入0汤圆

 楼主| 发表于 2013-4-17 18:02:36 | 显示全部楼层
number007cool 发表于 2013-4-17 17:19
没有声明 就满足最后一个else啊
就是  ELSE
                MOV     R1, #1

QQ498502983 电话15857458573

出0入0汤圆

发表于 2013-5-16 10:32:29 | 显示全部楼层
tangcdong 发表于 2013-4-17 18:02
QQ498502983 电话15857458573

哥们  还在不  我的那个iap弄成功了   但是app中压根么有搞向量表拷贝和地址重映射   也能进中断    能否交流下

出0入0汤圆

 楼主| 发表于 2013-5-16 12:59:43 | 显示全部楼层
number007cool 发表于 2013-5-16 10:32
哥们  还在不  我的那个iap弄成功了   但是app中压根么有搞向量表拷贝和地址重映射   也能进中断    能否 ...

那你那个中断进的可能是Boot的中断吧!

出0入0汤圆

发表于 2013-5-16 14:36:02 | 显示全部楼层
tangcdong 发表于 2013-5-16 12:59
那你那个中断进的可能是Boot的中断吧!

boot已经跳转到app,而且根据现象来看也不是boot的中断而是app的

出0入0汤圆

发表于 2013-5-17 15:20:12 | 显示全部楼层
定时器0.zip有木马!

出0入0汤圆

 楼主| 发表于 2013-5-18 08:04:41 | 显示全部楼层
jlian168 发表于 2013-5-17 15:20
定时器0.zip有木马!

????什么情况?

出0入0汤圆

发表于 2013-5-20 10:33:42 | 显示全部楼层
tangcdong 发表于 2013-5-18 08:04
????什么情况?

AVAST V6 say:定时器0.zip有木马!

出0入0汤圆

发表于 2013-5-20 11:03:53 | 显示全部楼层
jlian168 发表于 2013-5-20 10:33
AVAST V6 say:定时器0.zip有木马!

电脑应该是中招了

以前用卡巴杀了好多次  

用一段时间后就又出来了     我在另外的机子上试  貌似提示的不是这种病毒     没影响正常使用   没怎么管

目前用的这台太慢   卡巴也卸了    目前仍处于裸奔状态~

出0入0汤圆

发表于 2013-5-20 11:14:54 | 显示全部楼层
在你的app的工程中,指定ram的起始地址是从0x4000 3000
长度是0x5000,那么app的代码部分:
                                MOV R8,#0x40000000
                                LDR R9,=Vectors

                                LDMIA R9!,{R0-R7}
                                STMIA R8!,{R0-R7}
                                LDMIA R9!,{R0-R7}
                                STMIA R8!,{R0-R7}
                               
                                ;//使用remap ram
                                ;LDR R8,=MEMMAP
                                LDR R8,=0xE01FC040
                                MOV R9,#0x02
                                STR R9, [R8]       
应该改成:
MOV R8,#0x40003000

要不拷贝的中断向量表还是从bootloader的向量表拷贝而来      

我是这样理解的,您看呢?

出0入0汤圆

 楼主| 发表于 2013-5-20 13:15:33 | 显示全部楼层
number007cool 发表于 2013-5-20 11:14
在你的app的工程中,指定ram的起始地址是从0x4000 3000
长度是0x5000,那么app的代码部分:
                                MOV R8,#0x4 ...

不是这样的,当你把中断向量映射成RAM的话,每次中断入口地址都是从0x4000 0000开始的64字节单元中取数据的,所以你要把中断向量放到0x4000 0000开始的64字节中。

出0入0汤圆

 楼主| 发表于 2013-5-20 13:20:11 | 显示全部楼层
number007cool 发表于 2013-5-20 11:14
在你的app的工程中,指定ram的起始地址是从0x4000 3000
长度是0x5000,那么app的代码部分:
                                MOV R8,#0x4 ...

补充:平时你不映射的话是从flash取中断入口地址,而它是在0x0000 0000开始的64个字节中的。

出0入0汤圆

发表于 2013-5-20 13:25:22 | 显示全部楼层
那请问 在app工程中限定ram地址空间范围的意义又在哪里呢 ?

出0入0汤圆

发表于 2013-5-20 14:42:58 | 显示全部楼层
tangcdong 发表于 2013-5-20 13:20
补充:平时你不映射的话是从flash取中断入口地址,而它是在0x0000 0000开始的64个字节中的。 ...

嗯  赞同  

有一点我觉得很重要的,想和你交流下

汇编中跳转到_main的指令要用相对跳转指令,而不是绝对跳转

我第一次在基于IAR的arm7上搞IAP 就是因为app的这条指令卡住了一个月   ,最后程序改成功了,改了一个月就是改了一条指令

相对跳转:
          LDR     R0, =__main
                BX      R0

绝对跳转:
         B   _main


app中要使用前者进行跳转,否则程序会跑飞

出0入0汤圆

发表于 2013-5-20 18:15:52 | 显示全部楼层
楼主,请问这个RAM怎么分区的,可以自己想存哪里自己划分吗

出0入0汤圆

发表于 2013-5-20 18:47:59 | 显示全部楼层
MARK........

出0入0汤圆

发表于 2013-5-20 21:50:15 | 显示全部楼层
多谢lz分享

出0入0汤圆

发表于 2013-5-20 22:14:08 | 显示全部楼层
这帖子很有价值啊

出0入0汤圆

 楼主| 发表于 2013-5-21 08:02:09 | 显示全部楼层
number007cool 发表于 2013-5-20 14:42
嗯  赞同  

有一点我觉得很重要的,想和你交流下

BX 指令是跳转加指令集切换(ARM与Thumb指令的切换),B指令直接跳转。

出0入0汤圆

 楼主| 发表于 2013-5-21 08:03:02 | 显示全部楼层
snoweaglemcu 发表于 2013-5-20 22:14
这帖子很有价值啊

奉献给有用的人吧!

出0入0汤圆

 楼主| 发表于 2013-5-21 08:14:42 | 显示全部楼层
number007cool 发表于 2013-5-20 13:25
那请问 在app工程中限定ram地址空间范围的意义又在哪里呢 ?

首先起始的64字节肯定要分配给中断向量吧;其次是分配给Boot程序,这里的RAM空间在Boot运行完之后基本上也没什么用,当程序要升级的时候是软件复位的,这段RAM空间又重新初始化了(即使在应用程序中被利用了也不影响),感觉这段空间应该也可以和应用程序合并在一起使用,目前我还没有想到会有什么影响,不过分开肯定是可以的(为了安全起见我就直接分开了);最后是分配给应用程序,这就不用多说了。

出0入0汤圆

发表于 2013-5-21 09:46:39 | 显示全部楼层
由于片子ram空间不够,我让lwip的 app和bootram空间重叠了一部分 ,app运行了一晚上  就死掉了

假如让app与boot 的ram完全重叠   那么  下载成功后无法运行

出0入0汤圆

 楼主| 发表于 2013-5-21 11:46:41 | 显示全部楼层
number007cool 发表于 2013-5-21 09:46
由于片子ram空间不够,我让lwip的 app和bootram空间重叠了一部分 ,app运行了一晚上  就死掉了

假如让app ...

呀,我最近也在移植LWIP,在stm32上面。你用的是哪个版本的啊?

出0入0汤圆

发表于 2013-5-21 14:38:03 | 显示全部楼层
我用的是别人的例程  
版本可能比较老     

出0入0汤圆

发表于 2014-1-12 18:00:42 | 显示全部楼层
很好!谢谢!

出0入0汤圆

发表于 2017-3-23 09:36:31 | 显示全部楼层
谢谢楼主分享,最近正在研究IAP,学习的不透彻遇到好多问题

出0入0汤圆

发表于 2019-2-15 17:39:16 | 显示全部楼层
好东西,赶紧研究下,之前看的事STM32
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 05:10

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表