嵌入式学习-uboot-lesson4.3-关闭看门狗和中断

一、看门狗

Watchdog在硬件上实现了计时功能,启动计时后,用户(软件)必须在计时结束前重新开始计时,俗称“喂狗”,如果到超时的时候还没有重新开始计时,那么它就认为系统是死机了,就自动重启系统。

在S3C6410X.pdf中,
嵌入式学习-uboot-lesson4.3-关闭看门狗和中断_第1张图片

第一部分,为分频部分,将PCLK进行分频,从而得到自己需要的时钟
第二部分为计数部分,当计数值从预定值减为0时,则触发看门狗第三部分
第三部分会产生一个重启信号,让CPU进行重启
因为uboot程序简单,不需要看门狗,所以需要将其关闭

由上图得知,可以将WTCON的第0位设置为0,则关闭看门狗

#define pwTCON 0x7E004000 @WTCON寄存器
disable_watchdog: 
        ldr r0, =pwTCON         @把地址装载到R0
        mov r1, #0x0 @置0,关闭看门狗
        str r1,[r0]     
        mov pc,lr

二、中断

1.需要关闭irq和fiq中断,这在前面设置svc模式中已经做了
2.然后需要设置中断屏蔽寄存器,将中断屏蔽掉

6410和210不同于2440,采用的是向量中断,用硬件来完成整个中断的跳转工作,
嵌入式学习-uboot-lesson4.3-关闭看门狗和中断_第2张图片

根据上图,要想关闭中断,则需要使用VICINTENCLEAR寄存器
嵌入式学习-uboot-lesson4.3-关闭看门狗和中断_第3张图片

则需要写入1,则关闭所有中断

disable_interrupt:
        mvn r1,#0x0 @0x0 取反,给r1
        ldr r0,=0x71200014      @VIC0
        str r1,[r0]
        ldr r0,=0x71300014      @VIC1
        str r1,[r0]
        mov pc,lr
@****************************
@name: start.S
@by  : stone
@time: 2016.6.23
@function: 关闭中断
@****************************

.text
.global _start  @将_start声明为全局变量
_start:
        b   reset                       
        ldr pc, _undefined_instruction  
        ldr pc, _software_interrupt     
        ldr pc, _prefetch_abort         
        ldr pc, _data_abort             
        ldr pc, _not_used               
        ldr pc, _irq                    
        ldr pc, _fiq

_undefined_instruction: .word undefined_instruction
_software_interrupt:    .word software_interrupt
_prefetch_abort:    .word prefetch_abort
_data_abort:        .word data_abort
_not_used:      .word not_used
_irq:           .word irq
_fiq:           .word fiq                   

undefined_instruction:  @处理未定义指令异常
        nop

software_interrupt:     @软中断
        nop

prefetch_abort:         @预取指令异常
        nop

data_abort:             @数据访问异常
        nop

not_used:               @空位
        nop

irq:                    @中断
        nop

fiq:                    @快速中断
        nop

reset:                  @reset
        bl set_svc          @设置为SVC模式
        bl disable_watchdog @关闭看门狗
        bl disable_interrupt @关闭中断

set_svc:        
        mrs r0, cpsr        @将值取出cpsr寄存器
        bic r0, r0, #0x1f @将后5位 即M[4:0]清零 
        orr r0, r0, #0xd3 @0b10011 转化为16进制为0x13 同时为了屏蔽irq和fiq,可以将其设置为0b11010011即0xd3 
        msr cpsr, r0        @将值送回cpsr寄存器
        mov pc, lr

#define pwTCON 0x7E004000 @WTCON寄存器
disable_watchdog: 
        ldr r0, =pwTCON     @把地址装载到R0
        mov r1, #0x0 @置0,关闭看门狗
        str r1,[r0]     
        mov pc, lr

disable_interrupt:
        mvn r1,#0x0 @0x0 取反,给r1
        ldr r0,=0x71200014
        str r1,[r0]
        ldr r0,=0x71300014
        str r1,[r0]
        mov pc, lr

菜鸟一枚,如有错误,多多指教。。。

你可能感兴趣的:(中断,看门狗,OK6410)