STM32MP157AAA-按键中断实验

目录

key.h

key.c

do_irq.c

main.c

现象


key.h

#ifndef __KEY_H__
#define __KEY_H__


void hal_exti_init();

void hal_gicd_init();

void hal_gicc_init();




#endif // __KEY_H__

key.c

#include "key.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"


void hal_exti_init()
{
    // RCC章节
    RCC->MP_AHB4ENSETR |= (0x1 << 5); // GIPOF组使能

    // GPIO章节
    // GPIOF->MODER &= ~(0x3f << 14); // 设置 PF9 \ PF8 \ PF7 引脚为输入模式
    GPIOF->MODER &= ~(0x3f << 14);

    // EXTI章节
    // 初始化:外部中断选择寄存器
    EXTI->EXTICR3 &= ~(0xff << 8); // PF9
    EXTI->EXTICR3 |= (0x05 << 8);

    EXTI->EXTICR2 &= ~(0xff << 24); // PF7
    EXTI->EXTICR2 |= (0x05 << 24);

    EXTI->EXTICR3 &= ~(0xff << 0); // PF8
    EXTI->EXTICR3 |= (0x05 << 0);

    EXTI->FTSR1 |= (0x7 << 7);  // 设置下降沿触发
    EXTI->C1IMR1 |= (0x7 << 7); // 设置中断不屏蔽

}

void hal_gicd_init()
{
    GICD->CTRL |= 0x1; // 使能对应组中断

    GICD->ISENABLER[3] |= (0x7 << 1); // 设置中断号使能

    GICD->IPRIORITYR[24] &= ~(0x1f << 27); // 设置PF9 -> EXTI9 -> 99 优先级
    GICD->IPRIORITYR[24] &= ~(0x1f << 11); // 设置PF7 -> EXTI7 -> 97 优先级
    GICD->IPRIORITYR[24] &= ~(0x1f << 19); // 设置PF8 -> EXTI8 -> 98 优先级
    GICD->IPRIORITYR[24] |= (0x1 << 27);
    GICD->IPRIORITYR[24] |= (0x1 << 11);
    GICD->IPRIORITYR[24] |= (0x1 << 19);
    // 设置目标分配寄存器
    GICD->ITARGETSR[24] &= ~(0x3 << 24);
    GICD->ITARGETSR[24] &= ~(0x3 << 8);
    GICD->ITARGETSR[24] &= ~(0x3 << 16);
    GICD->ITARGETSR[24] |= (0x1 << 24);
    GICD->ITARGETSR[24] |= (0x1 << 8);
    GICD->ITARGETSR[24] |= (0x1 << 16);
}

void hal_gicc_init()
{
    GICC->CTRL |= 0x1; // 使能对应组中断

    // 设置GICC层中断优先级
    GICC->PMR |= (0x1f << 3);
}

do_irq.c

#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;

/// @brief 中断处理函数
void do_irq(void)
{
    // 获取中断号  IAR
    i = GICC->IAR & 0x3ff;

    // 判断获取的中断号,打印中断号
    switch (i)
    {
    case 99:
        printf("KEY1##########\n");
        // 清除对应EXTI层中断挂起标志位
        EXTI->FPR1 |= (0x1 << 9);
        // 清除对应GICD层中断挂起标志位
        GICD->ICPENDR[3] |= (0x1 << 3);
        break;
    case 97:
        printf("KEY2##########\n");
        // 清除对应EXTI层中断挂起标志位
        EXTI->FPR1 |= (0x1 << 7);
        // 清除对应GICD层中断挂起标志位
        GICD->ICPENDR[3] |= (0x1 << 1);
        break;
    case 98:
        printf("KEY3##########\n");
        // 清除对应EXTI层中断挂起标志位
        EXTI->FPR1 |= (0x1 << 8);
        // 清除对应GICD层中断挂起标志位
        GICD->ICPENDR[3] |= (0x1 << 2);
        break;
    }

    // 清除对应GICC层中断号
    GICC->EOIR |= i;
}

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()
{
	hal_exti_init();
	hal_gicd_init();
	hal_gicc_init();
	while(1)
	{
		
	}
	return 0;
}

现象

猜你喜欢

转载自blog.csdn.net/liu319293960_/article/details/130917269