嵌入式学习--不嵌套中断

嵌入式学习--不嵌套中断GIC-EXTI

.H

#ifndef __EX__H__           
#define __EX__H__           
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h" 
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h" 
                            
//初始化引脚GPIOF           
                            
//初始化exti                
void pf9_exti_init();//     
                            
void pf9_gicd_init();//     
                            
void pf9_gicc_init();//                                            
#endif       

ex.C

#include "ex.h"
void pf9_exti_init()
{
    RCC->MP_AHB4ENSETR|=(0X1<<5);//使能gpiof
    //设置gpio
    GPIOF->MODER&=(~(0X3F<<14));//引脚f789为输入模式
    //exti中断控制器与引脚连接PF9
    EXTI->EXTICR3|=(0X5<<8);
    EXTI->EXTICR3|=(0X5);
    EXTI->EXTICR2|=(0X5<<24);
    //检测中断时间为下降沿触发
    EXTI->FTSR1|=(0X7<<7);
    //中断号设置为不屏蔽
    EXTI->C1IMR1|=(0X7<<7);
}
                        
void pf9_gicd_init()
{
    GICD->CTRL|=0X1;//gicd层使能
    //使能中断号
    GICD->ISENABLER[3]|=(0X1<<1);//97
    GICD->ISENABLER[3]|=(0X1<<2);//98
    GICD->ISENABLER[3]|=(0X1<<3);//99
    
    //设置中断优先级
    GICD->IPRIORITYR[24]&=(~(0XFFFFFF)<<7);
    GICD->IPRIORITYR[24]|=(0X7<<11);//5位优先级
    GICD->IPRIORITYR[24]|=(0X7<<19);
    GICD->IPRIORITYR[24]|=(0X7<<27);                    

    //分配目标处理器
    GICD->ITARGETSR[24]&=(~(0X333<<8));
    GICD->ITARGETSR[24]|=(0X1<<8);//cpu0
    GICD->ITARGETSR[24]|=(0X1<<16);//cpu0
    GICD->ITARGETSR[24]|=(0X1<<24);//cpu0

}
                        
void pf9_gicc_init()
{
    GICC->CTRL|=0X1;//使能gicc层
    GICC->PMR|=(0X1F<<3);//设置屏蔽寄存器优先级 越低越高

}

do_irq.c

#include "ex.h"                                                                   
extern void printf(const char *fmt, ...);                                         
unsigned int i = 0;                                                               
extern void delay_ms(int ms);                                                     
                                                                                  
unsigned int num=0;                                                               
                                                                                  
void do_irq(void)                                                                 
{                                                                                 
                                                                                  
    num=(GICC->IAR&=(0XFFFF));//检测中断号是否产生                                
    //根据中断号执行函数                                                          
    switch(num)                                                                   
    {                                                                             
    case 97:                                                                      
        delay_ms(500);                                                            
        printf("key1########");                                                   
    GICD->ICPENDR[3]&=(~(0X1)<<1);//清除中断挂起                                  
    EXTI->FPR1|=(0X1<<7);//清除中断挂起标志位                                     
        break;                                                                    
    case 98:                                                                      
        delay_ms(500);                                                            
        printf("key2########");                                                   
    GICD->ICPENDR[3]&=(~(0X1)<<2);//清除中断挂起                                  
    EXTI->FPR1|=(0X1<<8);//清除中断挂起标志位                                     
    //清除中断挂起                                                                
    //清除中断挂起标志位                                                          
        break;                                                                    
    case 99:                                                                      
        delay_ms(500);                                                            
        printf("key3########");                                                   
                                                                                  
    GICD->ICPENDR[3]&=(~(0X1)<<3);//清除中断挂起//不清除会一直发送中断信号给gicc层
    //EXTI->FPR1|=(0X1<<9);//清除中断挂起标志位//不清除会一直发送中断信号给gicd层 
    //清除中断挂起                                                                
    //清除中断挂起标志位                                                          
        break;                                                                    
    }                                                                             
    GICC->EOIR&=(~(0X3FF));//清除中断号待测试                                     
    GICC->EOIR|=num;//此寄存器是的cpu的中断被释放,其他中断号因此可以被cpu处理     
                                                                                  
                                                                                  
}                                                                                 

main.c

#include "ex.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()                               
{                                        
    pf9_exti_init();                     
    pf9_gicd_init();                     
    pf9_gicc_init();                     
    while(1)                             
    {                                    
                                         
                                         
    }                                    
    return 0;                            
}                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值