微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM无痛苦起步(S3C44B0X)

ARM无痛苦起步(S3C44B0X)

时间:11-20 来源:互联网 点击:

c200000  .. .  DCD  203423744
  0x0c000c84:  0c200000  .. .  DCD  203423744
  0x0c000c88:  0c200004  .. .  DCD  203423748
这些反汇编的代码是一个点led的程序的,可以看出我的小程序代码到0x0c000e10就结束了,0x0c200000是我指定的数据区起始地址。这段程序把|Image$$RO$$Limit| 开始的,长|Image$$ZI$$Base| -|Image$$RW$$Base| 的数据区拷到|Image$$RW$$Base|的对应单元,就是0x0c200000开始的一段ram中。后面还有|Image$$ZI$$Limit|,在我的代码中是0x0c000c88,内容是0x0c200004.这其实表明我的小程序并没有rw区,只有一个初始为0的变量。
  另外还有一段初始化ram控制器的代码:
  ;****************************************************
  ;*  Set memory control registers          
  ;****************************************************
  ldr    r0,=SMRDATA
  ldmia  r0,{r1-r13}
  ldr    r0,=0x01c80000 ;BWSCON Address
  stmia  r0,{r1-r13},
由于44b0x要求13个控制寄存器要一次完成填入,所以先把参数设定在SMRDATA的地址中,一次载入通用寄存器,在一次填入RAM控制寄存器中。4510的书上介绍调试前需要用SEMEM命令设置这些寄存器,但我自己没有那么做也可以跑的很好,也许是默认已经用了最保守的配置的原因吧!
  其余的代码解释比较清晰了,最后摘出我的LED程序和这个小程序的BOOT程序以及烧写程序。这几个程序的project都包括了44binit.s, option.s, memcfg.s,option.h,44b.h几个从app note中抄来的文件,这里只列了我自己写的主要c代码。其他这些文件我除了把ram和rom的对应配置改了一下外,都没有改动。我的引导程序编译出来是3k,led程序也是3k,因此我把他们分别定位在rom的0x0和0x2000处,一共写了8k。
LED程序中的44BINTT.S程序功能和LOAD中的44BINTT.S是重复的,主要是我懒得去修改这些汇编,由着他们占用一点时间吧!
  load程序负责把从0x20000处开始的4k程序(即led程序)拷到ram 0xc000000中,run函数把pc指到0x0c000000,开始执行led程序:
void (*Run)(void) = (void (*)(void))RAM_ADDR;
void Main(void)
{  INT32U k ;
  INT32U *pulSource = (INT32U*)0x2000,;
  INT32U *pulDest = (INT32U*)0x0c000000;
  rSYSCFG=CACHECFG;
  PortInit();  
  for(k=0;k<2000>     *pulDest++ = *pulSource++;  
  Run();  
}
led程序把两个通用io上连的led作不断的亮和灭:
void Main(void)
{  INT32U k ;
  //INT16U *ptr;
  rSYSCFG=CACHECFG;
  PortInit();  
  while(1)
  {
  LedDisp(0);
  for(k=0;k       LedDisp(3);  
  for(k=0;k     }
}
最后是烧写的程序,详细的代码网上高手们写了不少,我只是给出最简单的实现。烧写时当程序执行到清理完0X0C30_0000到0X0C30_4000的RAM后,让程序中断下来,通过LOAD MEMORY FORM FILE命令把LOAD.BIN导入0X0C30_0000,LED.BIN导入0X0C30_2000中,继续运行程序直到一个LED亮起,烧写就完成了。拔去仿真器后再上电,可以看到两个LED同时亮灭。
#i nclude "option.h"
#i nclude "44b.h"
#i nclude "def.h"
//#i nclude "romdef.h"
//#i nclude "stdio.h"
//#i nclude "stdlib.h"

#define FLASH_START_ADDR  0X0000
#define FLASH_ADDR_UNLOCK1 0X5555
#define FLASH_ADDR_UNLOCK2 0X2AAA
#define FLASH_DATA_UNLOCK1 0XAAAA
#define FLASH_DATA_UNLOCK2 0X5555
#define FLASH_DATA_WRITE  0XA0A0
#define FLASH_ERASE     0X8080
#define FLASH_ERASE_SECTOR 0X3030
#define FLASH_ERASE_BLOCK  0X5050
#define FLASH_ERASE_CHIP  0X1010
#define FLASH_SID_QUERY   0X9090
#define FLASH_CFI_QUERY   0X9898
#define FLASH_SID_EXIT   0XF0F0
#define FLASH_OP_TIMEOUT  0Xffff

#define LED_PORTC10   (1 #define LED_PORTC11    (1 #define RAM_ADDR     0xc000000
void (*Run)(void) = (void (*)(void))RAM_ADDR;
void infoFlash(void);
int wait_flash_ready ( INT16U *address, INT16U data );
int writeFlash(INT16U *Address,INT16U Data);
int eraseSector(INT16U* SectorAddr);
int eraseChip(void);

void PortInit(void);
void LedDisp(int LedStatus);

//*****************************************
//    FLASH WIRTING
//*****************************************
void Main(void)
{  INT32U k ;
  INT16U *pdist,*psrc;
  rSYSCFG=CACHECFG;
  PortInit();  
  //infoFlash();
  eraseChip();
  psrc="/blog/(INT16U" *)0xc300000;
  for(k=0;k<0x4000>   *psrc++=0x0; //clear ram
  psrc="/blog/(INT16U" *)0xc300000;
  pdist=(INT16U *)0x0;
  for(k=0;k<0x4000 k ram to>     writeFlash(pdist++,*psrc++);
  while(1)
  {
  LedDisp(0);
  for(k=0;k       LedDisp(2);  
  for(k=0;k     }
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top