Ⅰ S3C2410A复位后执行的第一条指令存放首地址是什么
下面是我个人的一点认知,希望对你有帮助。
1、从nor flash启动则存在地址0x00000000,也就是说要用FLASH做程序启动,FLASH必须放BANK0,且地址从0x0开始,你可以直接在nor flash 中运行程序,也可把程序用自己写在启动代码拷入SDRAM运行。
2、若从NAND FLASH启动,则存放在NAND FLASH的开始区域,上电后系统会硬拷贝到内部的4KBRAM运行。
下面是我写的一个直接从nor启动的程序代码:
只有init.s与led.c两个文件,我调试过,运行正常
ADS环境参数设置中把:RO-BASE设为0x00000000,RW-BASE设为0x30000000(根据具体硬件来定)
image entry point 设为:0x00000000,
设置好的合令为:-info totals -entry 0x00000000 -ro-base 0x00000000 -map -symbols -rw-base 0x31000000 -first init.o(Init) -xref
init.s文件内容:
AREA Init,CODE,READONLY ;该伪指令定义了一个代码段,段名为Init,属性只读
ENTRY ;程序的入口点标识
ResetEntry
ldr sp,=0x31000000 ;定义堆栈指针(根据具体硬件来定)
IMPORT Main ;声明主函数Main
BL Main ;调用主函数
END ;程序结束符
led.C代码:
/*led.c*/
/*用GPB5~GPB8控制四个发光二极管闪烁*/
#define GPBCON (*(volatile unsigned *)0x56000010) //Port B control
#define GPBDAT (*(volatile unsigned *)0x56000014) //Port B data
#define GPBUP (*(volatile unsigned *)0x56000018) //Pull-up control B
void Main(void)
{
int i;
GPBCON &= ~((0x3<<10) | (0x3<<12) | (0x3<<14) | (0x3<<16
GPBCON |= (0x1<<10) | (0x1<<12) | (0x1<<14) | (0x1<<16); //GPBCON=0x00015400;
while (1)
{
GPBDAT=0x061F;
for(i=0;i<10000;i++);
GPBDAT=0x07FF;
for(i=0;i<10000;i++);
}
}
Ⅱ S3C2410串口中断代码
手册上那样说是没错的,虽然从数字逻辑上来说是一样,但是有这个操作之后,硬件会有动作的,你可以试试嘛,那个语句之后再查查那个寄存器(用中断或者串口打到电脑,都简单,多试试)。 intpnd的还是跟上面说的一样,赋0不变,赋1清除,...