1、分析芯片手册
找到要设置的寄存器(重在分析),对应的位置应该如何设置
测试函数
#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()
{
init_exti();
init_gicd();
init_gicc();
return 0;
}
函数实现
#include "key.h"
//1.RCC使能
//2.初始化GPIO输入模式
//3.初始化EXTI
void init_exti()
{
RCC->MP_AHB4ENSETR |= (0x1<<5);
//[18-19] = 00
GPIOF->MODER &= (~(0x3<<18));
//外部中断选择寄存器,与GPIO连接
EXTI->EXTICR3 &= (~(0xff<<8));
//先清0再赋值
EXTI->EXTICR3 |= (0x05<<8); //key1- PF9
// EXTI->EXTICR2 |= (0x05<<24);//key2- PF7
// EXTI->EXTICR3 |= (0x05<<0);//key3- PF8
//下降沿选择寄存器,检测按键出发方式,并和对应引脚连接
EXTI->FTSR1 |= (0x1<<9);
//禁止中断屏蔽
EXTI->C1IMR1 |= (0x1<<9);
}
//4.GICD
void init_gicd()
{
//设置全局中断使能控制器
GICD->CTRL |= (0x1);
//中断使能,每一位管理一个中断号,288个中断号需要9个寄存器
//根据key1-99.key2-97.key3-98判断除ER3寄存器
GICD->ISENABLER[3] |= (0x1<<3);
//中断优先级寄存器
//清0
GICD->IPRIORITYR[24] &= (~(0x1f<<27));
//设置优先级:此处设置为0;值小则优先级高******很重要,设置不对没有现象
// GICD->IPRIORITYR[24] |= (0x1f<<27);
//目标分配寄存器
GICD->ITARGETSR[24] &= (~(0x3<<24));
// 0bx1分配给cpu0 --group0
GICD->ITARGETSR[24] |= (0x1<<24);
}
//5.GICC
void init_gicc()
{
//中断使能控制器使能
GICC->CTRL |= 0x1;
//中断优先级寄存器
GICC->PMR &= (~(0x1f<<3));
//此处优先级的值高于GICD即可,值越高优先级越低
GICC->PMR |= (0xff<<3);
}
中断函数
#include "key.h"
extern void printf(const char *fmt, ...);
extern void delay_ms(int ms);
void do_irq(void)
{
unsigned int num = 0;
//获取中断号,定义一个num变量接收中断号[9:0]
num = GICC->IAR & (0x3ff);
switch(num)
{
case 97:
break;
case 98:
break;
case 99:
//打印一句话
printf("key1---interrupt___\n");
delay_ms(500);
//清除EXIT中断挂起标志位
EXTI->FPR1 |= (0x1<<9);
//清除GICD层中断挂起标志位
GICD->ICPENDR[3] |= (0x1<<3);
break;
}
//清除中断号
GICC->EOIR = num;
}