123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- #include "fsl_common.h"
- #ifndef __GIC_PRIO_BITS
- #if defined(ENABLE_RAM_VECTOR_TABLE)
- uint32_t InstallIRQHandler(IRQn_Type irq, uint32_t irqHandler)
- {
- #if defined(__CC_ARM)
- extern uint32_t Image$$VECTOR_ROM$$Base[];
- extern uint32_t Image$$VECTOR_RAM$$Base[];
- extern uint32_t Image$$RW_m_data$$Base[];
- #define __VECTOR_TABLE Image$$VECTOR_ROM$$Base
- #define __VECTOR_RAM Image$$VECTOR_RAM$$Base
- #define __RAM_VECTOR_TABLE_SIZE (((uint32_t)Image$$RW_m_data$$Base - (uint32_t)Image$$VECTOR_RAM$$Base))
- #elif defined(__ICCARM__)
- extern uint32_t __RAM_VECTOR_TABLE_SIZE[];
- extern uint32_t __VECTOR_TABLE[];
- extern uint32_t __VECTOR_RAM[];
- #elif defined(__GNUC__)
- extern uint32_t __VECTOR_TABLE[];
- extern uint32_t __VECTOR_RAM[];
- extern uint32_t __RAM_VECTOR_TABLE_SIZE_BYTES[];
- uint32_t __RAM_VECTOR_TABLE_SIZE = (uint32_t)(__RAM_VECTOR_TABLE_SIZE_BYTES);
- #endif
- uint32_t n;
- uint32_t ret;
- uint32_t irqMaskValue;
- irqMaskValue = DisableGlobalIRQ();
- if (SCB->VTOR != (uint32_t)__VECTOR_RAM)
- {
-
- for (n = 0; n < ((uint32_t)__RAM_VECTOR_TABLE_SIZE) / sizeof(uint32_t); n++)
- {
- __VECTOR_RAM[n] = __VECTOR_TABLE[n];
- }
-
- SCB->VTOR = (uint32_t)__VECTOR_RAM;
- }
- ret = __VECTOR_RAM[irq + 16];
-
- __VECTOR_RAM[irq + 16] = irqHandler;
- EnableGlobalIRQ(irqMaskValue);
- #if defined __CORTEX_M && (__CORTEX_M == 4U)
- __DSB();
- #endif
- return ret;
- }
- #endif
- #endif
- #ifndef QN908XC_SERIES
- #if (defined(FSL_FEATURE_SOC_SYSCON_COUNT) && (FSL_FEATURE_SOC_SYSCON_COUNT > 0))
- void EnableDeepSleepIRQ(IRQn_Type interrupt)
- {
- uint32_t index = 0;
- uint32_t intNumber = (uint32_t)interrupt;
- while (intNumber >= 32u)
- {
- index++;
- intNumber -= 32u;
- }
- SYSCON->STARTERSET[index] = 1u << intNumber;
- EnableIRQ(interrupt);
- }
- void DisableDeepSleepIRQ(IRQn_Type interrupt)
- {
- uint32_t index = 0;
- uint32_t intNumber = (uint32_t)interrupt;
- while (intNumber >= 32u)
- {
- index++;
- intNumber -= 32u;
- }
- DisableIRQ(interrupt);
- SYSCON->STARTERCLR[index] = 1u << intNumber;
- }
- #endif
- #endif
|