void HAL_Delay_Microseconds(uint32_t uSec) { volatile uint32_t DWT_START = DWT->CYCCNT; // keep DWT_TOTAL from overflowing (max 59.652323s w/72MHz SystemCoreClock) if (uSec > (UINT_MAX / SYSTEM_US_TICKS)) { uSec = (UINT_MAX / SYSTEM_US_TICKS); } volatile uint32_t DWT_TOTAL = (SYSTEM_US_TICKS * uSec); while((DWT->CYCCNT - DWT_START) < DWT_TOTAL) { HAL_Notify_WDT(); } }
/******************************************************************************* * Function Name : HAL_SysTick_Handler * Description : Decrements the various Timing variables related to SysTick. * Input : None * Output : None. * Return : None. ************************************************ *******************************/ extern "C" void HAL_SysTick_Handler(void) { if (LED_RGB_IsOverRidden()) { #ifndef SPARK_NO_CLOUD if (LED_Spark_Signal != 0) { LED_Signaling_Override(); } #endif } else if (TimingLED != 0x00) { TimingLED--; } else if(SPARK_FLASH_UPDATE || Spark_Error_Count || network.listening()) { //Do nothing } else if (SYSTEM_POWEROFF) { LED_SetRGBColor(RGB_COLOR_GREY); LED_On(LED_RGB); } else if(SPARK_LED_FADE && (!SPARK_CLOUD_CONNECTED || system_cloud_active())) { LED_Fade(LED_RGB); TimingLED = 20;//Breathing frequency kept constant } else if(SPARK_CLOUD_CONNECTED) { LED_SetRGBColor(system_mode()==SAFE_MODE ? RGB_COLOR_MAGENTA : RGB_COLOR_CYAN); LED_On(LED_RGB); SPARK_LED_FADE = 1; } else { LED_Toggle(LED_RGB); if(SPARK_CLOUD_SOCKETED || ( network.connected() && !network.ready())) TimingLED = 50; //50ms else TimingLED = 100; //100ms } if(SPARK_FLASH_UPDATE) { #ifndef SPARK_NO_CLOUD if (TimingFlashUpdateTimeout >= TIMING_FLASH_UPDATE_TIMEOUT) { //Reset is the only way now to recover from stuck OTA update HAL_Core_System_Reset(); } else { TimingFlashUpdateTimeout++; } #endif } else if(network.listening() && HAL_Core_Mode_Button_Pressed(10000)) { network.listen_command(); } // determine if the button press needs to change the state (and hasn't done so already)) else if(!network.listening() && HAL_Core_Mode_Button_Pressed(3000) && !wasListeningOnButtonPress) { if (network.connecting()) { network.connect_cancel(true, true); } // fire the button event to the user, then enter listening mode (so no more button notifications are sent) // there's a race condition here - the HAL_notify_button_state function should // be thread safe, but currently isn't. HAL_Notify_Button_State(0, false); network.listen(); HAL_Notify_Button_State(0, true); } #ifdef IWDG_RESET_ENABLE if (TimingIWDGReload >= TIMING_IWDG_RELOAD) { TimingIWDGReload = 0; /* Reload WDG counter */ HAL_Notify_WDT(); DECLARE_SYS_HEALTH(CLEARED_WATCHDOG); } else { TimingIWDGReload++; } #endif }