⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 三星ARM2410的看门狗与中断结合实验
💻 C
字号:
/*=============================================================================
--------------------------------- Copy Left -----------------------------------
						Illidan Fly's Project
						Power by BigFly Network
						http://bigfly.happybobby.com
						
						Released under GPL2 License

----------------------------- File Description --------------------------------
 Filename:	main.c
 Date:		2007.01.03
 Version:	0.0.1
 Description:

----------------------------- Version History ---------------------------------
 0.0.1: First release

=============================================================================*/

#include "2410addr.h"
#include "target.h"
#include "2410lib.h"

void wait(void);
int fc1=0;

void __irq isr_eint0(void)
{
	// 关闭该中断以防止中断处理过程中进入同一中断的嵌套,达到临界区域互斥的效果
	// 但在少数情况下,可能需要允许同一中断嵌套,这时候就不必屏蔽该位了
	// 有时候,可能还要操作子中断屏蔽寄存器 rINTSUBMSK,在以后 ADC 的例子里就会看到
	rINTMSK = rINTMSK | (unsigned int)BIT_EINT0;
	
	// 中断服务程序
	
		
		
	
	// 清除中断位
	// 清除中断控制器内相应的中断等待位(pending bit),使得中断控制器知道该中断已经被服务
	// 有时候,中断等待位的清除是在中断被服务前,这个需要看具体中断需要
	// 中断等待位寄存器的清除方法是:
	// 把一个值写入该寄存器,如果该值的某1位为1,则中断等待位寄存器清除该位的等待位
	// 即:以写1的方式去清0指定位,详细信息请参考数据手册
	// 有时候,可能还要操作子中断等待位寄存器 rSUBSRCPND,在以后 ADC 的例子里就会看到
	rINTPND = BIT_EINT0;	
	rSRCPND = BIT_EINT0;
	
	// 重新打开中断
	// 有时候,可能还要操作子中断屏蔽寄存器 rINTSUBMSK,在以后 ADC 的例子里就会看到
	rINTMSK = rINTMSK & ~BIT_EINT0;
	// 喂狗
	rWTCNT = rWTDAT;
	fc1=0;
	wait();
	//Uart_Printf("Times:%d Press any key in 10 seconds.\n",fc1++);
}
void __irq isr_wdt(void)
{
	rINTMSK = rINTMSK | BIT_WDT;
	
	Uart_Printf("You havn't press any key in 10 seconds.\n");
	fc1=0;
	
	// 清除中断位
	rINTPND = BIT_WDT;
	rSRCPND = BIT_WDT;
	
	rINTMSK = rINTMSK & ~BIT_WDT;
}

void wait(void)
{
	Uart_Printf("Times:%d Press any key in 10 seconds.\n",fc1++);
	while(1)
	{
        ;
	}
}


void main(void)
{
	
	char tmpchar;
	
	Uart_Printf("CITK2410 WDT demo.\n");

	// Init target board (call this function before anything can go!)
	Target_Init();
	
	// 初始化 WDT 控制器
	// WDT 时钟频率计算方法:
	// WDT时钟频率=(PCLK/(分频因子+1))/除数因子
	// 在本例子里,PCLK=50.7MHz,要使 WDT 在10秒倒数完毕,则:
	// 设置分频因子为49,除数因子为128,可得WDT时钟频率为7921.875
	// 所以,WTDAT的初始值为7921.875*10=79219
	rWTCON = (49<<8) | (0<<5) | (3<<3) | (1<<2) | (0);
	rWTDAT = 79219;
	rWTCNT = rWTDAT;
	
	// 设置 WDT 中断服务程序
	pISR_WDT = (unsigned int)isr_wdt;
	
	// 打开 WDT 中断
	rINTMSK = rINTMSK & ~BIT_WDT;
	pISR_EINT0 = (unsigned int)isr_eint0;
	
	
	// 打开中断
	rINTMSK = rINTMSK & ~BIT_EINT0;
	
	rEINTMASK=rEINTMASK &~(1<<11) &~(1<<19);
	
	
	Uart_Printf("Select WDT Test method, Press:\n1 for WDT interrupt.\n2 for WDT reset.\n");
	tmpchar = Uart_Getch();
	
	if(tmpchar=='1')
	{
		rWTCON = (49<<8) | (1<<5) | (3<<3) | (1<<2) | (0);
	}
	else if(tmpchar=='2')
	{
		rWTCON = (49<<8) | (1<<5) | (3<<3) | (0<<2) | (1);
	}
	else
	{
		Uart_Printf("Invalid selection. System will now reset.\n");
		rWTDAT = 1;
		rWTCON = (0<<8) | (1<<5) | (0<<3) | (1<<2) | (1);
		while(1){;}
	}
	
	wait();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -