将GPF4设置为输出属性。
? 通过设置GPFDAT寄存器实现点亮与熄灭LED。如:配置GPFDAT[4]为“0”,
可实现点亮LED4。配置GPFDAT[4]为“1”,可实现关闭LED4。 ? 对于本题来说,GPFUP可以不用设置。
电路原理图如下图所示:
: 姓名: 学号: 班级(学生填写)------------------------------------ 密 ---------------------------- 封 --------------------------- 线 ----------------------------------------- (答题不能超出密封线)
按照以上要求,编写出控制LED的程序。 答:#include \
#define rGPFCON (*(volatile unsigned *)0x56000050)
//端口F的控制寄存器 #define rGPFDAT (*(volatile unsigned *)0x56000054)
//端口F的数据寄存器 #define rGPFUP (*(volatile unsigned *)0x56000058)
//端口F的上拉控制寄存器 void port_init(void) {
//=== PORT F GROUP
//端口: GPF7 GPF6 GPF5 GPF4 GPF3 GPF2 GPF1 GPF0 //信号: LED_1 LED_2 LED_3 LED_4 PS2_INT CPLD_INT1 KEY_INT BUT_INT1 //设置属性: Output Output Output Output EINT3 EINT2 EINT1 EINT0 //二进制值: 01 01, 01 01, 10 10, 10 10 rGPFCON = 0x55aa;
rGPFUP = 0xff; // GPF所有端口都不加上拉电阻 }
第 5 页 (共 页)
void led_on(void) {
int i,nOut; nOut=0xF0;
rGPFDAT=nOut & 0x70; //点亮LED1 for(i=0;i<100000;i++);
rGPFDAT=nOut & 0x30; //点亮LED1 LED2 for(i=0;i<100000;i++);
rGPFDAT=nOut & 0x10; //点亮LED1 LED2 LED3 for(i=0;i<100000;i++);
rGPFDAT=nOut & 0x00; //点亮LED1 LED2 LED3 LED4 for(i=0;i<100000;i++); }
void led_off(void) {
int i,nOut; nOut=0;
rGPFDAT = 0;
for(i=0;i<100000;i++);
rGPFDAT = nOut | 0x80; //关闭LED1 for(i=0;i<100000;i++);
rGPFDAT |= nOut | 0x40; //关闭LED2 for(i=0;i<100000;i++);
rGPFDAT |= nOut | 0x20; //关闭LED3 for(i=0;i<100000;i++);
rGPFDAT |= nOut | 0x10; //关闭LED4 for(i=0;i<100000;i++); }
void led_on_off(void) {
int i;
rGPFDAT=0; //所有LED全亮 for(i=0;i<100000;i++);
rGPFDAT=0xF0; //所有LED全灭 for(i=0;i<100000;i++); }
void led_test(void) { led_on(); led_off();
第 6 页 (共 页)
led_on_off(); delay(1000); rGPFCON = 0x55aa; }
void main(int argc,char **argv) {
port_init( ); while(1) { led_test(); } }
2.已知C语言程序有主程序模块prog.c,prog.h,其中调用了另一个模块subr.c,subr.h中的功能。试写出一个可将这两个模块编译成可执行文件pr1的makefile。 答:
pr1: prog.o subr.o
gcc –o pr1 prog.o subr.o prog.o: prog.c prog.h
gcc –c –o prog.o prog.c subr.o: subr.c subr.h gcc –c –o subr.o subr.c
六.阅读程序题(每题10分,共10分)
1.阅读下列与看门狗有关的寄存器描述,解释每一行代码的功能。看门狗定时器控制寄存器(WTCON)
寄存器 WTCON 寄存器 WTDAT 寄存器 WTCNT 看门狗计数寄存器(WTCNT)
地址 0x53000008 读/写 读/写 描述 看门狗计数当前值 看门狗数据寄存器(WTDAT) 地址 0x53000004 读/写 读/写 描述 看门狗数据寄存器 地址 0x53000000 读/写 读/写 描述 看门狗控制寄存器 #define rWTCON (*(volatile unsigned *)0x53000000) //第1行 #define rWTDAT (*(volatile unsigned *)0x53000004) //第2行 #define rWTCNT (*(volatile unsigned *)0x53000008) //第3行
void watchdog_test(void) {
第 7 页 (共 页)
rWTCON=((PCLK/1000000-1)<<8)|(3<<3)|(1<<2); //第4行
rWTDAT=7812; //第5行 rWTCNT=7812; //第6行 rWTCON|=(1<<5); //第7行 }
答:第1-3行:定义看门狗控制寄存器、数据寄存器和计数寄存器为rWTCON、rWTDAT 和rWTCNT
第4行: 设置看门狗的预装比例值为1000000,分频因素为1/28,并使能中断。 第5-6行:对数据寄存器和计数寄存器赋值为7812。 第7行:启动看门狗。
第 8 页 (共 页)