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

该文描述了一个基于STM32MP1xx微处理器的按键中断处理程序,通过EXTI控制器和GIC(GenericInterruptController)初始化,实现按键按下后打印特定序列的功能。当按键1、2、3被按下时,分别打印11111111、22222222、33333333,并在延迟500毫秒后清除中断挂起标志位。
摘要由CSDN通过智能技术生成

要求:例如:当按键1按下之后,打印11111111

key.c代码如下:

#include "key.h"                                                           
                                                                           
//EXTI控制器初始化                                                         
void exit_init()                                                           
{                                                                          
    //使能GPIOF组控制器                                                    
    RCC->MP_AHB4ENSETR |= (0x1<<5);                                        
    //通过GPIOF_MODER寄存器设置PF9/PF7/PF8为输入模式                       
    GPIOF->MODER &= (~(0x3<<18));                                          
    GPIOF->MODER &= (~(0x3<<14));                                          
    GPIOF->MODER &= (~(0x3<<16));                                          
                                                                           
    EXTI->EXTICR3 &= (~(0xff<<8));                                         
    EXTI->EXTICR3 |= (0x05<<8);                                            
                                                                           
    EXTI->EXTICR2 &= (~(0xff<<24));                                        
    EXTI->EXTICR2 |= (0x05<<24);                                           
                                                                           
    EXTI->EXTICR3 &= (~(0xff<<0));                                         
    EXTI->EXTICR3 |= (0x05<<0);                                            
                                                                           
    EXTI->C1IMR1 |=(0x1<<9);                                               
    EXTI->C1IMR1 |=(0x1<<7);                                               
    EXTI->C1IMR1 |=(0x1<<8);                                               
                                                                           
    EXTI->FTSR1 |=(0x1<<9);                                                
    EXTI->FTSR1 |=(0x1<<7);                                                
    EXTI->FTSR1 |=(0x1<<8);                                                
                                                                           
}                                                                          
//GICD控制器初始化                                      
void gicd_init()                                        
{                                                       
    //设置GICD层CPU0组使能                              
    GICD->CTRL |= (0x1<<0);                             
                                                        
    GICD->ISENABLER[3] |= (0x1<<3);                     
    GICD->ISENABLER[3] |= (0x1<<1);                     
    GICD->ISENABLER[3] |= (0x1<<2);                     
                                                        
    //中断屏蔽寄存器                                    
    GICD->IPRIORITYR[24] |= (0x1<<27);                  
    GICD->IPRIORITYR[24] |= (0x2<<11);                  
    GICD->IPRIORITYR[24] |= (0x3<<19);                  
                                                        
    //中断目标分配寄存器                                
    GICD->ITARGETSR[24] |= (0x1<<24);                   
    GICD->ITARGETSR[24] |= (0x1<<8);                    
    GICD->ITARGETSR[24] |= (0x1<<16);                   
                                                        
}                                                       
                                                        
//GICC控制器初始化                                      
void gicc_init()                                        
{                                                       
    GICC->CTRL |= (0x1<<0);                             
                                                        
    GICC->PMR |= (0xA<<3);                              
                                                        
}                                                       

key.h代码如下:

#ifndef __KEY_H__                         
#define __KEY_H__                         
                                          
#include "stm32mp1xx_gic.h"               
#include "stm32mp1xx_rcc.h"               
#include "stm32mp1xx_exti.h"              
#include "stm32mp1xx_gpio.h"              
                                          
                                          
                                          
                                          
//EXTI控制器初始化                        
void exit_init();                         
                                          
//GICD控制器初始化                        
void gicd_init();                         
                                          
//GICC控制器初始化                        
void gicc_init();                         
                                          
#endif                                    

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()
{

    exit_init();
    gicd_init();
    gicc_init();
    while(1)
    {

    }

    return 0;                                
}

do_irq.c

#include "key.h"                           
extern void printf(const char *fmt, ...);  
extern void delay_ms(int ms);              
unsigned int i = 0;                        
void do_irq(void)                          
{                                          
                                           
    //获取中断号                           
    int num = GICC->IAR &(0x3ff<<0);       
                                           
    //判断中断号                           
    if(num==99)                            
    {                                      
        delay_ms(500);                     
        printf("11111111\n");              
        EXTI->FPR1 |= (0x1<<9);            
        GICD->ICPENDR[3] |= (0x1<<3);      
    }                                      
    else if(num==97)                       
    {                                      
        delay_ms(500);                     
        printf("22222222\n");              
        EXTI->FPR1 |= (0x1<<7);            
        GICD->ICPENDR[3] |= (0x1<<1);      
    }                                      
    else if(num==98)                       
    {                                      
        delay_ms(500);                     
        printf("33333333\n");              
        EXTI->FPR1 |= (0x1<<8);            
        GICD->ICPENDR[3] |= (0x1<<2);      
    }                                      
                                           
    //99:KEY1按键按下                     
    //清楚中断挂起标志位                   
    GICC->EOIR &= (~(0x3ff<<0));           
     GICC->EOIR |= num;                    
}                                          
                                           

结果如下:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值