按下按键之后,打印一句话------>三个按键需要实现

main.c:

#include "key.h"

extern void printf(const char *fmt, ...);

void delay_ms(int ms){    

int i,j;    

for(i = 0; i < ms;i++)  

     for (j = 0; j < 1800; j++);}

int main(){  

 //key1键盘  

 //EXIT控制器初始化  

 void PF9_exti_init();  

 //GICD控制器初始化 

  void PF9_gicd_init();  

 //gicc控制器初始化 

  void PF9_gicc_init(); 

   //key2键盘  

 //EXIT控制器初始化  

 void PF7_exti_init();  

 //GICD控制器初始化

    void PF7_gicd_init(); 

   //gicc控制器初始化  

 void PF7_gicc_init();    

//key3键盘  

 //EXIT控制器初始化 

   void PF8_exti_init(); 

   //GICD控制器初始化  

 void PF8_gicd_init();  

 //gicc控制器初始化  

 void PH8_gicc_init();  

 while(1)    { 

   }  

 return 0;

}

key.h:

#ifndef __KEY_h__

#define __KEY_h__

#include "stm32mp1xx_gpio.h"

#include "stm32mp1xx_exti.h"

#include "stm32mp1xx_rcc.h"

#include "stm32mp1xx_gic.h"

 

//key1键盘

//EXIT控制器初始化

void PF9_exti_init();

//GICD控制器初始化

void PF9_gicd_init();

//gicc控制器初始化

void PF9_gicc_init();

 

//key2键盘

//EXIT控制器初始化

void PF7_exti_init();

//GICD控制器初始化

void PF7_gicd_init();

//gicc控制器初始化

void PF7_gicc_init();

 

//key3键盘

//EXIT控制器初始化

void PF8_exti_init();

//GICD控制器初始化

void PF8_gicd_init();

//gicc控制器初始化

void PH8_gicc_init();

 

#endif

key.c:

#include "key.h"


//EXIT控制器初始化
void PF9_exit_init()
{
    //------RCC章节-----------
    RCC->MP_AHB4ENSETR |=0x01 << 5;
    //-------输入模式--------------
    //key1
    GPIOF->MODER |=(~(0x03 << 18));

    //初始化EXIT
    EXTI->EXTICR3 &=(~(0xff << 8));
    EXTI->EXTICR3 |=(0x05 << 8);
    //编写事件
    EXTI->FTSR1 |= 0x01 << 9;
    EXTI->C1IMR1 |= 0x01 << 9;
}

void PF7_exit_init()
{
    //------RCC章节-----------
    RCC->MP_AHB4ENSETR |=0x01 << 5;
    //-------输入模式--------------
    //key1
    GPIOF->MODER |=(~(0x03 << 14));

    //初始化EXIT
    EXTI->EXTICR3 &=(~(0xff << 24));
    EXTI->EXTICR3 |=(0x05 << 24);
    //编写事件
    EXTI->FTSR1 |= 0x01 << 7;
    EXTI->C1IMR1 |= 0x01 << 7;
}
void PF8_exit_init()
{
    //------RCC章节-----------
    RCC->MP_AHB4ENSETR |=0x01 << 5;
    //-------输入模式--------------
    //key1
    GPIOF->MODER |=(~(0x03 << 16));

    //初始化EXIT
    EXTI->EXTICR3 |=(0x05 << 0);
    //编写事件
    EXTI->FTSR1 |= 0x01 << 8;
    EXTI->C1IMR1 |= 0x01 << 8;
}

//GICD控制器初始化
void PF9_gicd_init()
{
    GICD->CTRL |=0x01 << 0;

    GICD->ISENABLER[3] |=0x01 << 3;

    GICD->IPRIORITYR[24] &= (~(0x1f << 27));

    GICD->ITARGETSR[24] &= (~(0x3 << 24));
    GICD->ITARGETSR[24] |= 0x1 << 24;
}

//GICD控制器初始化
void PF7_gicd_init()
{
    GICD->CTRL |=0x01 << 0;

    GICD->ISENABLER[3] |=0x01 << 3;

    GICD->IPRIORITYR[24] |= (0x1f << 11);

    GICD->ITARGETSR[24] |= 0x1 << 8;
}

//GICD控制器初始化
void PF8_gicd_init()
{
    GICD->CTRL |=0x01 << 0;

    GICD->ISENABLER[3] |=0x01 << 2;

    GICD->IPRIORITYR[24] |= (0x1f << 19);

    GICD->ITARGETSR[24] |= 0x1 << 16;
}

//GICC控制器初始化
void PF9_gicc_init()
{

    GICC->CTRL |=0x01 << 0;

    GICC->PMR &=(~(0x1f << 3));

    GICC->PMR |=(0x1f << 3);
}


//GICC控制器初始化
void PF7_gicc_init()
{

    GICC->CTRL |=0x01 << 0;

    GICC->PMR |=(0x02 << 2);
}


//GICC控制器初始化
void PF8_gicc_init()
{

    GICC->CTRL |=0x01 << 0;

    GICC->PMR |=(0x02 << 2);
}

do_irq:

#include "key.h"
extern void printf(const char *fmt, ...);
extern void delay_ms(int ms);
unsigned int i = 0;
void do_irq(void) 
{
    unsigned int num =0;
    //获取中断信号
    num=GICC->IAR;
    //判断终端的好坏
    switch(num)
    {
        //99:key1键盘按下
    case 99:
        delay_ms(500);
        printf("key1---------");

        EXTI->FPR1 |= (0X1<<9);

        GICD->ICPENDR[3] |=(0x01 << 3);
        break;

        //97:key2键盘按下
    case 97:
        delay_ms(500);
        printf("key2---------");

        EXTI->FPR1 |= (0X1<<7);

        GICD->ICPENDR[3] |=(0x01 << 1);
        break;
        //98:key3键盘按下
    case 98:
        delay_ms(500);
        printf("key3---------");

        EXTI->FPR1 |= (0X1<<8);

        GICD->ICPENDR[3] |=(0x01 << 2);
        break;
        
    default:
        delay_ms(500);
        printf("输入错误,请重新输入!---------");

    }
    //清楚中断状态位
    GICC->EOIR &= (~(0x3ff << 0));
    GICC->EOIR |=num;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值