Home » 朱老师嵌入式 » 关闭看门狗-简单版

关闭看门狗-简单版

编 辑:Y ┊ 时 间:2022年04月08日 ┊ 访问: 16 次

查找芯片手册

我们发现watchdog在timer下
94960-oo367cw3eu.png

查找配置寄存器

83378-71ok47ef9g6.png

找到我们的配置相关的寄存器信息

WTCON 0xE270_0000

在代码中定义

#define WTCON 0xE2700000

关闭看门狗

18580-2nnrjd46vmc.png

// 定义看门狗设置寄存器
#define WTCON 0xE2700000

.global _start
_start:
    // 关闭
    ldr r0, =WTCON
    ldr r1, =0x0
    str r1, [r0]

加入led

寻找关于小灯的led配置

我们先到达外围板手册
68205-39l4u5f83l1.png

看见了四个灯,我们可以随便挑选一个灯来实验,如GPJ0_3,但我们这次为了方便全部点亮,我们通过GPJ0 去看看手册相关
17444-1jxe2xz12zi.png

我们找到了相关描述
GPJ0CON 0xE020_0240
GPJ0DAT 0xE020_0244

开始定义

#define GPJ0CON    0xE0200240
#define GPJ0DAT    0xE0200244

配置寄存器

04243-w381942avlj.png

59002-eacavzdewl8.png

我们把所有引脚都设置为输出模式

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



Copyright © 2026 Y 版权所有.网站运行:13年238天21小时23分