关闭看门狗-简单版
查找芯片手册
我们发现watchdog在timer下
查找配置寄存器

找到我们的配置相关的寄存器信息
WTCON 0xE270_0000
在代码中定义
#define WTCON 0xE2700000关闭看门狗

// 定义看门狗设置寄存器
#define WTCON 0xE2700000
.global _start
_start:
// 关闭
ldr r0, =WTCON
ldr r1, =0x0
str r1, [r0]
加入led
寻找关于小灯的led配置
我们先到达外围板手册
看见了四个灯,我们可以随便挑选一个灯来实验,如GPJ0_3,但我们这次为了方便全部点亮,我们通过GPJ0 去看看手册相关
我们找到了相关描述
GPJ0CON 0xE020_0240
GPJ0DAT 0xE020_0244
开始定义
#define GPJ0CON 0xE0200240
#define GPJ0DAT 0xE0200244配置寄存器


我们把所有引脚都设置为输出模式
ldr r0, =0x11111111 // 从后面的=可以看出用的是ldr伪指令,因为需要编译器来判断这个数
ldr r1, =GPJ0CON // 是合法立即数还是非法立即数。一般写代码都用ldr伪指令
str r0, [r1] // 寄存器间接寻址。功能是把r0中的数写入到r1中的数为地址的内存中去
点亮小灯
//ldr r0, =((0<<3) | (1<<4) | (1<<5)) // 清清楚楚的看到哪个灭,哪个是亮
ldr r0, =~(1<<3)
ldr r1, =GPJ0DAT
str r0, [r1] // 把0写入到GPJ0DAT寄存器中,引脚即输出低电平,LED点亮熄灭小灯
//ldr r0, =((1<<3) | (1<<4) | (1<<5)) // 清清楚楚的看到哪个灭,哪个是亮
ldr r0, =~(0<<3)
ldr r1, =GPJ0DAT
str r0, [r1] // 把0写入到GPJ0DAT寄存器中,引脚即输出低电平,LED点亮实现流水灯1
这里我们需要定时来完成
加入一个定时
// 延时函数:函数名:delay
delay:
ldr r2, =9000000
ldr r3, =0x0
delay_loop:
sub r2, r2, #1 //r2 = r2 -1
cmp r2, r3 // cmp会影响Z标志位,如果r2等于r3则Z=1,下一句中eq就会成立
bne delay_loop
mov pc, lr // 函数调用返回实现流水灯2
flash:
// 第1步:点亮LED1,其他熄灭
//ldr r0, =((0<<3) | (1<<4) | (1<<5)) // 清清楚楚的看到哪个灭,哪个是亮
ldr r0, =~(1<<3)
ldr r1, =GPJ0DAT
str r0, [r1] // 把0写入到GPJ0DAT寄存器中,引脚即输出低电平,LED点亮
// 然后延时
bl delay // 使用bl进行函数调用
// 第2步:点亮LED2,其他熄灭
ldr r0, =~(1<<4)
ldr r1, =GPJ0DAT
str r0, [r1] // 把0写入到GPJ0DAT寄存器中,引脚即输出低电平,LED点亮
// 然后延时
bl delay // 使用bl进行函数调用
// 第3步:点亮LED3,其他熄灭
ldr r0, =~(1<<5)
ldr r1, =GPJ0DAT
str r0, [r1] // 把0写入到GPJ0DAT寄存器中,引脚即输出低电平,LED点亮
// 然后延时
bl delay // 使用bl进行函数调用
b flash最终代码
// 定义看门狗设置寄存器
#define WTCON 0xE2700000
#define GPJ0CON 0xE0200240
#define GPJ0DAT 0xE0200244
.global _start
_start:
// 关闭
ldr r0, =WTCON
ldr r1, =0x0
str r1, [r0]
// 配置寄存器
ldr r0, =0x11111111
ldr r1, =GPJ0CON
str r0, [r1]
// 流水灯部分
flash:
// 点亮1其他熄灭
ldr r0, =~(1<<3)
ldr r1, =GPJ0DAT
str r0, [r1]
bl delay
// 点亮2其他熄灭
ldr r0, =~(1<<4)
ldr r1, =GPJ0DAT
str r0, [r1]
bl delay
// 点亮3其他熄灭
ldr r0, =~(1<<4)
ldr r1, =GPJ0DAT
str r0, [r1]
bl delay
b flash // 无限循环
// 延时函数:函数名:delay
delay:
ldr r2, =9000000
ldr r3, =0x0
delay_loop:
sub r2, r2, #1 //r2 = r2 -1
cmp r2, r3 // cmp会影响Z标志位,如果r2等于r3则Z=1,下一句中eq就会成立
bne delay_loop
mov pc, lr // 函数调用返回Makefile
cur-dir := $(shell pwd)
OUT_DIR = $(cur-dir)/out/
OUT_NAME = led
$(OUT_NAME).bin: $(OUT_NAME).o
#@ $(shell mkdir -p out)
# arm-linux-ld -Tlink.lds -o $(OUT_DIR)$(OUT_NAME).elf $^
arm-linux-ld -Ttext 0x0 -o $(OUT_DIR)$(OUT_NAME).elf $^
arm-linux-objcopy -O binary $(OUT_DIR)$(OUT_NAME).elf $(OUT_DIR)$(OUT_NAME).bin
arm-linux-objdump -D $(OUT_DIR)$(OUT_NAME).elf > $(OUT_DIR)$(OUT_NAME)_elf.dis
gcc mkv210_image.c -o $(OUT_DIR)mkx210
$(OUT_DIR)mkx210 $(OUT_DIR)$(OUT_NAME).bin $(OUT_DIR)210.bin
mv -f *.o $(OUT_DIR)
%.o : %.S
arm-linux-gcc -o $@ $< -c -nostdlib
%.o : %.c
arm-linux-gcc -o $@ $< -c -nostdlib
OUT_DIR:
$(shell mkdir -p out)
clean:
rm $(OUT_DIR)* -f