diff options
Diffstat (limited to 'ports/stm32/stm32_it.c')
| -rw-r--r-- | ports/stm32/stm32_it.c | 75 | 
1 files changed, 73 insertions, 2 deletions
| diff --git a/ports/stm32/stm32_it.c b/ports/stm32/stm32_it.c index 052550a8f..19778020d 100644 --- a/ports/stm32/stm32_it.c +++ b/ports/stm32/stm32_it.c @@ -80,7 +80,13 @@  #include "uart.h"  #include "storage.h"  #include "dma.h" + +#if MICROPY_HW_TINYUSB_STACK +#include "tusb.h" +#include "shared/tinyusb/mp_usbd.h" +#else  #include "usb.h" +#endif  #if defined(MICROPY_HW_USB_FS)  extern PCD_HandleTypeDef pcd_fs_handle; @@ -145,7 +151,7 @@ void HardFault_C_Handler(ExceptionRegisters_t *regs) {          powerctrl_mcu_reset();      } -    #if MICROPY_HW_ENABLE_USB +    #if MICROPY_HW_STM_USB_STACK      // We need to disable the USB so it doesn't try to write data out on      // the VCP and then block indefinitely waiting for the buffer to drain.      pyb_usb_flags = 0; @@ -299,7 +305,11 @@ void DebugMon_Handler(void) {  #if MICROPY_HW_USB_FS  void USB_UCPD1_2_IRQHandler(void) { +    #if MICROPY_HW_TINYUSB_STACK +    tud_int_handler(0); +    #else      HAL_PCD_IRQHandler(&pcd_fs_handle); +    #endif  }  #endif @@ -307,7 +317,11 @@ void USB_UCPD1_2_IRQHandler(void) {  #if MICROPY_HW_USB_FS  void USB_DRD_FS_IRQHandler(void) { +    #if MICROPY_HW_TINYUSB_STACK +    tud_int_handler(0); +    #else      HAL_PCD_IRQHandler(&pcd_fs_handle); +    #endif  }  #endif @@ -315,7 +329,11 @@ void USB_DRD_FS_IRQHandler(void) {  #if MICROPY_HW_USB_FS  void USB_IRQHandler(void) { +    #if MICROPY_HW_TINYUSB_STACK +    tud_int_handler(0); +    #else      HAL_PCD_IRQHandler(&pcd_fs_handle); +    #endif  }  #endif @@ -323,7 +341,11 @@ void USB_IRQHandler(void) {  #if MICROPY_HW_USB_FS  void USB_LP_IRQHandler(void) { +    #if MICROPY_HW_TINYUSB_STACK +    tud_int_handler(0); +    #else      HAL_PCD_IRQHandler(&pcd_fs_handle); +    #endif  }  #endif @@ -337,7 +359,11 @@ void USB_LP_IRQHandler(void) {  #if MICROPY_HW_USB_FS  void OTG_FS_IRQHandler(void) {      IRQ_ENTER(OTG_FS_IRQn); +    #if MICROPY_HW_TINYUSB_STACK +    tud_int_handler(0); +    #else      HAL_PCD_IRQHandler(&pcd_fs_handle); +    #endif      IRQ_EXIT(OTG_FS_IRQn);  }  #endif @@ -345,13 +371,21 @@ void OTG_FS_IRQHandler(void) {  #if defined(STM32N6)  void USB1_OTG_HS_IRQHandler(void) {      IRQ_ENTER(USB1_OTG_HS_IRQn); +    #if MICROPY_HW_TINYUSB_STACK +    tud_int_handler(0); +    #else      HAL_PCD_IRQHandler(&pcd_hs_handle); +    #endif      IRQ_EXIT(USB1_OTG_HS_IRQn);  }  #else  void OTG_HS_IRQHandler(void) {      IRQ_ENTER(OTG_HS_IRQn); +    #if MICROPY_HW_TINYUSB_STACK +    tud_int_handler(0); +    #else      HAL_PCD_IRQHandler(&pcd_hs_handle); +    #endif      IRQ_EXIT(OTG_HS_IRQn);  }  #endif @@ -384,16 +418,28 @@ static void OTG_CMD_WKUP_Handler(PCD_HandleTypeDef *pcd_handle) {          /* Enable the main PLL. */          __HAL_RCC_PLL_ENABLE(); +        #if defined(STM32U5) +        /* Wait till PLL is ready */ +        while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLL1RDY) == RESET) { +        } + +        /* Select PLL as SYSCLK */ +        MODIFY_REG(RCC->CFGR1, RCC_CFGR1_SW, RCC_SYSCLKSOURCE_PLLCLK); +        #else          /* Wait till PLL is ready */          while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) {          }          /* Select PLL as SYSCLK */          MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, RCC_SYSCLKSOURCE_PLLCLK); +        #endif          #if defined(STM32H7)          while (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL1) {          } +        #elif defined(STM32U5) +        while (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_SYSCLKSOURCE_STATUS_PLLCLK) { +        }          #else          while (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) {          } @@ -402,6 +448,9 @@ static void OTG_CMD_WKUP_Handler(PCD_HandleTypeDef *pcd_handle) {          /* ungate PHY clock */          __HAL_PCD_UNGATE_PHYCLOCK(pcd_handle);      } +    #if MICROPY_HW_TINYUSB_STACK +    tud_int_handler(0); +    #endif  }  #endif @@ -439,7 +488,7 @@ void OTG_HS_WKUP_IRQHandler(void) {      OTG_CMD_WKUP_Handler(&pcd_hs_handle); -    #if !defined(STM32H5) && !defined(STM32H7) +    #if !defined(STM32H5) && !defined(STM32H7) && !defined(STM32U5)      /* Clear EXTI pending Bit*/      __HAL_USB_HS_EXTI_CLEAR_FLAG();      #endif @@ -507,6 +556,7 @@ void TAMP_STAMP_IRQHandler(void) {  }  #endif +#if !defined(STM32U5)  #if defined(STM32H5)  void RTC_IRQHandler(void)  #elif defined(STM32N6) @@ -529,6 +579,7 @@ void RTC_WKUP_IRQHandler(void)      Handle_EXTI_Irq(EXTI_RTC_WAKEUP); // clear EXTI flag and execute optional callback      IRQ_EXIT(RTC_WKUP_IRQn);  } +#endif  #if defined(STM32N6)  void RTC_IRQHandler(void) { @@ -573,6 +624,26 @@ void TIM1_BRK_UP_TRG_COM_IRQHandler(void) {  #endif +#if defined(STM32U5) +extern RTC_HandleTypeDef RTCHandle; +void RTC_IRQHandler(void) { +    IRQ_ENTER(RTC_IRQn); +    if (RTC->SR & RTC_SR_WUTF) { +        RTC->SCR = RTC_SCR_CWUTF; // clear wakeup interrupt flag +        Handle_EXTI_Irq(EXTI_RTC_WAKEUP); // clear EXTI flag and execute optional callback +    } +    if (RTC->SR & RTC_SR_ALRAF) { +        RTC->SCR &= ~RTC_SCR_CALRAF; // clear Alarm A flag +        Handle_EXTI_Irq(EXTI_RTC_ALARM); // clear EXTI flag and execute optional callback +    } +    if (RTC->SR & RTC_SR_TSF) { +        RTC->SR &= ~RTC_SR_TSF; // clear timestamp flag +        Handle_EXTI_Irq(EXTI_RTC_TIMESTAMP); // clear EXTI flag and execute optional callback +    } +    IRQ_EXIT(RTC_IRQn); +} +#endif +  void TIM1_BRK_TIM9_IRQHandler(void) {      IRQ_ENTER(TIM1_BRK_TIM9_IRQn);      timer_irq_handler(9); | 
