GPIO做输出还能作外部中断输入吗?

偶尔会有人问起STM32芯片的GPIO做输出时还是否可能作为外部中断触发输入,这里一起聊聊该话题。

作为STM32芯片,其外部中断触发源可以是硬件模式或软件模式。所谓软件模式就是通过操作相关寄存器产生内部中断触发信号并向内核NVIC控制器申请中断。硬件模式自然是指来自GPIO引脚的电平跳变信号经边沿检测器形成中断触发信号向内核申请中断。【注:还有个别外设事件也可以作为外部中断触发源映射到外部中断控制器。】

我们这里要谈的是基于硬件模式的外部中断话题。当STM32的GPIO作为输出时,可能是通用GPIO输出也可能是基于其它外设复用情况下的输出,即复用输出。

下图是GPIO作为基本输入输出时的功能框图。

下面是GPIO作为其它外设的复用输出脚时的功能框图。

不难看出,所谓GPIO复用输出,就是将自身输出数据寄存器与输出控制电路及外部管脚断开来,并将输出控制电路及外部管脚借让给其它外设使用。通俗点说,所谓GPIO复用输出就是其它外设找GPIO借道而已。

从上面两幅图来看,不论GPIO通用输出还是复用输出,外部管脚的电平都可以连接到内部输入单元,管脚上的电平也应该可以被内部边沿检测器检测到。也就是说,即使GPIO作为输出,只要管脚上的电平跳变能被边沿检测器识别,按理可以作为外部中断触发源。

下面不妨用个简单的实例验证下。

这里使用一块STM32F4系列的开放板,通过定时器1的通道1输出8个PWM信号,同时将该定时器输出通道所用管脚PA8配置为上升沿触发的外部中断输入。PC13接一个按键,每按键一次启动定时器输出8个脉冲。

我使用STM32CubeMx图形化工具进行配置。因为要把PWM输出脚同时配置为外部中断输入这里不好操作。我先借用旁边的PA9进行配置,等生成初始化代码后我再将PA9改成PA8以及对应的中断矢量。TIM1配置在单脉冲模式,我在PC3按键中断里启动TIM1的计数器。

TIM1的基本配置如下:

再就是两个GPIO端口PC13/PA9的EXTI配置,分别对应按键脚和PWM输出脚。

将时钟、调试口等配置完毕后生成初始化代码,然后在代码里将之前基于PA9生成的代码改为基于TIM1-CH1的输出脚PA8的。

主程序功能代码很简单,就是配置TIM1-CH1的pwm输出。


在用户按键中断程序里启动TIM1的计数器。

在基于PWM输出脚PA8对应的外部中断程序里对中断次数进行统计。因它被配置为上沿触发,每次连续输出8个脉冲的话,统计值应该为8。

下面看看代码运行结果:

每按键一次输出8个脉冲,没有问题。

再看看基于这个8个输出脉冲统计到中断次数,也确实为8次。【如下图所示]

显然,当GPIO做为输出时还是可以感受到外部管脚电平的变化情况,并可以做为外部中断触发源申请中断。结合上面GPIO输出模式下的功能框图来看,当它被配置为输出时是具备双向特性的。当然,一般来讲,如果希望GPIO做为双向驱动口使用时,建议将其配置为OD开漏结合上拉模式。比方在做I2C应用时,将通信GPIO端口配置为开漏模式结合上拉电阻即可进行双向数据通信,无须对通信口的GPIO模式来回切换。

你点的每个赞,我都当成喜欢

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
外部中断是指通过外部电平变化触发的中断请求,例如按键按下、传感器检测到物体等。在单片机中,通常可以通过配置外部中断来实现对这些外部事件的响应。 对于大多数单片机来说,外部中断都是由硬件电路来实现的,我们只需要通过软件来配置和使用即可。一般来说,外部中断包括多个引脚,每个引脚都可以独立配置为外部中断输入。对于每个引脚,我们需要配置引脚的工作模式以及中断触发方式等参数。 以STM32为例,其外部中断的配置大致分为以下几个步骤: 1. 配置引脚工作模式为外部中断输入模式,例如通过GPIO_Init()函数实现。 2. 配置外部中断触发方式,包括触发边沿(上升沿、下降沿、双边沿)和触发级别(低电平触发、高电平触发等)等参数,例如通过EXTI_Init()函数实现。 3. 在中断向量表中设置中断服务函数,例如通过NVIC_SetVectorTable()函数实现。 4. 使能中断,例如通过NVIC_EnableIRQ()函数实现。 5. 在中断服务函数中编写相应的中断处理代码,例如读取按键状态、处理传感器数据等。 使用外部中断时,需要注意以下几点: 1. 确保引脚连接正确,否则无法触发中断。 2. 中断服务函数中的代码应尽量简洁,避免影响程序的实时性。 3. 在中断服务函数中,应尽量避免使用延时函数等会占用CPU时间的操作。 4. 针对不同的外部事件,应编写不同的中断服务函数,以便更好地管理和维护代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值