Startup Functions main(), WarmMain()
Startup Functions main(), WarmMain()
This document describes the firmware startup and callback functions for TWELITE GOLD.
main(), WarmMain()
In TWELITE GOLD, the firmware starts from the main()
function. A wake-up from sleep is handled by the WarmMain()
function. Since these functions have a weak
attribute, users can define their own versions.
__attribute__((weak)) int main(void);
__attribute((weak)) void WarmMain(void);
int main(void) {
ToCoNet_vInit_Cold_Pre();
ToCoNet_vBoard_Init(FALSE);
ToCoNet_vInit_Cold(0, 0);
ToCoNet_vMain(NULL);
}
void WarmMain(void)
{
vAHI_OnWakeup_MW(FALSE);
ToCoNet_vInit_Warm_Pre();
ToCoNet_vBoard_Init(TRUE);
ToCoNet_vInit_Warm(0);
ToCoNet_vMain(NULL);
}
// source/twenet_main.c
Call flow for a cold boot (power-on, reset)
main()
ToCoNet_vInit_Cold_Pre() <= Memory initialization
Call cbAppColdStart(FALSE) for TWENET C, init_cold() for MWX
ToCoNet_vBoard_Init(FALSE)
vAHI_RegEvMgr_MW() <= Initialize mwf library
BOARD_InitBootPins()
BOARD_InitPins() <= Initializes each pin in this function
BOARD_BootClockRUN() <= Clock initialization
vAHI_FRWTStart_MW() <= Start FRWT (WTIMER)
G_TWENET_CHIPSENSOR_AUTO_ON_BOOT()
<= Preparation for on-chip temperature sensor acquisition
GPIO_PortInit() <= GPIO initialization
checkIrqPending() <= Clear interrupt status
AES_Init() <= AES encryption initialization
__enable_irq() <= Start interrupts
ToCoNet_vInit_Cold() <= TWENET initialization
Call cbAppColdStart(TRUE) for TWENET C, setup() for MWX
ToCoNet_vMain() <= TWENET main loop
Call flow for a warm boot (wake-up from RAM retention sleep)
WarmMain()
vAHI_OnWakeup_MW(FALSE) <= Peripheral processing immediately after wake-up
ToCoNet_vInit_Warm_Pre() <= Call cbAppWarmStart(FALSE) for TWENET C, init_warm() for MWX
ToCoNet_vBoard_Init(TRUE)
BOARD_BootClockRUN() <= Clock initialization
vAHI_FRWTSetBootCount_MW() <= Save FRWT (WTIMER) wake-up count
G_TWENET_CHIPSENSOR_AUTO_ON_BOOT()
<= Preparation for on-chip temperature sensor acquisition
GPIO_PortInit() <= GPIO initialization
vAHI_OnWakeup_MW() <= Wake-up processing
checkIrqPending() <= Clear interrupt status
AES_Init() <= AES encryption initialization
__enable_irq(); <= Start interrupts
ToCoNet_vInit_Warm() <= TWENET initialization
Call cbAppWarmStart(TRUE) for TWENET C, wakeup() for MWX
ToCoNet_vMain() <= TWENET main loop
Call flow for wake-up from RAM OFF sleep
main()
vAHI_OnWakeupRamOff_MW(FALSE) <= Peripheral processing (checking DIO state)
ToCoNet_vInit_Cold_Pre() <= Memory initialization
Call cbAppColdStart(FALSE) for TWENET C, init_cold() for MWX
ToCoNet_vBoard_Init(FALSE)
vAHI_RegEvMgr_MW() <= Initialize mwf library
BOARD_BootClockRUN() <= Clock initialization
vAHI_FRWTStart_MW() <= Start FRWT (WTIMER)
G_TWENET_CHIPSENSOR_AUTO_ON_BOOT()
<= Preparation for on-chip temperature sensor acquisition
GPIO_PortInit() <= GPIO initialization
vAHI_OnWakeupRamOff_MW(TRUE) <= Peripheral processing (releasing GPIO RETENTION)
checkIrqPending() <= Clear interrupt status
AES_Init() <= AES encryption initialization
__enable_irq() <= Start interrupts
ToCoNet_vInit_Cold() <= TWENET initialization
Call cbAppColdStart(TRUE) for TWENET C, setup() for MWX
ToCoNet_vMain() <= TWENET main loop
ToCoNet_vBoard_Init(bool_t)
__attribute__((weak)) void ToCoNet_vBoard_Init(bool_t bWarm);
// source/twenet_main.c
This function performs hardware initialization at startup. Since it has a weak attribute, you can define your own initialization procedures. Refer to the twenet_main.c
source code for details.
This series of initialization steps includes the necessary corrections for projects generated by the MCUXpresso project wizard. For function structures and other details, please read through the code, referring to the SDK documentation.
If you need to perform unique hardware initialization, you’ll be modifying this section. Be aware that this is a sensitive part of the code, so careful modification and thorough testing are required.
ToCoNet_vInitCold(uint32)
void ToCoNet_vInit_Cold(uint32 flag, uint32 u32SysHz)
This function performs the TWENET initialization procedure.
Parameter | Description |
---|---|
flag | Startup specification. Please use 0 for normal use. |
u32SysHz | Specifies the SysTick timer frequency. Please use 0 for normal use.If needed, specify a multiple of 1000. |
ToCoNet_vInit_Warm()
void ToCoNet_vInit_Warm(uint32 flag)
This function performs the TWENET initialization procedure when waking up from sleep.
Parameter | Description |
---|---|
flag | Startup specification. Please use 0 for normal use. |
ToCoNet_vMain()
void ToCoNet_vMain(PR_TOCONET_MAIN_HOOK fp_hook)
This is the main loop for TWENET.
checkIrqPending()
static bool_t checkIrqPending();
uint64_t g_twenet_irq_bm_on_boot;
WEAK bool_t __twenet_irq_handler_pending_on_boot(int32_t);
This function saves and clears interrupt information that occurred during or after sleep, until this function is called.
- Each bit of
g_twenet_irq_bm_on_boot
corresponds to an interrupt source (IRQ_Type
) in the form(1uul << IRQ_Type)
. - The interrupt types are defined in
typedef enum IRQn
inJN5189.h
. - Interrupts are cleared by calling
NVIC_ClearPendingIRQ()
. - If a user defines the
__twenet_irq_handler_pending_on_boot(int32_t IRQ_Type)
function and theIRQ_Type
interrupt is enabled, this function will be called. If the return value isFALSE
,NVIC_ClearPendingIRQ(IRQ_Type)
is executed. If it’sTRUE
, nothing happens.
System Timer Cycle
You can set the SysTick timer cycle in the following ways:
Set it in the
ToCoNet_vInitCold()
function. This setting takes precedence.Set
G_TWENET_SYSTICK_HZ()
incbAppColdStart(FALSE)
.If neither of the above methods is used, the value of
sToCoNet_AppContext.u16TickHz
will be used.
Please note the following:
- The TWENET processing cycle (
sToCoNet_AppContext.u16TickHz
) has a maximum of 1000Hz.- The SysTick cycle is an integer multiple of
sToCoNet_AppContext.u16TickHz
.
- The SysTick cycle is an integer multiple of
- The standard setting is SysTick = 1000Hz,
sToCoNet_AppContext.u16TickHz
= 1000Hz.- A semi-standard setting is SysTick = 2000Hz or 4000Hz, and
sToCoNet_AppContext.u16TickHz
= 1000Hz. This helps distribute the load by performing some background processing (like UART) outside of the TWENET cycle. This also allows for processing with a faster SysTick timer interrupt (seeAppQAPI_SysTick_Hnd_Reg()
). - Another semi-standard setting is SysTick = 250Hz,
sToCoNet_AppContext.u16TickHz
= 250Hz. This is used for power saving or when processing per timer is heavy, as the time per radio packet is about 2-5ms (transmission time after modulation and gaps between packets). - We do not confirm the operation of each API or our applications with semi-standard settings. If you need to use them, please perform thorough testing.
- A semi-standard setting is SysTick = 2000Hz or 4000Hz, and
Initialization
G_TWENET_B_MAC_ALWAYS_RESET_ON_WAKE()
bool_t G_TWENET_B_MAC_ALWAYS_RESET_ON_WAKE()
// Macro definition
Setting this variable to 1
will re-initialize the MAC layer when waking up from sleep. This re-initialization adds extra processing time (approximately 400µs at 32MHz).
- Even with this option enabled, the pre-sleep process (saving the MAC layer state, about 100µs at 32MHz) will still be executed the same way as when the option is disabled.