您的位置:首页 > 其它

s5pv210学习<三>看门狗

2017-01-10 21:50 169 查看
一、前置知识

在上面两个章节我们点亮了LED灯,了解了s5pv210的启动模式,在启动模式中,我们发现一个很重要的东西,叫做看门狗,首先要了解看门狗i是什么,在板子运行时,系统会发生一些错误,或者跑飞,那么这个时候,板子就处于不正常的运行状态,那么就需要一种机制,来监视系统的运行状态,在系统跑飞时将CPU重置,于是就有了看门狗,看门狗实际上是一个计时器,程序在正常运行时需要每隔一段时间复位看门狗,让看门狗计时器重新及时,如果超时则将CPU复位。

二、问题

在第一个程序中:

1.我们并没有将看门狗关闭,也没有执行过喂狗步骤,为什么CPU并没有重置?

2.点灯的程序必然在ram中执行,而我们并没有初始化你内存堆栈,那么程序在哪里运行的?

仔细看我们的启动过程,我们会发现,关闭看门狗是在BL0中执行的,而BL0是在IROM中执行的,其实IROM中是一段固话的程序,也就是说只要板子启动了,那么irom就会运行,所以irom替我们关闭了看门狗,初始化了堆栈,所以我们的程序可以执行。

三、程序

要证明irom替我们初始化了堆栈关闭了看门狗其实非常简单,只要我们用C语言来点灯,因为C语言的程序一定是运行在堆栈的,所以只要C语言的程序执行了,那么就可以证明IROM执行了。

汇编

.globl _start

_start:
bl led_main	跳转至led_main执行

halt:
b halt


bl 行标 跳转到子函数运行

C语言

#define GPCON *((volatile unsigned int *)0xE0200280)
#define GPDAT *((volatile unsigned int *)0xE0200284)
void dalay( unsigned int i );
void dalay( unsigned int i )
{
while (i--)
;
}
int led_main()
{

GPCON = 0x00001111;
while (1) {
GPDAT = 0xf;
dalay(0x500000);
GPDAT = 0x0;
dalay(0x500000);
}

}

程序运行可以看到LED灯闪烁,所以bl0执行了,并且搬移了flash中或者SD卡的代码至内存,需要注意,搬移的时候会去校验数据的前十六个字节,将前十六个字节累加起来,将校验和放到头的第8~11位。

四、看门狗

上面扯了那么多,终于进入了正题,如何操作看门狗,在芯片手册中搜索watchdog,可以看到如下信息。



和gpio一样,主要的有两个WTCON和WTDATA,WTCON主要用来使能或者关闭WTCON,今天天色已晚,懒得写了,

将WTCON赋值0就关闭了看门狗,后头再说吧,反正前面UBOOT也只是需要关闭看门狗

详细代码见git上面bareOS中的led_wtd

号外:

所有程序在github上,一直会更新至应用层,github地址https://github.com/kentGC/s5pv210,嵌入式交流学习qq群:363361058 欢迎各位大神交流!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  s5pv210 led 看门狗 irom