group group_hal_system

High level interface for interacting with reset and delays.


This driver provides three categories of functionality:

  • Ability to get the last reset reason.

  • Ability to delay for a period of time.

  • The ability to disable interrupts during a critical section.

Quick Start

Code Snippets

Snippet 1: Critical Section

Critical section is a portion in the code where all active interrupts are disabled. This is usually provided in places where the code execution must not be disturbed by an interrupt. An example is a firmware controlled communication protocol where timing of each byte must be maintained and any interrupt might cause loss of data. cyhal_system_critical_section_enter returns the current state of interrupts which denote the active interrupts in the system. This must be passed as argument to cyhal_system_critical_section_exit while exiting the critical section.

    // Disables all interrupts
    uint32_t state = cyhal_system_critical_section_enter();

    // Application code where interrupts must be disabled

    // Re-enable all interrupts that were enabled before

Snippet 2: Reset reason

cyhal_system_get_reset_reason must be called at the beginning of the main to determine the reason for reset. The return parameters are present in cyhal_reset_reason_t.

    if (CYHAL_SYSTEM_RESET_WDT == cyhal_system_get_reset_reason())
        // WDT caused system reset

        // Application code to perform some action to indicate that WDT caused the interrupt

        // Clear the reset reason
        // Reset reason is not WDT Could be POR or XRES.  Specify application code to perform some
        // action to indicate WDT was not the reset reaon


typedef void (*cyhal_irq_handler)(void)

Function pointer for IRQ handlers ( cyhal_system_set_isr).


enum cyhal_reset_reason_t

cyhal_reset_reason_t: Flags enum of possible system reset causes.



No cause.


A watchdog timer (WDT) reset has occurred.


The fault logging system requested a reset from its Active logic.


The fault logging system requested a reset from its Deep-Sleep logic.


The CPU requested a system reset through it’s SYSRESETREQ.


A reset has occurred due to a a wakeup from hibernate power mode.


A reset has occurred due to a watch-crystal clock error.


A reset has occurred due to a system clock error.


A reset has occurred due to a protection violation.


uint32_t cyhal_system_critical_section_enter(void)

Enter a critical section.

Disables interrupts and returns a value indicating whether the interrupts were previously enabled.

See Snippet 1: Critical Section for code snippet on critical section


Returns the state before entering the critical section. This value must be provided to cyhal_system_critical_section_exit() to properly restore the state

void cyhal_system_critical_section_exit(uint32_t old_state)

Exit a critical section.

Re-enables the interrupts if they were enabled before cyhal_system_critical_section_enter() was called. The argument should be the value returned from cyhal_system_critical_section_enter().

See Snippet 1: Critical Section for code snippet on critical section


old_state[in] The state of interrupts from cyhal_system_critical_section_enter()

cy_rslt_t cyhal_system_delay_ms(uint32_t milliseconds)

Requests that the current operation delays for at least the specified length of time.

If this is running in an RTOS aware environment (COMPONENTS+=RTOS_AWARE) or (DEFINES+=CY_RTOS_AWARE) it will attempt to have the RTOS suspend the current task so others can continue to run. If this is not run under an RTOS it will then defer to the standard system delay which is likely to be a busy loop. If this is part of an application that is build with RTOS awareness, but the delay should not depend on the RTOS for whatever reason, use cyhal_system_delay_us() with the appropriate 1000x multiplier to the delay time.


milliseconds[in] The number of milliseconds to delay for


Returns CY_RSLT_SUCCESS if the delay request was successful, otherwise error

void cyhal_system_delay_us(uint16_t microseconds)

Requests that the current operation delay for at least the specified number of micro-seconds.

This will generally keep the processor active in a loop for the specified length of time. If this is running under an RTOS, it will NOT attempt to run any other RTOS tasks, however if the scheduler or a high priority interrupt comes it they can take over anyway.


microseconds[in] The number of micro-seconds to delay for

cyhal_reset_reason_t cyhal_system_get_reset_reason(void)

Gets the cause of the latest reset or resets that occurred in the system.

Refer Snippet 2: Reset reason for code snippet on cyhal_system_get_reset_reason


Returns an enum of flags with the cause of the last reset(s)

void cyhal_system_clear_reset_reason(void)

Clears the reset cause registers.

This should be done after calling cyhal_system_get_reset_reason to make sure the reason does not persist between resets.

cy_rslt_t cyhal_system_set_isr(int32_t irq_num, int32_t irq_src, uint8_t priority, cyhal_irq_handler handler)

Registers the specified handler as the callback function for the specififed irq_num with the given priority.

For devices that mux interrupt sources into mcu interrupts, the irq_src defines the source of the interrupt.

  • irq_num[in] The MCU interrupt number to register the handler for.

  • irq_src[in] The interrupt source that feeds the MCU interrupt. For devices that have a 1:1 mapping between interrupt sources and MCU interrupts this should be the same as the irq_num.

  • priority[in] The MCU interrupt priority.

  • handler[in] The function pointer to call when the interrupt is triggered.


Returns CY_RSLT_SUCCESS if the set_isr request was successful, otherwise an error