您的位置 首页 分销

第3课: 点亮开发板led灯

我们学习的是ARM周边外设的控制,但外设有很多我们写的程序分成2种:无操作系统的直接驱动有操作系统的写出设备驱动以下介绍下主要的设备:…

咱们学习的是ARM周边外设的操控,但外设有许多

咱们写的程序分红2种:

无操作系统的直接驱动

有操作系统的写出设备驱动

以下介绍下首要的设备:

1外部存储操控器 发送杂乱的时序信号来操控SDRAM,有了它就比较便利扩展SDRAM

2LCD controller 作业在800X480

3 4个DMA通道 3个串口通道

4 2个SPI 串行数据接口(咱们的板子无) IIC总线(板子上无)

5 2种音频总线IIS音频与AC97音频

6支撑SD MMC

7 2个USB接口,1个USB操控器

8 4个PWM定时器,1个内部定时器,看门狗定时器

9 8个10bit的ADC模拟信号转化

10 RTC日历功用

11 camera 功用

12 130个i/o管脚 24个外部中止源

13电源操控(normal slow idle slepp )

14咱们板子上有独立网卡芯片操控RJ45

2440比2410多了camera与ac97

cp15操控MMU和cache

AHB高速设备

============

APB低速设备

2440内部有个功用能够独自封闭某个外设

咱们是经过操控特别的寄存器来操控外设的。

下面来看第一个 130个I/O管脚(pin)

共有9组 从GPA到GPJ(见数据手册274页)

有9个装备寄存器GPACON~GPJCON

有9个内容寄存器GPADAT~GPJDAT

咱们写的led灯是GPE12和GPE13这2个引脚操控的两个灯。

依据数据手册来看,CPECON操控的引脚是能够复用的,东西GPECON中设置的值来改动它的功用,它能够是I/O port功用也能够是其他功用。

在这儿咱们要点亮灯,就要让GPECON设置到out port。然后改动CPEDAT中的数据到0.能够点亮灯。当GPEDAT中的呼应位为方位时,由于和高位发生电压差然后发生电流,点亮灯泡。假如要熄灭灯的话,就把GPEDAT相应方位1.

以下用汇编和C各写一个LED2个灯闪耀的驱动。

.text
.global _start
delay:@这个是推迟程序,闪耀傍边的距离
nop
nop
nop
subs r4,r4,#1
bne delay
movpc,lr

_start:
ldr r0,=0x56000040 @r0 = GPECONs address
ldr r1,=0x5000000
str r1,[r0] @set GPECON register
ldr r0,=0x56000044 @r0 = GPEDATs address

movr2,#10 @set the times of loop
ldr r3,=0x3000 @r3 is the mask to turn off led
mov r1,#0
loop:
strr1,[r0] @亮灯,把GPEDAT相应方位0
ldrr4,=0x500000
bldelay

strr3,[r0] @灭灯,把相应方位1
ldrr4,=0x500000
bldelay

subsr2,r2,#1
bneloop

haltloop: @假如程序不在最终一向循环的话将不能履行
bhaltloop

接下来便是写makefile

light.bin:light.o//要编译成light。bin 需求依靠.o
arm-linux-ld -Ttext 0x00000000 light.o -o light.elf //咱们这儿不写衔接文件,而是用Ttext的方式,指定程序开端的段(text)
arm-linux-objcopy -O binary -S light.elf light.bin//把elf文件转化成2进制文件。正真的作用是定位地址和引进符号表。
arm-linux-objdump -D -b binary -m arm light.bin >light.dis //把light.bin反汇编,也能够把light.elf反汇编

light.o:light.s
arm-linux-gcc -c light.s -o light.o
clean:
rm -f light.o light.elf light.bin light.dis

之后我运用openjtag仿真枪,经过jtag口烧入内存0x0(由于衔接文件定的进口在那)当然也能够经过网络下载等其他办法烧写内存SDRAM,不过没有jtag给力 =。=!。记住烧写的时分用arm920t cp15 2 0把mmu和i-cache关了,这个东西的运用件运用手册。

之后给出C程序的代码。C写起来比较便利。建议用C。咱们写.h .c .s .lds makefile5个文件。其间crt0.s是用来引进C程序的。

.text
.globl _start
_start:
ldrr0, =0x53000000 @ WATCHDOG close
movr1, #0x0
strr1, [r0]
ldr sp, =1024*4 @set stack,but the capitcy of cache is only 4k

bl main @跳转到C的main符号进口
halt_loop:
b halt_loop

之后写头文件

#define GPECON (*(volatile unsigned int *)0x56000040) @volatile是用来让编译器不编译GPECON寄存器的,以免它被最初常量,它可是会改变的需求一向从寄存器中读取。
#define GPEDAT (*(volatile unsigned int *)0x56000044)

#define GPE12_out (1<<(12*2))
#define GPE13_out (1<<(13*2))

之后便是C文件

#include”led.h”
void wait(int time)
{
do{
time–;
}
while(time>0);
}

int main()
{
int i=10;
GPECON = GPE12_out|GPE13_out;
do{
GPEDAT = 0;
wait(300000);
GPEDAT = (3<<12);
wait(300000);
i–;}
while(i>0);
return 0;
}

主程序写完后,开端写衔接脚本lds文件。

SECTIONS {
. = 0x00;//从0x00开端作为进口
.text : { *(.text) }//段称号起名.text 内容是 一切的.text段
.rodata ALIGN(4) : {*(.rodata)}// ALIGN(4)4字节对齐
.data ALIGN(4) : { *(.data) }
.bss ALIGN(4) : { *(.bss) *(COMMON) }
}

来看下makefile

CFLAGS := -Wall -Wstrict-prototypes -g -fomit-frame-pointer -ffreestanding
led.bin:led.elf
arm-linux-objcopy -O binary -S led.elf led.bin
arm-linux-objdump -D -m arm led.elf > led.dis
led.elf:led.o crt0.o
arm-linux-ld -Tleds.lds crt0.o led.o -o led.elf
led.o:led.c led.h
arm-linux-gcc $(CFLAGS) -c led.c -o led.o
crt0.o:crt0.s
arm-linux-gcc $(CFLAGS) -c crt0.s -o crt0.o
clean:
rm -f led.bin led.dis led.elf led.o crt0.o

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/fenxiao/274786.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部