blob: af902cce21abdfe515684c90b5c576598408efd8 [file] [log] [blame]
/**
* \addtogroup BSP
* \{
* \addtogroup SYSTEM
* \{
* \addtogroup INTERRUPTS
*
* \brief Interrupt priority configuration
*
* \{
*/
/**
*****************************************************************************************
*
* @file interrupts.h
*
* @brief Interrupt priority configuration
*
* Copyright (c) 2016, Dialog Semiconductor
* All rights reserved.
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
*****************************************************************************************
*/
#ifndef INTERRUPTS_H_
#define INTERRUPTS_H_
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* \brief Setup interrupt priorities
*
* When CPU is reset all interrupts have some priority setup.
* Reset -3
* NMI -2
* HardFault -1
* All other interrupts have configurable priority that is set to 0.
* If some interrupts should have priority other then default, this function should be called.
* Argument \p prios can specify only those interrupts that need to have value other than default.
* For memory efficiency table with priorities for each interrupt consist of interrupt priority
* tag PRIORITY_x followed by interrupts that should have this priority, interrupts names are from
* enum IRQn_Type.
*
* \note If interrupt priorities do not need to be changed dynamically at runtime, best way to
* specify static configuration is to create table named __dialog_interrupt_priorities that will
* be used automatically at startup.
*
* Most convenient way to prepare such table is to use macros like in example below:
*
* \code{.c}
* INTERRUPT_PRIORITY_CONFIG_START(__dialog_interrupt_priorities)
* PRIORITY_0, // Start interrupts with priority 0 (highest)
* SVCall_IRQn,
* PendSV_IRQn,
* SysTick_IRQn,
* PRIORITY_1, // Start interrupts with priority 1
* BLE_WAKEUP_LP_IRQn,
* BLE_GEN_IRQn,
* FTDF_WAKEUP_IRQn,
* FTDF_GEN_IRQn,
* PRIORITY_2,
* SRC_IN_IRQn,
* SRC_OUT_IRQn,
* PRIORITY_3,
* UART_IRQn,
* UART2_IRQn,
* INTERRUPT_PRIORITY_CONFIG_END
* \endcode
*
* Table __dialog_interrupt_priorities can now be used to call this function.
* Table can specify all interrupts or only those that need to be changed.
*
* \param [in] prios table with interrupts and priorities to setup
*
*/
void set_interrupt_priorities(const int8_t prios[]);
/**
* \brief Check whether running in interrupt context.
*
* \return true if the CPU is serving an interrupt.
*/
static inline bool in_interrupt(void)
{
return (SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) != 0;
}
/**
* \brief Default interrupt priorities table.
*
*/
extern const int8_t __dialog_interrupt_priorities[];
#if (dg_configBLACK_ORCA_IC_REV != BLACK_ORCA_IC_REV_A) && (dg_configUSE_AUTO_CHIP_DETECTION != 1)
#define LAST_IRQn PLL_LOCK_IRQn
#else
#define LAST_IRQn RESERVED31_IRQn
#endif
/*
* Following macros allow easy way to build table with interrupt priorities.
* See example in set_interrupt_priorities function description.
*/
#define INTERRUPT_PRIORITY_CONFIG_START(name) const int8_t name[] = {
#define PRIORITY_0 (LAST_IRQn + 1)
#define PRIORITY_1 (LAST_IRQn + 2)
#define PRIORITY_2 (LAST_IRQn + 3)
#define PRIORITY_3 (LAST_IRQn + 4)
#define PRIORITY_TABLE_END (LAST_IRQn + 5)
#define INTERRUPT_PRIORITY_CONFIG_END PRIORITY_TABLE_END };
#ifdef __cplusplus
}
#endif
#endif /* INTERRUPTS_H_ */
/**
* \}
* \}
* \}
*/