今天我们一起来看看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的去做。
浙公网安备 33010602011771号