Events
Trade Shows
Seminars
Product Updates
 
          Home > News Center > Product Updates
 

Bring up the STM32MP135x - ST Training Course based on MYD-YF13X (II)

 
2023-9-26   15:32:59     Click: 985
 

This article will take MYIRs MYD-YF13X and STM32MP135F-DK as examples, and continue to explain how to use STM32CubeMX combined with the developer package to implement the booting of the minimal system.



Following "Bring up the STM32MP135x - ST Training Course based on MYD-YF13X (I)"


4. USB Boot

USB boot is used for burning image to external flash, e.g. NAND, SD card, etc. The burning image from PC to external flash is completed by U-Boot combined with STM32Cube Programmer. Configuring and compiling U-Boot is a precondition for burning.

According to the STM32 MPU boot sequence:

TF-A->OP-TEE->U-BOOT->Linux Kernel

Loading U-Boot into the DDR depends on TF-A and OP-TEE, sothe configuration and compilation of TF-A, OP-TEE and U-Boot need to be completed in the USB boot phase.

4.1 USB Boot: TFA Configuration and Compilation

During the USB booting stage, the TFA needs to be configured with the following peripherals: Debug serial port UART, Clock RCC, Power Supply and DDR.

4.1.1 Debugging Serial Port UART

1. Review the schematic and find the debug serial port:



2. Enable UART4, configure the pins and the clock:





Note: The clock for USART4 is using HSI, one reason is to refer to the clock tree configuration of STM32MP135F-DK, and the other reason is to consider the application of serial port wake-up in low-power working mode. Excluding these two points, other clock sources can also be used.

3. Click "Generate code", and add the user code for the serial port configuration of the TFA stage.

Open the generated STM32CubeMX project, open the TF-A device tree (stm32mp135d-myir_bring_up-mx.dts), and add the nodes "choosen" and "aliases" at the "USER CODE BEGIN root".

/* USER CODE BEGIN root */

aliases {

serial0 = &uart4;

};

chosen {

stdout-path = "serial0:115200n8";

};

/* USER CODE END root */


4. (Optional) Compile the TFA USB image and deploy to the board.

Compile:

PC $> cd

PC $> source

PC $> make -f ../Makefile.sdk TF_A_CONFIG=usb TF_A_DEVICETREE=stm32mp135d-myir_bring_up-mx stm32

Deploy (please make sure the board is powered up, the serial cable and the USB cable are correctly connected before deploying):
PC $> STM32_Programmer_CLI -c port=usb1 -d ../deploy/tf-a-stm32mp135d-myir_bring_up-mx-usb.stm32 0x1 -s 0x1

Serial port printing:

NOTICE:  CPU: STM32MP135F Rev.?

NOTICE:  Model: STMicroelectronics custom STM32CubeMX board - openstlinux-5.15-yocto-kirkstone-mp1-v22.11.23

ERROR:   nvmem node board_id not found

WARNING: VDD unknown

INFO:    Reset reason (0x35):

INFO:      Power-on Reset (rst_por)

INFO:    FCONF: Reading TB_FW firmware configuration file from: 0x2ffe0000

INFO:    FCONF: Reading firmware configuration information for: stm32mp_io

INFO:    Using USB

INFO:      Instance 2

INFO:    Boot used partition fsbl1

NOTICE:  BL2: v2.6-stm32mp1-r2.0(debug):v2.6-stm32mp-r2-4-g2dedc1cf0-dirty(2dedc1cf)

NOTICE:  BL2: Built : 02:45:42, Jun  6 2023

INFO:    BL2: Doing platform setup

ERROR:   Invalid DDR init: error -22

PANIC at PC : 0x2ffe7739

Exception mode=0x00000016 at: 0x2ffe7739


5. Troubleshooting

If the serial port prints as follows in the previous step or does not print anything:

PANIC at PC : 0x2ffe7739

Exception mode=0x00000016 at: 0x2ffe7739

Then please confirm:


  • Whether the User code has been added to the correct location.
  • Whether the Debug serial port is UART4 and make sure the PIN is configured correctly.
  • Check the hardware connection.



4.1.2 DDR

The following points need to be noted for the DDR configuration:


  • SDRAMS size
  • One/two pieces (16/32 bits), STM32MP13x DDR is 16bits, so the configurations are all using 1 piece of SDRAM.
  • DDR types: DDR3/DDR3L/LPDDRx
  • DDR frequency


1. Check the schematic diagram of the DDR design section, confirm the size and frequency and other parameters, and complete the design of the DDR part.

Below are some examples of different DDR designs and their corresponding configurations:

Example 1: STM32MP157C-EV1, two pieces of SDRAM, 32bits, 1GBytes






The DDR frequency can be configured in the Configuration interface.

Example 2: STM32MP135F-DK, one piece of SDRAM, 16bits, 512Mbytes.






Now lets take a look at the DDR design part of MYIRs MYD-YF13X board:


One piece of SDRAM, 16bits, 256Mbytes, STM32CubeMX configured as follows:





2. DDR Clock Configuration (since the RCC part has not been configured with an external clock, so we first use the internal HSI as the clock source here).






3. Click "Generate code".

4. (Optional) Compile the TFA USB image and deploy to the board.

Compile:

PC $> cd

PC $> source

PC $> make -f ../Makefile.sdk TF_A_CONFIG=usb TF_A_DEVICETREE=stm32mp135d-myir_bring_up-mx stm32


Deploy (please make sure the board is powered up, the serial cable and the USB cable are correctly connected before deploying):
PC $> STM32_Programmer_CLI -c port=usb1 -d ../deploy/tf-a-stm32mp135d-myir_bring_up-mx-usb.stm32 0x1 -s 0x1

Serial port printing:

NOTICE:  CPU: STM32MP135D Rev.Y

NOTICE:  Model: STMicroelectronics custom STM32CubeMX board - openstlinux-5.15-yocto-kirkstone-mp1-v22.11.23

ERROR:   nvmem node board_id not found

WARNING: VDD unknown

INFO:    Reset reason (0x30):

INFO:      Reset due to a failure of VDD_CORE

INFO:    FCONF: Reading TB_FW firmware configuration file from: 0x2ffe0000

INFO:    FCONF: Reading firmware configuration information for: stm32mp_io

INFO:    Using USB

INFO:      Instance 2

INFO:    Boot used partition fsbl1

NOTICE:  BL2: v2.6-stm32mp1-r2.0(debug):()

NOTICE:  BL2: Built : 10:45:30, Jun 28 2023

INFO:    BL2: Doing platform setup

INFO:    RAM: DDR3-DDR3L 16bits 533000kHz

INFO:    Memory size = 0x10000000 (256 MB)

INFO:    DFU USB START...

INFO:    handle USB : Suspend int

INFO:    USB Suspend mode

INFO:    handle USB : Reset

INFO:    handle USB : Reset


From the above log, we can see that the DDR initialization is successful and the tfa fails at the location where the FW config file is downloaded.


Note: If the customer's power supply design is not a separated power supply, but a PMIC power supply, then the corresponding serial port print should be:

NOTICE:  CPU: STM32MP135F Rev.?

NOTICE:  Model: STMicroelectronics custom STM32CubeMX board

ERROR:   nvmem node board_id not found

WARNING: VDD unknown

INFO:    Reset reason (0x35):

INFO:      Power-on Reset (rst_por)

INFO:    FCONF: Reading TB_FW firmware configuration file from: 0x2ffe0000

INFO:    FCONF: Reading firmware configuration information for: stm32mp_io

INFO:    Using USB

INFO:      Instance 2

INFO:    Boot used partition fsbl1

NOTICE:  BL2: v2.6-stm32mp1-r2.0(debug):v2.6-stm32mp-r2-5-g38bff70d8-dirty(38bff70d)

NOTICE:  BL2: Built : 03:36:12, Jun  6 2023

INFO:    BL2: Doing platform setup

INFO:    RAM: DDR3-DDR3L 16bits 533000kHz

ERROR:   DDR addr bus test: can't access memory @ 0xc0000004

PANIC at PC : 0x2ffe5db1

Exception mode=0x00000016 at: 0x2ffe5db1


From the perspective of hardware design, the hardware difference involved in the current software configuration is mainly the power supply part. If adopting the separated power supply, once the board is powered up, each DC-DC has an output, without software control, that is, as long as the board is powered up, the DDR power supply already exists; if adopting the PMIC, we take the STM32MP135F-DK board as an example to look at the design of the DDR power supply part:






From the schematic diagram, it can be seen that BUCK2 of PMIC is used to supply power to DDR. Meanwhile, according to the datasheet of PMIC, the start-up sequence of BUCK2 is Rank0, and Rank0 has no output by default after power-on, which requires software driver. So if the customer uses PMIC power supply, then the next step is to configure PWR, I2C and PMIC (see 3.1.3).


5.Troubleshooting

Log:

NOTICE:  CPU: STM32MP135D Rev.Y

NOTICE:  Model: STMicroelectronics custom STM32CubeMX board

ERROR:   nvmem node board_id not found

WARNING: VDD unknown

INFO:    Reset reason (0x35):

INFO:      Power-on Reset (rst_por)

INFO:    FCONF: Reading TB_FW firmware configuration file from: 0x2ffe0000

INFO:    FCONF: Reading firmware configuration information for: stm32mp_io

INFO:    Using USB

INFO:      Instance 2

INFO:    Boot used partition fsbl1

NOTICE:  BL2: v2.6-stm32mp1-r2.0(debug):v2.6-stm32mp-r2-2-g3e0dafdaf(3e0dafda)

NOTICE:  BL2: Built : 05:39:48, Jun  5 2023

INFO:    BL2: Doing platform setup

INFO:    RAM: DDR3-DDR3L 16bits 533000kHz

ERROR:   DDR expected freq 533000 kHz, current is 224000 kHz

PANIC at PC : 0x2ffe588f

Ans: If there is a printout as above, please check the DDR clock configuration, one possibility is that PLL2 is not enabled, which can be confirmed through the "Clock Configuration" of CubeMX: the source of AXI Clock is not switched to PLL2P.



Or you can check whether PLL2 is appeared in the rcc node section of the generated device tree:



4.1.3 PWR

Power supply design is usually two kinds, like the separate power supply used by MYIR and the power management chip STPMIC used by ST demo board, the following will introduce the device tree configuration in two cases respectively.


1. Since the DDR initialization using PMIC power supply failed before, here we take the STM32MP135F-DK as an example to see the configuration of the PMIC and the PWR part:

Let's take a look at the schematic:


First configure the I2C used to drive the PMIC, the default is I2C4:








Then configure the wake up pin of PWR:




Click "GENERATE CODE" to generate the device tree, open the tfa device tree to add user code. The configuration of the PMIC part is recommended to copy the configuration of stm32mp135f-dk.dts directly from the tfa source code.Then modify the configuration of the regulator according to the BUCK and LDO outputs of the hardware design:


&i2c4{

pinctrl-names = "default";

pinctrl-0 = <&i2c4_pins_mx>;

status = "okay";


/* USER CODE BEGIN i2c4 */

i2c-scl-rising-time-ns =;

i2c-scl-falling-time-ns =;

clock-frequency =;


pmic:stpmic@33{

compatible = "st,stpmic1";

reg =;

status = "okay";

regulators{

compatible = "st,stpmic1-regulators";

buck1-supply = <&vin>;

ldo6-supply = <&vin>;

vref_ddr-supply = <&vin>;

pwr_sw1-supply = <&bst_out>;

pwr_sw2-supply = <&v3v3_ao>;


vddcpu:buck1{

regulator-name = "vddcpu";

regulator-min-microvolt =;

regulator-max-microvolt =;

regulator-always-on;

regulator-over-current-protection;

};

v3v3_sw:pwr_sw2{

regulator-name = "v3v3_sw";

regulator-active-discharge =;

regulator-always-on;

};

};

};

/* USER CODE END i2c4 */

};

vin and v3v3_ao of Regulator should also be defined in the device tree. Add the user code should be added to the USER Code BEGINroot node:

/ {      /* USER CODE BEGIN root */


vin: vin {

compatible = "regulator-fixed";

regulator-name = "vin";

regulator-min-microvolt =;

regulator-max-microvolt =;

regulator-always-on;

};

v3v3_ao: v3v3_ao {

compatible = "regulator-fixed";

regulator-name = "v3v3_ao";

regulator-min-microvolt =;

regulator-max-microvolt =;

regulator-always-on;

};

/* USER CODE BEGIN root */

Add the PWR node configuration:

&pwr_regulators{

status = "okay";

/* USER CODE BEGIN pwr_regulators */

vdd-supply = <&vdd>;

vdd_3v3_usbfs-supply = <&vdd_usb>;

/* USER CODE END pwr_regulators */

};

Add CPU Supply node configuration:

Compile and deploy to the board and verify that DDR errors are fixed;

After burning, the log prints as follows: DDR errors have been fixed.

NOTICE:  CPU: STM32MP135F Rev.?

NOTICE:  Model: STMicroelectronics custom STM32CubeMX board

ERROR:   nvmem node board_id not found

INFO:    PMIC version = 0x21

WARNING: VDD unknown

INFO:    Reset reason (0x35):

INFO:      Power-on Reset (rst_por)

INFO:    FCONF: Reading TB_FW firmware configuration file from: 0x2ffe0000

INFO:    FCONF: Reading firmware configuration information for: stm32mp_io

INFO:    Using USB

INFO:      Instance 2

INFO:    Boot used partition fsbl1

NOTICE:  BL2: v2.6-stm32mp1-r2.0(debug):v2.6-stm32mp-r2-7-g866f2b026-dirty(866f2b02)

NOTICE:  BL2: Built : 12:58:07, Jun  7 2023

INFO:    BL2: Doing platform setup

INFO:    RAM: DDR3-DDR3L 16bits 533000kHz

INFO:    Memory size = 0x20000000 (512 MB)

INFO:    DFU USB START...

INFO:    handle USB : Suspend int

INFO:    USB Suspend mode

INFO:    handle USB : Reset


2. Separate Power Supply Design

MYIRs development board adopts exactly the separated power supply, the schematic diagram is as follows:




When the board is powered on, VDD-Core, VDD-CPU, VDD-DDR, etc. will have power output one after another, no need to be configured by STM32CubeMX or controlled by software, just need to add some user code here:

Add CPU Supply node configuration:

/* USER CODE BEGIN addons */

&cpu0{

cpu-supply = <&vddcpu>;

};

/* USER CODE END addons */

It is also required to define the regulator vdd_cpu that is introduced in the CPU Supply node:

/* USER CODE BEGIN root */

vdd_cpu: vdd_cpu{

compatible = "regulator-fixed";

regulator-name = "vdd_cpu";

regulator-min-microvolt =;

regulator-max-microvolt =;

regulator-always-on;

};

/* USER CODE END root */


4.1.4 RCC

RCC, Reset and clock control. the RCC module is responsible for the control of internal clocks (LSI, HSI and CSI) and external clocks (LSE and HSE). These internal and external clock sources provide clock signals to the hardware module directly or indirectly (via PLLs).


  • PLL1 is used as the clock source for the MPU.
  • PLL2 provides clocks for AXI-SS (including APB4, APB5 and APB6), DCMIPP and DDR.
  • PLL3 provides clocks for MLAHB, APB1, APB2, APB3, AHB, etc., as well as peripheral clocks.
  • PLL4 provides clocks for various peripherals.


This section describes how to configure to enable the external clocks LSE and LSE. First look at several classic design circuits for the HSE:


The differences in software configuration between the different hardware design modes are as follows:

Example 1: STM32MP157C-EV1







Example 2: STM32MP135F-DK





The RCC can provide two output clocks (MCO1, MCO2) which can be used as clock source for external devices.




With the two examples shown above, we take a look at MYIRs design:




The HSE uses the same passive crystal design as the STM32MP135F-DK, so the STM32CubeMX is configured as follows:




Switch to "Clock Configuration" interface. Set the clock source of PLL1 and PLL2 to HSE, and make sure the clock frequency of DDR is set to 533Mhz, and the main frequency of CPU is configured to 650Mhz:





Click "Generate code", compile TF-A and deploy it to the board, the serial log output should be the same as the previous step.


If the print out log is different from the previous step after RCC is configured, the serial port will print the following panic:
PANIC at PC : 0x2ffecb43

Exception mode=0x00000016 at: 0x2ffecb43


Please check the configuration of HSE in STM32CubeMX, and if you confirm that there is no problem with the configuration, please check the hardware connection.




 
Prev:  Low-cost T113-i SoM for Entry-level HMI & Embedded Devices with Video Capabilities Next:  Take Great Advantages of SemiDrive’s Super Powerful D9-Pro Processor