打印

多个外部中断公用一个中断服务函数怎么办?

[复制链接]
227|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
哈金|  楼主 | 2018-7-12 07:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天写代码的时候,遇到一个问题。我用的是STM32F407ZGT6芯片,写代码的时候,写着写着,其中用到三个引脚:PA3,PE3,PF3,且三个引脚都用到外部中断(默认下拉输入)。因为正常使用的话,三个引脚都挂在EXTI_PinSource3(中断线3)上面。且它们共用一个外部中断服务函数。也就是三个不能同时使用。本来我设计的要求是:当外部三个高电平分别送入到三个引脚时,触发中断,在外部中断服务函数里面进行处理。但是目前只能映射一个,其他两个不能使用。我目前的做法是一个引脚映射到中断线上面(SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource3)),另外两个只配置为普通的下拉输入。其作出相应的处理代码如下:

定义输入引脚:
#define EX_RED_CTRL()PAin(3)
#define FPGA_INIT_DONE()PEin(3)
#define FPGA2MCU_IRQ()PFin(3)

1.PF3中断处理函数:
void EXTI3_IRQHandler(void)
{
if (EXTI->pR & EXTI_Line3)
{
EXTI->pR = EXTI_Line3;
if(FPGA2MCU_IRQ())
{delay_ms(3);
if(FPGA2MCU_IRQ())
{
delay_ms(3);
if(FPGA2MCU_IRQ())
{
delay_ms(3);
if(FPGA2MCU_IRQ())
{
LED0 =!LED0;
LED1 =!LED1;
}

2.PA3,PE3处理函数:
这里我只能新建一个函数void update(void);把他们放进去,如下:
void update(void)
{
if(EX_RED_CTRL())
{
delay_ms(3);
if(EX_RED_CTRL())
{
delay_ms(3);
if(EX_RED_CTRL())
{
delay_ms(3);
if(EX_RED_CTRL())
{
LED0 =!LED0;
}


if(FPGA_INIT_DONE())
{
delay_ms(3);
if(FPGA_INIT_DONE())
delay_ms(3);
if(FPGA_INIT_DONE())
delay_ms(3);
if(FPGA_INIT_DONE())
LED1 =!LED1;


最后,我是把void update(void)函数放在主函数中的大循环while(1)中,一直循环查询。不知道高手有没有其他好的解决办法(三个引脚不能变更改动)。希望留言,共享谢谢!

使用特权

评论回复

相关帖子

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

本版积分规则

432

主题

433

帖子

1

粉丝