diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/cy_sleep_api.c b/targets/TARGET_Cypress/TARGET_PSOC6/cy_sleep_api.c index 0372585d2a..6ceb994fec 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/cy_sleep_api.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/cy_sleep_api.c @@ -19,21 +19,30 @@ #include "cmsis.h" #include "device.h" -#include "cy_syspm.h" +#include "cyhal_syspm.h" +#include "cy_us_ticker.h" #if DEVICE_SLEEP void hal_sleep(void) { - Cy_SysPm_CpuEnterSleep(CY_SYSPM_WAIT_FOR_INTERRUPT); + cyhal_syspm_sleep(); } void hal_deepsleep(void) { #if DEVICE_LPTICKER - Cy_SysPm_CpuEnterDeepSleep(CY_SYSPM_WAIT_FOR_INTERRUPT); + // A running timer will block DeepSleep, which would normally be + // good because we don't want the timer to accidentally + // lose counts. We don't care about that for us_ticker + // (If we're requesting deepsleep the upper layers already determined + // that they are okay with that), so explicitly stop the us_ticker + // timer before we go to sleep and start it back up afterwards. + cy_us_ticker_stop(); + cyhal_syspm_deepsleep(); + cy_us_ticker_start(); #else - Cy_SysPm_CpuEnterSleep(CY_SYSPM_WAIT_FOR_INTERRUPT); + cyhal_syspm_sleep(); #endif /* DEVICE_LPTICKER */ } diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/cy_us_ticker.h b/targets/TARGET_Cypress/TARGET_PSOC6/cy_us_ticker.h new file mode 100644 index 0000000000..b4ee6cf300 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSOC6/cy_us_ticker.h @@ -0,0 +1,37 @@ +/* + * mbed Microcontroller Library + * Copyright (c) 2017-2018 Future Electronics + * Copyright (c) 2019, Arm Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + +#ifndef MBED_CY_US_TICKER_H +#define MBED_CY_US_TICKER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** Starts the us_ticker. */ +void cy_us_ticker_start(); + +/** Stops the us_ticker. */ +void cy_us_ticker_stop(); + +#ifdef __cplusplus +} +#endif + +#endif // MBED_CY_US_TICKER_H diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/cy_us_ticker_api.c b/targets/TARGET_Cypress/TARGET_PSOC6/cy_us_ticker_api.c index 767acd0642..ec53834d10 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/cy_us_ticker_api.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/cy_us_ticker_api.c @@ -17,6 +17,7 @@ #include "cmsis.h" #include "us_ticker_api.h" #include "mbed_error.h" +#include "cy_us_ticker.h" #include "cyhal_timer.h" #include "cy_tcpwm_counter.h" @@ -51,6 +52,16 @@ static void cy_us_ticker_irq_handler(MBED_UNUSED void *arg, MBED_UNUSED cyhal_ti us_ticker_irq_handler(); } +void cy_us_ticker_start() +{ + cyhal_timer_start(&cy_us_timer); +} + +void cy_us_ticker_stop() +{ + cyhal_timer_stop(&cy_us_timer); +} + void us_ticker_init(void) { if (!cy_us_ticker_initialized) {