⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s3c44b0x启动代码分析.txt

📁 ARM下UBOOT引导程序是如何引导加载程序的, 1.如何编译和调试主程序 2.如何使中断跳到RAM中的中断服务程序执行 3.如何把引导程序和主程序写入FLASH中.
💻 TXT
📖 第 1 页 / 共 2 页
字号:
            #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 
            &nbsp&nbsp #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); 
            &nbsp&nbsp void PortInit(void);
            void LedDisp(int LedStatus); 
            &nbsp&nbsp //*****************************************
            //    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     }
            } 
            &nbsp&nbsp 
            //*****************************************
            //    init the port
            //*****************************************
            void PortInit(void)
            { 
            &nbsp&nbsp   rPDATC = 0xffff;    //All IO is high
              rPCONC = 0x0f55ff54;  
              rPUPC = 0x3000;    //PULL UP RESISTOR should be enabled to I/O
            } 
            &nbsp&nbsp //*****************************************
            //    light led
            //*****************************************
            void LedDisp(int LedStatus)
            {
              if((LedStatus&0x01)==0x01)
                rPDATC &= (~LED_PORTC10);  //LED ON
              else
                rPDATC |= LED_PORTC10;    //LED OFF
              
              if((LedStatus&0x02)==0x02)
                rPDATC &=(~LED_PORTC11);  //LED ON
              else
                rPDATC |=LED_PORTC11;    //LED OFF
            } 
            &nbsp&nbsp //*****************************************
            //    show the flash soft id
            //*****************************************
            void infoFlash()
            {
              int i,j;
              INT16U *pFlash;
              *((volatile INT16U *)FLASH_START_ADDR)=FLASH_SID_EXIT;
              *((volatile INT16U 
            *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_UNLOCK1;
              *((volatile INT16U 
            *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK2)=FLASH_DATA_UNLOCK2;
              *((volatile INT16U 
            *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_SID_QUERY; 
              for(i=0;i   pFlash=FLASH_START_ADDR;
              i=0;j=0;
              i=(INT16U)*pFlash++;
              j=(INT16U)*pFlash;   
            }
            //*****************************************
            //    erase hold flash
            //*****************************************
            int eraseChip()
            {
              *((volatile INT16U *)FLASH_START_ADDR)=FLASH_SID_EXIT;
              *((volatile INT16U 
            *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_UNLOCK1;
              *((volatile INT16U 
            *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK2)=FLASH_DATA_UNLOCK2;
              *((volatile INT16U 
            *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_ERASE; 
              *((volatile INT16U 
            *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_UNLOCK1;
              *((volatile INT16U 
            *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK2)=FLASH_DATA_UNLOCK2;
              *((volatile INT16U 
            *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_ERASE_CHIP;
              if( wait_flash_ready((INT16U *)FLASH_START_ADDR,0xffff) )
               return 1;
              else return 0;
            } 
            &nbsp&nbsp //*****************************************
            //    write one falsh word( 16bit)
            //*****************************************
            int writeFlash(INT16U *Address,INT16U Data)
            {  *((volatile INT16U *)FLASH_START_ADDR)=FLASH_SID_EXIT;
              *((volatile INT16U 
            *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_UNLOCK1;
              *((volatile INT16U 
            *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK2)=FLASH_DATA_UNLOCK2;
              *((volatile INT16U 
            *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_WRITE; 
              *Address=Data;
              if(wait_flash_ready(Address,Data))
               return 1;
              else return 0;
            } 
            &nbsp&nbsp //*****************************************
            //    wait for operation finish
            //*****************************************
            int wait_flash_ready ( INT16U *address, INT16U data )
            {
              INT32U tmp;
              INT16U *p;
              tmp =0xff;
              p=address;
              while(((*p)&0x8080)!=(data&0x8080))
              {tmp--;
               if (tmp==0x0)
                 return 1; // timeout
              }
              return 0;
            } 


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -