采用GPIO外部中断,大概70us就会中断一次,在主循环中有对中断函数中的变量进行判断,所以加了临界区保护,即加开关外部中断操作,
开始通过外部中断寄存器开关实现,即如下宏中的#esle,但发现会有一定几率丢失中断,而换成通过NVIC实现,即如下代码中的#if 1则正常。
可是再仔细查看各种资料,通过外部中断寄存器的方式应该也不会丢才对, 想不明白。
void EXTI2_IRQ_enable(void)
{
#if 1
NVIC_InitTypeDef nvic_init;
nvic_init.NVIC_IRQChannel = EXTI2_IRQn;
nvic_init.NVIC_IRQChannelPreemptionPriority = 0;
nvic_init.NVIC_IRQChannelSubPriority = 0;
nvic_init.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic_init);
#else//这种方法会丢中断;
EXTI->IMR |= EXTI_Line2;
#endif
}
void EXTI2_IRQ_disable(void)
{
#if 1
NVIC_InitTypeDef nvic_init;
nvic_init.NVIC_IRQChannel = EXTI2_IRQn;
nvic_init.NVIC_IRQChannelPreemptionPriority = 0;
nvic_init.NVIC_IRQChannelSubPriority = 0;
nvic_init.NVIC_IRQChannelCmd = DISABLE;
NVIC_Init(&nvic_init);
#else//这种方法会丢中断;
EXTI->IMR &= ~EXTI_Line2;
#endif
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>