diff options
author | John R. Lenton <jlenton@gmail.com> | 2014-01-05 22:29:03 +0000 |
---|---|---|
committer | John R. Lenton <jlenton@gmail.com> | 2014-01-05 22:29:03 +0000 |
commit | ba3f87c94776538fece5e87ff1d7de547930397a (patch) | |
tree | 3112b328cff278168a1ef48fc37a65778ea9324a /stm/usrsw.c | |
parent | 6e1e98f8648d327098a03ce8d175c9854dd06cc8 (diff) | |
parent | 12e2656472bf53e467c066eda6f3e177a97210ca (diff) | |
download | micropython-ba3f87c94776538fece5e87ff1d7de547930397a.tar.gz micropython-ba3f87c94776538fece5e87ff1d7de547930397a.zip |
Merge remote-tracking branch 'upstream/master' into list_reverse
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); |