ST意法半导体
直播中

旧念

10年用户 911经验值
擅长:可编程逻辑 电源/新能源 光电显示
私信 关注
[问答]

STM32F103C8T6的PC14和PC15上的外部中断问题求解

大家好。
我需要改进一个旧项目。除了 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);
  • }




回帖(1)

杨斌

2023-1-6 14:09:55
这是真正的 ST 零件吗?
所有 VDD/VSS 引脚(包括模拟引脚)是否正确连接(直接在引脚上测量)?
尝试将代码简化到最低限度,使用单个引脚。还有问题吗?
在 ISR 结束时读出 EXTI 寄存器并检查中断标志是否被清除。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分