12.12

do_irq.c

#include "key_it.h"
int flag1=0;
int flag2=0;
int flag3=0;
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void)
{
    // 获取中断号,根据中断号的不同进行不同的中断处理
    int irqno;
    irqno = GICC->IAR & 0x3ff;
    switch (irqno)
    {
    case 99:
        printf("key1 int\n");
        if(flag1==0)
        {
            led1_on();
            flag1=1;
        }
        else if(flag1==1)
        {
            led1_off();
            flag1=0;
        }

        // 清除exti中断标志位
        EXTI->FPR1 |= (0x1 << 9);
        // 清除GICD中断标志位
        GICD->ICPENDR[3] = (0x1 << 3);
        break;
    case 97:
        printf("key2 int\n");
       if(flag2==0)
        {
            led2_on();
            flag2=1;
        }
        else if(flag2==1)
        {
            led2_off();
            flag2=0;
        }

        // 清除exti中断标志位
        EXTI->FPR1 |= (0x1 << 8);
        // 清除GICD中断标志位
        GICD->ICPENDR[3] = (0x1 << 2);
        break;
    case 98:
        printf("key3 int\n");
       if(flag3==0)
        {
            led3_on();
            flag3=1;
        }
        else if(flag3==1)
        {
            led3_off();
            flag3=0;
        }

        // 清除exti中断标志位
        EXTI->FPR1 |= (0x1 << 7);
        // 清除GICD中断标志位
        GICD->ICPENDR[3] = (0x1 << 1);
        break;
    }
    // 清除IAR寄存器的值,也就是中断号
    GICC->EOIR = irqno;
}
 

 key_it.c

#include"key_it.h"
 
void key1_it_config()
{
 
      //1.设置GPIOF时钟使能
      RCC->MP_AHB4ENSETR |= (0X1<<5);
     // 2.将PF9管脚设置为输入
     GPIOF->MODER &= (~(0x3<<18));
      //3.设置由PF9产生EXTI9事件
      EXTI->EXTICR3 &= (~(0XFF<<8));
      EXTI->EXTICR3 |= (0x05<<8);
     // 4.设置EXTI9事件的检测方式为下降沿检测
     EXTI->FTSR1 |= (0x1<<9);
     // 5.允许中断不屏蔽,可以被转发到GIC
     EXTI->C1IMR1 |= (0x1<<9);
     // 6.允许EXTI9(99号)中断被保存在组0中
     GICD->ISENABLER[3]|= (0x1<<3);
     // 7.设置99号中断优先级
     GICD->IPRIORITYR[24] &= (~(0x1f<<27));
     GICD->IPRIORITYR[24] |= (0x0<<27);
     // 8.设置99号中断可以被CPU0处理
     GICD->ITARGETSR[24] &= (~(0x3<<24));
     GICD->ITARGETSR[24] |= (0x1<<24);
      //9.允许99号中断被转发到CPU接口层
      GICD->CTRL |= 0x1;
      //10.设置中断优先级掩码
      GICC->PMR |= (0x1f<<3);
      //11.允许中断被转发给CPU处理
      GICC->CTRL |=0x1;
    
 
}
void key2_it_config()
{
    //1.设置GPIOF时钟使能
      RCC->MP_AHB4ENSETR |= (0X1<<5);
     // 2.将PF9管脚设置为输入
     GPIOF->MODER &= (~(0x3<<16));
      //3.设置由PF9产生EXTI9事件
      EXTI->EXTICR2 &= (~(0XFF<<24));
      EXTI->EXTICR2 |= (0x05<<24);
     // 4.设置EXTI9事件的检测方式为下降沿检测
     EXTI->FTSR1 |= (0x1<<7);
     // 5.允许中断不屏蔽,可以被转发到GIC
     EXTI->C1IMR1 |= (0x1<<7);
     // 6.允许EXTI9(97号)中断被保存在组0中
     GICD->ISENABLER[3]|= (0x1<<1);
     // 7.设置97号中断优先级
     GICD->IPRIORITYR[24] &= (~(0x1f<<11));
     GICD->IPRIORITYR[24] |= (0x0<<11);
     // 8.设置97号中断可以被CPU0处理
     GICD->ITARGETSR[24] &= (~(0x3<<8));
     GICD->ITARGETSR[24] |= (0x1<<8);
      //9.允许97号中断被转发到CPU接口层
      GICD->CTRL |= 0x1;
      //10.设置中断优先级掩码
      GICC->PMR |= (0x1f<<3);
      //11.允许中断被转发给CPU处理
      GICC->CTRL |=0x1;
    
}
void key3_it_config()
{
    //1.设置GPIOF时钟使能
      RCC->MP_AHB4ENSETR |= (0X1<<5);
     // 2.将PF9管脚设置为输入
     GPIOF->MODER &= (~(0x3<<14));
      //3.设置由PF9产生EXTI9事件
      EXTI->EXTICR3 &= (~(0XFF));
      EXTI->EXTICR3 |= (0x05);
     // 4.设置EXTI9事件的检测方式为下降沿检测
     EXTI->FTSR1 |= (0x1<<8);
     // 5.允许中断不屏蔽,可以被转发到GIC
     EXTI->C1IMR1 |= (0x1<<8);
     // 6.允许EXTI9(98号)中断被保存在组0中
     GICD->ISENABLER[3]|= (0x1<<2);
     // 7.设置98号中断优先级
     GICD->IPRIORITYR[24] &= (~(0x1f<<19));
     GICD->IPRIORITYR[24] |= (0x0<<19);
     // 8.设置98号中断可以被CPU0处理
     GICD->ITARGETSR[24] &= (~(0x3<<16));
     GICD->ITARGETSR[24] |= (0x1<<16);
      //9.允许98号中断被转发到CPU接口层
      GICD->CTRL |= 0x1;
      //10.设置中断优先级掩码
      GICC->PMR |= (0x1f<<3);
      //11.允许中断被转发给CPU处理
      GICC->CTRL |=0x1;
    
}

main.c

#include "key_it.h"

 #include "led.h"

void delay(int ms)

{

  int i,j;

  for(i=0;i

key_it.h

 

#ifndef __KEY_IT_H__
#define __KEY_IT_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gic.h"
  #include "led.h"
void key1_it_config();
void key2_it_config();
void key3_it_config();
#endif

你可能感兴趣的:(visualstudio)