This is the multi-page printable view of this section. Click here to print...

Return to the regular view of this page

As of 2025-10-03

Startup Functions main(), WarmMain()

Startup functions main(), WarmMain()
    This document describes the firmware startup functions.

    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.

    ParameterDescription
    flagStartup specification. Please use 0 for normal use.
    u32SysHzSpecifies 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.

    ParameterDescription
    flagStartup 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 in JN5189.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 the IRQ_Type interrupt is enabled, this function will be called. If the return value is FALSE, NVIC_ClearPendingIRQ(IRQ_Type) is executed. If it’s TRUE, 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() in cbAppColdStart(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 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 (see AppQAPI_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.

    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.