写了个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了),结果灯不亮...
附件为工程文件。
题主是否使能了AFIO时钟 感觉。。这东西还感觉,直接DEBUG不就知道了吗? 楼主,IO有没有进行配置? sunnydevil 发表于 2016-8-19 08:28
题主是否使能了AFIO时钟
因为用到了SPI2,所以使能了AFIO时钟。 jackeyt 发表于 2016-8-19 09:01
感觉。。这东西还感觉,直接DEBUG不就知道了吗?
没有仿真器... 安 发表于 2016-8-19 09:09
楼主,IO有没有进行配置?
IO配置了,已补上IO配置函数。 看代码没有什么问题,楼主最好是仿真一下。把触发方式改为边沿触发,看看能否进入中断。 安 发表于 2016-8-19 11:15
看代码没有什么问题,楼主最好是仿真一下。把触发方式改为边沿触发,看看能否进入中断。 ...
奈何没有仿真器...:'(
现在的触发方式就是上升沿触发吧? 改成边沿,不管上升沿或者下降沿都会触发的,有没有ST送的开发板,掰下来就是一个仿真器。
页:
[1]
2