按鍵控制LED燈亮和滅
do_irq.c
#include "key_it.h"
//#include "led.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void)
{//獲取中斷號unsigned int irqno=(GICC->IAR & (0x3FF));switch (irqno){case 99://處理中斷GPIOE->ODR ^= (0x1<<8);//清除中斷隊列GICD->ICPENDR[3] |= (0x1<<3);//清除中斷掛起標志EXTI->FPR1 |= (0x1<<9);break;case 98://處理中斷GPIOE->ODR ^= (0x1<<10);//清除中斷隊列GICD->ICPENDR[3] |= (0x1<<2);//清除中斷掛起標志EXTI->FPR1 |= (0x1<<8);break;case 97://處理中斷GPIOF->ODR ^= (0x1<<10);//清除中斷隊列GICD->ICPENDR[3] |= (0x1<<1);//清除中斷掛起標志EXTI->FPR1 |= (0x1<<7);break;default:break;}//清除中斷號GICC->EOIR = irqno;
}
key_it.c
#include "key_it.h"//按鍵1初始化
void key1_init(){//使能GPIOF的RCC時鐘RCC->MC_AHB4ENSETR |= (0x1<<5);//配置PF9為輸入模式GPIOF->MODER &= (~(0x3<<18));//配置中斷選擇器EXTI9為PFEXTI->EXTICR3 &= (~(0xFF<<8));EXTI->EXTICR3 |= (0x05<<8);//配置為下降沿觸發EXTI->FTSR1 |= (0x1<<9);//使能中斷,關閉中斷屏蔽EXTI->C1IMR1 |= (0x1<<9);//設置中斷使能GICD->ISENABLER[3] |= (0x1<<3);//設置中斷優先級GICD->IPRIORITYR[24] &= (~(0x1F<<27));//設置中斷處理cpuGICD->ITARGETSR[24] |= (0x1<<24);//使能中斷,中斷默認在組0GICD->CTRL |=(0x1);//設置使能GICC->CTRL |= (0x1);//設置優先級掩碼GICC->PMR |= (0x1f<<3);}//按鍵2初始化
void key2_init(){//配置PF7為輸入模式GPIOF->MODER &= (~(0x3<<14));//配置中斷選擇器EXTI7為PFEXTI->EXTICR2 &= (~(0xFF<<24));EXTI->EXTICR2 |= (0x05<<24);//配置為下降沿觸發EXTI->FTSR1 |= (0x1<<7);//使能中斷,關閉中斷屏蔽EXTI->C1IMR1 |= (0x1<<7);//設置中斷使能GICD->ISENABLER[3] |= (0x1<<1);//設置中斷優先級GICD->IPRIORITYR[24] &= (~(0x1F<<11));//設置中斷處理cpuGICD->ITARGETSR[24] |= (0x1<<8);//使能中斷,中斷默認在組0GICD->CTRL |=(0x1);//設置使能GICC->CTRL |= (0x1);//設置優先級掩碼GICC->PMR |= (0x1f<<3);
}//按鍵3初始化
void key3_init(){//配置PF8為輸入模式GPIOF->MODER &= (~(0x3<<16));//配置中斷選擇器EXTI8為PFEXTI->EXTICR3 &= (~0xFF);EXTI->EXTICR3 |= 0x05;//配置為下降沿觸發EXTI->FTSR1 |= (0x1<<8);//使能中斷,關閉中斷屏蔽EXTI->C1IMR1 |= (0x1<<8);//設置中斷使能GICD->ISENABLER[3] |= (0x1<<2);//設置中斷優先級GICD->IPRIORITYR[24] &= (~(0x1F<<19));//設置中斷處理cpuGICD->ITARGETSR[24] |= (0x1<<16);//使能中斷,中斷默認在組0GICD->CTRL |=(0x1);//設置使能GICC->CTRL |= (0x1);//設置優先級掩碼GICC->PMR |= (0x1f<<3);
}
led.h
#ifndef __LED_H__
#define __LED_H__/*//gpio寄存器
typedef struct{volatile unsigned int MODER;volatile unsigned int OTYPER;volatile unsigned int OSPEEDR;volatile unsigned int PUPDR;volatile unsigned int IDR;volatile unsigned int ODR;volatile unsigned int BSRR;
}gpio_t;*///GPIOE和GPIOF寄存器宏定義
//#define GPIOE (*(gpio_t *)0x50006000)
//#define GPIOF (*(gpio_t *)0x50007000)//led燈1初始化
void led1_init();
//led燈2初始化
void led2_init();
//led燈3初始化
void led3_init();//led燈1控制
void led1_ctl(int flag);
//led燈2控制
void led2_ctl(int flag);
//led燈3控制
void led3_ctl(int flag);#endif
main.c
#include "gpio.h"
#include "led.h"
#include "uart4.h"
#include "key_it.h"void delay(){for(int i=0;i<500;i++){for(int j=0;j<2000;j++){}}
}
extern void printf(const char *fmt, ...);
int main()
{//使能PE、PF時鐘*((unsigned int *)0x50000A28) |= (0x3<<4); led1_init();led2_init();led3_init();key1_init();key2_init();key3_init();while (1){printf("do_main\n");delay(1000);}return 0;
}