- 爱易网页
 
                        - 
                            Linux
 
                        - ARM的第一个裸机程序,点亮LED灯遇到有关问题 
 
                         
                    
                    
                    日期:2014-05-16  浏览次数:20923 次 
                    
                        
                         ARM的第一个裸机程序,点亮LED灯遇到问题
在这里我真的没有浪费大家时间,我自己先找了好多问题,但是都没有解决。我的程序就是点亮mini2440板子上的LED灯,14灯和23灯交替闪烁,刚开始我自己写的代码不对,找不出毛病,我就试着把自带的代码一点一点拷过来,最后几乎全考过来了,但是就是不能正常运行,几乎和原来的一样,毛病就是只有13灯一直亮着,有时候只有3灯亮,运行一段时间后超级终端上会出现Failed initailizing heap region
Sorry. We can not run vivi的提示,但是运行自带的led灯裸机程序却没有这个问题,我把我的程序和mini2440的程序都贴出,可能是哪里我没有经验就看不到。
mini2440自带的程序:
#include "def.h"
#include "option.h"
#include "2440addr.h"      
#include "2440lib.h"
#include "2440slib.h"       
//================================
void dely(U32 tt)
{
    U32 i;
    for(;tt>0;tt--)
    {
      for(i=0;i<10000;i++){}
    }
}
     
int Main(int argc, char **argv)
{
	int i;
	U8 key;
	U32 mpll_val=0;
	int data;
    
	mpll_val = (92<<12)|(1<<4)|(1);
	
	//init FCLK=400M, so change MPLL first
	ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);
	ChangeClockDivider(key, 12);     
	//ChangeClockDivider(1,1);    // 1:2:4    FCLK:HCLK:PCLK
     // rCLKDIVN=0x4;    //  1:4:4
     //ChangeMPllValue(82,2,1);     //FCLK=135.0Mhz      
	//ChangeMPllValue(82,1,1);     //FCLK=180.0Mhz      
     //ChangeMPllValue(161,3,1);    //FCLK=202.8Mhz  
     //ChangeMPllValue(117,1,1);    //FCLK=250.0Mhz  
     //ChangeMPllValue(122,1,1);    //FCLK=260.0Mhz  
     //ChangeMPllValue(125,1,1);    //FCLK=266.0Mhz  
     //ChangeMPllValue(127,1,1);    //FCLK=270.0Mhz   
      
     //MMU_EnableICache();
     //MMU_EnableDCache();
      
     MMU_DisableICache();
     MMU_DisableDCache();
     rGPBCON = 0x155555;
     
     
    	data = 0x06;
    	while(1)
    	{
    		
    		rGPBDAT = (data<<5);
    		dely(120);
    		data =~data;
	}
     
    return 0;
}
我的程序
#include "def.h"
#include "option.h"
#include "2440addr.h"      
#include "2440lib.h"
#include "2440slib.h"
//#define GPBCON (*(volatile unsigned *)0x56000010)
//#define GPBDAT (*(volatile unsigned *)0x56000014)
//#define GPBUP (*(volatile unsigned *)0x56000018)
void delay(unsigned int dly);
int Main()
{	
	U32 mpll_val=0;
	U8 key;
	int data;
	
	mpll_val = (92<<12)|(1<<4)|(1);
	
	ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);
	ChangeClockDivider(key, 12);     
	
	//ChangeClockDivider(1,1);    // 1:2:4    FCLK:HCLK:PCLK
     // rCLKDIVN=0x4;    //  1:4:4
     //ChangeMPllValue(82,2,1);     //FCLK=135.0Mhz      
	//ChangeMPllValue(82,1,1);     //FCLK=180.0Mhz      
     //ChangeMPllValue(161,3,1);    //FCLK=202.8Mhz  
     //ChangeMPllValue(117,1,1);    //FCLK=250.0Mhz  
     //ChangeMPllValue(122,1,1);    //FCLK=260.0Mhz  
     //ChangeMPllValue(125,1,1);    //FCLK=266.0Mhz  
     //ChangeMPllValue(127,1,1);    //FCLK=270.0Mhz   
      
     //MMU_EnableICache();
     //MMU_EnableDCache();
     MMU_DisableICache();
     MMU_DisableDCache();
	
  // 	rGPBCON=0x15400;  先使用上拉电阻试试
	rGPBUP=0xfff;
	
	
	
	
      
      
/*	while(1)
	{
		delay(400);