2022/12/29 ARM 中断实验

头文件

#ifndef __KEY_H__              
#define __KEY_H__              
                               
#include "stm32mp1xx_rcc.h"    
#include "stm32mp1xx_gpio.h"   
#include "stm32mp1xx_exti.h"   
#include "stm32mp1xx_gic.h"    
                               
//初始化RCC和GPIO章节          
void hal_gpio_key1();          
                               
//初始化EXTI章节               
void hal_key1_exti_it();       
                               
//初始化GICD章节               
void hal_key1_gicd_it();       
                               
//初始化GICC章节               
void hal_key1_gicc_it();       
                               
void hal_gpio_key2();          
void hal_key2_exti_it();       
void hal_key2_gicd_it();       
void hal_key2_gicc_it();       
                               
void hal_gpio_key3();          
void hal_key3_exti_it();       
void hal_key3_gicd_it();       
void hal_key3_gicc_it();       
#endif                         

功能文件

#include "key.h"
/**********************KEY1--->PF9******************************/
//初始化RCC和GPIO章节
void hal_gpio_key1()
{
    RCC->MP_AHB4ENSETR |= (0x1 << 5);
    //key1
    GPIOF->MODER &= (~(0x3 << 18));
}

//初始化EXTI章节
void hal_key1_exti_it()
{
    //EXTI_EXTICRn
    EXTI->EXTICR3 &= (~(0xff << 8));
    EXTI->EXTICR3 |= (0x05 << 8);

    //EXTI_FTSR1
    EXTI->FTSR1 |= (0x1 << 9);

    //EXTI_IMR1
    EXTI->C1IMR1 |= (0x1 << 9);
}

//初始化GICD章节
void hal_key1_gicd_it()
{
    //GICD_CTRL
    GICD->CTRL |= (0x1);

    //GICD_ISENABLERx
    GICD->ISENABLER[3] |= (0x1 << 3);

    //GICD_IPRIORITYRx
    GICD->IPRIORITYR[24] |= (0x1 << 27);
                                                                                         
    //GICD_ITARGEGTSRx
    GICD->ITARGETSR[24] |= (0x1 << 24);
}
//初始化GICC节
void hal_key1_gicc_it()
{
    //GICC_CTRL
    GICC->CTRL |= 0x1;

    //GICC_PMR
    GICC->PMR |= (0x3 << 3);
}

/**************************key2*******************/
void hal_gpio_key2()
{
    RCC->MP_AHB4ENSETR |= (0x1 << 5);
    //key2
    GPIOF->MODER &= (~(0x3 << 14));
}

//初始化EXTI章节
void hal_key2_exti_it()
{
    //EXTI_EXTICRn
    EXTI->EXTICR2 &= (~(0xff << 24));
    EXTI->EXTICR2 |= (0x05 << 24);

    //EXTI_FTSR1
    EXTI->FTSR1 |= (0x1 << 7);

    //EXTI_IMR1
    EXTI->C1IMR1 |= (0x1 << 7);
}

//初始化GICD章节
void hal_key2_gicd_it()
{
    //GICD_CTRL
    GICD->CTRL |= (0x1);

    //GICD_ISENABLERx
    GICD->ISENABLER[3] |= (0x1 << 1);

    //GICD_IPRIORITYRx
    GICD->IPRIORITYR[24] |= (0x1 << 11);

    //GICD_ITARGEGTSRx
    GICD->ITARGETSR[24] |= (0x1 << 8);
}
//初始化GICC节
void hal_key2_gicc_it()
{
    //GICC_CTRL
    GICC->CTRL |= 0x1;

    //GICC_PMR
    GICC->PMR |= (0x3 << 3);
}

/**************************key3*******************/
void hal_gpio_key3()
{
    RCC->MP_AHB4ENSETR |= (0x1 << 5);
    //key3
    GPIOF->MODER &= (~(0x3 << 16));
}

//初始化EXTI章节
void hal_key3_exti_it()
{
    //EXTI_EXTICRn
    EXTI->EXTICR3 &= (~(0xff));
    EXTI->EXTICR3 |= (0x05);

    //EXTI_FTSR1
    EXTI->FTSR1 |= (0x1 << 8);

    //EXTI_IMR1
    EXTI->C1IMR1 |= (0x1 << 8);
}

//初始化GICD章节
void hal_key3_gicd_it()
{
    //GICD_CTRL
    GICD->CTRL |= (0x1);

    //GICD_ISENABLERx
    GICD->ISENABLER[3] |= (0x1 << 2);

    //GICD_IPRIORITYRx
    GICD->IPRIORITYR[24] |= (0x1 << 19);

    //GICD_ITARGEGTSRx
    GICD->ITARGETSR[24] |= (0x1 << 16);
}
//初始化GICC节
void hal_key3_gicc_it()
{
    //GICC_CTRL
    GICC->CTRL |= 0x1;

    //GICC_PMR
    GICC->PMR |= (0x3 << 3);
}
                                                                                         
#include "key.h"                            
extern void printf(const char *fmt, ...);   
                                            
void do_irq()                               
{                                           
    unsigned int num;                       
    //获取中断号                            
    num = GICC->IAR & 0x3ff;                
    switch(num)                             
    {                                       
    case 97:                                
        printf("key2!!!!!!!\n");            
        EXTI->FPR1 |= (0x1 << 7);           
        GICD->ICPENDR[3] |= (0x1 << 1);     
        break;                              
    case 98:                                
        printf("key3!!!!!!!\n");            
        EXTI->FPR1 |= (0x1 << 8);           
        GICD->ICPENDR[3] |= (0x1 << 2);     
        break;                              
    case 99:                                
        printf("key1!!!!!!!\n");            
        EXTI->FPR1 |= (0x1 << 9);           
        GICD->ICPENDR[3] |= (0x1 << 3);     
        break;                              
    }                                       
    //5.清除中断号 EOIR                     
    GICC->EOIR = num;                       
}                                           

 

测试文件

#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()                                 
{                                          
    hal_gpio_key1();                       
    hal_key1_exti_it();                    
    hal_key1_gicd_it();                    
    hal_key1_gicc_it();                    
                                           
    hal_gpio_key2();                       
    hal_key2_exti_it();                    
    hal_key2_gicd_it();                    
    hal_key2_gicc_it();                    
                                           
    hal_gpio_key3();                       
    hal_key3_exti_it();                    
    hal_key3_gicd_it();                    
    hal_key3_gicc_it();                    
    while(1)                               
    {                                      
    }                                      
    return 0;                              
}                                          

现象:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值