本帖最后由 jiangyy 于 2018-10-9 17:48 编辑
今天写代码的时候,遇到一个问题。我用的是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)中,一直循环查询。不知道高手有没有其他好的解决办法(三个引脚不能变更改动)。
希望留言,共享谢谢!
很多人说不可以,具体你怎么操作?标志位都是共用一根中断线
一周热门 更多>