本文将以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 = ; 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 = ; … ldo6-supply = ; vref_ddr-supply = ; pwr_sw1-supply = ; pwr_sw2-supply = ;
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 */};
regulator的输入vin与v3v3_ao也需要在设备树中定义,添加user code到user code beginroot节点下:
/ { /* 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 */
添加pwr节点配置:
&pwr_regulators{ status = okay;/* user code begin pwr_regulators */ vdd-supply = ; vdd_3v3_usbfs-supply = ; /* 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 = ;};/* 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 = ; regulator-max-microvolt = ; 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的配置,如果确认配置没有问题,请检查硬件连接。
Pro/E应用技巧六则
基于ARM的APT控制系统设计
2030年乘用车平均能量密度有望达286wh/kg
联发科山寨苹果APP商店 明年初进驻国产手机
NDI广播可视化节目直播解决方案
ST官方基于米尔STM32MP135开发板培训课程(二)
闹剧里的动力电池续航焦虑 6道问题了解电动汽车动力电池方面的发展情况
游戏笔记本PC专用高帧速率显示组件出货量将在2019年增长
2018年中国芯片公司资本支出达到110亿美元,赶超欧盟、日本
5G通信网络即将到来,它到底有多快
发改委:加快5G网络规模部署和商业应用
介绍一款基于docker的渗透测试工具箱
基于HX710的计价秤应用参考电路设计
如何看懂HDI板与普通PCB的区别
英创信息技术ISA总线的CE设备驱动程序介绍
苹果新机,iPad Pro渲染图曝光!将于三月问世
一文解析逐次通近型寄存器ADC
GF宣布将旗下ASIC业务Avera半导体出售给Marvell公司 总计7.4亿美元
openGauss提升医疗数字化的应用水平
了解协议栈的相关概念