这一篇主要是来介绍一下中断的寄存器怎么操作。先介绍一下整体情况。在这里假设使用PA0作用外部中断口,在初始化中将PA0设为下拉(这里本人的PA0是按键,选择下拉原因在GPIO篇中介绍过,不在重复)将该中断分为2组,有两位抢断,两位响应。
void Exti_Init(void)
{
//开启对应外设时钟,主要有两种GPIOA和AFIO
RCC->APB2ENR |= (1<<0);
RCC->APB2ENR |= (1<<2);
//将PA0设置为下拉输入
GPIOA->CRL &= 0xFFFFFFF0;
GPIOA->CRL |= 0x00000008;
GPIOA->BSRR |= (1<<16);
//在AFIO中选择EXTI0
AFIO->EXTICR[0] &= 0xFFF0;
AFIO->EXTICR[0] |= (0<<0);
//在EXTI的IMR寄存器中选择开启中断
EXTI->IMR |= (1<<0);
//对PA0由于是下拉,所以选择上升沿触发
EXTI->RTSR |= (1<<0);
//在SCB的AIRCR寄存器中选择分组
uint32_t temp;
//读取寄存器中的值,并将之前的分组清除
temp = SCB->AIRCR;
temp &= 0x0000F8FF;
//写入钥匙0x05FA
temp |= 0x05FA0000;
//写入分组2
//这里的0x05其实就是101,左移8位,控制分组
temp |= (0x05)<<8
SCB->AIRCR = temp;
//在操作NVIC的ISER和IPR寄存器,这里的抢断为1级,响应为0级(0b0100)注意是高位有效
NVIC->ISER[0] |= (1<<6);
NVIC->IP[6] = 0x40;
}
void EXTI0_IRQHandler(void)
{
if((GPIOA->IDR &= 0x0001) != 0)
{
//看具体情况,自行编写需要的中断逻辑
}
//清除中断标志位
EXTI->PR=1<<0;
}
OK!主要的代码脉络已经讲完,可以按照上一节的说明加上官方的参考文档搭配使用。这一节确实比较难以理解,大家有啥疑问或者看不懂的可以在评论区留言,我看到就会处理,共同学习,共同进步!