--- /dev/null
+#include "stm32f10x_exti.h"
+#include "stm32f10x_conf.h"
+#include "stm32f10x_gpio.h"
+#include "stm32f10x_rcc.h"
+#include "periph_conf.h"
+#include "exti.h"
+#include "misc_utils.h"
+
+
+//initialization of external interrupts for overcurrent discriminators
+void init_GPIO_EXTI(void)
+{
+ irq_stateD0 = 0;
+ irq_stateA0 = 0;
+ irq_stateD1 = 0;
+ irq_stateA1 = 0;
+
+ GPIO_InitTypeDef GPIO_InitStructure;
+ EXTI_InitTypeDef EXTI_InitStructure;
+ NVIC_InitTypeDef NVIC_InitStructure;
+
+ /* Enable the GPIOB Clock */
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
+
+
+ /* Configure the GPIO_LED pin */
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_10 | GPIO_Pin_11;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_Init(GPIOB, &GPIO_InitStructure);
+
+ //enable AFIO clock
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
+
+ //Connect EXTI Lines to Pins
+ GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);
+ GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);
+ GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource10);
+ GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource11);
+ //select EXTI line0
+ EXTI_InitStructure.EXTI_Line = EXTI_Line0;
+ //select interrupt mode
+ EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
+ //generate interrupt on rising edge
+ EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
+ //enable EXTI line
+ EXTI_InitStructure.EXTI_LineCmd = ENABLE;
+ //send values to registers
+ EXTI_Init(&EXTI_InitStructure);
+ //select EXTI lines
+ EXTI_InitStructure.EXTI_Line = EXTI_Line1;
+ EXTI_Init(&EXTI_InitStructure);
+ EXTI_InitStructure.EXTI_Line = EXTI_Line10;
+ EXTI_Init(&EXTI_InitStructure);
+ EXTI_InitStructure.EXTI_Line = EXTI_Line11;
+ EXTI_Init(&EXTI_InitStructure);
+ //disable AFIO clock
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, DISABLE);
+ //configure NVIC
+ //select NVIC channel to configure
+ NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
+ //set priority to lowest
+ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
+ //set subpriority to lowest
+ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
+ //enable IRQ channel
+ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+ //update NVIC registers
+ NVIC_Init(&NVIC_InitStructure);
+ //select NVIC channel to configure
+ NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
+ NVIC_Init(&NVIC_InitStructure);
+ NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
+ NVIC_Init(&NVIC_InitStructure);
+ // NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
+ // NVIC_Init(&NVIC_InitStructure);
+ EXTI_ClearITPendingBit(EXTI_Line0);
+ EXTI_ClearITPendingBit(EXTI_Line1);
+ EXTI_ClearITPendingBit(EXTI_Line10);
+ EXTI_ClearITPendingBit(EXTI_Line11);
+ NVIC_ClearPendingIRQ(EXTI0_IRQn);
+ NVIC_ClearPendingIRQ(EXTI1_IRQn);
+ NVIC_ClearPendingIRQ(EXTI15_10_IRQn);
+}
+
+void EXTI0_IRQHandler(void)
+{
+ //Check if EXTI_Line0 is asserted
+ if(EXTI_GetITStatus(EXTI_Line0) != RESET)
+ {
+ //CB_GPIO_Out_Toggle(LED4);
+ CB_GPIO_Out_Hi(DISD1);
+ CB_GPIO_Out_Lo(ENAD1);
+ CB_GPIO_Out_Hi(DISA1);
+ CB_GPIO_Out_Lo(ENAA1);
+ CB_GPIO_Out_Lo(SENSOREN1);
+ CB_GPIO_Out_Lo(JTAGEN1);
+ irq_stateD1 = 1;
+ }
+ //we need to clear line pending bit manually
+ EXTI_ClearITPendingBit(EXTI_Line0);
+ NVIC_ClearPendingIRQ(EXTI0_IRQn);
+}
+
+void EXTI1_IRQHandler(void)
+{
+ //Check if EXTI_Line1 is asserted
+ if(EXTI_GetITStatus(EXTI_Line1) != RESET)
+ {
+ //CB_GPIO_Out_Toggle(LED3);
+ CB_GPIO_Out_Hi(DISD1);
+ CB_GPIO_Out_Lo(ENAD1);
+ CB_GPIO_Out_Hi(DISA1);
+ CB_GPIO_Out_Lo(ENAA1);
+ CB_GPIO_Out_Lo(SENSOREN1);
+ CB_GPIO_Out_Lo(JTAGEN1);
+ irq_stateA1 = 1;
+ }
+ //we need to clear line pending bit manually
+ EXTI_ClearITPendingBit(EXTI_Line1);
+ NVIC_ClearPendingIRQ(EXTI1_IRQn);
+}
+
+void EXTI15_10_IRQHandler(void)
+{
+ //Check if EXTI_Line1 is asserted
+ if(EXTI_GetITStatus(EXTI_Line10) != RESET)
+ {
+ //CB_GPIO_Out_Toggle(LED2);
+ CB_GPIO_Out_Hi(DISD0);
+ CB_GPIO_Out_Lo(ENAD0);
+ CB_GPIO_Out_Hi(DISA0);
+ CB_GPIO_Out_Lo(ENAA0);
+ CB_GPIO_Out_Lo(SENSOREN0);
+ CB_GPIO_Out_Lo(JTAGEN0);
+ irq_stateD0 = 1;
+ }
+ //we need to clear line pending bit manually
+ EXTI_ClearITPendingBit(EXTI_Line10);
+
+ //Check if EXTI_Line1 is asserted
+ if(EXTI_GetITStatus(EXTI_Line11) != RESET)
+ {
+ //CB_GPIO_Out_Toggle(LED1);
+ CB_GPIO_Out_Hi(DISD0);
+ CB_GPIO_Out_Lo(ENAD0);
+ CB_GPIO_Out_Hi(DISA0);
+ CB_GPIO_Out_Lo(ENAA0);
+ CB_GPIO_Out_Lo(SENSOREN0);
+ CB_GPIO_Out_Lo(JTAGEN0);
+ irq_stateA0 = 1;
+ }
+ //we need to clear line pending bit manually
+ EXTI_ClearITPendingBit(EXTI_Line11);
+
+ NVIC_ClearPendingIRQ(EXTI15_10_IRQn);
+}