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