s3c2440看门狗定时器作为普通定时器应用的补充说明

来源:互联网 发布:韩国电视直播软件apk 编辑:程序博客网 时间:2024/05/22 07:51
1、对于s3c2440,说明一个很奇怪的现象,<span style="font-family: Arial, Helvetica, sans-serif;">一般主函数中(防止其他程序未清除中断)和中断程序的最后应该对中断寄存器进行清除。然而</span>很多网上资料,甚至飞凌学习板自己的光盘资料代码,在对清除中断时的操作都是错误的,他们的清除操作都是对<span style="font-family: Arial, Helvetica, sans-serif;">SUBSRCPND、</span><span style="font-family: Arial, Helvetica, sans-serif;">SRCPND相应位写零,而对</span><span style="font-family: Arial, Helvetica, sans-serif;">INTPND相应位写1,或者都写零。然而实践证明清除中断的正确操作是对这些寄存器都写1!!!(可以参照下面程序中的清除中断子函数)</span>
<span style="font-family: Arial, Helvetica, sans-serif;">2、还有一点就是,ARM对中断的响应是利用中断控制器、中断向量表和中断函数。所以在主函数中应该把涉及到的中断函数名(也就是中断函数的地址)写到相应的中断向量表中去,这样响应中断时,CPU才能根据中断向量表中的地址(令PC=该地址)去跳转到该地址处执行相应的中断函数。</span>
#include "2440addr.h"void delay(int a){       int k;       for(k=0;k<a;k++)              ;}void Reset_Interrupt(void)//清除中断{rSRCPND |= 0x1<<9;        rSUBSRCPND |= 0x1<<13;       rINTPND |= 0x1<<9;}void __irq watchdog(void); void Main(void){    //GPB5设置为输出rGPBCON |= 0x400;rGPBCON &= 0xFFFFF7FF; //GPB5设为灭状态rGPBDAT |= 0x20;//输出上拉rGPBUP  &=0xFDF;Reset_Interrupt();          rWTCON = 0xf9<<8;                  //Prescaler = 249,Division = 16,时钟频率为12.5kHz        rWTDAT = 40000;                    //设置看门狗定时器超时时间为4秒(50÷12.5)    rWTCNT = 40000;    rWTCON |= (1<<5)|(1<<2);           //开启看门狗定时器中断        rINTSUBMSK &= ~(0x1<<13);          //打开中断子屏蔽    rINTMSK &= ~(0x1<<9);              //打开中断屏蔽     pISR_WDT= (U32)watchdog;           //中断函数句柄,将中断函数地址写到中断向量表中    while(1) ;       }void __irq watchdog(void){      rGPBDAT &=0xfdf;delay(6400000);rGPBDAT |= 0x20;Reset_Interrupt();   }

0 0