Tiny6410之蜂鸣器
在Tiny6410开发板上有一个蜂鸣器,本次的实验就是驱动板子上的蜂鸣器,相当于测试一下板子上的蜂鸣器是否能够正常工作。
一、查看原理图
通用查看Tiny6410的原理图如下图一(a)所示,通过分析该电路图可知:
1、三极管的基极(B)为高电平时三极管导通,此时蜂鸣器就会响。
2、三极管的基极(B)的状态又PWM0决定。
故只要设置PWM0的状态即可让蜂鸣器鸣叫。由下图一(b)可知PWM0对应的寄存器为GPF14(即GPF寄存器)。
图一(a)
图一(b)
二、查看数据手册
根据以往的经验可知,GPF14对应的配置寄存器必为GPFCON,对应的数据寄存器必为GPFDAT。故要启动启动蜂鸣器就必须配置GPF寄存器。
1、配置GPFCON、GPFDAT寄存器的地址。由图二(a)可知GPFCON寄存器的地址位0xF0080A0、GPFDAT寄存器的地址位0xF0080A4。
2、由于蜂鸣器属于输出设备,故配置GPF14位输出。由图二(b)可知01表示输出即GPFCON寄存器的[29:28]设置为01。
3、由图二(c)可知当端口作为输出端口时,管脚状态于相应位的状态相同。即当GPFDAT的14位设置为高(低)电平时就意味着PWM0为高(低)电平。
图二(a)
图二(b)
图二(c)
三、代码编写
Tiny6410Adde.h文件
#ifndef _Tiny6410Addr_H #define _Tiny6410Addr_H //GPF #define GPFCON (*((volatile unsigned long *)0x7F0080A0)) #define GPFDAT (*((volatile unsigned long *)0x7F0080A4)) #endif
buzzer.h文件
void buzzer_on(); void buzzer_off(); void buzzer_init(void);
buzzer.c文件
#include "Tiny6410Addr.h" #include "buzzer.h" void buzzer_on() { GPFDAT |= 1<<14; } void buzzer_off() { GPFDAT &= ~(1<<14); } void buzzer_init(void) { // set GPF14 as output GPFCON |= 1<<28; GPFCON &= ~(1<<29); }
main.c文件
#include "stdio.h" #include "buzzer.h" int main() { buzzer_init();// 初始化buzzer while (1) { int n = 1000; buzzer_on();// 开启蜂鸣器 while(n--); buzzer_off();// 关闭蜂鸣器 } return 0; }
Makefile文件
CC = arm-linux-gcc LD = arm-linux-ld AR = arm-linux-ar OBJCOPY = arm-linux-objcopy OBJDUMP = arm-linux-objdump CFLAGS := -Wall -g -c -O2 objs := buzzer.o main.o buzzer.bin: $(objs) ${LD} -Ttext 0x50000000 -o buzzer.elf $^ ${OBJCOPY} -O binary -S buzzer.elf $@ ${OBJDUMP} -D buzzer.elf > buzzer.dis %.o:%.c ${CC} $(CFLAGS) -o $@ $< %.o:%.S ${CC} $(CFLAGS) -o $@ $< clean: make clean -C lib rm -f *.bin *.elf *.dis *.o
海阔凭鱼跃,天高任鸟飞。