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.

MSPM0G3507: Configuration changes PG1.0 -> PG2.0

Part Number: MSPM0G3507
Other Parts Discussed in Thread: UNIFLASH, SYSCONFIG,

Dear Team,

What are the differences in terms of SDK, sysconfig, uniflash and all other major SW topics between PG1.0 and PG2.0 of MSPM0G3507-Q1?

What must the customer keep in mind in production to support both revisions on the same board?

Thanks,

Daniel

  • Hello,

    Is there something changed regarding xtal?

    I have the same xtal on early samples (A) and new one (B) but when I configure ccs 12.3 on xtal, the pin doesn't oscillate and sw stays stuck in pll synch step

    Thanks

    BR

    T.

  • Hi Daniel,

    Please refer to the Early Samples Migration Guide in the SDK documents for more information about SW differences.

    Online Location: Arm®-based microcontrollers/Embedded Software/MSPM0 SDK (1.00.01.03)/Documents/Early Samples Migration Guide

    Local Location: C:\ti\mspm0_sdk_1_00_00_04\docs\english\early_samples_migration_guide

    Best Regards,

    Diego Abad

  • Hello Diego,

    Thank you for your feedback. And concerning Thomas's question, do you see any changes from PG1.0 to PG2.0.

    Thank you

  • We see multiple issue: xtal not starting, from a post of Luke we see that there is a bug in clock tree, the microcontroler does not start by itself after flash, uniflash does not work (you told us but for production it's an issue), please help us

    BR

    T

  • Hi Thomas,

    What frequency are you setting MCLK and XTAL to? Can you confirm that the ULPCLK is not greater than 40MHz.

    Regards,

    Luke

  • Hello Luke,

    xtal is 20M, it goes to the PLL at 160M, then directed to CAN at 20M and to UPCLK at 40M

    Thanks

    BR

    T.

  • Hello thomas,

    Can you share the SYSCONFIG file you're using in your project?

    Best Regards,

    Diego Abad

  • Hello Diego,

    it's 1.16.1.2960

    BR

    T.

  • I read badly, let me reconfigure with clock configured from tree and post it here

  • Here it is:

    /**
     * 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 "MSPM0G350X" --package "VQFN-32(RHB)" --part "Default" --product "mspm0_sdk@1.00.01.03"
     * @versions {"tool":"1.16.1+2960"}
     */
    
    /**
     * Import the modules used in this configuration.
     */
    const ADC12  = scripting.addModule("/ti/driverlib/ADC12", {}, false);
    const ADC121 = ADC12.addInstance();
    const Board  = scripting.addModule("/ti/driverlib/Board");
    const GPIO   = scripting.addModule("/ti/driverlib/GPIO", {}, false);
    const GPIO1  = GPIO.addInstance();
    const I2C    = scripting.addModule("/ti/driverlib/I2C", {}, false);
    const I2C1   = I2C.addInstance();
    const MCAN   = scripting.addModule("/ti/driverlib/MCAN", {}, false);
    const MCAN1  = MCAN.addInstance();
    const SYSCTL = scripting.addModule("/ti/driverlib/SYSCTL");
    const TIMER  = scripting.addModule("/ti/driverlib/TIMER", {}, false);
    const TIMER1 = TIMER.addInstance();
    const TIMER2 = TIMER.addInstance();
    
    /**
     * Write custom configuration values to the imported modules.
     */
    const divider4       = system.clockTree["PLL_CLK0_DIV"];
    divider4.divideValue = 4;
    
    const divider5       = system.clockTree["PLL_CLK1_DIV"];
    divider5.divideValue = 8;
    
    const multiplier2         = system.clockTree["PLL_QDIV"];
    multiplier2.multiplyValue = 8;
    
    const mux2       = system.clockTree["CANCLKMUX"];
    mux2.inputSelect = "CANCLKMUX_PLLCLK1_OUT";
    
    const mux4       = system.clockTree["EXHFMUX"];
    mux4.inputSelect = "EXHFMUX_XTAL";
    
    const mux8       = system.clockTree["HSCLKMUX"];
    mux8.inputSelect = "HSCLKMUX_SYSPLL0";
    
    const mux12       = system.clockTree["SYSPLLMUX"];
    mux12.inputSelect = "zSYSPLLMUX_HFCLK";
    
    const pinFunction3     = system.clockTree["HFCLKEXT"];
    pinFunction3.inputFreq = 40;
    
    const pinFunction4                                      = system.clockTree["HFXT"];
    pinFunction4.enable                                     = true;
    pinFunction4.HFCLKMonitor                               = true;
    pinFunction4.inputFreq                                  = 20;
    pinFunction4.HFXTStartup                                = 8;
    pinFunction4.peripheral.$assign                         = "SYSCTL";
    pinFunction4.peripheral.hfxInPin.$assignAllowConflicts  = "PA5";
    pinFunction4.peripheral.hfxOutPin.$assignAllowConflicts = "PA6";
    
    ADC121.$name                      = "ADC12_0";
    ADC121.sampClkDiv                 = "DL_ADC12_CLOCK_DIVIDE_16";
    ADC121.sampleTime0                = "125us";
    ADC121.enabledInterrupts          = ["DL_ADC12_INTERRUPT_MEM0_RESULT_LOADED"];
    ADC121.peripheral.adcPin0.$assign = "PA15";
    
    Board.peripheral.$assign          = "DEBUGSS";
    Board.peripheral.swclkPin.$assign = "PA20";
    Board.peripheral.swdioPin.$assign = "PA19";
    
    GPIO1.$name                         = "GPIO";
    GPIO1.port                          = "PORTA";
    GPIO1.associatedPins.create(7);
    GPIO1.associatedPins[0].$name       = "TS";
    GPIO1.associatedPins[0].direction   = "INPUT";
    GPIO1.associatedPins[0].ioStructure = "SD";
    GPIO1.associatedPins[0].pin.$assign = "PA8";
    GPIO1.associatedPins[1].$name       = "POWER_PRESSURE";
    GPIO1.associatedPins[1].pin.$assign = "PA10";
    GPIO1.associatedPins[2].$name       = "TCAN_SLEEP";
    GPIO1.associatedPins[2].pin.$assign = "PA7";
    GPIO1.associatedPins[3].$name       = "REQUEST";
    GPIO1.associatedPins[3].direction   = "INPUT";
    GPIO1.associatedPins[3].pin.$assign = "PA1";
    GPIO1.associatedPins[4].$name       = "WAKE_UP_PIN";
    GPIO1.associatedPins[4].ioStructure = "OD";
    GPIO1.associatedPins[4].pin.$assign = "PA0";
    GPIO1.associatedPins[5].$name       = "NOT_SCL";
    GPIO1.associatedPins[5].direction   = "INPUT";
    GPIO1.associatedPins[5].pin.$assign = "PA3";
    GPIO1.associatedPins[6].$name       = "NOT_SDA";
    GPIO1.associatedPins[6].direction   = "INPUT";
    GPIO1.associatedPins[6].pin.$assign = "PA4";
    
    I2C1.$name                     = "I2C_0";
    I2C1.basicEnableController     = true;
    I2C1.basicControllerBusSpeed   = 50000;
    I2C1.advDigitalGlitchFilter    = "CLOCKS_1";
    I2C1.advControllerRXFIFOTRIG   = "BYTES_8";
    I2C1.advControllerTXFIFOTRIG   = "BYTES_7";
    I2C1.peripheral.sdaPin.$assign = "PA18";
    I2C1.peripheral.sclPin.$assign = "PA17";
    
    MCAN1.$name                    = "MCAN0";
    MCAN1.wkupReqEnable            = true;
    MCAN1.autoWkupEnable           = true;
    MCAN1.emulationEnable          = true;
    MCAN1.tdcEnable                = true;
    MCAN1.additionalCoreConfig     = true;
    MCAN1.rrfe                     = true;
    MCAN1.rrfs                     = true;
    MCAN1.anfe                     = "1";
    MCAN1.anfs                     = "1";
    MCAN1.txEventFIFOWaterMark     = 0;
    MCAN1.overrideRetention        = true;
    MCAN1.stdFiltType              = "01";
    MCAN1.flesa                    = 0;
    MCAN1.lse                      = 0;
    MCAN1.desiredDataRate          = 2;
    MCAN1.rxFIFO1waterMark         = 0;
    MCAN1.rxFIFO0waterMark         = 0;
    MCAN1.lss                      = 0;
    MCAN1.rxFIFO0startAddr         = 0;
    MCAN1.rxFIFO1startAddr         = 0;
    MCAN1.rxBufStartAddr           = 0;
    MCAN1.rxFIFO1size              = 0;
    MCAN1.rxFIFO0size              = 0;
    MCAN1.txStartAddr              = 0;
    MCAN1.txBufNum                 = 1;
    MCAN1.txEventFIFOStartAddr     = 0;
    MCAN1.brsEnable                = false;
    MCAN1.fdMode                   = false;
    MCAN1.spPercent                = 80;
    MCAN1.peripheral.$assign       = "CANFD0";
    MCAN1.peripheral.rxPin.$assign = "PA13";
    MCAN1.peripheral.txPin.$assign = "PA12";
    
    SYSCTL.useHFCLK_Manual = true;
    SYSCTL.HFCLKSource     = "HFXT";
    SYSCTL.HFCLKMonitor    = true;
    SYSCTL.HFXTStartup     = 10;
    SYSCTL.CANCLKSource    = "SYSPLLCLK1";
    SYSCTL.SYSPLL_CLK0En   = true;
    SYSCTL.HFCLK_Freq      = 20000000;
    SYSCTL.MCLKSource      = "HSCLK";
    SYSCTL.SYSPLL_CLK1En   = true;
    SYSCTL.SYSPLL_CLK1Div  = 3;
    SYSCTL.SYSPLL_CLK0Div  = 1;
    SYSCTL.clockTreeEn     = true;
    
    TIMER1.$name              = "TIMER_0";
    TIMER1.timerClkSrc        = "LFCLK";
    TIMER1.timerClkPrescale   = 33;
    TIMER1.timerMode          = "PERIODIC";
    TIMER1.timerPeriod        = "935ms";
    TIMER1.interrupts         = ["ZERO"];
    TIMER1.peripheral.$assign = "TIMG0";
    
    TIMER2.$name              = "TIMER_1";
    TIMER2.timerPeriod        = "1ms";
    TIMER2.timerClkPrescale   = 250;
    TIMER2.timerStartTimer    = true;
    TIMER2.interrupts         = ["ZERO"];
    TIMER2.timerMode          = "PERIODIC";
    TIMER2.peripheral.$assign = "TIMA0";
    
    /**
     * 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.
     */
    ADC121.peripheral.$suggestSolution = "ADC1";
    I2C1.peripheral.$suggestSolution   = "I2C1";
  • You may see badly configured pins that is a result of an attempt of not using clock tree - as long as I reactivated clock tree I suppose it's ok

  • Hi thomas,

    I'll get back to your question on Friday.

    Best Regards,
    Diego Abad

  • Hello Diego and Luke!

    we are located in Switzerland. And on Friday we need to provide samples to our customers! We need your strong support to solve this issue asap. We are totally blocked with this issue.

  • Hi,

    I'll be answering this inquiry tomorrow. Thank you for your patience.

    Best Regards,
    Diego Abad

  • Hi Thomas and Renaud,

    Do you get stuck in this check only when you're doing a program, for example can you flash the device then do a POR and see if you're getting stuck in that check?

    For context, the reset levels from the IDE only go to a System Reset, which do not reset the clocks. So when you are using a HFXT, sysosc turns off and will stay off until a higher level of reset. When the code runs again, because the registers are set for HFXT and sysosc is off, then the first check will fail and you'll be stuck in the loop. We are going to provide an update in a mini release of the SDK to prevent this in sysconfig.

    There are a couple of ways to get around this until the update.

    1. Recreate the clock initialization function.
      1. All of the sysconfig functions are declared as "weak" so you can create the same function and it will take its place. Here you can check the previous reset level and forgo the sysosc check or you can rearrange the check to not check for sysosc.
    2. Remove the clock check
      1. By removing the sysosc check you should not run into the loop.
    3. Preform a POR, if your device will not reach the lower reset levels this method would be acceptable. But if you are expecting your device to reach the lower reset levels you may get stuck in the check again.

    Regards,

    Luke

  • Hello Luke,

    thanks - when will the new sysconfig / SDK?

    Best is to use a revision where all is fixed. Is the new revision just published the one?

    Thanks. BR. T.

  • Hi Thomas,

    The SDK that just got published (1.10.0.05) does not include the fix, we are planning on including the fix on a smaller release we have planned around the middle of Q3.

    Regards,

    Luke

  • Hi Thomas,
    I'm closing this thread. If you need further help, please reply to any of the messages in this post.
    Best Regards,
    Diego Abad