大家好。
我需要改进一个旧项目。除了 PC13-PC15 外,MCU 上没有空闲引脚,我需要三个外部中断。用于使 PC13-PC15 作为输入较低的初始化代码。反正我不使用 LSE 或 RTC。
对于 PC13,一切正常,中断按预期工作。在 IRQ 例程中,标志按预期被清除。但是,在 PC14 或 PC15 的引脚状态第一次改变后,中断一直保持着状态,就好像 IRQ 处理程序中相应的挂起位没有被清除一样。
在项目中,我使用了 StdPeriphLib v.3.5.0。我查了一下,低级访问寄存器的功能和相应设置位的定义没有错误。PC14 和 PC15 上也没有外部噪声。为了确定这一点,我尝试了不同的外部“强上拉”,示波器也没有显示该引脚上的噪音。如参考手册所述,VBAT 引脚通过一个 100nF 电容外部连接到 VDD。外部脉冲也以清晰的前沿出现,板上没有寄生电容或连接。
因此,这不是外部硬件问题。在某些方面,代码是错误的。任何想法和建议都会有所帮助。谢谢。
- void ABCInputsInit(void)
- {
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
- //RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
- //PWR_BackupAccessCmd(ENABLE);
- //RCC_LSEConfig(RCC_LSE_OFF);
- //BKP_TamperPinCmd(DISABLE);
- //PWR_BackupAccessCmd(DISABLE);
- GPIO_InitTypeDef myGPIO_InitStructure;
- myGPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
- myGPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
- myGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOAtiNG;
- GPIO_Init(GPIOC, &myGPIO_InitStructure);
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource14);
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource15);
- EXTI_InitTypeDef myEXTI_InitStructure;
- myEXTI_InitStructure.EXTI_Line = EXTI_Line13|EXTI_Line14|EXTI_Line15;
- myEXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
- myEXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
- myEXTI_InitStructure.EXTI_LineCmd = ENABLE;
- EXTI_Init(&myEXTI_InitStructure);
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
- NVIC_InitTypeDef myNVIC_InitStructure;
- myNVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
- myNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0A;
- myNVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0A;
- myNVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&myNVIC_InitStructure);
- }
- void EXTI15_10_IRQHandler(void)
- {
- if(EXTI_GetITStatus(EXTI_Line13) != RESET)
- {
- //EXTI_ClearFlag(EXTI_Line13);
- EXTI_ClearITPendingBit(EXTI_Line13);
- APhase = SET;
- }
- if(EXTI_GetITStatus(EXTI_Line14) != RESET)
- {
- //EXTI_ClearFlag(EXTI_Line14);
- EXTI_ClearITPendingBit(EXTI_Line14);
- BPhase = SET;
- }
- if(EXTI_GetITStatus(EXTI_Line15) != RESET)
- {
- //EXTI_ClearFlag(EXTI_Line15);
- EXTI_ClearITPendingBit(EXTI_Line15);
- CPhase = SET;
- }
- //NVIC_ClearPendingIRQ(EXTI15_10_IRQn);
- }