时间:2023-08-03 08:01
人气:
作者:admin
本文将以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的配置及编译。
在USB启动阶段,TFA需要配置的外设有:调试串口UART,时钟RCC,电源以及DDR。
1.查看原理图,找到调试串口:


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



Notes:这里边USART4的时钟选择用HSI,一个原因是参考了STM32MP135F-DK的时钟树配置,另一个原因是考虑到低功耗工作模式下有串口唤醒的应用。排除这两点其他的时钟源也可以使用。
3.点击“Generatecode”, 并添加TFA阶段的串口配置的usercode.
打开生成的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
那么请确认:
Usercode是否已经添加到正确的位置。
DEBUG串口是否是UART4,并且确认PIN脚是否正确配置。
检查硬件连接。
DDR的配置需要注意以下几点:
SDRAMS大小
One/two pieces (16/32 bits), STM32MP13x DDR是16bits, 所以这里的配置都是1片SDRAM
DDR型号, DDR3/DDR3L/LPDDRx
DDR频率
1.查看DDR设计部分原理图,确认大小以及频率等参数,完成DDR部分设计
下面列举几种DDR的不同设计与相对应的配置:
Example1:STM32MP157C-EV1,2片SDRAM, 32bits, 1GBytes




DDR的频率可以在时钟配置界面进行配置。
Example2: STM32MP135F-DK, 1片SDRAM,16bits, 512Mbytes.




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


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


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


3.点击“GenerateCode”
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的”ClockConfiguration”进行确认:AXI Clock的source没有切换到PLL2P

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

电源设计通常就是两种,像Myir采用的分离式供电和ST demo板采用的电源管理芯片STPMIC供电,下面将分别介绍两种情况下的设备树配置。
I.由于之前采用PMIC供电DDR初始化会失败,所以这里先以STM32MP135F-DK为例来看一下PMIC以及PWR部分的配置:
首先看一下原理图:

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



然后配置PWR的wakeup引脚:

点击“GENERATE CODE“生成设备树,打开tfa设备树添加usercode,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 *