中断原理及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    ==>62500HZwtd_con		=	wtd_con & ~(3<<3) & ~(0xff<<8) | (65<<8);	//wtdcnt[0:15]=wtddat[0:15]=62500HZwtd_cnt		=	62500;wtd_dat		=	62500;//wtdcon [0]=0 [2]=1 [5]=1wtd_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;
}

本文链接:https://my.lmcjl.com/post/1606.html

展开阅读全文

4 评论

留下您的评论.