二.mini2440点亮流水灯

版权声明:wahahaguolinaiyou https://blog.csdn.net/wahahaguolinaiyou/article/details/89225539

6.开始写第一个裸机程序—LED程序
编写led_on.c程序,还需要编写一段汇编程序start.s来调用C程序。Start.s做了什么工作?
设置堆栈,调用C函数并保存返回地址。
在这里插入图片描述
ldmia ,stmdb批量操作数据。

7.C程序内部机制
在这里插入图片描述
调用者传参给被调用者或者返回参数都是用寄存器r0-r3,
在这里插入图片描述
用到谁就保存谁.
在这里插入图片描述
传参直接在汇编中调用函数前面写数据
在这里插入图片描述
使用volatile拒绝编译器优化这个参数。
在这里插入图片描述
注意:norflash是不可以写的,监测nor启动还是nand启动,往0地址处写0,如果读出来是0,则说明硬盘被修改了,是nand启动,如果不是0,则是nor启动。

8.编写按键控制LED的程序
思想:查看按键原理图的引脚位置,找到相应的寄存器地址,然后按键是输入数据到CPU,所有配置模式为输入模式,然后CPU判断输入的是什么数据,当读到按键的数据后,向led引脚发送低电平点亮LED。----mini2440实现

附代码:

/*汇编源程序start.s,为C函数设置堆栈,调用C函数*/
.text

.global _start

_start:



	/*设置内存:sp栈*/

	ldr sp,=4096  /*nand启动时,0地址处是4K的片内内存,它会映射到0地址,设置为4K的顶部(栈可能是满减栈)*/

	// ldr sp,=0x40000000 + 0x4096  /*nor启动*/



	/*调用main函数*/

	bl main

	

halt:

	b halt  /*加一个死循环*/
 
 /*led_on.c*/
#include<stdio.h>

int main()

{

	unsigned int *pGPBCON = (unsigned int *)0x56000010;

	unsigned int *pGPBDAT = (unsigned int *)0x56000014;

	

	*pGPBCON = 0x400;

	*pGPBDAT = 0x0;

	

	return 0;

}


/*Makefile--连接地址从0开始*/

all:

	arm-linux-gcc -c -o led_on.o led_on.c

	arm-linux-gcc -c -o start.o start.S 

	arm-linux-ld -Ttext 0 start.o led_on.o -o led.elf

	arm-linux-objcopy -O binary -S led.elf led.bin



clean:

	rm *.o *.bin *.elf

	

猜你喜欢

转载自blog.csdn.net/wahahaguolinaiyou/article/details/89225539