关于MDK编译调试正常下载到开发板就没反映?????????????

NM275490806 2012-11-24 07:37:24
本人的开发板是2440的刚学。自己写了个LED的亮灯程序,编译在线调试都正常唯独下载到开发板没有反映????
求高手指点到底是那里问题????
这里是启动代码
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 ; 如果I位被置1,则外部中断被禁止(IRQ is disabled)
F_Bit EQU 0x40 ; 如果F位被置1,则快速中断被禁止(FIQ is disabled)

;----------------------- Stack and Heap Definitions ----------------------------

UND_Stack_Size EQU 0x00000000 ;设置各种模式栈大小
SVC_Stack_Size EQU 0x00000010
ABT_Stack_Size EQU 0x00000000
FIQ_Stack_Size EQU 0x00000040
IRQ_Stack_Size EQU 0x00000040
USR_Stack_Size EQU 0x000000A0
;总栈的大小,也就是也有模式下栈相加
ISR_Stack_Size EQU (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + \
FIQ_Stack_Size + IRQ_Stack_Size)
;开辟一个堆栈段,段名字为STACK,定义为可读可写,将内存单元初始化为0,
AREA STACK, NOINIT, READWRITE, ALIGN=3

Stack_Mem SPACE USR_Stack_Size ;SPACE -- 伪指令,用于分配一块内存单元,并用0初始化,与%同义
__initial_sp SPACE ISR_Stack_Size
Stack_Top ;堆栈段内容结束, 在这里放个标号,用来获得堆栈顶部地址


Heap_Size EQU 0x00000000 ;定义堆大小,一般程序中用到malloc才用到堆
;开辟一个名字为HEAP可读可写,不初始化内存单的内存单元。
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base ;堆的基址
Heap_Mem SPACE Heap_Size ;堆内存起始地址标号
__heap_limit ;堆结束


;声明一些外部c函数
; IMPORT SYS_init ;所有外设初始化都在这个里面
IMPORT main

;----------------------- CODE --------------------------------------------------

PRESERVE8 ;PRESERVE8 -- 伪指令,指示当前文件请求堆栈为8字节对齐。


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

AREA RESET, CODE, READONLY ;声明一个名为RESET的代码段,属性为只读
ARM

IMPORT ||Image$$ER_ROM1$$RO$$Length||
IMPORT ||Image$$RW_RAM1$$RW$$Length|| ;连接时用到外部RAM


Vectors LDR PC, Reset_Addr ;将复位地址装载到程序指针,即复位
LDR PC, Undef_Addr ;发生未定义中断时,跳转到Undef_Addr标号处
LDR PC, SWI_Addr ;发生软件中断时,跳转到SWI_Addr标号处
LDR PC, PAbt_Addr ;发生预取指中断时,跳转到PAbt_Addr标号处
LDR PC, DAbt_Addr ;发生预取数中断时,跳转到DAbt_Addr标号处
NOP
LDR PC, IRQ_Addr ;发生外部中断时,跳转到IRQ_Addr标号处
LDR PC, FIQ_Addr ;发生快速中断时,跳转到FIQ_Addr标号处


;分配空间大小为RO输出区的字节 ,长度与RW输出区的字节长度之和 ; ||Image$$RW_RAM1$$RW$$Length||
DCD ||Image$$ER_ROM1$$RO$$Length|| ;+\
;||Image$$RW_RAM1$$RW$$Length||

;END

Reset_Addr DCD Reset_Handler ;复位子程序入口地址赋值给Reset_Addr
Undef_Addr DCD Undef_Handler ;未定义子程序入口地址赋值给Undef_Addr
SWI_Addr DCD SWI_Handler ;中断子程序入口地址赋值给SWI_Addr
PAbt_Addr DCD PAbt_Handler ;中止(预存)子程序入口地址赋给PAbt_Addr
DAbt_Addr DCD DAbt_Handler ;中止(数据)子程序入口地址赋给DAbt_Addr
DCD 0 ; 保留,用不到地址
IRQ_Addr DCD IRQ_Handler ;把IRQ_Handler入口地址给IRQ_Addr
FIQ_Addr DCD FIQ_Handler ;快速中断入口地址给FIQ_Addr


;这些子程序都是用无限循环方式实现的可以被修改。声明为export即可
Undef_Handler B Undef_Handler ;跳转到Undef_Handler,还是在这个地方
SWI_Handler B SWI_Handler ;跳转到软件中断
PAbt_Handler B PAbt_Handler
DAbt_Handler B DAbt_Handler

IRQ_Handler PROC ;如果函数标有PROC与ENDP,但没有FRAME PUSH 或 FRAME POP,则堆栈作用量假定为0.这意味着无需手动添加FRAME PUSH 0或FRAME POP 0
EXPORT IRQ_Handler [WEAK] ;声明一个全局变量,并且其它同名符优先于本符号被引用
B . ;跳转到当前地址即在此等待“.”代表当前指令地址
ENDP

FIQ_Handler PROC ;如果函数标有PROC与ENDP,但没有FRAME PUSH 或 FRAME POP,则堆栈作用量假定为0.这意味着无需手动添加FRAME PUSH 0或FRAME POP 0
EXPORT FIQ_Handler [WEAK] ;声明一个全局变量,并且其它同名符优先于本符号被引用
B . ;跳转到当前地址即在此等待“.”代表当前指令地址
ENDP

EXPORT Reset_Handler


Reset_Handler LDR SP, =4096 ;在下面的代码c语言部分运行前先设置堆栈指针在内部ram

;BL SYS_init ;所有用到的初始化外设

; LDR SP, =4096 ;设置堆栈顶在片内4k末端,如果在外部ram则要另外设置


; 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

; Enter User Mode and set its Stack Pointer
MSR CPSR_c, #Mode_USR
IF :DEF:__MICROLIB

EXPORT __initial_sp

ELSE

MOV SP, R0
SUB SL, SP, #USR_Stack_Size

ENDIF


BL main ;进入c的世界

IF :DEF:__MICROLIB

EXPORT __heap_base
EXPORT __heap_limit

ELSE
; User Initial Stack & Heap
AREA |.text|, CODE, READONLY

IMPORT __use_two_region_memory
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
ENDIF

END

这里是点灯程序
#include "s3c2440.h"
#define GPBCON (*(volatile unsigned int *) 0x56000010)
#define GPBDAT (*(volatile unsigned int *) 0x56000014)
#define GPBUP (*(volatile unsigned int *) 0x56000018)
#define led0 ~(0x1 << 5)
#define led1 ~(0x1 << 6)
#define led2 ~(0x1 << 8)
#define led3 ~(0x1 << 10)
#define bee ~(0x1 << 1)

int main(void)
{
int i = 0;
unsigned int state[] = {led0, led1, led2, led3};


GPBCON &= ((0x11 << 0) | (0x11 << 10) | (0x11 << 12) | (0x11 << 16) | (0x11 << 20)) ;
GPBCON |= (0x01 << 0) | (0x01 << 10) | (0x01 << 12) | (0x01 << 16) | (0x01 << 20);
GPBUP |= (0x1 << 5) | (0x1 << 6 ) | (0x1 << 8) | (0x1 << 10);
while(1)
{
GPBDAT |= ~led0 | ~led1 | ~led2 | ~led3 ;
GPBDAT &= ~bee;
GPBDAT &= (led0 & led1 & led2 & led3);
GPBDAT |= bee;
}
}


这里是sct文件
LR_IROM1 0x308000000 0x200000 { ; load region size_region
;ER_IROM1 0x30800000 0x200000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_RAM1 0x31000000 0x04000000 { ; RW data
.ANY (+RW +ZI)
}
RW_IRAM1 0x40000000 0x00001000 {
.ANY (+RW +ZI)
}
}
这里是ini文件

FUNC void SetupForStart (void) {

// <o> Program Entry Point
PC = 0x30000000;
}


FUNC void Init (void) {

_WDWORD(0x4A000008, 0xFFFFFFFF); // Disable All Interrupts

_WDWORD(0x53000000, 0x00000000); // Disable Watchdog Timer

// Clock Setup
// FCLK = 300 MHz, HCLK = 100 MHz, PCLK = 50 MHz
_WDWORD(0x4C000000, 0x0FFF0FFF); // LOCKTIME
_WDWORD(0x4C000014, 0x0000000F); // CLKDIVN
_WDWORD(0x4C000004, 0x00043011); // MPLLCON
_WDWORD(0x4C000008, 0x00038021); // UPLLCON
_WDWORD(0x4C00000C, 0x001FFFF0); // CLKCON

// Memory Controller Setup for SDRAM
_WDWORD(0x48000000, 0x22000000); // BWSCON
_WDWORD(0x4800001C, 0x00018005); // BANKCON6
_WDWORD(0x48000020, 0x00018005); // BANKCON7
_WDWORD(0x48000024, 0x008404F3); // REFRESH
_WDWORD(0x48000028, 0x00000032); // BANKSIZE
_WDWORD(0x4800002C, 0x00000020); // MRSRB6
_WDWORD(0x48000030, 0x00000020); // MRSRB7

_WDWORD(0x56000000, 0x000003FF); // GPACON: Enable Address lines for SDRAM
}


// Reset chip with watchdog, because nRST line is routed on hardware in a way
// that it can not be pulled low with ULINK

_WDWORD(0x40000000, 0xEAFFFFFE); // Load RAM addr 0 with branch to itself
CPSR = 0x000000D3; // Disable interrupts
PC = 0x40000000; // Position PC to start of RAM
_WDWORD(0x53000000, 0x00000021); // Enable Watchdog
g, 0 // Wait for Watchdog to reset chip

Init(); // Initialize memory
LOAD C:\Users\NIMENG\Desktop\BOOT\out\BOOT.axf INCREMENTAL // Download program
SetupForStart(); // Setup for Running
g, main // Goto Main


请问那里问题该改里?能下载到开反板上一上电就能运行就可以
...全文
330 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
默寞 2012-11-26
  • 打赏
  • 举报
回复
代码没有看 不过你的加载文件定义代码是放在RAM中的,这样肯定不行。如果要下载到板子里运行就需要将代码放在Flash里。 这个是代码在Flash运行的加载文件,你参考一下:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; ***			Run program in flash	          		    ***
; *************************************************************

LR_ROM1 0x00000000   {    ; load region size_region
  ER_ROM1 0x00000000 0x00200000  {  ;2MB load address = execution address
   *.o (Init, +First)
;   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_RAM1 0x30000000 0x04000000  {  ; RW data
   .ANY (+RW +ZI)
  }
}
NM275490806 2012-11-26
  • 打赏
  • 举报
回复
引用 2 楼 net_friends 的回复:
编译正常 只是说明语法方面没问题 不能说明功能达到你的要求
这样子啊
net_friends 2012-11-26
  • 打赏
  • 举报
回复
编译正常 只是说明语法方面没问题 不能说明功能达到你的要求
NM275490806 2012-11-26
  • 打赏
  • 举报
回复
引用 4 楼 mome11 的回复:
代码没有看 不过你的加载文件定义代码是放在RAM中的,这样肯定不行。如果要下载到板子里运行就需要将代码放在Flash里。 这个是代码在Flash运行的加载文件,你参考一下: C/C++ code?123456789101112131415; *************************************************************; ……
肯定是启动程序没有改好!“给你两个建议: 1、你下载本论坛其他人发布的MDK的代码,你自己新建工程编译后烧写镜像看能不能启动,如果不能就是你的工程有问题(建议2就不用理会了),如果可以就是你的代码有问题,你就考虑一下建议2或者参考一下别人的代码。 2、将堆栈的位置改一下,不要放在开头”“”“”“”“”“”“” 这是别人说的! 唉!初学者咋样才能理解启动部分呢
NM275490806 2012-11-24
  • 打赏
  • 举报
回复
终于发出去了

6,125

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 硬件设计
社区管理员
  • 硬件设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧