今天我们一起来看看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的去做。