1、前置电路
前面我们已经了解中断的基本信息接下来我们就进行中断的寄存器配置的学习中,本次我们还是根据通过按键来对led灯的反转,具体硬件电路如下。
LED灯的电路:


KEY3按键的电路:


在这里我们通过对KEY3按键实现对LED灯的翻转,因此我们把按键KEY3的GPIO模式设置为下拉输入,因为我们在按按键的时候会有一个高低电平的抖动,因此我们还需要加一些防止抖动的代码,LED灯就设置为推挽输出。
在这我们根据不根据上面的电路来我们单独设置,因为博主的是f103c8t6,按键的引脚为PA3,LED灯的引脚为PB1,然后接下来就根据寄存器进行初始化。
2、GPIO初始化配置
首先是GPIO的初始化

因为我们的按键是PA3为低地址部分,根据寄存器来看,把PB1设置为上拉输入,MOED为0x00,CNF为0x10,LED灯设置为最大的速度,LED灯设置为推挽输出,我们可以根据寄存器配置出来。
RCC->APB2ENR|=RCC_APB2ENR_IOPAEN|RCC_APB2ENR_IOPBEN|RCC_APB2ENR_AFIOEN;//PA3
GPIOA->CRL&=~(GPIO_CRL_CNF3|GPIO_CRL_MODE3);
GPIOA->CRL|=GPIO_CRL_CNF3_1;
GPIOA->ODR|=GPIO_ODR_ODR3;
GPIOB->CRL &= ~(GPIO_CRL_CNF1 | GPIO_CRL_MODE1);
GPIOB->CRL |= GPIO_CRL_MODE1;
大致的初始化代码如上,后面就进行中断的寄存器配置,在配置中断的寄存器前我们要先了解中断的寄存器有哪些然后进行配置。
3、EXTI外部中断配置
AFIO_EXTICR1:


外部中断重要的寄存器,因为我们前面讲过的,AFIO引脚复用器把各个引脚组合传给EXTI然后EXTI就根据引脚的编号来进行划分,因此在这里我们的中断源是PA3,也就是3号引脚对应的就是EXTI3,又因为我们是PA3,因此我们需要配置的是第一个EXTICR1寄存器的EXTI3。
AFIO->EXTICR[0] &= ~AFIO_EXTICR1_EXTI3; // 清空EXTI3的配置位
AFIO->EXTICR[0]|=AFIO_EXTICR1_EXTI3_PA;
在配置好了EXTICR1寄存器我们就要根据中断的触发源来配置寄存器,按键触发的方式无非就是下降沿和上升沿,因为我们前面的PA3设置的是上拉输入,则我们这的寄存器就应该配置一个下降沿触发

根据下降沿寄存器进行配置,我们这的触发源是不是就是EXTI3,因此我们这影人配置的就是TR3的下降沿。
EXTI->RTSR&=~EXTI_RTSR_TR3;//配置下降沿寄存器
EXTI->RTSR|=EXTI_RTSR_TR3;
下降沿寄存器过后是不是应该有一个中断屏蔽寄存器,根据上期的中断的基本概念来说,是不是中断屏蔽寄存器和中断挂起寄存器同时为1的时候EXTI信号才能传给NVIC, 而对于中断挂起寄存器我们只需要在进入中断处理程序的时候向该位写入1即可清除中断挂起寄存器。
EXTI->IMR&=~EXTI_IMR_MR3;//设置中断屏蔽寄存器
EXTI->IMR|=EXTI_IMR_MR3;
进行完这些配置EXTI的大概配置已经完毕,接下来把中断信号交给NVIC去进行处理,在这里我们的NVIC则是利用标准库的方式去进行配置的。
NVIC_SetPriorityGrouping(3);//设置中断的分组
NVIC_SetPriority(EXTI3_IRQn,3); //设置中断的优先级和中断信号源
NVIC_EnableIRQ(EXTI3_IRQn);//使能中断
NVIC配置完成后我们就可以写中断服务程序了。
void EXTI3_IRQHandler()
{
EXTI->PR|=EXTI_PR_PR3;//清除中断挂起寄存器
Delay_ms(10);//延迟软件进行消抖
if((GPIOA->IDR&GPIO_IDR_IDR3)!=0)
{
LED1_ON();
}
else
{
LED1_OFF();
}
}
中断服务程序的函数名是在启动文件中的汇编文件.s中的我们可以找到这个中断服务程序的函数名,但要值得注意的是EXTI中虽然是一个7合1的总线,但在实际的中断源分配中不一定是按照16个中断线去进行配置的,总共也就分为了7组,因此我们有什么不懂的都可以去通过查阅数据手册。

![]()
![]()
有了这个我们就可以完善这个中断处理程序了。
到这里中断寄存器的配置已经配置完毕了,如果有不足的地方,还请大家积极指正!!!!
中断寄存器配置详解
5862

被折叠的 条评论
为什么被折叠?



