summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--stm/main.c115
-rw-r--r--stm/stm32fxxx_it.c589
2 files changed, 408 insertions, 296 deletions
diff --git a/stm/main.c b/stm/main.c
index a97d3a8c15..e1c8df0508 100644
--- a/stm/main.c
+++ b/stm/main.c
@@ -1,7 +1,9 @@
#include <stdio.h>
#include <stm32f4xx.h>
#include <stm32f4xx_rcc.h>
+#include <stm32f4xx_syscfg.h>
#include <stm32f4xx_gpio.h>
+#include <stm32f4xx_exti.h>
#include <stm32f4xx_tim.h>
#include <stm32f4xx_pwr.h>
#include <stm32f4xx_rtc.h>
@@ -68,6 +70,30 @@ void sw_init(void) {
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 sw_get(void) {
@@ -173,6 +199,34 @@ py_obj_t pyb_sw(void) {
}
}
+py_obj_t servo_obj_angle(py_obj_t self, py_obj_t angle) {
+ machine_uint_t servo_id;
+ py_user_get_data(self, &servo_id, NULL);
+ machine_int_t v = 152 + 85.0 * py_obj_get_float(angle) / 90.0;
+ if (v < 65) { v = 65; }
+ if (v > 210) { v = 210; }
+ switch (servo_id) {
+ case 1: TIM2->CCR1 = v; break;
+ case 2: TIM2->CCR2 = v; break;
+ case 3: TIM2->CCR3 = v; break;
+ case 4: TIM2->CCR4 = v; break;
+ }
+ return py_const_none;
+}
+
+const py_user_info_t servo_obj_info = {
+ "Servo",
+ NULL, // print
+ {
+ {"angle", 1, servo_obj_angle},
+ {NULL, 0, NULL},
+ }
+};
+
+py_obj_t pyb_Servo(py_obj_t servo_id) {
+ return py_obj_new_user(&servo_obj_info, (machine_uint_t)py_obj_get_int(servo_id), 0);
+}
+
/*
void g(uint i) {
printf("g:%d\n", i);
@@ -272,6 +326,51 @@ static py_obj_t pyb_info(void) {
return py_const_none;
}
+static void SYSCLKConfig_STOP(void) {
+ /* After wake-up from STOP reconfigure the system clock */
+ /* Enable HSE */
+ RCC_HSEConfig(RCC_HSE_ON);
+
+ /* Wait till HSE is ready */
+ while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET) {
+ }
+
+ /* Enable PLL */
+ RCC_PLLCmd(ENABLE);
+
+ /* Wait till PLL is ready */
+ while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {
+ }
+
+ /* Select PLL as system clock source */
+ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
+
+ /* Wait till PLL is used as system clock source */
+ while (RCC_GetSYSCLKSource() != 0x08) {
+ }
+}
+
+static py_obj_t pyb_stop(void) {
+ PWR_EnterSTANDBYMode();
+ //PWR_FlashPowerDownCmd(ENABLE); don't know what the logic is with this
+
+ /* Enter Stop Mode */
+ PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
+
+ /* Configures system clock after wake-up from STOP: enable HSE, PLL and select
+ * PLL as system clock source (HSE and PLL are disabled in STOP mode) */
+ SYSCLKConfig_STOP();
+
+ //PWR_FlashPowerDownCmd(DISABLE);
+
+ return py_const_none;
+}
+
+static py_obj_t pyb_standby(void) {
+ PWR_EnterSTANDBYMode();
+ return py_const_none;
+}
+
py_obj_t pyb_usart_send(py_obj_t data) {
usart_tx_char(py_obj_get_int(data));
return py_const_none;
@@ -322,6 +421,9 @@ int readline(vstr_t *line, const char *prompt) {
break;
}
sys_tick_delay_ms(1);
+ if (storage_needs_flush()) {
+ storage_flush();
+ }
}
if (escape == 0) {
if (c == 4 && vstr_len(line) == len) {
@@ -422,7 +524,7 @@ void do_repl(void) {
rt_call_function_0(module_fun);
nlr_pop();
uint32_t ticks = sys_tick_counter - start; // TODO implement a function that does this properly
- printf("(took %lu ms)\n", ticks);
+ //printf("(took %lu ms)\n", ticks);
} else {
// uncaught exception
py_obj_print((py_obj_t)nlr.ret_val);
@@ -583,8 +685,8 @@ void servo_init(void) {
py_obj_t pyb_servo_set(py_obj_t port, py_obj_t value) {
int p = py_obj_get_int(port);
int v = py_obj_get_int(value);
- if (v < 100) { v = 100; }
- if (v > 200) { v = 200; }
+ if (v < 50) { v = 50; }
+ if (v > 250) { v = 250; }
switch (p) {
case 1: TIM2->CCR1 = v; break;
case 2: TIM2->CCR2 = v; break;
@@ -843,13 +945,13 @@ soft_reset:
servo_init();
// audio
- audio_init();
+ //audio_init();
// timer
timer_init();
// RNG
- {
+ if (0) {
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE);
RNG_Cmd(ENABLE);
}
@@ -858,6 +960,8 @@ soft_reset:
{
py_obj_t m = py_module_new();
rt_store_attr(m, qstr_from_str_static("info"), rt_make_function_0(pyb_info));
+ rt_store_attr(m, qstr_from_str_static("stop"), rt_make_function_0(pyb_stop));
+ rt_store_attr(m, qstr_from_str_static("standby"), rt_make_function_0(pyb_standby));
rt_store_attr(m, qstr_from_str_static("source_dir"), rt_make_function_1(pyb_source_dir));
rt_store_attr(m, qstr_from_str_static("main"), rt_make_function_1(pyb_main));
rt_store_attr(m, qstr_from_str_static("sync"), rt_make_function_0(pyb_sync));
@@ -875,6 +979,7 @@ soft_reset:
rt_store_attr(m, qstr_from_str_static("ustat"), rt_make_function_0(pyb_usart_status));
rt_store_attr(m, qstr_from_str_static("rng"), rt_make_function_0(pyb_rng_get));
rt_store_attr(m, qstr_from_str_static("Led"), rt_make_function_1(pyb_Led));
+ rt_store_attr(m, qstr_from_str_static("Servo"), rt_make_function_1(pyb_Servo));
rt_store_name(qstr_from_str_static("pyb"), m);
rt_store_name(qstr_from_str_static("open"), rt_make_function_2(pyb_io_open));
diff --git a/stm/stm32fxxx_it.c b/stm/stm32fxxx_it.c
index a9785f91fe..0f17681e5f 100644
--- a/stm/stm32fxxx_it.c
+++ b/stm/stm32fxxx_it.c
@@ -1,291 +1,298 @@
-/**
- ******************************************************************************
- * @file stm32fxxx_it.c
- * @author MCD Application Team
- * @version V1.1.0
- * @date 19-March-2012
- * @brief Main Interrupt Service Routines.
- * This file provides all exceptions handler and peripherals interrupt
- * service routine.
- ******************************************************************************
- * @attention
- *
- * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
- *
- * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- ******************************************************************************
- */
-
-/* Includes ------------------------------------------------------------------*/
-#include "stm32fxxx_it.h"
-#include "stm32f4xx_exti.h"
-#include "usb_core.h"
-//#include "usbd_core.h"
-
-//#include "usbd_cdc_core.h"
-
-
-/* Private typedef -----------------------------------------------------------*/
-/* Private define ------------------------------------------------------------*/
-/* Private macro -------------------------------------------------------------*/
-/* Private variables ---------------------------------------------------------*/
-extern USB_OTG_CORE_HANDLE USB_OTG_dev;
-
-/* Private function prototypes -----------------------------------------------*/
-extern uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev);
-
-#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED
-extern uint32_t USBD_OTG_EP1IN_ISR_Handler (USB_OTG_CORE_HANDLE *pdev);
-extern uint32_t USBD_OTG_EP1OUT_ISR_Handler (USB_OTG_CORE_HANDLE *pdev);
-#endif
-
-/* Private functions ---------------------------------------------------------*/
-
-/******************************************************************************/
-/* Cortex-M Processor Exceptions Handlers */
-/******************************************************************************/
-
-extern void fatality();
-
-/**
- * @brief This function handles NMI exception.
- * @param None
- * @retval None
- */
-void NMI_Handler(void)
-{
-}
-
-/**
- * @brief This function handles Hard Fault exception.
- * @param None
- * @retval None
- */
-void HardFault_Handler(void)
-{
- /* Go to infinite loop when Hard Fault exception occurs */
- fatality();
- while (1)
- {
- }
-}
-
-/**
- * @brief This function handles Memory Manage exception.
- * @param None
- * @retval None
- */
-void MemManage_Handler(void)
-{
- /* Go to infinite loop when Memory Manage exception occurs */
- fatality();
- while (1)
- {
- }
-}
-
-/**
- * @brief This function handles Bus Fault exception.
- * @param None
- * @retval None
- */
-void BusFault_Handler(void)
-{
- /* Go to infinite loop when Bus Fault exception occurs */
- fatality();
- while (1)
- {
- }
-}
-
-/**
- * @brief This function handles Usage Fault exception.
- * @param None
- * @retval None
- */
-void UsageFault_Handler(void)
-{
- /* Go to infinite loop when Usage Fault exception occurs */
- fatality();
- while (1)
- {
- }
-}
-
-/**
- * @brief This function handles SVCall exception.
- * @param None
- * @retval None
- */
-void SVC_Handler(void)
-{
-}
-
-/**
- * @brief This function handles Debug Monitor exception.
- * @param None
- * @retval None
- */
-void DebugMon_Handler(void)
-{
-}
-
-/**
- * @brief This function handles PendSVC exception.
- * @param None
- * @retval None
- */
-void PendSV_Handler(void)
-{
-}
-
-/**
- * @brief This function handles EXTI15_10_IRQ Handler.
- * @param None
- * @retval None
- */
-#ifdef USE_USB_OTG_FS
-void OTG_FS_WKUP_IRQHandler(void)
-{
- if(USB_OTG_dev.cfg.low_power)
- {
- *(uint32_t *)(0xE000ED10) &= 0xFFFFFFF9 ;
- SystemInit();
- USB_OTG_UngateClock(&USB_OTG_dev);
- }
- EXTI_ClearITPendingBit(EXTI_Line18);
-}
-#endif
-
-/**
- * @brief This function handles EXTI15_10_IRQ Handler.
- * @param None
- * @retval None
- */
-#ifdef USE_USB_OTG_HS
-void OTG_HS_WKUP_IRQHandler(void)
-{
- if(USB_OTG_dev.cfg.low_power)
- {
- *(uint32_t *)(0xE000ED10) &= 0xFFFFFFF9 ;
- SystemInit();
- USB_OTG_UngateClock(&USB_OTG_dev);
- }
- EXTI_ClearITPendingBit(EXTI_Line20);
-}
-#endif
-
-/**
- * @brief This function handles OTG_HS Handler.
- * @param None
- * @retval None
- */
-#ifdef USE_USB_OTG_HS
-void OTG_HS_IRQHandler(void)
-#else
-void OTG_FS_IRQHandler(void)
-#endif
-{
- USBD_OTG_ISR_Handler (&USB_OTG_dev);
-}
-
-#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED
-/**
- * @brief This function handles EP1_IN Handler.
- * @param None
- * @retval None
- */
-void OTG_HS_EP1_IN_IRQHandler(void)
-{
- USBD_OTG_EP1IN_ISR_Handler (&USB_OTG_dev);
-}
-
-/**
- * @brief This function handles EP1_OUT Handler.
- * @param None
- * @retval None
- */
-void OTG_HS_EP1_OUT_IRQHandler(void)
-{
- USBD_OTG_EP1OUT_ISR_Handler (&USB_OTG_dev);
-}
-#endif
-
-/**
- * @brief This function handles SDIO global interrupt request.
- * @param None
- * @retval None
- */
-void SDIO_IRQHandler(void)
-{
- /* Process All SDIO Interrupt Sources */
- // dpgeorge: i don't think this is used at the moment...
- extern void SD_ProcessIRQSrc(void);
- SD_ProcessIRQSrc();
-}
-
-/******************************************************************************/
-/* STM32Fxxx Peripherals Interrupt Handlers */
-/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
-/* available peripheral interrupt handler's name please refer to the startup */
-/* file (startup_stm32fxxx.s). */
-/******************************************************************************/
-
-/**
- * @brief This function handles PPP interrupt request.
- * @param None
- * @retval None
- */
-/*void PPP_IRQHandler(void)
-{
-}*/
-
-// TIM6 Update event
-#include "stm32f4xx_tim.h"
-void TIM6_DAC_IRQHandler(void) {
- // work out if it's TIM6 that had the interrupt
- if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) {
- extern void timer_interrupt(void);
- timer_interrupt();
- TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
- } else {
- // it seems we get 2 calls to this interrupt handler, and only 1 is the TIM_IT_Update...
- // TODO work out what the other one is, and if we can disable it
- //printf("unhandled TIM6_DAC\n");
- }
-}
-
-#include "std.h"
-#include "led.h"
-// EXTI, for cc3000 on A14
-void EXTI15_10_IRQHandler(void) {
- // work out if it's A14 that had the interrupt
- if (EXTI_GetITStatus(EXTI_Line14) != RESET) {
- led_toggle(PYB_LED_G2);
- extern void SpiIntGPIOHandler(void);
- extern uint32_t exti14_enabled;
- extern uint32_t exti14_missed;
- //printf("-> EXTI14 en=%lu miss=%lu\n", exti14_enabled, exti14_missed);
- if (exti14_enabled) {
- exti14_missed = 0;
- SpiIntGPIOHandler(); // CC3000 interrupt
- } else {
- exti14_missed = 1;
- }
- EXTI_ClearITPendingBit(EXTI_Line14);
- //printf("<- EXTI14 done\n");
- }
-}
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+/**
+ ******************************************************************************
+ * @file stm32fxxx_it.c
+ * @author MCD Application Team
+ * @version V1.1.0
+ * @date 19-March-2012
+ * @brief Main Interrupt Service Routines.
+ * This file provides all exceptions handler and peripherals interrupt
+ * service routine.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
+ *
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
+ * You may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.st.com/software_license_agreement_liberty_v2
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32fxxx_it.h"
+#include "stm32f4xx_exti.h"
+#include "usb_core.h"
+//#include "usbd_core.h"
+
+//#include "usbd_cdc_core.h"
+
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+extern USB_OTG_CORE_HANDLE USB_OTG_dev;
+
+/* Private function prototypes -----------------------------------------------*/
+extern uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev);
+
+#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED
+extern uint32_t USBD_OTG_EP1IN_ISR_Handler (USB_OTG_CORE_HANDLE *pdev);
+extern uint32_t USBD_OTG_EP1OUT_ISR_Handler (USB_OTG_CORE_HANDLE *pdev);
+#endif
+
+/* Private functions ---------------------------------------------------------*/
+
+/******************************************************************************/
+/* Cortex-M Processor Exceptions Handlers */
+/******************************************************************************/
+
+extern void fatality();
+
+/**
+ * @brief This function handles NMI exception.
+ * @param None
+ * @retval None
+ */
+void NMI_Handler(void)
+{
+}
+
+/**
+ * @brief This function handles Hard Fault exception.
+ * @param None
+ * @retval None
+ */
+void HardFault_Handler(void)
+{
+ /* Go to infinite loop when Hard Fault exception occurs */
+ fatality();
+ while (1)
+ {
+ }
+}
+
+/**
+ * @brief This function handles Memory Manage exception.
+ * @param None
+ * @retval None
+ */
+void MemManage_Handler(void)
+{
+ /* Go to infinite loop when Memory Manage exception occurs */
+ fatality();
+ while (1)
+ {
+ }
+}
+
+/**
+ * @brief This function handles Bus Fault exception.
+ * @param None
+ * @retval None
+ */
+void BusFault_Handler(void)
+{
+ /* Go to infinite loop when Bus Fault exception occurs */
+ fatality();
+ while (1)
+ {
+ }
+}
+
+/**
+ * @brief This function handles Usage Fault exception.
+ * @param None
+ * @retval None
+ */
+void UsageFault_Handler(void)
+{
+ /* Go to infinite loop when Usage Fault exception occurs */
+ fatality();
+ while (1)
+ {
+ }
+}
+
+/**
+ * @brief This function handles SVCall exception.
+ * @param None
+ * @retval None
+ */
+void SVC_Handler(void)
+{
+}
+
+/**
+ * @brief This function handles Debug Monitor exception.
+ * @param None
+ * @retval None
+ */
+void DebugMon_Handler(void)
+{
+}
+
+/**
+ * @brief This function handles PendSVC exception.
+ * @param None
+ * @retval None
+ */
+void PendSV_Handler(void)
+{
+}
+
+/**
+ * @brief This function handles EXTI15_10_IRQ Handler.
+ * @param None
+ * @retval None
+ */
+#ifdef USE_USB_OTG_FS
+void OTG_FS_WKUP_IRQHandler(void)
+{
+ if(USB_OTG_dev.cfg.low_power)
+ {
+ *(uint32_t *)(0xE000ED10) &= 0xFFFFFFF9 ;
+ SystemInit();
+ USB_OTG_UngateClock(&USB_OTG_dev);
+ }
+ EXTI_ClearITPendingBit(EXTI_Line18);
+}
+#endif
+
+/**
+ * @brief This function handles EXTI15_10_IRQ Handler.
+ * @param None
+ * @retval None
+ */
+#ifdef USE_USB_OTG_HS
+void OTG_HS_WKUP_IRQHandler(void)
+{
+ if(USB_OTG_dev.cfg.low_power)
+ {
+ *(uint32_t *)(0xE000ED10) &= 0xFFFFFFF9 ;
+ SystemInit();
+ USB_OTG_UngateClock(&USB_OTG_dev);
+ }
+ EXTI_ClearITPendingBit(EXTI_Line20);
+}
+#endif
+
+/**
+ * @brief This function handles OTG_HS Handler.
+ * @param None
+ * @retval None
+ */
+#ifdef USE_USB_OTG_HS
+void OTG_HS_IRQHandler(void)
+#else
+void OTG_FS_IRQHandler(void)
+#endif
+{
+ USBD_OTG_ISR_Handler (&USB_OTG_dev);
+}
+
+#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED
+/**
+ * @brief This function handles EP1_IN Handler.
+ * @param None
+ * @retval None
+ */
+void OTG_HS_EP1_IN_IRQHandler(void)
+{
+ USBD_OTG_EP1IN_ISR_Handler (&USB_OTG_dev);
+}
+
+/**
+ * @brief This function handles EP1_OUT Handler.
+ * @param None
+ * @retval None
+ */
+void OTG_HS_EP1_OUT_IRQHandler(void)
+{
+ USBD_OTG_EP1OUT_ISR_Handler (&USB_OTG_dev);
+}
+#endif
+
+/**
+ * @brief This function handles SDIO global interrupt request.
+ * @param None
+ * @retval None
+ */
+void SDIO_IRQHandler(void)
+{
+ /* Process All SDIO Interrupt Sources */
+ // dpgeorge: i don't think this is used at the moment...
+ extern void SD_ProcessIRQSrc(void);
+ SD_ProcessIRQSrc();
+}
+
+/******************************************************************************/
+/* STM32Fxxx Peripherals Interrupt Handlers */
+/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
+/* available peripheral interrupt handler's name please refer to the startup */
+/* file (startup_stm32fxxx.s). */
+/******************************************************************************/
+
+/**
+ * @brief This function handles PPP interrupt request.
+ * @param None
+ * @retval None
+ */
+/*void PPP_IRQHandler(void)
+{
+}*/
+
+// TIM6 Update event
+#include "stm32f4xx_tim.h"
+void TIM6_DAC_IRQHandler(void) {
+ // work out if it's TIM6 that had the interrupt
+ if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) {
+ extern void timer_interrupt(void);
+ timer_interrupt();
+ TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
+ } else {
+ // it seems we get 2 calls to this interrupt handler, and only 1 is the TIM_IT_Update...
+ // TODO work out what the other one is, and if we can disable it
+ //printf("unhandled TIM6_DAC\n");
+ }
+}
+
+#include "std.h"
+#include "led.h"
+// EXTI
+// for USRSW on A13
+// for cc3000 on A14
+void EXTI15_10_IRQHandler(void) {
+ // work out if it's A13 that had the interrupt
+ if (EXTI_GetITStatus(EXTI_Line13) != RESET) {
+ // this is used just to wake the device
+ EXTI_ClearITPendingBit(EXTI_Line13);
+ }
+ // work out if it's A14 that had the interrupt
+ if (EXTI_GetITStatus(EXTI_Line14) != RESET) {
+ led_toggle(PYB_LED_G2);
+ extern void SpiIntGPIOHandler(void);
+ extern uint32_t exti14_enabled;
+ extern uint32_t exti14_missed;
+ //printf("-> EXTI14 en=%lu miss=%lu\n", exti14_enabled, exti14_missed);
+ if (exti14_enabled) {
+ exti14_missed = 0;
+ SpiIntGPIOHandler(); // CC3000 interrupt
+ } else {
+ exti14_missed = 1;
+ }
+ EXTI_ClearITPendingBit(EXTI_Line14);
+ //printf("<- EXTI14 done\n");
+ }
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/