×
单片机 > 单片机程序设计 > 详情

MINI2440裸机流水灯

发布时间:2021-12-29 发布时间:
|

概述

流水灯是每个嵌入式开发者接触到一款新的控制器时最先实现的程序,本文记录了在友善之臂MINI2440平台上实现流水灯的过程。


实现原理

通过查看友善之臂提供的MINI2440原理图我们可以知道,MINI2440开发板上四个LED为共阳极接法,四个LED的N极与S3C2440的连接关系如下:


LED1 >> GPB5

LED2 >> GPB6

LED3 >> GPB7

LED4 >> GPB8


当上述4个IO端口输出低电平时即可点亮对应的LED灯。


编写程序及Makefile

我们知道,S3C2440内部具有4KB的SRAM,当从NOR Flash启动时,这部分区域的起始地址为0x40000000,本次实验将使用内部SRAM作为程序存储空间,具体使用方法将在下文进行说明。


通过阅读S3C2440芯片的数据手册我们可以知道,GPB控制寄存器共三组,分别为GPBCON、GPBDAT、GPBUP,他们的地址及作用说明如下

寄存器内部详细信息这里不再列出,可参考数据数据手册进行查看。


根据寄存器功能编写源码,命名为”led.c”,该段代码实现了一个简单的流水灯,代码如下:


/* led.c */

#define GPBCON (*(volatile unsigned long *)0x56000010)

#define GPBDAT (*(volatile unsigned long *)0x56000014)

#define GPBUP (*(volatile unsigned long *)0x56000018)


void delay(volatile unsigned long count)

{

while(count--);

}


int main(void)

{

volatile unsigned long i,value;

GPBCON = 0x00015400;

while(1)

{

value = 0xffffffdf;

for(i=0;i<4;i++)

{

GPBDAT = value;

delay(0x0000ffff);

value = (value<<1)|0x01;

}

}

return 0;

}


我们知道,ARM9系列处理器在上点之后通常需要关闭看门狗;在调用C语言函数前需要设置好堆栈指针。所以在执行main函数之前我们还需要完成上述这些工作,这里新建一个”start.S”汇编文件来完成以上工作,文件内容如下:


/* start.S */

.text

.global _start

_start:

ldr r0,=0x53000000

mov r1,#0x00

str r1,[r0] /* disable the watchdog timer */


ldr sp,=0x40000000+4096 /* set stack pointer */


b main


这里将堆栈指针设置为0x40000000+4096,即内部4KB SRAM的顶端,而上文说过我们将SRAM作为本次实验的程序存储空间,难道不会造成冲突吗?答案是不会。


我们从SRAM的起始地址开始存储我们的程序,从上文可以看出,本次实验的程序代码需要的程序存储空间非常之小,而堆栈指针指向SRAM的顶端,两者不会有任何的冲突。


编写好程序之后,我们便可以编译了,这里参照韦东山老师的《嵌入式Linux应用开发完全指南》编写了一个简易的Makefile,文件内容如下:


objs := start.o led.o


led.bin:$(objs)

arm-linux-ld -Ttext 0x40000000 -o led_elf $^

arm-linux-objcopy -O binary -S led_elf $@

arm-linux-objdump -D -m arm led_elf > led.dis

%.o:%.c

arm-linux-gcc -c -o $@ $<

%.o:%.S

arm-linux-gcc -c -o $@ $<

clean:

rm -f led_elf *.o


编写完成之后便可以将文件上传至虚拟机进行编译,编译完成之后将led.bin文件下载至win主机。


至此,我们便得到了一个可以执行的文件,下一步我们将把此文件上传至MINI2440并执行。


上传并执行

在这里使用JLINK来上传程序,正确安装JLINK软件后可以在开始菜单找到SEGGER文件夹。


将MINI2440调节至NOR flash启动模式后打开电源,将JLINK与MINI2440连接后连接至电脑,打开J-Link Commander,如果没有问题的话,可以看到命令行界面中输出了S3C2440芯片的一些信息。


在命令行中依次执行以下命令:


h

r

loadbin 2440/led/led.bin 0x40000000

setpc 0x40000000

g


以上命令具体含义可以参考J-Link Commander的帮助信息。


现在可以看到MINI2440上四个LED开始循环点亮了,流水灯实验完成。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中断向量表的位置.重定向