GPC1CON寄存器 0xE020_0080
确定GPC1_3的管脚为输出
当GPC1_3的管脚的功能确定了输出功能后,具体如何输出高电平?
GPC1DAT寄存器 0xE020_0084
[4,0],五个管脚共用一个寄存器,一个寄存器占用一位
什么是上、下拉电阻?
CW210-Peripherial.pdf
上拉电阻:
如按键按下,则XEINT0管脚为低电平
如按键松开,则XEINT0管脚为高电平
如果没有外接3.3V电源和上拉电阻,当按键松开时XEINT0处于悬空,电平值不确定,可以为高电平,也可能为低电平。
因为如果不接上拉电阻,如果开关松开,XEINT0为低电平有两种情况:断开(悬空)、回路,这就失去了低电平的唯一性,所以要接一个上拉电阻来唯一确定管脚状态。
若外接3.3V电源和上拉电阻,保证了XEINT0在按键松开时,有确定的状态,为高电平;
下拉电阻:
如按键按下,则XEINT0管脚为高电平
如按键松开,则XEINT0管脚为低电平
如果没有外接GND和下拉电阻,当按键松开时XEINT0处于悬空,电平值不确定,可以为高电平,也可能为低电平。
若外接GND和上拉电阻,保证了XEINT0在按键松开时,有确定的状态,为低电平;
GPC1PUD 上下拉电阻寄存器 0xE0200088
我们这里将管脚的上下拉电阻禁用
Tarena:
1,将GPC1_3管脚设置为输出功能管脚
GPC1CON 0xE0200080
bit[15:12]为0001,表示输出功能
2,禁止GPC1_3管脚内部上下拉电阻
GPC1PUD 0xE0200088
bit[7:6]为00,表示禁止内部上拉、下拉
3,使GPC1_3管脚产生高低电平
GPC1DAT 0xE0200084
bit[3] =1 ,表示向三级管输出高电平,LED亮
bit[3] =0 ,表示向三级管输出低电平,LED灭
融慧广泽:
1,将GPC0_3管脚设置为输出功能管脚
GPC0CON 0xE0200060
bit[15:12]为0001,表示输出功能
2,禁止GPC0_3管脚内部上下拉电阻
GPC0PUD 0xE0200068
bit[7:6]为00,表示禁止内部上拉、下拉
3,使GPC0_3管脚产生高低电平
GPC0DAT 0xE0200064
bit[3] =1 ,表示向三级管输出高电平,LED亮
bit[3] =0 ,表示向三级管输出低电平,LED灭
led.h文件
#ifndef __LED_H__
#define __LED_H__H
#define GPC1CON (*((volatile unsigned int*)0xE0200080))
#define GPC1DAT (*((volatile unsigned int*)0xE0200084))
#define GPC1PUD (*((volatile unsigned int*)0xE0200088))
#endif
led.c文件
#include "led.h"
void led_main(void){
//配置GPC1_3管脚为输出口,操作GPC1CON bit[15,12] 为 0001
GPC1CON = (GPC1CON & 0xFFFF0FFF)|0x00001000;
//2,禁止GPC1_3管脚内部上下拉电阻 操作GPC1PUD bit[7,6]为00
GPC1PUD &=~0xC0 ;
//3,使GPC1_3管脚输出高电平,GPC1DATA bit[3]为1
GPC1DAT |=8 ;
}
编译与链接:
#编译
arm-linux-gcc -march=armv5te -nostdlib -c -o led.o led.c
#链接
arm-linux-ld -nostartfiles -nostadlib -Text=0x20008000 -e led_main -o led led.o
#转换文件格式 把lef格式的文件转换成bind格式的文件
arm-linux-objcopy -o binary led led.bin
如保让LED闪烁?
#include "led.h"
void delay(unsinged int n);
void led_main(void){
//配置GPC1_3管脚为输出口,操作GPC1CON bit[15,12] 为 0001
GPC1CON = (GPC1CON & 0xFFFF0FFF)|0x00001000;
//2,禁止GPC1_3管脚内部上下拉电阻 操作GPC1PUD bit[7,6]为00
GPC1PUD &=~0xC0 ;
//3,使GPC1_3管脚输出高电平,GPC1DATA bit[3]为1
//高电平和低电平
//操作GPC1DAT bit[3]为1或0
while(1){
GPC1DAT |=8 ;
delay(0x100000);
GPC1DAT &= ~8;
delay(0x100000);
}
}
void delay(unsinged int n){
while(n){
n--;
}
}
arm-linux-gcc -march=armv5te -nostdlib -c -o led.o led.c
-march=armv5te:指定生成的指令架构的版本
-nostdlib:不使用标准库
arm-linux-ld -nostartfiles -nostadlib -Text=0x20008000 -e led_main -o led led.o
-nostartfiles:不使用启动文件
-nostadlib:不使用标准的库函数
-Text:指定代码段的起始地址
-e led_main:指定代码的起始位置,不起作用,只是为了消除警告
arm-linux-objcopy -O binary led led.bin
Makefile:
#elf格式的文件依赖于led.o
led:led.o
arm-linux-ld -nostartfiles -nostdlib -Ttext=0x20008000 -e led_main -o led led.o
arm-linux-objcopy -o bin ary led led.bin
led.o:led.c
arm-linux-gcc -march=armv5te -nostdlib -c -o led.o led.c
clean:
rm -vf led.o led led.bin
以上makefile通用不强,因为写死了
PROG=led
BIN=$(PROG).bin
OBJS=led.o
LC=arm-linux-gcc
LD=arm-linux-ld
OBJCOPY=arm-linux-objcopy
LDFLAGS = nostartfiles -nostdlib
-Ttext 0x20008000 -e led_main
CFLAGS=-march=armv5te -nostblib
#编译规则
$(PROG):(OBJS)
$(LD) $(LDFALGS) -o $(PROG) $(OBJS)
$(OBJCOPY) -o binary $(PROG) $(BIN)
cp $(BIN) /fttpboot
led.o:led.c
$(CC) $(CFLAGS) -c -o led.o led.c
clean:
rm -vf $(OBJS) $(PROG) $(BIN)
通用版本:
PROG=led
BIN=$(PROG).bin
OBJS=led.o
LC=arm-linux-gcc
LD=arm-linux-ld
OBJCOPY=arm-linux-objcopy
LDFLAGS = nostartfiles -nostdlib
-Ttext 0x20008000 -e led_main
CFLAGS=-march=armv5te -nostblib
$(PROG):(OBJS)
$(LD) $(LDFALGS) -o $(PROG) $(OBJS)
$(OBJCOPY) -o binary $(PROG) $(BIN)
cp $(BIN) /fttpboot
%.o:%.c
$(CC) $(CFLAGS) -c -o $@ $<
clean:
rm -vf $(OBJS) $(PROG) $(BIN)
%.o:%.c , 这里的%其实表示*,代表所有
(CC)
(CFLAGS) -c -o
@
< ,其中
@表示∗.o
< 表示 *.c
%、$ 是Makefile内部自定义好了的。
如何点蜂鸣器?
根据管脚核心板原理图中查找:
GPIO管脚的操作
GPD0_1:
GPD0组4个管脚
寄存器
GPD0CON bit[7,4]
GPD0PUD bit[3,2]
GPD0DAT bit[3,2]
然后查看数据手册