STM32MP157A 裸机按键中断实现

实验现象

 

key.h

#ifndef __KEY_H__
#define __KEY_H__
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
//EXTI init
void hal_exti_init();


void hal_gicd_init();


void hal_gicc_init();




#endif

key.c

#include "key.h"

//key1 ===> GPIOF9
void hal_exti_init()
{
    /*********RCC init************/
    //GPIOF enable
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    /*********GPIO init*********/
    GPIOF->MODER &= (~(0x3<<18)); //key1 PF9
    GPIOF->MODER &= (~(0x3<<14)); //key2 PF7
    GPIOF->MODER &= (~(0x3<<16)); //key3 PF8

    /*********EXTI init*********/
    //1.外部中断选择寄存器  EXTI_EXTICRx
    //key1 PF9 ==> EXTI9(EXTI_EXTICR3寄存器中)
    EXTI->EXTICR3 &= (~(0xff<<8));
    EXTI->EXTICR3 |= (0x05<<8);

    //key2 PF7 ==> EXTI7(EXTI_EXTICR2寄存器中)
    EXTI->EXTICR2 &= (~(0xff<<24));
    EXTI->EXTICR2 |= (0x05<<24);

    //key3 PF8 ==> EXTI8(EXTI_EXTICR3寄存器中)
    EXTI->EXTICR3 &= (~(0xff<<0));
    EXTI->EXTICR3 |= (0x05<<0);

    //2.外部中断下降沿触发选择寄存器
    //key1 PF9 ==> EXTI9 ----> 事件9
    EXTI->FTSR1 |= (0x1<<9);
    //key2 PF7 ==> EXTI7 ----> 事件7
    EXTI->FTSR1 |= (0x1<<7);
    //key3 PF8 ==> EXTI8 ----> 事件8
    EXTI->FTSR1 |= (0x1<<8);


    //3.外部中断屏蔽寄存器
    //key1 PF9 ==> EXTI9 ----> 事件9
    EXTI->C1IMR1 |= (0x1<<9);   //置1取消屏蔽
    //key2 PF7 ==> EXTI7 ----> 事件7
    EXTI->C1IMR1 |= (0x1<<7);
    //key3 PF8 ==> EXTI8 ----> 事件8
    EXTI->C1IMR1 |= (0x1<<8);

    //4.外部中断下降沿挂起寄存器==>可读可写 
    //读0:无中断产生 1:有中断产生   写0:不清除中断挂起标志位 写1:清除中断挂起标志位
    //key1 PF9 ==> EXTI9 ----> 事件9
    EXTI->FPR1 |= (0x1<<9);   //置1清除中断挂起标志位
    //key2 PF7 ==> EXTI7 ----> 事件7
    EXTI->FPR1 |= (0x1<<7);
    //key3 PF8 ==> EXTI8 ----> 事件8
    EXTI->FPR1 |= (0x1<<8);
}


void hal_gicd_init()
{
    //1 GICD control register (GICD_CTLR)
    GICD->CTRL|= (0x1<<0); //使能组0

    //2. GICD_ISENABLERx
    //key1 PF9 ==> EXTI9 ----> 事件9 --->中断号 99
    GICD->ISENABLER[3] |= (0x1<<3);
    //key2 PF7 ==> EXTI7 ----> 事件7 --->中断号 97
    GICD->ISENABLER[3] |= (0x1<<1);
    //key3 PF8 ==> EXTI8 ----> 事件8 --->中断号 98
    GICD->ISENABLER[3] |= (0x1<<2);

    //2. GICD_IPRIORITYR  
    //key1 PF9 ==> EXTI9 ----> 事件9 --->中断号 99
    GICD->IPRIORITYR[24] |= (0x1<<27);  //中断优先级设置相同
    
    //key2 PF7 ==> EXTI7 ----> 事件7 --->中断号 97
    GICD->IPRIORITYR[24] |= (0x1<<11);  //中断优先级设置相同

    //key3 PF8 ==> EXTI8 ----> 事件8 --->中断号 98
    GICD->IPRIORITYR[24] |= (0x1<<19);  //中断优先级设置相同

    //2. GICD_ITARGETSRx
    //key1 PF9 ==> EXTI9 ----> 事件9 --->中断号 99
    GICD->ITARGETSR[24] |= (0x3<<24); //分配给cpu0
    
    //key2 PF7 ==> EXTI7 ----> 事件7 --->中断号 97
    GICD->ITARGETSR[24] |= (0x3<<8); //分配给cpu0
  

    //key3 PF8 ==> EXTI8 ----> 事件8 --->中断号 98
    GICD->ITARGETSR[24] |= (0x3<<16); //分配给cpu0


    //3. GICD_ICPENDRx 
    //key1 PF9 ==> EXTI9 ----> 事件9 --->中断号 99
    GICD->ICPENDR[3] |= (0x1<<3);
    //key2 PF7 ==> EXTI7 ----> 事件7 --->中断号 97
    GICD->ICPENDR[3] |= (0x1<<1);
    //key3 PF8 ==> EXTI8 ----> 事件8 --->中断号 98
    GICD->ICPENDR[3] |= (0x1<<2);
    

}


void hal_gicc_init()
{
    //GICC_CTLR寄存器
    GICC->CTRL |= (0x1<<0);

    //GICC_PMR寄存器
    GICC->PMR |= (0x2<<4);
}

main.c

#include "uart4.h"
#include "key.h"
extern void printf(const char *fmt, ...);
char buff[10]={0};
void delay_ms(int ms)
{
	int i,j;
	for(i = 0; i < ms;i++)
		for (j = 0; j < 1800; j++);
}


int main()
{
	hal_exti_init();
	hal_gicd_init();
    hal_gicc_init();
	while (1)
	{
		
	}
	

	return 0;
}

do_irq.c

#include "key.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void) 
{
    //获取中断号
    int interrupt_no = (GICC->IAR & 0x1ff);
    printf("interrupt_no = %d\n\r",interrupt_no);
    //判断中断号
    switch (interrupt_no)
    {
    case 99:
        printf("key1###############\r\n");
        //1. 清除中断挂起标志位
        EXTI->FPR1 |= (0x1<<9); 
        //2. 清除中断号
        GICC->EOIR &= (~(0x1ff<<0));
        GICC->EOIR |= (interrupt_no<<0);
        break;
    case 97:
        printf("key2###############\r\n");
        //1. 清除中断挂起标志位
        EXTI->FPR1 |= (0x1<<7);
        //2. 清除中断号
        GICC->EOIR &= (~(0x1ff<<0));
        GICC->EOIR |= (interrupt_no<<0);
        break;
    case 98:
        printf("key3###############\r\n");
        //1. 清除中断挂起标志位
        EXTI->FPR1 |= (0x1<<8);
        //2. 清除中断号
        GICC->EOIR &= (~(0x1ff<<0));
        GICC->EOIR |= (interrupt_no<<0);
        break;
    
    default:
        break;
    }
    

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值