ST官方基于米尔STM32MP135开发板培训课程(二)

描述

 

本文将以Myirtech的MYD-YF13X以及STM32MP135F-DK为例,接上篇培训课程继续讲解如何使用STM32CubeMX结合Developer package实现最小系统启动。

开发板


4.USB启动

USB启动用于烧录镜像到外部flash, 例如NAND,SD卡等,从PC端烧录镜像到外部Flash是由U-Boot结合STM32CubeProgrammer完成的,配置并编译U-Boot是烧录的前提,根据STM32MPU的启动顺序:

 

 

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

 

 

将U-Boot 加载到DDR中又依赖于TF-A与OP-TEE,所以USB启动阶段需要完成TF-A,OP-TEE以及U-Boot的配置及编译。

4.1 USB启动:TFA 配置及编译

 

在USB启动阶段,TFA需要配置的外设有: 调试串口UART,时钟RCC,电源以及DDR。

4.1.1 调试串口 UART

 

1.查看原理图,找到调试串口: 

开发板

开发板

 

2.使能UART4,配置引脚以及时钟:

开发板

开发板

开发板

 

Notes:这里边USART4的时钟选择用HSI, 一个原因是参考了STM32MP135F-DK的时钟树配置,另一个原因是考虑到低功耗工作模式下有串口唤醒的应用。排除这两点其他的时钟源也可以使用。

 

 

3.点击“Generate code”, 并添加TFA阶段的串口配置的user code.

 

 

打开生成的STM32CubeMX工程,打开TF-A设备树(stm32mp135d-myir_bring_up-mx.dts),在”USER CODE BEGIN root”位置添加”chosen”和”aliases”节点:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

  /* USER CODE BEGIN root */    aliases {        serial0 = &uart4;    };    chosen {        stdout-path = "serial0:115200n8";    };      /* USER CODE END root */

4.(Optional)编译TFA USB image,并部署到板子。

 

 

编译:

  •  
  •  
  •  

PC $> cd -a-stm32mp-v2.6-stm32mp-r2_path>PC $> source PC $> make -f ../Makefile.sdk TF_A_CONFIG=usb TF_A_DEVICETREE=stm32mp135d-myir_bring_up-mx stm32

部署(部署前请确认板子上电,串口线以及USB线正确连接):

  •  

PC $> STM32_Programmer_CLI -c port=usb1 -d ../deploy/tf-a-stm32mp135d-myir_bring_up-mx-usb.stm32 0x1 -s 0x1

串口打印:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

NOTICE: CPU: STM32MP135F Rev.?NOTICE: Model: STMicroelectronics custom STM32CubeMX board - openstlinux-5.15-yocto-kirkstone-mp1-v22.11.23ERROR: nvmem node board_id not foundWARNING: VDD unknownINFO: Reset reason (0x35):INFO: Power-on Reset (rst_por)INFO: FCONF: Reading TB_FW firmware configuration file from: 0x2ffe0000INFO: FCONF: Reading firmware configuration information for: stm32mp_ioINFO: Using USBINFO: Instance 2INFO: Boot used partition fsbl1NOTICE: BL2: v2.6-stm32mp1-r2.0(debug):v2.6-stm32mp-r2-4-g2dedc1cf0-dirty(2dedc1cf)NOTICE: BL2: Built : 02:45:42, Jun 6 2023INFO: BL2: Doing platform setupERROR: Invalid DDR init: error -22PANIC at PC : 0x2ffe7739Exception mode=0x00000016 at: 0x2ffe7739

 

5.Troubleshooting

如果串口打印上一步串口打印如下或者没有任何打印:

  •  
  •  

PANIC at PC : 0x2ffe7739Exception mode=0x00000016 at: 0x2ffe7739

那么请确认:

User code是否已经添加到正确的位置。

DEBUG串口是否是UART4,并且确认PIN脚是否正确配置。

检查硬件连接。

 

 

4.1.2 DDR

 

DDR的配置需要注意以下几点:

SDRAMS大小

One/two pieces (16/32 bits), STM32MP13x DDR是16bits, 所以这里的配置都是1片SDRAM

DDR型号, DDR3/DDR3L/LPDDRx

DDR频率

 

 

 

 

 

1.查看DDR设计部分原理图,确认大小以及频率等参数,完成DDR部分设计

 

下面列举几种DDR的不同设计与相对应的配置:

Example 1:STM32MP157C-EV1,2 片SDRAM, 32bits, 1GBytes

开发板

开发板

开发板

开发板

 

 

 

 

DDR的频率可以在时钟配置界面进行配置。

 

 

Example 2: STM32MP135F-DK, 1片SDRAM, 16bits, 512Mbytes.

开发板

开发板

开发板

开发板

 

最后,来看一下Myir板子的DDR部分设计:

开发板

开发板

 

1片SDRAM, 16bits, 256Mbytes, STM32CubeMX配置如下:

开发板

开发板

 

2.DDR时钟配置(由于RCC部分还没有配置外部时钟,所以这里先用内部HSI作为时钟源)

开发板

开发板

 

3.点击“Generate Code”

 

 

4.(Optional)编译TF-A USB image,并部署到板子

 

 

编译:

  •  
  •  
  •  

PC $> cd -a-stm32mp-v2.6-stm32mp-r2_path>PC $> source PC $> make -f ../Makefile.sdk TF_A_CONFIG=usb TF_A_DEVICETREE=stm32mp135d-myir_bring_up-mx stm32

部署(部署前请确认板子上电,串口线以及USB线正确连接):

  •  

PC $> STM32_Programmer_CLI -c port=usb1 -d ../deploy/tf-a-stm32mp135d-myir_bring_up-mx-usb.stm32 0x1 -s 0x1

串口打印:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

NOTICE: CPU: STM32MP135D Rev.YNOTICE: Model: STMicroelectronics custom STM32CubeMX board - openstlinux-5.15-yocto-kirkstone-mp1-v22.11.23ERROR: nvmem node board_id not foundWARNING: VDD unknownINFO: Reset reason (0x30):INFO: Reset due to a failure of VDD_COREINFO: FCONF: Reading TB_FW firmware configuration file from: 0x2ffe0000INFO: FCONF: Reading firmware configuration information for: stm32mp_ioINFO: Using USBINFO: Instance 2INFO: Boot used partition fsbl1NOTICE: BL2: v2.6-stm32mp1-r2.0(debug):()NOTICE: BL2: Built : 1030, Jun 28 2023INFO: BL2: Doing platform setupINFO: RAM: DDR3-DDR3L 16bits 533000kHzINFO: Memory size = 0x10000000 (256 MB)INFO: DFU USB START...INFO: handle USB : Suspend intINFO: USB Suspend modeINFO: handle USB : ResetINFO: handle USB : Reset

 从上面的log可以看出,DDR初始化成功,tfa失败在下载FW config文件的位置

Notes如果客户的供电设计不是分离式电源,而是采用PMIC供电,那么对应的串口打印应该是:

 

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

NOTICE: CPU: STM32MP135F Rev.?NOTICE:

 Model: STMicroelectronics custom STM32CubeMX boardERROR: nvmem node board_id not foundWARNING: VDD unknownINFO: Reset reason (0x35):INFO: Power-on Reset (rst_por)INFO: 

FCONF: Reading TB_FW firmware configuration file from: 0x2ffe0000INFO: FCONF: Reading firmware configuration information for:

 stm32mp_ioINFO: Using USBINFO: Instance 2INFO: Boot used partition fsbl1NOTICE: BL2: v2.6-stm32mp1-r2.0(debug):

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

0312, Jun 6 2023INFO: BL2: Doing platform setupINFO: RAM: DDR3-DDR3L 16bits 533000kHzERROR:

 DDR addr bus test: can't access memory @ 0xc0000004PANIC at PC : 

0x2ffe5db1Exception mode=0x00000016 at: 0x2ffe5db1

从硬件设计的角度看,目前软件配置所涉及到的硬件区别主要是供电部分,采用分离式电源,板子一上电,每一个DC-DC均有输出,不需要软件控制,也就是说,只要板子上电,DDR供电就已经存在了;而采用PMIC,我们以STM32MP135F-DK板为例看一下DDR供电部分的设计:

开发板

开发板

 

从原理图可以看出PMIC的BUCK2用于给DDR供电,同时参考PMIC的数据手册,BUCK2的启动顺序是Rank0级别,而Rank0上电之后默认是没有输出的,需要软件驱动,所以,如果客户采用的是PMIC供电,那么接下来需要配置PWR,I2C以及PMIC (见3.1.3)。

 

 

5.Troubleshooting

Log:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

NOTICE: CPU: STM32MP135D Rev.YNOTICE: Model: STMicroelectronics custom STM32CubeMX boardERROR: nvmem node board_id not foundWARNING: VDD unknownINFO: Reset reason (0x35):INFO: Power-on Reset (rst_por)INFO: FCONF: Reading TB_FW firmware configuration file from: 0x2ffe0000INFO: FCONF: Reading firmware configuration information for: stm32mp_ioINFO: Using USBINFO: Instance 2INFO: Boot used partition fsbl1NOTICE: BL2: v2.6-stm32mp1-r2.0(debug):v2.6-stm32mp-r2-2-g3e0dafdaf(3e0dafda)NOTICE: BL2: Built : 0548, Jun 5 2023INFO: BL2: Doing platform setupINFO: RAM: DDR3-DDR3L 16bits 533000kHzERROR: DDR expected freq 533000 kHz, current is 224000 kHzPANIC at PC : 0x2ffe588f

解析:如果出现如上打印,请查看DDR时钟配置情况,一种可能是PLL2没有使能,可以通过CubeMX的”Clock Configuration”进行确认:AXI Clock的source没有切换到PLL2P

开发板

 

或者可以查看生成的设备树rcc节点部分的配置是否有PLL2的配置出现:

开发板


 

4.1.3 PWR

 

电源设计通常就是两种,像Myir采用的分离式供电和ST demo板采用的电源管理芯片STPMIC供电,下面将分别介绍两种情况下的设备树配置。

 

 

I.由于之前采用PMIC供电DDR初始化会失败,所以这里先以STM32MP135F-DK为例来看一下PMIC以及PWR部分的配置:

首先看一下原理图:

开发板

首先配置用于驱动PMIC的I2C,默认使用的是I2C4:

开发板

开发板

开发板

 

然后配置PWR的wake up引脚:

开发板

 

 

 

点击“GENERATE CODE“生成设备树,打开tfa设备树添加user code,PMIC部分的配置建议直接从tfa源码中直接拷贝stm32mp135f-dk.dts的配置然后根据硬件设计的BUCK与LDO输出修改regulator的配置

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

&i2c4{ pinctrl-names = "default"; pinctrl-0 = <&i2c4_pins_mx>; status = "okay";
/* USER CODE BEGIN i2c4 */ i2c-scl-rising-time-ns = <185>; i2c-scl-falling-time-ns = <20>; clock-frequency = <400000>;
pmic:stpmic@33{ compatible = "st,stpmic1"; reg = <0x33>; 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 = <1250000>; regulator-max-microvolt = <1250000>; regulator-always-on; regulator-over-current-protection; }; … v3v3_sw:pwr_sw2{ regulator-name = "v3v3_sw"; regulator-active-discharge = <1>; regulator-always-on; }; }; }; /* USER CODE END i2c4 */};

Regulator的输入vin与v3v3_ao也需要在设备树中定义,添加user code到USER Code BEGINroot节点下:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

/ {     /* USER CODE BEGIN root */
vin: vin { compatible = "regulator-fixed"; regulator-name = "vin"; regulator-min-microvolt = <5000000>; regulator-max-microvolt = <5000000>; regulator-always-on; }; v3v3_ao: v3v3_ao { compatible = "regulator-fixed"; regulator-name = "v3v3_ao"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-always-on; };    /* USER CODE BEGIN root */
 

添加PWR节点配置:

  •  
  •  
  •  
  •  
  •  
  •  
  •  

&pwr_regulators{ status = "okay";/* USER CODE BEGIN pwr_regulators */ vdd-supply = <&vdd>; vdd_3v3_usbfs-supply = <&vdd_usb>; /* USER CODE END pwr_regulators */ };

添加CPU Supply节点配置:

 

 

编译并部署到板子,确认DDR错误是否被修复;

 

烧录后,log打印如下:DDR错误被修复

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

NOTICE: CPU: STM32MP135F Rev.?NOTICE: Model: STMicroelectronics custom STM32CubeMX boardERROR: nvmem node board_id not foundINFO: PMIC version = 0x21WARNING: VDD unknownINFO: Reset reason (0x35):INFO: Power-on Reset (rst_por)INFO: FCONF: Reading TB_FW firmware configuration file from: 0x2ffe0000INFO: FCONF: Reading firmware configuration information for: stm32mp_ioINFO: Using USBINFO: Instance 2INFO: Boot used partition fsbl1NOTICE: BL2: v2.6-stm32mp1-r2.0(debug):v2.6-stm32mp-r2-7-g866f2b026-dirty(866f2b02)NOTICE: BL2: Built : 1207, Jun 7 2023INFO: BL2: Doing platform setupINFO: RAM: DDR3-DDR3L 16bits 533000kHzINFO: Memory size = 0x20000000 (512 MB)INFO: DFU USB START...INFO: handle USB : Suspend intINFO: USB Suspend modeINFO: handle USB : Reset

II.分离式电源设计

 

 

Myir开发板采用的正是分离式电源,原理图如下:

开发板


 

当板子上电后,VDD-Core, VDD-CPU, VDD-DDR等会陆续有电源输出,无需通过STM32CubeMX配置以及软件控制,这里只需要添加一些user code即可:

 

 

添加CPU Supply节点配置:

  •  
  •  
  •  
  •  
  •  

/* USER CODE BEGIN addons */&cpu0{ cpu-supply = <&vddcpu>;};/* USER CODE END addons */

还需要定义在CPU Supply节点中引入的regulator vdd_cpu:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

/* USER CODE BEGIN root */  vdd_cpu: vdd_cpu{        compatible = "regulator-fixed";        regulator-name = "vdd_cpu";        regulator-min-microvolt = <1250000>;        regulator-max-microvolt = <1250000>;        regulator-always-on;    };/* USER CODE END root */

 

4.1.4 RCC

 

RCC, Reset and clock control, RCC模块负责内部时钟(LSI, HSI和CSI)和外部时钟(LSE和HSE)的控制,这些内外部时钟源为硬件模块直接或间接(通过PLLs)的提供时钟信号,其中:

PLL1作为MPU的时钟源

PLL2为AXI-SS (包括APB4, APB5以及APB6),DCMIPP和DDR提供时钟

PLL3为MLAHB, APB1, APB2, APB3,AHB等提供时钟,还有外设的时钟

PLL4为各种外设提供时钟

 

 

 

这里介绍如何配置使能外部时钟LSE和LSE,首先看一下HSE的几种经典设计电路:

开发板


 

不同的硬件设计方式在软件上的配置区别如下:

 

 

Example 1: STM32MP157C-EV1

开发板

开发板

开发板

开发板

 

Example 2: STM32MP135F-DK

开发板

开发板

开发板

开发板

  •  

RCC可以提供2个输出时钟(MCO1, MCO2),可以作为外部设备的时钟源。

开发板

 

通过以上两个例子的展示,看一下Myir的硬件设计:

开发板

 

HSE采用的与STM32MP135F-DK相同的无源晶振设计,所以STM32CubeMX的配置如下:

开发板

开发板


 

切换到 ”Clock Configutation” 界面,将PLL1,PLL2的时钟源切换到HSE,并确认DDR的时钟频率设置在533Mhz, CPU主频先配置在650Mhz:

开发板

开发板

 

点击”Generate code”, 编译TF-A,并deploy到板子,串口log输出应与上一步相同。

 

 

如果在配置RCC后,没有打印出与上一步形同的log, 串口打印如下panic:

  •  
  •  

PANIC at PC : 0x2ffecb43Exception mode=0x00000016 at: 0x2ffecb43

请检查STM32CubeMX中HSE的配置,如果确认配置没有问题,请检查硬件连接。

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分