forked from xuos/xiuos
568 lines
19 KiB
C
568 lines
19 KiB
C
/*
|
|
** ###################################################################
|
|
** Processors: RV32M1_ri5cy
|
|
** RV32M1_ri5cy
|
|
**
|
|
** Compilers: Keil ARM C/C++ Compiler
|
|
** GNU C Compiler
|
|
** IAR ANSI C/C++ Compiler for ARM
|
|
** MCUXpresso Compiler
|
|
**
|
|
** Reference manual: RV32M1 Series Reference Manual, Rev. 1 , 8/10/2018
|
|
** Version: rev. 1.0, 2018-10-02
|
|
** Build: b180926
|
|
**
|
|
** Abstract:
|
|
** Provides a system configuration function and a global variable that
|
|
** contains the system frequency. It configures the device and initializes
|
|
** the oscillator (PLL) that is part of the microcontroller device.
|
|
**
|
|
** Copyright 2016 Freescale Semiconductor, Inc.
|
|
** Copyright 2016-2018 NXP
|
|
** All rights reserved.
|
|
**
|
|
** SPDX-License-Identifier: BSD-3-Clause
|
|
**
|
|
** http: www.nxp.com
|
|
** mail: support@nxp.com
|
|
**
|
|
** Revisions:
|
|
** - rev. 1.0 (2018-10-02)
|
|
** Initial version.
|
|
**
|
|
** ###################################################################
|
|
*/
|
|
|
|
/*!
|
|
* @file RV32M1_ri5cy
|
|
* @version 1.0
|
|
* @date 2018-10-02
|
|
* @brief Device specific configuration file for RV32M1_ri5cy
|
|
* (implementation file)
|
|
*
|
|
* Provides a system configuration function and a global variable that contains
|
|
* the system frequency. It configures the device and initializes the oscillator
|
|
* (PLL) that is part of the microcontroller device.
|
|
*/
|
|
|
|
/*************************************************
|
|
File name: RV32M1_ri5cy
|
|
Description:
|
|
Others: take for references
|
|
https://github.com/open-isa-org/open-isa.org
|
|
History:
|
|
1. Date: 2022-02-16
|
|
Author: AIIT XUOS Lab
|
|
Modification:
|
|
*************************************************/
|
|
|
|
#include <stdint.h>
|
|
#include "fsl_device_registers.h"
|
|
#include "fsl_common.h"
|
|
|
|
typedef void (*irq_handler_t)(void);
|
|
|
|
extern void DMA0_0_4_8_12_DriverIRQHandler(void);
|
|
extern void DMA0_1_5_9_13_DriverIRQHandler(void);
|
|
extern void DMA0_2_6_10_14_DriverIRQHandler(void);
|
|
extern void DMA0_3_7_11_15_DriverIRQHandler(void);
|
|
extern void DMA0_Error_IRQHandler(void);
|
|
extern void CMC0_IRQHandler(void);
|
|
extern void EWM_IRQHandler(void);
|
|
extern void FTFE_Command_Complete_IRQHandler(void);
|
|
extern void FTFE_Read_Collision_IRQHandler(void);
|
|
extern void LLWU0_IRQHandler(void);
|
|
extern void MUA_IRQHandler(void);
|
|
extern void SPM_IRQHandler(void);
|
|
extern void WDOG0_IRQHandler(void);
|
|
extern void SCG_IRQHandler(void);
|
|
extern void LPIT0_IRQHandler(void);
|
|
extern void RTC_IRQHandler(void);
|
|
extern void LPTMR0_IRQHandler(void);
|
|
extern void LPTMR1_IRQHandler(void);
|
|
extern void TPM0_IRQHandler(void);
|
|
extern void TPM1_IRQHandler(void);
|
|
extern void TPM2_IRQHandler(void);
|
|
extern void EMVSIM0_IRQHandler(void);
|
|
extern void FLEXIO0_DriverIRQHandler(void);
|
|
extern void LPI2C0_DriverIRQHandler(void);
|
|
extern void LPI2C1_DriverIRQHandler(void);
|
|
extern void LPI2C2_DriverIRQHandler(void);
|
|
extern void I2S0_DriverIRQHandler(void);
|
|
extern void USDHC0_DriverIRQHandler(void);
|
|
extern void LPSPI0_DriverIRQHandler(void);
|
|
extern void LPSPI1_DriverIRQHandler(void);
|
|
extern void LPSPI2_DriverIRQHandler(void);
|
|
extern void LPUART0_DriverIRQHandler(void);
|
|
extern void LPUART1_DriverIRQHandler(void);
|
|
extern void LPUART2_DriverIRQHandler(void);
|
|
extern void USB0_IRQHandler(void);
|
|
extern void PORTA_IRQHandler(void);
|
|
extern void PORTB_IRQHandler(void);
|
|
extern void PORTC_IRQHandler(void);
|
|
extern void PORTD_IRQHandler(void);
|
|
extern void ADC0_IRQHandler(void);
|
|
extern void LPCMP0_IRQHandler(void);
|
|
extern void LPDAC0_IRQHandler(void);
|
|
extern void CAU3_Task_Complete_IRQHandler(void);
|
|
extern void CAU3_Security_Violation_IRQHandler(void);
|
|
extern void TRNG_IRQHandler(void);
|
|
extern void LPIT1_IRQHandler(void);
|
|
extern void LPTMR2_IRQHandler(void);
|
|
extern void TPM3_IRQHandler(void);
|
|
extern void LPI2C3_DriverIRQHandler(void);
|
|
extern void LPSPI3_DriverIRQHandler(void);
|
|
extern void LPUART3_DriverIRQHandler(void);
|
|
extern void PORTE_IRQHandler(void);
|
|
extern void LPCMP1_IRQHandler(void);
|
|
extern void RF0_0_IRQHandler(void);
|
|
extern void RF0_1_IRQHandler(void);
|
|
extern void INTMUX0_0_DriverIRQHandler(void);
|
|
extern void INTMUX0_1_DriverIRQHandler(void);
|
|
extern void INTMUX0_2_DriverIRQHandler(void);
|
|
extern void INTMUX0_3_DriverIRQHandler(void);
|
|
extern void INTMUX0_4_DriverIRQHandler(void);
|
|
extern void INTMUX0_5_DriverIRQHandler(void);
|
|
extern void INTMUX0_6_DriverIRQHandler(void);
|
|
extern void INTMUX0_7_DriverIRQHandler(void);
|
|
extern void INTMUX0_8_DriverIRQHandler(void);
|
|
extern void DMA0_0_4_8_12_IRQHandler(void);
|
|
extern void DMA0_1_5_9_13_IRQHandler(void);
|
|
extern void DMA0_2_6_10_14_IRQHandler(void);
|
|
extern void DMA0_3_7_11_15_IRQHandler(void);
|
|
extern void FLEXIO0_IRQHandler(void);
|
|
extern void LPI2C0_IRQHandler(void);
|
|
extern void LPI2C1_IRQHandler(void);
|
|
extern void LPI2C2_IRQHandler(void);
|
|
extern void I2S0_IRQHandler(void);
|
|
extern void USDHC0_IRQHandler(void);
|
|
extern void LPSPI0_IRQHandler(void);
|
|
extern void LPSPI1_IRQHandler(void);
|
|
extern void LPSPI2_IRQHandler(void);
|
|
extern void LPUART0_IRQHandler(void);
|
|
extern void LPUART1_IRQHandler(void);
|
|
extern void LPUART2_IRQHandler(void);
|
|
extern void LPI2C3_IRQHandler(void);
|
|
extern void LPSPI3_IRQHandler(void);
|
|
extern void LPUART3_IRQHandler(void);
|
|
extern void INTMUX0_0_IRQHandler(void);
|
|
extern void INTMUX0_1_IRQHandler(void);
|
|
extern void INTMUX0_2_IRQHandler(void);
|
|
extern void INTMUX0_3_IRQHandler(void);
|
|
extern void INTMUX0_4_IRQHandler(void);
|
|
extern void INTMUX0_5_IRQHandler(void);
|
|
extern void INTMUX0_6_IRQHandler(void);
|
|
extern void INTMUX0_7_IRQHandler(void);
|
|
|
|
/* ----------------------------------------------------------------------------
|
|
-- Core clock
|
|
---------------------------------------------------------------------------- */
|
|
uint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK;
|
|
|
|
extern uint32_t __etext;
|
|
extern uint32_t __data_start__;
|
|
extern uint32_t __data_end__;
|
|
|
|
extern uint32_t __bss_start__;
|
|
extern uint32_t __bss_end__;
|
|
|
|
static void copy_section(uint32_t * p_load, uint32_t * p_vma, uint32_t * p_vma_end)
|
|
{
|
|
while(p_vma <= p_vma_end)
|
|
{
|
|
*p_vma = *p_load;
|
|
++p_load;
|
|
++p_vma;
|
|
}
|
|
}
|
|
|
|
static void zero_section(uint32_t * start, uint32_t * end)
|
|
{
|
|
uint32_t * p_zero = start;
|
|
|
|
while(p_zero <= end)
|
|
{
|
|
*p_zero = 0;
|
|
++p_zero;
|
|
}
|
|
}
|
|
|
|
#define DEFINE_IRQ_HANDLER(irq_handler, driver_irq_handler) \
|
|
void __attribute__((weak)) irq_handler(void) { driver_irq_handler();}
|
|
|
|
#define DEFINE_DEFAULT_IRQ_HANDLER(irq_handler) void irq_handler() __attribute__((weak, alias("DefaultIRQHandler")))
|
|
|
|
DEFINE_DEFAULT_IRQ_HANDLER(DMA0_0_4_8_12_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(DMA0_1_5_9_13_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(DMA0_2_6_10_14_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(DMA0_3_7_11_15_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(DMA0_Error_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(CMC0_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(EWM_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(FTFE_Command_Complete_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(FTFE_Read_Collision_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(LLWU0_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(MUA_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(SPM_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(WDOG0_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(SCG_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(LPIT0_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(RTC_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(LPTMR0_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(LPTMR1_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(TPM0_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(TPM1_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(TPM2_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(EMVSIM0_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(FLEXIO0_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(LPI2C0_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(LPI2C1_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(LPI2C2_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(I2S0_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(USDHC0_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(LPSPI0_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(LPSPI1_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(LPSPI2_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(LPUART0_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(LPUART1_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(LPUART2_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(USB0_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(PORTA_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(PORTB_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(PORTC_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(PORTD_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(ADC0_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(LPCMP0_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(LPDAC0_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(CAU3_Task_Complete_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(CAU3_Security_Violation_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(TRNG_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(LPIT1_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(LPTMR2_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(TPM3_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(LPI2C3_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(LPSPI3_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(LPUART3_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(PORTE_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(LPCMP1_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(RF0_0_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(RF0_1_IRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(INTMUX0_0_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(INTMUX0_1_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(INTMUX0_2_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(INTMUX0_3_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(INTMUX0_4_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(INTMUX0_5_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(INTMUX0_6_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(INTMUX0_7_DriverIRQHandler);
|
|
DEFINE_DEFAULT_IRQ_HANDLER(INTMUX0_8_DriverIRQHandler);
|
|
|
|
DEFINE_IRQ_HANDLER(DMA0_0_4_8_12_IRQHandler, DMA0_0_4_8_12_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(DMA0_1_5_9_13_IRQHandler, DMA0_1_5_9_13_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(DMA0_2_6_10_14_IRQHandler, DMA0_2_6_10_14_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(DMA0_3_7_11_15_IRQHandler, DMA0_3_7_11_15_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(FLEXIO0_IRQHandler, FLEXIO0_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(LPI2C0_IRQHandler, LPI2C0_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(LPI2C1_IRQHandler, LPI2C1_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(LPI2C2_IRQHandler, LPI2C2_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(I2S0_IRQHandler, I2S0_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(USDHC0_IRQHandler, USDHC0_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(LPSPI0_IRQHandler, LPSPI0_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(LPSPI1_IRQHandler, LPSPI1_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(LPSPI2_IRQHandler, LPSPI2_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(LPUART0_IRQHandler, LPUART0_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(LPUART1_IRQHandler, LPUART1_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(LPUART2_IRQHandler, LPUART2_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(LPI2C3_IRQHandler, LPI2C3_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(LPSPI3_IRQHandler, LPSPI3_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(LPUART3_IRQHandler, LPUART3_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(INTMUX0_0_IRQHandler, INTMUX0_0_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(INTMUX0_1_IRQHandler, INTMUX0_1_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(INTMUX0_2_IRQHandler, INTMUX0_2_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(INTMUX0_3_IRQHandler, INTMUX0_3_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(INTMUX0_4_IRQHandler, INTMUX0_4_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(INTMUX0_5_IRQHandler, INTMUX0_5_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(INTMUX0_6_IRQHandler, INTMUX0_6_DriverIRQHandler);
|
|
DEFINE_IRQ_HANDLER(INTMUX0_7_IRQHandler, INTMUX0_7_DriverIRQHandler);
|
|
|
|
__attribute__((section("user_vectors"))) const irq_handler_t isrTable[] =
|
|
{
|
|
DMA0_0_4_8_12_IRQHandler,
|
|
DMA0_1_5_9_13_IRQHandler,
|
|
DMA0_2_6_10_14_IRQHandler,
|
|
DMA0_3_7_11_15_IRQHandler,
|
|
DMA0_Error_IRQHandler,
|
|
CMC0_IRQHandler,
|
|
MUA_IRQHandler,
|
|
USB0_IRQHandler,
|
|
USDHC0_IRQHandler,
|
|
I2S0_IRQHandler,
|
|
FLEXIO0_IRQHandler,
|
|
EMVSIM0_IRQHandler,
|
|
LPIT0_IRQHandler,
|
|
LPSPI0_IRQHandler,
|
|
LPSPI1_IRQHandler,
|
|
LPI2C0_IRQHandler,
|
|
LPI2C1_IRQHandler,
|
|
LPUART0_IRQHandler,
|
|
PORTA_IRQHandler,
|
|
TPM0_IRQHandler,
|
|
LPDAC0_IRQHandler,
|
|
ADC0_IRQHandler,
|
|
LPCMP0_IRQHandler,
|
|
RTC_IRQHandler,
|
|
INTMUX0_0_IRQHandler,
|
|
INTMUX0_1_IRQHandler,
|
|
INTMUX0_2_IRQHandler,
|
|
INTMUX0_3_IRQHandler,
|
|
INTMUX0_4_IRQHandler,
|
|
INTMUX0_5_IRQHandler,
|
|
INTMUX0_6_IRQHandler,
|
|
INTMUX0_7_IRQHandler,
|
|
EWM_IRQHandler,
|
|
FTFE_Command_Complete_IRQHandler,
|
|
FTFE_Read_Collision_IRQHandler,
|
|
LLWU0_IRQHandler,
|
|
SPM_IRQHandler,
|
|
WDOG0_IRQHandler,
|
|
SCG_IRQHandler,
|
|
LPTMR0_IRQHandler,
|
|
LPTMR1_IRQHandler,
|
|
TPM1_IRQHandler,
|
|
TPM2_IRQHandler,
|
|
LPI2C2_IRQHandler,
|
|
LPSPI2_IRQHandler,
|
|
LPUART1_IRQHandler,
|
|
LPUART2_IRQHandler,
|
|
PORTB_IRQHandler,
|
|
PORTC_IRQHandler,
|
|
PORTD_IRQHandler,
|
|
CAU3_Task_Complete_IRQHandler,
|
|
CAU3_Security_Violation_IRQHandler,
|
|
TRNG_IRQHandler,
|
|
LPIT1_IRQHandler,
|
|
LPTMR2_IRQHandler,
|
|
TPM3_IRQHandler,
|
|
LPI2C3_IRQHandler,
|
|
LPSPI3_IRQHandler,
|
|
LPUART3_IRQHandler,
|
|
PORTE_IRQHandler,
|
|
LPCMP1_IRQHandler,
|
|
RF0_0_IRQHandler,
|
|
RF0_1_IRQHandler,
|
|
};
|
|
|
|
extern uint32_t __VECTOR_TABLE[];
|
|
|
|
static uint32_t irqNesting = 0;
|
|
|
|
static void DefaultIRQHandler(void)
|
|
{
|
|
for (;;)
|
|
{
|
|
}
|
|
}
|
|
|
|
/* ----------------------------------------------------------------------------
|
|
-- SystemInit()
|
|
---------------------------------------------------------------------------- */
|
|
|
|
void SystemInit (void) {
|
|
#if (DISABLE_WDOG)
|
|
WDOG0->CNT = 0xD928C520U;
|
|
WDOG0->TOVAL = 0xFFFF;
|
|
WDOG0->CS = (uint32_t) ((WDOG0->CS) & ~WDOG_CS_EN_MASK) | WDOG_CS_UPDATE_MASK;
|
|
#endif /* (DISABLE_WDOG) */
|
|
|
|
SystemInitHook();
|
|
|
|
copy_section(&__etext, &__data_start__, &__data_end__);
|
|
zero_section(&__bss_start__, &__bss_end__);
|
|
|
|
/* Setup the vector table address. */
|
|
irqNesting = 0;
|
|
|
|
__ASM volatile("csrw 0x305, %0" :: "r"((uint32_t)__VECTOR_TABLE)); /* MTVEC */
|
|
__ASM volatile("csrw 0x005, %0" :: "r"((uint32_t)__VECTOR_TABLE)); /* UTVEC */
|
|
|
|
/* Clear all pending flags. */
|
|
EVENT_UNIT->INTPTPENDCLEAR = 0xFFFFFFFF;
|
|
EVENT_UNIT->EVTPENDCLEAR = 0xFFFFFFFF;
|
|
/* Set all interrupt as secure interrupt. */
|
|
EVENT_UNIT->INTPTSECURE = 0xFFFFFFFF;
|
|
}
|
|
|
|
/* ----------------------------------------------------------------------------
|
|
-- SystemCoreClockUpdate()
|
|
---------------------------------------------------------------------------- */
|
|
|
|
void SystemCoreClockUpdate (void) {
|
|
|
|
uint32_t SCGOUTClock; /* Variable to store output clock frequency of the SCG module */
|
|
uint16_t Divider;
|
|
Divider = ((SCG->CSR & SCG_CSR_DIVCORE_MASK) >> SCG_CSR_DIVCORE_SHIFT) + 1;
|
|
|
|
switch ((SCG->CSR & SCG_CSR_SCS_MASK) >> SCG_CSR_SCS_SHIFT) {
|
|
case 0x1:
|
|
/* System OSC */
|
|
SCGOUTClock = CPU_XTAL_CLK_HZ;
|
|
break;
|
|
case 0x2:
|
|
/* Slow IRC */
|
|
SCGOUTClock = (((SCG->SIRCCFG & SCG_SIRCCFG_RANGE_MASK) >> SCG_SIRCCFG_RANGE_SHIFT) ? 8000000 : 2000000);
|
|
break;
|
|
case 0x3:
|
|
/* Fast IRC */
|
|
SCGOUTClock = 48000000 + ((SCG->FIRCCFG & SCG_FIRCCFG_RANGE_MASK) >> SCG_FIRCCFG_RANGE_SHIFT) * 4000000;
|
|
break;
|
|
case 0x5:
|
|
/* Low Power FLL */
|
|
SCGOUTClock = 48000000 + ((SCG->LPFLLCFG & SCG_LPFLLCFG_FSEL_MASK) >> SCG_LPFLLCFG_FSEL_SHIFT) * 24000000;
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
SystemCoreClock = (SCGOUTClock / Divider);
|
|
}
|
|
|
|
/* ----------------------------------------------------------------------------
|
|
-- SystemInitHook()
|
|
---------------------------------------------------------------------------- */
|
|
|
|
__attribute__ ((weak)) void SystemInitHook (void) {
|
|
/* Void implementation of the weak function. */
|
|
}
|
|
|
|
#if defined(__IAR_SYSTEMS_ICC__)
|
|
#pragma weak SystemIrqHandler
|
|
void SystemIrqHandler(uint32_t mcause) {
|
|
#elif defined(__GNUC__)
|
|
__attribute__((weak)) void SystemIrqHandler(uint32_t mcause) {
|
|
#else
|
|
#error Not supported compiler type
|
|
#endif
|
|
uint32_t intNum;
|
|
|
|
if (mcause & 0x80000000) /* For external interrupt. */
|
|
{
|
|
intNum = mcause & 0x1FUL;
|
|
|
|
irqNesting++;
|
|
|
|
/* Clear pending flag in EVENT unit .*/
|
|
EVENT_UNIT->INTPTPENDCLEAR = (1U << intNum);
|
|
|
|
/* Read back to make sure write finished. */
|
|
(void)(EVENT_UNIT->INTPTPENDCLEAR);
|
|
|
|
__enable_irq(); /* Support nesting interrupt */
|
|
|
|
/* Now call the real irq handler for intNum */
|
|
isrTable[intNum]();
|
|
|
|
__disable_irq();
|
|
|
|
irqNesting--;
|
|
}
|
|
}
|
|
|
|
/* Use LIPT0 channel 0 for systick. */
|
|
#define SYSTICK_LPIT LPIT0
|
|
#define SYSTICK_LPIT_CH 0
|
|
#define SYSTICK_LPIT_IRQn LPIT0_IRQn
|
|
|
|
/* Leverage LPIT0 to provide Systick */
|
|
void SystemSetupSystick(uint32_t tickRateHz, uint32_t intPriority)
|
|
{
|
|
/* Init pit module */
|
|
CLOCK_EnableClock(kCLOCK_Lpit0);
|
|
|
|
/* Reset the timer channels and registers except the MCR register */
|
|
SYSTICK_LPIT->MCR |= LPIT_MCR_SW_RST_MASK;
|
|
SYSTICK_LPIT->MCR &= ~LPIT_MCR_SW_RST_MASK;
|
|
|
|
/* Setup timer operation in debug and doze modes and enable the module */
|
|
SYSTICK_LPIT->MCR = LPIT_MCR_DBG_EN_MASK | LPIT_MCR_DOZE_EN_MASK | LPIT_MCR_M_CEN_MASK;
|
|
|
|
/* Set timer period for channel 0 */
|
|
SYSTICK_LPIT->CHANNEL[SYSTICK_LPIT_CH].TVAL = (CLOCK_GetIpFreq(kCLOCK_Lpit0) / tickRateHz) - 1;
|
|
|
|
/* Enable timer interrupts for channel 0 */
|
|
SYSTICK_LPIT->MIER |= (1U << SYSTICK_LPIT_CH);
|
|
|
|
/* Set interrupt priority. */
|
|
EVENT_SetIRQPriority(SYSTICK_LPIT_IRQn, intPriority);
|
|
|
|
/* Enable interrupt at the EVENT unit */
|
|
EnableIRQ(SYSTICK_LPIT_IRQn);
|
|
|
|
/* Start channel 0 */
|
|
SYSTICK_LPIT->SETTEN |= (LPIT_SETTEN_SET_T_EN_0_MASK << SYSTICK_LPIT_CH);
|
|
}
|
|
|
|
uint32_t SystemGetIRQNestingLevel(void)
|
|
{
|
|
return irqNesting;
|
|
}
|
|
|
|
void SystemClearSystickFlag(void)
|
|
{
|
|
/* Channel 0. */
|
|
SYSTICK_LPIT->MSR = (1U << SYSTICK_LPIT_CH);
|
|
}
|
|
|
|
void EVENT_SetIRQPriority(IRQn_Type IRQn, uint8_t intPriority)
|
|
{
|
|
uint8_t regIdx;
|
|
uint8_t regOffset;
|
|
|
|
if ((IRQn < 32) && (intPriority < 8))
|
|
{
|
|
/*
|
|
* 4 priority control registers, each register controls 8 interrupts.
|
|
* Bit 0-2: interrupt 0
|
|
* Bit 4-7: interrupt 1
|
|
* ...
|
|
* Bit 28-30: interrupt 7
|
|
*/
|
|
regIdx = IRQn >> 3U;
|
|
regOffset = (IRQn & 0x07U) * 4U;
|
|
|
|
EVENT_UNIT->INTPTPRI[regIdx] = (EVENT_UNIT->INTPTPRI[regIdx] & ~(0x0F << regOffset)) | (intPriority << regOffset);
|
|
}
|
|
}
|
|
|
|
uint8_t EVENT_GetIRQPriority(IRQn_Type IRQn)
|
|
{
|
|
uint8_t regIdx;
|
|
uint8_t regOffset;
|
|
int32_t intPriority;
|
|
|
|
if ((IRQn < 32))
|
|
{
|
|
/*
|
|
* 4 priority control registers, each register controls 8 interrupts.
|
|
* Bit 0-2: interrupt 0
|
|
* Bit 4-7: interrupt 1
|
|
* ...
|
|
* Bit 28-30: interrupt 7
|
|
*/
|
|
regIdx = IRQn >> 3U;
|
|
regOffset = (IRQn & 0x07U) << 2U;
|
|
|
|
intPriority = (EVENT_UNIT->INTPTPRI[regIdx] >> regOffset) & 0xF;
|
|
return (uint8_t)intPriority;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
bool SystemInISR(void)
|
|
{
|
|
return ((EVENT_UNIT->INTPTENACTIVE) != 0);;
|
|
}
|
|
|
|
void EVENT_SystemReset(void)
|
|
{
|
|
EVENT_UNIT->SLPCTRL |= EVENT_SLPCTRL_SYSRSTREQST_MASK;
|
|
}
|