本文將以Myirtech的MYD-YF13X以及STM32MP135F-DK為例,接上篇培訓課程繼續(xù)講解如何使用STM32CubeMX結合Developer package實現(xiàn)最小系統(tǒng)啟動。
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.點擊“Generatecode”, 并添加TFA階段的串口配置的usercode.
打開生成的STM32CubeMX工程,打開TF-A設備樹(stm32mp135d-myir_bring_up-mx.dts),在”USER CODE BEGIN root”位置添加”chosen”和”aliases”節(jié)點:
/* 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
串口打?。?/p>
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腳是否正確配置。
檢查硬件連接。
4.1.2 DDR
DDR的配置需要注意以下幾點:
SDRAMS大小
One/two pieces (16/32 bits), STM32MP13x DDR是16bits, 所以這里的配置都是1片SDRAM
DDR型號, DDR3/DDR3L/LPDDRx
DDR頻率
1.查看DDR設計部分原理圖,確認大小以及頻率等參數(shù),完成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
串口打?。?/p>
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
從硬件設計的角度看,目前軟件配置所涉及到的硬件區(qū)別主要是供電部分,采用分離式電源,板子一上電,每一個DC-DC均有輸出,不需要軟件控制,也就是說,只要板子上電,DDR供電就已經存在了;而采用PMIC,我們以STM32MP135F-DK板為例看一下DDR供電部分的設計:
從原理圖可以看出PMIC的BUCK2用于給DDR供電,同時參考PMIC的數(shù)據手冊,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
解析:如果出現(xiàn)如上打印,請查看DDR時鐘配置情況,一種可能是PLL2沒有使能,可以通過CubeMX的”ClockConfiguration”進行確認:AXI Clock的source沒有切換到PLL2P
或者可以查看生成的設備樹rcc節(jié)點部分的配置是否有PLL2的配置出現(xiàn):
4.1.3 PWR
電源設計通常就是兩種,像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 */};
Regulator的輸入vin與v3v3_ao也需要在設備樹中定義,添加user code到USER Code BEGINroot節(jié)點下:
/ { /* 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節(jié)點配置:
&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節(jié)點配置:
編譯并部署到板子,確認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開發(fā)板采用的正是分離式電源,原理圖如下:
當板子上電后,VDD-Core, VDD-CPU, VDD-DDR等會陸續(xù)有電源輸出,無需通過STM32CubeMX配置以及軟件控制,這里只需要添加一些user code即可:
添加CPU Supply節(jié)點配置:
/* USER CODE BEGIN addons */&cpu0{ cpu-supply = <&vddcpu>;};/* USER CODE END addons */
還需要定義在CPU Supply節(jié)點中引入的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, Resetand 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的幾種經典設計電路:
不同的硬件設計方式在軟件上的配置區(qū)別如下:
Example1: 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的配置,如果確認配置沒有問題,請檢查硬件連接。
-
ST
+關注
關注
32文章
1126瀏覽量
128781 -
STM32
+關注
關注
2264文章
10854瀏覽量
354289 -
開發(fā)板
+關注
關注
25文章
4896瀏覽量
97058 -
米爾
+關注
關注
0文章
47瀏覽量
7901
發(fā)布評論請先 登錄
相關推薦
評論