一、
编写程序实现两个按键的中断
每个按键被按下控制一个灯亮灭
代码:
1.do_irq.c
#include "key_init.h" #include "led.h" extern void printf(const char *fmt, ...); unsigned int i = 0; int flag = 0; void do_irq(void) { //1.获取当前触发的中断的中断号 unsigned int irqno=(GICC->IAR&0x3ff); switch(irqno) { case 99://按键1中断 //中断处理 if(flag == 1){ GPIOE->ODR &= (~(0X1 << 10)); //清除GICD的中断就绪标志 GICD->ICPENDR[3] |= (0x1<<3); //清除EXTI的事件触发标志 EXTI->FPR1 |= (0x1<<9); flag = 0; break; } printf("led1_on\n"); LED1_init(); GPIOE->ODR |= (0X1 << 10); //清除GICD的中断就绪标志 GICD->ICPENDR[3] |= (0x1<<3); //清除EXTI的事件触发标志 EXTI->FPR1 |= (0x1<<9); flag ++; break; case 98://按键2中断 //灯灭逻辑同按键1 不赘述 //中断处理 printf("led3_on\n"); LED3_init(); GPIOE->ODR |= (0X1 << 8); //清除GICD的中断就绪标志 GICD->ICPENDR[3] |= (0x1<<3); //清除EXTI的事件触发标志 EXTI->FPR1 |= (0x1<<9); break; } //中断处理完毕 //GICC_EOIR=irqno; GICC->EOIR =irqno; }2.key_init.c
#include "key_init.h" void key1_init() { // 1.使能GPIOF外设时钟 RCC->MP_AHB4ENSETR |= (0X1 << 5); // 2.将PF9管脚设置为输入 GPIOF->MODER &= (~(0X3<<18)); // 3.选择PF9管脚产生EXTI9事件 EXTI->EXTICR3 &= (~(0xff<<8)); EXTI->EXTICR3 |= (0x5<<8); // 4.设置下降沿检测EXTI9事件 EXTI->FTSR1 |=(0X1<<9); // 5.取消EXTI9事件屏蔽 EXTI->C1IMR1 |= (0x1<<9); // 6.全局使能99号中断 GICD->ISENABLER[3] |= (0x1<<3); // 7.设置99号中断的优先级 GICD->IPRIORITYR[24] &= (~(0x1f<<27));//全为0表示优先级最高 // 8.设置99号中断的目标处理器 GICD->ITARGETSR[24] |= (0x1<<24); // 9.全局使能组0中断可以被转发到CPU接口层 GICD->CTRL |= (0x1<<0); // 10.设置中断的优先级掩码 GICC->PMR |= (0x1f<<3);//最低优先级 // 11.全局使能组0中断可以被转发的处理器进行处理 GICC->CTRL |= (0x1<<0); } void key2_init(){ //设置PF8为输入 GPIOF->MODER &= (~(0X3 << 16)); //EXTI共有16种事件 对应编号的管脚产生同样的编号的事件 //所以PF8产生EXTI8事件 //4个EXTI_EXTICR寄存器管理16种事件 4个一组 //所以EXTI_EXTICR3管理8、9、10、11号管脚的事件 EXTI->EXTICR3 &= (~(0XFF)); EXTI->EXTICR3 |= 0X5; //设置EXTI8事件下降沿检测 EXTI->FTSR1 |= (0X1 << 8); //取消事件屏蔽 EXTI->C1IMR1 |= (0X1 << 8); //EXTI设置完毕 之后设置GIC //GIC分两层 GICC GICD //全局使能98号中断 GICD->ISENABLER[3] |= (0x1 << 2); //全局使能组0中断可以被转发到CPU接口层 //GICD->CTRL |= (0x1 << 0); //设置98号的中断优先级 //0是最高优先级 GICD->IPRIORITYR[24] &= (~(0X1F << 19)); //设置98号中断的目标处理器 GICD->ITARGETSR[24] |= (0x1<<16); }3.main.c
#include "key_init.h" #include "led.h" int main() { key1_init(); key2_init(); // 5.GPIOE_ODR[10]设置为1,PE10输出高电平;设置为0,PE10输出低电平 while (1) { } return 0; }

7344

被折叠的 条评论
为什么被折叠?



