eg:按键中断打印
头文件
#ifndef __KEY_H__
#define __KEY_H__
#include"stm32mp1xx_gpio.h"
#include"stm32mp1xx_rcc.h"
#include"stm32mp1xx_exti.h"
#include"stm32mp1xx_gic.h"
//初始化RCC,GPIO,EXTI控制器
void hal_exti_init();
//初始化GICD控制器
void hal_gicd_init();
//初始化GICC控制器
void hal_gicc_init();
#endif
源文件
#include "key.h"
//初始化RCC,GPIO,EXTI控制器
void hal_exti_init()
{
//RCC控制器初始化
RCC->MP_AHB4ENSETR|=(0x1<<5);//使能GPIOF组控制器
//GPIO初始化
GPIOF->MODER&=(~(0x3f<<14));//设置PF7,PF8,PF9为输入模式
//EXTI初始化
EXTI->EXTICR3&=(~(0xff<<8));//KEY1
EXTI->EXTICR3|=(0x1<<10);
EXTI->EXTICR3|=(0x1<<8);
EXTI->EXTICR2&=(~(0xff<<24));//KEY2
EXTI->EXTICR2|=(0x1<<24);
EXTI->EXTICR2|=(0x1<<26);
EXTI->EXTICR3&=(~0xff);//KEY3
EXTI->EXTICR3|=0x1;
EXTI->EXTICR3|=(0x1<<2);
EXTI->FTSR1|=(0x1<<9);//下降沿使能
EXTI->FTSR1|=(0x1<<7);
EXTI->FTSR1|=(0x1<<8);
EXTI->C1IMR1|=(0x1<<9);//设置中断不屏蔽
EXTI->C1IMR1|=(0x1<<7);
EXTI->C1IMR1|=(0x1<<8);
}
//初始化GICD控制器
void hal_gicd_init()
{
GICD->CTRL|=0x1;//设置GICD层CPU组使能
//设置中断使能
GICD->ISENABLER[3]|=(0x1<<3);
GICD->ISENABLER[3]|=(0x1<<1);
GICD->ISENABLER[3]|=(0x1<<2);
//设置中断优先级
GICD->IPRIORITYR[24]|=(0xa<<27);
GICD->IPRIORITYR[24]|=(0xb<<11);
GICD->IPRIORITYR[24]|=(0xc<<19);
//设置GICD_ITARGETSRx分配给CPU0
GICD->ITARGETSR[24]|=(0x11<<24);
GICD->ITARGETSR[24]|=(0x11<<8);
GICD->ITARGETSR[24]|=(0x11<<16);
}
//初始化GICC控制器
void hal_gicc_init()
{
//组0使能
GICC->CTRL |= 0X1;
//设置中断优先级
GICC->PMR |= (0Xf<<3);
}
do_irq.c
#include <key.h>
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void)
{
//获取中断号
i = GICC->IAR & 0x3ff;
//判断中断号
if(99 == i)
{
//KEY1
printf("KEY1:周周周\n");
GICD->ICPENDR[3] |= (0X1<<3);
}
else if(98 == i)
{
printf("key3:帅帅帅\n");
GICD->ICPENDR[3] |= (0X1<<1);
}
else if(97 == i)
{
printf("key2:大大大\n");
GICD->ICPENDR[3] |= (0X1<<2);
}
//清除中断挂起标志位
GICC->EOIR |= i;
EXTI->FPR1 |= (0x7<<7); //清除EXTI7,8,9中断挂起标志位
}
测试文件
#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(int argc, const char *argv[])
{
hal_exti_init();
hal_gicd_init();
hal_gicc_init();
while(1)
{}
return 0;
}