第一步:查看开发板电路原理图
找到LED 的管脚所对应的寄存器
nLED_1 - GPK4
nLED_2 - GPK5
nLED_3 - GPK6
nLED_4 - GPK7
由原理图可知LED对应的寄存器为GPK寄存器,由二极管的特性可知当LED_n为低电平时LED灯亮
第二步:查看数据手册找到GPK寄存器的地址及每位表示的意义
Register Address
GPKCON0 0x7F008800
GPKCON1 0x7F008804
GPKDAT 0x7F008808
GPKPUD 0x7F00880C
通过数据手册知道GPK寄存器有两个控制寄存器(GPKCON0和GPKCON1)和一个数据寄存器(GPKPDAT)
[GPK0 GPK1 GPK2 GPK3 GPK4 GPK5 GPK6 GPK7] 在GPKCON0中每4位表示一个GBKn(0<=n<=7)
[GPK8 GPK9 GPK10 GPK11 GPK12 GPK13 GPK14 GPK15] 在GPKCON1中每4位表示一个GBKn(8<=n<=15)
第三步:设置寄存器的值
由第一步可知主要用到的管脚为GPK4、GPK5、GPK6、GPK7
由第二步可知GPK[4-7]有GPKCON0 控制
1)将管脚设置为输出
LED作为显示是属于输出由数据手册可知(0000 = Input 0001 = Output)故只要讲GPKn对应的4位设置为0001即表示输出
2)将管脚的值设为低电平
LED的数据寄存器为GPKDAT,由数据手册关于GPKDAT的介绍就可知GPKDAT第n位的值即表示GPKn(0<=n<=15)的电平状态(一般都是0表示低电平,1表示高电平)
第四步:编写代码
1)关看门狗
通过数据手册找到看门狗的控制寄存器地址
Register Address
WTCON 0x7E004000
2)设置控制寄存器(GPKCON0)的值
3)设置数据寄存器(GPKDAT)的值
第五步:编写Makefile
led.bin: start.o main.o
arm-linux-ld -Ttext 0x50000000 -o led.elf $^
arm-linux-objcopy -O binary led.elf led.bin
arm-linux-objdump -D led.elf > led_elf.dis
%.o : %.S
arm-linux-gcc -o $@ $< -c
%.o : %.c
arm-linux-gcc -o $@ $< -c
clean:
rm *.o *.elf *.bin *.dis -rf
Makefile Code
第六步:在虚拟机Linux环境下编译生成.bin文件
第七步:将上一步生成的.bin文件烧写到开发板上运行
代码实现:
汇编版:
.global _start
_start:
//关闭看门狗,防止不断重启
ldr r0,= 0x7E004000 //;将看门狗寄存器的地址赋给r0
mov r1,# //;将r1赋值为0
str r1, [r0] //;将r1的值装载到r0寄存器中
//;即将地址为0x7E004000的寄存器的值赋值为0
//设置GPKCON0寄存器
ldr r0, =0x7E008800 //;将GPKCON0寄存器的地址赋值为r0
ldr r1, =0x11110000 //;转换为0001,0001,0001,0001,0000,0000,0000,0000
str r1, [r0] //;即将 GPK7,GPK6,GPK5,GPK4 赋值设置成为输出 mov r2, #0x1000
led_blink:
//设置GPKDAT寄存器 使GPK4-GPK7引脚输出低电平,LED亮
ldr r0, =0x7F008808 //;将GPKDAT寄存器的地址赋值为r0
mov r1, #
str r1, [r0]
//延时
bl delay //设置GPKDAT寄存器 使GPK4-GPK7引脚输出高电平,LED灭
ldr r0, =0x7F008808 //;将GPKDAT寄存器的地址赋值为r0
mov r1, #0x00f0
str r1, [r0]
//延时
bl delay sub r2 ,r2 ,# //;表示r2=r2-1
cmp r2, # //;将r2和0比较
bne led_blink //;如果r2!=0 则跳转到 led_blink处执行 halt:
b halt //;死循环 delay:
mov r0, #0x1000000 delay_loop:
cmp r0,#;
sub r0, r0, #
bne delay_loop
mov pc, lr
汇编 Code
C语言版:
//start.S
.global _start
_start:
//关看门狗
ldr r0, =0x7E004000
mov r1, #
str r1, [r0] // 设置堆栈
ldr sp,=0xC002000 //SRAM 的映射地址是0X0C000000 //调用点灯函数
bl main
halt:
b halt //////////////////////////
//Tiny6410Addr.halt
#ifndef _Tiny6410Addr_H
#define _Tiny6410Addr_H
//GPK
#define GPKIO_BASE (0x7F008800)
#define rGPKCON0 (*(volatile unsigned long*)(GPKIO_BASE+0x00))
#define rGPKDAT (*(volatile unsigned long*)(GPKIO_BASE+0x08)) #endif ///////////////////
//led.c
#include "Tiny6410Addr.h"
#define GPK4_OUT (1<<4*4)
#define GPK5_OUT (1<<4*5)
#define GPK6_OUT (1<<4*6)
#define GPK7_OUT (1<<4*7)
//延时函数
void delay()
{
volatile int i = 0x10000;
while (i--);
} int main()
{
unsigned int i = 0x10;
//将GPK4-7设置为输出
rGPKCON0 = GPK4_OUT | GPK5_OUT |GPK6_OUT |GPK7_OUT;
//跑马灯式
while ()
{
rGPKDAT = i;
i++;
if(i == 0x100)
i=0x10;
delay();
} return ;
}
C Code