看门狗是什么?
是SoC内部的一个定时器
为什么需要看门狗?
现实生活中由于一些外部环境因素,例如高温低温信号干扰,运行在电子设备上的程序容易跑飞和死机,在这种情况下,我们希望设备自动复位,而不是人为去手动复位。看门狗就是用来完成这个工作,定好时间后,当时间到了系统就会自动复位。
为什么要关看门狗?
一般CPU设计,默认CPU启动后看门狗是工作的,这么做的原因是因为怕我们自己编写的程序在启动代码阶段就死机了没人管;好处就是没有空档和漏洞,坏处就是需要我们在启动代码阶段不停喂狗,以防止OS未启动就复位了;但实际上为了偷懒我们在启动代码阶段就会先去关闭看门狗,然后在后面OS启动起来之后再根据需要决定是否打开看门狗(一旦打开就必须同时提供喂狗)。
在S5PV210内部的iROM代码(BL0)中,其实已经关过看门狗了。所以我们在启动代码中即使编写了关闭看门狗的汇编程序,运行也不会有任何现象,(没有现象就是正常现象)。
很多CPU内部是没有BL0的,例如2440,因此也没有人事先给你关看门狗,都要在启动代码前段自己写代码关看门狗。
S5PV210怎么关看门狗?
1.物理特性:看门狗其实是个定时器(类似闹钟),硬件上就是SoC内部的一个内部外设。
2.原理图:看门狗属于内部外设,而且外部没有原件与他有关,所以不需要分析原理图,在原理图上根本找不到与看门狗有关的地方。
3.数据手册:在数据手册的Section7.3,找到
可以看到,要关闭看门狗,只需将WTCON(0xE2700000)的bit5置0即可。4.编写代码,以下是关闭看门狗的流水灯代码
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">GPJ0CON</span> <span class="token expression"><span class="token number">0xE0200240</span></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">GPJ0DAT</span> <span class="token expression"><span class="token number">0xE0200244</span></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">WTCON</span> <span class="token expression"><span class="token number">0xE2700000</span></span></span> <span class="token punctuation">.</span>global _start _start<span class="token operator">:</span> ldr r0<span class="token punctuation">,</span> <span class="token operator">=</span><span class="token number">0</span> ldr r1<span class="token punctuation">,</span> <span class="token operator">=</span>WTCON str r0<span class="token punctuation">,</span> <span class="token punctuation">[</span>r1<span class="token punctuation">]</span> ldr r0<span class="token punctuation">,</span> <span class="token operator">=</span><span class="token number">0x11111111</span> ldr r1<span class="token punctuation">,</span> <span class="token operator">=</span>GPJ0CON str r0<span class="token punctuation">,</span> <span class="token punctuation">[</span>r1<span class="token punctuation">]</span> led<span class="token operator">:</span> ldr r0<span class="token punctuation">,</span> <span class="token operator">=</span><span class="token operator">~</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token operator"><<</span><span class="token number">3</span><span class="token punctuation">)</span> ldr r1<span class="token punctuation">,</span> <span class="token operator">=</span>GPJ0DAT str r0<span class="token punctuation">,</span> <span class="token punctuation">[</span>r1<span class="token punctuation">]</span> bl delay ldr r0<span class="token punctuation">,</span> <span class="token operator">=</span><span class="token operator">~</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token operator"><<</span><span class="token number">4</span><span class="token punctuation">)</span> ldr r1<span class="token punctuation">,</span> <span class="token operator">=</span>GPJ0DAT str r0<span class="token punctuation">,</span> <span class="token punctuation">[</span>r1<span class="token punctuation">]</span> bl delay ldr r0<span class="token punctuation">,</span> <span class="token operator">=</span><span class="token operator">~</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token operator"><<</span><span class="token number">5</span><span class="token punctuation">)</span> ldr r1<span class="token punctuation">,</span> <span class="token operator">=</span>GPJ0DAT str r0<span class="token punctuation">,</span> <span class="token punctuation">[</span>r1<span class="token punctuation">]</span> bl delay b led delay<span class="token operator">:</span> ldr r2<span class="token punctuation">,</span> <span class="token operator">=</span><span class="token number">3000000</span> ldr r3<span class="token punctuation">,</span> <span class="token operator">=</span><span class="token number">0</span> delay_loop<span class="token operator">:</span> sub r2<span class="token punctuation">,</span> r2<span class="token punctuation">,</span> #<span class="token number">1</span> cmp r2<span class="token punctuation">,</span> r3 bne delay_loop mov pc<span class="token punctuation">,</span> lr<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">GPJ0CON</span> <span class="token expression"><span class="token number">0xE0200240</span></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">GPJ0DAT</span> <span class="token expression"><span class="token number">0xE0200244</span></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">WTCON</span> <span class="token expression"><span class="token number">0xE2700000</span></span></span> <span class="token punctuation">.</span>global _start _start<span class="token operator">:</span> ldr r0<span class="token punctuation">,</span> <span class="token operator">=</span><span class="token number">0</span> ldr r1<span class="token punctuation">,</span> <span class="token operator">=</span>WTCON str r0<span class="token punctuation">,</span> <span class="token punctuation">[</span>r1<span class="token punctuation">]</span> ldr r0<span class="token punctuation">,</span> <span class="token operator">=</span><span class="token number">0x11111111</span> ldr r1<span class="token punctuation">,</span> <span class="token operator">=</span>GPJ0CON str r0<span class="token punctuation">,</span> <span class="token punctuation">[</span>r1<span class="token punctuation">]</span> led<span class="token operator">:</span> ldr r0<span class="token punctuation">,</span> <span class="token operator">=</span><span class="token operator">~</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token operator"><<</span><span class="token number">3</span><span class="token punctuation">)</span> ldr r1<span class="token punctuation">,</span> <span class="token operator">=</span>GPJ0DAT str r0<span class="token punctuation">,</span> <span class="token punctuation">[</span>r1<span class="token punctuation">]</span> bl delay ldr r0<span class="token punctuation">,</span> <span class="token operator">=</span><span class="token operator">~</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token operator"><<</span><span class="token number">4</span><span class="token punctuation">)</span> ldr r1<span class="token punctuation">,</span> <span class="token operator">=</span>GPJ0DAT str r0<span class="token punctuation">,</span> <span class="token punctuation">[</span>r1<span class="token punctuation">]</span> bl delay ldr r0<span class="token punctuation">,</span> <span class="token operator">=</span><span class="token operator">~</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token operator"><<</span><span class="token number">5</span><span class="token punctuation">)</span> ldr r1<span class="token punctuation">,</span> <span class="token operator">=</span>GPJ0DAT str r0<span class="token punctuation">,</span> <span class="token punctuation">[</span>r1<span class="token punctuation">]</span> bl delay b led delay<span class="token operator">:</span> ldr r2<span class="token punctuation">,</span> <span class="token operator">=</span><span class="token number">3000000</span> ldr r3<span class="token punctuation">,</span> <span class="token operator">=</span><span class="token number">0</span> delay_loop<span class="token operator">:</span> sub r2<span class="token punctuation">,</span> r2<span class="token punctuation">,</span> #<span class="token number">1</span> cmp r2<span class="token punctuation">,</span> r3 bne delay_loop mov pc<span class="token punctuation">,</span> lr#define GPJ0CON 0xE0200240 #define GPJ0DAT 0xE0200244 #define WTCON 0xE2700000 .global _start _start: ldr r0, =0 ldr r1, =WTCON str r0, [r1] ldr r0, =0x11111111 ldr r1, =GPJ0CON str r0, [r1] led: ldr r0, =~(1<<3) ldr r1, =GPJ0DAT str r0, [r1] bl delay ldr r0, =~(1<<4) ldr r1, =GPJ0DAT str r0, [r1] bl delay ldr r0, =~(1<<5) ldr r1, =GPJ0DAT str r0, [r1] bl delay b led delay: ldr r2, =3000000 ldr r3, =0 delay_loop: sub r2, r2, #1 cmp r2, r3 bne delay_loop mov pc, lr
原文链接:https://blog.csdn.net/weixin_53762042/article/details/124996038?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522b800f01611905b4e181213392fb87f80%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=b800f01611905b4e181213392fb87f80&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~times_rank-16-124996038-null-null.nonecase&utm_term=%E9%A3%9E%E7%89%9BOS