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

2023-05-16

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);
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

S5P6818学习(4)-------按键中断控制蜂鸣器 的相关文章

随机推荐