ARM第三天(LED下、蜂鸣器上)

来源:互联网 发布:apache基金会如何赚钱 编辑:程序博客网 时间:2024/05/22 13:49

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.oled:led.o         arm-linux-ld -nostartfiles -nostdlib -Ttext=0x20008000 -e led_main -o led led.o        arm-linux-objcopy -o bin ary led led.binled.o:led.c    arm-linux-gcc -march=armv5te -nostdlib -c -o led.o led.cclean:    rm -vf led.o led led.bin

以上makefile通用不强,因为写死了

PROG=ledBIN=$(PROG).binOBJS=led.oLC=arm-linux-gccLD=arm-linux-ldOBJCOPY=arm-linux-objcopyLDFLAGS = nostartfiles -nostdlib-Ttext 0x20008000 -e led_mainCFLAGS=-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.cclean:        rm -vf $(OBJS) $(PROG) $(BIN)

通用版本:

PROG=ledBIN=$(PROG).binOBJS=led.oLC=arm-linux-gccLD=arm-linux-ldOBJCOPY=arm-linux-objcopyLDFLAGS = nostartfiles -nostdlib-Ttext 0x20008000 -e led_mainCFLAGS=-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]
然后查看数据手册

0 0
原创粉丝点击