This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

EK-TM4C129EXL: Tiva MCU not flashable, possibly corrupted

Part Number: EK-TM4C129EXL
Other Parts Discussed in Thread: UNIFLASH,

Tool/software:

I have been using uniflash to program the EK-TM4C129EXL dev board with some example programs, which has worked fine for a few days. However, Uniflash has suddenly stopped working today, and is only giving me an error: "CORTEX_M4_0: Error connecting to the target". Similarly, I cannot use the Debug feature in CCS to run my code in debug mode.

I have tried using uniflash to program a second identical dev board, which works fine. I suspect I may have corrupted something on the board, since the last thing I was testing is trying to set ALTCLK to RTCOSC. Is it possible to make the EK-TM4C129EXL dev board un-flashable by misconfiguring the MCU? Any suggestions to recover from this situation?

Here's the code I flashed right before the MCU stopped responding. It's based off the timers.c example in the Tivaware SDK but I have modified it since I was trying to use General Purpose Timers to drive a PWM output pin, and I was trying to use RTCOSC as the timer's clock.

//*****************************************************************************
//
// timers.c - Timers example.
//
// Copyright (c) 2013-2020 Texas Instruments Incorporated.  All rights reserved.
// Software License Agreement
// 
// Texas Instruments (TI) is supplying this software for use solely and
// exclusively on TI's microcontroller products. The software is owned by
// TI and/or its suppliers, and is protected under applicable copyright
// laws. You may not combine this software with "viral" open-source
// software in order to form a larger program.
// 
// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
// DAMAGES, FOR ANY REASON WHATSOEVER.
// 
// This is part of revision 2.2.0.295 of the EK-TM4C1294XL Firmware Package.
//
//*****************************************************************************

#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/rom_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/timer.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"

//*****************************************************************************
//
//! \addtogroup example_list
//! <h1>Timer (timers)</h1>
//!
//! This example application demonstrates the use of the timers to generate
//! periodic interrupts.  One timer is set up to interrupt once per second and
//! the other to interrupt twice per second; each interrupt handler will toggle
//! its own indicator throught the UART.
//!
//! UART0, connected to the Virtual Serial Port and running at 115,200, 8-N-1,
//! is used to display messages from this application.
//
//*****************************************************************************

//****************************************************************************
//
// System clock rate in Hz.
//
//****************************************************************************
uint32_t g_ui32SysClock;

//*****************************************************************************
//
// Flags that contain the current value of the interrupt indicator as displayed
// on the UART.
//
//*****************************************************************************
uint32_t g_ui32Flags;

//*****************************************************************************
//
// The error routine that is called if the driver library encounters an error.
//
//*****************************************************************************
#ifdef DEBUG
void
__error__(char *pcFilename, uint32_t ui32Line)
{
}
#endif

//*****************************************************************************
//
// Configure the UART and its pins.  This must be called before UARTprintf().
//
//*****************************************************************************
void
ConfigureUART(void)
{
    //
    // Enable the GPIO Peripheral used by the UART.
    //
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

    //
    // Enable UART0.
    //
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);

    //
    // Configure GPIO Pins for UART mode.
    //
    MAP_GPIOPinConfigure(GPIO_PA0_U0RX);
    MAP_GPIOPinConfigure(GPIO_PA1_U0TX);
    MAP_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);

    //
    // Initialize the UART for console I/O.
    //
    UARTStdioConfig(0, 115200, g_ui32SysClock);
}

//*****************************************************************************
//
// This example application demonstrates the use of the timers to generate
// periodic interrupts.
//
//*****************************************************************************
int
main(void)
{
    //
    // Run from the PLL at 120 MHz.
    // Note: SYSCTL_CFG_VCO_240 is a new setting provided in TivaWare 2.2.x and
    // later to better reflect the actual VCO speed due to SYSCTL#22.
    //
    g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
                                             SYSCTL_OSC_MAIN |
                                             SYSCTL_USE_PLL |
                                             SYSCTL_CFG_VCO_240), 120000000);

    //
    // Initialize the UART and write status.
    //
    ConfigureUART();

    UARTprintf("\033[2JTimers example\n");
    UARTprintf("T1: 0  T2: 0");

    //
    // Enable the GPIO port that is used for the on-board LEDs.
    //
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION);
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    MAP_GPIOPinTypeGPIOOutput(GPIO_PORTN_BASE, GPIO_PIN_0 | GPIO_PIN_1);
    GPIOPinConfigure(GPIO_PD0_T0CCP0);
    GPIOPinTypeTimer(GPIO_PORTD_BASE, GPIO_PIN_0);



    //
    // Enable the peripherals used by this example.
    //
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);     // this one will be used as a PWM


    SysCtlAltClkConfig(SYSCTL_ALTCLK_RTCOSC);
    TimerClockSourceSet(TIMER0_BASE, SYSCTL_ALTCLK_RTCOSC);

    //
    // Configure the two 32-bit periodic timers.
    //
    MAP_TimerConfigure(TIMER0_BASE, (TIMER_CFG_SPLIT_PAIR |TIMER_CFG_A_PWM ));
    MAP_TimerLoadSet(TIMER0_BASE, TIMER_A, 65535);
    MAP_TimerMatchSet(TIMER0_BASE, TIMER_A, 65535/2);

    MAP_TimerPrescaleSet(TIMER0_BASE, TIMER_A, 0);
    MAP_TimerPrescaleMatchSet(TIMER0_BASE, TIMER_A, 0);

    //
    // Enable the timers.
    //
    MAP_TimerEnable(TIMER0_BASE, TIMER_A);



    //
    // Loop forever while the timer runs.
    //
    while(1)
    {
    }
}

  • Hi Eric,

    I suspect I may have corrupted something on the board, since the last thing I was testing is trying to set ALTCLK to RTCOSC. Is it possible to make the EK-TM4C129EXL dev board un-flashable by misconfiguring the MCU? Any suggestions to recover from this situation?

    I just tried your code and indeed it hangs on me that I cannot connect to it with the debugger. However, I can recover the board by using unlock operation. See below LM flash programmer Unlock button. Follow the instructions when you click the Unlock button to recover the board to its factory setting. 

    I suspect some issue related to the below errata. 

      

  • Thanks, I will look into the errata you mentioned.

    Using the "Unlock" operation on LM Flash Programmer resolved my issue.

    Note: I was unable to resolve the issue using the "unlock" operation on Uniflash version  8.7.0.4818. (I got an error "Module closed").