OK6410裸机开发之Beep

来源:互联网 发布:工业大数据挖掘 编辑:程序博客网 时间:2024/04/30 19:28

今天我们一起来看看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, =0x7E004000mov r1, #0str r1, [r0]/* 设置栈 */ldr sp, =8*1024bl mainhalt:b halt

Makefile文件
all:beep.binled.bin: start.o beep.oarm-elf-ld -Ttext 0 -o beep.elf start.o beep.oarm-elf-objcopy -O binary beep.elf beep.binarm-elf-objdump -D beep.elf > beep.dis    start.o : start.Sarm-elf-gcc -g -o start.o start.S -c    led.o : led.carm-elf-gcc -g -o beep.o beep.c -c    clean:rm *.o beep.elf beep.bin beep.dis

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

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


原创粉丝点击