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