实验仪器设备、工具软件
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;
}