微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > GNU ARM汇编--(八)s3c2440的watchdog

GNU ARM汇编--(八)s3c2440的watchdog

时间:11-26 来源:互联网 点击:
从单片机起,watchdog就是必不可少的.在各种应用环境中,程序很可能跑飞或死掉,这时候就需要通过watchdog来保证整个系统重新恢复到正常状态.

照旧,给出s3c2440的datasheet说明:

概述:
watchdog timer用于由于噪声或者系统错误引起的程序跑飞了的情况下恢复处理器的正常操作.它可以被用作一个可以请求中断服务的普通16bit的内部定时器.watchdog timer产生128 PCLK的重启信号.
特点:
有中断请求的普通内部定时器模式
当定时器计数为0(超时)时,产生内部的长达128PCLK周期的重启信号

watchdog timer的操作:
F18-1显示watchdog timer的功能框图.watchdog timer只使用PCLK作为它的时钟源.PCLK先由一个8bit的prescaler进行分频,接下来还会再次分频.


Prescaler的值和分频因子由watchdog timer控制寄存器(WTCON)决定.有效的预分频值的范围是(0--2^8-1),因为是8bit的分频器.分频因子可选为16,32,64,128.

WTDAT&WTCNT
一旦watchdog timer启用了,watchdog timer数据寄存器(WTDAT)的值不会自动的重新加载到计数寄存器(WTCNT).所以,在watchdog timer启动前一定要向watchdog timer的计数寄存器(WTCNT)中写入一个初始值.

watchdog timer special registers
WTCON
WTCON允许user打开或关闭watchdog timer,从4个不同的源中选择时钟信号,开关中断以及开关watchdog timer的输出.watchdog timer用来s3c2440启动后的重启,如果不想处理器重启,watchdog timer要被禁用.在loader开始时,watchdog timer又没初始化的时候,应该将watchdog timer禁用.
如果user想使用watchdog timer提供的正常定时器功能,那就打开中断,关闭watchdog timer.
Register Address R/W Description Reset Value
WTCON 0x53000000 R/W Watchdog timer control register 0x8021
Bit Descrition Initial State
Prescaler value [15:8] 预分频的值(0--255) 0x80
Watchdog timer [5] watchdog timer的开关位 1(开)
Clock select [4:3] 时钟分频因子 00:16 01:32 00
10:64 11:128
Interrupt generation [2] 中断的开关位 0
Reset enable/diaable [0] 输出重启信号的开关 1

WTDAT
WTDAT用来指定超时的期限.在最开始的操作中WTDAT的值不会自动的加载到计数器中.使用初始值0x8000就可以驱动第一次超时.以后的话,WTDAT的值就会自动重加载到WTCNT中.
Register Address R/W Description Reset Value
WTDAT 0x53000004 R/W Watchdog timer data register 0x8000
Bit Description Initial State
Count reload value [15:0] 重加载的计数值 0x8000

WTCNT
WTCNT包含正常操作下watchdog timer的当前计数值.值得注意的是,在watchdog timer最初被启用的时候,WTDAT的内容不会自动的加载到WTCNT中,所以WTCNT一定要给一个初始值.
Register Address R/W Description Reset Value
WTCNT 0x53000008 R/W Watchdog timer count register 0x8000
Bit Description Initial State
Count value [15:0] 定时器的当前计数值 0x8000

我们先将watchdog的输出重启信号的开关关掉,将中断打开,把watchdog timer当一个普通的定时器来用.设计如下:

[cpp]view plaincopy

  1. /*
  2. watchdogtimerwithdisablereset
  3. copyleft@dndxhej@gmail.com
  4. */
  5. .equNOINT,0xc0
  6. .equGPBCON,0x56000010@led
  7. .equGPBDAT,0x56000014@led
  8. .equGPBUP,0x56000018@led
  9. .equGPFCON,0x56000050@interruptconfig
  10. .equEINTMASK,0x560000a4
  11. .equEXTINT0,0x56000088
  12. .equEXTINT1,0x5600008c
  13. .equEXTINT2,0x56000090
  14. .equINTMSK,0x4A000008
  15. .equEINTPEND,0x560000a8
  16. .equSUBSRCPND,0x4a000018
  17. .equINTSUBMSK,0x4a00001c
  18. .equSRCPND,0X4A000000
  19. .equINTPND,0X4A000010
  20. .equGPB5_out,(1<(5*2))
  21. .equGPB6_out,(1<(6*2))
  22. .equGPB7_out,(1<(7*2))
  23. .equGPB8_out,(1<(8*2))
  24. .equGPBVALUE,(GPB5_out|GPB6_out|GPB7_out|GPB8_out)
  25. .equLOCKTIME,0x4c000000
  26. .equMPLLCON,0x4c000004
  27. .equUPLLCON,0x4c000008
  28. .equM_Mdiv,92
  29. .equM_Pdiv,1
  30. .equM_Sdiv,1
  31. .equU_Mdiv,56
  32. .equU_Pdiv,2
  33. .equU_Sdiv,2
  34. .equCLKdivN,0x4c000014
  35. .equdivN_UPLL,0
  36. .equHdivN,1
  37. .equPdivN,1@FCLK:HCLK:PCLK=1:2:4
  38. .equWTCON,0x53000000
  39. .equPre_scaler,249
  40. .equwd_timer,1
  41. .equclock_select,00@316
  42. .equint_gen,1@开中断
  43. .equreset_enabl

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top