00. 目录
01. 控制原理
咱们的蜂鸣器在底板上,所以需要看底板的原理图
打开底板原理图(Tiny4412SDK-1506-Schematic.pdf)
由上图可知,Tiny4412有1个蜂鸣器,控制它们四个引脚分别是GPD0_0,由原理可知,当IO引脚为高电平时,蜂鸣器就响,当IO引脚为低电平时蜂鸣器就不响了。我们要做的工作就是设置GPD0_0为输出功能,且控制且输出电平高低即可。
02. 配置寄存器
由原理图可知,程序只进行了两步操作。
第一步:GPD0功能配置寄存器,地址为0x11400000+0x000000A0=0x114000A0,每四位控制一个引脚,0输入,1输出等等,这里我们用到的是输出功能,相应位(GPDCON[1])配置为1
第二步:GPD0数据寄存器,输出时相应位赋值0/1,可以输出高低电平,引脚配置为输入,读取相应引脚可以获取IO状态,地址为0x11400000+0x000000A4=0x114000A4
03. 程序示例一
蜂鸣器开
gpio.h文件
#ifndef __GPIO_H__
#define __GPIO_H__
typedef volatile unsigned int U32;
typedef volatile unsigned short U16;
typedef volatile unsigned char U8;
//LED
#define GPM4CON *(U32*)0x110002e0
#define GPM4DAT *(U32*)0x110002e4
//Key
#define GPX3CON *(U32*)0x11000c60
#define GPX3DAT *(U32*)0x11000c64
//Buzzer
#define GPD0CON *(U32*)0x114000a0
#define GPD0DAT *(U32*)0x114000a4
//LED初始化
int led_init(void);
//LED 全亮
int led_allon(void);
//LED 全灭
int led_alloff(void);
#endif/*__GPIO_H__*/
lib.c文件
int delay(unsigned int i)
{
while(--i)
;
}
int delay1()
{
unsigned int i = 0xfffff;
while(--i)
;
}
test.c文件
#include "gpio.h"
int main(void)
{
bell_init();
bell_on();
return 0;
}
bell.c文件
#include "gpio.h"
//Buzzer初始化
int bell_init(void)
{
GPD0CON &= ~0xf;
GPD0CON |= 0x1;
return 0;
}
//Buzzer 开
int bell_on(void)
{
GPD0DAT |= 0x1;
return 0;
}
//Buzzer 关
int bell_off(void)
{
GPD0DAT &= ~0x1;
return 0;
}
Makefile
CROSS_COMPILE = arm-linux-
CC = $(CROSS_COMPILE)gcc
CC_FLAGS = -c -I ./
LD = $(CROSS_COMPILE)ld
LD_FLAGS = -T start.lds -Ttext 0x40000000
OBJCOPY = $(CROSS_COMPILE)objcopy
COPY_FLAGS = -O binary
OBJDUMP=$(CROSS_COMPILE)objdump
DUMP_FLAGS=-D
TARGET=test
OBJS=start.o led.o lib.o test.o bell.o
all: $(OBJS)
$(LD) $(LD_FLAGS) $(OBJS) -o $(TARGET)
$(OBJCOPY) $(COPY_FLAGS) $(TARGET) $(TARGET).bin
$(OBJDUMP) $(DUMP_FLAGS) $(TARGET) > $(TARGET).dis
rm -rf *.o
%.o:%.s
$(CC) $(CC_FLAGS) $<
%.o:%.S
$(CC) $(CC_FLAGS) $<
%.o:%.c
$(CC) $(CC_FLAGS) $<
.PHONY:clean
clean:
rm -rf *.o $(TARGET).bin $(TARGET).dis $(TARGET)
04. 程序示例二
蜂鸣器关
#include "gpio.h"
int main(void)
{
bell_init();
bell_off();
return 0;
}
05. 程序示例三
蜂鸣器开1秒 关1秒 如此循环
#include "gpio.h"
int main(void)
{
bell_init();
while(1)
{
bell_on();
delay1();
bell_off();
delay1();
}
return 0;
}
06. 附录
Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary0.pdf