S5P6818学习(4)-------按键中断控制蜂鸣器

void delay_ms(unsigned int num)//这里是毫秒级延时函数
{
    unsigned int i,j;
    for(i=0;i<num;i++)
        for(j=0;j<2000;j++);
}
void beep_init()//这里是蜂鸣器的初始化
{
    GPIOC.ALTFN0 &= ~(3<<28);
    GPIOC.ALTFN0 |= (1<<28);
    
    GPIOC.OUTENB |= (1<<14);
    GPIOC.OUT &= ~(1<<14);
}

void beep_oppo()//这里是蜂鸣器取反操作
{
    GPIOC.OUT ^=(1<<14);
}

void key_irq_init()//这里是按键初始化(采用中断方式)
{
    GPIOB.ALTFN0 &= ~(3<<16);//这里是将对应的引脚设置为GPIO模式
    GPIOB.OUTENB &= ~(1<<8);//将gpio模式的引脚设置为输入模式(input)

    GPIOB.DETMODE0 |=(3 <<16 );//设置GPIO事件监测模式寄存器为上升沿有效
    GPIOB.DETMODEEX &= ~(1<<8);//DETMODEEX这个监测附加寄存器是用来辅助DETMODE,实现输入口的五种模式选择

    GPIOB.DETENB |=(1<<8);    //事件检测使能(相当于有了一辆完整的车并且加上油了)
    
    GPIOB.INTENB |= (1<<8);    //打开GPIO口的中断开关,这里想当与拿到车钥匙了,想开的时候就可以开了。

    GICD_ISENABLER.ISENABLER2 |= (1<<22);//在通用中断分配器中,分配GPIOX的中断(相当于开车库门)

    GICD_ITARGETSR.ITARGETSR21 &= ~(0XFF << 16);//这里是分配核,因为Cortex是8核的(相当于,选择路线)
    GICD_ITARGETSR.ITARGETSR21 |= (1<<16);

    GICD_CTRL |= (1<<0);//这里是为中断分配中断组。
    GICC_CTRL |= (1<<0);//这里是在控制器中打开相应中断组
}


void do_irq(void)
{
    unsigned short irq_number = 0;

    iqr_number = GICC_IAR & 0X3FF;

    switch(irq_number)
    {
        case 86:
            if(GPIOB.DET & (1<<8))
            {
                beep_change();
                GPIOB.DET |= (1<<8);手动将检测模式寄存器的对应为写1清零
            }
         break;
    }
    GICC_EOIR |= (irq_number << 0);//这里表示中断已经结束了。
}

int main()
{
    beep_init();
    key_irq_init();
    
    while(1);
}

 

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
好的,以下是一个简单的S5PV210的利用定时器和蜂鸣器唱歌的程序,供参考: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/mman.h> #define GPD0CON (*(volatile unsigned long *)0xE02000A0) #define GPD0DAT (*(volatile unsigned long *)0xE02000A4) #define TCFG0 (*(volatile unsigned long *)0xE2500000) #define TCFG1 (*(volatile unsigned long *)0xE2500004) #define TCON (*(volatile unsigned long *)0xE2500008) #define TCNTB0 (*(volatile unsigned long *)0xE250000C) #define TCMPB0 (*(volatile unsigned long *)0xE2500010) void delay_ms(int ms) { usleep(ms * 1000); } void set_pwm(int freq, int duty) { int div = 255; int tcfg0 = 0x0; int tcfg1 = 0x0; TCON &= ~(1 << 2); TCON |= (1 << 1); TCON &= ~(1 << 1); tcfg0 = (1 << 16) | (div << 8) | 0xff; tcfg1 = (1 << 12); TCFG0 &= ~(0xff << 8); TCFG0 |= tcfg0; TCFG1 &= ~(0xf << 4); TCFG1 |= tcfg1; TCNTB0 = (1000000 / freq) - 1; TCMPB0 = (1000000 / freq * duty / 255) - 1; TCON |= (1 << 3); TCON &= ~(1 << 3); } void play_music(int *music, int len) { int i; for (i = 0; i < len; i++) { set_pwm(music[i], 128); delay_ms(200); set_pwm(0, 0); delay_ms(10); } } int main(int argc, char **argv) { int fd; volatile unsigned long *gpio; int music[] = { 523, 587, 659, 698, 784, 880, 988, 1047 }; int len = sizeof(music) / sizeof(int); int i; fd = open("/dev/mem", O_RDWR | O_SYNC); if (fd < 0) { perror("open"); exit(1); } gpio = mmap(NULL, 0x100, PROT_READ | PROT_WRITE, MAP_SHARED, fd, (off_t)0xE0200000); if (gpio == MAP_FAILED) { perror("mmap"); exit(1); } GPD0CON &= ~(0xf << 0); GPD0CON |= (0x2 << 0); while (1) { play_music(music, len); } munmap((void *)gpio, 0x100); close(fd); return 0; } ``` 该程序使用了S5PV210的定时器和GPIO控制蜂鸣器,实现了一个简单的音乐播放器。程序中使用了set_pwm()函数来设置定时器和蜂鸣器的工作参数,使用delay_ms()函数来实现延时操作,使用play_music()函数来播放音乐。在main()函数中,不断调用play_music()函数来循环播放音乐。需要注意的是,该程序仅供参考,具体实现方式需要根据具体的硬件和应用场景进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值