any012 发表于 2016-8-18 17:15:37

写了个STM32的程序,感觉没有进外部中断。

本来是PC6是外部来的一个脉冲信号,PC7想输出个相位相反的信号。
想着把PC6设为上升/下降沿中断,然后在中断里判断PC6的状态,以此决定PC7输出是高或低。
结果PC7引脚始终是低电平。已排除PC7引脚配置错误的可能,用定时器中断使PC7一秒反转一次,波形是正常的。

然后就改PC6为上升沿中断,中断里将PC7反转一次。结果PC7仍未低电平。
求坛友看看PC6的配置程序和中断程序,是否有问题?
PC6配置程序:
void PC6_ExintConfig(void)
{
      EXTI_InitTypeDef EXTI_InitStructure;
      GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource6);
      EXTI_InitStructure.EXTI_Line = EXTI_Line6;
      EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
      EXTI_InitStructure.EXTI_LineCmd = ENABLE;
      EXTI_Init(&EXTI_InitStructure);
}

NVIC配置:
void NVIC_Configuration(void)
{
      NVIC_InitTypeDef NVIC_InitStructure;
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
      
      NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);
      
      NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);
      
      NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);
      
      NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);
      
      NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);
      
      NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);
}


中断程序:
void EXTI9_5_IRQHandler(void)
{
      if(EXTI_GetITStatus(EXTI_Line6) != RESET)
      {
//                if(COMP_OK() != 0)
//                        LVDS_EN(0);
//                else
//                {
//                        SPI_I2S_SendData(SPI2, spi2SendBuff);
//                        LVDS_EN(1);
//                }
//                EXTI_ClearITPendingBit(EXTI_Line6);
                GPIOC->ODR ^= GPIO_Pin_7;
      }
}


-----------------------------20160819-------------------------------------
补上GPIO配置:
void GPIO_Config(void)
{
      GPIO_InitTypeDef GPIO_InitStructure;
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
      
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      
      GPIO_Init(GPIOA, &GPIO_InitStructure);
      
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
      GPIO_Init(GPIOC, &GPIO_InitStructure);
      
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
      GPIO_Init(GPIOC, &GPIO_InitStructure);
      
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
      GPIO_Init(GPIOD, &GPIO_InitStructure);
      
      AD7193_CS(ON);
      ADT7310_CS(ON);
      ADG738_CS(ON);
      
      PC6_ExintConfig();
}
----------------------20160819-----------------------------
还是没搞定,新建了个工程,只保留定时器和GPIO,测试定时器控制PA0反转,一秒闪一次,没问题。
然后用PC6外部中断控制PA0反转,其他电路给PC6每秒一个脉冲信号(用示波器捕捉到可,确定拉到PC6了),结果灯不亮...
附件为工程文件。



sunnydevil 发表于 2016-8-19 08:28:26

题主是否使能了AFIO时钟

jackeyt 发表于 2016-8-19 09:01:04

感觉。。这东西还感觉,直接DEBUG不就知道了吗?

发表于 2016-8-19 09:09:19

楼主,IO有没有进行配置?

any012 发表于 2016-8-19 10:40:04

sunnydevil 发表于 2016-8-19 08:28
题主是否使能了AFIO时钟

因为用到了SPI2,所以使能了AFIO时钟。

any012 发表于 2016-8-19 10:40:21

jackeyt 发表于 2016-8-19 09:01
感觉。。这东西还感觉,直接DEBUG不就知道了吗?

没有仿真器...

any012 发表于 2016-8-19 10:41:00

安 发表于 2016-8-19 09:09
楼主,IO有没有进行配置?

IO配置了,已补上IO配置函数。

发表于 2016-8-19 11:15:46

看代码没有什么问题,楼主最好是仿真一下。把触发方式改为边沿触发,看看能否进入中断。

any012 发表于 2016-8-19 11:18:27

安 发表于 2016-8-19 11:15
看代码没有什么问题,楼主最好是仿真一下。把触发方式改为边沿触发,看看能否进入中断。 ...

奈何没有仿真器...:'(
现在的触发方式就是上升沿触发吧?

发表于 2016-8-19 15:21:18

改成边沿,不管上升沿或者下降沿都会触发的,有没有ST送的开发板,掰下来就是一个仿真器。
页: [1] 2
查看完整版本: 写了个STM32的程序,感觉没有进外部中断。