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.

TMS320F28388D: SysConfig with and without a "Software Product"

Part Number: TMS320F28388D
Other Parts Discussed in Thread: SYSCONFIG, C2000WARE

Hello, I have a new .syscfg file that was converted from a PinMux file. The PinMuxing functionality what utilized in the planning of pin IO for a new PCB, which was of great help. I'm now moving onto configuring the software project for this new board and I'm trying to use SysConfig to help with the setup of the GPIO pinmuxing and I've realized that when creating a new SysConfig fie from scratch there's a "Software Product" drop down. This drop-down was initially empty but from this post, it appears that I can add the C2000Ware directory (C:\ti\c2000\C2000Ware_3_02_00_00) and it then shows a Software Product named C2000 SysConfig

Specifying a Software Product then shows me a different SysConfig interface. These differences are noted below.

This is SysConfig with a Software Product specified

This is SysConfig without a Software Product specified:

My questions are:

  1. Is there a user guide that explains the differences between these 2 use cases (with and without a softwrare package, specifically targeted to the C2000/f28388D? If there is, then maybe the following questions can be ignored:
  2. why does one generate board.h/.c, the other f2838x_pinmux.h/.c and pinmux.h/.c?
  3. Can I migrate a .sysconfig between the two uses cases? Specifically, can I use the .syscfg file that I used for PinMux and _add_ the Software Product after the fact?
  4. what am I missing if I choose to only use f2838x_pinmux/pinmux instead of board.h/board.c?

Thank you

  • Without a SW product is legacy and is not recommended.

    DEFINITELY use the SW product. It has much more capability.

    The board.c and board.h file not only initialize the pinmux but they can also initialize the peripheral modes.

    Yes you should be able to load in the old syscfg pinmux legacy file into the format.

    Also C2000 SysConfig version 3.0 is available in the latest C2000Ware 3.04. Use the latest version.

  • Hi Nima, thank you for the reply.

    I wasn't able to add a SW product to the original .syscfg file, I also tried manually editing the .syscfg file with a text editor but received a few errors and gave up. In the end I replicated the pinmux configuration manually(!).. it was quite tideous as I had to grab screenshots of the pinmux config and reproduce them in the new one that has a SW product.

    I'm on SysConfig 1.8.0+1863, and I'm using C2000Ware 3.0.2.  How do I change to 3.0.4 without having to recreate the pinmux config from scratch?

  • You can easily PORT it. Just open the file with SysCfg. Everything will happen automatically.  

  • yes, I am able to open it just fine. The problem was that I was unable to set a SW product after opening it. Is that supported?

  • Can you let us know how to load in a syscfg pinmux legacy file and add it to a SW product one in the standalone GUI?

  • Can you help with how to change the SW product in the standalone tool?

  • You can pass the product and script on the command line to the UI. The command line will override what settings were last used with the script, and when you save the script will have the updated settings. Assuming you installed SysConfig to the default location, run the following:

    C:\ti\sysconfig_1.8.0\nw\nw.exe C:\ti\sysconfig_1.8.0 --product <path to .metadata/product.json in C2000Ware> --script <path to your .syscfg file>

  • hi , thank you for the feedback. 

    here's the error that I get when I try that command:

    Here's also a copy of the.syscfg file: 

    /**
     * These arguments were used when this file was generated. They will be automatically applied on subsequent loads
     * via the GUI or CLI. Run CLI with '--help' for additional information on how to override these arguments.
     * @cliArgs --device "F2838x" --package "337bga" --part "F2838x_337bga"
     * @versions {"data":"2021010520","timestamp":"2021010520","tool":"1.7.0+1746","templates":"2021010520"}
     */
    
    /**
     * These are the peripherals and settings in this configuration
     */
    const iCAN1                         = scripting.addPeripheral("CAN");
    iCAN1.$name                         = "MyCANInterface";
    iCAN1["CAN@_RX"].$assign            = "GPIO17";
    iCAN1["CAN@_TX"].$assign            = "GPIO12";
    const iCM_I2C1                      = scripting.addPeripheral("CM-I2C");
    iCM_I2C1.$name                      = "MyCM-I2C1";
    iCM_I2C1["CM-I2C@_SDA"].$assign     = "GPIO31";
    iCM_I2C1["CM-I2C@_SCL"].$assign     = "GPIO105";
    const iECAT1                        = scripting.addPeripheral("ECAT");
    iECAT1.$name                        = "ECAT";
    iECAT1.ESC_LED_LINK0_ACTIVE.$assign = "GPIO143";
    iECAT1.ESC_LED_LINK1_ACTIVE.$assign = "GPIO144";
    iECAT1.ESC_LED_RUN.$assign          = "GPIO146";
    iECAT1.ESC_LED_ERR.$assign          = "GPIO145";
    iECAT1.ESC_LED_STATE_RUN.$used      = false;
    iECAT1.ESC_I2C_SDA.$assign          = "GPIO150";
    iECAT1.ESC_I2C_SCL.$assign          = "GPIO151";
    iECAT1.ESC_TX1_DATA3.$assign        = "GPIO135";
    iECAT1.ESC_TX1_DATA2.$assign        = "GPIO134";
    iECAT1.ESC_TX1_DATA1.$assign        = "GPIO132";
    iECAT1.ESC_TX1_DATA0.$assign        = "GPIO131";
    iECAT1.ESC_SYNC0.$assign            = "GPIO127";
    iECAT1.ESC_SYNC1.$used              = false;
    iECAT1.ESC_MDIO_CLK.$assign         = "GPIO26";
    iECAT1.ESC_MDIO_DATA.$assign        = "GPIO27";
    iECAT1.ESC_PHY_CLK.$used            = false;
    iECAT1.ESC_TX1_ENA.$assign          = "GPIO129";
    iECAT1.ESC_RX1_CLK.$assign          = "GPIO137";
    iECAT1.ESC_RX1_DV.$assign           = "GPIO136";
    iECAT1.ESC_RX1_ERR.$assign          = "GPIO138";
    iECAT1.ESC_RX1_DATA0.$assign        = "GPIO139";
    iECAT1.ESC_RX1_DATA1.$assign        = "GPIO140";
    iECAT1.ESC_RX1_DATA2.$assign        = "GPIO141";
    iECAT1.ESC_RX1_DATA3.$assign        = "GPIO142";
    iECAT1.ESC_PHY_RESETn.$used         = false;
    iECAT1.ESC_RX0_CLK.$assign          = "GPIO163";
    iECAT1.ESC_RX0_DV.$assign           = "GPIO162";
    iECAT1.ESC_RX0_ERR.$assign          = "GPIO164";
    iECAT1.ESC_RX0_DATA0.$assign        = "GPIO165";
    iECAT1.ESC_RX0_DATA1.$assign        = "GPIO166";
    iECAT1.ESC_RX0_DATA2.$assign        = "GPIO167";
    iECAT1.ESC_RX0_DATA3.$assign        = "GPIO168";
    iECAT1.ESC_TX0_CLK.$assign          = "GPIO157";
    iECAT1.ESC_TX0_DATA0.$assign        = "GPIO158";
    iECAT1.ESC_TX0_DATA1.$assign        = "GPIO88";
    iECAT1.ESC_TX0_DATA2.$assign        = "GPIO89";
    iECAT1.ESC_TX0_DATA3.$assign        = "GPIO90";
    iECAT1.ESC_TX0_ENA.$assign          = "GPIO84";
    iECAT1.ESC_TX1_CLK.$assign          = "GPIO130";
    iECAT1.ESC_LATCH0.$assign           = "GPIO29";
    iECAT1.ESC_LATCH1.$used             = false;
    iECAT1.ESC_PHY0_LINKSTATUS.$assign  = "GPIO86";
    iECAT1.ESC_PHY1_LINKSTATUS.$assign  = "GPIO149";
    const iEPWM1                        = scripting.addPeripheral("EPWM");
    iEPWM1.$name                        = "PWM1";
    iEPWM1["EPWM#A"].$assign            = "GPIO28";
    iEPWM1["EPWM#B"].$used              = false;
    const iEPWM2                        = scripting.addPeripheral("EPWM");
    iEPWM2.$name                        = "PWM2";
    iEPWM2["EPWM#A"].$assign            = "GPIO147";
    iEPWM2["EPWM#B"].$assign            = "GPIO148";
    const iEPWM3                        = scripting.addPeripheral("EPWM");
    iEPWM3.$name                        = "PWM3";
    iEPWM3["EPWM#A"].$assign            = "GPIO24";
    iEPWM3["EPWM#B"].$used              = false;
    const iEPWM4                        = scripting.addPeripheral("EPWM");
    iEPWM4.$name                        = "MotorU";
    iEPWM4["EPWM#A"].$assign            = "GPIO22";
    iEPWM4["EPWM#B"].$assign            = "GPIO23";
    const iEPWM5                        = scripting.addPeripheral("EPWM");
    iEPWM5.$name                        = "MotorV";
    iEPWM5["EPWM#A"].$assign            = "GPIO20";
    iEPWM5["EPWM#B"].$assign            = "GPIO21";
    const iEPWM6                        = scripting.addPeripheral("EPWM");
    iEPWM6.$name                        = "MotorW";
    iEPWM6["EPWM#A"].$assign            = "GPIO18";
    iEPWM6["EPWM#B"].$assign            = "GPIO19";
    const iEQEP1                        = scripting.addPeripheral("EQEP");
    iEQEP1.$name                        = "QuadEncoder1";
    iEQEP1["EQEP#_A"].$assign           = "GPIO54";
    iEQEP1["EQEP#_B"].$assign           = "GPIO55";
    iEQEP1["EQEP#_STROBE"].$used        = false;
    iEQEP1["EQEP#_INDEX"].$assign       = "GPIO57";
    const iEQEP2                        = scripting.addPeripheral("EQEP");
    iEQEP2.$name                        = "QuadEncoder2";
    iEQEP2["EQEP#_A"].$assign           = "GPIO62";
    iEQEP2["EQEP#_B"].$assign           = "GPIO63";
    iEQEP2["EQEP#_STROBE"].$assign      = "GPIO64";
    iEQEP2["EQEP#_STROBE"].$used        = false;
    iEQEP2["EQEP#_INDEX"].$assign       = "GPIO65";
    const iGPIO1                        = scripting.addPeripheral("GPIO");
    iGPIO1.$numPins                     = 35;
    iGPIO1["0"].$assign                 = "GPIO106";
    iGPIO1["1"].$assign                 = "GPIO107";
    iGPIO1["2"].$assign                 = "GPIO108";
    iGPIO1["3"].$assign                 = "GPIO109";
    iGPIO1["4"].$assign                 = "GPIO11";
    iGPIO1["5"].$assign                 = "GPIO110";
    iGPIO1["6"].$assign                 = "GPIO111";
    iGPIO1["7"].$assign                 = "GPIO112";
    iGPIO1["8"].$assign                 = "GPIO113";
    iGPIO1["9"].$assign                 = "GPIO114";
    iGPIO1["10"].$assign                = "GPIO115";
    iGPIO1["11"].$assign                = "GPIO116";
    iGPIO1["12"].$assign                = "GPIO117";
    iGPIO1["13"].$assign                = "GPIO118";
    iGPIO1["14"].$assign                = "GPIO119";
    iGPIO1["15"].$assign                = "GPIO120";
    iGPIO1["16"].$assign                = "GPIO121";
    iGPIO1["17"].$assign                = "GPIO126";
    iGPIO1["18"].$assign                = "GPIO128";
    iGPIO1["19"].$assign                = "GPIO133";
    iGPIO1["20"].$assign                = "GPIO14";
    iGPIO1["21"].$assign                = "GPIO15";
    iGPIO1["22"].$assign                = "GPIO152";
    iGPIO1["23"].$assign                = "GPIO153";
    iGPIO1["24"].$assign                = "GPIO154";
    iGPIO1["25"].$assign                = "GPIO155";
    iGPIO1["26"].$assign                = "GPIO156";
    iGPIO1["27"].$assign                = "GPIO159";
    iGPIO1["28"].$assign                = "GPIO16";
    iGPIO1["29"].$assign                = "GPIO160";
    iGPIO1["30"].$assign                = "GPIO161";
    iGPIO1["31"].$assign                = "GPIO2";
    iGPIO1["32"].$assign                = "GPIO25";
    iGPIO1["33"].$assign                = "GPIO3";
    iGPIO1["34"].$assign                = "GPIO49";
    iGPIO1.$name                        = "GPIO";
    const iI2C1                         = scripting.addPeripheral("I2C");
    iI2C1.$name                         = "I2C1";
    iI2C1["I2C@_SDA"].$assign           = "GPIO56";
    iI2C1["I2C@_SCL"].$assign           = "GPIO43";
    const iI2C2                         = scripting.addPeripheral("I2C");
    iI2C2.$name                         = "I2C2";
    iI2C2["I2C@_SDA"].$assign           = "GPIO66";
    iI2C2["I2C@_SCL"].$assign           = "GPIO69";
    const iINPUTXBAR1                   = scripting.addPeripheral("INPUTXBAR");
    iINPUTXBAR1.$name                   = "MyINPUTXBAR2";
    iINPUTXBAR1.INPUTXBAR1.$used        = true;
    iINPUTXBAR1.INPUTXBAR2.$used        = true;
    iINPUTXBAR1.INPUTXBAR3.$used        = true;
    const iSD1                          = scripting.addPeripheral("SD");
    iSD1.$name                          = "SigmaDelta";
    iSD1["SD#_C1"].$assign              = "GPIO123";
    iSD1["SD#_D1"].$assign              = "GPIO122";
    iSD1["SD#_C2"].$assign              = "GPIO125";
    iSD1["SD#_D2"].$assign              = "GPIO124";
    iSD1["SD#_C3"].$used                = false;
    iSD1["SD#_D3"].$used                = false;
    iSD1["SD#_C4"].$used                = false;
    iSD1["SD#_D4"].$used                = false;
    const iSPI1                         = scripting.addPeripheral("SPI");
    iSPI1.$useCase                      = "STANDARD";
    iSPI1.$name                         = "SPI1";
    iSPI1["SPI@_SIMO"].$assign          = "GPIO91";
    iSPI1["SPI@_SOMI"].$assign          = "GPIO92";
    iSPI1["SPI@_CLK"].$assign           = "GPIO93";
    iSPI1["SPI@_STEn"].$assign          = "GPIO94";
    const iSPI2                         = scripting.addPeripheral("SPI");
    iSPI2.$useCase                      = "STANDARD";
    iSPI2.$name                         = "SPI2";
    iSPI2["SPI@_SIMO"].$assign          = "GPIO32";
    iSPI2["SPI@_SOMI"].$assign          = "GPIO33";
    iSPI2["SPI@_CLK"].$assign           = "GPIO34";
    iSPI2["SPI@_STEn"].$assign          = "GPIO35";
    const iSPI3                         = scripting.addPeripheral("SPI");
    iSPI3.$useCase                      = "STANDARD";
    iSPI3.$name                         = "SPI3";
    iSPI3["SPI@_SIMO"].$assign          = "GPIO60";
    iSPI3["SPI@_SOMI"].$assign          = "GPIO61";
    iSPI3["SPI@_CLK"].$assign           = "GPIO58";
    iSPI3["SPI@_STEn"].$assign          = "GPIO59";
    const iSPI4                         = scripting.addPeripheral("SPI");
    iSPI4.$useCase                      = "STANDARD";
    iSPI4.$name                         = "SPI4";
    iSPI4["SPI@_SIMO"].$assign          = "GPIO50";
    iSPI4["SPI@_SOMI"].$assign          = "GPIO51";
    iSPI4["SPI@_CLK"].$assign           = "GPIO52";
    iSPI4["SPI@_STEn"].$assign          = "GPIO53";
    const iUART1                        = scripting.addPeripheral("UART");
    iUART1.$name                        = "USBUART";
    iUART1["UART@_TX"].$assign          = "GPIO42";
    iUART1["UART@_RX"].$assign          = "GPIO85";
    
    /**
     * Pinmux solution for unlocked pins/peripherals. This ensures that minor changes to the automatic solver in a future
     * version of the tool will not impact the pinmux you originally saw.  These lines can be completely deleted in order to
     * re-solve from scratch.
     */
    iCAN1.$suggestSolution                  = "CANB";
    iCM_I2C1.$suggestSolution               = "CM-I2CA";
    iECAT1.$suggestSolution                 = "ECAT";
    iEPWM1.$suggestSolution                 = "EPWM15";
    iEPWM2.$suggestSolution                 = "EPWM2";
    iEPWM3.$suggestSolution                 = "EPWM13";
    iEPWM4.$suggestSolution                 = "EPWM12";
    iEPWM5.$suggestSolution                 = "EPWM11";
    iEPWM6.$suggestSolution                 = "EPWM10";
    iEQEP1.$suggestSolution                 = "EQEP2";
    iEQEP2.$suggestSolution                 = "EQEP3";
    iI2C1.$suggestSolution                  = "I2CA";
    iI2C2.$suggestSolution                  = "I2CB";
    iINPUTXBAR1.$suggestSolution            = "INPUTXBAR";
    iINPUTXBAR1.INPUTXBAR1.$suggestSolution = "GPIO10";
    iINPUTXBAR1.INPUTXBAR2.$suggestSolution = "GPIO1";
    iINPUTXBAR1.INPUTXBAR3.$suggestSolution = "GPIO0";
    iSD1.$suggestSolution                   = "SD1";
    iSPI1.$suggestSolution                  = "SPID";
    iSPI2.$suggestSolution                  = "SPIA";
    iSPI3.$suggestSolution                  = "SPIB";
    iSPI4.$suggestSolution                  = "SPIC";
    iUART1.$suggestSolution                 = "UARTA";
    

    As a side note, it's curious that the "About" menu of sysconfig says it's version 1.8.0 but the directory in the C:\ drive is named "1.7.0".  Probably doesnt have anything to do with this error though.

  • I think you add it to the script and try it.

  • My comments were for migrating a syscfg script from an earlier version of C2000Ware to a newer version.  Looking at your script, it's using the legacy non-product (pinmux only) approach.  There's unfortunately no support for migrating from that to a product - you would have to re-create the script.  That being said, you can open two versions of SysConfig at a time by using the web version (https://dev.ti.com/sysconfig)

    For future reference, the error stack in the exception does list the line number in your script that is causing an issue.  The second frame of the stack is "LogicBoard.syscfg" line 163.  So you can use that information to edit the script to fix any minor broken statements should they come up.  However, in this case I think you need to re-create the script using a product as opposed to the legacy non-product approach.

  • Thank you again for the clarification. Yes, from my original question below I was wondering about adding a software product to a syscfg file that was migrated from PinMux. Sounds like ultimately the answer is no - it has to be recreated. 

    Specifically, can I use the .syscfg file that I used for PinMux and _add_ the Software Product after the fact?