1. 修改leds.c
使用的是FL2440,这个开发板gpio对应的LED与mini2440有点差异,为了跑马灯,只好封装了一些宏。
有几点注意:
1. 采用虚拟地址访问寄存器,将0x56000000->0xA0000000
2. wait函数使用内联,目的是将main的地址编译后指向0xb0004000
3. Makefile中需要配合-O选项与函数的内联申明才能真正实现内联。
4. 2440没有开启PLL,默认时钟为12MHz, wait函数的软延迟并不精确。
-
/*
-
* leds.c: 循环点亮4个LED
-
* 属于第二部分程序,此时MMU已开启,使用虚拟地址
-
*/
-
-
#define GPBCON (*(volatile unsigned long *)0xA0000010)
-
#define GPBDAT (*(volatile unsigned long *)0xA0000014)
-
-
//#define GPBCON (*(volatile unsigned long *)0x56000010)
-
//#define GPBDAT (*(volatile unsigned long *)0x56000014)
-
-
#define GPB5_out (1<<(5*2))
-
#define GPB6_out (1<<(6*2))
-
#define GPB8_out (1<<(8*2))
-
#define GPB10_out (1<<(10*2))
-
-
#define LED0 5
-
#define LED1 6
-
#define LED2 8
-
#define LED3 10
-
-
#define __LED_OUT(led) do { GPBCON |= (1 << ((led)*2)); } while (0)
-
#define __LED_ON(led) do { GPBDAT &= ~(1 << (led)); } while (0)
-
#define __LED_OFF(led) do { GPBDAT |= (1 << (led)); } while (0)
-
#define __LED_IS_OFF(led) (GPBDAT & (1 << (led)))
-
-
-
/*
-
* wait函数加上“static inline”是有原因的,
-
* 这样可以使得编译leds.c时,wait嵌入main中,编译结果中只有main一个函数。
-
* 于是在连接时,main函数的地址就是由连接文件指定的运行时装载地址。
-
* 而连接文件mmu.lds中,指定了leds.o的运行时装载地址为0xB4004000,
-
* 这样,head.S中的“ldr pc, =0xB4004000”就是跳去执行main函数。
-
*/
-
-
static inline void wait(unsigned long dly)
-
{
-
for(; dly > 0; dly--);
-
}
-
-
int main(void)
-
{
-
unsigned cnt = 0, i, led[] = {LED0, LED1, LED2, LED3};
-
-
for (i = 0; i < 4; ++i) {
-
__LED_OUT(led[i]);
-
__LED_OFF(led[i]);
-
}
-
-
while (1) {
-
wait(100000);
-
if (++cnt == 16)
-
cnt = 0;
-
for (i = 0; i < 4; ++i) {
-
if (cnt & (1 << i))
-
__LED_ON(led[i]);
-
else
-
__LED_OFF(led[i]);
-
}
-
}
-
-
return 0;
-
}
2. 修改Makefile
-
objs := head.o init.o leds.o
-
-
mmu.bin : $(objs)
-
arm-linux-ld -Tmmu.lds -o mmu_elf $^
-
arm-linux-objcopy -O binary -S mmu_elf $@
-
arm-linux-objdump -D -m arm mmu_elf > mmu.dis
-
-
%.o:%.c
-
arm-linux-gcc -Wall -O -c -o $@ $<
-
-
%.o:%.S
-
arm-linux-gcc -Wall -O -c -o $@ $<
-
-
clean:
-
rm -f mmu.bin mmu_elf mmu.dis *.o
示例代码中使用-O2的选项,优化过头了,导致跑马灯跑不起来。另外wait函数的软延迟也不精确。后续学到时钟和中断的时候,可以改成硬延迟。
阅读(1714) | 评论(0) | 转发(0) |