用mini2440开发板做一个LED灯间隔亮与灭的程序,但是达不到实验效果,求解!

kedazhizi 2012-12-24 04:34:20
起始段汇编代码,在led.s文件中
/*the file function is jump to c program*/
.text
.global _start
_start:
ldr r0, =0x53000000 /*watch dog resgister*/
mov r1, #0x0
str r1, [r0] /*turn off watch dog*/

ldr sp, =1024*4 /*set the stack*/
bl main /*jump to c program*/
halt_loop:
b halt_loop

main函数实现led灯的亮与灭,在led.c文件中

#define rGPBCON (*(volatile unsigned long *) 0x56000010)
#define rGPBDAT (*(volatile unsigned long *) 0x56000014)
void Led_port_init(void);
#define LED1_ON ~(1<<5)
#define LED2_ON ~(1<<6)
#define LED3_ON ~(1<<7)
#define LED4_ON ~(1<<8)
#define LED1_OFF (1<<5)
#define LED2_OFF (1<<6)
#define LED3_OFF (1<<7)
#define LED4_OFF (1<<8)
/*************************************************
Function name: delay
Parameter : times
Description : 延时函数
Return : void
Argument : void
Autor & date :
**************************************************/
void delay(int times)
{
int i;
for(;times>0;times--)
for(i=0;i<400;i++);
}
/*************************************************
Function name: Main
Parameter : void
Description : 主功能函数
Return : void
Argument : void
Autor & date :
**************************************************/
int main(void)
{
int i;
Led_port_init();

for(i=0;i<100;i++)
{
/* 全亮*/
rGPBDAT = rGPBDAT&(LED1_ON)&(LED2_ON)&(LED3_ON)&(LED4_ON);

delay(10000);

/* 全灭*/
rGPBDAT = rGPBDAT|(LED1_OFF)|(LED2_OFF)|(LED3_OFF)|(LED4_OFF);

delay(10000);
}
}
/*************************************************
Function name: Led_port_init
Parameter : void
Description : mini2440开发板有个引脚连接了LED发光
二极管,分别是GPB5--LED1,GPB6—LED2
GPB7--LED3,GPB8--LED4,该函数的作用
是对其个引脚进行初始化。
Return : void
Argument : void
Autor & date : Daniel
**************************************************/
void Led_port_init(void)
{
/*设置GPB5-GPB8为输出端口*/
rGPBCON &= ~((3<<10)|(3<<12)|(3<<14)|(3<<16));
rGPBCON |= (1<<10)|(1<<12)|(1<<14)|(1<<16);
}

makefile文件

led_on.bin : led.s led.c
arm-linux-gcc -c -o led0.o led.s
arm-linux-gcc -c -o led1.o led.c
arm-linux-ld -Ttext 0x0000000 led0.o led1.o -o led_on
arm-linux-objcopy -O binary -S led_on led_on.bin
arm-linux-objdump -D -m arm led_on > log
clean:
rm -f log led_on.bin led_on *.o

能够正确编译,就是不出实验结果。检查了好久都感觉没错,求大家的帮助!
...全文
661 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cwll888 2013-02-13
  • 打赏
  • 举报
回复
~多多学习 ~多多学习
rhythm92 2013-02-02
  • 打赏
  • 举报
回复
mark~多多学习
lr2131 2013-01-20
  • 打赏
  • 举报
回复
建议你把那个delay的延时参数调一下。我也遇到了类似的问题,在ARM9上用的飞凌的原版程序,发现就是有问题,也是和你一样的裸机程序。有汇编的基础,看了下代码,发现没问题,但效果就是很奇怪,结果调了下那个delay的参数就好了,也不知道是怎么回事,你试试吧。 要不想调参数给个好方法,连上调试器加断点,一步一步来查,如果再有万用表就更好了。程序不难,应该会很快找到问题的原因。
PIE 2013-01-18
  • 打赏
  • 举报
回复
多查下底板原理图和核心板原理图。
PIE 2013-01-18
  • 打赏
  • 举报
回复
是不是三星的s3c2440的开发板?我这有4Led流水灯
WIFI-Walker 2013-01-14
  • 打赏
  • 举报
回复
你这个是裸机程序吧,你最好运行程序时用万用表检测一下你开发板上要用的引脚的电平,这样子就可以知道是哪里出错了
porkGui 2013-01-14
  • 打赏
  • 举报
回复
void Led_port_init(void) { /*设置GPB5-GPB8为输出端口*/ rGPBCON &= ~((3<<10)|(3<<12)|(3<<14)|(3<<16)); rGPBCON |= (1<<10)|(1<<12)|(1<<14)|(1<<16); } 我感觉是这个函数错了! 我以前用过6410的,应该差不多,刚才回顾了下6410的datasheet,感觉你这个设置有点问题。你试下下面的 rGPBCON &= ~(0xffff0000);//先把5--8的端口清零;感觉你这一步错了! rGPBCON |= (0x11110000); //再把他们设置为输出;

1,318

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧