From d4b81df37d8ccd4d7c600c2756926fb9525a94f3 Mon Sep 17 00:00:00 2001 From: Philipp Klaus Date: Wed, 3 Aug 2016 17:25:41 +0200 Subject: [PATCH] fix: add missing firmware/src/exti.{h,c} source files --- firmware/src/exti.c | 157 ++++++++++++++++++++++++++++++++++++++++++++ firmware/src/exti.h | 18 +++++ 2 files changed, 175 insertions(+) create mode 100644 firmware/src/exti.c create mode 100644 firmware/src/exti.h diff --git a/firmware/src/exti.c b/firmware/src/exti.c new file mode 100644 index 0000000..03deb04 --- /dev/null +++ b/firmware/src/exti.c @@ -0,0 +1,157 @@ +#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); +} diff --git a/firmware/src/exti.h b/firmware/src/exti.h new file mode 100644 index 0000000..fba91dd --- /dev/null +++ b/firmware/src/exti.h @@ -0,0 +1,18 @@ +/* + * exti.h + * + * Created on: Sep 3, 2015 + * Author: lukasz + */ + +#ifndef SRC_EXTI_H_ +#define SRC_EXTI_H_ + +void init_GPIO_EXTI(void); + +uint8_t irq_stateD0; +uint8_t irq_stateA0; +uint8_t irq_stateD1; +uint8_t irq_stateA1; + +#endif /* SRC_EXTI_H_ */ -- 2.43.0