STM32外部中断问题

时间:2022-10-12 19:34:47
为什么我只配置了GPIOB PB 4为外部中断,配置如下:
GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
 
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_EXTILineConfigGPIO_PortSourceGPIOB, GPIO_PinSource4);
EXTI_InitStructure.EXTI_Line = EXTI_Line4;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_GenerateSWInterrupt(EXTI_Line4);

而GPIOA PA4 配置为输入,PA4没有配置为中断线,只是数据输入。
为什么PA4用镊子碰它能进入中断函数的,而PB4却不能??

10 个解决方案

#1


我对比我和你的配置的区别:

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource4);//先定这个,再配置IO参数

GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
 
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line4;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
//EXTI_GenerateSWInterrupt(EXTI_Line4);不需要这个

#2


GPIO_EXTILineConfigGPIO_PortSourceGPIOB, GPIO_PinSource4);
少个左括号,编译通过了吗?

#3


引用 2 楼 bjtea 的回复:
GPIO_EXTILineConfigGPIO_PortSourceGPIOB, GPIO_PinSource4);
少个左括号,编译通过了吗?
我只是发的时候少写了括号。不必要纠结这些小问题!

#4


引用 1 楼 lbing7 的回复:
我对比我和你的配置的区别:

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource4);//先定这个,再配置IO参数

GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOAT……


一样啊,还是不行。PA4老是中断!

#5


我这边的配置用的是PA口的0\1\2来做外中断,同时,我别的口的0/1/2也都有用作别用的.别的口并没有触发中断

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource4);//全工程搜索一下,看有没有在别的地方还调用这个函数?

#6


引用 5 楼 lbing7 的回复:
我这边的配置用的是PA口的0\1\2来做外中断,同时,我别的口的0/1/2也都有用作别用的.别的口并没有触发中断

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource4);//全工程搜索一下,看有没有在别的地方还调用这个函数?

只用了一次,还有更奇怪的是我加上了RCC_APB2Periph_AFIO PA4就不能中断了,但是PB4还是不能中断!
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_USART1, ENABLE);

#7


引用 6 楼 liqinghan 的回复:
引用 5 楼 lbing7 的回复:我这边的配置用的是PA口的0\1\2来做外中断,同时,我别的口的0/1/2也都有用作别用的.别的口并没有触发中断

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource4);//全工程搜索一下,看有没有在别的地方还调用这个函数?
只用了一次,还有更奇怪的是我加上了RCC_……


解决了,应该是没有加RCC_APB2Periph_AFIO这个,所以不行!这个是要加上去,哎,久不用这东西,连外部中断都不会用了!

#8


STM32也真二的,这个时钟没开,那也不应该串过去哈...

这个,算不算是一个硬件的BUG?

要不你向ST提交一下?

#9


引用 8 楼 lbing7 的回复:
STM32也真二的,这个时钟没开,那也不应该串过去哈...

这个,算不算是一个硬件的BUG?

要不你向ST提交一下?


不懂它内部怎么构造的,至于是不是BUG就不知道了!

#10


感谢你们的帮助!

#1


我对比我和你的配置的区别:

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource4);//先定这个,再配置IO参数

GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
 
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line4;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
//EXTI_GenerateSWInterrupt(EXTI_Line4);不需要这个

#2


GPIO_EXTILineConfigGPIO_PortSourceGPIOB, GPIO_PinSource4);
少个左括号,编译通过了吗?

#3


引用 2 楼 bjtea 的回复:
GPIO_EXTILineConfigGPIO_PortSourceGPIOB, GPIO_PinSource4);
少个左括号,编译通过了吗?
我只是发的时候少写了括号。不必要纠结这些小问题!

#4


引用 1 楼 lbing7 的回复:
我对比我和你的配置的区别:

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource4);//先定这个,再配置IO参数

GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOAT……


一样啊,还是不行。PA4老是中断!

#5


我这边的配置用的是PA口的0\1\2来做外中断,同时,我别的口的0/1/2也都有用作别用的.别的口并没有触发中断

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource4);//全工程搜索一下,看有没有在别的地方还调用这个函数?

#6


引用 5 楼 lbing7 的回复:
我这边的配置用的是PA口的0\1\2来做外中断,同时,我别的口的0/1/2也都有用作别用的.别的口并没有触发中断

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource4);//全工程搜索一下,看有没有在别的地方还调用这个函数?

只用了一次,还有更奇怪的是我加上了RCC_APB2Periph_AFIO PA4就不能中断了,但是PB4还是不能中断!
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_USART1, ENABLE);

#7


引用 6 楼 liqinghan 的回复:
引用 5 楼 lbing7 的回复:我这边的配置用的是PA口的0\1\2来做外中断,同时,我别的口的0/1/2也都有用作别用的.别的口并没有触发中断

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource4);//全工程搜索一下,看有没有在别的地方还调用这个函数?
只用了一次,还有更奇怪的是我加上了RCC_……


解决了,应该是没有加RCC_APB2Periph_AFIO这个,所以不行!这个是要加上去,哎,久不用这东西,连外部中断都不会用了!

#8


STM32也真二的,这个时钟没开,那也不应该串过去哈...

这个,算不算是一个硬件的BUG?

要不你向ST提交一下?

#9


引用 8 楼 lbing7 的回复:
STM32也真二的,这个时钟没开,那也不应该串过去哈...

这个,算不算是一个硬件的BUG?

要不你向ST提交一下?


不懂它内部怎么构造的,至于是不是BUG就不知道了!

#10


感谢你们的帮助!