|
您好!我这几天也在准备从汇编开始自己写程序,但是我想提一点疑问好吗?
1:C语言室需要堆栈的,你这里首先没有设置SP
2:你这里是应用的NADNFLASH的前4K自动映射为SDRAM
3:我自己也打算这样简化,我设置好SP能到Main中执行点亮一个LED,但是我完成流水灯就不行了。
你可以吧你的代码这样弄弄试试,最好是下载到NANDFlash中,看看能不能正常跑起来。
-----------------------------------------------------------------------------------------------------------------
以下是我的代码:
汇编文件:
WTCON EQU 0x53000000 ;Watch-dog timer mode
INTSUBMSK EQU 0x4a00001c ;Interrupt sub mask
INTMSK EQU 0x4a000008 ;Interrupt mask control
CODE32
IMPORT Main ; The main entry of mon program
AREA Init,CODE,READONLY
ENTRY
ldr r0,=WTCON ;watch dog disable
ldr r1,=0x0
str r1,[r0]
ldr r0,=INTMSK
ldr r1,=0xffffffff ;all interrupt disable
str r1,[r0]
ldr r0,=INTSUBMSK
ldr r1,=0x7fff ;all sub interrupt disable
str r1,[r0]
ldr sp,=0x1000
bl Main
END
c文件:
这种情况能跑起来:
#define GPBCON (*(volatile unsigned long *)0x56000010)
#define GPBDAT (*(volatile unsigned long *)0x56000014)
int Main()
{
GPBCON = 0x00000400; // 设置GPB5为输出口, 位[11:10]=0b01
GPBDAT = 0x00000000; // GPB5输出0,LED1点亮
return 0;
}
这种情况中间会跑步起来,但是后面会跑到
#define IO_CON_BASE 0x56000000
#define IO_DAT_BASE 0x56000004
#define GPBCON (*(volatile unsigned long *)0x56000010)
#define GPBDAT (*(volatile unsigned long *)0x56000014)
#define GPB5_out (1<<(5*2))
#define GPB6_out (1<<(6*2))
#define GPB7_out (1<<(7*2))
#define GPB8_out (1<<(8*2))
#define GPIO_CFG_SET(group,index,type) do{\
(*(volatile unsigned int*)(IO_CON_BASE+group*0x10))&=~(0x3<<(index<<1));\
(*(volatile unsigned int*)(IO_CON_BASE+group*0x10))|=(type<<(index<<1));\
}while(0)
#define GPIO_DAT_SET(group,index,val) do{\
(*(volatile unsigned int*)(IO_DAT_BASE+group*0x10))&=~(0x1<<index);\
(*(volatile unsigned int*)(IO_DAT_BASE+group*0x10))|=(val<<index);\
}while(0)
void GPIO_CONF_SET(unsigned int group,unsigned int index,unsigned int type)
{
unsigned int *p_add=NULL;
unsigned int addr = IO_CON_BASE + (group*0x10);
unsigned int io_reg = type<<(index<<1);
p_add=(unsigned int *)(addr);
*p_add=*p_add&~(0x3<<(index<<1));
*p_add=*p_add|io_reg;
}
void GPIO_OUT_PUT(unsigned int group,unsigned int index,unsigned int outval)
{
unsigned int *p_add=NULL;
unsigned int addr = IO_DAT_BASE + (group*0x10);
unsigned int io_reg = outval<<index;
p_add=(unsigned int *)(addr);
*p_add=*p_add&~(0x1<<index);
*p_add=*p_add|io_reg;
}
void wait(unsigned long dly)
{
for(; dly > 0; dly--);
}
void LED_Test(void)
{ GPIO_CFG_SET(1,5,1);
GPIO_CFG_SET(1,6,1);
GPIO_CFG_SET(1,7,1);
GPIO_CFG_SET(1,8,1);
GPIO_DAT_SET(1,5,1);
wait(100000);
GPIO_DAT_SET(1,6,1);
wait(100000);
GPIO_DAT_SET(1,7,1);
wait(100000);
GPIO_DAT_SET(1,8,1);
wait(100000);
GPIO_DAT_SET(1,5,0);
wait(100000);
GPIO_DAT_SET(1,6,0);
wait(100000);
GPIO_DAT_SET(1,7,0);
wait(100000);
GPIO_DAT_SET(1,8,0);
wait(100000);
}
int Main(void)
{
GPBCON = 0x00000400;
GPBDAT = 0x00000000; // 这里能跑到
LED_Test(); //这里灯不亮 -------这个函数是能运行的,我在用TQ2440自带的Init.s 能跑起来
GPBDAT = 0xaaaaaa; //这里也能亮
}
往高手帮忙解开一下疑惑 |
|