小说网站 做百度联盟广州seo软件
设置按键中断,按键1按下,LED亮,再按一次,灭
按键2按下,蜂鸣器响。再按一次,不响
按键3按下,风扇转,再按一次,风扇停
src/do_irq.c
#include "key_it.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void)
{int irqno;//保存中断号printf("%d\n",irqno);irqno = GICC->IAR&0x3ff;switch(irqno){case 99://key1//按键1中断处理printf("KEY1 灯亮灭\n");if(GPIOE->ODR & (0X1<<10)){GPIOE->ODR &= (~(0X1<<10));}else{GPIOE->ODR |= (0X1<<10);}//清除挂起中断标志位GICD_ICPENDRxGICD->ICPENDR[3] |= (0X1<<3);//清除中断触发标志位EXTI_FPR1EXTI->FPR1 |= (0X1<<9);break;case 97://key2//按键2中断处理printf("KEY2 蜂鸣器\n");if(GPIOB->ODR & (0X1<<6)){GPIOB->ODR &= (~(0X1<<6));}else{GPIOB->ODR |= (0X1<<6);}//清除挂起中断标志位GICD_ICPENDRxGICD->ICPENDR[3] |= (0X1<<1);//清除中断触发标志位EXTI_FPR1EXTI->FPR1 |= (0X1<<7);break;case 98://key3//按键3中断处理printf("KEY3 风扇\n");if(GPIOE->ODR & (0X1<<9)){GPIOE->ODR &= (~(0X1<<9));}else{GPIOE->ODR |= (0X1<<9);}//清除挂起中断标志位GICD_ICPENDRxGICD->ICPENDR[3] |= (0X1<<2);//清除中断触发标志位EXTI_FPR1EXTI->FPR1 |= (0X1<<8);break;}//清除处理完的中断号GICC_EOTRGICC->EOIR = irqno;
}
src/key_it.c
#include"key_it.h"void key3_it_config()
{//RCC使能GPIOF时钟RCC->MP_AHB4ENSETR |= (0x1<<5);GPIOF->MODER &= (~(0x3<<16));EXTI->EXTICR3 &=(~(0xFF<<0));EXTI->EXTICR3 |= (0x5<<0);EXTI->FTSR1 |= (0x1<<8);EXTI->C1IMR1 |= (0x1<<8);GICD->ISENABLER[3] |= (0X1<<2); GICD->IPRIORITYR[24] &= (~(0X1F<<19)); GICD->ITARGETSR[24] &= (~(0X3<<16));GICD->ITARGETSR[24] |= (0X1<<16);
}
void key_it_config()
{//RCC使能GPIOF时钟RCC->MP_AHB4ENSETR |= (0x1<<5);//设置PF9 PF7 PF8GPIO输入//PF9GPIOF->MODER &= (~(0x3<<18));//PF8// GPIOF->MODER &= (~(0x3<<16));//pf7GPIOF->MODER &= (~(0x3<<14));//设置PF9 PF7 PF8产生EXTI事件 EXTI_EXTICRx//pf7EXTI->EXTICR2 &=(~(0xFF<<24));EXTI->EXTICR2 |= (0x5<<24);//pf8// EXTI->EXTICR3 &=(~(0xFF<<0));// EXTI->EXTICR3 |= (0x5<<0);//pf9EXTI->EXTICR3 &=(~(0xFF<<8));EXTI->EXTICR3 |= (0x5<<8);//设置事件触发方式为下降沿触发EXTI_FTSR1//pf7EXTI->FTSR1 |= (0x1<<7);//pf8// EXTI->FTSR1 |= (0x1<<8);//pf9EXTI->FTSR1 |= (0x1<<9);//设置EXTI事件触发不屏蔽EXTI_IMR1//PF7EXTI->C1IMR1 |= (0x1<<7);//PF8// EXTI->C1IMR1 |= (0x1<<8);//PF9EXTI->C1IMR1 |= (0x1<<9);//使能中断能转发到特定的CPU接口层GICD_ISENABLERx//PF7 97号中断GICD->ISENABLER[3] |= (0X1<<1); //PF78 98号中断// GICD->ISENABLER[3] |= (0X1<<2); //PF9 99号中断GICD->ISENABLER[3] |= (0X1<<3); // GICD_ISENABLERx设置中断优先级//PF7GICD->IPRIORITYR[24] &= (~(0X1F<<11)); //PF8// GICD->IPRIORITYR[24] &= (~(0X1F<<19)); //PF9GICD->IPRIORITYR[24] &= (~(0X1F<<27)); //设置当前中断被转发到哪一个CPU处理GICD_ITARGETSRx//pf7 97中断GICD->ITARGETSR[24] &= (~(0X3<<8));GICD->ITARGETSR[24] |= (0X1<<8);//pf8 98中断// GICD->ITARGETSR[24] &= (~(0X3<<16));// GICD->ITARGETSR[24] |= (0X1<<16);//pf9 99中断GICD->ITARGETSR[24] &= (~(0X3<<24));GICD->ITARGETSR[24] |= (0X1<<24);//使能组0转发中断GICD_CTLRGICD->CTRL |= 0X1;//设置中断优先级掩码GICC_PMRGICC->PMR |= (0x1F<<3);//使能CPU可以处理组0转发的中断GICC_CTLRGICC->CTRL |= 0X1;}
//灯1初始化
void led1_init()
{RCC->MP_AHB4ENSETR |= (0x1<<4);GPIOE->MODER &= (~(0X3<<20));GPIOE->MODER |= (0X1<<20);GPIOE->OTYPER &= (~(0X1<<10));GPIOE->OSPEEDR &= (~(0X3<<20));GPIOE->PUPDR &= (~(0X3<<20));}
//蜂鸣器初始化
void tim_init()
{RCC->MP_AHB4ENSETR |= (0x1<<1);GPIOB->MODER &= (~(0X3<<12));GPIOB->MODER |= (0X1<<12);GPIOB->OTYPER &= (~(0X1<<6));GPIOB->OSPEEDR &= (~(0X3<<12));GPIOB->PUPDR &= (~(0X3<<12));}
//风扇初始化
void fan_init()
{RCC->MP_AHB4ENSETR |= (0x1<<4);GPIOE->MODER &= (~(0X3<<18));GPIOE->MODER |= (0X1<<18);GPIOE->OTYPER &= (~(0X1<<9));GPIOE->OSPEEDR &= (~(0X3<<18));GPIOE->PUPDR &= (~(0X3<<18));}
测试结果