首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

ARM的第一个裸机程序,点亮LED灯遇到有关问题

2012-02-15 
ARM的第一个裸机程序,点亮LED灯遇到问题在这里我真的没有浪费大家时间,我自己先找了好多问题,但是都没有解

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);
GPBDAT&=~0x20;
delay(400);
GPBDAT|=0x20;
GPBDAT&=~0x40;
delay(400);


GPBDAT|=0x40;
GPBDAT&=~0X80;
delay(400);
GPBDAT|=0x80;
GPBDAT&=~0x100;
delay(400);
GPBDAT|=0x100;
}

 return 0;
}*/


 data = 0x06;
  while(1)
  {
 
  rGPBDAT = (data<<5);
  delay(120);
  data =~data;
}
   
  return 0;
}


void delay(unsigned int dly)
{
unsigned int x,y,j;
for(x=0;x<112;x++);
for(y=0;y<112;y++);
for(j=0;j<dly;j++);
}

我的QQ号,694231918,邮箱 694231918@qq.com 希望有时间的就帮我看看,小弟感激不尽。

[解决办法]
这个延时显然有问题:
void delay(unsigned int dly)
{
unsigned int x,y,j;
for(x=0;x<112;x++); 去掉最后这个分号
for(y=0;y<112;y++); 去掉最后这个分号
for(j=0;j<dly;j++);
}
这是依次作3个循环,估计没什么延时效果。而且dly参数起的作用也不对。
应该去掉两个分号,改成3层循环

热点排行