打印
[STM32F1]

没有调用GPIO_EXTILineConfig为什么也能进中断

[复制链接]
1201|37
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wenfen|  楼主 | 2021-11-14 23:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
按照教程上写了一个最简单的中断程序,就是按键 然后进中断,点亮led 按键是 PA0,led是PA2
按照教程上的写法
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

PA2 设置为输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

PA0设置为输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //选择输入模式为浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;          //输出频率最大50MHz
GPIO_Init(GPIOA,&GPIO_InitStructure);

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
                          
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;  
EXTI_Init(&EXTI_InitStructure);

以上配置没有问题 进中断后能正常点亮小灯!

但是我自己试验了一下,我去掉  PA0 设置为输入这段代码,或者去掉GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);,或者两者都去掉

还是能正常点亮小灯! 这是为什么??

GPIO_EXTILineConfig这个函数的作用是什么?参数GPIO_PinSource0是不是必须和EXTI_InitStructure.EXTI_Line = EXTI_Line0一致,为同一个口?

使用特权

评论回复
沙发
spark周| | 2021-11-14 23:54 | 只看该作者
没有调用GPIO_EXTILineConfig为什么也能进中断

使用特权

评论回复
板凳
supernan| | 2021-11-14 23:57 | 只看该作者

中断设置时少一句话把
EXTI_GenerateSWInterrupt(EXTI_Line0);

使用特权

评论回复
地板
sonicll| | 2021-11-15 09:16 | 只看该作者
因为AFIO_EXTICR1寄存器的默认值是0,也就是PA0触发EXTI0,你不配置这个寄存器,就是PA0触发;你可以把代码改成PB0触发,这样如果不调用GPIO_EXTILineConfig函数,是不行的

使用特权

评论回复
5
chuxh| | 2021-11-19 22:55 | 只看该作者
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);这话可以去掉,写与不写都一样,但是换成GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);你就进不去中断了,,,,,,所以原因我推测:A0对EXTI0是默认的,可以去查手册上相关寄存器的默认值

使用特权

评论回复
6
renyaq| | 2021-11-19 22:58 | 只看该作者

A0设为输入可以去掉,可能也是因为默认设为输入的关系,严格的说,去掉可行但是不严谨

使用特权

评论回复
7
lizye| | 2021-11-19 23:00 | 只看该作者

是默认的

使用特权

评论回复
8
huangchui| | 2021-11-19 23:02 | 只看该作者
/**
  * @brief  Selects the GPIO pin used as EXTI Line.
  * @param  GPIO_PortSource: selects the GPIO port to be used as source for EXTI lines.
  *   This parameter can be GPIO_PortSourceGPIOx where x can be (A..G).
  * @param  GPIO_PinSource: specifies the EXTI line to be configured.
  *   This parameter can be GPIO_PinSourcex where x can be (0..15).
  * @retval None
  */
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
初始应该是0,但是我发现在PA的前面几个脚不带这个也是可以的

使用特权

评论回复
9
zwll| | 2021-11-19 23:04 | 只看该作者
去查手册上相关寄存器的默认值

使用特权

评论回复
10
llljh| | 2021-11-19 23:06 | 只看该作者
说明默认就是映射到PA0上面的

使用特权

评论回复
11
pengf| | 2021-11-19 23:08 | 只看该作者
I/O口配置成中断模式

使用特权

评论回复
12
wyjie| | 2021-11-19 23:10 | 只看该作者

选择其他的GPIO口

使用特权

评论回复
13
llljh| | 2021-11-19 23:12 | 只看该作者
都能进入中断吗?

使用特权

评论回复
14
ousj| | 2021-11-19 23:15 | 只看该作者
GPIO_EXTILineConfig 相当重要

使用特权

评论回复
15
liuzaiy| | 2021-11-19 23:18 | 只看该作者
库函数的

使用特权

评论回复
16
heweibig| | 2021-11-19 23:22 | 只看该作者
用这个函数GPIO_EXTILineConfig配置外部中断

使用特权

评论回复
17
zhanghqi| | 2021-11-19 23:25 | 只看该作者
选择GPIO管脚用作外部中断线路

使用特权

评论回复
18
chuxh| | 2021-11-19 23:27 | 只看该作者
应该就是默认的模式。

使用特权

评论回复
19
heweibig| | 2021-11-19 23:29 | 只看该作者
可能参数就是这么默认的。

使用特权

评论回复
20
zhanghqi| | 2021-11-19 23:31 | 只看该作者
还是所有的IO都可以进入中断呢。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

737

主题

8940

帖子

8

粉丝