首页 > 代码库 > Tiny6410之蜂鸣器

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
Tiny6410Addr.h

buzzer.h文件

技术分享
void buzzer_on();
void buzzer_off();
void buzzer_init(void);
buzzer.h

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);
}
buzzer.c

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;
}
main.c

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
    
Makefiel

 

Tiny6410之蜂鸣器