|
麻烦各位帮我看一下STM32 外部中断,为什么进不去中断。
[复制链接]
代码如下:
void Exit_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0XFFFFFFF0;//设置成输入
GPIOA->CRL|=0X00000008;
GPIOA->ODR|=1<<0; //上拉
Ex_NVIC_Config(GPIO_A,0,FTIR);//下降沿触发
MY_NVIC_Init(2,1,EXTI0_IRQChannel,2);//抢占2,子优先级1,组2
}
void EXTI0_IRQHandler(void)
{
delay_ms(10);//消抖
if(KEY1==0) //按键S5
{
led7 = !led7;
}
EXTI->PR=1<<0; //清除LINE0上的中断标志位
}
void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)
{
u32 temp;
u8 IPRADDR=NVIC_Channel/4; //每组只能存4个,得到组地址
u8 IPROFFSET=NVIC_Channel%4;//在组内的偏移
IPROFFSET=IPROFFSET*8+4; //得到偏移的确切位置
MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组
temp=NVIC_PreemptionPriority<<(4-NVIC_Group);
temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
temp&=0xf;//取低四位
if(NVIC_Channel<32)NVIC->ISER[0]|=1<
else NVIC->ISER[1]|=1<<(NVIC_Channel-32);
NVIC->IPR[IPRADDR]|=temp<
}
//外部中断配置函数
//只针对GPIOA~G;不包括PVD,RTC和USB唤醒这三个
//参数:GPIOx:0~6,代表GPIOA~G;BITx:需要使能的位;TRIM:触发模式,1,下升沿;2,上降沿;3,任意电平触发
//该函数一次只能配置1个IO口,多个IO口,需多次调用
//该函数会自动开启对应中断,以及屏蔽线
//待测试...
void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM)
{
u8 EXTADDR;
u8 EXTOFFSET;
EXTADDR=BITx/4;//得到中断寄存器组的编号
EXTOFFSET=(BITx%4)*4;
RCC->APB2ENR|=0x01;//使能io复用时钟
AFIO->EXTICR[EXTADDR]&=~(0x000F<
AFIO->EXTICR[EXTADDR]|=GPIOx<
//自动设置
EXTI->IMR|=1<
// EXTI->EMR|=1<
if(TRIM&0x01)EXTI->FTSR|=1<
if(TRIM&0x02)EXTI->RTSR|=1<
}
|
|