/** * @brief Configure COMP1 and COMP2 with interrupt * @param None * @retval None */ void COMP_Config(void) { COMP_InitTypeDef COMP_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* GPIOB Peripheral clock enable */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); /* Configure PB5 in analog closes the switch GR6-2: PB5 is connected to COMP2 non inverting input */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure); /* COMP Peripheral clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_COMP, ENABLE); /* COMP2 Init: COMP2 is enabled as soon as inverting input is selected */ /* In this example, the lower threshold is set to VREFINT/4 ~ 1.22 / 4 ~ 0.305 V but can be changed to other available possibilities */ COMP_InitStructure.COMP_InvertingInput = COMP_InvertingInput_1_4VREFINT; COMP_InitStructure.COMP_OutputSelect = COMP_OutputSelect_None; COMP_InitStructure.COMP_Speed = COMP_Speed_Slow; COMP_Init(&COMP_InitStructure); /* Enable Window mode */ COMP_WindowCmd(ENABLE); /* Enable COMP1: the higher threshold is set to VREFINT ~ 1.22 V */ COMP_Cmd(ENABLE); /* Configure EXTI Line 21 in interrupt mode */ EXTI_InitStructure.EXTI_Line = EXTI_Line21; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Configure EXTI Line 22 in interrupt mode */ EXTI_InitStructure.EXTI_Line = EXTI_Line22; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Clear EXTI21 line */ EXTI_ClearITPendingBit(EXTI_Line21); /* Clear EXTI22 line */ EXTI_ClearITPendingBit(EXTI_Line22); /* Configure COMP IRQ */ NVIC_InitStructure.NVIC_IRQChannel = COMP_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
/** * @brief Configure COMP1 and COMP2 with interrupt * @param None * @retval None */ static void COMP_Config(void) { COMP_InitTypeDef COMP_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; /* GPIOA Peripheral clock enable */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); /* Configure PA1: PA1 is used as COMP1 and COMP2 non inveting input */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); /* COMP Peripheral clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); /* COMP1 Init: the higher threshold is set to VREFINT ~ 1.22V but can be changed to other available possibilities */ COMP_StructInit(&COMP_InitStructure); COMP_InitStructure.COMP_InvertingInput = COMP_InvertingInput_VREFINT; COMP_InitStructure.COMP_Output = COMP_Output_None; COMP_InitStructure.COMP_Mode = COMP_Mode_LowPower; COMP_InitStructure.COMP_Hysteresis = COMP_Hysteresis_High; COMP_Init(COMP_Selection_COMP1, &COMP_InitStructure); /* COMP2 Init: the lower threshold is set to VREFINT/4 ~ 1.22 / 4 ~ 0.305 V but can be changed to other available possibilities */ COMP_StructInit(&COMP_InitStructure); COMP_InitStructure.COMP_InvertingInput = COMP_InvertingInput_1_4VREFINT; COMP_InitStructure.COMP_Output = COMP_Output_None; COMP_InitStructure.COMP_Mode = COMP_Mode_LowPower; COMP_InitStructure.COMP_Hysteresis = COMP_Hysteresis_High; COMP_Init(COMP_Selection_COMP2, &COMP_InitStructure); /* Enable Window mode */ COMP_WindowCmd(ENABLE); /* Enable COMP1: the higher threshold is set to VREFINT ~ 1.22 V */ COMP_Cmd(COMP_Selection_COMP1, ENABLE); /* Enable COMP2: the lower threshold is set to VREFINT/4 ~ 0.305 V */ COMP_Cmd(COMP_Selection_COMP2, ENABLE); /* Configure EXTI Line 21 in interrupt mode */ EXTI_InitStructure.EXTI_Line = EXTI_Line21; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Configure EXTI Line 22 in interrupt mode */ EXTI_InitStructure.EXTI_Line = EXTI_Line22; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Clear EXTI21 line */ EXTI_ClearITPendingBit(EXTI_Line21); /* Clear EXTI22 line */ EXTI_ClearITPendingBit(EXTI_Line22); /* Configure COMP IRQ */ NVIC_InitStructure.NVIC_IRQChannel = ADC1_COMP_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }