A7核按键中断实验
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_gpio_init();
hal_exti_init();
hal_gicd_init();
hal_gicc_init();
while(1)
{
}
return 0;
}
key.h
#ifndef __KET_H__
#define __KET_H__
#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
void hal_gpio_init();
void hal_exti_init();
void hal_gicd_init();
void hal_gicc_init();
#endif
key.c
#include "key.h"
void hal_gpio_init()
{
//rcc 使能 MP_AHB4ENSETR[5]=1
RCC->MP_AHB4ENSETR|=0x1<<5;
//设置接受模式
//key1 MODER[19:18]=00
//key2 MODER[15:14]=00
//key3 MODER[17:16]=00
GPIOF->MODER &=~(0x3<<18);
GPIOF->MODER &=~(0x3<<14);
GPIOF->MODER &=~(0x3<<16);
}
void hal_exti_init()
{
//连接
//key1 EXTICR3[15:8]=0x05
EXTI->EXTICR3&=~(0xff<<8);
EXTI->EXTICR3|=(0x05<<8);
//key2 EXTICR2[31:24]=0x05
EXTI->EXTICR2&=~(0xff<<24);
EXTI->EXTICR2|=(0x05<<24);
//key3 EXTICR3[7:0]=0x05
EXTI->EXTICR3&=~0xff;
EXTI->EXTICR3|=0x05;
//选择中断触发方式 下沿
//FTSR1[9:7]=111
EXTI->FTSR1|=0b111<<7;
//中断不屏蔽
//C1IMR1[9:7]=111
EXTI->C1IMR1|=0b111<<7;
}
void hal_gicd_init()
{
//使能组0 CTRL[0]=1
GICD->CTRL|=1;
//使能中断
//key1 ISENABLER3[3]=1
//key2 ISENABLER3[1]=1
//key3 ISENABLER3[2]=1
GICD->ISENABLER[3]|=0b111<<1;
//中断优先级
//key1 IPRIORITYR24[31:27]
//key2 IPRIORITYR24[15:11]
//key3 IPRIORITYR24[23:19]
GICD->IPRIORITYR[24]=0;
//中断目标分配
//key1 ITARGETSR24[25:24]
//key2 ITARGETSR24[9:8]
//key3 ITARGETSR24[17:16]
GICD->ITARGETSR[24]|=1<<24;
GICD->ITARGETSR[24]|=1<<8;
GICD->ITARGETSR[24]|=1<<16;
}
void hal_gicc_init()
{
//使能组0 CTRL[0]=1
GICC->CTRL|=1;
//设置中断屏蔽优先级 PMR[7:3]
GICC->PMR&=(~(0x1f<<3));
GICC->PMR|=(0x1f<<3);
}
do_irq.c
#include "key.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void)
{
//获取中断号
//判断中断号
i=GICC->IAR&0x1ff;
switch(i)
{
case 99:
printf("key1\r\n");
break;
case 97:
printf("key2\r\n");
break;
case 98:
printf("key3\r\n");
break;
}
//清除对应层中断挂起标志位
GICC->EOIR|=i;
GICD->ICPENDR[i/32]&=0x1<<i%32;
EXTI->FPR1|=(0b111<<7);
}