#include key_it.h extern void printf(const char *fmt, ...); unsigned int i 0; void do_irq(void) { // 获取中断号 unsigned int irqno (GICC-IAR 0x3ff); switch (irqno) { // 按键1中断处理 case 99: // 进行中断处理 if (GPIOE-ODR (0x1 10)) { led1_ctl(0); } else if (!(GPIOE-ODR (0x1 10))) { led1_ctl(1); } printf(do_key1_int\n); // 清除GICD的中断排队标志 GICD-ICPENDR[3] | (0x1 3); // 清除EXTI中的事件挂起标志 EXTI-FPR1 | (0x1 9); break; // 按键2中断处理 case 97: if (GPIOE-ODR (0x1 9)) { fan_ctl(0); } else if (!(GPIOE-ODR (0x1 9))) { fan_ctl(1); } // if (GPIOF-ODR (0x1 10)) // { // led2_ctl(0); // } // if (!(GPIOF-ODR (0x1 10))) // { // led2_ctl(1); // } // printf(do_key2_int\n); // 清除GICD的中断排队标志 GICD-ICPENDR[3] | (0x1 1); // 清除EXTI中的事件挂起标志 EXTI-FPR1 | (0x1 7); break; // 按键3中断处理 case 98: if (GPIOE-ODR (0x1 8)) { led3_ctl(0); } else if (!(GPIOE-ODR (0x1 8))) { led3_ctl(1); } printf(do_key3_int\n); // 清除GICD的中断排队标志 GICD-ICPENDR[3] | (0x1 2); // 清除EXTI中的事件挂起标志 EXTI-FPR1 | (0x1 8); break; } GICC-EOIR irqno; }#include key_it.h void RCC_GIC_init() { //使能GPIOF外设时钟 RCC-MP_AHB4ENSETR | (0x15); //全局使能组0中断被转发到GICC层 GICD-CTRL | 0X1; //设置中断的优先级掩码 GICC-PMR | (0x1f3); //全局使能组0中断被转发给处理器 GICC-CTRL | (0x1); } void key1_config() { // //使能GPIOF外设时钟 // RCC-MP_AHB4ENSETR | (0x15); // //将PF9设置为输入 // GPIOE-MODER (~(0x318)); // //设置PF9生成EXIT9事件 // EXTI-EXTICR3 (~(0xff8)); // EXTI-EXTICR3 | (0x058); // //设置下降沿检测EXTI9事件 // EXTI-FTSR1 | (0x19); // //取消EXTI9的事件屏蔽 // EXTI-C1IMR1 | (0x19); // //使能99号中断 // GICD-ISENABLER[3] | (0x13); // //设置99号中断优先级 // GICD-IPRIORITYR[24] (~(0x1f27)); // //设置99号中断的目标处理器 // GICD-ITARGETSR[24] | (0x124); // //全局使能组0中被转发到GICC层 // GICD-CTRL | 0x1; // //设置中断的优先级掩码 // GICC-PMR | (0x1f3); // //全局使能组0中断被转发给处理器 // GICC-CTRL | (0x1); //将PF9设置为输入 GPIOF-MODER (~(0x318)); //设置PF9生成EXTI9事件 EXTI-EXTICR3 (~(0xff8)); EXTI-EXTICR3 | (0x058); //设置下降沿检测EXTI9事件 EXTI-FTSR1 | (0x19); //取消EXTI9的事件屏蔽 EXTI-C1IMR1 | (0X19); //使能99号中断 GICD-ISENABLER[3] | (0X13); //设置99号中断的优先级 GICD-IPRIORITYR[24] (~(0x1f27)); //设置99号中断的目标处理器 GICD-ITARGETSR[24] | (0x124); //全局使能组0中断被转发到GICC层 } void key2_config() { //将PF7设置为输入 GPIOF-MODER (~(0x314)); //设置PF7生成EXTI7事件 EXTI-EXTICR2 (~(0xff24)); EXTI-EXTICR2 | (0x0524); //设置下降沿检测EXTI7事件 EXTI-FTSR1 | (0x17); //取消EXTI7的事件屏蔽 EXTI-C1IMR1 | (0X17); //使能97号中断 GICD-ISENABLER[3] | (0X11); //设置97号中断的优先级 GICD-IPRIORITYR[24] (~(0x1F11)); //设置97号中断的目标处理器 GICD-ITARGETSR[24] | (0x18); } void key3_config() { //将PF8设置为输入 GPIOF-MODER (~(0x316)); //设置PF8生成EXTI8事件 EXTI-EXTICR3 (~(0xff)); EXTI-EXTICR3 | (0x05); //设置下降沿检测EXTI8事件 EXTI-FTSR1 | (0x18); //取消EXTI8的事件屏蔽 EXTI-C1IMR1 | (0X18); //使能98号中断 GICD-ISENABLER[3] | (0X12); //设置98号中断的优先级 GICD-IPRIORITYR[24] (~(0x1f19)); //设置98号中断的目标处理器 GICD-ITARGETSR[24] | (0x116); } void led1_init() { // 设置PE10输出模式 GPIOE-MODER (~(0x3 20)); GPIOE-MODER | (0x1 20); // 设置PE10为推挽输出 GPIOE-OTYPER (~(0x1 10)); // 设置PE10低速输出 GPIOE-OSPEEDR (~(0x3 20)); // 设置PE10无上拉电阻 GPIOE-PUPDR (~(0x3 20)); } void led2_init() { // 设置PF10输出模式 GPIOF-MODER (~(0x3 20)); GPIOF-MODER | (0x1 20); // 设置PF10为推挽输出 GPIOF-OTYPER (~(0x1 10)); // 设置pF10低速输出 GPIOF-OSPEEDR (~(0x3 20)); // 设置PF10无上拉电阻 GPIOF-PUPDR (~(0x3 20)); } void led3_init() { // 设置PE8输出模式 GPIOE-MODER (~(0x3 16)); GPIOE-MODER | (0x1 16); // 设置PE8为推挽输出 GPIOE-OTYPER (~(0x1 8)); // 设置PE8低速输出 GPIOE-OSPEEDR (~(0x3 16)); // 设置PE8无上拉电阻 GPIOE-PUPDR (~(0x3 16)); } //风扇 void fan_init() { // 设置PE10输出模式 GPIOE-MODER (~(0x318)); GPIOE-MODER | (0x118); //设置PE10推挽输出 GPIOE-OTYPER (~(0x19)); //设置PE10低速输出 GPIOE-OSPEEDR (~(0x318)); //设置PE10无上拉下拉电阻 GPIOE-PUPDR (~(0x318)); } void led1_ctl(int flag) { if (flag 1) { GPIOE-ODR | (0x1 10); } else if (flag 0) { GPIOE-ODR (~(0x1 10)); } } void fan_ctl(int flag) { if (flag 1) { GPIOE-ODR | (0x1 9); } else if (flag 0) { GPIOE-ODR (~(0x1 9)); } } void led2_ctl(int flag) { if (flag 1) { GPIOF-ODR | (0x1 10); } else if (flag 0) { GPIOF-ODR (~(0x1 10)); } } void led3_ctl(int flag) { if (flag 1) { GPIOE-ODR | (0x1 8); } else if (flag 0) { GPIOE-ODR (~(0x1 8)); } } //延时函数 void delay_ms(int ms) { int i,j; for(i0;ims;i) { for(j0;j2000;j); } }