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 #include #include +#include #include +#include #include #include #include @@ -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 - * - *

© COPYRIGHT 2012 STMicroelectronics

- * - * 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 + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * 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****/