中断原理及WDT驱动编程

实验仪器设备、工具软件

1.PC微机。

2.ubuntu14.04 64位。

3. arm-linux-gcc,minicom,tftpd-hpa,uboot

实验内容

 1)查看用户手册,编写c程序1c.c,用c编写子程序vic0_init, 完成vic0第27号中断的初始化,子程序 wdt_init,完成wdt初始化,使得wdt每隔1秒发生中断一次,子程序clear_int清除wdt和vic中断,子程序led_init完成初始化led,led_on( char on)完成根据参数on的值控制led灯的亮灭。在汇编文件1s.S中编写子程序cpu_int_on,使能cpu中断,中断处理子程序isr,调用led_on函数使4个led灯交替点亮和熄灭。在1c.c中编写主程序_start,分别调用上述子程序,使得wdt每秒发生一次中断,用来控制led灯交替点亮和熄灭。

 

 

 

编写c程序 2c.c,完成上述第1题的功能。其中cpu_int_on在c文件中使用内嵌汇编编写,其他子程序均使用c编写。

提示:c中断处理函数声明:__attribute__((interrupt)) void isr( void )

//led
#define gpj2con	*((volatile unsigned*)0xe0200280)
#define gpj2dat *((volatile unsigned*)0xe0200284)

// wtchdog
#define  wtd_con 	*(unsigned*)0xe2700000
#define  wtd_dat 	*(unsigned*)0xe2700004
#define  wtd_cnt 	*(unsigned*)0xe2700008
#define  wtd_int_clr 	*(unsigned*)0xe270000c

//vic0int
#define vic0_select	*(unsigned*)0xf200000c	
#define vic0_int_enable	*(unsigned*)0xf2000010	
#define vic0_addr27	*(unsigned*)0xf200016c	
#define vic0_vectaddress	*(unsigned*)0xf2000f00
#define vic1_vectaddress	*(unsigned*)0xf2100f00
#define vic2_vectaddress	*(unsigned*)0xf2200f00
#define vic3_vectaddress	*(unsigned*)0xf2300f00
void wtd_init(void );
void vic0_init( void );
void cpu_int_on( void );
void isr( void );
void led_init( void);
void led_on( char );
void clear_int(void);
char on=0xf;
void _start(void )
{
	led_init();
	wtd_init();
	vic0_init();
	cpu_int_on();

}

void wtd_init( void )
{
	//clock wtdcon:[3:4]=0  [8:15]=65    ==>62500HZ
	wtd_con		=	wtd_con & ~(3<<3) & ~(0xff<<8) | (65<<8);	
	//wtdcnt[0:15]=wtddat[0:15]=62500HZ
	wtd_cnt		=	62500;
	wtd_dat		=	62500;


	//wtdcon [0]=0 [2]=1 [5]=1

	wtd_con		=	wtd_con & ~1 | ( 1<<2 ) | ( 1 << 5 );	
}

void vic0_init(void)
{
	//vic0intselect[27]=0  vic0intenable[27]=1 vic0vectaddr27=isr_c;
	vic0_select		=	vic0_select & ~(1<<27);
	vic0_int_enable		|= 	(0x1<<27);
	vic0_addr27		=	isr;
}

void cpu_int_on( void )
{
	__asm__ __volatile__ (

	"mrs  r0,cpsr \n"
	"bic r0,r0,#0x80\n"
	"msr cpsr,r0\n"
	:
	:
	);
}

__attribute__((interrupt)) void isr(void)
{
	led_on(on);
	on	=	on^0xf;
	clear_int();
}
void clear_int( void )
{

	
	wtd_int_clr		=	0;
	vic0_vectaddress	=	0;
	vic1_vectaddress	=	0;
	vic2_vectaddress	=	0;
	vic3_vectaddress	=	0;
	
}

void led_init( void )
{
	gpj2con		=	gpj2con & ~0xffff | 0x1111;
}
void led_on( char on)
{
	gpj2dat		=	gpj2dat & ~0xf | on;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值