1.嵌入式系统可能运行在无人看守的环境,有可能会意外死机,但是鉴于无人看守,所以需要一种自动重启的硬件机制---看门狗
2.看门狗原理图
3.原理:
(1)PCLK经过预分频器以及选择器以后会产生看门狗时钟,然后通过计数逻辑模块,开始计数。
(2)WTDAT是预先存放的计数初值,WTCNT是减量计数模块,当WTCNT从WTDAT的值减到0的时候,如果还没有更新WTDAT,则认为没有喂狗,系统死机,
(3)发出reset 信号,强制系统重启
(4)在初始化阶段,我们认为代码少,系统也不会进入死机状态,为了节约开销,避免无休止的喂狗,所以关闭看门狗。
4.代码
(注意6410要先初始化外设基地址)
@外设地址初始化,要放在进入svc模式以后的第一步操作
set_peri_port:
ldr r0, =0x70000000 @对于6410来说,内存(0x00000000~0x60000000),外设(0x70000000-0x7fffffff)
orr r0, r0, #0x13 @外设大小:256M
mcr p15,0,r0,c15,c2,4 @把r0的值(包括了外设基地址+外设大小)告诉cpu
mov pc, lr
@关闭看门狗
#define pWTCON 0x7E004000
disable_watchdog:
ldr r0, =pWTCON
mov r1, #0x00
str r1, [r0]
mov pc, lr
完整代码
@****************************
@File:start.S
@
@Tiny6410裸机上学期代码
@****************************
.text
.global _start
@异常向量表
_start:
b reset
ldr pc, _Undefined_instruction
ldr pc, _Software_interrupt
ldr pc, _Command_abort
ldr pc, _Data_abort
ldr pc, _Nothing_used
ldr pc, _IRQ
ldr pc, _FIQ
@存放实际异常入口地址开辟的存储单元
_Undefined_instruction:
.word Undefined_instruction
_Software_interrupt:
.word Software_interrupt
_Command_abort:
.word Command_abort
_Data_abort:
.word Data_abort
_Nothing_used:
.word Nothing_used
_IRQ:
.word IRQ
_FIQ:
.word FIQ
@各种实际的异常处理函数
Undefined_instruction:
nop
Software_interrupt:
nop
Command_abort:
nop
Data_abort:
nop
Nothing_used:
nop
IRQ:
nop
FIQ:
nop
@上电复位以后就执行这里
reset:
bl set_svc
bl set_peri_port
bl disable_watchdog
@外设地址初始化,要放在进入svc模式以后的第一步操作
set_peri_port:
ldr r0, =0x70000000 @对于6410来说,内存(0x00000000~0x60000000),外设(0x70000000-0x7fffffff)
orr r0, r0, #0x13 @外设大小:256M
mcr p15,0,r0,c15,c2,4 @把r0的值(包括了外设基地址+外设大小)告诉cpu
mov pc, lr
@通过读-修改-写的方式控制CPSR从而改变工作模式的svc模式
set_svc:
mrs r0, cpsr
bic r0,r0,#0x1F
orr r0,r0,#0xD3
msr cpsr, r0
mov pc, lr
@关闭看门狗
#define pWTCON 0x7E004000
disable_watchdog:
ldr r0, =pWTCON
mov r1, #0x00
str r1, [r0]
mov pc, lr