System¶
-
group
group_hal_system
High level interface for interacting with reset and delays.
Features
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
cyhal_system_critical_section_enter and cyhal_system_critical_section_exit are used to enable/disable global interrupts
cyhal_system_delay_ms and cyhal_system_delay_us are delay functions used to halt the CPU exectution for a specified period of time
cyhal_system_get_reset_reason gets the cause of latest system reset and cyhal_system_clear_reset_reason clears the reset cause registers
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 cyhal_system_critical_section_exit(state);
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 cyhal_system_clear_reset_reason(); } else { // 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 }
Typedefs
-
typedef void (*
cyhal_irq_handler
)(void)¶ Function pointer for IRQ handlers ( cyhal_system_set_isr).
Enums
-
enum
cyhal_reset_reason_t
¶ cyhal_reset_reason_t: Flags enum of possible system reset causes.
Values:
-
enumerator
CYHAL_SYSTEM_RESET_NONE
¶ No cause.
-
enumerator
CYHAL_SYSTEM_RESET_WDT
¶ A watchdog timer (WDT) reset has occurred.
-
enumerator
CYHAL_SYSTEM_RESET_ACTIVE_FAULT
¶ The fault logging system requested a reset from its Active logic.
-
enumerator
CYHAL_SYSTEM_RESET_DEEPSLEEP_FAULT
¶ The fault logging system requested a reset from its Deep-Sleep logic.
-
enumerator
CYHAL_SYSTEM_RESET_SOFT
¶ The CPU requested a system reset through it’s SYSRESETREQ.
-
enumerator
CYHAL_SYSTEM_RESET_HIB_WAKEUP
¶ A reset has occurred due to a a wakeup from hibernate power mode.
-
enumerator
CYHAL_SYSTEM_RESET_WCO_ERR
¶ A reset has occurred due to a watch-crystal clock error.
-
enumerator
CYHAL_SYSTEM_RESET_SYS_CLK_ERR
¶ A reset has occurred due to a system clock error.
-
enumerator
CYHAL_SYSTEM_RESET_PROTECTION
¶ A reset has occurred due to a protection violation.
-
enumerator
Functions
-
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
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
- Parameters
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.
- Parameters
milliseconds – [in] The number of milliseconds to delay for
- Returns
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.
- Parameters
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
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.
- Parameters
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
Returns CY_RSLT_SUCCESS if the set_isr request was successful, otherwise an error