今天我们一起来看看OK6410的蜂鸣器操作,这个也比较简单,和控制LED差不多。

蜂鸣器原理图:

从图中我们可以看出,当PWM_TOUT1为高电平时,蜂鸣器就会响。而PWM_TOUT1接到了GPF15引脚上,下面我们就看看GPF PORT:

GPF相关寄存器:

GPF配置寄存器:

GPF数据寄存器:

既然是GPF15控制蜂鸣器,那么我们把GPF15设置为输出,即让GPFCON [31:30] = 0x00

beep.c源代码:

 

 

#define rGPFCON          (*(volatile unsigned *)(0x7F0080A0))
#define rGPFDAT          (*(volatile unsigned *)(0x7F0080A4))
#define rGPFPUD          (*(volatile unsigned *)(0x7F0080A8))



void msDelay(int time)
{
        volatile unsigned int i,j;
        for(i = 0; i < 2000000; i++)
            for(j=0; j<time; j++);
}


void GPIO_Init(void)
{
    rGPFCON  = rGPFCON & (~(0x1<<(31)));/*GPFCON[31]=0*/
    rGPFCON  = rGPFCON | (0x1<<(30));/*GPFCON[30]=1*/
    rGPFPUD  = rGPFPUD & (~(0x3<<(30)));
    rGPFDAT  = rGPFDAT & 0x7fff;
}

void BeepOn(void)
{
    rGPFDAT = rGPFDAT | 0x8000;    /*GPF15置1*/
}

void BeepOff(void)
{
    rGPFDAT = rGPFDAT & 0x7fff;    /*GPF15置0*/
}

void BeepTest(void)
{
    while(1)
    {
        BeepOn();
        msDelay(10);
        BeepOff();
        msDelay(10);
    }
}

void main(void)
{
    GPIO_Init();
    BeepTest();
}

启动代码start.S(和LED的一样)

 

.globl _start
_start:

    /* Peri port setup */
    ldr r0, =0x70000000
    orr r0, r0, #0x13
    mcr p15,0,r0,c15,c2,4       @ 256M(0x70000000-0x7fffffff)

    /* Disable Watchdog */
    ldr r0, =0x7E004000
    mov r1, #0
    str r1, [r0]

    /* 设置栈 */
    ldr sp, =8*1024

    bl main
halt:
    b halt

Makefile文件

 

all:beep.bin
led.bin: start.o beep.o
    arm-elf-ld -Ttext 0 -o beep.elf start.o beep.o
    arm-elf-objcopy -O binary beep.elf beep.bin
    arm-elf-objdump -D beep.elf > beep.dis  
  
start.o : start.S
    arm-elf-gcc -g -o start.o start.S -c  
  
led.o : led.c
    arm-elf-gcc -g -o beep.o beep.c -c  
  
clean:
    rm *.o beep.elf beep.bin beep.dis

编译完成后,用OpenJTAG调试程序,就会发现OK6410在“滴~滴~”的响。

编译和调试的图就不贴上来了,大家可以参考LED的去做。

 

posted on 2013-02-15 15:11  爱哎唉  阅读(204)  评论(0)    收藏  举报