1、实现三个按键代码,代码截图现象截图
(1)key.h
#ifndef __KEY_H__
#define __KEY_H__
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
void hal_exit_init();
void hal_gicd_init();
void hal_gicc_init();
#endif
(2)key.c
#include "key.h"
void hal_exit_init()
{
//RCC章节初始化
//GPIOF 使能
RCC->MP_AHB4ENSETR |=(0x1<<5);
//GPIO章节初始化
GPIOF->MODER &= (~(0x3<<18)); //key1 PF9
GPIOF->MODER &= (~(0x3<<14)); //key2 PF7
GPIOF->MODER &= (~(0x3<<16)); //key3 PF8
//exti章节初始化
//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控制寄存器(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);
}
(3)main.c
#include "key.h"
extern void peintf(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_exit_init();
hal_gicd_init();
hal_gicc_init();
while(1)
{
}
(4)do_irq.c(中断处理)
#include "key.h"
extern void printf(const char *fmt, ...);
//unsigned int i=0;
//中断处理函数
void do_irq(void)
{
//获取中断号 IAR
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;
}
}