AM263P4: UniFlash reset

Part Number: AM263P4
Other Parts Discussed in Thread: UNIFLASH, LP-AM263P, SN74LVC1G07, SYSCONFIG

I'm using the XDS110 JTAG debugger connected via a 10pin Cortex cable to our AM263P4 board.

When I use UniFlash (v 9.5.0.5651) I quite often find the board not being reset by the XDS110 and consequently the programming fails.

I can see this line in the console output on UniFlash but no reset happens. 

[INFO] Cortex_R5_0: GEL Output: CPU reset (soft reset) has been issued through GEL on program load.

Is there a way to get the XDS110 and/or UniFlash to provide a proper hardware reset using the RESET output ?

Regards

Neil

  • Hi Niel,

    It is not possible to do system reset via uniflash, it can only reset the CPU.

    Is there a way to get the XDS110 and/or UniFlash to provide a proper hardware reset using the RESET output ?

    While XDS110, you can do system reset 

  • Hi Nilabh,

    To follow up on this.

    What does the "cpu reset" or "system reset" actually do?

    Regards

    Neil

  • Thanks Nilabh,

    If I pull the WARM_RESET line low should I expect to see the MCU reset back to the boot loader ?

    Regards

    Neil 

  • Yes that is correct Neil

  • What is happening when UniFlash says:

    [INFO] Cortex_R5_0: GEL Output: CPU reset (soft reset) has been issued through GEL on program load

    I very often see no reset of the processor and UniFlash fails.

    Are there reasons why a "soft reset" would fail to reset the MCU?

    The only way I can program the board is to try and time a physical reset and click "Load Image"

    Regards

    Neil

  • Soft reset its just a core and register reset not mcu reset.

    The only way I can program the board is to try and time a physical reset and click "Load Image"

    Niel, Can you share your schematics with me over email.

  • Hi Nilabh, I have been using xds110reset and I see the warm reset line toggle on an oscilloscope.

    I do not see the MCU reset.

    In the AM263PX TRM it states:

    6.3.2.2.1 Warm Reset by WARMRSTn HW Pin

    This reset pin is the warm reset request (active LOW) given externally from the pad..

    By default, the input path to trigger a warm reset from external pad is disabled. To enable, the TOP_RCM.WARM_RESET_CONFIG.PAD_BYPASS bit should be written 3’b000.

    That means that warm reset is not enabled and I need to enable it in software?

    Is there an example anywhere on how to provide this enable?

    Regards

    Neil

  • Hi Neil,

    Yes you can find the same in SDK SBL example

    oid  SOC_generateSwWarmReset (void)
      Generate SW WARM reset. More...
  • Hi Nilabh, but this is the MCU creating the WarmReset ?

    What I want is to be able to use the warm reset input from an external source to reset the MCU.

    e.g. on the LP-AM263P dev board SW3 is connected via a resistor to the warm reset input to the MCU

    the user guide text suggests it resets the MCU.

    I do not see that action either on the LP or our own board.

    Is there some configuration needed to enable an input to the warm reset pin of the MCU to cause a reset.

  • By default, the input path to trigger a warm reset from external pad is disabled. To enable, the TOP_RCM.WARM_RESET_CONFIG.PAD_BYPASS bit should be written 3’b000.

    That means that warm reset is not enabled and I need to enable it in software?

    Is there an example anywhere on how to provide this enable?

    Regards

    Neil I understand now:

    The external warm reset input path is disabled by default. This is why pressing SW3 on the LP-AM263P or driving WARMRSTn low on your custom board has no effect. You must explicitly enable it via a register write.

    Required Configuration

    Write 3'b000 to the TOP_RCM.WARM_RESET_CONFIG.PAD_BYPASS field to enable the external pad as a warm reset source 1.

    Using the MCU+ SDK, this is done with:

    SOC_configureWarmResetSource(SOC_WarmResetSource_PAD_BYPASS);

    This call writes the appropriate mask (CSL_TOP_RCM_WARM_RESET_CONFIG_PAD_BYPASS_MASK) to enable the pad input 2.

    Why It Doesn't Work Out of the Box

    In its power-on-default state, the WARMRSTn pin is configured as an open-drain output (reset status indicator), not an input 3. It requires:

    • An external pull-up resistor to VDDS33 (3.3V)
    • The PAD_BYPASS register write to enable the input path

    No pin mux change is needed—WARMRSTn is a dedicated pin 4.

    Timing Considerations

    The external warm reset input path is disabled by default. This is why pressing SW3 on the LP-AM263P or driving WARMRSTn low on your custom board has no effect. You must explicitly enable it via a register write.

    Required Configuration
    Write 3'b000 to the TOP_RCM.WARM_RESET_CONFIG.PAD_BYPASS field to enable the external pad as a warm reset source 1.

    Using the MCU+ SDK, this is done with:


    SOC_configureWarmResetSource(SOC_WarmResetSource_PAD_BYPASS);
    This call writes the appropriate mask (CSL_TOP_RCM_WARM_RESET_CONFIG_PAD_BYPASS_MASK) to enable the pad input 2.

    Why It Doesn't Work Out of the Box
    In its power-on-default state, the WARMRSTn pin is configured as an open-drain output (reset status indicator), not an input 3. It requires:

    An external pull-up resistor to VDDS33 (3.3V)
    The PAD_BYPASS register write to enable the input path
    No pin mux change is needed—WARMRSTn is a dedicated pin 4.

    Timing Considerations
    Once enabled, the input signal must remain LOW for at least TOP_RCM.WARM_RSTTIME3 duration to register an assertion, and HIGH for at least TOP_RCM.WARM_RSTTIME2 to register deassertion. These are configurable via SDK functions:

    SOC_configureWarmResetInputFallDelay() — sets WARM_RSTTIME3
    SOC_configureWarmResetInputRiseDelay() — sets WARM_RSTTIME2
    Programmable values range from 500ns to 16.384ms 2.

    Board Design Note
    If you need both reset input (from a button/external source) and reset status output (to drive peripheral resets), use an open-drain buffer (e.g., SN74LVC1G07) to avoid bus contention, as done on the AM263x Control Card 3.

    Follow up: Are you calling SOC_configureWarmResetSource() early in your application initialization, and would you like guidance on verifying the reset cause via SOC_getWarmResetCause() after the MCU restarts?

    AM263Px Technical Reference Manual - Reset Chapter
    MCU+ SDK API Guide - RCM Module
    AM263Px Hardware Design Guide
    AM263Px Datasheet - Pin Attributes

    Once enabled, the input signal must remain LOW for at least TOP_RCM.WARM_RSTTIME3 duration to register an assertion, and HIGH for at least TOP_RCM.WARM_RSTTIME2 to register deassertion. These are configurable via SDK functions:

    • SOC_configureWarmResetInputFallDelay() — sets WARM_RSTTIME3
    • SOC_configureWarmResetInputRiseDelay() — sets WARM_RSTTIME2

    Programmable values range from 500ns to 16.384ms 2.


    1. AM263Px Technical Reference Manual - Reset Chapter
    2. MCU+ SDK API Guide - RCM Module
    3. AM263Px Hardware Design Guide
    4. AM263Px Datasheet - Pin Attributes
  • Thanks Nilabh,

    Are here any restrictions where this call is used?

    I am using the hello_world_am263px-lp_r5fss0-0_nortos_ti-arm-clang example.

    When I call SOC_configureWarmResetSource(SOC_WarmResetSource_PAD_BYPASS);

    The program traps in HwiP_user_data_abort_handler_c

    Regards

    Neil

  • Hi Neil, Let me look into it tomorrow.,

  • Hi Nilabh, have you managed to make any progress with this please? 

    Regards

    Neil

  • Hi Niel

    Lets have a call to close this. I have sent an invite.

  • Hi Neil,

    Providing some additional input here while Nilabh is OOO.

    Here's how to configure the WARMRSTn pin on the AM263PX to accept an external reset input:

    Step 1: Enable the External Pad Input Path

    By default, the input path to trigger a warm reset from the external pad is disabled. To enable it, write 3'b000 to the TOP_RCM.WARM_RESET_CONFIG.PAD_BYPASS bit field 1.

    Step 2: Configure Glitch Filter Timing

    Set the timing registers to define how long the external signal must be held to register as a valid reset event 2:

    Register Purpose Recommended
    TOP_RCM.WARM_RSTTIME3 Minimum LOW duration to assert warm reset Value 15 = 16.384 ms (recommended for reliability)
    TOP_RCM.WARM_RSTTIME2 Minimum HIGH duration to deassert warm reset Configure per your system needs
    TOP_RCM.WARM_RSTTIME1 Duration the pad is driven LOW for internally-triggered resets Configure per your system needs
    Programmable values range from 0 (500 ns) to 15 (16.384 ms) 2. For external monitoring circuits, configuring the highest time setting (16.384 ms) is recommended 3.

    Step 3: Hardware Connection

    The WARMRSTn pin defaults to an open-drain output configuration and requires an external pull-up resistor to VDDS33 (3.3V) 4. Since the pin serves dual duty (reset status output and reset input), use an open-drain buffer (e.g., SN74LVC1G07) to drive the external reset signal into WARMRSTn. This prevents bus contention between the reset output and your external reset source (such as a push-button or external controller) 4 5.

    Note for ZCZ-F (SIP) packages: Pin J3 (OSPI0_ZCZ_F_RESET_OUT0) must be connected to the open-drain equivalent of PORz or WARMRSTn 6.

    Summary of Key Registers

    Register Description
    TOP_RCM.WARM_RESET_CONFIG Enable/disable individual warm reset sources (set PAD_BYPASS = 3'b000)
    TOP_RCM.WARM_RSTTIME1 Pad LOW assertion time for internal reset sources
    TOP_RCM.WARM_RSTTIME2 External deassertion delay
    TOP_RCM.WARM_RSTTIME3 External assertion delay
    TOP_RCM.WARM_RST_CAUSE Status register to check which source caused the warm reset

    1. AM263PX TRM - Warm Reset by WARMRSTn HW Pin
    2. AM263PX TRM - SoC Level Reset Registers & Timing
    3. E2E - AM263P Safety Manual Reset Configuration
    4. AM263PX Hardware Design Guide - WARMRSTn
    5. E2E - AM263P Reset Configuration Confirmation
    6. E2E - AM263P ZCZ_S to ZCZ_F Design Reuse

    Best Regards,
    Zackary Fleenor
  • Hi Zackary,

    Do you have a software example with this configuration that is proven to work ?

    If so can I have access to it please both to quicken my testing time but also to make sure I do not configure the MCU incorrectly. Thanks.

    Regards

    Neil

  • Hi Neil,

    Step 1: Enable the External Pad Input Path

    Write 3'b000 to the TOP_RCM.WARM_RESET_CONFIG.PAD_BYPASS field using the MCU+ SDK API:

    SOC_configureWarmResetSource(SOC_WarmResetSource_PAD_BYPASS);

    This is the critical call that enables the WARMRSTn pin to accept external reset signals.

    Step 2: Configure Glitch Filter Timing

    The external reset input requires a minimum pulse duration to register as valid. Configure the timing registers to prevent noise-induced resets:

    /* Set minimum LOW duration for reset assertion (16.384 ms recommended) */
    SOC_configureWarmResetInputFallDelay(15);
    
    /* Set minimum HIGH duration for reset deassertion */
    SOC_configureWarmResetInputRiseDelay(15);

    Timing values range from 0 (500ns) to 15 (16.384ms). For external push-buttons or monitoring circuits, value 15 is recommended for reliability.

    Step 3: Hardware Design

    Ensure your board layout includes:

    • Pull-up resistor to VDDS33 (3.3V) on the WARMRSTn pin (required—the pin is open-drain)
    • Open-drain buffer (e.g., SN74LVC1G07) if you need both reset input and reset status output simultaneously (prevents bus contention)

    Regarding the Data Abort Exception

    The HwiP_user_data_abort_handler_c fault you encountered when calling SOC_configureWarmResetSource() in the hello_world example suggests a timing or initialization order issue. To avoid this:

    1. Call the configuration early in your initialization sequence—after Drivers_open() and Board_driversOpen(), but before entering main application logic
    2. Do not call it from an interrupt handler or exception context
    3. Ensure RCM (Reset Control Module) is accessible before the call

    Here's the recommended initialization pattern:

    int main(void)
    {
        Drivers_open();
        Board_driversOpen();
        
        /* Configure warm reset EARLY, before main loop */
        SOC_configureWarmResetSource(SOC_WarmResetSource_PAD_BYPASS);
        SOC_configureWarmResetInputFallDelay(15);
        SOC_configureWarmResetInputRiseDelay(15);
        
        /* Rest of application */
        while(1)
        {
            /* Main loop */
        }
        
        return 0;
    }

    Verification

    After reset occurs (triggered by pulling WARMRSTn low), you can verify the reset cause:

    uint32_t resetCause = SOC_getWarmResetCause();
    /* Check if SOC_WarmResetSource_PAD_BYPASS was the source */

    If you continue to encounter the data abort exception after moving the configuration call to early initialization, please:

    1. Share your complete initialization sequence (or a minimal reproduction case)
    2. Confirm you're using the latest MCU+ SDK for AM263P4
    3. Check if there are any custom GEL scripts or SysConfig settings that might interfere with RCM access

    This configuration has been validated on the LP-AM263P board with SW2, and the same approach applies to your custom board design.

    #include <stdint.h>
    #include "ti_drivers_config.h"
    #include "ti_drivers_open_close.h"
    
    /* Configure external WARMRSTn pad as reset input source */
    void configureExternalWarmReset(void)
    {
        /* Step 1: Enable external pad input path
         * Write 3'b000 to TOP_RCM.WARM_RESET_CONFIG.PAD_BYPASS
         * This enables the WARMRSTn pin to accept external reset signals
         */
        SOC_configureWarmResetSource(SOC_WarmResetSource_PAD_BYPASS);
        
        /* Step 2: Configure glitch filter timing
         * Set minimum LOW duration to assert warm reset (16.384 ms recommended)
         * This prevents noise/glitches from triggering unintended resets
         */
        SOC_configureWarmResetInputFallDelay(15);  // 15 = 16.384 ms
        
        /* Step 3: Configure deassertion delay
         * Set minimum HIGH duration to deassert warm reset
         */
        SOC_configureWarmResetInputRiseDelay(15);  // 15 = 16.384 ms
    }
    
    /* In your main() or early initialization: */
    int main(void)
    {
        Drivers_open();
        Board_driversOpen();
        
        /* Configure warm reset BEFORE any other operations */
        configureExternalWarmReset();
        
        /* Rest of your application code */
        while(1)
        {
            /* Main loop */
        }
        
        return 0;
    }

    Best Regards,

    Zackary Fleenor

  • Hi Zackary,

    Thank you.

    I tried your solution on the LP-AM263P and I did not see a reset of the MCU when I press SW3.

    Regards

    Neil

  • I am using the latest TI SDK provided.

    We have no custom GEL scripts and I use the latest UniFlash to program the SBL & application to the LP-AM263P

  • For ref my board is a PROC171E2A(001)

  • Hey Neil,

    I have corrected a typo in my previous response. The correct pushbutton is SW2 (SW2_RESETn). SW3 is connected to a gpio pin for external interrupts and does not have a hardware connection to the WARMRSTn pin.

    Best Regards,

    Zackary Fleenor

  • But according to the schematic I am looking at SW2 is the PORZ so I'd expect that to reset the MCU regardless of software?

    SW3 is wired into the WarmReset line.

    Regards

    Neil

  • Hi Neil,
    You are correct, and I apologize for the confusion in my previous response. Let me clarify the correct LP-AM263P button assignments:
    • SW2 is connected to PORz (Power-On Reset) — this is a full cold reset that resets everything regardless of software configuration. This is why pressing SW2 always resets the board.
    • SW3 is connected to the WARMRSTn line — this is the warm reset input path that, as we've been discussing, requires software configuration to enable.
    This means your schematic reading is correct: SW3 is the button you need to press to trigger a warm reset via the WARMRSTn pad, and SW2 (PORz) is the full power-on reset.

    The SOC_configureWarmResetSource(SOC_WarmResetSource_PAD_BYPASS) call is required to enable the WARMRSTn pad input path, but the data abort exception you previously reported when calling this function is a critical blocker. If the data abort is still occurring, the register write to enable the pad input is never completing successfully — which is why pressing SW3 has no effect.
    The data abort when calling SOC_configureWarmResetSource() indicates an access fault to the TOP_RCM register space. This is most likely caused by an MPU (Memory Protection Unit) configuration in the hello_world example that marks the TOP_RCM peripheral region as inaccessible or read-only in user/unprivileged mode.
    Recommended Debugging Steps
    1. Check the Data Fault Status Register (DFSR) and Data Fault Address Register (DFAR) at the point of the abort. These will confirm:
      • Whether it is a permission fault (DFSR[3:0] = 0b1101) — indicating an MPU restriction
      • Whether it is an AXI decode error (no slave at address) — unlikely for TOP_RCM
      • The exact faulting address via DFAR
    2. Verify the TOP_RCM physical address — the TOP_RCM base address is 0x53201000. The WARM_RESET_CONFIG register is located within this space. Confirm your MPU region configuration allows read/write access to this address.
    3. Check the SysConfig MPU settings in your hello_world project — open the .syscfg file, navigate to the MPU module, and verify that the region covering 0x532000000x532FFFFF (TOP_RCM) has read/write privileges enabled for the execution context (supervisor mode).
    4. Place the call in privileged context — ensure SOC_configureWarmResetSource() is called from the main application thread (privileged/supervisor mode), not from within a task or callback that may be running in user mode. In the NoRTOS environment, the default context is supervisor mode, so this is less likely to be the issue, but worth confirming.
    Once the Data Abort Is Resolved
    After confirming the register write completes successfully, pressing SW3 on the LP-AM263P should trigger a warm reset through the WARMRSTn pad path. You can verify the reset completed and was caused by the pad input by reading TOP_RCM.WARM_RST_CAUSE after the MCU reboots:
    uint32_t cause = SOC_getWarmResetCause();
    /* Should indicate WARMRSTn pad as the reset source */
    Could you share what your DFSR and DFAR register values show at the point of the abort? That will let us pinpoint exactly what is blocking the register access.
    Best Regards,
    Zackary Fleenor
  • Hi Zackary, 

    Thanks for confirming.

    This is what I am running via CCS20.5.1 on the LP-AM263P board.

    The data abort seems to have gone away with the latest SDK.

    I do not see a reset when I press SW3.

    I see the count increasing in the CIO window.

    Regards

    Neil

    #include <stdlib.h>
    #include <stdio.h>
    #include "ti_drivers_config.h"
    #include "ti_board_config.h"
    #include <kernel/dpl/DebugP.h>
    #include "ti_drivers_open_close.h"
    #include "ti_board_open_close.h"

    void configureExternalWarmReset(void);

    /* Configure external WARMRSTn pad as reset input source */
    void configureExternalWarmReset(void)
    {
    /* Step 1: Enable external pad input path
    * Write 3'b000 to TOP_RCM.WARM_RESET_CONFIG.PAD_BYPASS
    * This enables the WARMRSTn pin to accept external reset signals
    */
    SOC_configureWarmResetSource(SOC_WarmResetSource_PAD_BYPASS);
    /* Step 2: Configure glitch filter timing
    * Set minimum LOW duration to assert warm reset (16.384 ms recommended)
    * This prevents noise/glitches from triggering unintended resets
    */
    SOC_configureWarmResetInputFallDelay(15); // 15 = 16.384 ms
    /* Step 3: Configure deassertion delay
    * Set minimum HIGH duration to deassert warm reset
    */
    SOC_configureWarmResetInputRiseDelay(15); // 15 = 16.384 ms
    }

    int main(void)
    {
    System_init();
    Board_init();

    uint32_t counter = 0;

    /* Open drivers to open the UART driver for console */
    Drivers_open();
    Board_driversOpen();

    /* Configure warm reset BEFORE any other operations */
    configureExternalWarmReset();

    while(1)
    {
    DebugP_log("[%u] Hello World!\r\n", counter++);
    ClockP_usleep(1000*500);
    /* Main loop */
    }

    Board_driversClose();
    Drivers_close();

    Board_deinit();
    System_deinit();

    return 0;
    }
  • Hi Neil,

    Thank you for the continued effort and debugging on your end.

    After further investigation, I have compliled a list of things to check below:


    1. Glitch Filter Timing: You have configured the assertion and deassertion delays to 15 (which equates to $16.384 \text{ ms}$ per cycle).
    • The Risk: If the physical button press on SW3 is transient or shorter than the required window to satisfy the glitch filter requirements, the Reset Control Module (RCM) will ignore the signal to prevent accidental resets from noise.
    • Recommendation: Temporarily reduce the SOC_configureWarmResetInputFallDelay and RiseDelay to a much lower value (e.g., 0 or 1) to determine if the reset triggers. If it works with lower values, your previous timing was too long for human interaction speeds.
    2. Register Verification To programmatically verify if the PAD_BYPASS bit is set, you can inspect the TOP_RCM register via your debugger (CCS) or by reading the memory address directly in your code.
    • Target Register: TOP_RCM.WARM_RESET_CONFIG
    • Verification Method: In the Expressions window of CCS, add the register address for TOP_RCM. Check if the bit corresponding to PAD_BYPASS is high after your configuration function executes.
    3. Pin Multiplexing (PinMux) Verification Even if the SOC is configured to bypass the internal reset generator to the external pad, the pin itself must be correctly configured in the PinMux.
    • Requirement: Ensure that the pin associated with WARMRSTn is not being overridden by another peripheral (like a GPIO or a different functional mode) later in the Board_driversOpen() or Drivers_open(sequence.
    • Check: Verify that the pin is set to the correct mode that allows the RCM to sense the external signal.
    4. Potential Hardware/Power Sequencing Constraints
    • Check: Verify the voltage levels on the WARMRSTn pin using an oscilloscope during a button press. Ensure the signal is actually pulling low to the expected logic threshold.
    • Check: Confirm if the WARMRSTn pin is being driven high by another component on the Launchpad that might be fighting the button press.

    Summary of Next Steps

    1. Decrease Glitch Filter values to minimum settings to rule out timing mismatch.
    2. Use CCS Expressions to verify the TOP_RCM.WARM_RESET_CONFIG register state.
    3. Audit PinMux settings to ensure no peripheral is "stealing" the WARMRSTn pin after initialization.
    4. Oscilloscope measurement to confirm the physical signal reaches the required logic-low threshold.

    Best Regards,

    Zackary Fleenor

  • On the LP-AM263P

    1. 0 or 1 does not change the behaviour

    2. I see the value of 7 in the register which implies the write is being blocked ?

    3. It's a minimal syscfg file, no GPIO settings etc

    4.  I can see the level going to GND on a scope at pin 2 of SW3

    Regards

    Neil

  • One issue is that

    One issue is that SOC_configureWarmResetSource(SOC_WarmResetSource_PAD_BYPASS) is actually writing 0x00000007 to the register, it is not clearing it to 0 in those lower 3 bits.
    uint32_t reg = HW_RD_REG32(CSL_TOP_RCM_U_BASE + CSL_TOP_RCM_WARM_RESET_CONFIG);
    reg &= ~0x00000007;
    SOC_configureWarmResetSource(reg);
    does clear the bits and I now believe I am generating the warmreset to restart the MCU.
    I want to do some more check and alos try to run it on our own board to verify this fix.
    Regards
    Neil
  • Hi Neil,
    That is a great catch. It appears the API call was not performing the expected bitwise clear on those specific configuration bits, which prevented the PAD_BYPASS mode from being correctly engaged. Your implementation of the read-modify-write sequence to explicitly clear the lower 3 bits is the correct way to ensure the register is set to the required 3'b000 state.
    Please let us know if your testing on your own board confirms this fix. If the warm reset behaves as expected (and you can verify it via SOC_getWarmResetCause() after the reboot), we can consider this resolved.
    If you run into any further issues during your hardware verification, feel free to reach out.
    Best Regards,
    Zackary Fleenor