为什么外部中断实验“卡住了”

2019-07-21 01:51发布

使用一个按键(连接PD3)做外部中断实验,期望的现象是按住它时全部灯亮,松开时4个LED灯继续流水灯现象。但实际现象是按一下它流水灯就停止了,当前亮着的灯亮着,其它灯灭了,无法恢复流水灯,除非系统复位。
[mw_shl_code=c,true]#include "stm32f10x.h" #include "delay.h" #define RCC_USER2 RCC_APB2Periph_GPIOD #define USER2_PORT GPIOD #define USER2_Pin GPIO_Pin_3 #define RCC_LED RCC_APB2Periph_GPIOF #define LED_PORT GPIOF #define DS1 GPIO_Pin_6 #define DS2 GPIO_Pin_7 #define DS3 GPIO_Pin_8 #define DS4 GPIO_Pin_9 void Key_Init(void); void LED_Init(void); void NVIC_GroupConfig(void); void EXTIX_Init(void); int main() { LED_Init(); Key_Init(); NVIC_GroupConfig(); EXTIX_Init(); GPIO_SetBits(LED_PORT,DS1|DS2|DS3|DS4); while(1) { GPIO_SetBits(LED_PORT,DS2|DS3|DS4); GPIO_ResetBits(LED_PORT,DS1); Delay_ms(500); GPIO_SetBits(LED_PORT,DS1|DS3|DS4); GPIO_ResetBits(LED_PORT,DS2); Delay_ms(500); GPIO_SetBits(LED_PORT,DS2|DS1|DS4); GPIO_ResetBits(LED_PORT,DS3); Delay_ms(500); GPIO_SetBits(LED_PORT,DS2|DS3|DS1); GPIO_ResetBits(LED_PORT,DS4); Delay_ms(500); } } void Key_Init() { GPIO_InitTypeDef GPIO_StructureInit; RCC_APB2PeriphClockCmd(RCC_USER2,ENABLE); GPIO_StructureInit.GPIO_Pin=USER2_Pin; GPIO_StructureInit.GPIO_Mode=GPIO_Mode_IPU; GPIO_Init(USER2_PORT,&GPIO_StructureInit); } void LED_Init() { GPIO_InitTypeDef GPIO_StructureInit; RCC_APB2PeriphClockCmd(RCC_LED,ENABLE); GPIO_StructureInit.GPIO_Pin=DS1|DS2|DS3|DS4; GPIO_StructureInit.GPIO_Speed=GPIO_Speed_2MHz; GPIO_StructureInit.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(LED_PORT,&GPIO_StructureInit); } void NVIC_GroupConfig() { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); } void EXTIX_Init() { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource3); EXTI_InitStructure.EXTI_Line = EXTI_Line3; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0X02; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0X03; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); } void EXTI3_IRQHandler() { if(EXTI_GetITStatus(EXTI_Line3)!=RESET) { Delay_ms(10); if(GPIO_ReadInputDataBit(USER2_PORT,USER2_Pin)==0) GPIO_ResetBits(LED_PORT,DS1|DS2|DS3|DS4); while(GPIO_ReadInputDataBit(USER2_PORT,USER2_Pin)==0); EXTI_ClearITPendingBit(EXTI_Line3); } } [/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
正点原子
1楼-- · 2019-07-21 04:02
 精彩回答 2  元偷偷看……
番茄君
2楼-- · 2019-07-21 07:10
单步调试
5IMCU
3楼-- · 2019-07-21 11:27
回复【2楼】番茄君:
---------------------------------
调试发现程序卡在EXTI3_IRQHandler();里的延时程序出不来。延时使用的是SysTick,调用了SysTick中断,于是想是不是中断嵌套失败?后来在延时函数里面加一句NVIC_SetPriority(SysTick_IRQn, 0x0);就没问题了。现在想不明白的是SysTick_Config();里面已经有NVIC_SetPriority();了,为什么外面要加呢?
伊森亨特
4楼-- · 2019-07-21 13:42
 精彩回答 2  元偷偷看……
huangbc
5楼-- · 2019-07-21 14:30
伊森亨特 发表于 2018-1-15 17:02
他写的这些并没有systick函数啊

不是include 'delay.h'了吗,那里面是
伊森亨特
6楼-- · 2019-07-21 14:54
huangbc 发表于 2018-1-15 17:08
不是include 'delay.h'了吗,那里面是

哦,跟我写的不一样吧,我偷懒了,没有设置systick的东西,就设置了一个时钟源

一周热门 更多>