diff options
Diffstat (limited to 'stm/usrsw.c')
-rw-r--r-- | stm/usrsw.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/stm/usrsw.c b/stm/usrsw.c new file mode 100644 index 0000000000..385547843f --- /dev/null +++ b/stm/usrsw.c @@ -0,0 +1,69 @@ +#include <stm_misc.h> +#include <stm32f4xx_gpio.h> +#include <stm32f4xx_exti.h> +#include <stm32f4xx_syscfg.h> +#include <stm32f4xx_rcc.h> + +#include "misc.h" +#include "mpconfig.h" +#include "obj.h" +#include "usrsw.h" + +#define PYB_USRSW_PORT (GPIOA) +#define PYB_USRSW_PIN (GPIO_Pin_13) + +void switch_init(void) { + // make it an input with pull-up + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.GPIO_Pin = PYB_USRSW_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_Init(PYB_USRSW_PORT, &GPIO_InitStructure); + + // the rest does the EXTI interrupt + + /* Enable SYSCFG clock */ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); + + /* Connect EXTI Line13 to PA13 pin */ + SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource13); + + /* Configure EXTI Line13, rising edge */ + EXTI_InitTypeDef EXTI_InitStructure; + EXTI_InitStructure.EXTI_Line = EXTI_Line13; + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; + EXTI_InitStructure.EXTI_LineCmd = ENABLE; + EXTI_Init(&EXTI_InitStructure); + + /* Enable and set EXTI15_10 Interrupt to the lowest priority */ + NVIC_InitTypeDef NVIC_InitStructure; + NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); +} + +int switch_get(void) { + if (PYB_USRSW_PORT->IDR & PYB_USRSW_PIN) { + // pulled high, so switch is not pressed + return 0; + } else { + // pulled low, so switch is pressed + return 1; + } +} + +/******************************************************************************/ +/* Micro Python bindings */ + +static mp_obj_t pyb_switch(void) { + if (switch_get()) { + return mp_const_true; + } else { + return mp_const_false; + } +} + +MP_DEFINE_CONST_FUN_OBJ_0(pyb_switch_obj, pyb_switch); |